Apple Fall Event 2016

AppleのiPhone発表イベントが近づいてきたので、直前のリーク情報や妄想まとめ。

iPhone 7 – 買うよ

  • A10 chip
  • Storage 32GB, 128GB and 256GB
  • New black color
  • IPX7 water resistance
  • No Headphone jack
  • Earpods with lightning adaptor
  • Dual lens camera for Plus
  • 12 megapixel camera
  • FeliCa support

2年周期でiPhone6持ちなので今回は買いの年。iPhone 7の新しいBlack(より黒い方)の128GBを狙う。

iOS 10

  • API for NFC/FeliCa 妄想

かなり信憑性が高まってるFeliCa対応。でも、実際にどれほど実装して使えるようにしてくるのか。Appleがやるのか、それともAPIを公開して各社が実装するのか。FeliCaはどうでもいいけど、早くApplePayを日本ではじめて欲しい。

Apple Watch 2

  • Thinner display
  • Longer battery
  • GPS

初代がまだ1年ちょっとだし、買い換える必要はないけど、内容と価格によっては買い換えるかも。iPhoneも財布もなしでジョギングして位置情報を記録してくれてApplePayもできたら最高や。

Macbook Pro

  • Intel Skylake chip
  • OLED touch panel

今はMacbook pro retina 15” mid 2012で、4年も経つけどパフォーマンスに全然不満がない。いつ買い換えるべきなのか。次の大幅な円高の時に狙うか。さっさと90円に行こう。

iPad Air

  • none

iPad pro 7”あるから買いはしないけど、在庫薄になってるらしいし、何かしらのアップデートはあるのかもしれない。iPad air 2から2年だし。

Airpods – 買うよ

  • Truly wireless earbuds

発表されたら即ポチる。ずっと待ってた。もしでなかったらBragi買っちゃう。技適あれば。

Airport Extreme 妄想

  • Siri
  • Competitor for AmazonEcho and GoogleHome

Wi-Fiのアクセスポイントが欲しくて妄想したけどTP-LINKのAnchor9が安くなってたから買ってしまった。出ても買わないかな。

さて、結果やいかに。

 

WWDC 2016 review

すでに1ヶ月以上が経ち、すでにPublic Betaまでリリースされてしまっているが、前回のエントリがWWDC予想だったので、今回はレビューをしないといけない。遅ればせながら。

iOS 10

iMessage API

予想通り。他社がAIやBotなどを進めてる中でAppleだけ何もしないわけにはいかないし。ただこちらはメッセージに定型文や画像をPUTするAPIなだけでBotなどには基本的に対応してないと思われる。iMessageの送受信APIがあれば、Bot用のAppleアカウントを作ってBotに対応させることができるだろうがAppleがそこまで公開するとは思えない。でももし公開すればサードパーティによるiMessage for Androidが可能になるだろう。そう、今回もこれはおあずけだ。秋のイベントでサプライズあるか?

Siri API

こちらも予想通り。1%としてたが。内容は6タイプのみの公開で、
– RideBooking(Uberなど乗り物の予約)
– Messaging(WeChatなどメッセージの送信。おそらくLINEも対応するはず)
– PhotoSearch(画像検索)
– Payments(支払い)
– VoIPCalling(ネット音声通話の開始)
– Workouts(ワークアウロの開始)
と、かなり用途が限定されてる。サードパーティのTODOアプリにタスクを追加、なんてことはできないかもしれない。どれかの使って代替的に対応できるのかもしれないが。AppleはAPIのオープンにかなり慎重なスタンスだから、今後広がっていく可能性が高い。

Message App 2.0

メッセージアプリが大きく進化し、表現力が蓋かになった。手書き文字の送信や相手のメッセージへの簡易返信フラグ、文字サイズや表示エフェクトなど大きく進化した。そして何より前述したiMessage APIを使ったAppStore in Messageが始まる。誰でも簡単にステッカーを売れるわけだ。LINEには大きなカウンターパンチと言える。ただし、やはりAndroid対応がないのでユーザーが限られてしまう問題が残る。これだけ多くの機能を追加しても使ってくれる人がいなければ、アプリ開発してくれる人がいなければ意味がない。

Maps & API

これは完全にノーマークだった。マップアプリにAPIを通じてレストランの予約ができたりするようになる。また、これ以外にもマップアプリ自体が大きく変わり使いやすくなった。ただ肝心の地図の内容がまだまだGoogleMapsに劣る点は否めない。そういえば、iOS 10で電車の乗り換え案内が日本(おそらく東京のみ)でも始まる。

Home

HomeKitのデバイスを操作するための専用のアプリが追加される。簡単な操作で家中のライトなどのHomeKit対応製品を管理できる。ただし日本だと対応製品がほとんどない。Siriでも操作できるよ。

Music

予想通り、Musicアプリがリデザインされた。正直微妙。慣れるまでに少々の時間がかかりそう。

Photos

他社がやってるように、写真を解析して自動的にアルバムを作ってくれるようになる(Memories)。

macOS Sierra

macOS

名称がmacOSになった。ただしナンバリングは変わらず10.12のまま。

Unlock Mac with Apple Watch

こちらも予想通り。ただしTouchIDではなくWatchのみ。Watch売りたいんだろうなぁ。Mac側は2013年以後のものが必要で、Appleアカウントも2段階認証を設定していないといけないなど幾つか条件がある。私のは無理だ。

Siri

MacにもSiriが来る。もう数年前から妄想されてたことがやっと実現。Siriで検索した結果をファイルに追加したりなど便利に使えそうだ。

Photos

こちらもiOS同様に自動でアルバムを作ってくれる。これらはすべてローカル側でやるようで、Mac、iPhone、iPadそれぞれ別個に解析作業をやるようだ。これはプライバシー優先のポリシーのためだとか。Googleならすべてサーバー側でやって各デバイスに結果を送ってくるだけだ。

Universal Clipboard

これは素晴らしい。Mac上でコピーしたテキストやファイルをiPhoneでペーストできる。今までいいちいちノートに書き留めるなど別のアプリを経由して渡さないといけなかった。

iCloud Drive

設定次第のようだが、今後はDocumentsとDesktopフォルダが自動的にiCloudDriveで同期されるそうな。これでMacを複数台使ってる人なんかはどれでも同じファイルを扱えると。iCloudDriveの容量/料金が・・・

Optimize Storage

あまり使わないファイルなどを自動的にiCloud側に置いてローカルから中身を消し、Macの空き容量を確保してくれるらしい。個人的にかなり嬉しい機能だけど、たぶん事故る人(Appleに勝手にファイル消されたと怒る人)が出てきて問題になる。復旧できるといいけど戻せなくなって完全にアウトになると厳しそう。

Tabs

一部のアプリを除いてどのアプリでもタブでファイルを開けるようになるという。サードパーティアプリも自動的にタブ対応になるはず。

Picture in Picture

SafariやiTunesの動画再生を常時前面において表示できるようになる。最近のiPadが対応してるやつ。

watchOS 3

Dock

Glanceに変えてDockが登場。さらにDockに追加したアプリは常にロード済みの状態で待機しておき、起動があっという間に。これまでにWatchアプリの起動の遅さを大幅に改善してくれる。ただし10枠。

WatchFaces

ミッキーについでミニーも登場。その他にもActivityRingsをフィーチャーしたFacesも複数追加され選択肢が増える。まだサードパーティにフルに公開はしないようだ。

Breathe

新しく深呼吸してリラックスするというフィットネス機能が追加される。1日に1回くらいはやるかな。

Scribble

手書き文字に対応。手書きを認識し文字にしてくれる。

SOS

サイドボタンを長押しすると簡単に緊急電話がかけられるようになる。海外に行った時にその国の緊急番号を知らなくてもwatchがかけてくれる。

感想

iOSは新しいiMessageやSiriのAPIでどんなアプリが出てくるのか楽しみだ。MapsのAPIはそこまで使われることはなさそう。それ以外は小粒な進化か。
macOSは空き容量を増やして欲しいので歓迎。Crashplanでバックアップしてるので、もし消されてしまっても復旧はできるか。
watchOSが一番の期待。PublicBetaのプロファイルは配布されているがまだリリースはない。watchは今後もなしのままかもしれない。

 

Facebook Mが始まるらしい

FacebookがSiriやGoogleNowやCortana(MS)のような音声アシスタント機能を追加する。Messengerに!

音声アシスタントはSiriが最も知名度が高いが、まだまだできることが限られているし、GoogleのGoogle Nowの方ができることも返答も多い印象。ただSiriのおもしろい返しは好きだ。Cortanaはまだまだこれからといったところ。他にもAmazonがEchoを始めてるし、今後さらに競争が激しくなっていくと予想される。

Facebook M(Android Mみたいだ)はベイエリアの数百人から始めるということで、その後全米、英語圏、その他の国へ、という計画だと思われる。すでにライバルは日本語にも対応してるし、そう難しいことではないんだろうが、Facebookという口語テキストが大量にあつまるサービスがどれほど自然な会話にできるのか楽しみである。

主な機能としては、レストランを予約したり、友達の誕生日向けにプレゼントを注文したり、なんてことができるとのこと。Messengerアプリに内蔵されるということで、使うにはいちいちアプリを起動しないといけないのはかなりのハンディとなる。もしかしたら度々噂にもなるFacebook Phoneが現実になる日が来るのかもしれない。

音声アシスタントでよく利用されるのは、メッセージ・Emailの送受信や予定・タスクの追加などだろうと思う。その分野においては、Apple(iCloud)、Google(Gmail/Calendar)、Microsoft(Outlook)はしっかり押さえてるわけで、Facebookは劣る部分だ。FacebookがSunriseを買収すれば少しは助けになったのではないかと思うがMSが買収済みだ。まぁFacebookなら自前で作る余裕と資金と規模がある。

FacebookはSocialNetworkingの巨人で今や株式総額20兆円を超える企業だ。広告収益も絶好調で、株価もどんどん上がってるが、まだ広告以外に柱となる収益事業ができていない。もちろん、その分大きな成長の余地があるともいえる。実際、WeChatが中国の保護政策(FacebookやYoutubeは禁止)の下で爆発的に成長し、公共料金の支払いや病院の予約までできるようになっている。ユーザーの生活必需品になりつつある。日本ではLINEが様々な事業を劇速で始めてるが、もしFacebookがどうようのことを始めたら世界が変わるだろう。世界中どこへ行ってもFacebookアプリで支払いやレストラン予約やホテルの部屋の解錠などができるようになったらLINEみたいに(メッセンジャー機能以外)ほぼ日本向けなサービスは滅ぶかもしれない。mixiのように。

ただfacebookもすでに動きが重い。Oculus事業や音声アシスタントのように最先端技術を追いかけてる間に、LINEはスタンプ/ステッカーを収益源にしたし、個人が売れるようにもした。パクリと言われようとも、Facebookもきっちりライバル潰しの機能拡充は必要なんではないかと思う。

できればEndToEndの暗号化を実装してほしい。

 

PHPの型チェックのメモ

テストコード

$f = tempnam(‘/tmp/’,’test’);
$testme = array(
null,
true,
false,
array(),
0,
1,
0.10,
1.123,
”,
‘0’,
‘1’,
’10’,
‘0.10’,
‘1.123’,
‘1,234,567’,
‘ 1’,
‘1 ‘,
‘ 1 ‘,
‘Hello’,
new stdClass(),
fopen($f,’w’),
);

$result = array();
foreach($testme as $value){

$tmp = array();
$tmp[‘value’] = $value;

$tmp[‘isset’] = isset($value);
$tmp[‘null’] = is_null($value);
$tmp[’empty’] = empty($value);

$tmp[‘bool’] = is_bool($value);

$tmp[‘array’] = is_array($value);

$tmp[‘string’] = is_string($value);

$tmp[‘int’] = is_int($value);
$tmp[‘float’] = is_float($value);
$tmp[‘numeric’] = is_numeric($value);

$tmp[‘scalar’] = is_scalar($value);

$tmp[‘object’] = is_object($value);
$tmp[‘resource’] = is_resource($value);

$tmp[‘true’] = ($value) ? true : false;
$tmp[‘false’] = (!$value) ? true : false;

$result[] = $tmp;

}
fclose($value);
@unlink($f);

var_dump($result);

結果

array (size=21)
  0 => 
    array (size=15)
      'value' => null
      'isset' => boolean false
      'null' => boolean true
      'empty' => boolean true
      'bool' => boolean false
      'array' => boolean false
      'string' => boolean false
      'int' => boolean false
      'float' => boolean false
      'numeric' => boolean false
      'scalar' => boolean false
      'object' => boolean false
      'resource' => boolean false
      'true' => boolean false
      'false' => boolean true
  1 => 
    array (size=15)
      'value' => boolean true
      'isset' => boolean true
      'null' => boolean false
      'empty' => boolean false
      'bool' => boolean true
      'array' => boolean false
      'string' => boolean false
      'int' => boolean false
      'float' => boolean false
      'numeric' => boolean false
      'scalar' => boolean true
      'object' => boolean false
      'resource' => boolean false
      'true' => boolean true
      'false' => boolean false
  2 => 
    array (size=15)
      'value' => boolean false
      'isset' => boolean true
      'null' => boolean false
      'empty' => boolean true
      'bool' => boolean true
      'array' => boolean false
      'string' => boolean false
      'int' => boolean false
      'float' => boolean false
      'numeric' => boolean false
      'scalar' => boolean true
      'object' => boolean false
      'resource' => boolean false
      'true' => boolean false
      'false' => boolean true
  3 => 
    array (size=15)
      'value' => 
        array (size=0)
          empty
      'isset' => boolean true
      'null' => boolean false
      'empty' => boolean true
      'bool' => boolean false
      'array' => boolean true
      'string' => boolean false
      'int' => boolean false
      'float' => boolean false
      'numeric' => boolean false
      'scalar' => boolean false
      'object' => boolean false
      'resource' => boolean false
      'true' => boolean false
      'false' => boolean true
  4 => 
    array (size=15)
      'value' => int 0
      'isset' => boolean true
      'null' => boolean false
      'empty' => boolean true
      'bool' => boolean false
      'array' => boolean false
      'string' => boolean false
      'int' => boolean true
      'float' => boolean false
      'numeric' => boolean true
      'scalar' => boolean true
      'object' => boolean false
      'resource' => boolean false
      'true' => boolean false
      'false' => boolean true
  5 => 
    array (size=15)
      'value' => int 1
      'isset' => boolean true
      'null' => boolean false
      'empty' => boolean false
      'bool' => boolean false
      'array' => boolean false
      'string' => boolean false
      'int' => boolean true
      'float' => boolean false
      'numeric' => boolean true
      'scalar' => boolean true
      'object' => boolean false
      'resource' => boolean false
      'true' => boolean true
      'false' => boolean false
  6 => 
    array (size=15)
      'value' => float 0.1
      'isset' => boolean true
      'null' => boolean false
      'empty' => boolean false
      'bool' => boolean false
      'array' => boolean false
      'string' => boolean false
      'int' => boolean false
      'float' => boolean true
      'numeric' => boolean true
      'scalar' => boolean true
      'object' => boolean false
      'resource' => boolean false
      'true' => boolean true
      'false' => boolean false
  7 => 
    array (size=15)
      'value' => float 1.123
      'isset' => boolean true
      'null' => boolean false
      'empty' => boolean false
      'bool' => boolean false
      'array' => boolean false
      'string' => boolean false
      'int' => boolean false
      'float' => boolean true
      'numeric' => boolean true
      'scalar' => boolean true
      'object' => boolean false
      'resource' => boolean false
      'true' => boolean true
      'false' => boolean false
  8 => 
    array (size=15)
      'value' => string '' (length=0)
      'isset' => boolean true
      'null' => boolean false
      'empty' => boolean true
      'bool' => boolean false
      'array' => boolean false
      'string' => boolean true
      'int' => boolean false
      'float' => boolean false
      'numeric' => boolean false
      'scalar' => boolean true
      'object' => boolean false
      'resource' => boolean false
      'true' => boolean false
      'false' => boolean true
  9 => 
    array (size=15)
      'value' => string '0' (length=1)
      'isset' => boolean true
      'null' => boolean false
      'empty' => boolean true
      'bool' => boolean false
      'array' => boolean false
      'string' => boolean true
      'int' => boolean false
      'float' => boolean false
      'numeric' => boolean true
      'scalar' => boolean true
      'object' => boolean false
      'resource' => boolean false
      'true' => boolean false
      'false' => boolean true
  10 => 
    array (size=15)
      'value' => string '1' (length=1)
      'isset' => boolean true
      'null' => boolean false
      'empty' => boolean false
      'bool' => boolean false
      'array' => boolean false
      'string' => boolean true
      'int' => boolean false
      'float' => boolean false
      'numeric' => boolean true
      'scalar' => boolean true
      'object' => boolean false
      'resource' => boolean false
      'true' => boolean true
      'false' => boolean false
  11 => 
    array (size=15)
      'value' => string '10' (length=2)
      'isset' => boolean true
      'null' => boolean false
      'empty' => boolean false
      'bool' => boolean false
      'array' => boolean false
      'string' => boolean true
      'int' => boolean false
      'float' => boolean false
      'numeric' => boolean true
      'scalar' => boolean true
      'object' => boolean false
      'resource' => boolean false
      'true' => boolean true
      'false' => boolean false
  12 => 
    array (size=15)
      'value' => string '0.10' (length=4)
      'isset' => boolean true
      'null' => boolean false
      'empty' => boolean false
      'bool' => boolean false
      'array' => boolean false
      'string' => boolean true
      'int' => boolean false
      'float' => boolean false
      'numeric' => boolean true
      'scalar' => boolean true
      'object' => boolean false
      'resource' => boolean false
      'true' => boolean true
      'false' => boolean false
  13 => 
    array (size=15)
      'value' => string '1.123' (length=5)
      'isset' => boolean true
      'null' => boolean false
      'empty' => boolean false
      'bool' => boolean false
      'array' => boolean false
      'string' => boolean true
      'int' => boolean false
      'float' => boolean false
      'numeric' => boolean true
      'scalar' => boolean true
      'object' => boolean false
      'resource' => boolean false
      'true' => boolean true
      'false' => boolean false
  14 => 
    array (size=15)
      'value' => string '1,234,567' (length=9)
      'isset' => boolean true
      'null' => boolean false
      'empty' => boolean false
      'bool' => boolean false
      'array' => boolean false
      'string' => boolean true
      'int' => boolean false
      'float' => boolean false
      'numeric' => boolean false
      'scalar' => boolean true
      'object' => boolean false
      'resource' => boolean false
      'true' => boolean true
      'false' => boolean false
  15 => 
    array (size=15)
      'value' => string ' 1' (length=2)
      'isset' => boolean true
      'null' => boolean false
      'empty' => boolean false
      'bool' => boolean false
      'array' => boolean false
      'string' => boolean true
      'int' => boolean false
      'float' => boolean false
      'numeric' => boolean true
      'scalar' => boolean true
      'object' => boolean false
      'resource' => boolean false
      'true' => boolean true
      'false' => boolean false
  16 => 
    array (size=15)
      'value' => string '1 ' (length=2)
      'isset' => boolean true
      'null' => boolean false
      'empty' => boolean false
      'bool' => boolean false
      'array' => boolean false
      'string' => boolean true
      'int' => boolean false
      'float' => boolean false
      'numeric' => boolean false
      'scalar' => boolean true
      'object' => boolean false
      'resource' => boolean false
      'true' => boolean true
      'false' => boolean false
  17 => 
    array (size=15)
      'value' => string ' 1 ' (length=3)
      'isset' => boolean true
      'null' => boolean false
      'empty' => boolean false
      'bool' => boolean false
      'array' => boolean false
      'string' => boolean true
      'int' => boolean false
      'float' => boolean false
      'numeric' => boolean false
      'scalar' => boolean true
      'object' => boolean false
      'resource' => boolean false
      'true' => boolean true
      'false' => boolean false
  18 => 
    array (size=15)
      'value' => string 'Hello' (length=5)
      'isset' => boolean true
      'null' => boolean false
      'empty' => boolean false
      'bool' => boolean false
      'array' => boolean false
      'string' => boolean true
      'int' => boolean false
      'float' => boolean false
      'numeric' => boolean false
      'scalar' => boolean true
      'object' => boolean false
      'resource' => boolean false
      'true' => boolean true
      'false' => boolean false
  19 => 
    array (size=15)
      'value' => 
        object(stdClass)[7]
      'isset' => boolean true
      'null' => boolean false
      'empty' => boolean false
      'bool' => boolean false
      'array' => boolean false
      'string' => boolean false
      'int' => boolean false
      'float' => boolean false
      'numeric' => boolean false
      'scalar' => boolean false
      'object' => boolean true
      'resource' => boolean false
      'true' => boolean true
      'false' => boolean false
  20 => 
    array (size=15)
      'value' => resource(10, Unknown)
      'isset' => boolean true
      'null' => boolean false
      'empty' => boolean false
      'bool' => boolean false
      'array' => boolean false
      'string' => boolean false
      'int' => boolean false
      'float' => boolean false
      'numeric' => boolean false
      'scalar' => boolean false
      'object' => boolean false
      'resource' => boolean true
      'true' => boolean true
      'false' => boolean false

@ Mac PHP 5.3.27