2015年9月15日火曜日

iOS 9 では MPMoviePlayerViewController が非推奨になります

What's new in iOS に1行だけ書いてありますが,iOS 9 では Media Player Framework のビデオ再生クラス MPMoviePlayerViewController が非推奨になります.またピクチャ・イン・ピクチャもサポートされません.
The video playback classes defined in the Media Player framework are deprecated in iOS 9 and do not support PiP.
代わりに AVPlayerViewController を使えば iOS 8 以降で動きます.

ただし Media Player Framework そのものは存続するみたいで MPMusicPlayerController はそのまま残るようです.

おそらくiOS 9 で採用されたピクチャ・イン・ピクチャに対応させるために,映像まわりを AV Foundation と AV Kit に集約させるためなのでしょう.

ちなみに映像音声の再生だけなら AVPlayerAVPlayerLayer の組み合わせが最もシンプルで,AVPlayerViewController を使う必要はありません.

2015年6月9日火曜日

Metal for Mac

WWDC 2015 で Metal for Mac が発表された.MetalはもともとiOS向けの軽量グラフィックスレイヤーで,OpenGL ES の代わりとして導入されたものだ.GPUがMacに比べて貧弱なiOSデバイス向けという位置付けだったのだが,めでたくMacにもやってきた.

今後 Core Graphics (Quartz), Quartz Compositor (Quartz Extreme), Core Image, Core Animation などがMetalの上に直接乗るだろう.Core Graphics がOpenGLの上に乗ったのは OS X 10.2 からなので,今思えば OS X は実に上手い具合にレイヤー化を徹底していたのだなあと思う.

2015年1月2日金曜日

OpenCV for iOS を使ったXcodeプロジェクトのビルド

個人的にはまったので,メモ.

OpenCV 2.4.10 for iOS, 3.0.0β for iOS とも,libc++に依存しているのだが,Xcode 6.1.1 の Build Setting で

Apple LLVM 6.0 - Language - C++
C++ Standard Library = libc++

とするだけでは上手くいかないことがあるようだ.そんなときは同じく Build Setting で

Linking
Other Linker Flags = -lc++

すると上手くいくみたいだ.

2014年10月16日木曜日

iOS 7 と iOS 8 のレンダリング

iOS 7 と iOS 8 とで同じレンダリングコードを走らせた結果が違うことに個人的にはまっています.状況が整理でき次第このブログでご報告します.

2014年6月18日水曜日

Swift Tour (3)

書こうと思ったのですが...こちらの解説があまりに秀逸なのでお休みします.

2014年6月14日土曜日

Swift Tour (2)

引き続き The Swift Programming Language から A Swift Tour を要約する.

関数は次のように定義する.

func greet(name: String, day: String) -> String {
    return "Hello \(name), today is \(day)."
}
greet("Bob", "Tuesday")

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

関数定義はPascalとHaskellを混ぜたようなスタイルだ.(注:SwiftではPascalのように仮引数名の前にvarをつけることができるが意味はPascalと異なる.PascalのvarはSwiftのinoutに相当する.)

関数内で関数を定義できる.関数は第一級オブジェクトで,レキシカルクロージャになる.

func makeIncrementer() -> (Int -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne
}
var increment = makeIncrementer()
increment(7)

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

関数は関数引数を取ることが出来る.

func hasAnyMatches(list: Int[], condition: Int -> Bool) -> Bool {
    for item in list {
        if condition(item) {
            return true
        }
    }
    return false
}
func lessThanTen(number: Int) -> Bool {
    return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(numbers, lessThanTen)

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

{ (parameters) -> return_type in statements } 構文を使えば名無し関数(クロージャ)をその場で作ることが出来る.

numbers.map({
    (number: Int) -> Int in
    let result = 3 * number
    return result
    })

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

クロージャ構文はRubyに近い.例えば

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

なるnamesを逆順ソートするために標準関数sortに渡すことを考える.

func backwards(s1: String, s2: String) -> Bool {
    return s1 > s2
}
var reversed = sort(names, backwards)

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

名無し関数を使っても良い.

reversed = sort(names, { (s1: String, s2: String) -> Bool in return s1 > s2 })

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

型推論が効くので型名は省略できる.

reversed = sort(names, { s1, s2 in return s1 > s2 } )

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

1行野郎に朗報.returnは省略できる.クロージャの中の唯一の式がreturn文ならreturnを省略できる.

reversed = sort(names, { s1, s2 in s1 > s2 } )

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

そして,LLのように引数を表すビルトイン変数がある.

reversed = sort(names, { $0 > $1 } )

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

ていうか,オペレータ<をそのまま渡せばよかったのかもしれない.

reversed = sort(names, >)

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

もう一つ面白い話題を.関数の最後の引数のクロージャは外に出せる.

reversed = sort(names) { $0 > $1 }

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

2014年6月11日水曜日

Swift Tour (1)

The Swift Programming Language の A Swift Tour より要約する.

もちろん Hello, world から始めよう.

println(“Hello, world”)

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

main関数は必要ない.セミコロンすら必要ない.

定数は次のように定義する.

let myConstant = 42

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

定数 myConstant は型を持つが,その型は推論されるので明示する必要はない.

整数には10進数の他に2進数,8進数,16進数リテラルがあり,2進数でも指数表記が使えたり,16進数で実数が表記できたり,1_000_000のようにアンダースコアを挿入できたりとObjective-C言語に比べると大幅に拡張されている.

ビルトイン型には Bool, Int, Float, Double, String がある.後述するが,関数は第一級オブジェクトであり,また配列型(Array),辞書型(Dictionary),列挙型,タプル,構造体,クラスがある.また他の言語に見られない特徴として,型を「オプショナルな型」にすることができる.これはHaskellのMaybeモナドに近いものである.リファレンスはあるがポインタは無い.

変数を定義したいときは次のようにする.

var myVariable = 42
myVariable = 50

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

変数も型を持つが推論される.型を明示したい場合は次のようにする.

var explicitDouble: Double = 70

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

型は静的に変更できる.

let label = “The width is “
let width = 94
let widthLabel = label + String(width)

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l


文字列リテラル “…” の中に \(…) があると,括弧の中身は展開される.

let apples = 3
let appleSummary = “I have \(apples) apples.”

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

配列を作ることが出来る.

let individualScores = [75, 43, 103, 87, 12]

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

配列要素へのアクセスはいつもの方法で良い.

var shoppingList = [“catfish”, “water”, “tulips”, “blue paint”]
shoppingList[1] = “bottle of water”

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

配列はループで舐めることが出来る.

for score in individualScores {
  // …
}

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

// はコメントである.

if文も普通だ.変数scoreがあったとすると

if score > 50 {
  // score > 50 のとき…
}
else {
  // それ以外のとき…
}

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

条件式はBool型でなければいけない.Bool型が取りうる値は true, false だ.YESとNOではない.

型名の後ろに「?」をつけると,オプショナルな型になる.これはHaskellでいうところのMaybeモナドだ.「?」をつけられた型は,何らかの値か,さもなくばnilを保持できる.オプショナルな型以外はnilを保持できない.

例えば

var optionalName: String? = “John Appleseed”

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

の optionalName は String? 型(オプショナルなString型)なのでnilになれる.これは何らかの例外的状況を表すのに使える.今は強制的にnilを代入してみよう.

optionalName= nil

オプショナルな型を扱うための特別なif文がある.

var greeting = “Hello!"
if let name = optionalName {
  greeting = “Hello, \(name)”
}

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

もし optionalName がnilでなければ,その値はnameに束縛され,次のブロックが実行される.

switch文はデフォルトではフォールスルーしない(いつもbreakする).

let vegetable = “red pepper”
switch vegetable {
  case “celery”:
    let vegetableComment = “Add some raisins and make ants on a log.”
    // breakは要らない
  case “cucumber”, “watercress”:
    let vegetableComment = “That would make a good tea sandwich.”
  case let x where x.hasSuffix(“pepper”):
    let vegetableComment = “Is it a spicy \(x)?”
  default:
    let vegetableComment = “Everything tastes good in soup.”
}

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

ちなみにdefaultは省略できない.

case に続く条件式では if let ... 構文と同じように変数束縛が行える.また変数束縛後にwhere節を置いて条件の絞り込みが行える.

多値を受け取るメカニズムがあちらこちらにある.

let interestingNumbers = [
    "Prime": [2, 3, 5, 7, 11, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25],
]
var largest = 0
for (kind, numbers) in interestingNumbers {
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
}

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/jp/jEUH0.l

サンプルは省略するが,whileループもあるし,do-whileループだってある.

関数とクロージャについてはまた次回に.