Mac に給電しつつ 4k ディスプレイに 60Hz で出力したい

仕事で外部ディスプレイを使っているが、移動時にケーブルの抜き差しがめんどくさい。自席から離れるときに電源とディスプレイケーブルを抜いて、戻ったら挿して... せめて抜き差しを半分にしたくて、USB-C Power Delivery に対応しつつ HDMI 出力できるアダプタがほしい。

たまたま持っていたものを使ってみたけど違和感が大きかった。エディタのキャレットを動かしたらちらちらするし気分が悪い。そのアダプタを通して 4K に出力するとリフレッシュレートが 30Hz になっていた...

外部ディスプレイのリフレッシュレートは以下で調べられる

  • メニューバーの 🍎
  • この Mac について
  • システムレポート
  • グラフィックス/ディスプレイ

f:id:pokutuna:20191125194949p:plain
リフレッシュレート

そういう商品を5月頃に探していたけど、4K ディスプレイに60Hz で出力できるものがあまりなかったり高かったりした。

最近調べたら安くていいやつがあったので購入した。60W 給電もできるらしい。

f:id:pokutuna:20191125195903j:plain
アダプタ

感想は

  • 小さい、想像の半分ぐらいの大きさ
  • たしかに 4K に 60Hz で出力できる
  • バッテリー充電中はかなり熱くなって不安


CHOETECH USB C to HDMI 変換アダプター PD(充電) 対応 USB C ハブ 4K/60Hz対応 Thunderbolt 3 & USB C デバイスに対応 18ヶ月安心保証

わりとまんぞくです。

golang/go へ PR したよ

コメントの修正なのでたいした変更でもないのだけど、記念に記事を書いておく

github.com

github.com

net/httpTimeoutHandler 周りを眺めているとこの記述に引っかかった。

TimeoutHandler supports the Flusher and Pusher interfaces but does not support the Hijacker interface.

以前、 TimeoutHandler を使いつつ、少しでも速くクライアントへレスポンスを返したくて、先にレスポンスを返してそのあとログを書いたり後処理をするというコードを書こうとして、このあたりを調べた記憶があった。へーこの前はできなかったのにできるようになったのか、と思って眺めたものの Flush() メソッドが見つからない。ちょっとコードを書いて type assertion してみても ok ではない。

git log -p src/net/http/server.go を読んでいく

github.com

この revert のきっかけになった issue にあるように、Flush() すると単に TimeoutHandler のラップしている ResponseWriterFlush() を呼ぶだけで、設定したステータスコードは無視されるし、タイムアウトしても 503 が書かれない(response.WriteHeader が複数回呼ばれた警告が出る)。

しかも TimeoutHandler は内部でバッファを持っていて ServeHTTP の終了を待って ResponseWriter にコピーする実装なので、Flush() を呼んでも期待するようにクライアントへレスポンスが Flush されるわけではない。Header と Body はひと組で扱うものなのに、Flush() 呼べたら Flush するという従来の挙動は乱暴だしいかにもうまくいかなそう。 https://github.com/golang/go/blob/go1.13.3/src/net/http/server.go#L3237

ということで、TimeoutHandler.Flush() は revert されてしまったけど、コメントはそのまま残っていた。

PR 作る

すわプルリクチャンス、コメントなおすだけで golangリポジトリに名前載せられるぞと思ってトライした。

golang.org

Contribution Guide を読んで言う通りにする。
Google アカウントで Contributor License Agreement に同意したり、Gerrit にアカウントを作る。Gerrit よくわからないので、普段親しんでいる Github で PR を作って送る。

とにかくレビューしやすいように、ISSUE_TEMPLATE を埋めながら、上に挙げたようなタイムラインを示して、Playground に再現コードを書いて、issue を立てる。コミットログを漁って空気を読んだコミットメッセージを書いて、Fork したリポジトリへコミットして Pull-Request を作っておくる。PR のテンプレートにもいろいろドキュメントがあるのでそのとおりにする。同名のリポジトリの issue を参照する場合、Fixes golang#35161 のように {user_or_org}#{issue_num} で参照できるの知らなかった。

PR を送ったらあとは bot が Gerrit へ同期してくれる。https://go-review.googlesource.com/c/go/+/203478/

特に指摘もなく、寝ているうちにマージされていた。めでたしめでたし。

従来は Gerrit のワークフローで敷居が高かったけど、Github になってだいぶ簡単になったみたい。Contribution Guide にあるように、マージされると間のコミットは squash され、Pull-Request の Title と Description が最終的な1つのコミットメッセージになる。

Nature Remo センサー値を Mackerel へ送り侵入警報を作る

このまえ Nature Remo を買ったので作った、似たようなことは既に誰もがやっているけど

f:id:pokutuna:20191009000228p:plain

構成

Cloud Scheduler -> Cloud Pub/Sub -> Cloud Functions
  • Cloud Scheduler が定期的(ここでは5分おき)に Pub/Sub へメッセージを投げる
  • Pub/Sub を Subscribe した Cloud Functions がメッセージが来るたびに起動する
  • Nature Remo Cloud API の値を整形して Cloud Functions へ投げる

使い方はリポジトリを見てください

github.com

無料枠に余裕で収まるけど、この中では Cloud Scheduler の無料枠が厳しいかな、3 つを超えると課金される。Cloud Functions で外部アクセスをするには請求先アカウントの設定が必要だけど、まず請求されることはなかろう。

家に複数の Nature Remo を並べるのを想定して、natureremo.{sensor}.{リモコン名} メトリックを送っている。名前がMetrics に使える文字(英数のみ)から成る文字列ならそのまま使い、だめならデバイスIDを送るようにしてる。

API で取得できる人感センサーの値はちょっと変わっていて、val には常に 1 が送られていて、最後に検出した時刻が created_at として得られる。この function では 5 分以内に検出されてたら居るとして 1 を、なければ 0 を送るようにした。

侵入警報

センサーの値を Mackerel に送るとおもしろいけど、常に家に居るわけでもないし、湿度や気温を監視してもしょうがないよな。

と思っていると最近ダウンタイム機能が追加された。

mackerel.io

ダウンタイム機能は期間を指定して Alert の発砲を止めることができる。本来は定期メンテナンスウィンドウとかを設定しておくものなんだけど、これを使って 家に居る時間帯 をダウンタイムとして人感センサーの監視を作ると、特定の時間帯だけ部屋への侵入者を検知して Alert を飛ばすことができる。

まず適当に人感センサーの値の監視を作る。送られる値は 0 か 1 なのであまり warning と critical の閾値に意味はない。

f:id:pokutuna:20191009002639p:plain:w336

この監視ルールに対してダウンタイムの設定をする。
繰り返し間隔を指定して、複数個作れるので、家に居る時間帯をカバーするようにダウンタイムを作ろう。

  • 定時から次の日の13時(寝坊したり遅れたりするからね)
    • 適当な日の 19:00 から 18 時間をダウンタイムとして、1日ごとに繰り返す
  • 土日
    • 適当な日の 00:00 から 24時間をダウンタイムとして、1週間ごと土日のみにする

f:id:pokutuna:20191009003429p:plain

これで家に居ない時間帯だけ、人感センサーに反応があれば Alert を飛ぶようになる。有給や祝日は飛ぶけど、そのときは mute したりしてください。

僕は LINE Notify で送っている。これは有給の日に昼過ぎに起きて布団の中で転がった動作が検出された様子。

f:id:pokutuna:20191009003821j:plain:w336

mackerel.io

Nature Remo 便利だし、スマートスピーカーと連携させずとも iPhone から便利に呼べるので大変よいです。ちょっとした値段の差だしいっぱいセンサーがついている mini じゃない方のほうがおもしろい。

赤点滅

Q4-2. Nature Remoが赤点滅して正常に動作しない — Nature

Nature Remoが赤く早い点滅(1秒間に数回の点滅)になっている場合は、Nature Remoがクラウドと通信できていない状態

とのこと、Nature 側のサーバーが不調なのかなと思ったけど Twitter を検索しても似たような人はあまりいない(数人は居る)。他の機器では普通に外部と通信できてるので、Remo 本体か Nature 側が悪いだろ〜と思いつつ書いてあるとおりルーターを再起動したら復活する。何度か本体セットアップしなおしてもだめだったのに... 2 日連続で起きて困っていたけど、ルーターファームウェアをアップデートしたり時計がずれているのを直したりしたら3日目は起きなかった。