真面目なブログはこっち 👉 blog.s64.jp

苦しんで実現するホームオートメーション、の台本

VOYAGE GROUPさんのLT大会「システムライトニングトーク!」で「苦しんで実現するホームオートメーション - あるいは、HTTP経由でHIDを操作する話」というタイトルで出させてもらえることになったので、それの台本。

LTにしてはけっこう長い内容になってしまったので、話し切れなかった時にお蔵入りさせないための保険でもあります。

苦しんで実現するホームオートメーション 

「苦しんで実現するホームオートメーション - あるいは、HTTP経由でHIDを操作する話」というタイトルでお話します。よろしくおねがいします。中盤のブレイクタイム感覚で気楽にお聞きいただければと思います。 

自宅の紹介

f:id:S64:20190124211201p:plain

今回は交流会とのことでしたので、趣味の話として まずは自宅の紹介します。

Slack経由でオートロックが開く

f:id:S64:20190124211300p:plain

うちなんですけど、Slack経由でオートロックが解錠できるようになってます。こちらデモ動画ですね。

ほかにも エアコンとか照明とかカーテンとか、いろいろ繋げてあります。

自己紹介

f:id:S64:20190124211420p:plain

申し遅れましたが自己紹介しますと、私 吉岡と申します。

現在フリーランスでして、fluctさんでAndroid向け広告SDK開発のお手伝いさせてもらったり、あと高校でプログラミングの授業をやらせてもらってます。

テレビをSlackから操作しようとした話

f:id:S64:20190124211440p:plain

んで今回なんですけど、テレビをSlack経由で操作したかったんですよね。

なぜSlack経由で操作したい?

f:id:S64:20190124211502p:plain

なぜかって話をすると、まあ朝起きたらテレビ点ければ時間もわかるし いい目覚ましなるじゃないですか。あとは外出時にも気兼ねなく一括消灯とか。

んでそれをSlack経由にすれば、ジョブの管理が集約できるし、ウチよく帰宅難民が来るんですけど、そういった客人向けの権限付与だったりAudit Logとしても使えるよねって判断です。

前提

f:id:S64:20190124211602p:plain

さて前提をお話すると、ウチで使ってるのは PIX-SMB400 というAndroid TVです。すなわち、当初は自分の専門領域でカバーできるかなって思ってたんですよね。

アイデア1: アプリ作って外からイベント発火

f:id:S64:20190124211633p:plain

というわけで、当然アプリを作って外部からイベントを発火しようという発想に至るわけです。

アプリNGの理由1: バックグラウンド処理

f:id:S64:20190124211717p:plain

でもコレだめだったんですよね。

Android 8.0からバックグラウンド処理の制約がメチャ厳しくなっちゃって、アイドル状態のプロセスを任意のタイミングで起こしたり、何か処理を走らせるの難しくなったんです。

ざっくり言えば、アプリがバックグラウンドにいる時は デーモンプロセスみたいなモノが速攻でkillされちゃうってことですね。

アプリNGの理由2: FCM

f:id:S64:20190124211741p:plain

そしたら当然プッシュ通知で実現しようとなり、Android標準のFCMです。

が、こちらもまた難しい問題がありまして、アプリがフォアグラウンドに居れば通知が来たタイミングで処理を走らせることができますが、バックグラウンドだと "通知がトレイに表示される" に留まってしまい、ロジックでキャッチできないんです。

どうしよう

f:id:S64:20190124211800p:plain

どうしようと。

f:id:S64:20190124211819p:plain

そこで考えた結論として、

f:id:S64:20190124211839p:plain

リモコン作ればいいんじゃないか、

アイデア2: リモコンを作る

f:id:S64:20190124211857p:plain

というのが本題です。

要はAndroid TVのリモコンって、Bluetoothアクセサリなんですよね。すなわちKeyEventを発火できればよいと。

イベント発火さえできれば、当然物理キーもいらないわけです。

PCから操作できる無線キーボード

f:id:S64:20190124211922p:plain

というわけで

f:id:S64:20190124211945p:plain

作ってみました。

構成

f:id:S64:20190124212004p:plain

構成はこうです。マイコンボードがWi-Fi経由でバックエンドのイベントをSubscribeして、バックエンドはリクエストを受け取ったらそれを流す。マイコンボードはBLEでAndroid TVに接続されていて、HID、つまりキーボードとしてキーの押下を再現します。

マイコン

f:id:S64:20190124212023p:plain

ちなみにコレを選んだのは、単に家に余りが積んであったからです。

バックエンド

f:id:S64:20190124212042p:plain

バックエンドはScalaで書いてますが、まあ多分なにで作っても関係ないです。

とってもシンプル

f:id:S64:20190124212103p:plain

見たとおり難しいロジックは介在せず、超素直な数行のコードだけで実現しています。

Slackで特定キーワードが出たらWebHook扱いでバックエンドを叩く

f:id:S64:20190124212131p:plain

というわけでDemoです。

こうしてSlack上でキーワードを投稿すると、WebHookとしてリクエストが投げられるわけですね。

私はこれで

f:id:S64:20190124212310p:plain

私はこれで、朝起きれるようになったし、リモコンを無くしても困らなくなったし、おかげさまでリモコンの場所がわからなくなりました。

www.irasutoya.com

 まだまだ課題山積

f:id:S64:20190124212330p:plain

とはいえまだまだ課題がヤマズミになっていて、たとえば長時間放置すると動かなくなったりします。
つまりどういうことかというと、さっきの「朝起きれるようになった」というのはウソです。

鋭意開発中

f:id:S64:20190124212409p:plain

というわけで、鋭意開発中です。

今回のおもちゃはこちら

f:id:S64:20190124212453p:plain

なお今回のコードはこちらで公開してありますので、ご興味あればぜひどうぞ。

github.com

おわり

※ 空白のページ

以上です、ご清聴ありがとうございました。

Appendix: 実は

f:id:S64:20190124212530p:plain

実は Androidはadb経由でkeycodeを送ることができます。
なので宅内にサーバを置いて上手く制御してあげれば、今回のように作らなくても動いたりします。

大晦日ことし買って良かったモノまとめ2018

2018年も今日で終わるので、今年買って良かったモノのまとめ。
いつ買ったかよく覚えてないものは数年前だろうがなんでも今年買ったことにします。

Philips Hue

スマートフォンや音声アシスタント、さらにIFTTTなんかからもコントロールできる電球。
色んな色を再現できる製品、というイメージが強いが、ホワイトグラデーションというのもあって コイツなら日常的に使いそうな色味だけになる代わり安い。実際使ってるのもこのくらいなので十分。

使っているのは、リビング, 浴室, 洗面所。
いちおうリビング用にはスタンダードな方を使っている。ゲームや動画, 音楽にあわせて自動で色を変えたりできるので面白い。

Philips Hue(ヒュー) シングルランプv3 スマートLEDライト 【Amazon Echo、Google Home、Apple HomeKit、LINE対応】

Philips Hue(ヒュー) シングルランプv3 スマートLEDライト 【Amazon Echo、Google Home、Apple HomeKit、LINE対応】

朝起床時に徐々に照明を明るくできるとか、時間帯によって色味を変えて目の疲れを抑えるとかが便利。
また洗面所でメイクする時は 色味をコロコロ変えたりして試せるので、めちゃくちゃ顔を作りやすくなった。

何よりいちばん助けられてるのは、やっぱ電気の消し忘れが減ったことかな...

初めて設置する場合は、Bridgeの購入をお忘れなく。

Philips Hue(ヒュー) ブリッジ   929001180614

Philips Hue(ヒュー) ブリッジ 929001180614

ちなみにスタンドはコレ使ってます

アッパーフロアスタンド ブラック E26 YN10AW TF-YN10AW

アッパーフロアスタンド ブラック E26 YN10AW TF-YN10AW

Qrio Lock

スマートロック製品。
いつも「鍵ちゃんと締めたっけ?」と気になりはじめると一日ストレス続きでつらかったのだけど、気になるならアプリ開けばいい、という状態になったのが精神衛生上たいへん良い。
あとは宅配ボックスの荷物を出してきた時、カギ出す必要がなくなってスムーズになったのとか。

この手のスマートロック製品の中でも特にアプリのクオリティが高いのもポイント。他のある製品はちょっと不満があった。

ウチはよく帰宅難民の受け入れをしていて、その時に帰るタイミングが全く違っていても「とりあえず合鍵の権限付与」で済むようになったのも楽。鍵自体を渡すのは紛失時が怖いからね。

外出先から使いたい場合は、Qrio Hubの購入をお忘れなく。

Switch Bot

スマートフォンやREST APIから物理ボタンを代わりに押してくれる製品。
前述の「帰ってくるタイミングがわからない」という問題があった時、ここにリクエストを投げてもらってオートロックを解錠している。

外出先から使いたい場合は、Switch Linkの購入をお忘れなく。

Slack Standard

個人で使ってるSlackのプランをStandardへ上げました。
フィードの購読だったり各種通知で使っていたのだけど、これが古いものまで遡れるようになった。

何より良かったのは、シングルチャネルゲストが使えるようになったこと。前述の帰宅難民受け入れ時なんかに、各種家電のコントロールをSlackコマンド経由へ集約しておくと楽チン。アプリごとの権限管理が不要になるし、Audit Logのように誰が何をやったか後からでも確認できる。

Zapier Starter Plan

IFTTTの代替として、ZapierをStarter Planへ上げました。
より高度なタスクをコード不要で作れるので、とりあえずサクッと何か実現するためには手放せない。

4Kモニタ (テレビではない)

先日のAmazonサイバーマンデーセールで3万円台で買えるようになっていて、気絶して起きたら何故か注文済だった。

前提として独立したテレビ用STB (後述) を既に持っていて、チューナ一体型の液晶テレビは不要だった。
4Kコンテンツを鑑賞してるかというと全然そんなことはないけれど、すこし距離を取って映像を見る際にはやっぱある程度デカイモニタじゃないと文字とか見づらかった。だいぶストレス減りました。

Android TV搭載STB

チューナ内蔵なので、チューナ一体型の液晶テレビとかがいらない。今持ってるPC用モニタがそのまま流用できる。
4K出力やBS/CSの4K放送にも対応している(活用はしてない)。ついこのあいだのアップデートで録画も可能になった。

Android TVという性質上そこそこhackableなのがポイント。自前でアプリ作って食わせられる。
またインターネット上のコンテンツを鑑賞する時にわざわざモニタの入力切替をせずとも、シームレスに変えられるのがとても良い。操作の学習コストが下がったり、機器管理の手間が減った。

電気ケトル

ひとり暮らしなので電気ポットだと量が多くて使い切れなかったり、猫舌の自分では沸騰直後だとあつくて使えなかったり。
電気ケトルを使い始めて、必要な時に必要な量だけ必要な温度でお湯が作れるようになった。何より早い。

お掃除もかなりラクなので、必要十分なものを使うのは大事。

チョコラBB

明らかに調子が良い。

エーザイ チョコラBB ハイパー 50ml×3本 (医薬部外品)

エーザイ チョコラBB ハイパー 50ml×3本 (医薬部外品)

ESP32系開発ボード

良い暇つぶしになるし、勉強にもなるし、ちょっとした家庭用の自動化ツールにも便利。趣味なら安いコピー品で十分。

ロング用ウィッグスタンド

いままで通常サイズのウィッグスタンドを使っていて、毛先が床に着いちゃう問題で悩んでいた。もっと早く買えばよかった。

Qrio Smart Tag

MAMORIOもいいんだけど、こっちの方が多機能で確実に通知を送ってくれている印象。

VLAN対応スイッチングハブ

仕事で納品したのみだけど。硬質感といい重量感といい、大変素晴らしい。

ポケットモンスター Let's Go! イーブイ

イーブイがかわいいので。

ポケットモンスター Let's Go! イーブイ- Switch

ポケットモンスター Let's Go! イーブイ- Switch

配信の時は AVerMediaくん つかってます。

Switch用Proコントローラ

Joy-Conのストレスから開放された。

Nintendo Switch Proコントローラー

Nintendo Switch Proコントローラー

総評

まあまあ経済回した。

今すぐシュッとグローバルIPを取るsnippet in Kotlin + Android

雑だけど、社内用のデバッグアプリ (画面) ならこんなもんでいいと思います

findViewById<TextView>(R.id.your_ip_text_view).apply {
    Thread {
        URL("https://api.ipify.org")
                .openConnection()
                .apply { connect() }
                .getInputStream()
                .bufferedReader()
                .use { it.readText() }
                .let {
                    runOnUiThread {
                        text = it
                    }
                }
    }.start()
}

いろんな `java -version` 表示

必要になったんだけど、いろいろありすぎて困ったのでメモ。ちなみにDocker内でやった。

TL;DR

  • semverじゃないのは常識
  • 実行方法次第では必ずしも3行ではない
  • バージョン表記は3セグメントとも限らず、4セグだったり1セグだったりもする
  • underscoreが入ったりhyphenが入ったりいろいろある
  • バージョン表記のquotesより後に日付が入るパターンもある

OpenJDK

6

java version "1.6.0_38"
OpenJDK Runtime Environment (IcedTea6 1.13.10) (6b38-1.13.10-1~deb7u1)
OpenJDK 64-Bit Server VM (build 23.25-b01, mixed mode)

7

java version "1.7.0_181"
OpenJDK Runtime Environment (IcedTea 2.6.14) (7u181-2.6.14-1~deb8u1)
OpenJDK 64-Bit Server VM (build 24.181-b01, mixed mode)

8

openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-8u181-b13-2~deb9u1-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)

9

openjdk version "9.0.4"
OpenJDK Runtime Environment (build 9.0.4+12-Debian-4)
OpenJDK 64-Bit Server VM (build 9.0.4+12-Debian-4, mixed mode)

10

openjdk version "10.0.2" 2018-07-17
OpenJDK Runtime Environment (build 10.0.2+13-Debian-2)
OpenJDK 64-Bit Server VM (build 10.0.2+13-Debian-2, mixed mode)

11

openjdk version "11.0.1" 2018-10-16
OpenJDK Runtime Environment (build 11.0.1+13-Debian-2)
OpenJDK 64-Bit Server VM (build 11.0.1+13-Debian-2, mixed mode, sharing)

12

openjdk version "12-ea" 2019-03-19
OpenJDK Runtime Environment (build 12-ea+19)
OpenJDK 64-Bit Server VM (build 12-ea+19, mixed mode, sharing)

Oracle JDK

7

java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)

8

java version "1.8.0_192"
Java(TM) SE Runtime Environment (build 1.8.0_192-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.192-b12, mixed mode)

9

java version "9.0.1"
Java(TM) SE Runtime Environment (build 9.0.1+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.1+11, mixed mode)

10

java version "10.0.1" 2018-04-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+10, mixed mode)

AdoptOpenJDK

8

Picked up JAVA_TOOL_OPTIONS: -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap
openjdk version "1.8.0_192"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_192-b12)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.192-b12, mixed mode)

9

Picked up JAVA_TOOL_OPTIONS: -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap
openjdk version "9.0.4"
OpenJDK Runtime Environment (build 9.0.4+11)
OpenJDK 64-Bit Server VM (build 9.0.4+11, mixed mode)

10

Picked up JAVA_TOOL_OPTIONS: -XX:+UseContainerSupport
openjdk version "10.0.2-adoptopenjdk" 2018-07-17
OpenJDK Runtime Environment (build 10.0.2-adoptopenjdk+13)
OpenJDK 64-Bit Server VM (build 10.0.2-adoptopenjdk+13, mixed mode)

11

Picked up JAVA_TOOL_OPTIONS: -XX:+UseContainerSupport
openjdk version "11.0.1" 2018-10-16
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.1+13)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.1+13, mixed mode)

Zulu

6

openjdk version "1.6.0-119"
OpenJDK Runtime Environment (Zulu 6.22.0.3-linux64) (build 1.6.0-119-b119)
OpenJDK 64-Bit Server VM (Zulu 6.22.0.3-linux64) (build 23.77-b119, mixed mode)

7

openjdk version "1.7.0_201"
OpenJDK Runtime Environment (Zulu 7.25.0.5-linux64) (build 1.7.0_201-b02)
OpenJDK 64-Bit Server VM (Zulu 7.25.0.5-linux64) (build 24.201-b02, mixed mode)

8

openjdk version "1.8.0_192"
OpenJDK Runtime Environment (Zulu 8.33.0.1-linux64) (build 1.8.0_192-b01)
OpenJDK 64-Bit Server VM (Zulu 8.33.0.1-linux64) (build 25.192-b01, mixed mode)

9

openjdk version "9.0.7.1"
OpenJDK Runtime Environment (Zulu build 9.0.7.1+1)
OpenJDK 64-Bit Server VM (Zulu build 9.0.7.1+1, mixed mode)

10

openjdk version "10.0.2" 2018-07-17
OpenJDK Runtime Environment Zulu10.3+5 (build 10.0.2+13)
OpenJDK 64-Bit Server VM Zulu10.3+5 (build 10.0.2+13, mixed mode)

11

openjdk version "11.0.1" 2018-10-16 LTS
OpenJDK Runtime Environment Zulu11.2+3 (build 11.0.1+13-LTS)
OpenJDK 64-Bit Server VM Zulu11.2+3 (build 11.0.1+13-LTS, mixed mode)

Amazon Corretto

8

openjdk version "1.8.0_192"
OpenJDK Runtime Environment (build 1.8.0_192-amazon-corretto-preview-b12)
OpenJDK 64-Bit Server VM (build 25.192-b12, mixed mode)

Android TV搭載チューナ内蔵STB「PIX-SMB400」のハマりどころなど

待ちに待ったピクセラのAndroid TV搭載STB「PIX-SMB400」が発売された。
これの特徴は、国内のAndroid TVでは珍しく 地上波 / BS / CS のチューナーが搭載されており、また4K出力や4K放送にも対応している。
従来のAndroid TVでチューナが搭載されているものの多くは液晶テレビと一緒になっていたため、テレビごと買い替えが必要だった中これは嬉しい。

いろいろハマりどころや注意すべきことがあったので、これから購入を検討される方向けにメモ。

アンテナケーブルが付属してない

箱の中にアンテナケーブルが入っていない。これはおそらく、この製品が「既存のテレビを置き換える」という用途を想定しているからと思われる。
もし未だテレビを利用したことがない場合、一緒にアンテナケーブルを買っておく必要がある。

私は以下2つを買って組み合わせ使っている。

HORIC アンテナ分波器 BS/CS/地デジ対応 白ケーブル2本付き(S-4C-FB) 40cm BCUV-971

HORIC アンテナ分波器 BS/CS/地デジ対応 白ケーブル2本付き(S-4C-FB) 40cm BCUV-971

LANケーブルが付属していない

同上。

リモコンはBluetooth接続

これはAndroid TV全般に言えることだが、赤外線ではないので注意。Nature Remoなどでリモートコントロールはできない。

電源投入時に自動でテレビが点く

一般的なAndroid TV端末は電源投入時はLauncherが表示されるが、この製品は前回点けていたテレビのチャンネルが自動で点く。
なお、スリープからの復帰時は通常通り前回のアプリ / 画面。

テレビの表示がLive Channelsではなく独自アプリ

これは国内の多くのAndorid TVが該当するが、放送の視聴はLive Channelsからではなく、搭載されている独自アプリから行う。

おそらくこのアプリとほぼ同等だが、外付けではなく内蔵チューナ用にカスタマイズされていたりとパッケージ自体は異なる模様?

スマートスピーカー連携の設定動線が一方のみ使えない

多分これは現行ファームウェア (Build OPR6.170623.013, Revision 4.4.1538216619) の不具合。

設定 → デジタル放送 → カスタム設定 → スマートスピーカー連携 の動線から設定しようとすると、途中永遠にプログレスになってしまい進まない。
TVアプリ → メニュー → 設定 → カスタム設定 → スマートスピーカー連携 から進めると、正常にログイン画面が表示される。

外部Google Assistantから「画面消して」ができない

まず前提知識として、PIX-SMB400はAndroid TV製品では珍しくスリープ(ケータイで言うなら画面ロック)機能がある。
これは大変便利で、たとえば多くのモニタには省電力機能が搭載されているため、HDMIから信号が途切れた時点でモニタのバックライトが消灯したりする。すなわち、PIX-SMB400側をスリープさせるだけであたかもモニタ自体の電源が落ちたかのような挙動を実現することができる。

PIX-SMB400上のGoogle Assistantに対し「画面消して」と言うと、画面を消す(スリープさせる)ことができる。
が、Google Home等に対し「(設定したデバイス名) の画面消して」などと言っても画面を消すことはできない。

ただし、ピクセラ製テレビのスマートスピーカーアプリを経由しようと「ピクセラテレビに繋いで」から「テレビを消して」とした場合、TVアプリを終了させる (= Launcherを表示する) ことはできる。画面をスリープにさせることはできない。

Amazon Prime Videoが観れない

これもAndroid TV製品全般に言えることだが、Amazon Prime Videoアプリが利用できない。

まれにリモコンが音声を認識しなくなる

これはリモコン側の電池を抜いて再度入れるとよい

外部端末からCastを受け付けなくなる

設定メニュー内のストレージとリセット → データの初期化を行ったが解決しなかった。
が、試しに本体裏側の初期化スイッチからリセットを試みたところ、上手く動作するようになった。なんだろう。

Google AssistantからCast中に「音量上げて」というと音量が下がる

これがかなり致命的な不具合。Google Home等の端末から「テレビでSpotify再生して」などと伝えてCastをしているとき、「音量上げて」と言うと音量が下がってしまう問題がある。なお、音量下げてというと正常に音が小さくなる。

定期的に放送が止まる

解決方法を調査中

所感

とりあえず購入後23時間程で気付いた点について書いた。全体としては満足度の高い商品なのだが、いかんせんFire TVをメインで利用した後ではコンテンツに乏しく感じてしまう。
他なにか気付いた点があれば追って記事を出したい。

高田馬場でコオロギを食べた

連日の40度にも達するかという気候の中では、今日はずいぶん涼しい。
都庁を間近で眺めるのは初めてで、試しに写真を撮ってみたものの、どうもこの曇り空ではうすぼんやりとした印象になってしまい、結局Twitterでシェアすることもなかった。

先週、高校時代からの友人より久々に連絡があった。彼女が連絡を寄越す時は、大概パートナーと喧嘩しただとかそういう時だ。
飲みに行こうと、彼女が提案したのはミャンマー料理専門店だった。

ミャンマー料理には馴染みが無い。どんな料理か想像が付かない。そしてどうもその店は昆虫料理を出すらしい。
虫は大の苦手なのだが、何度かためらいのメッセージをやり取りした後、興味のほうが勝った私は承諾した。

待ち合わせは夜。翌月に講師の案件が迫っていたので、日中に取引先との打ち合わせを入れる。なんでも先方が準備するはずだった資料が上がっていないらしく、当日までに準備できないかという相談だった。まあ、これが無ければ講義もままならないし、特急料金で発注頂けるのなら。


18時。遅れると言いつつ時間丁度にやってきた彼女は、最後に会った時から比べてずいぶんとほっそりしていた。ショートカット、ノースリーブ、薄塗りのファンデーション。いつの間にか大人びた彼女に対し、金だけ払ってジムへも通っていない小太りの自分が連れ立って歩く様子は滑稽だっただろう。

高田馬場駅からほど近い、ノングインレイという店。いつも見えるビルの1階に、こんな店があるとは。

店に入ると、白髪のおじいさんが客席に座って何か作業をしている。女性スタッフがたどたどしい日本語で人数を聞く。
2人と答えると、奥から出てきたスタッフや手前のおじいさんが矢継ぎ早に奥の席へと言う。後に調べたところ、このおじいさんはオーナーなのだという。

くすんだ緑色の内装に、壁際にテーブルが置いてある。下町の小さな食堂といったところだ。
店の中央が壁で遮られているが、カウンターキッチンでもあったのだろうか。


お目当ての昆虫料理はメニューの後半にあった。エキゾチックゾーンと銘打たれた料理たちは、当然ながら見慣れないものたち。
写真のとおり、小さめに掲載されているためディテールまではわからないが、それでも十分にインパクトがある。

"いちばん食べやすいかも" という文句から「竹蟲」を選んだが、聞くと今日は無いという。この店のメニューは原則として入荷時のみの提供となり、この日は「竹蟲」と「セミの炒め」は無いのだそう。話ではこの2つとも食べやすいと聞いていたため、出鼻をくじかれた思いだ。
彼女は家でカエルを飼っている。そのためカエル肉は選びづらい。また、サナギは独特の食感がして上級者向けだと聞く。入門以前の私には厳しい。

最終的なオーダーはこうだ:

  • コオロギの炒め
  • お肉とお米の皮なしソーセージ (豚)
  • ピータンのサラダ (正式な名称は失念)

なお、最初 皮なしソーセージ をオーダーしたところ、「今日は牛しかない」と言葉の足りない日本語で数分掛けて伝えられた。仕方なく牛を注文したのだが、何故か実際に提供されたのは豚だった。


さて、肝心のコオロギは明らかにメニューを上回るビジュアルだった。

彼女曰く、コオロギにも複数の種類があるらしい。普段ペットに与えているものはもう少し小さいと言う。
この店は食料品の輸入も行っているらしい。これは所謂 "本場" のコオロギなのだろうか。

勢いよく頬張って戻しても良くないため、まずは片脚から頂く。
あれ、意外といける。もう片脚。案外薄味だ。

どこか懐かしさを感じる。間違いなく初めて食べるのに、以前食べたことがあるかのような感覚になる。
これは、サクラエビだ。パリッとした殻と、中身は空洞。味に至ってはそのもの。
触覚も食べてみる。うん、素揚げしたエビの触覚となんら変わらない。

問題は腹の部分だが、ここも案外普通である。
イメージするとしたら、蒸した葉が詰まっている感じだろうか。とは言っても臭みがあるわけでもない。食感だけである。
独特ではあるが、食べたことのない感覚ではない。

とはいえ、このビジュアルだ。味も食感も食べ慣れているとはいえ、今自分が食べているものを想像すると、一瞬えずきそうになる。
人は見た目やイメージに支配されているのだなと改めて感じる。そういう時は、飲み物で流し込む。ミャンマーのドリンクを一緒にオーダーしておいてよかった。
多分、内容を知らされず、目隠しでもさせられていれば、特段の違和感なく食べてしまうだろう。

皮なしソーセージ、これも美味しい。おそらく掛けてあるのは唐辛子の酢漬けか何かだろう。
私はすこぶる辛いものが苦手だ。ライスが欲しくなる。

ピータンの乗ったサラダだが、これは日本の食卓でも日常的に並ぶ味だと思う。ピータンこそ日常的には食べないが、鶏卵のゆで卵さえ使えば同様の具材でサラダを作ることもあるだろう。
ところでピータンの寒天のような側面には、結晶に似た柄がある。どんな反応でこうなるのだろう。

水を頼むと、琥珀色のお茶が提供される。バニラのような甘い風味があり、美味しい。なんて言うのだろう。もしなら家で飲みたい。

f:id:S64:20180728161451j:plain

彼女のSNSアカウントから拝借した。


3品を食べ終え、腹ごなしに暗くなった高田馬場を散策する。神田川あたりを歩くだけでも、複数のミャンマー料理店を見かける。なんでも高田馬場は「リトルヤンゴン」と呼ばれるほどの大きなミャンマー人コミュニティが形成されているらしい。

30分ほど歩き、駅前まで戻り安いチェーンの居酒屋へ入る。さきほどまでの異国情緒とはうって変わって、疲れた日本人サラリーマンがスマホ片手に酒を飲んだり、スーツを着た仕事仲間と下世話な話で騒いでいる。そういえば、今日はプレミアムフライデーか。

とりあえずビール、というわけでもなく、互いに好きな酒を好きなように注文する。腹が空いているわけでもないので、簡単なナゲットだけ2人でつつき合う。何の変哲もない、スッと箸がのびる味。

世間話、共通の友人の話、アイドルの話、パートナーの話、仕事の話、2人きりだからできるオフレコの話。
最近「LGBTカップルには生産性が無い」なんて話がバズっていたが、大した金額を落とすわけでもなく長時間居座って、これこそ生産性が無いよなぁなんて考えていた。とはいえ、私は代わり映えのしないなんとなく過ぎる時間が好きだ。

彼女は化粧直しで席を立つ。偉いなぁ。学生の頃こそ化粧直しに手間を掛ける時もあったが、最近はめっきりやらなくなった。小鼻の溝が皮脂で浮いてようが、誰も気にしないだろうとパウダーをはたき直すこともなくなった。こんなんだからダメなんだろうなぁ。
自炊もしない私に、彼女がクックパッドからオススメのレシピを選んで送ってくれる。日常的に料理でもしてないと、こういった行動はできないだろう。


「そろそろ出ようか」といって、店を出る。2人で3,000円も飲まなかった。
せっかく高田馬場に居ても、この時間では拝島行きの西武線も出ていない。新宿まで行って、中央線で帰るか。

「なんだか名残惜しいな」なんて言われても、気の利いたアクションが取れない。互いに反対方向の山手線へ乗って、別れた。

この時間に新宿に居ると、高校生最後のクリスマスや社会人1年目の時を思い出して、虚しくなる。最後にはいつも1人になることが寂しい。

水分を失い張り付いたカラコンに忌々しさを感じながら、いっそ今日も新宿で泊まって帰ろうかなどと考えていた。

「基礎から学ぶ Vue.js」の読書感想文

急に片手間で知識が必要になったものの、プラグインとかも開発してるくせに実際のアプリケーション開発レベルの知識が皆無だったので、C&R研究所より出版されている基礎から学ぶ Vue.js (著: mio氏)を読んだ。表紙がかわいい。

基礎から学ぶ Vue.js

基礎から学ぶ Vue.js

以下、読書感想文です。

読むとよさそうな人

  • Vue.jsやほかフロントエンドフレームワークを雰囲気で使っている
  • とりあえず今選んどけば安泰なフレームワークを知りたい
  • なんかVue.jsつらい
  • 猫がすき

向いてる用途

  • 業務でVue.jsを使うために手早く全体的な知識を注入する
  • 一般的な用途とそれに対応するコード片やアイデアを集める
  • Vue.jsで何ができるのか知る

できるようになること

  • 業務でとりあえずVue.js入れる
  • 簡単なアプリを書けるようになる (に相当する機能を網羅できる)

読めない人 (前提知識)

  • webpackなどを用いたモダンな開発現場の基礎を知らない人
  • フレームワークの発想がわからない人
  • HTML / CSS / JavaScriptを業務レベルに書けない人 (ES2015を網羅するまでは不要)

できないこと / 身につかないこと / 向いてない用途

  • Vue.jsで高度なアプリケーションを書くためのハマりどころを知る
  • Nuxt.jsの使い方を知る (基礎は知れるので十分だけどね)
  • Vue.jsのソースコードを読めるようになる、具体的な仕組みを知る
  • webpack等プロジェクトに必要な設定を組めるようになる
  • TypeScriptで利用する
  • Web APIの利用方法など、ビジネスロジックの作り方を知る

感想

期待以上の大変よい本だった。

本自体は終始「Vue.jsの機能をサンプルコードと一緒に紹介」というチュートリアル的な形式だが、ところどころに実際の運用にあたってのアドバイスが挿入されていたり、たとえば序盤でVue.jsのライフサイクルが紹介されていたり、各項目で関連するメソッド等APIが必ず含まれるなど、これから実際に使いはじめ、後々「こうすればよかったのに」という手戻りや後悔が無いよう配慮されていると感じた。

Vuex, Vue Routerの機能紹介も含まれており、この本一冊でアプリを作ることが十分に可能だと感じた。

一方、プロジェクトの構築がVue CLIへ完全にお任せだったりと、セットアップに関する面が手薄い。
またWeb APIの具体的な利用方法がほぼ書かれない (axiosの存在がさらっと話されて当たり前にサンプルコードに出る) など、ビジネスロジックレベルの話はほぼ無い。
これらから、おそらくある程度モダンなWebフロントエンド開発経験が既にあり、新たにVue.jsの導入を検討している開発者を想定している書籍だと感じた。

もし現場の既存システムへVue.jsの導入を検討しているなら、まずは手に取ると良いかも知れない。
集中さえできるなら、5時間もあれば優に読み切れる軽い本だ。

ちなみに、同時に Hello!! Vue.js 最新プログレッシブフレームワーク入門 (著: 那須 理也氏) を買った。重複する部分が大半な中で細かい部分を補い合えるだろう、という想定。次回はこれ。