Nature remoをiOS ショートカットアプリとSiriで活用する

家にあるエアコンや照明などの多くの家電は赤外線リモコンがあります。 Nature remo https://nature.global は、赤外線信号の送信と、気温などのセンサーを備えた数千円から1万円のデバイスと、クラウドからデバイスを操作する機能を提供します。

Nature remoで、アプリを設定して家に近づいたりなどの条件で機器をオンオフしたり、Amazon AlexaやGoogle Homeと連携して、音声での家電操作ができます。しかし、Nature remoの説明には、Siriとの連携がありません。

公式ブログで、iftttというサービスを中継してSiriで家電操作をする方法 (iOS12のショートカットを使い、SiriからRemoを操作する)[https://nature.global/jp/ifttt-setup/ios12siriremo] が紹介されています。

しかし、複数のサービスを中継するのは、1つでもサーバーが落ちていたら利用できなくなる不安感だけではなく、なんとなく嫌です。そこで、Nature remoを使い、iOSのショートカットアプリを活用して公式のウェブサービスを直接叩いて、Siriから機器操作をしてみます。

手順は:

  1. Nature remoのAPIで使う、エアコンや赤外線信号を表す識別子を取得する
  2. iOS ショートカットアプリから、Nature remoのAPIを叩く
  3. SiriからiOSショートカットアプリが実行されるように、音声コマンドを紐づける の3つです。

Nature remoのアプリでの設定

まず、Nature remoの設定説明に従い、エアコンと照明の設定を行います。まず、エアコンを設定します。Nature remoの説明通りに、エアコンの赤外線リモコンの信号を読み込むと、メーカー名を自動判別して、アプリにエアコンの設定画面が追加されます。照明は、赤外線リモコンのボタン1つ1つを読み込んで、それぞれアプリのボタンとして登録していきます。

エアコンと照明の設定が終わると、アプリにはこのような画面ができているでしょう。

/post/nature-remo-ios-shortcut/remo_aircon_light.jpg

外出時などに、エアコンと照明をまとめて消したいなど、複数の機器を操作したい時には、Nature remoのアプリの"シーン"を使うと便利です。例えば、エアコンと照明をまとめてオンにする場合は、このようなシーンを作成します。オフにするシーンも同様に、機器をオフにする項目をまとめたもので作れます。

/post/nature-remo-ios-shortcut/remo_scense_on.jpg

Nature remoのアプリで、ルールを追加して、家電製品の振る舞いを作れます。例えば、ルールの家から離れる、家に近づくに、エアコンのオフオンを関連づけておけば、いわゆるスマートホームのデモンストレーションでよく使われる、家に帰ってくるとエアコンが動いていてすでに暖かい、などができます。

Nature remoのセンサーの値と紐付けておくこともできます。私は、室温がある温度以下になったらエアコンをオンにするルールを追加しています。睡眠時にエアコンの動作音がするのが嫌で、寝る前にエアコンを切るのですが、朝起きた時に部屋が寒いのも嫌なので、室温がある温度以下になったら、エアコンを入れるという使い方です。

機種は、1万円程度のNature Remoと、7000円代とより安価な Nature Remo mini があります。それぞれの違いは搭載しているセンサーの種類です。Nature Remoは、温度、湿度、照度、人感センサーがあります。Nature Remo miniは、温度センサーだけがあります。人がいたら、あるいは照度や湿度がある値になったらというルールを作るなら、Nature Remoが必要です。そのようなルールが必要ない、例えば先ほどの例のようにある温度以下になったらエアコンを入れるように温度だけしか使わないなら、Nature Remoがよいでしょう。

Nature remoのAPIで使う、エアコンや赤外線信号を表す識別子を取得する

Nature remoは、ネットワークから機器を操作するAPIを提供しています。このAPIを使うには、ユーザーの認証トークンと、機器あるいは信号の識別子が必要です。これらを取得しましょう。

開発者サイト https://developer.nature.global を見ると、APIにはローカルAPIとクラウドAPIとがあります。どこにいても機器を操作したいので、ここではクラウドAPIを使っていきます。

ローカルAPIは、家のWiFiなど同じネットワークに繋がっている時に呼び出せるAPIで、赤外線のパターンの生信号そのものを取得/送信するものがあります。クラウドAPIは、エアコンや機器の識別子を使って、温度設定などができます。おそらくNature remoの機器自体には、ローカルAPIの赤外線の信号そのものを扱う機能だけが実装されていて、メーカごとのエアコンの赤外線信号を組み立てる機能は、クラウドつまりサーバー側に実装されているのでしょう。

Nature remoの機器にアクセスするための、認証トークンを取得します。 https://home.nature.global で、左下にある"Generate access token"を押すと、トークンが生成されて画面にそれが表示されます。このトークンは生成したその時だけしか表示されませんから、メモ帳か何かでもいいと思いますが、どこか自分しか読み書きできないところに一時的に保存しておきます。

ネットワークサービスを使う時にユーザ名とパスワードとを決めますが、このトークンは、そのユーザ名とパスワードと同じようなものです。このトークンは、ユーザしか知らないはずです。ですから、このトークンがあれば、今APIを使おうとしている人が、正規のユーザだと思い込めるわけです。もしも、トークンが誰かに知られて、いたずらされるようなことになったら、そのトークンを削除して無効化します。

/post/nature-remo-ios-shortcut/screenshot_access_token.jpg

認証トークンを使い、機器や赤外線信号を表す識別子を取得していきます。もしもNature remoAuがOAuth2に対応でもしていれば、 http://http://swagger.nature.global/ からAPIを呼び出して、機器のリストが取れるのですが、そんな対応はしていないので、ターミナルから次のコマンドを実行してAPIを叩きます。

$ curl -X GET “https://api.nature.global/1/appliances" -H “accept: application/json” -H “Authorization: Bearer {ここにアクセストークンの文字列を入れる}”

PushKitでデバイストークンが取れない。

PushKitでデバイストークンが取れなくて、困っていました。原因は、バックグラウンドのオプション指定に、VoIPが含まれていないことです。

Xcode ver9.2では、アプリケーションターゲットのバックグラウンド・モードにVoIPがなくなっています。ですが、アプリケーション内部ではVoIPのオプションを見ています。Infoタグで、Info.plistの編集で手動で、バックグラウンドにVoIPを含めるようにします。

Capabilitiesタブのバックグラウンドを変更するたびに、この手動で追加したVoIPは、Xcodeにより消されます。なので、忘れずに手動で再度VoIPを、バックグラウンドに追加します。

micro:bitは業務に使える? 加速度を表示するiOSアプリを作ってみる

何したの?

加速度の大きさで信号を出力するものを試作する案件に、micro:bitが使えるかと思い、試作に用いてみました。HEXファイル、iOSアプリのソースコード、アプリの動いている動画などのリソースは https://github.com/reinforce-lab/microbit_accs_siwtch にあります。

マイコンというハードウェアへのファームウェア書き込みは、書き込み装置が必要で、書き込み手順を覚えなければならず、誰でもできるものではありません。このマイコンボードであれば、誰でもファームウェア更新ができます。これなら、ファームウェアを書き込んだハードウェアを送付しなくても、HEXファイルを送るだけですむかもしれません。

どんな情報があるの?

自分で作るiOSアプリケーションと、micro:bitとの間の、任意の情報のやり取りの実装方法があります。iOSアプリケーションの表示画面は、このようになっています:

/post/2018-02-01-microbit-accs-switch/IMG_0932.jpg

micro:bitで、文字列に組み立てた加速度や内部設定値、そしてIOの情報を、BLEを経由してiOSアプリに伝えています。iOSアプリで、それをグラフ表示しています。 iOSアプリから、設定値をBLEでmicro:bitに伝えて、micro:bitのプログラムで、その値を該当する変数に格納しています。

micro:bitに最初からあるIOサービスを使い、BLE経由でセンサやスイッチの情報を読み取るサンプルはたくさんありますが、自分のプログラムで処理した内容を外部に伝えたいときのスタートポイントになるでしょう。また、外部からmicro:bitへ情報を伝える方法の解説が、なぜか、見かけませんが、BLE UARTを使った情報の渡し方の解説になっているでしょう。

micro:bitって?

micro:bit http://microbit.org/ja/ は、プログラミング教育の教材で、Nordic Semiconductor社のnRF51822を使ったマイコンボードです。

グラフィカルにブロックを並べてプログラムを組み立てられるビジュアル・プログラミング環境があります。またBluetooth low energy(BLE)でスマートホンと通信できるので、スマートホンやタブレットで作ったプログラムをBLEで書き込んだり、スマートホンとマイコンボードとで通信ができます。

nRF51822は、RAM容量が16kバイトと32kバイトの2品種がありますが、micro:bitに使われているマイコンボードは16kバイトのものです。BLEをまったく使わない場合は、16kバイトのRAMを全てユーザのアプリケーションに使えます。BLEを有効にすると、BLEのスタックが12kバイトのRAMを使うので、ユーザのアプリケーションに使えるRAM容量は4kバイトになります。スタックに最低2kバイトが必要ですから、実際に使える容量は2kバイトです。

プログラミング環境

micro:bitの開発環境は、TypeScriptを用いるものと、Pythonを用いるものの2つがあります。いずれもビジュアルプログラミング環境が提供されていますが、テキストでソースコードを書くこともできます。Pythonの開発環境では、BLEは使えません。その代わりに、Nordic Semiconductor社の独自プロトコルの無線通信機能のみが使えます https://lancaster-university.github.io/microbit-docs/ubit/radio/ 。この独自プロトコルの無線通信は、micro:bitのボード間の通信はできますが、BLEではないので、スマートホンとは通信できません。

TypeScriptを用いるものは、Microsoft社のmake:codeで提供されています。下層は、arm mbedとNordic nrf51を使ったC/C++開発ランタイム https://lancaster-university.github.io/microbit-docs/ です。TypeScriptで書いたソースコードが、このランタイムのAPIを呼び出す形になります。

TypeScriptは、Microsoft社が開発している、JavaScriptに静的型付けとクラスベースのオブジェクト指向を加えたJavaScriptのスーパーセットになるよう定義された言語です。make:codeのプロジェクトは、TypeScriptのサブセットでプログラミングができます。TypeScriptで書いたソースコードは、ウェブブラウザの内部で構文解析されて、Arm thumbコードに変換されて、HEXファイルが生成されます。ローカルで、機械語とHEXファイルの生成まで行い、ユーザのコンパイルがローカルで完結してサーバーを必要としない作りになっています。

Pythonを使うものは、省略します。Pythonのバイトコードを実行するために、ある程度のRAM容量が必要になりますが、BLEを有効にすると必要なRAM容量が確保できないみたいです。BLEを有効にすると実行に必要なRAM容量が取れないため、Pythonのmicro:bit環境では、Nordic Semi.社の独自プロトコルの無線通信は提供されていますが、BLEは使えません。

foreverブロック

アプリケーションはforeverが繰り返し呼び出されます。

/post/2018-02-01-microbit-accs-switch/main.png

foreverブロックは図の通りです。加速度を取得して、しきい値を超えればP0/P1のピンにHIGHを出力にする、また閾値や加速度の値をBLEでスマートホンに伝えるメインルーチンを書いてみました。加速度の大きさを変数"accs"に取得して、それを"plot"ブロックで、micro:bitのLEDアレイに表示させています。文字列は"join"で連結して作っています。最後にBLE UARTで、スマートホンに文字列を伝えます。また、ルーチン呼び出し頻度を確認するために、ルーチン呼び出しごとにmicro:bitのP2をトグルさせます。

この時のP2の波形を示します。

BLEでスマートホンと接続していない時の波形:

/post/2018-02-01-microbit-accs-switch/ble_disconn_waveform_60ms.png

BLEでスマートホンと接続した時の波形:

/post/2018-02-01-microbit-accs-switch/ble_conn_waveform_110ms.png

です。

BLEと接続していない時は、foreverが30ミリ秒ごとに呼び出されます。micro:bitはプログラミング教材ですから、ブロック崩しなど、micro:bit背面のLEDアレイとタクトスイッチだけで入出力が完結した、見た目に動作がわかりやすいゲーム作りが、教材として使われます。メインルーチンが30ミリ秒ごとに呼びされるので、スイッチの状態を都度画面に反映する関数をforeverにべた書きするだけで、そのようなゲームが作れます。もしもforeverが、while文で永久ループで繰り返し実行されるものならば、sleep()か何か、適当な遅延時間を自分で入れないと、画面の表示速度が速すぎて、ゲームにならないでしょう。プログラミング教材として、時間を気にしなくても良いように、適当な周期でこのルーチンを呼び出しているのでしょう。

BLEと接続すると、foreverが55ミリ秒ごとに呼び出されています。BLEの接続の有無で、ルーチン呼び出し周期が変わってしまうのは、ちょっと、なにそれ?と思います。下層はmbedなので、mbedのイベント呼び出しの作りを見れば、どうしてこうなるのかがわかると思いますが、例えばforeverのルーチンを呼び出して、30ミリ秒して次の呼び出しでBLE関連の処理を呼び出して、また30ミリ秒後にforeverルーチンを呼び出す作りなら、そうなるかもしれませんが、普通、タイマーイベントに登録して、どのルーチンも30ミリ秒ごとに呼び出すように作る気がしますけど、mbedだし、気にしないことにしましょう。

スマートホンからデバイスへのデータ書き込み

make:codeのブロックは、例えばカンマで文字列を分割するような、文字列を解析する処理ブロックがありません。BLE UARTには、デリミタまで文字列を読みだして、読みだした文字列を返すブロックがあります。

{% img /post_images/microbit_accs_switch/serial.png%}

この"bluetooth uart read until"の振る舞いは、BLEで1つのパケットで受信した文字列で、文字列にデリミタが含まれていたら、発見した最後のデリミタの前の文字列を返します。

例えば、read untilで":“をデリミタに指定したとします。スマートホンから、BLEの1つのパケットで、“123:456:“を送信した場合、このブロックは"123:456"を返します。

シリアル通信だから、BLEのパケットを意識しない、文字列ストリームで、デリミタの検出で文字列を分割して結果を返してくると思い込むと、まず"123"が返ってきて、次の呼び出しで"456"を返すように思いますが、違います。BLEの1回のパケットで書き込まれた文字列で、デリミタが含まれていたら、そのデリミタの前の文字列を返す、という振る舞いをします。

渡したいパラメータが複数種類ある場合は、パラメータのスタートを示すデリミタを送ってから、1つつづパラメータにデリミタをつけてパケットを送ります。図では、念のため、パラメータの種類ごとに違うデリミタを指定して、もしもパケットを読み落としてパラメータの読み出し順番がずれても、誤ってパラメータとして受信処理をしないようにしています。

BLEの書き込みは、write with response、write without responseのいずれでも使えます。ただ、write without responseで書き込むと、パラメータに0が設定されていたりして、詳しく見てないですが、パケットをボロボロ落としているような気がします。

グラフ表示

senstickというBLEセンサーデバイスのiOSアプリを流用して、作ってみました。iPadがあればplaygroundを使えば、簡単にグラフ表示できるのかもしれませんが。

micro:bitは受託開発に使えるのか?

試作のための動作確認をやりとりする場面で、頻繁にファームを変更して動作を確認しなければならいが、相手が遠隔にいるため、相手にファーム更新をしてもらわなければならない場面では、利用できると思います。

USBのマスストレージで、ファーム更新ができることに価値を見出すなら、その書き込み回路だけを使えばよいことです。micro:bitの開発環境を使わねばならない理由はありません。

WWDC2017から、次のハードウェアを考えてみる?

WWDC2017から、次のハードウェアを考えてみるというお題で話す機会をもらったので、そこで話した内容をメモ書き的に残してみる。

Apple社のWWDC世界開発者会議も、毎年年を重ねるにつれて、非常にオープンになってきている。そこから、今後のスマートフォンの流れをハードウェアの視点から見てみようと思う。

そもそもだけど、なぜ次を知りたがるのか。それは単に趣味で新しいものが好きだから。根拠の理由説明の必要がなくて身も蓋もないけど。だけど個人の立場からは、新しいものが出てくるって言う瞬間はとても大きなチャンスだから。誰もが同じスタート地点で、早くに学習すればするほど先行者利得でその後の数年間、強い立場あるいは利益を得られる立場になれる。だから新しいハードウェアが登場するのは、非常においしいタイミングでもある。

でも、ハードウェアの新しいものが来るだろうか。多分来ない。新しいものをもたらす新技術や部品の開発は、今のスマートフォン年間2億台を生産するレベルに到達しようとすれば、研究開発に10年、量産までに10年の長い期間がかかると思えばいい。だからiOSとして出てくるハードウェアは、サムスンのGalaxyの1年か2年は遅れたハードウェア要素が採用されたもの、だろう。

スマートホン以外のハードウェアはどうか。ヘッドヘッドマウントディスプレイとか、VRとかいろんなハードが新しく出てきている。それらは、スマートホンでトップシェアが取れないサードの会社が次の可能性を求めて挑戦している分野でもあるけれども、そういった分野にアップルが入ってくるのかどうか。つまり他社にすでにあるようなハードウェアをアップルが扱い始めるかどうか。次のハードウェアは来るのか? という問いかけは、実は、すでに挑戦者たちが挑んでいる新しいハードウェアがいろいろあるけれども、Apple社がそこに参入するだろうか?というのが、本当の問いかけるべきことだろう。

じゃ、新しいハードウェアがもたらすものは何か。新しいものを買って喜ぶ、という理由の説明の要らないものだけじゃない。結局、価値の流通経路の切り替えだということだ。ガラケーの時代からスマートフォンになったときに、その価値の経路が切り替わったために、例えば日本にある企業の中には、1年で売り上げが半分になったところがある。あるいは、ブラウザベースのソーシャルゲームでプラットフォームであった会社が、ネイティブアプリに切り替わった時に、それまでのような強いプラットフォームではいられなくなった瞬間があった。そして、人間との接点はいつもハードウェアだから、ハードウェアが変化したと言うのは、そういった価値の流れの切り替えが1年から2年のうちに起きる可能性がある、そういう意味でとても大きな関心を持つのだろう。

ただ価値を扱うのは人間である限り、20世紀にあったビジネスを21世紀のやり方で焼き直すのが、延々と繰り返されるだけだ。人間は、新しい価値をそんなにすばやく理解しない。人工知能がすごく話題になっているが、それで何ができるのかといえば、できること自体は人間を雇ってできる事と何も変わらない。ただ電力だけで長時間疲れもせずに働くと言う特性を使って、生身の人間では不可能であった何かを素早く事業立ち上げて、価値の経路の切り替えをやってくる人たち、新しいサービスを立ち上げる人たち、そういったのは出てくるだろう。人工知能により、それまでの人間の価値の消費量が2倍になるような、そんな新規性は、まずないだろう。当面は、目の前にある大きさの限られたパイの争奪戦だろう。

今の21世紀のハードウェア価値の切り替えと言う視点で見るときには、常にそこに印刷って言う要素が入ってくる。これはとても面白いことだと思う。20世紀の車の大量製造は、今も日本の大きな経済の原動力になっている。それはプレスあるいは射出という同じものを大量に複製する技術がベースになっている。

例えば高度な半導体と言うのは、これは印刷技術の塊だ。シリコンの半導体の上に複雑な回路パタンを印刷していくそれが今の集積回路クラウドの大量製造印刷の性質を持っている。アカウント思っていれば、そのアカウントの上で購入をすることで、いろんなコンテンツの利用権のアカウントに集約して紐付けられる。愛下名塩にアカウントが中止になる。われわれはリアルな人間だから、道に何も実態持っていない。ネット側の我々の存在に対応する実態はアカウントである。コンテンツはもはやコピーすることなくアカウント

こうして見ていると最初の5時にとってハードウェア新しいもの、に対する興味の価値とは何だろうかちょっと焼き直し必要な感じがする。結局は人が今消費しているのは何かしら形のないコンテンツであるつまりコンテンツが最強な時代なんだ。そういえばiOSの黎明期、開発者たちは今バーチャルリアリティーで新しい可能性に挑戦している人たちがいる。今のバーチャルリアリティーのハードウェアの市場規模は単体でApple Watchているんだけれども、そういったコンテンツに関わるところ2常に立場を変えていくというのはすごく大きな流れだろう。

例えば高度な半導体と言うのは、これは印刷技術の塊だ。シリコンの半導体の上に複雑な回路パターンを印刷していく。それが今の集積回路。また、デジタルデータは容易にコピーできてコストがかからない、まさに印刷の性質を持っている。クラウドであれば、アカウントの上で購入をして、コンテンツの利用権のアカウントに集約して紐付けられる。われわれはリアルな人間だから、ネット側に何も実体がない。ネット側の我々の存在に対応する実体はアカウントである。

こうして見ていると最初の、個人にとってハードウェア新しいもの、に対する興味の価値とは何だろうかちょっと焼き直し必要な感じがする。結局は人が今消費しているのは何かしら形のないコンテンツである。つまりコンテンツが最強な時代なんだ。そういえばiOSの黎明期に活躍した開発者たちの、ある人達は、今バーチャルリアリティーで新しい可能性に挑戦している。今のバーチャルリアリティーのハードウェアの市場規模はApple Watch単体規模と、まだ小さいのだけど、そういったコンテンツに関わるところに常に立場を変えていくというのは、個人ならではの攻め方だろう。

ハードの話をしよう。スプラトゥーン2と言うゲームが発売されたそうで、ソーシャルメディアを見ていると、ゲーム機が購入できないと言うツイートがたくさん並んでいた。

そのツイート見ていてなんとなく伝わってくる雰囲気が、前に新書で出した、ハードウェアはなぜゴミでしかないのか、っていう話とすごく近い感じがした。誰もゲーム機本体を見ていない。ゲームがしたいんだけれども、ゲームをするために本体が必須だから本体が欲しいと言っている。もしもこれが、iPadでゲームができるんだったら、みんなiPadを買ってゲームをダウンロードして遊んでるだろう。ハードウェアで環境が囲われている、しかもそのハードウェアが買うお金があるのに買えないから、みんな不満を表明している。もちろんゲームとして素晴らしく完成されたハードなのだけど、誰もハードを見ていない。

ちょっと、じゃあ昔のハードウェアはどうだったのか、昔を見直してみよう。このトヨタ式生産方式は、カンバン方式の生みの親が書いた本だ。読んでみると結構面白い。これから作れば売れる時代は終わり、低成長な社会が来ると言っている。まぁその低成長と言うのが、今の我々から見れば高度成長経済と呼ぶ時代なんだけど。

だから、これまでの大量生産ではなく、人々の趣味嗜好に合わせた、ものを少数多品種で売れるだけを都度作る、そのためにかんばん方式って言うものを考えたっていうのが。まぁ、その趣味嗜好に合わせた製造社会っていうのが、我々から見た高度成長社会なんだけど。

アメリカから購入した最新鋭のプレス機は、いかに大量に生産するかに特化している。だからカンバン方式には合わない。午前にある機種を製造、午後に違う品種の製造をしようと思えば、その間に金型の組み換えや調整をしないといけない。でも、アメリカから購入した最新鋭機だと、それに1日かかってしまったりする。だからカンバン方式にあうプレス機と言うと素早く違う金型に切り替えられないと。そういった加工装置を得るのに10年ぐらい時間をかけてやってた。

じゃ、iPhoneのハードウェアを見てみよう。この要素を削り落としたらiPhoneではなくなるっていう要素がいっぱいある。

でも面白いのはアップル自体は、電池にしろ液晶にしろ半導体製造にしろ、そういったキーテクノロジーを自社で持たない。カメラモジュールは例外的にソニーから買っているけれども、必ず複数の会社から調達する。量の確保と部品価格を競争での低減を狙ったものだろうけれども、

しかし、LLVMと言うコンパイラ、というかコンパイラ・インフラストラクチャだけど、があるけれどもこういったものは自社で早くから開発している。コンパイラと言うのは、開発言語をプロセッサで実行できる機械語に変換するものだけれども、実はそういった部品というわけではなくて、iOSの開発の全体に影響する大きな存在に今はなっている。

1文字1文字入力するたびにコンパイラが動いて、非常にスマートに次はこういう入力をするのというの提案してくる。それがあるから高度なアプリを短時間で開発できてる。もう人間単体の記憶力で出来るような世界じゃないですから。今のアプリはストア提出がVMのバイトコード、中間コードで提出する。だから今後例えばプロセッサのアーキテクチャが大きく変わって機械語ががまるで別のものになったとしても、アップルが中間言語を新しいターゲットにビルドし直すことで、どんな新しいハードウェアにでもアプリケーション動かすことができる、そういう仕組みに切り替わっている。今のハードウェアの可能性を引き出すかなめとなるものは自社でしっかり開発している。

ハードウェアを製造する部分は自社で持たないけど、集積回路の設計技能と言うのも社内で早くから持っている。ARMと言うプロセッサを独自に設計開発するチームを買収したり、そして今年はGPUも独自設計するんじゃないか、あるいは電力制御を統合してくるのではないかとやっている。今の半導体はとても大きな1つの集積回路に全ての機能を載せることができる。それがより電池を食わなく、高性能なもの作る必然でもあるのだけど。そういったところでも、ハードウェアの部品自体は外部調達だけど、その上に乗せるコンテンツとしての表現能力の要は、自社で抱えていると。

iOSの開発者って今どこにいるんだろう。

例えば今までiOSの新しいものが出るたびに、その機能を紹介した本が必ず出版されていた。今年はちょっと毛色が違う。iOS11の本が、クラウドファウンディングでプロジェクトが立ち上がった。今までは、出版されていたのに、今は最初にクラウドファウンディング。売れ数飲み込みが立たないのか。

今見てみると592人がそれに出資している。アプリ開発者の年収を考えたら本業の開発者が5,000円程度の出費を絞るわけがない。多分この600人と言うのは日本のアプリ開発者の目安、全数の3分の1とか4分の1とかはここにいるなら、日本の開発者数っていうのは1,000人から2000人の間位だろうか。

開発者はどこにいるのか。会社の中に入る。アプリの上で大きなお金が動いているのは、ソーシャルゲームであったり、資本を集めてやるものばかり。アンドロイドのプロジェクトも同じように立ち上がってるが、やっぱり600人には届かない程度。

ARKit

ARKitの機能は、特徴点の検出と3次元空間でのそのマッピング。マッピングした特徴点の集合から平面を推定する機能と、特徴点群と平面とのヒットテスト、そして周囲の照明を推定する機能の3つしかない。YouTubeで検索すると、色んな人のデモンストレーションが結構いい感じで出ている。コンテンツを作るためのキラー機能としてのとしての存在感を感じさせる。

次のハード?

じゃあ次のハードウェアってなんだろう。もうこんな問いかけをするまでもなく、家に常に置いてある端末で激しい競争が起きている。Google、アマゾン、アップル。スピーカを内蔵してネットワークに常につながっている何かと言うのを出している。でも会社によってその性質はまるで違う。Googleは家電を制御できるよと言うのをキラーアプリにしている。アマゾンだと間買い物ができるという機能、いろんなアプリケーションのハブになると言う機能。アップルのは、これからだからわからないけれども、見た目音楽を聞くための機能のスピーカーにしか見えない。Siriと連携したりホームキットと連携するのは当然の機能になるんだろうけど。

VRとか?

もう一つがVR、リアルの世界だけれども、今世界2017年の1Qで世界の販売台数は2,000,000台位。対してApple Watchがそれ単体で3,500,000台。だからとして市場の規模が小さい。

人は、今まで人が見たことがないようなものを、他人の目があるところで身につける事はありえない。だから、これらが普及するとしても常識になるのは10年先だろう。これらが使われるのは、仕事、もしくは家の中。そういった使わざるを得ない状況か、他人の目がない場所でのゲームあるいは会議のツールとか。

コンテンツが最強と言う視点からは当面はゲームが主体、動画を見るのが主体、の中にバーチャルリアリティーをビジネス利用みたいなベンチャー開発が出てくる。

半導体の面積

面白いのはiPhoneの半導体の面積で見ていくと言うことだ。

例えばiPhone 4からiPhone 7までのチップ面積のプロセスを並べてみる。iPhone 7に至るとチップの面積はiMac 27インチMacに搭載されているCore i5のプロセッサの面積より大きい。インテルのはプロセッサしか入ってないけれども、iPhoneのものはプロセッサ以外の全ての機能が1つのチップに集約されているから、面積を見るだけではしょうがないのだけど。

で、パソコンの世界出荷台数2016年が2.7億、アップルの出荷台数が2.2億台位だから、ものすごく荒い言い方をすれば、アップル1社で世界中のパソコンに使われている半導体と同じだけの面積を、iPhoneで使っている。VRにしても、機械学習にしてもそれには莫大な計算能力が必要になる。世界中の計算機と言うリソースをプラットフォームとして、アプリ開発者に提供していると考えれば。またアプリ利用者が増えると、利用者が増えた分だけ自然にスケールする。そのハードウェアは非常に高額だけど、ユーザが自分のお金で購入してくれる。しかもiOSのサポート期間が切れていくから、市場の最低処理能力は自動的に更新される。

とても強いビジネスだと思う。これがGoogleだったらどうだろう。結構クラウドが主体の会社だから、世界中のパソコンに使われてるのと同じ半導体位の面積を、自社のクラウドサービスのデータセンターに使うかもしれない。莫大な投資だ。莫大な投資に見合うサービスでないと、提供できなくなるのかも。人のデータを使うのであればアップルの立場と言うのは強い。ただ利用者全てのデータを集約して初めてできる何かがあるのならば、クラウドファーストって言うやり方を取るしかないから、それはそういうやり方の方が強いのかもしれん。でも2億台からもれなく全てデータを取る必要、母集団からのサンプリング定理を思い出すまでもなく、まずなさそうだけど。

Macで執筆進捗の記録をしてみる。

あまりに執筆が遅いのではと思ったので、遅いと思うか早いと思うかは別として、作業量の記録をしてみようと思いました。 やったことは:

  • 執筆ファイルのバイト量をファイルに1行追記するシェル・スクリプトを作成する。
  • launchctrlで、そのスクリプトを毎日午前4時に動かす。 です。 できたデータファイルは、適当な表計算ソフトでグラフ化することにします。

シェルスクリプトの内容は以下のものです。 適当なデータファイル(progress_data.txt)に、日時と、執筆ファイルのバイト数を1行記録していきます。 執筆ファイル名は、“ch”+章番号+拡張子"adoc"としています。

#!/bin/sh
cd $WORKING_DIRECTORY(ファイルがあるディレクトリ名を設定する)
date '+%F' | tr -d "\n"                             >> progress_data.txt
echo ' '   | tr -d "\n"                             >> progress_data.txt
wc ch*adoc | tail -n 1 | tr -s ' ' | cut -d ' ' -f4 >> progress_data.txt

このシェルスクリプトを、“watching_progress.sh"として保存。

% chmod +x watching_progress.sh , 実行権限を与える
% cp /dev/null progress_data.txt , 空の出力ファイルを用意する

次にこれを毎日午前4時に実行させます。Macではlaunchctrlというコマンドが使えます。

com.reinforce-lab.com.watch-progress.plist という次のような内容のファイルを作ります。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.reinforce-lab.com.watch-progress.plist</string>
<key>Program</key>
<string>/(作業ディレクトリのフルパス、自分の環境に合わせて)/watching_progress.sh</string>
<key>StartCalendarInterval</key>
<array>
<dict>
<key>Minute</key>
<integer>0</integer>
<key>Hour</key>
<integer>4</integer>
</dict>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>

このファイルをロードして、登録できていることを確認します。plistを編集して再読込するときは、unloadしてからloadし直します。 ロード時にシェルスクリプトが動くはずなので、データファイルに出力があるかを確認します。