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

きのこの山

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

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

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

Scalaでアンパックもどき

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

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

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

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

自己管理とサーバ管理

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

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

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

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

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

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

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

僕は家系ラーメンではライスは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を書いてイメージを作るべきかもしれない。

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

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イメージが存在せず知見も少ないので手探り状態だ。コンテナ内でサンプルサーバを起動してもすぐに停止してしまう。

財テク/初のOSSコミット/オイスターソース舐め妖怪で学ぶ共変・反変

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

財テク

最近はお金のことばかり考えている。どのような税金が引かれているのか、確定拠出年金はやるべきか、学生納付特例で払わなかった年金は追納すべきか、貯金は普通預金か投資信託か。正しい戦略を立てないとこれからの人生で大きなロスをしてしまうという危機感がある。

なおこの記事やリンク先の記事の正しさは保証しない。その能力が僕にないので。

確定拠出年金

やる。今年は様子見で小さい額にしたが、来年からはできる最大額を突っ込むつもりだ。自分で運用するのと大きく違うのは節税効果であり、確定拠出年金への拠出は所得控除の対象となり課税されない(所得税住民税)。拠出した額の3割くらいの節税になる。

年金の追納

やらない。年金制度が現状維持すると仮定してもそれほどインパクトのあるメリットは出てこないし、現状維持できるとも思えない。

あてにしちゃダメって言われても年金天引きされてるんですが…

以下参考。お金の話ではポジショントークではない文章を探す方が難しく信頼性の低い記事だが、知識のない僕が自分で考えるよりはマシだった。

貯金

運用は投資信託を考えているが、これは長期的にやるものであっていつでも引き出して生活資金に充てられるものではない。調べていくうちに生活防衛資金という言葉を知った。とりあえず貯金用の普通預金口座(元本割れがなくいつでも引き出せることが重要)を作り、そこに月収の6ヶ月分の貯金を作れたら余剰金で投資信託を始めようと思う。6ヶ月分というのは感覚で決めたが、歳を取って健康のリスクが増大したら増やす必要があるだろう。

初のOSSコミット

Dota2の情報サイトにOPENDOTAというのがある。オープンソースだ。そこに日本語訳の不十分な箇所や間違っている箇所があったのでプルリクエストを送ったところ、すんなりマージされた。日本語話者にとって翻訳の修正というのは最も手っ取り早くOSSに貢献できる方法だろう。機能面でも改善できる箇所があるのでこの調子でやっていきたい。

オイスターソース舐め妖怪で学ぶ共変・反変

普通のソース焼きそばに飽きてきたのでオイスターソース焼きそばを作ろうと思ってツイートしたら、ゆーちきプロから怪文書が送られてきた。

これはプログラミングにおける共変という概念だ。「A <: B」はAがBを継承していることを表す。大雑把に言えばAの代わりにBを使えるという意味だ(実際はこの文脈ではオイスターソースはソースの下位分類ではないが、それは忘れよう)。横棒は上ならば下という前提条件を表す。

さて、上記ツイートは妥当だろうか。つまりソースの種類と、それを使った焼きそばは共変だろうか。(なんでもいいから)ソースを求められた場面でオイスターソースを使うことはできる。何でもいいからソースがかかった焼きそばを出せと言われたときにオイスターソース焼きそばを出してもまあいいだろう。だから共変。

反変という概念もある。オイスターソースがソースを継承しているという前提条件はそのままに、オイスターソース舐め妖怪とソース舐め妖怪の関係を考えてみる。

  • オイスターソース舐め妖怪はオイスターソースだけ舐めることができる
  • ソース舐め妖怪はソースならなんでも舐めることができる

このとき、どちらがどちらの代わりになれるだろうか。もちろん「ソース舐め妖怪がオイスターソース舐め妖怪の代わりになれる」が正しい。つまりソース舐め妖怪はオイスターソース舐め妖怪を継承している(と解釈して問題が生じない)。

オイスターソース <: ソース
---------------------------
ソース舐め妖怪 <: オイスターソース舐め妖怪

前段と後段で継承関係が入れ替わるのだ。

本質はなにか。オイスターソース焼きそばは客にソースの情報を提供する側だが、オイスターソース舐め妖怪はソースの情報を受け取る側。たぶんそういうことだと思う。具体例をつかってイメージするのは大事。

今日の日記長すぎない?

先輩の金で豚みそ漬けを食べた/Akka HTTP/徳が低い

関連企業に勤めている先輩とご飯に行ってきた(ごちそうになった)。かねてから色々と相談に乗ってもらっており、会社員として無事にスタートを切った姿を見せることができて嬉しい。

入社直後で意識が高まっているので、以前中途半端に勉強してやめたScalaを触っている。具体的にはAkka HTTPで軽めのwebアプリを作ろうとしている。日本語の情報が少ないのは困難だが、Rails(!)のチュートリアルを見て自分の知りたいことを英語で何というのか調べて、それからドキュメントに検索をかけている。

僕は徳が低い男だ。すぐ怒り、間違いを認めず、そのくせ自分のプライドが傷つけられることにばかり敏感で打たれ弱い。新しい環境でこれらの欠点を自覚することが多く嫌になる。だが、道理とは関係なく自分を強く見せて社会的に優位に立とうとするのは、サルとしては自然な行動だ。つまりこういう心のはたらきをなくすことは難しい。人間社会はヒトに厳しいのだ。どうしてこうなってしまったのやら。

ScalaでOpenCVを使うときの予約語トラップ

ハマったので記録。

問題

OpenCVにはScalarというクラスがある。このクラスはvalという名のフィールドを持つがゲッターはない。値を得るためには直接アクセスする必要がある。valの型はArray[Double]であり、その先頭の値を得るために以下のようなコードを書いた。

するとエラーが出た。

解決

これはvalがScalaの予約語だからである(もちろんJavaでは違う)。

When one needs to access Java identifiers that are reserved words in Scala, use backquote-enclosed strings. For instance, the statement Thread.yield() is illegal, since yield is a reserved word in Scala. However, here’s a work-around: Thread.`yield`()

(筆者訳)
Scalaでは予約語となっているようなJavaの識別子にアクセスする必要があるときは、バッククォートで囲まれた文字列を使う。たとえばThread.yield()という文はScalaではyieldが予約語なので許されない。回避策はこうだ: Thread.`yield`()

ScalaはJavaのライブラリを流用できるのでこういう事故はよくあるのだろう。

トラップ

単に予約語を識別子として用いた場合シンタックスハイライトで色がつくので気づくはずだが、今回は先頭の値にアクセスするために(0)をつけており、シンタックスハイライトが効かず発覚が遅れた。

🙂