iPhone、iPad の GPU はいつか据え置き型ゲーム機超えるかもしれない(多分当分超えない)
一応、iPhone 7 の GPU が何なのか明確にはわかっていないが
Wikipedia によると GT7600 Plus らしい。
カタログスペックによると GT7600 の約倍の 729.6 GFLOPS という性能。
周波数を落としたり、色々やって動作させたりしているっぽく、
iPhone 7 の発表によると iPhone 6s の 50% アップらしい。
でもって、iPhone 6s の GPU。
PowerVR Series7 XT の6シェーダクラスタで192演算ユニットを持つ
PowerVR GT7600 が使われている。
性能的には単精度浮動小数点数で 384 GFLOPS
iPhone 6s の時点で PlayStation 3 や Xbox 360 を超えている。
ハードウェア別でまとめてみた
ハードウェア | FLOPS |
---|---|
PlayStation 3 | 224 GFLOPS |
Xbox 360 | 240 GFLOPS |
Wii U | 352 GFLOPS |
iPhone 6s | 384 GFLOPS |
Xbox One | 1.2 TFLOPS |
PlayStation 4 | 1.8 TFLOPS |
GeForce 1060 | 3.8 TFLOP |
PlayStation 4 Pro | 4.2 TFLOPS |
GeForce 1080 | 8.8 TFLOPS |
iPhone 6s の 50% アップとのことなので iPhone 7 は最大 576 GFLOPS となるだろう。
また、iPad の GPU はコア数が倍になるので、 A10X は 1152 GFLOPS となり Xbox One や PlayStation 4 に近づくかもしれない。
あと、Nintendo Switch は 768 GFLOPS ではないかと予想されている。
以上を踏まえて、まとめてみた
ハードウェア | FLOPS |
---|---|
PlayStation 3 | 224 GFLOPS |
Xbox 360 | 240 GFLOPS |
Wii U | 352 GFLOPS |
iPhone 6s | 384 GFLOPS |
iPhone 7 | 576 GFLOPS ? |
Nintendo Switch | 768 GFLOPS ? |
次期 iPad | 1.1 TFLOPS ? |
Xbox One | 1.2 TFLOPS |
PlayStation 4 | 1.8 TFLOPS |
GeForce 1060 | 3.8 TFLOP |
PlayStation 4 Pro | 4.2 TFLOPS |
GeForce 1080 | 8.8 TFLOPS |
次期 iPhone では集積率が上がるため、さらに速度の向上があると信じている。
とりあえず、据え置きの方もスペックが上がるので、 追い抜くのはまだまだ当分先だろう。
Apple A10X を予想する
Geekbench のベンチマークからの推測
iOS Benchmarks - Geekbench Browser
iPhone
端末 | チップ名 | 周波数 | シングルコア | デュアルコア |
---|---|---|---|---|
iPhone 7 | Apple A10 Fusion | 2.3 GHz | 3293 | 5369 |
iPhone 6s | Apple A9 | 1.8 GHz | 2369 | 3964 |
iPhone 6 | Apple A8 | 1.4 GHz | 1465 | 2445 |
iPhone 5s | Apple A7 | 1.3 GHz | 1205 | 2009 |
iPad
端末 | チップ名 | 周波数 | シングルコア | デュアルコア |
---|---|---|---|---|
iPad Pro (9.7-inch) | Apple A9X | 2.3 GHz | 2934 | 4729 |
iPad Air 2 | Apple A8X | 1.5 GHz | 1782 | 3978 |
iPad Air | Apple A7 | 1.4 GHz | 1308 | 2190 |
変遷
iPhone
端末 | 周波数 | シングルコア | デュアルコア |
---|---|---|---|
A7 → A8 | 1.08 倍 | 1.22 倍 | 1.22 倍 |
A8 → A9 | 1.28 倍 | 1.61 倍 | 1.62 倍 |
A9 → A10 Fusion | 1.27 倍 | 1.39 倍 | 1.35 倍 |
iPad
チップ | 周波数 | シングルコア | デュアルコア |
---|---|---|---|
A7 → A8X | 1.07 倍 | 1.36 倍 | 1.81 倍 |
A8X → A9X | 1.53 倍 | 1.64 倍 | 1.18 倍 |
正直、わからん!
とりあえず、iPhone の伸び率が同じぐらいなので、その伸び率でいうと、 Geekbench のベンチマークのスコア的には、
- A10X は 2.9 GHz 以上
- シングルコア 4078
- デュアルコア 6384
以下のものと同等になってしまう。
シングルコアで
MacBook Pro (15-inch Late 2016)
Intel Core i7-6920HQ @ 2.9 GHz (4 cores)
デュアルコアで
MacBook Pro (13-inch Retina Early 2013)
Intel Core i7-3540M @ 3.0 GHz (2 cores)
まとめ
バッテリーの問題等このスペックになるかはわからないが、 近しいものになるような予感はしている。
SoC のプロセスルール、GPU の強化、次世代のメモリーとかが使用されれば、さらに iPad の体感速度は上がるだろう。
A10 Fusion のように big.LITTLE な構成にしコア数を増やしてきても面白いし。
また、Snapdragon 835 では旧来の Windows アプリケーション(クラシック デスクトップ アプリ)が動くらしく、Photoshop を動かすデモを行っていた。
次の Windows Phone の Continuum 使用時にクラシック デスクトップ アプリが使用可能という噂もある。
(もし、スマートフォンで秀丸とか使えたら面白い)
これらを踏まえると、もう一般範疇で使用されるパソコンの時代は終わりそうな勢いである。
もしくは、Mac に Apple A シリーズのチップが載るというところ。
面白くなってきていると思われる。
Swift で Touch Bar 開発 - 今更だけど寿司を回す
なぜか SubView の Basic Animation が動かなくなった。
修正したコードを貼っておく。
前回のものがそのままでは動かなくなってしまい、そのまま直すのあれなので、今更だが寿司を回すことにする。
あと、前回すっ飛ばした概要の説明。
今更だけど Touch Bar とは
宇宙に衝撃を与えるため、
ESC、ファンクションキー、電源ボタンを過去のものにして代わりにタッチセンサーを載せたもの。
アプリケーションの状態によって適切な機能が表示され、使用できるようになっている。
(物理の ESC キー返せ)
キーボードの拡張としてつくられたものなので、アプリケーションの表示上にない機能は実装してはならないらしい。
例外として、フルスクリーン時にクリックや右クリックがされない限り操作でにないものは、
画面上に表示されていなくても使用可能とのこと。
よって、残念ながら今回のタッチバーの機能は実装してもアプリの審査を通ることはない。
Touch Bar 動作
NSTouchBar クラスを呼び、デリゲートから NSTouchBarItem をぶち込むだけだ。
NSTouchBarItem は大概カスタムの NSCustomTouchBarItem で、
ボタンなどの UI や ViewController をぶち込む。
ちゃんとした説明
Touch Bar は NSTouchBar オブジェクトであり、NSTouchBarItem の配列である。
でもって、NSTouchBar オブジェクトは以下の条件を満たす必要がある。
- キーボードの拡張らしいのでレポンダーチェインが使用されており、NSResponder のサブクラスのインスタンスである
- NSTouchBarProvider プロトコルに準拠する
- そのプロトコル内で makeTouchBar() メソッドを実装する
AppKit のほとんどのレスポンダーは、
NSTouchBarProvider プロトコルに準拠し、
Key-Value Observing (KVO) をサポートしていて、
キーの値の変更で通知し、delegate に書かれた振る舞いで Touch Bar の中身が変わる。
どうやら NSTouchBarProvider プロトコルに準拠するオブジェクトを Bar provider というらしく、
Bar provider が持つ touchBar プロパティ に nil を渡すと makeTouchBar() -> NSTouchBar? が動き、
NSTouchBar を設定値とともに返り値として、touchBar プロパティに渡す。
touchBar プロパティはデフォルトで空なので、
makeTouchBar() が呼ばれるが何もないので、
Touch Bar は何も表示されていない状態になる。
と、書いたが、
NSResponder も NSTouchBarProvider も makeTouchBar() も組み込まれているので、
とりあえず、つくる上では今回はあんまり深く考えなくてもよい。
今回の環境
Touch Bar がない場合はエミュレータを使って開発が可能。
Xcode を立ち上げてメニューバー Window > Show Touch Bar で表示される
下準備
プロジェクト作成
macOS で Cocoa Application を選択し、「Next」ボタンを押す。
ファイル名を入力。
ちなみに、Swift を使うので Language は「Swift」を選択。
問題がなければ、「Next」ボタンを押す。
保存先を選んでプロジェクト作成完了。
NSWindowController 的なクラスをつくる
今回は真面目につくる。
Command + N を押して新しいファイルをつくり、
Cocoa Class を選択して「Next」ボタンを押す。
Class 名はなんでもよいが、とりあえずここでは「WindowController」に。
でもって、サブクラスを NSWindowController を選択。
プロジェクト作成時の Main.Storyboard を使用するので、
「Also create xib file for user interface」チェックボックスを外し、
「Next」ボタンを押す。
つくったクラスを Storyboard で紐付ける
Main.Storyboard 開き
左側 Document Outline の「Window Controller Scene」を選択
Command + Control + 3 を押して、右側の Identity Inspector
最初の項目 Custom Class の Class の下矢印から
先ほど作成した「WindowController」を選び変更。
これで下準備完了。
とりあえず、Touch Bar に寿司を表示させてみる
まず、ESC キーの横に寿司を1つ表示させるよ。
はじめに Touch Bar に表示させる ViewController を作成から。
NSWindowController の時と同様に、 Command + N を押して新しいファイルをつくり、 Cocoa Class を選択して「Next」ボタンを押す。
Class 名はなんでもよいが、とりあえずここでは「SushiController」に。 でもって、サブクラスを NSViewController を選択。 プロジェクト作成時の Main.Storyboard を使用するので、 「Also create xib file for user interface」チェックボックスを外し 「Next」ボタンを押す。
SushiController.swift を開いて書いていく。
viewDidAppear() で Touch Bar 表示させるのだが、 loadView() で self.view を設定しないと怒られるので、 super.viewDidLoad() の下に self.view = NSView() を書く
override func loadView() { super.viewDidLoad() self.view = NSView() }
そんでもって、Touch Bar 中身である viewDidAppear() の中を書いていく。
流れ
- 表示するための NSView をつくる
- NSView の大きさと位置を決める
- SushiController の view に addSubview で作成した NSView を入れる
- NSTextView に絵文字の寿司を設定する
- NSView に addSubview で作成した NSTextView を入れる
以下、コード。
override func viewDidAppear() { let sushiView = NSView() sushiView.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height) sushiView.layer?.position = CGPoint(x: 0, y: 0) self.view.addSubview(sushiView) let sushi = NSTextView(frame: NSRect(x: 0, y: -2, width: 30, height: 30)) sushi.string = "🍣" sushi.drawsBackground = false sushi.font = NSFont.systemFont(ofSize: 20) sushiView.addSubview(sushi) }
あ、寿司は TextView で表示しているので drawsBackground で false を設定しないと
寿司の背景が白くなるので気をつけて。
とりあえず、Touch Bar 中身はつくったのだが、 表示する設定はしていないので、
続いて書いて行く
NSWindowController.swift をいじっていく。
もう忘れている可能性があるが、最初の方に説明している動作を実装する。
流れ
- 表示する NSTouchBarItem の識別子をつくる
- デフォルトで呼び出される makeTouchBar() をオーバーライドして NSTouchBar や識別子などを設定する
- Touch Bar のデリゲートで識別子からカスタムの TouchBarItem を設定する
この3つを設定するを表示できる
てことで、以下コード。
まず、初めに
import Cocoa の下に Touch Bar 表示させるための識別子を設定する。
とりあえず、以下のコードを書く
fileprivate extension NSTouchBarItemIdentifier { static let sushiID = NSTouchBarItemIdentifier("jp.food.touchbar.sushi") }
NSTouchBarItemIdentifier を拡張して NSTouchBarItemIdentifier を設定。
今回は一つしかないが複数ある場合は、被らないような文字列に。
ちなみに、fileprivate というアクセス修飾子は Swift 3.0 から導入されたもので
そのファイル内でしか使用できない。
今回の場合だと NSTouchBarItemIdentifier.sushiID は NSWindowController.swift でしか使用できない。
試しに、SushiController.swift に 「NSTouchBarItemIdentifier.s」まで打ち込んでも入力候補に出てこないはずだ。
次は override func windowDidLoad() { ... } の下に 以下の初期設定のコードを入力
@available(OSX 10.12.2, *) override func makeTouchBar() -> NSTouchBar? { let mainBar = NSTouchBar() mainBar.delegate = self mainBar.defaultItemIdentifiers = [.sushiID] return mainBar }
NSTouchBar を設定し、デリゲートとアイテムの識別子を設定し NSTouchBar を返す。
識別子は先ほど設定したものを配列として入れている。
ちょっと前に書いたように、オーバーライドした makeTouchBar() の返り値 NSTouchBar は WindowController が持つ
self.touchbar プロパティ渡される。
self.touchbar に自前の NSTouchBar を返す関数を放り込むことで Touch Bar の表示を変えることができる。
ちなみに @available(OSX 10.12.2, *) は見たままだが、
これを書いた下のブロックは macOSX 10.12.2 以降で動作するというやつ。
続いてデリゲートの設定
class WindowController {} の下に
以下のコードを書く
@available(OSX 10.12.2, *) extension WindowController: NSTouchBarDelegate { func touchBar(_ touchBar: NSTouchBar, makeItemForIdentifier identifier: NSTouchBarItemIdentifier) -> NSTouchBarItem? { if identifier == .sushiID { let item = NSCustomTouchBarItem(identifier: identifier) item.viewController = SushiController() return item } return nil } }
前回同様、WindowController を拡張してデリゲートを書いている。
内容は識別子が sushiID だったら NSCustomTouchBarItem を設定し、
viewController の中身を最初につくった SushiController() にしている。
入力した WindowController.swift は 以下のようになる。
import Cocoa fileprivate extension NSTouchBarItemIdentifier { static let sushiID = NSTouchBarItemIdentifier("jp.food.touchbar.sushi") } class WindowController: NSWindowController { override func windowDidLoad() { super.windowDidLoad() } @available(OSX 10.12.2, *) override func makeTouchBar() -> NSTouchBar? { let mainBar = NSTouchBar() mainBar.delegate = self mainBar.defaultItemIdentifiers = [.sushiID] return mainBar } } @available(OSX 10.12.2, *) extension WindowController: NSTouchBarDelegate { func touchBar(_ touchBar: NSTouchBar, makeItemForIdentifier identifier: NSTouchBarItemIdentifier) -> NSTouchBarItem? { if identifier == .sushiID { let item = NSCustomTouchBarItem(identifier: identifier) item.viewController = SushiController() return item } return nil } }
Command + R を押すとビルドされ、アプリ起動後に、
Touch Bar の ESC キーの横に寿司が表示される。
寿司を並べてみる
ただ複数配置するだけ。
SushiController.swift を開いて再度編集
こちらを
let sushi = NSTextView(frame: NSRect(x: 0, y: -2, width: 30, height: 30)) sushi.string = "🍣" sushi.drawsBackground = false sushi.font = NSFont.systemFont(ofSize: 20) sushiView.addSubview(sushi)
こちらに変更
for i in 0...10 { let sushi = NSTextView(frame: NSRect(x: i * 80, y: -2, width: 30, height: 30)) sushi.string = "🍣" sushi.drawsBackground = false sushi.font = NSFont.systemFont(ofSize: 20) sushiView.addSubview(sushi) }
Command + R を押すとビルドされ、アプリ起動後に、
寿司がたくさん表示される。
寿司を動かしてみる
ただ Core Animetion で横移動するだけ。
SushiController.swift を開いて再度編集
先ほどループさせたブロックの後に以下のコードを追加。
let anim = CABasicAnimation(keyPath: "position") anim.repeatCount = .infinity anim.duration = 1 anim.fromValue = sushiView.layer?.position anim.toValue = NSValue(point: NSPoint(x: -80, y: 0)) sushiView.layer?.add(anim, forKey: "position")
アニメーションの種類は移動で、リピートは無限、1秒で -80px 左にアニメーションする。
このままだと、アニメーションが途切れるので、sushiView.frame の 幅を +80 する。
以下、SushiController.swift の全コード。
import Cocoa class SushiController: NSViewController { override func loadView() { self.view = NSView() } override func viewDidAppear() { let sushiView = NSView() sushiView.frame = CGRect(x: 0, y: 0, width: self.view.frame.width + 80, height: self.view.frame.height) sushiView.layer?.position = CGPoint(x: 0, y: 0) self.view.addSubview(sushiView) for i in 0...10 { let sushi = NSTextView(frame: NSRect(x: i * 80, y: -2, width: 30, height: 30)) sushi.string = "🍣" sushi.drawsBackground = false sushi.font = NSFont.systemFont(ofSize: 20) sushiView.addSubview(sushi) } let anim = CABasicAnimation(keyPath: "position") anim.repeatCount = .infinity anim.duration = 1 anim.fromValue = sushiView.layer?.position anim.toValue = NSValue(point: NSPoint(x: -80, y: 0)) sushiView.layer?.add(anim, forKey: "position") } }
Command + R を押すとビルドされ、アプリ起動後に、 寿司が回る。
おまけ
Command + W などで
アプリのウインドウを閉じてもアプリは終了しないので
class AppDelegate にその処理を追加する。
func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { return true }
おまけ2
今回ウインドウに Touch Bar を設定したため、Dock にぶち込んで戻すと Touch Bar に以前のものが表示されつつ、新しいアニメーションが表示されてしまう。
なので、見えなくなったら初期化するコードを SushiController へ書く。
override func viewDidDisappear() { self.view = NSView() }
AppDelegate.swift で Touch Bar の処理を書くと上の処理はいらない。
self.touchBar の self を指す場所が NSApplication になるためだが、Apple のサンプルコードや Apple 謹製のアプリの振る舞いを見ていると NSWindow に touchBar プロパティを設定しているっぽい。
まとめ
以上、寿司を回してみた。
Touch Bar に NSViewController を表示させているため、かなりの自由なことができるようになっている。
iPhone と Occipital Bridge
そう言ってみれば Bridge を手に入れたので感想を書いてみる。
Occipital Bridge とは?
Bridge - Mixed Reality and Positional Tracking VR Headset for iPhone and iOS
現実と仮想空間を合成するヘッドマウントディスプレイ(HMD)で AR とか MR とか呼ばれているもの。
他の商品として Microsoft HoloLens があり、
違いはいくつかあるが、 大きな違いは視界がシースルーではなく iSight カメラと専用のセンサーで外界と合成するところ。
また Oculus Rift や HTC Vive と同じように凸レンズの二眼なもなので、Bridge の HMD には iSight カメラに湾曲したカメラを付ける。
アプリのコントロールができないため、開発版では Blutooth で操作するボタンが付属する。
そんでもって感想
Hololens と共に開発版ではあるが、残念ながら現時点では不完全な部分が多い。
キャリブレーション
元々 Structure Sensor という iPad につなげるセンサーで iPhone とそのカメラに流用したものである。
Structure Sensor は Kinect や HoloLens 同様に赤外線を飛ばし赤外線カメラで跳ね返る時間を元に物体を認識している。
iPad のカメラとそのセンサーをぴったり合わせるため、センサーのキャリブレーションが必要となる。
こちらは HoloLens のように単一の商品ではないため、センサーと凸レンズをかぶせた iSight カメラで2回キャリブレーションをする必要性がある。
ちなみに、センサーのキャリブレーションが認識しづらくて設定にかなり時間かかった。 夜やったが、陽が当たっていないとかなり難しいらしい。
結構厳しいところだが、
iSight カメラと Bridge のレンズが密着しており、
キャリブレーション時にそれを外すのだが、その際に iSight カメラの内側カバーの塗装が剥がれた。
空間認識
残念ながら HoloLens と異なり、リアルタイムではない。
なので、あらかじめスキャンしておかなければいけないし、スキャンできる空間にも限度がある。
ただ、HoloLens が空間を三角分割してポリゴン化しているのに対して、
Bridge はそれなりにポリゴン化する。
レイテンシー(遅延)
動作に対してはカメラと3Dとを合成するため処理的に辛い部分がある。 レイテンシーでの酔いだが、ギリギリ酔わない程度。
画面
iPhone 6, 6s, 7 のサイズを右目、左目用で正方形半分ずつなので狭い。 個人的には Plus サイズの方が良かったのではと思うが HMD が重くなるので致し方なし。
1334x750 の画面サイズだが半分にすると 667x750。 凸レンズにフィットするため、画面の映像は中央から膨らむ形となっていて、ディスプレイより画像は小さくなる。 そのため、視界が狭い感じは否めない。
アプリ
開発版なのでこちらしかない。
キャラクタに視線を合わせボタンを押すとメニューが表示され各種機能を使うことができる。
骨のアイコンをクリックし空間にアイテムを投げると、キャラが投げたものを拾い自分のところまで戻ってくる。
3D 空間においてアバターという存在は大きく、 AR / MR の UI の操作として新しい知見を得た。
アプリ開発
HoloLens や他のデバイスと同じように Unity の使用できるがほとんどの機能が使えない。 代わりにネイティブの機能である SceneKit を使う必要がある。
HoloLens にあるもの
眉間の部分にセンサーがついており、手の動きによるジェスチャー操作が可能である。
エアタップと呼ばれる指をつまむ動作で物体を掴むことができ、ブルームという手を開く動作からメニューを開くことができる。
また、耳の付近に赤いパーツがあり、アレイスピーカーがあり3次元音響を実現する。 耳を塞がないため現実空間とミックスされる形となっている。
まとめ
HoloLens とは価格帯も違うので正直クオリティについていうのもなんだが、センサーを使用すればスマートフォンでも HoloLens のようなものが実現できるというのがわかる。
また、もし iPhone 7 Plus の iSight Duo による空間認識ができるようになれば、センサーは要らないだろう。
噂だが Apple 自体が AR メガネを開発しているとのことなので今後期待できるかもしれない。
iPhone 本体交換する際の Suica (Apple Pay) 移行方法
iPhone の本体交換する際、きっと ジーニアス・バー でも説明はされないのでご紹介。
というか、自分用のメモ。
公式の解説ができてたので、 こちらを見た方が早く解決するかも
新しい Suica をつくる選択も……
そこそこ面倒なので Suica の残金があまりなければ、
新しいカードを作った方が煩わしくないと思われる。
あと、以下の文章を読まなくて済む。
はじめに
Apple Pay 等で使用する Wallet アプリにあるカードは iCloud で紐づけらており、
基本的には再度登録し直せば、新しい端末でも使用可能になる。
ただ、Suica に関してはこのようにはできない。
理由は Suica 等の交通系 IC カードは、カードごとに固有の ID が設定されており、
この世界にそのカードは1枚しか無いため。
2つの iPhone で1枚の Suica を使用することができなく、多分キセル防止のためだと思われる。
iPhone での Suica の注意点
Suica のカードを端末から消す際は注意が必要で、
JR でのカード設定をリセットするタイミングが AM 5:00 頃ということを頭に入れる。
要するに既存の Suica カードを再び登録する場合は、朝の5時にならないと使用することができず、
その近辺でカードを消すと丸1日使用できなくなる。
あと、頻繁に Suica カードを消すとキセル防止ため、
カード設定がリセットされるまでカード再登録ができなくなる。
そんでもって、AM 2:00 〜 3:00 頃は JR 側のメンテナンスかよくわからないが、
Suica 関係の操作ができない可能性があるので注意が必要。
Suica の移行方法
その1 移行前の iPhone から Apple Pay 関連のカードの削除
移行前の iPhone が手元にある場合
Wallet アプリを起動し、Suica のカードを選び右下の i のアイコンをタップ。
詳細情報が出るので、一番下の「カードを削除」をタップ。
何度も書くが朝5時にならないと Suica の再アクティベーションできないので注意
すでに交換していて移行前の iPhone がない場合
Mac / PC などで iCloud.com を開き、歯車アイコンの設定 (Settings) をクリック。
紐づけられている端末が列挙されるので、
移行前の iPhone を選択。
Apple Pay のカードを全て消す的なものが出るのでクリック。
(英語なので Remove All)
処理が終わり Apple Pay のロゴが消えれば完了。
こちらも朝5時にならないと Suica の再アクティベーションできないので注意
その2 新しい iPhone へ登録
iPhone に使用していた iCloud のアカウントを端末に設定。
Wallet アプリの Apple Pay の右上の + ボタンをタップしカードを設定で完了。
朝5時頃、JR 側でカード設定のリセットされれば使用できるようになっているはず。
Suica アプリ の エラー
Q.1日経ったが、Suica アプリで C105 のエラーが出てアクティベーションされない
A.残念ながら何らかの問題が出ている模様
カード消して再チャレンジ
Q.Suica アプリで C106 のエラーが出てアプリ側で認識しない
A.残念ながら何らかの問題が出ている模様
カード消して再チャレンジ
その他のエラー検索
Apple Watch
こちらも同様。
移行する Watch にあるカード情報を消して、登録し直す。
最後に
状況によっては、丸2日使えなくなる可能性があるので、その間は現金や他のカードを使用することも考えるべし。
Touch Bar の表示例
Touch Bar の対応アプリ開発をする時が来るかもしれないので、
OS インストール時に入っていたアプリの Touch Bar 表示を調べてみた。
Finder
カスタマイズでほぼ全てのツールバーの機能が使用できる。 唯一 Touch Bar の機能のカスタマイズができる。
Safari
新規タブを開くと、そこに表示されているお気に入りが表示される
アドレスバー フォーカス時
入力以外に、戻る、進む、新規タブのボタンがある
複数タブが開いている場合、ページが一部表示され、
戻る、進む、検索、新規タブのボタンがある
また、オーディオやビデオを再生するとスクラブさせる UI が表示される。
iTunes
選択するとメディアコントロールが表示され、巻き戻し、早送り、再生、再生位置をスクラブできる UI が表示される。
表示されているものは音楽だが動画の場合、他のボタンが表示される。
メール選択時に、新規、返信、アーカイブ、検索、迷惑メールに移動、フラグのボタンが表示される
Calendar
月の表示。
日、週、年 も字が変わるだけで見た目は同じ。
予定選択時
カレンダー選択、詳細情報のボタン
場所、時刻、予定参加者はショートカットボタンが用意されている
日時選択
Message
新規、メッセージの送信などのボタンが表示
FaceTime も同等のものが表示される
マップ
通常
GPS 使用するボタン、検索窓が表示
起動時、検索窓フォーカス時
近隣のレストラン、カフェ、買い物、映画を表示するボタンが表示される
ピン選択時
詳細情報のショートカットを表示される
経路ボタン 車、徒歩、交通機関切り替えのショートカットボタンが表示
リマインダー
予定選択時
新規、完了、情報、時間、場所の追加などのボタンが出る
iBooks
本選択後、 ページをスクラブ、検索、ブックマークボタンが表示される
計算機
クリア、プラスマイナス変換、%、小数点、四則演算のボタンが表示される
プレビュー
各機能のボタンが表示され、 起動時は調整が選択される
左ボタンがポップオーバーになっており、
調整、選択、マークアップの3つの区分から選択する
調整
選択
GarageBand
楽器のパラメータ設定を表示
画像は Steinway Grand Piano
QickTime
再生・停止ボタンと再生位置をスクラブできる UI が表示
設定
戻る、進む、すべてを表示のボタンが表示
Pages
文字選択時デフォルトに近い文字編集が表示される
Numbers
セル選択時にフォーマット、数式、デフォルトに近い文字編集が表示される
Keynote
スライド選択時の表示
アラートなどのモーダル
エラーメッセージなどアラートウインドウを表示した場合
ボタン部分が表示される。
以前は Safari の JavaScript で alert() や confirm() でも表示されていたが動かなくなった。
Terminal
ウインドウ色の変更、コマンドの man が表示できるボタンなど表示
Xcode
起動時
ビルド、停止、タブの移動などのボタンを表示
テキスト入力時
通常
リッチテキスト
絵文字
通常時(履歴表示)
右フリックで絵文字のカテゴリー選択
Control Strip に追加されるもの
システムで右に4つの領域は固定されているが、特定の条件下でバックグラウンドに回った際に、5つ目の機能が追加される。
現状、確認しているのは iTunes、QuickTime、Safari などで音楽や動画を再生している時と、
Xcode でビルドしアプリケーションを動かしている時に変更される。
5つ目の表示は後勝ちで、iTunes で再生後に Xcode でビルドすると、ボタンの表示は Xcode のものになる。
Control Strip の音楽、動画再生ボタン
iTunes、QuickTime、Safari などで音楽、動画を再生すると Control Strip に5つ目のボタンが現れる。
ボタンを押すとスクラブできる UI が表示される。
複数再生していると左側のボタンで選択できる模様。
Control Strip の Xcode デバッグ
Xcode でビルドすると Control Strip に5つ目のボタンが現れる。
ボタンを押すとデバッグ系のボタンが表示される。 音楽、動画を再生していると Control Strip に5つ目のボタンが変更される。
アプリ開発者は Control Strip をいじることはできないが、
プライベート API を使用すると、Control Strip も開発者が変えることができる。
ストアの審査に通らなくなるが。
その他
iMovie、写真 など一部紹介していないものがあるが他の Touch Bar の UI と大体同じようなものが出る。
また、App Store のアプリなど Apple 製のアプリでも全く表示されないものある。
開発
開発面でいうと、
SDK で用意されている UI は、
Touch Bar 自体と View を除くと以下のものしか用意されていない。
- Fixed Space
- Flexible Space
- Popover
- Group
- Other Items Proxy
- Scrubber
- Color Picker
- Character Picker
- Sharing Service Picker
- Label
- Button
- Slider
- Segmented Control
Scrubber は写真アプリや Safari のタブなど使われている画像を選ぶもの。
そのため、動画の再生位置を表示するものなど、上のリストにないものは自前で UI をつくる必要がある。
標準的なものはこのような形となっており、もし macOS アプリで Touch Bar を開発する際は、標準アプリの振る舞いを試してみると良いかと思われる。
Touch Bar 唯一の問題点
Touch Bar 使用して数週間経った。
基本的には便利だとは思うが唯一問題点がある。
Touch Bar は有機ELであり焼きつき防止のためか、
1分そこそこでスリープし、真っ暗になる。
スリープ状態になるとタッチすることで復帰可能だ。
問題はフルスクリーンで動画を観る時で、
動画視聴中に Touch Bar がスリープとなる。
そうなると ESC キーでフルスクリーンの解除がすぐできない。
Touch Bar の エリアをタップし、ESC キーを押さなければならなく、
以前よりプロセスが増えた。
Command + Option + F で解除できるがアプリによっては他の動作が割り当てられていることがあり不便。
正直、Touch ID 同様に ESC は物理ボタンにしたほうがよかったのではないかと思っている。
それに、もし Touch Bar が動かなくなった場合、ESC キーが使えなくなるという問題がある。