houseTemperatureプロジェクトの大詰め

自分の家の天気(気温・湿度・気圧)をRaspberry Piから5分ごとにサーバに送り、それを使っていろいろ遊ぶプロジェクト(github)もそろそろ大詰めだ。使用技術はScala + Play Framework。開発環境にもデプロイにもDockerを利用している。サーバはこのブログと同じさくらのVPSで、nginx-proxyによってサブドメインgyokuroへのアクセスを振り分けている。

ドキュメント

ベースURLはhttps://gyokuro.chao.tokyoで、現状公開しているリソースは以下のとおりだ。

例:
{"status":"200","data":{"time":"00:25:00","temperature":27.7,"humidity":76.7,"pressure":1001.6}}
例:
{"status":"200","data":[{"time":"00:00:00","temperature":27.6,"humidity":76.8,"pressure":1001.7},{"time":"00:05:00","temperature":27.6,"humidity":77,"pressure":1002},{"time":"00:10:00","temperature":27.8,"humidity":76.3,"pressure":1001.9},{"time":"00:20:00","temperature":27.8,"humidity":76.5,"pressure":1001.7},{"time":"00:25:00","temperature":27.7,"humidity":76.7,"pressure":1001.6}]}

iframe化の苦労

WordPressは自由なhtmlをウィジェットに追加できるので、iframeを使って/temperature/nowを常に表示しようと思った。しかしPlay FrameworkはデフォルトでX-Frame-Options: denyが設定されているのでiframeに表示されない。これはクリックジャッキング防止のためだ。クリックジャッキングというのは僕のサイトを透明なiframeにして他のサイトの上に重ねて表示させることで、僕のサイトの任意の箇所を不正にクリックさせる手口だ。

MDNにしたがってX-Frame-Options: allow-from https://example.com/を登録しようと思ったのだが、なんとChromeは対応していない。ブチギレてる。対応してないということで無視されているのでとりあえず動いてはいる。ユーザーがクリックできる箇所はないのでたぶんオッケー(ホンマか?)。

iframeが表示されるようになったはいいが、黒背景に黒文字で表示されていて読めなかった。WordPress側からiframe内のstyleを操作するのは無理っぽかったので上記の通りクエリパラメータで白文字化できるようにして対応した。

頑張って作ったので適当にAPIで遊んでみてください。グラフ化するやつ作ってほしい。

ちなみに現在の状況は27.8 ℃、76.1 %、1001.4 hPa。肌がべたつきやや不快だ。今夜から明朝にかけてすごい降るらしい。通勤はできるかな?

きのこの山/Scalaでアンパックもどき

きのこの山

きのこの山というお菓子を何かと比較する不遜な輩が多くいるようだ。

きのこの山はチョコレートとカリカリが分離している。万事において分離しているというのは大事なことだ。均質ではなく、高いエントロピーの中で異質なものが混じり合う中にこそグラデーションが生まれる。そしてグラデーションの中にこそ精妙な味わいが生まれてくる。

カレーをかき混ぜてはいけないし、丼料理をつゆだくにしてはいけないし、醤油にわさびを溶いてはいけない。それが俺の美意識。

Scalaでアンパックもどき

関数に複数の引数を渡すとき、コレクションをそのまま渡したいことがある。たとえばPythonであれば*を使ってアンパックできる。

Scalaでこれをやりたくで3分ググったところη-expansionを使った方法が見つかった。

(plus _)plusメソッドを関数に変換した後、さらにtupledメソッドによって1つのタプルを引数とする関数に変換している。

正確にはアンパックではないことに気づき、タイトルに「もどき」をつけた。

スマホを買い換えなかった

僕のAndroid端末のツイッターアプリは長いツイートが勝手に省略されてWeb版に飛ばないと続きが読めなかった。アンケートも表示されなかった。さらに最近はツイートをタップしてもリプライチェーンが表示されなくなった。

Androidのバージョンが6.0で古いからアプリが更新されていないと思っていたのだが、確認してみたらなぜかアプリの自動更新がツイッターには効いていなかっただけで、手動で更新したら5系から8系に一気に上がった。上記の問題も全部解決した。Androidのバージョン起因と思い込んで端末買い替えの情報収集をしていたが必要なくなってラッキー、ただしちょっと残念な気持ちもある。新しいスマホ使ってみたかったので。

歴代の携帯電話を紹介するか。

SoftBank 840P(2010.4〜2015.3)

高校入学時に購入。直接のきっかけは部活の連絡網がメーリングリストだったこと。家族や部活、クラスメイトとのメールに重宝した。一応web閲覧もでき、Yahoo地図やYahoo時刻表には助けられた。毎月の料金は端末代980円を含んで3000円前後だったと思う。

LINEが入らなかったせいで大学1年生のクラスや大学3年生の学科とのコミュニケーションに大きな支障を来した。

バッテリーが死に、その頃には古すぎてどこの店舗にも替えパーツが売ってなかったせいで起動すらできなくなった。が、電源ボタンを1時間くらい連打したら一瞬起動したのでその間に電話帳などはサルベージした。

iPhone6(2015.3〜2017.4)

先代の反省から広く流通しているモデルを、ということでiPhoneにした。スマホになったおかげでツイッターができるようになった。Ingressもやりはじめた。

月額料金は2GBプランで端末代含めて8000円程度。高えよ!!SoftBankへの怒りが蓄積した結果、2年縛り終了後即座に交代の憂き目に遭う。というのも買ったタイミングが絶妙に早すぎてSIMロック解除の対象にならなかったので、キャリアを変えるならこの端末は使えなかった。

FREETEL REI(2017.4〜)

安さを追求しMVNOへ。端末は一括購入で25000円くらい。AndroidはiOSに比べて痒いところに手が届く感じがあり気に入った。明るさの自動調整やアプリの自動更新など。端末自体は低スペックなのでGPSで発熱するとかカメラが不調で再起動しないと使えないなどの不具合はある。

SIMはFREETEL。毎月1〜2GBの使用で料金は1000円〜2000円程度。安いのだが安すぎたのか潰れて楽天モバイルに吸収された。ユーザーの僕には特に影響はない。今回は買い換えを見送ったがバッテリーがだいぶ怪しくなっているのでもう長くはないと思っている。

自己管理とサーバ管理

昨日急に健康意識が高まったのでスマホにGoogle Fitを入れた。万歩計のすごいやつで、歩行以外の運動も記録できる。僕は歩くのが早いので通常歩行が強めの運動に分類され、10ポイントが目標のところ43ポイントだった。歩数は6369歩で消費カロリーは1454kcalだった。

早歩きでポイントが貯まると聞くと無意味に早歩きして帰ったし、普段帰りはエレベーターで4階まで上がるが今日は階段で上がった。数値化して可視化することには強い力がある。

気に入らないのはGoogleのアプリだということだ。Googleに情報が集中する現状は気に入らないが、彼らが最も優れたIT企業であることは間違いない。最低限の機能の万歩計くらいなら自分でも作れるだろう。でも運動の激しさを判定したり位置情報と連携したりといった高度な機能を高精度で作れる気はしない。

ブログを書こうと思って管理ページにアクセスしたら異様に重くなっていた。サーバにssh接続してvmstatを実行するとディスクアクセスが多い。さらにtop -b -d 1 -n 1を実行するとCPUを占拠しているのはjavaだった。理由のアタリはついていて、昨日playのアプリケーションをDockerでデプロイするときに起動コマンドをsbt ~runにしてしまっていた。~をつけるとファイルが変更されるたびに自動で再コンパイルを行う。外すと負荷は収まった。

『アイ・アム・マザー』を見た

※この記事は『Asahi DRY ZERO』を飲んで書かれた(!)。

ブラウザをVivaldiに切り替えることにした。Chromeの独自機能は使えなくなるのでパスワード管理をBitwardenに移行し、いろいろなサービスのパスワードを登録していった。その作業中にNetflixを開いたら面白そうな映画がサジェストされ、そのまま一気に見てしまった。

アイ・アム・マザー』はつい最近Netflixで公開された映画だ。

人類滅亡後に始まったヒト再生作業。そのすべては、1人の少女から始まった。そして、彼女はアンドロイドを母と呼ぶ。

冒頭、保存されていた胚が育成機に入れられ、女の子が誕生する。その子が機械で完全に制御されたシェルターの中でアンドロイドの「母」に育てられるシークエンスが素晴らしかった[note]冒頭8分くらいまでなので見てから読んでもらったほうがいいかも知れない[/note]。なおキャラクターに名前はないので「母」「娘」と表記する。

「娘」が泣き止まないときは「母」の腕に埋め込まれた音楽プレイヤーで子守唄を流す。どの曲が気に入るかわからないので少し聞かせては別の曲に切り替えていく。一緒に折り紙をすると「母」は素早く複雑な動物を折るが、「娘」は下手だ。しかしこの巧緻も人間とロボットという対比にならない。なぜならシェルターには「娘」と「母」しかいないからだ。一個体ずつしかいないのだから「娘」と「母」の違いにしかならない。

泣き止まない「娘」に人形を与えるときに、「母」が人形を飾り気のないビニールの包装から取り出すシーンも印象的だ。布で作られた人形は「母」やシェルターの内装とは全く違う質感を持っている[note]直後に「娘」が機械の体の「母」に抱かれているカットにつながる落差がすごい[/note]。そんな柔らかで情緒的なイメージを持つ人形というアイテムすらここでは消費される道具であり、機械によって必要となることを見越して備蓄されていたのだ。

僕は普段から人間の価値を疑っている。人間は自然の法則に従ってタンパク質やら何やらが組み合わさっただけの存在であって、その行動も全て自然の法則から演繹的に理解可能だ。ただそれが複雑すぎて「まだ」解明できていないにすぎない。つまり科学のレベルを上限値まで引き上げていいSF作品ならば人間を完全に理解し管理することは可能だ。[note]ちなみに大学院の指導教員に「いずれ人間は完全に理解されるのではないか」と質問したら「そんな世界で人間は生きられるのだろうか」と答えられたことは強く印象に残っている。[/note]

アンドロイドが子育てをするシーンは、そしてもっと広く言えば機械化されたシェルターで人間が生きるという描写はまさにそれだ。機械化とは合理化であってそこでは必要なものと不要なものが峻別されるのだが、その過程で「必要とは何のための『必要』なのか」という疑問に巻き戻される。その疑問に無理やり答えを出そうとすると、人間存在に目的を設定し、手段として扱うことになるだろう。(たとえば家畜には肉や卵を生産するという目的がある。それができなければ殺しちゃうよね)。誰かがこんな話をしていたと思って軽くググったらカントだった。

本作で言えば優しい子守唄も楽しい折り紙遊びも健全な成長という目的に回収される。「娘」の育成にはさらに隠された「目的」があるだがそれは自分の目で確かめてほしい。

僕は職業柄技術ファーストでものを考えがちだが、倫理的な視点も兼ね備えていないと人間にできることの幅を広げても人間を幸せにはできないのかもしれない。

目的のない行動をとれる不合理性こそが人間らしさである、そう結論づけるのは簡単だ。しかしNetflixのAIにレコメンドされるままに映画を見て感想を書いている(書かされている?)僕にそれを言う資格があるのだろうか。

ラーメンを食べられなかった

※この記事は『金麦』を飲んで書かれた。

今日は仕事がしんどかったので帰りに不健康なラーメン(僕の中ではこの言葉は家系ラーメンを指す。なぜなら二郎系は野菜たっぷりで健康的だから)を食べて帰ろうと思った。同僚が「この辺にぃに美味いラーメン屋、あるらしいっすよ」と言っていたのでそこに行った。しかし残念なことに夜はライスが有料だった。

僕は家系ラーメンではライスは2杯〜3杯食べる。にんにく系の味と豆板醤系の味をそれぞれ楽しみたいからだ。

結局ラーメンは食べずに帰宅して焼きそばを食べた。最近は粉ソースではなくさらなる高級感を求めて液体ソースを使っているが、これも特段美味いということはない。そもそも相当な量を入れないと味がしない。そしてコストパフォーマンスが低い。

温度記録サーバはとりあえず公開できた。僕の自宅の気温・湿度・気圧を記録し続けるだけのサービスだ。

https://gyokuro.chao.tokyo/temperature

ちなみに過去ログには以下のような形式でアクセスできる

https://gyokuro.chao.tokyo/temperature/1994/05/17

サーバはScala + Play FrameworkをDockerでデプロイ、センサはRaspberry Pi + BME280でPythonのRequestsライブラリを使ってサーバにログを送信している。計測環境は鉄筋コンクリートでエアコンや換気扇で温度管理していて、Homo sapiensが1匹住んでブログを書いたりしている。

仕事が始まり始めた

※この記事は『金麦』を飲んで書かれた。

配属されたのでぼちぼち仕事っぽい仕事をしている。ただしまだ軽い仕事を回してもらって手順を覚えている段階なので「仕事を始めた」と言えるほどのことでもない。一日中パソコンを触ってお給料を発生させる気分は最高だ。

帰宅してScalaで書いている温度管理サーバの作業を進めた。ScalaはJavaの上に作ることで構造が汚くなっている部分もあるが、Javaの財産を活用できる恩恵は大きい。

本格稼働ではないがサーバに載せた。載せたはいいがディレクトリトラバーサル(←このまえ習った)食らいそうなAPI設計なので安全が確認できるまでURLは秘密です。ひさびさにnginx_proxyの設定を思い出す必要があった。地味にdocker-composeは使ったことがあってもただのdocker runは全然したことがなかった。とは言っても記法が違うだけでやれることは似たようなものだ。環境変数を指定したり、ポートを開けたり、ボリュームをマウントしたり。

こんなコマンドを書いたわけだが-eを連打するくらいなら当然.envファイルを使うべきだ。というか自分でDockerfileを書いてイメージを作るべきかもしれない。

梅雨だ。通勤ルートに徒歩の部分が多いので憂鬱だ。傘を差していても靴は濡れるのでいっそのこと長靴で通勤して会社で履き替えようか。なんて考えているうちに梅雨が明けてしまいそうだ。水筒だって買ったはいいが配属されたら近くに給茶機があるので必要なくなってしまった。トイレに行って帰りにお茶を汲んでくると、自分が単なる濾紙になったような気分になる。人間は情報を取り入れて適切に運動するだけの機械なので似たようなものだが。ステートフルかどうかは議論の余地がある。

『UNIXという考え方』を読んだ

※この記事は職場のバーベキューで酒と肉を腹いっぱい詰め込んで書かれた。

↑先輩社員からドワンゴエンジニア焼きそばの焼き方を伝授された。

うたもくプロに『UNIXという考え方』を貸された(事実としては僕が借りているのだが、僕ではなく彼の意思によってそれがなされたとき、どういう日本語で表現するのが適切なのだろう)ので読んだ。

素晴らしい本だと思う。細かい内容については自分で読んでほしいが、2001年出版にもかかわらず、2015年頃からの知識しかない僕にも納得できる内容ばかりで興味深い。名著は錆びない。

たとえば第3章で語られている「試作と試行錯誤を早く回すことで変化の激しい世界に対応する」という発想はアジャイル開発の思想だ。第6章の「すべてのプログラムはフィルタである」という主張は関数型プログラミングのことだし、第7章のマルチコアCPUが出てくるから並列化しろという主張はここ2年ほどのIntel・AMD両社の多コア化の流れを予言していたかのようだ。

実際のところ、この本が未来を予言していたのではなく、ずっとそういう流れ(アジャイル開発・関数型プログラミング・多コア化)は存在していたのだろう。僕が知らなかっただけだ。それでも、現在存在する技術が18年前はどう見られていたのかというストーリーは面白いし、その技術の価値を見極める助けになる。

Dockerコンテナ内で作ったファイルの所有者はrootになる

※この記事は『プライムリッチ』を飲んで書かれた。

『プライムリッチ』はアルコールが6%で重い。しばらく昏倒していて起きて作業している。

室温記録システムのサーバをScala+Play Frameworkで作っている。サーバ環境のもろもろの事情と技術的興味でDockerで環境構築をしたいが知見が少ない。参考にしているのはこれだ。

一点ハマりポイントを発見したので共有する。『プロジェクトの初期化』の節の内容を実行するとホスト側にプロジェクトが生成されるが、これらのファイルは所有者がrootになっているのでchown -Rしないと編集できない。永続的に解決したいのなら参考はこのあたり

てかこれ当該記事のコメント欄に書くべきだな…Qiitaアカウント作るか。Qiitaアカウントを持っていないのは必要になったことがないからだ。自分で発信プラットフォームを持つことには価値があると思っているけど、Qiitaが潰れる可能性と僕がさくらインターネットに972円を払い忘れる確率だとどっちが高いかな。後者だね普通に。

『らーめん 谷瀬家』でにんにくを補給した/Dockerなんもわからん

『らーめん 谷瀬家』でにんにくを補給した

健康に悪いラーメンが食べたくなったので社内チャットで「健康に悪いラーメンが食べたい」と発言したところ、上司から『らーめん 谷瀬家』を勧められたので同僚と4人で行ってきた(ここで急に日本語入力ができなくなり、しばらく手間取った。たぶん変なショートカットキーを偶然押した)。

家系ラーメンとしてはオーソドックスな構成で、油がいい感じ(?)でスープをつい飲んでしまう。家系と言えば卓上調味料で自分だけのご飯の食べ方を開発するのが楽しみだが、谷瀬屋には一味唐辛子の醤油漬けが置いてあり、パワフルな辛さが楽しめた。これまで行ったことのある家系ラーメンの中で一番好きだった。

以前住んでいた家は近くに家系ラーメンがあってよく行ったが、今の家に来てからは一度しか行っていなかった。俺にはにんにくが足りてなかった。にんにくをドバドバ入れながらご飯を2.5杯食べて大満足だった。

Dockerなんもわからん

Docker-Composeに頼りすぎてDockerfileの書き方を全然知らない。作成中の室温記録アプリのバックエンドをDocker上にPlay Frameworkで作ろうと思っているのだが(Dockerじゃないとサーバですでに動いている他のプログラムとの競合が面倒)、都合のいいDockerイメージが存在せず知見も少ないので手探り状態だ。コンテナ内でサンプルサーバを起動してもすぐに停止してしまう。