」そろそろエクソダスの時が来たようだ。僕はこれに乗って過去を変え、そして未来である現在を取り戻すんだ。あの日をやり直せるならば。このソラを取り戻せるならば。Calendarの23日目です。SORACOM自体については、もはや改めて紹介するまでもなく皆さんご存知だと思うので省略します。今回は、SORACOM関連で私が今年やったことをまとめます。APIのモックを作ったSoraCommonNetSandboxというものを作りました。これは、次に挙げる.NET版非公式SDKの開発途中で各種APIの呼び出しをほどよくテストする仕組みが欲しくなった結果、副産物として生じたものです。.NET版非公式SDKの実装範囲しかモックも書いていないので、まだまだ機能が不足していますが、徐々に足していきます。少なくとも、SIMをterminateするAPIを安心して叩けるようになったので私の心には平穏が訪れました。sandboxがあったほうが嬉しいに違いないのでSORACOMサンタにもお願いしました。本家での実装を楽しみに待ちましょう。APIのモックを作ったよー。5で楽にRESTfulサービスを書けてオススメという話にあります)。5のサーバから自分のSIM一覧を管理する仕組みを書きたかったので、.NET版の非公式SDKを作りました(SoraCommonNet)。自分で使う機能から順次カバーしていっていますが、網羅度はあまり高くありません。足りないところも結構あります。PCLで作っているのでXamarinにも持っていきやすい、というメリットがあったはずなのですが、携帯端末上から他端末のSIMを管理する仕組みの必要性はイマイチ謎でもあります。IoT管理インフラとして考えるとそれなりに妥当性があるのですが、どのみち携帯端末側に持つのはUIのみで処理主体はサーバになるのでは、という気がしますね。APIをC#から触れるようにしたで書きました。APIのリファレンスはそこそこの頻度で更新されています。ページ末尾に記載されているAPIバージョンが同じでも、ドキュメントは細かく改訂されていきます。.NET版SDKやモックを作っていくうえで(そして、きっと他の言語用のバインディングを作っている方々も?)このドキュメントの更新箇所を把握できたほうが良いと感じたので、個人的に定点観測しています。要はこのページのソースにあたるJSONデータを取得してきてせっせとdiffを取っています。データ取得部分のコードはSoracomApiCrawlerとして公開してあります。APIの増減は最低限把握したかったので、生のJSONに加えてAPIサマリ(一覧)も別途出力できるようにしています。ServicesのWebJobsを使いたかったので使ってみました。開発に際しては、Azureの管理コンソールが旧ポータルから新ポータルへの移行期間にあたってしまい、片方のコンソールにしかない機能を使うために行き来するストレスがあったり、新ポータルが時折落ちていて作業が進まなかったのですが、今では良い思い出です。ちなみに、まだあまり使ったことのある人が多くなさそうなAzureの新ポータルでのバッチジョブ画面は図1のような感じです。前よりもだいぶすっきりしました。定期的に取得したデータはAzureのBLOBストレージへと保存しています(図2)。AzureのBLOBストレージへたまっていくJSONAzureのバッチで1日3回取得してBLOB保存したJSONデータは、個人作業の合間や仕事の休憩中たまにAzureのポータルへログインして手動で(!)一覧ページを表示し、更新がありそうならファイルをダウンロードしてJSONのdiffを調べています。この結果をgistへ貼り付け、コメントと共にTwitterへ流しています。APIドキュメントが一昨日更新されてた。何か問題あったのかな。tokenは10/27の変更結果が正しいと思うのだけど。APIのドキュメント、12/17に誤更新(11/30のものに巻き戻り)ののち12/18に更新されてた。21定点観測していると、案外ソラコム内でのドキュメント更新ではまだ時折ケアレスミスがあり、あるタイミングの記述修正がのちの更新でうっかり巻き戻ってその後さらに更新されて正しくなったりしている、という人間くささを感じられてほっこりします。中の人がんばってますね。前述の通りAPIドキュメントの定点観測においてデータ取得以外の変更検出と差分抽出は完全に手動作業です。これではさすがに手間がかかるので自動化すべく最近コードを書いています。RC1)のファイル構成がイマイチ安定していない*1ところに時間を取られて度々心が折れています。年明けには多少マシな感じになるでしょう。パッケージ名が変わっていたり、VSのプロジェクトテンプレートによって生成される設定ファイルの内容に齟齬があったりと、正式リリース前らしさを感じるものがいろいろあります。来年もSORACOM主に.NET圏から眺めたり手を出したりしていきます。2015も残すところあと2日となりました。明日の担当はmana_catさんです。Calendarの20日目のものです。27カンファレンスへ参加し、そこで紹介されていたRISC-Vに興味を持った関連エントリです。このカンファレンスではQUALCOMMの新DSPアーキテクチャ発表や5Gネットワークに関する講演、MicrosoftのSmartNICなど興味深いトピックが多く扱われていました。この中で私が最も強く関心を持ったのがScalaからの高位合成ツールであるChiselです。Chiselの概要Chiselは次のような特徴を持ちます。IDEAを使ってサクサクとコードを書ける分だけScalaのほうが楽かな、という感じで興味を持ちました。Chiselを触ってみよう何はともあれ、半加算器を作るところからスタートしてみます。やることは入力値同士を足してキャリーを発生させるだけなのですが、主にScalaに不慣れなあたりでハマりました。失敗した箇所を挙げてみます。conversion入れといて欲しい・・・expectにboolean値もBool(...)も渡せない問題ここはBitsとして扱うしかなさそうこのあたりはScala自体の学習が圧倒的に足りないので、Scala関数型デザイン&プログラミング—Scalazコントリビューターによる関数型徹底ガイドを読んで勉強中です。以下のようなコードが書けました。テストコードもゴリゴリと書いています。1)}テストモジュールをもりもり作りながら進めるスタイルが定着するのもいいなっという感じがしますね。Verilogへ出してみる書けたScalaソースファイルをScalaの流儀に従ってbuild.sbtファイルの定義のもとビルドしていくのですが、少々うまくいかないところもありました。vだけにする普通に通ったやっぱハーネスかー。これは後で調べる無事に通った結果、生成された.vファイルは次のようになりました。io_in1;endmodule生成されていますね。タイミング検証とテストコード実行をおこなうためのエミュレータ用C++コードは次のとおり生成されました。半加算器だけではなんとも悲しいので、ひとまずこのまま4bit同士の加算をできるところまで拡張してみて、手持ちのFPGA評価ボードで計算の途中経過をLED出力できるようにしてみようと思っています。気付いて頭を抱えたりしている昨今です。Scalaで電子回路、楽しいかもしれないChiselが高位合成ツールセットとして楽しいポイントは、概要にも書いたようにクロック同期保証付きのエミュレータ用コード生成をおこなってくれるあたりです。小さなものを書いている中でもすでにcpp経由で開発マシン上のバイナリを吐き出してサクサク実行できることの楽さは感じつつあります*1し、これはきっと扱う対象が大規模化するにつれて更に嬉しくなっていくのでしょう。趣味で作るハードウェアでも「ScalaコードをコミットしたらJenkinsで速やかにタイミングチェックまでおこなって、結果が怪しければ即座にエラーメールが届く」というワークフローになるとずいぶん楽しいと思いませんか。今回Chiselを使ってみた結果、Scalaを勉強する機会にもなりました。これまでScalaといえばコンパイルが遅い言語でなんとなくHaskellのほうがかっこいい、ぐらいの印象でいたのですが、ちゃんと学ぶ気力が湧いてきたのでとてもよかったと思います。Chiselの続編はまたそのうち。明日の担当はikwzmさんです。私の場合はScalaにもVerilogにもさほど慣れていないので、コードの正しさを判定するためのセカンドオピニオンとしてC++コードを利用できる安心感は大きいです。完全にこのタイトルを書きたかっただけです。IoT向けのUWPアプリをサクサク書いてみようという話をします。https://developer.xamarin.com/guides/cross-platform/xamarin-forms/windows/getting-started/universal/)。2015上からXamarinプロジェクトを作成して手順に従います。Core上でXamarin.Forms利用プロジェクトを最低限動作させるまではとても簡単です。適当にUWPプロジェクトを生やしてXamarin.Formsをパッケージ追加し、メインのXamarinプロジェクト(PCLのもの)への参照も追加し、あとはチュートリアルどおりにいくつか.xamlファイルなどへ変更を加えるだけです。RPi2+Win10IoTCoreこのスクリーンショットでは少々フォントサイズをいじって見やすく(図3)していますが、ともかく普通に動作します。VS上でXAMLを開いたところこのUIはキーボードやマウスを利用して操作できます。ボタンやラベルといったXamarin.Formsが提供する各種UIコンポーネントを利用できますし、データバインディングを活用したプログラミングも可能です。Coreと組み合わせることの厳しさは明らかです。Coreはその名前のとおりIoTを中心とした組み込み向け(そのなかでも、とりわけ簡易的なユーザインタラクションを伴うのがせいぜいというエリア)のOSです。このため、ユーザとのインタラクションに関する厳密な規定を持ちません。タッチスクリーンインタフェースの存在を前提とすることもできません。Coreの間で垣根なく動作するといっても、用途の根幹が違うものを混ぜるのは基本的に悪手です。Coreの用途自体がもう少しタッチスクリーンUIへと寄っていく*1ようなイベントが発生すればXamarin.Formsを活用できる場面が増えそうですが、それまでの間は残念ながらiOS/Android向けにXamarin.Formsベースで構築した(さほどビューをゴリゴリ作りこんでいない)ものを大画面でのサイネージ表示用へと安価に転用するという、わりとありがちなシナリオが現実的と考えられます。この場合、用途としては50-80インチ程度のディスプレイとタッチパネルモジュールとの組み合わせを前提とするサイネージで、インタラクションはさほど発生させない前提(メインメニューからの階層をタップでたどっていく程度)がしっくりきます。商業施設内の簡易案内用システムなどで見かけるエリアですね。サイネージから手元スマフォでのアプリ利用へと誘導できるような仕掛けになっていれば一定回りそうではあります。$20程度の安価なタッチパネル付きディスプレイモジュールがデファクト・スタンダードとして普及すればこれはあり得ます。現状の7"ディスプレイ単体で$50近くかかる状況では無理そうですね。Coreはとても良い組み合わせです。ハードウェアの持つ力を十分に発揮しうる組み合わせといえます。そこにXamarinを足してそこから一旦GUIでのインタラクションを引いてみようと考えてみます。ええと、UWP環境には元々C#コードの十分な実行環境が整っています。Xamarinの中ではメインのx-platコード実行基盤及び大半のBCLの出番がありません。Cloudあたりが絡めそうなポイントです。Cloudはさておき、GUIインタラクションを差し引くとFormsコンポーネントを追い出すことになります。結果、Xamarinらしいポイントは一切残らないということになってしまいます。なんだか悲しいですね。思っているうちになんとなく「Xamarin.IoT」というフレーズを思いつきました。なんかかっこいいですね。Xamarin.IoTがどういうものであってほしいかを想像して書いてみることにしました。Xamarin.IoTを想像してみるXamarinシリーズということは、きっとXamarin.IoTというのは「C#やF#といった言語で開発できてサーバとも連携させやすい、クロスプラットフォーム(x-plat)IoT開発をめっちゃ楽にしてくれるなにものか」でしょう*2。APIs」と「必要ならば自らそのサービスプロバイダを書いて拡張できる仕組み」となってほしいところです。APIsというのは次のような感じでしょうか。猫も杓子もBLE時代まあ普通に需要ありそう、というかXamarinの追加コンポーネントとして既に売っているところある気がするx-platなGPIO基盤え、それSystem.IO.Ports.SerialPortじゃダメなの?→どっちかというとGpioClx系ではシリアルポート抽象化は何かと嬉しい。Beamのようなインテリジェントなゲートウェイを介するデータフロー作りとか、そういう方面でしょうか。Xamarin.IoTを構成する要素のすべてでフルバージョンの.NETランタイムが動作する必要はないはずです。センサー値を定期的に取得して蓄積し、加工したうえで上位端末へ送信する役目を担う末端の端末*3ではごく限られたサイズのメインプログラムを動作させるためにminimalなランタイムとFull-AOTコードを突っ込むことになるのではないでしょうか。2016」みたいな話になりました。あれ、なんだかWCFの雰囲気を感じますね。KBメモリ的環境を想定しています。CoreにXamarin.Formsを持ち込んでも(今のところ)個人利用で嬉しいケースは少ないという話と、Xamarin.IoTという語感からその用途やあり方を想像してみると割と面白い気がしたという話でした。明日の担当はMasaakiYoshidaさんです。Calendarの14日目のものです。2015)で発表されました。このカンファレンス時には多少話題になったのですが、実際のSDK提供までにしばらくのタイムラグがあったためあまり最近話題になっていないのが現状です。ほとんど知られていないので紹介していきますよという話です!使える機能群には自然言語処理や画像認識など、事前にガンガンとトレーニングをかけた機械学習の権化のようなものがいっぱいあります。Research)の成果を一般転用したものという印象です。Oxfordで提供される仕組みを使った実世界のサービスの代表格がWindowsアイドル、Cortanaさんです。iOS界のスーパーアイドルSiriと競い合う感じで日々前へ出ようとしていますね。Oxfordが嬉しいのかみなさんご存知のhttps://how-old.net/、平和の極みみたいなサービスですよね。誰も傷つけることなく*1写真からの顔認識とその年齢推定を楽しさへと変えてくれるサービスです。その昔、face.comというオンラインの顔認識サービスがありました。残念ながらFacebookが買収してサービスをシャットダウンしたので、私は安価/無料で比較的自由に利用できるオンラインの顔認識サービスがなくて厄介だなぁと思っていました。Oxfordでは顔認識サービスも公開されています。顔認識と共に感情の推定もおこなってくれる、なかなかすごいやつです。Oxfordのあれこれを触ってみようという次第です*2。勝手に他人の画像をアップロードして不快感を生むなどはさすがに例外とさせてください。APIという仕組みの限定プレビュー版を開始したようですね。Oxfordで提供する機能は多岐にわたります。ここでは本家サイトの構成に準ずる形で一覧を紹介します。興味をもった項目はぜひリンクを辿って詳しく調べてみてください。Service(LUIS)自然言語を使ってアプリケーションを操作する仕組みを簡単に実現する仕組み一覧の最新版はわりとhttps://github.com/Microsoft/ProjectOxford-ClientSDKにまとまっています。サポートするプラットフォーム音声認識系APIが最も対応範囲の広いもので、Windows/iOS/Androidをサポートします。顔認識とCVはWindows/AndroidのSDKを提供しています。スペルチェックと感情認識はWindowsのSDKのみを提供しています。10に組み込まれているもので、Windows版SDKの内部でそのOS組み込み機能を呼んでいるようです。Mobileでの挙動についてはまだ実機で確認していないので把握できていません*3。それぞれのAPIごとに異なります。音声認識APIでは月間のAPI呼び出し可能回数が5,000回に制限されています。詳しくはドキュメントを読む必要があります。音声認識APIことはじめまずはこのデモをごらんください。Oxfordの本家サイトでホストされている音声認識と音声合成のデモです。PC向けのモダンなWebブラウザで開くと、一切のプラグインを要求することなく音声認識を実現できることがわかるでしょう。ちなみに音声認識についてはAndroid向けのクイックスタートガイドがあります。Android勢はこちらを参照してください。Oxfordの真骨頂ともいえるRESTのAPIはこのような構成です。SDKのほうが使いやすいケースもあるでしょう。そのような場合にはお馴染みのドキュメントを出発点としてAPIを掘り下げられます。Oxfordが提供する音声認識エンジンを使ってWebアプリを作っています。ここでは、この中で中核を担う音声認識部分のコード断片を紹介します。音声認識クライアントを生成してAPIキーを設定、そして送信する音声のフォーマット指定をおこないます。speechClient.SendAudioFormat(SpeechAudioFormat.create16BitPCMFormat(8000));SpeechRecognitionModeには短時間版と長時間(最大2分)版の二種類を設定できます。ここでは長時間版(LongDictation)を設定しました。Oxfordが提供する音声認識エンジンで認識できる言語はいくつかあります。具体的にはこのページへ記載されているとおり「英語(US)、英語(英国)、ドイツ語、スペイン語、フランス語、イタリア語、中国語」です。ここでは英語(US)を指定しました。Azureの管理画面から発行したものを利用していました。この手順はごく最近(2015年12月上旬?)に変わり、https://www.projectoxford.ai/Subscription/Indexへとアクセスして必要なAPIキーを発行するようになりました(図1)。Oxfordライセンスの一覧このサイト上から残り利用可能なAPI呼び出し回数なども確認できるようになりました。音声認識クライアントの初期化を完了したら、続いていくつかコールバックを仕込みます。音声認識においては部分結果(認識途中の候補データ)最終結果(認識完了時の結果データ)が大切です。最終結果だけを使うケースもありますが、今回は「音声認識実行中であり、何かしらの中間結果が得られている」ことを呼び出し側で判断したかったので次のように両方を利用しています。};OnPartialResponseReceivedで得られるのが途中結果、OnResponseReceivedで得られるのが最終結果です。ここでは最終結果で渡される結果オブジェクト内のMaskedInverseTextNormalizationResultを読み出しています。wordsなど)を****とマスクした状態で格納したものです。InverseTextNormalizationResultには認識結果がそのまま格納されます。基本的に音声認識に関わるコードはこれだけです。これに加えて実際にはWebSocket経由でオーディオストリームを受け取って右から左へ流す仕組みや、不要の際に流れてきたデータを一時的に音声認識サーバへ流さず捨てる「ミュート」機能などを持ちますが、根っこの部分はこれだけです。音声認識APIは前述のようにWeb版(REST版)のみならずWindows版Android版、iOS版も提供しています。個人的にはWeb版(Rest版)ですべてのプラットフォームをカバーできるならばそれでよかったのですが、この場合に大きな壁となるのがiOSです。9.2時点)存在しません*4。Mobile)、iOS、Androidで共通利用できるラッパーライブラリを書いているところです。BowserというiOS向けのWebRTC機能組み込みWebブラウザを使えばゴリ押し利用できるのですが、いかんせん実験的なWebブラウザで出来がイマイチなので常用に耐えるものではありません。5のテンプレを使ってコードを書いてみました。7)を試しに使っているのですけれど、インデックスを張るためのAttributeを探したところなくなったようで難儀しました。結局、EF7では基本的にデータベースの細かな部分をすべてプログラム側コード(EF7の場合はC#)で完結するのではなく、適宜DDLを自前で書くのが良いという思想だと解釈して自分でインデックスをぽちぽちと張るようにしました。DON'Ts)が欲しいなと感じたりもしましたとさ。Apps+ASP.NET系の環境でWebSocketを利用する場合には、AzureのPortal上からWebSocket利用オプションを有効にするのを忘れないようにしましょう。私はこれで割とハマりました。Oxfordすごいぞい楽しいぞいという話でした。メインで紹介した音声認識系以外にも楽しい技術がいっぱいなので順次さわっていきたいところです。Calendar担当はredwarriorさんです。Phone開発本を購入してざっと読んだので感想メモなど。WinRT本ひとまず読了した。本編へ入ったら割とサクサク進行なので最後まで読めた。ここで「位置情報」選択します。MacBookを4/10に注文、4/14出荷、届いたのは4/17だったので正確にはもうすぐ2ヶ月ですが。Dockerで簡単にGPU対応のTensorFlow入りコンテナを作る方法こんにちは。作品群を読んでいたら連休が終わりそうです。重くなるので読み込まないようにすればOK。資料を補足するシリーズです。途中でやったことや、参考情報を書いていきます。