MacBook Pro の外部ディスプレイの色味がおかしいときの対策

タイトルが長い。

2020/02/08 追記

  • DisplayPort を諦めて HDMI 出力にしたら正常な出力になった。しかし、これケーブルにもよる印象がある。
  • うまくいっているケーブルは Anker の USB-C to HDMI
    • これ

  • HDMI でうまくいく場合は、下に書いた XML の設定と組み合わせると不調の原因になる。XML による設定の上書きを解除してから試すと良い。

まとめ

  • MacBook Pro の外部ディスプレイ出力は DisplayPortで HDMI I問わず (DPだけかも) 色味がおかしくなることがある。
  • 直すには xml を作って特定の場所に置く必要がある
  • /System 以下の場所なので、Catalina (正確には El Capitan 以降すべて)ではリカバリーモードのターミナルを起動して設置するのがよい。
  • ただしリカバリーモードのターミナルは強力な権限をもっているので、注意して作業を行うこと。この対処方法でなんらかの不利益がおきたとしても補償できません。

状況

MacBook Pro 13inch 2017 から Philips の 328P6VJEB/11 という 32インチ 4k 対応のディスプレイに、usb-c → displayport 変換ケーブルで接続している。4k 解像度を 60Hz で表示できているが、色味がおかしい。色味がおかしいといいうのは全体に白っぽく、階調がやたら狭い。どういういことが起きるかと言うと薄い水色のような明るい色がほぼ白に見えてしまう。輝度が高すぎるような感じにも見えるがディスプレイ側で輝度を最低にしても暗くなるだけで改善しない。

対応方法

RGB で出力すべきところが、YCbCr で出力されているのが問題らしく、これを訂正する。他サイトの解説では System Integrity Protection (SIP) の解除が必要と書いてある場合もあるが、リカバリーモードを使うことで SIP の解除は不要。

    $ cd #/Useres/<YOUR_ID> で作業する前提
    $ curl -O https://gist.githubusercontent.com/ejdyksen/8302862/raw/5a1b27ff53ef738d5a977d2a06bb6575935b5914/patch-edid.rb
    $ ruby patch-edid.rb # DisplayVendorID-XXXX みたいなディレクトリができる
  • MacBook を再起動してすぐに Ctrl-R を押しっぱなしにして、リンゴマークが出たら指をはなす。この手順でリカバリーモードに入る。
  • リカバリーモードは画面上部のメニューからターミナルを開けるのでターミナルを開く。このターミナルは強い権限をもつので操作には十分注意すること。
  • 開いたターミナルで、先程作成した xmlディレクトリごと移動する
    $ cp -r  /Volumes/Macintosh\ HD/System/Library/Displays/Contents/Resources/Overrides/DisplayProductID-XXXX /Volumes/Macintosh\ HD/Users/<YOUR_ID>/DisplayProductID-XXXX.back # すでに存在する場合のバックアップ。存在しないなら不要
    $ cp -r /Volumes/Macintosh\ HD/Users/<YOUR_ID>/DisplayProductID-XXXX /Volumes/Macintosh\ HD/System/Library/Displays/Contents/Resources/Overrides/
    $ exit

参考文献

ここにいたる物語

もともとこの Philips のディスプレイ 328P6VJEB/11 を買ったのは数年前で、当時も MacBook Pro 2013 あたりをつなごうとして挫折したのであった。当時は 4k@60Hz を出す方法が微妙で、うまく行っても不安定だったりして結局 Windows マシンにつないで利用していた。そんな折にふと手元にある MacBook 2018 で接続してみたところ動作は安定しているが色味がとんでもないということに気づいた。価格コムの当該ディスプレイの口コミにもこの問題が話されており、概ねそのスレッドを読めば問題が把握できる。ケーブルのせいにミスリードされている気もしてちょっともったいない。とはいえ、本当にケーブルの問題で、DP接続をあきらめHDMIにすれば解決する場合もあるのかもしれず一概に間違いということはできないだろう。その後出力を RGB に直すべく関連情報を漁っていると、ファイルの移動に SIP の解除が必要とか不要とか最近の OSX の仕様変更に関係する問題が出てきて、最終的にはSIPを解除しない上のような手順がみつかった。しかしこれが2013年から解決していない問題というのはなかなかつらい。OS Updateで直るという報告もないわけではないのだが。

そして解決しても今度はアンチエイリアスの効かない世界が待っており、4k ならバラ色だぜとは行かないのがまた悲しい。かつて OS Xwindows とちがってフォントにアンチエイリアスが効くのが売りだったのに。最近の AppleRetina 前提でアンチエイリアスを切るように変更をしてきているように見え、これに従うならば最新の Pro Display XDR (税込み 582,780円)を買うしか外部ディスプレイの道はない。と思ったけどLG UltraFine 5K Display (税込み159,280円) みたいな 27インチ5kという手もあるか。24インチ4kでは200ppi に届かないから iMac は21.5 インチ4kなんだね。そして MacBook のディスプレイは ppi が高いだけじゃなくて色域も広くて結構良いディスプレイなんで、これに遜色ない外部ディスプレイを手に入れようとするとなかなか存在しないということもよくわかった。MacBook 高いよと思いつつ、ディスプレイのために買っているんだと思えば少しは許せるかもしれない。

などと無駄にディスプレイに詳しくなる週末であった。

GCP AutoML Vision で鍵かけ忘れを防ぐ仕組みを作る

f:id:r_kurain:20191016200356g:plain
slack にカギの開閉が通知される様子
玄関ドアのカギが開いた時、閉じたときに slack に通知が来る仕組みを作りました。今のところうまく運用できていて、外出後にカギが不安になって玄関まで戻ってくることがなくなりQoLがあがった感があります。

この仕組はドアの画像から閉じたサムターンを検出することで実現しています。Raspbeery Pi 3 で毎秒1画像くらいの処理ができるので、カギの通知としては問題ないレイテンシーです。

f:id:r_kurain:20191016200658g:plain
物体識別を可視化してみる

肝となる画像認識部分は GCP の AutoML Vision で学習させています。画像10枚で実用的な精度が出るDNNモデルが取得できる手軽さはなかなかすごいものがあります。 もちろんこんな簡単な画像認識なら、OpenCV を使ってテンプレートマッチングでも良いのでは? と思う向きもあるでしょう。実際その手法も試していて、頑張ってチューニングすればできそうな感触はありました。しかし AutoML Vision なら画像 10 枚を渡して、アノテーションするだけでチューニング不要で十分精度が出てしまうし、モデル作成から推論まで全部 WebUI でポチポチするだけでおわってしまうのです。学習には2時間くらいかかっているようですが、無料で計算できる範囲には収まっています。

コンピュータ資源を富豪的に使って、機械学習アプリケーションの PoC が簡単にできる。そのまま実運用まで持っていけるというのは、なかなか衝撃的な体験でした。 というわけで、以下は解説です。UIの遷移を説明するのがだるかったので AutoML Vision の使い方の説明はほとんどしていません。こちらの QuickStart どおりに動かすだけでモデルの取得ができます。

必要なもの

  • Raspberry Pi 3 (2とか zero でできるかは未検証です)
  • Raspberry Pi に接続できる赤外線カメラ
    • 僕がつかったのはこちら

しくみ

  • Raspberry Pi 3 に接続している赤外線カメラでサムターン(玄関鍵の手で回す部分)を含む写真を撮影
  • GCP AutoML Vision で'閉じてるサムターン' か '開いてるサムターン'を検出するモデルを作成
  • 作成したモデルを使って画像から'閉じてるサムターン'検出
  • '閉じてるサムターン'のスコアが閾値以上なら鍵が閉まっていると認識する
  • 前回の画像認識から状態が変化していれば slack に通知する

しくみの解説と構築手順

赤外線カメラによる撮影

なぜ普通のカメラではなく、赤外線カメラを使うのかというと玄関の照明を落としているときに帰宅したり、でかけたりという ことはよくあるので、玄関が暗い時でも画像認識が正しく動作してほしいからです。赤外線カメラとざっくり表現していますが、 赤外線LEDの照射機能がついていて、センサーに赤外線域を落とすフィルターが入っていないカメラを指しています。 今回は Raspberry Pi にフラットケーブルで接続するタイプのカメラを使っています。このカメラ、外光の明るさに応じて 照射する赤外線の光量を調整する機能がついています。外光に対して反応する量を可変抵抗で調整できるのですが、マニュアルが なく調整の仕方がよくわからないので現場合わせで適当に調整しました。外光が暗い時でも明るい時でも似たような明るさの写真が 撮影できればOKです。初期設定では外光が明るい日中にだいぶ白飛びしていたので、赤外線投射量が減る方向に調整しました。

カメラについてはUSB接続のものでも、あるいは wifi接続の監視カメラでも赤外線域で撮影できれば動作する可能性は高いと考えています。

GCP AutoML Vision で作るモデル

ここが今回のキモです。赤外線域で撮影した写真からサムターンを検出する機械学習モデルを作ります。 モデルを全部自前で設計する手もありますが、ここは手抜きしたいので、AutoML Vision に頼ります。 AutoML VisionGoogle が提供する機械学習のためのサービスで、画像識別と物体検出のモデルを簡単に作ることができます。今回は物体検出のモデルを利用します。

AutoML Vision の入力に必要な画像は、検出したい物体が写っている写真が最低10枚です。 今回は'閉まっているサムターン'と'開いているサムターン'を検出したいので、それぞれ10枚の計20枚を用意しました。

f:id:r_kurain:20191017202906p:plain
明るさが微妙に違うし、画角も微妙にずらしてある

明るさが異なる写真や、多少カメラの向きが変わった写真を用意しておくことで、汎化性能が高まることを多少期待しています。 '開いているサムターン'の検出はあとのフェーズでも実は使わないのですが、開いているサムターンを間違って閉じているサムターンと認識しないように、 違うものだと認識されることを期待して検出対象にいれています。不要なような気もしますが試していないのでわかりません。

教師データとなる写真のとり方ですが、cron で 10 分おきに写真を撮影するようにして 24 時間分写真をためます。 途中サムターンを開けておく時間を作ったりカメラの向きを少し動かしたりして、必要な写真が貯まるように仕込みます。 写真が溜まったところで、20枚の写真を選ぶと良いでしょう。

画像を用意したら、サムターンの場所を矩形で指定して、開いているのか閉まっているのかのラベルも付けます。 WebのUIでできますが、動作が緩慢で、あまり賢くもないので違うツールでラベル付けをして csv を upload するほうが楽かもしれません。

f:id:r_kurain:20191017203158p:plain
WebUI でアノテーションする様子

ここでのハマリポイントは、20枚画像をupすると、そのうち16枚を学習データ、2枚をハイパパラメータ検証データ, 2枚をテストデータに 分けてくれるのですが、アノテーションする前にその振り分けが行われるという点です。つまり、振り分けの運がわるいと、2枚のテストデータが 両方"閉じたサムターン"の方に入っていて、"開いたサムターン"データにテストデータが存在しないと怒られることがあります。 このようなときは、アノテーションが終わったあとに、一旦データセットアノテーションデータをCSVでダウンロードします。 ダウンロードしたCSVには矩形のラベルと、データの使いみちがTRAINING, VALIDATION, TESTの3つで示されているので、 それぞれのラベルにTRAININGが8つ, VALIDATIONが1つ, TESTが1つ有るように編集してあげます。 編集したファイルを upload してトレーニングデータとして AutoML Vision に認識させれば準備完了です。

レーニングを開始すれば2時間程度で学習が終わるはずです。

作成したモデルを使って raspberry pi 上で物体検出

AutoML Vision で作ったモデルはそのまま GCPクラウド上で運用することもできます。 しかし運用コストが安くはないので raspberry pi 上で物体検出まで行います。 作成したモデルは、Tensorflow の saved_model 形式か, tflite 形式でダウンロードできます。 tflite 形式のほうが軽量なモデルになっており、 raspberry pi での運用には向いているはずなのですが、 サンプル通りに動かしても正しく動作しないので、saved_model 形式を利用します。 概ね 1fps で検出できるので今回の用途には十分です。

動かしているコードと同等のサンプルを gist に置いておきます。

detecting thumbturn status · GitHub

Tensorflow(TF) の Raspberry Pi へのインストールについてはこちらを参考にしてください。 まだ TF v2.0 ではなく v1.4 です。サンプルコードもv1系を前提にしているので deprecation の warning が出ます。 (消したかったのですがとりあえず、問題なく動くので放置しています。)

識別ルール

カメラとサムターンの間に人が入って、検出がそもそもできない状況もあります。なので、閉まっているサムターンが 認識できるときは、カギが閉まっている、それ以外のときはカギが開いていると認識することにします。 このルールで状態が変化したときに、識別している状態(カギが掛かっている/開いている)を通知します。 通知するときに写真も添付しているので、誤検知があっても安心です。

また、家庭用 slack bot から signal (SIGHUP) を送ると、状態の変化に関係なくその時のドアの写真と状態を 通知してくれるので、出先でカギが不安になってもすぐに確認できます。

運用など

玄関に Raspberry Pi 3 とカメラを接続した状態で置いています。見た目がロボットぽいと子どもたちに好評なので ボディもつけてあげたいところです。

f:id:r_kurain:20191017210035j:plain

認識に使っている python スクリプトは gist にあげたものから多少変更していますがほぼ同じものです。supervisor でデーモン化しています。

検討したけど却下したもの

完成までには、M5 Stack と接近センサーや距離センサーを使った仕組みも試していて、正常に動作するところまでは確認できました。 そちらを採用しなかったのは、ドアの周りにセンサー類の配線がついてしまうのが微妙だったためです。 M5 Stack と 各種センサーの組み合わせのほうが省エネだし、よりレイテンシーも下がるのだけれど、Raspberry PiWebカメラの組み合わせのほうがお手軽感は格段に上です。

実際のところ最もお手軽なのは各種スマートロックをドアに付けてしまうことなのですが、インキーが怖いし、オートロック機能を使わないとしても家のカギを 第三者に預けるサービスは個人的な信条からちょっと利用したくないので今回は避けました。

おわりに

こういったものを作ろうと決めてからだとだいぶ時間がかかりましたが、機械学習モデルの作成部分だけなら特に悩むところがなくさすが Google のサービスだなーという感じでした。 一方でモデルを Raspberry Pi で動かすにあたっては tflite 形式だとうまく動かないとかハマリポイントもいくつかあり、こういったアプリケーションを簡単に動かせるようになるにはまだ少しハードルがあります。もうちょっと簡単にこういった仕組みが作れるアプリケーションがあっても良い気がするので気が向いたらつくろうかなあ。

2019年にやりたいことを100個書き出す

むらさきさん(id:interestor)が毎年書いている今年やりたいことリスト100が面白いよねという話で妻と盛り上がったので、二人でやってみた。 長女がインフルエンザにかかり、長女と次女を隔離しつつ、看病しつつ、保育するというタスクの合間にこれぐらいしかできることがなかったというのもある。

やってみたリストは下の方に貼るとして、先に感想を書く。

まず自分は、本当に自分のことしか考えてなくてスマン。妻は愛情に溢れたリストになっているのだが、僕のリストは完全に欲にまみれている。いや、書いてなくても例年プレゼントはしているし...すいませんでした。

やりたいことを100個書くということ以外はなんの制約もつけなかったので、二人の性格の違いが思い切り現れている。100個すべて書くまでお互いに見せず、ちゃんと分類までしてから共有したところ、方向性があまりに違って二人で笑ってしまった。100個書き出すのはなかなか大変で、自分が本当にしたいことって何だっけと考えられるのも良い体験だった。

自分のリストに少し補足を書くと、昨年ピアノを再開してとてもハマっているというのがリストにも現れていて、1割くらいがピアノ関係になった。このまま継続したい。仕事に関係することは、ここにはなるべく書かなかったので技術的な項目は少なめ。あと例年できてることは書いてない。

僕のリスト100

  1. (ここから趣味)小説を5冊以上読む
  2. LLVMを使えるようになる
  3. ガジェットを買う数を6個以下におさえる
  4. 一眼レフをもっと持ち出す
  5. 新しいプログラミング言語を1つ使えるようにする
  6. 一人旅する
  7. 温泉施設にいく
  8. アイススケートしてみる
  9. ポッドキャストを収録してみる(1回でもよい)
  10. 定期的に長めの文章を書く
  11. 子供のつきそい以外で映画を10本以上見る(映画館に限らない)
  12. 博士課程にケリをつける
  13. 航空部のOB会に出てみる
  14. 北海道でドライブする
  15. 車で実家に帰る
  16. 電子工作をからめてなにか一つ動くものをつくる
  17. 映画DBを作る
  18. 演劇を生でみる
  19. スポーツを生で観戦する
  20. PCを持ち歩かないで済むようにする
  21. 建築めぐりする
  22. 船で淀川を旅する
  23. 金沢周りで東京往復する
  24. 寝台列車にのる
  25. 一人で飲みにいく
  26. カートに乗る
  27. スキーのレッスンをうける
  28. ドローンを操縦する
  29. ゲームをつくる
  30. 軽い登山かハイキングする
  31. 高校の友人と飲む
  32. 大学の友人と飲む
  33. 50mmのレンズで練習する
  34. 海外に行く(仕事でも可)
  35. 押井守映画の未見のやつを全部見る
  36. 役に立たないものを作る
  37. テレビゲームを5本程度クリアする
  38. 文楽をみる
  39. 落語の定席にいく
  40. 写真を大きなサイズで印刷する
  41. 副収入を得る
  42. 3DCAD使えるようになる
  43. 3Dプリンタでなにか出力してみる
  44. アトラクション施設のVR体験に行く
  45. 楽器を作る
  46. (ここから健康関係)5%減量する
  47. 筋トレを始めて継続する
  48. スポーツジムに行く
  49. 親知らずを抜く
  50. (ここからピアノと音楽)ピアノの練習を継続する
  51. アコースティックピアノを買う
  52. 娘とピアノの連弾で発表会にでる
  53. 妻と合奏曲をちゃんと弾けるようにする
  54. ピアノサロン(練習室的なところ)に行ってみる
  55. シンセサイザーを買う
  56. 作曲してみる
  57. クラシックコンサートに娘を連れて行く
  58. 子供の伴奏ではなく人前でピアノを演奏する
  59. オフィスの電子ピアノを新調する
  60. (ここから買い物)スーツに合う靴を買う
  61. 靴下を買い揃える
  62. シャツを買い揃える
  63. (ここから家族のこと)PTA活動に参加する
  64. 妻と二人で夜飲みに行く
  65. 娘と泊りがけで二人旅する
  66. 家族でキャンプする(機材のレンタルやバンガローもOKとする)
  67. ディズニーランドにいく
  68. 自分の実家に家族で行く
  69. 妻の実家に家族で行く
  70. バーベキューする
  71. 子育てに貢献できるツールをつくる
  72. 実家にある写真をちゃんとバックアップさせる
  73. 花見をする
  74. 家族でプールに行く
  75. フォトブックを作る
  76. 写真館で写真を取る
  77. 貸し別荘で避暑する
  78. 子供と自転車で長距離を走る
  79. 管理釣り場的なところでマス類をつって食べる
  80. (ここから家のこと)エアコンをGoogleHomeで操作する
  81. プロジェクターをGoogleHomeで操作する
  82. 家の鍵を電子キーにする
  83. 家の管理用サーバーとして raspberry pi を運用する
  84. フライトマイルを真面目に貯めてみる
  85. ちゃんとお金の管理する
  86. AV機器をキレイにまとめる棚をつくる
  87. 記念日以外にも花を買う
  88. 家庭slackに機能を1つ以上追加する
  89. 壊れた椅子を直す
  90. サブスクリプションしているサービスを整理する
  91. (ここから食べ物のこと)大阪で美味い寿司屋をみつける
  92. おいしい緑茶を定期的に買う
  93. 妻とアフタヌーンティー(セット)かスイーツビュッフェを食べににいく
  94. 低温調理器で料理する
  95. おいしい肉料理のレシピを1つマスターする
  96. 新しい飲食店を5件以上開拓する
  97. おいしい紅茶をみつける
  98. 製パンのレパートリーを増やす
  99. おいしい洋菓子屋さんをみつける
  100. 豆を挽いてコーヒーを淹れるのを習慣にする

妻のリスト100

  1. (ここから家のこと)ソファーを処分する。
  2. 居間に本棚を置く。
  3. ビーズクッションを2つ置く。
  4. 良いカーペットを敷く。
  5. 花を育てる。
  6. 子供達だけの寝室を作る。
  7. 親だけの寝室を作る。
  8. 低床ベッドを買う。
  9. 子供達で管理できるものを増やす。
  10. 子供達の部屋のクローゼットの中身がなんなのかわかりやすくする。
  11. 廊下にある不要なものを処分する。
  12. コード、ケーブル類を整理する。
  13. 食事の前の準備を夫や子供達にさせるようにする。
  14. ランチマット常備する。
  15. プロジェクターを掃除する。
  16. エアコンを掃除する。
  17. 洗濯乾燥機の奥の埃を取る。
  18. 玄関に傘立てと靴以外置かないようにする。
  19. 裁縫道具の収納をきちんとする。
  20. 勉強道具の収納をきちんとする。
  21. アイロンビーズの収納をきちんとする。
  22. ファンルームの収納をきちんとする。
  23. 窓ガラスを拭く。
  24. 写真の整理をする。
  25. 今までの写真を元にアルバムを一年ごと作る。
  26. さっさと年賀状を書く。
  27. (自分のこと、勉強)手帳をちゃんと付ける。
  28. 手帳を見返すようにする。
  29. 消費税法を最後までちゃんとやりきる。
  30. 毎日少しでも消費税法を勉強する。(毎日が大事。)
  31. 本を12冊読む。
  32. その他に塩野七生ローマ人の物語を読破する。
  33. その他に塩野七生ギリシャ人の物語を読破する。
  34. 早寝早起きをする。
  35. 朝と夜寝る前にストレッチをする。
  36. 歯を磨いているときに腰の筋トレをする。
  37. 謙虚に人の話を聞く。
  38. 先に結論を伝え、順序立てて話をする。
  39. きちんと主語を伝える。
  40. 株価評価が一通りできるようになる。
  41. 組織再編について勉強する。
  42. 宅建士について一通り勉強する。
  43. 仕事の共有カレンダーを使いやすくする。
  44. 知らないことは知らないという。
  45. 知らないことを真摯に人から教わる。
  46. 毎日日経を読む。
  47. (ここから趣味)夫のパジャマを作る。
  48. 私のパジャマを作る。
  49. 子供達のお揃いの服を2着作る。
  50. 自分の服を2着作る。
  51. 夫のワイシャツを作る。
  52. 子供達にお揃いのブランケット(白い刺繍入)を作る。
  53. 使えるランチマットを作る。
  54. 公文の将棋ワークを3まで終わらす。
  55. 将棋ができるようになる。
  56. もうちょっといい将棋盤を買う。
  57. 西国三十三所巡りを始める。
  58. 札幌のスタバカップを手に入れる。
  59. クロール50m泳げるようになる。
  60. 平泳ぎが25m泳げるようになる。
  61. 夫のピアノ伴奏でクラリネットを人前で吹く。
  62. リッツカールトンのアフタヌーンティーに行く。
  63. 大人数でマリオパーティする。
  64. シフォンケーキが上手に作れるようになる。
  65. 家計簿をつける。
  66. ロクシタンのクリームを使う。
  67. ハーブを育てる。
  68. チューリップを育てる。
  69. アイロンビーズでマザー2のキャラクターを一通り作る。
  70. アイロンビーズピカチュウを作って長女とその友達にあげる。
  71. ファンルームでモンスターボール柄の腕輪を作って長女とその友達にあげる。
  72. 真田丸全部見る。
  73. サイコパス完全版全部見る。
  74. 大阪城を一人でがっつり見に行く。
  75. 大阪城以外のお城を一人でがっつり見に行く。
  76. クラリネットを週2回練習する。
  77. 月に1,2度プールに行って泳ぐ練習する。
  78. 花の図鑑を作る。
  79. 国旗を覚える。
  80. 漢検を受ける。
  81. 何も見ないでミッキーが書けるようになる。
  82. 何も見ないでミニーが書けるようになる。
  83. 扇町公園に生えている木の名前を調べる。
  84. (家族とのこと)長女に手品の舞台を見せる。
  85. 長女の宿題を見る時間を作る。
  86. 夫の話を静かに聞く。
  87. 家族でキャンプする。
  88. 家族でピクニックに行く。
  89. 夫に毎日ありがとうと感謝を伝える。
  90. 夫に毎日大好きと言う。
  91. 子供達にいっぱい読み聞かせをする。
  92. 子供達に毎日大好きと言う。
  93. 子供達が寝る前は抱き締める。
  94. 年末年始に家族で旅行に行く。
  95. 婚約指輪を綺麗にメンテする。
  96. 結婚記念日の該当する日(毎月22日)には、お花を飾る。
  97. お花と共にロウソクに火を灯す。
  98. お花と共に同様婚約指輪をする。
  99. 長女に数検を受けさせてみる。
  100. 家族でうどんを作る。

福島の日本酒をもらった

先日書いた日本酒の会ですが、おみやげもあって大七の雪しぼりを頂きました。

f:id:r_kurain:20160413173107j:plain 大七なのでこれも生酛作りで、ちょっと癖のあるというか、複雑な味わい。 味がしっかりしてるので、合わせるのもちょっと強めのブルーチーズでもいけるかなと思って試してみたところ。バッチリでした。

f:id:r_kurain:20160413173143j:plain このブルーチーズ、キャステロブルーっていうわりと定番な奴なのですが、スライスしてあって食べやすくて便利です。味もブルーチーズのわりに おとなしいので僕はすきです。

和食じゃなくても、日本酒けっこういけるという話を前に読んだので試して見たわけですが、うまくいってよかったです。 機会をみつけてまた日本酒いろいろ飲みたいけれど、子育て中はなかなか難しいですね。

福島のお酒が美味しかったはなし

先日 id:aliliput さんの招待で、福島の日本酒を飲む会に行ってきた。 これ関連のイベントで、つまりこの記事は福島のお酒のPR。 超絶偏食な私がグルメイベントに参加するのは、とても不安だったのだけど結果としてどれもおいしくてよかった。 良いお店とよいお酒に感謝したい。

さて、"もやしもん"は好きなので2回くらい通して読んでるので、ちょっとくらいの日本酒の知識はある。 しかしその程度で日本酒の会に参加するのはいかがという気もして、前から積読になっていた

白熱日本酒教室 (星海社新書)

白熱日本酒教室 (星海社新書)

を前日に読んでから参加したのだがこれは大正解だった。 呼んでくれた alilipat さんは日本酒が好きなあまりPR業を引き受けているという筋金入りの酒好きなので、 どの日本酒も丁寧な解説があったのだけど、この本を読んでから聞くと座学を実地で復習する感じの、よい授業になった。

さて食事と日本酒のラインナップである。

うすにごり生 辰泉

f:id:r_kurain:20160320155840j:plain いきなりうまかったなあこれ。ブルーボトル。青い瓶は再生ガラスでは作るのが難しくコスト高の瓶。 あえてそんな瓶をつかうお酒は自信作が多いのだとか。 うすにごりってのは、お酒の固形成分の除去がちょっと緩いやつで、ほんの少し白濁している。

f:id:r_kurain:20160320155843j:plain これに合わせるのが、イカ人参と、きのこ味噌と、里芋とじゃこのポテトサラダ。 イカ!椎茸!マヨネーズ!どれも嫌いなやつじゃん死ぬ!!とか思ったのだが、食べてみたらどれも美味しかった。 上に挙げた3つの食材って癖が結構強いので相性悪いと最悪なんですが今回のはとてもよかった。 イカ人参がとくに良かったですね、いっけん人参のきんぴら風なんだけど、噛むとイカの旨味が溢れてくるという。 日本酒に合う。この日の食事はどれも福島で一般的なお酒のアテだそう。

飛露喜 特別純米生詰

f:id:r_kurain:20160320155846j:plain わりと僕の思う日本酒らしい日本酒。辛口って言っていいはず。

f:id:r_kurain:20160320155850j:plain これは馬刺しと一緒に。 馬刺しもなー。数年前なら生肉恐怖で食べれなかったもんなー。 最近は赤身肉大好きなのでこんなに美味しいものはない。 馬刺しといえば、九州のイメージが強いけれど福島でも盛んに食べられているそうで意外な感じ。 これも日本酒にあう。

大七 純米生酛

f:id:r_kurain:20160320155853j:plain 生酛らしいちょっと複雑な味。これは燗で飲んだはず。 生酛っていうのはちょっと手のかかるお酒の作り方だけど、 この大七という酒蔵は全部その生酛でお酒をつくっているらしい。 燗で飲むと香りが強調されるので、おちょこを顔に近づけた瞬間にパッと来るものがあって美味しい。

大和屋善内 どぶろく

f:id:r_kurain:20160320155859j:plain 飲みやすいどぶろくでとても驚いた一品。 どぶろくって独特の匂いでちょっと敬遠したくなるのに、これはいい香りしか無くてとても美味しい。 固形のお米がまだ残ってるのでドロっとした舌触りと、発酵に由来するスパークリングが味わえる。 他のお酒とちょっと違う変わり種なのもあって、印象が強くまた飲みたい。 ラーメンで有名な喜多方で作ってるそうな。

f:id:r_kurain:20160320155857j:plain この辺で、鶏のもつ煮がでてきて、たいへん美味しかったです。 もつといいながら、入ってるのは鶏皮で甘じょっぱく煮てあってお酒がすすむ。 鶏皮も昔は歯ごたえが苦手だったんだよなあ...

会津中将 純米原

f:id:r_kurain:20160320155905j:plain 原酒なんで濃いんですが飲みやすいし、なんというかついもう一杯ほしくなる感じの美味しいお酒。 杜氏が女性っていうのでも有名なんだそう。 東京農大を出て杜氏になって震災を乗り越えてっていう"もやしもん"ばりのお話がこちらで読めます。

ししゃも、チーズの燻製セットといくらの大葉巻きが合わせて出ていて、サイコーでした。

会津純米酒

もうこの辺でかなり酔っぱらいなので、もううまいっすうまいっす。 って飲んでた。雑なレビューですいません。でもうまかった。

飲み方とか

こちらのエントリーにあるように、 水をいっぱい飲んでおくと過度に酔わないというのは有名なはなしで、 先の"白熱日本酒教室"にも書いてあるし、 良いお店は言わなくてもいっぱいお水を出してくれる。 今回のお店もすぐにボトルで水を用意してくれて、お酒にそんなに強くない僕でも楽しく飲めた。

5人で飲む会だったのだけれど、一つのお酒を2合ずつ頼んでもらったので、 一人おちょこで2杯程度で一つのお酒はおしまい。 いろんなお酒をちびちび飲めたので会の進行としてもとても良かった。 日本酒好きな友人を集めて同じような飲みかたをまたしてみたい。 というわけで皆さん大阪にお越しの際はご連絡ください。

日本酒について

僕の日本酒の原体験って、正月に電気ポットで出てくる匂いのきついお酒。 という印象なんであんまり好きじゃ無かったのだけれど、京都に住んでたころに美味しい日本酒を出す

馳走いなせや

食べログ 馳走いなせや

とか
両川

食べログ 両川

とかに出会いまして、とても好きになりました。 今回のお店

も品揃え、雰囲気、お料理どれもとても良かった。 いいお店にいって、料理にあうやつ適当に出してくれっていうと最高です。 ワインほど高くないのも良いところで、リーズナブルにいろいろ試せるのが楽しい。 また日本酒のみに行きたい。

CO2モニタリングのためにセンサーをHackした話

昨年末にこの記事を読んで以来、昼過ぎに眠くなるのは CO2 濃度のせいでは無いかと思い始め、CO2センサーへの興味が湧いて仕方がなっかのだが、CO2センサーはいかんせん高い。そう悩んでいたところ、格安のセンサーを見つけたのでUSBで値を取れるようにしてみた。

f:id:r_kurain:20160126163549j:plain

まとめ

  • CO2mini というセンサーは何処にも書いてないが、USBデバイスとして認識できる
  • gem を作ったので bundle install すれば Mac でも Linuxでも値がとれる。
  • 僕のオフィスのCO2濃度は別に高く無さそう。

センサー選び

CO2 濃度を計れるセンサーは、専門家向けのものが多く価格帯が高い。 PCから値を取ろうと思うと、手頃のなのは

たぶんこの辺で、HTTPで叩けるAPIもあるので悪くない。 気温や湿度もとれる。お金に困らないひとはとりあえずこれで良さそう。

だが 2万4000円もするし、最近売り切れてたりするので、本稿では www.monotaro.com

カスタム CO2モニター CO2-MINI

カスタム CO2モニター CO2-MINI

これを使う。モノタロウから買うと税抜き8990円 amazon などでは 13000円 くらいで手に入る。

何処にもUSBで値がとれるとは書いてないので不安になるが、 http://www.co2meter.com/collections/fixed-wall-mount/products/co2mini-co2-indoor-air-quality-monitor これと同じなので実はUSBで値がとれる。 ただし、いつUSB出力の機能がオミットされるかはわからないので自己責任で。あるいは販売店に問い合わせてほしい。

値のとりかた。

ruby スクリプトを作ったのでこれを利用してもらえればと思う。 github.com

$ brew install hidapi 
  # or apt-get install libhidapi-hidraw0 など Linux では環境に応じてHIDAPIライブラリをインストールしてほしい
$ git clone https://github.com/kurain/co2mini.git
$ cd co2mini/examples
$ bundle install
$ bundle exec ruby -I./lib examples/co2show.rb

これだけだと、コンソールに値が見えるだけなので、僕の場合はMackerel に流して可視化 and 監視してる。 co2post.rb を参照してほしい。

※gem 化の準備はしてるのに、git を勧めるのは依存してるパッケージにPRを送ってるけれど採用されてないから!

参考資料兼余談

本稿で使ったもの以外のセンサーについて。

USB で繋がるものや、センサー単体で販売しているものが

http://www.co2meter.com/collections/co2-sensors

このサイトに沢山ある。日本でこの価格帯でかつ、オンライン販売で売ってるセンサーはほとんどない。 このサイトで買うとすると、安いセンサーで$80、輸送費が$35くらいなので、14000円くらい。 キャリブレーションどうするとかいう不安もある。

USBプロトコルについて

co2mini から値をとるソフトウェアは co2meter.com から取得できる。が windows 版しかない。 ありがたい事にプロトコルを解析してる人がいて

https://hackaday.io/project/5301-reverse-engineering-a-low-cost-usb-co-monitor

にまとめてくれている。逆アセンブルして調べたようで、上記のサイトの記事は相当おもしろい。おすすめである。 コードも github にまとまっている

https://github.com/henryk/fhem-co2mini

さらにサイトのコメントを見てると、各言語にポートしてる人も居て

node.js

https://github.com/maddindeiss/co2monitor

C言語

https://github.com/dmage/co2mon

の実装があるので、ruby 版を書くのはわりと簡単な話だった。

HIDAPI

co2mini はHIDデバイスとして認識される。HIDはUSBデバイスのなかの一つのクラスで、汎用的なのでよく使われているようだ。 ただ、libusb というメジャーな USB ライブラリからは扱いが難しく、libusb のサイトでも HIDデバイスを扱うときは

HIDAPI

を使えと書いてある。HIDAPIは各OS(Linux, Mac, Win)でのHIDの扱いを抽象化していて、これを使えばOSをまたいで動く コードが書ける。今回 Mac で実験して、実運用は Raspberry Pi というのを考えていたので、こちらを採用した。 先に紹介した他の人の実装は、オリジナルのperlのやつとnode.jsの実装は Linux 環境のみを想定している、C言語実装のものは、HIDAPIを利用している。

ちなみに Linux には /dev/hidraw にHIDがマウントされるという、便利機能があって HIDAPI はこれを利用する。(libusbをつかう事もできる) Macの場合はIOKITに含まれるIOHIDから制御可能で、HIDAPIも利用してるっぽい。MacのUSBまわりはこちらが詳しい。

ruby_hid_api

HIDAPIのrubyバインディングruby_hid_apiruby_hidapi の2つがある。前者はFFIを使っていて、後者は拡張ライブラリ。 FFIを使ってるほうが、OSが違った時に動く可能性が高いので、私は ruby_hid_api を利用している。 HIDAPIの send_featurer_request 関数に対応する部分が未実装だったので、実装してPR出しているけれど 音沙汰がないのが残念。

プロトコルの実際

プロトコルの詳細はコード見てくれという感じなんだけれど、面白かったので少しだけ解説しておく。

co2mini では 'Feature Report' でデバイスを初期化する。初期化前には 'Input Report' (HIDAPIにおけるread関数)では値がとれない。 初期化時に8バイトの値(マジックテーブル)を渡すのだけれど、この後 Input Report で返ってくる値は、マジックテーブルの値と XORが取られていたり、ビットシフト が行われたりしていて、簡単な暗号化がされている。 co2mini.rb の _decrypt が復号化メソッドなので、詳細はそちらを参考にしてほしい。 他のUSBデバイスを知らないので、一般的な動作なのかわからないのだが、不思議な挙動である。

 def _decrypt(key, data)
    offset  = [0x48,  0x74,  0x65,  0x6D,  0x70,  0x39,  0x39,  0x65]  #"Htemp99e"
    shuffle = [2, 4, 0, 7, 1, 6, 5, 3];

    phase1 = shuffle.map{|i| data[i] }
    phase2 = (0..7).map{|i| phase1[i] ^ key[i] }
    phase3 = (0..7).map{|i| ( (phase2[i] >> 3) | (phase2[ (i-1+8)%8 ] << 5) ) & 0xff }
    ctmp   = (0..7).map{|i| ( (offset[i] >> 4) | offset[i] << 4 )  & 0xff }
    result = (0..7).map{|i| (0x100 + phase3[i] - ctmp[i]) & 0xff }
    return result;
  end

おわりに

f:id:r_kurain:20160126164444p:plain というわけで、co2 濃度の可視化と記録を始めてみた。近代的オフィスなので、空調がとまると濃度が酷いことになる。 普通の時間帯は、空調とまらないのでほとんど問題ない。

理想的なエンジニアでありたい

前回のエントリにかなり反響があって、友人達が数ブクマして終わりという想定もしていたので、少々驚いている。 エクスキューズを全く入れなかったのもあって、いろんな感想を持たれた。 フワッとした文章で論点もはっきりしてないので、 941 さんのブコメはもっともだと思う。

ただ、一番言いたかったことは、 "プライベートを犠牲にしなきゃ、理想的なエンジニアになれない" って発想が嫌だってことだ。

結構ブコメで"好きだからやっているんだ"っていうコメントが多くて、そんなのは僕も知っている。 僕もコーディング大好きで、なんの制約もなければ体力の続く限りやることもあるだろう。 自分の時間の内であれば、コードを書くのも勉強するのも犠牲なんて思わない。 でも、それでいいの? 持続可能なの?って話なんだ。

独身のひとは、好きなようにすればよいかと思う。その人だけの人生だし。 でも、テレビゲームしたり、漫画読んでる時間に罪悪感を持つようだと、ちょっと神経症っぽい。 過去の自分が一時期そうだった。

そして、家庭があると自分だけの人生だとは言っていられない。 僕は家族と仲良く暮らしたいし、仲が良いほうが自分の生産性が高い。

それでも、僕は理想的なエンジニアでいたいし、家族も大切にしたい。

実際そういう生活ができてるエンジニアも知り合いに沢山いる。 ただ、そういう人に限ってあんまりメディアに出てこないので、若いころの自分にはそういう発想がなかった。 土日もずっとコーディングするようでなくては、理想的でないのだと過度に恐れていた。 だから、過去の自分にはもっと焦らなくていいから、妻と新婚生活を楽しめと言いたいのだ。

少しだけ自分の話を書く。

僕がはてなに入った2009年ごろ、僕の先輩に当たる人は、CTOのid:naoya さんを筆頭に、id:antipopさん, id:secondlife さんなどインターネットヒーローがいっぱいいた。 みんな、よく勉強してるし、どうやって追いつけばいいのか、正直わからなかった。焦っていた。 一方で僕は婚約者と初めて同棲生活するという、人生の大イベントもあってそっちも大切にすべきだった。 そんな中で家庭を大切にしろ。といってくれる人は居なかったので、大変に妻に迷惑をかけた思いが、今もある。

人に認めてもらわなくても家族と居ればよかったし、過度に不勉強を恐れなくても、 余暇を含めて自分はそれなりにコードも書いていたし、 もっと安心して日々の仕事に打ち込んでいればよかったのだ。今思えば。

前回の記事は、そういう個人的な、過去への反省でもあったのだけれど、結構な賛同コメントももらえて とても助かった。ひどい誹謗中傷が来る想定もしていたし、実際きたのだけれど、 賛同してくれる人も居たので随分気が楽になった。本当にありがとう。

とにかく、そんなに焦るな、家庭も大事にしてOKっていう話なので、特にハードワークを否定したいわけでも、 勉強することを否定的に捉えてるわけでもない。 そういう誤解を含め、すべてのコメントにお返事したいところだが、さすがに多いし、読みたい人も少ないと思うので ある程度類型化してコメントしたい。

そもそも犠牲に思うような、おまえ(id:r_kurain)はエンジニア向いてないよ派の人へ

犠牲って言葉が強すぎるのだろうけど、自分の好きなことしていたって代償になって しまうことはあると思うんだが。家族との時間だったり、ヘタすると健康だったり。 それを代償と思うなっていうのはちょっとブラックではないかな。

それ女性にも言えるの?というコメントでもある。 プライベートを代償にしたくない、っていうだけで向いてないって言われるのでは、 子供を作りたかった場合、女性は時間の制約が多いのにどうすればいいんだろう?

僕は、普通に業務に真剣にむかっていれば、ちゃんと成長できる業種になるのが良いと思っている。

プログラミング好きじゃない、おまえはエンジニア向いてないよ派、あるいは、趣味と仕事が一致してないやつは向いてないよ派の人へ

好きなことだって、趣味だって、それだけずっとできるわけじゃないんだよ。 家族ができるとか、違う趣味見つけちゃうとか、親の介護が始まるとか、ありえるイベントはいくらでもある。 そういう時に向いてないからやめたらっていうのは、どんだけエンジニアの数減らしたいんだろう。

それに、有能な人に限って、プログラミング以外の趣味も結構あったりする気がするんだけど。

できない同僚と仕事するの辛いから、ちゃんと勉強してくれ派

そうなんでしょうね。僕はあいにくできない同僚に遭遇したことが無いもので。

そもそもポジショントークだよ派の人へ

はい、全くそうだと思う。過去の自分はそれを差っ引いて聞くべきだった。 "こうでなくては"っていう職業観がこんなに強く発信されている業種を、僕は他に知らない。(ラーメン屋とか?) "研究者"なんてみんな他人の研究には興味あるけど、働き方に興味はないように見える。 今の職場もそういう話をしたこともない。 (だから現職とか前職の人には全く話が通じてない気がする。どうしたの?って感じだと思う。)

ミュージシャンとかスポーツマンと一緒だよ派の人へ

まあ、一緒な人も多いと思う。自分も好きなこと仕事にしたわけだし。 しかし、円谷幸吉さんとか知ってる?思いつめるのは良くないよ。環境が悪かったら最悪だ。

まとめ

それぞれのポジションがあるので、勉強し続けろって言い続ける人も居るのはわかる。 それを真に受けすぎた、若い自分が馬鹿だったな、と思うところもある。 当然、まじめに勉強しといてよかったなーと。思う部分もある。

ただ、それにしたって、良い職場でちゃんと働いてれば、良いエンジニアにはなれるよ!

DHHはプロ顔負けのレーシングドライバーだし、ポール・グレアムだって、美大に通う時期はあった。 吉本隆明は10年働いたら、だいたいみんな一人前になれるって言ってるじゃないか。 先端に置いてかれる事なんて気にしないで、好きなことをすればいいんだと思う。 プログラミング以外にも。あればね。