またか. またなのか. 何回目だ. ということで, ラムダ計算のインタプリタの実装としては4回目くらい*1, コンパイル時計算でやるものとしても3回目くらいになってしまうけど, ラムダ計算の処理系をまた書いてしまった.
今回の目的は, Scala 3にはmatch typesという機能があり, これだけでチューリング完全なのではないか, というのを検証するため. また, 文字列リテラル型を操作する型レベル関数が3.1.2-RC1にきていて, これを使えば構文解析器だって書ける.
続きを読む数日前にTwitterで, JavaScriptのオブジェクトに対する===
の挙動が初心者には難しいみたいな話を見かけた. 発端や周辺の議論をちゃんと追いかけてないからとくに出典は貼らない. たぶん元々の話は「へぇ, こういう挙動なんだ, 簡単ではないね」くらいの話だったのかもしれない. 自分のタイムラインの観測範囲では「そうだそうだ, (参照の同一性ではなく)同値性にしとけばいいのに」と思っている人もそれなりにいそうに見えた.
個人的にも同値性が簡単に確認できるとよい気はするものの, 「なんでそうしないんだ, オブジェクトの中身を確認していくだけだろ!」みたいな簡単な話ではないことも知っているため, 以下のようなツイートをしたのだった.
JavaScriptのオブジェクトの同値性、再帰的な構造とか作るとぜんぜん自明じゃないんだよなぁ。リンクの構造は違うけどプロパティを辿ったときのパスはどうやっても一致する(観測上は同じに見える)やつを同じとすべき? とか。
— INA Lintaro (@oarat) 2021年8月17日
補足しとくと、x = { a: { a: x } } と x = { a: x } は同じか、みたいなやつ。(同じでいいとおもうがそれをちゃんと判定できるか。)
— INA Lintaro (@oarat) 2021年8月17日
オブジェクトの同値性を判定するメソッドや演算子を実装しようとすると, 再帰的な構造があると困ってしまう*1. なぜなら循環している可能性があるから. 同値性を判定できないと主張したいわけではなくて「同値性をどう定義したらいいか自明ではない」という話.
*1:それ以外にも, 同値性判定に計算コストがだいぶかかってしまう(効率よく計算できるようにするのがたいへん)といった問題もある
社内でOSSへの貢献をもっと奨励していきたいねと話していて, そもそも普段どれくらい貢献できているか知りたくなった. 以前, 自分のポートフォリオに貢献しているOSSのリストを出すのをやっていて, ちょっと改造したら組織内のメンバー全員のものもすぐに出せそうだったのでやってみた. (というのをずっと前にやっていたけど宣伝するのを忘れていた.)
続きを読むこの記事は, はてなエンジニア Advent Calendar 2020の20日目です. 昨日はid:Pasta-Kによるウェブブラウザにバグ報告をするときにやることでした. 明日の担当はid:motemenです.
Scalaで, 依存ライブラリのバージョンを上げるpull requestを自動的に作ってもらうソリューションとしてはscala-stewardがあります. ScalaのことはScalaでやるのが確実そうなので安心感がありますね. ただ, scala-stewardを自分でホストするのは面倒だし, かと言ってGitHub Actionsで動くようにするのもそれなりに面倒なようです.
Scalaに特化しない方法としてはRenovateがあります. これはいろんな言語のライブラリ等のバージョンをぜんぶ面倒見てくれてべんりです. GitHub Appsになっているのでポチポチ設定するだけで導入できます. 考えてみれば, ScalaのプロジェクトだってどうせDockerfile
なども置いたりしているだろうし, Scalaのライブラリのバージョンだけ上げられればいいということの方が稀だと思います. だったらぜんぶRenovateに任せてしまえる方がいい. 不安要素としてはScalaに対するケアがどれくらい行き届いているか.
この記事では, Scalaで書かれたプロダクトで実際にRenovateを使ってみて行き当たった不安要素と, その解決を見ていきます.
続きを読むこういう話がありました。
Feature Request : Support for scala in dap-mode · Issue #196 · emacs-lsp/dap-mode を見てもdap-modeの使い方がよく分からなかったし別に時間をかける所じゃないなと思ったので、デバッグする時だけはIntelliJを使うことにしようとしたのですが、私の環境だとUIが崩壊してデバッグ設定以前の問題になってしまいます。
実はMetalsの(というかlsp-mode+dap-modeの)デバッガはいま普通に機能するけど、確かに使い方(使える状態にするコツ)がちょっとむずかしい感じがしますね。実際にはやることはあんまりないんだけど、いざやろうとすると時間を食うと思うので、時間を食われてやった側の人間としてやり方を書き記しておこうと思います。本当は最近のEmacsのモダンな環境ぜんぶ紹介するみたいなのを書いてそこで(他の言語の場合も含めて)書くつもりだったけど、取り急ぎScalaのことだけ書きます。
続きを読むこういうのがあった:
二時間目コンテナの講義ではDocker Quizが出題。君は、すべて解くことができるか?
— hatenatech (@hatenatech) 2020年9月7日
$ docker run --rm -i hatena/intern-2020-docker-quiz #hatenaintern2020
自社のインターンの課題だけど, 僕は今年のインターンには全く関わっていないので, 新鮮な気持ちで問題を楽しめた. みんな話題にしているのはQ7でなかなか骨がある. 全体的にCTFっぽさがある(参加したことないのでしらんけど)中で, Q7はとくにそっち方向の面白さがある.
Q7 このイメージのentrypointとして指定されているコマンドのソースコードを復元して、この問題の答えを取得せよ
「ソースコードを復元して」と言われて「うーん, それホントに復元しないとダメかな?」と考えていたら「ワシも若い頃はバイナリ畑を守るバイナリアンとして村のために戦ったもんじゃ」みたいな気持ちが急激に湧いてきて, 復元せずに解いてやろう, となった.
ちなみに, 実際は途中で諦めて普通にソースコードを復元して解いてしまったので, ここに書くのは「後にして思えばこうやってたら解けてたな」というやつです. 後出しジャンケンです. あと想定された解き方と違うとはいえ, 読めばQ7の答えがわかってしまうので自分で挑戦したい人は挑戦した後で読むことをオススメします.
続きを読むHow do you imagine a building? You consciously create each aspect, puzzling over it in stages.
Inception
型なし言語に馴染みはあるものの型付言語をいざ使ってみたらどういう気持ちで書いたらいいのかわからなかったと同僚から相談があり, それをきっかけにして社内の勉強会で以下の話をしました.
よく型なし vs. 型付の文脈では「型を書くのは面倒だ」「安全の方が大事だ」「でも面倒だ」「それは型推論を前提にしていないからだ」などの議論になりがちな気がしますが、これはあくまで「計算ありきの型」を考えているからで, 「型ありきの計算」だと全く見え方が違います. 「型はある種の仕様」とおもえば, 型ファーストであることと, 型なし言語でテスト駆動開発(TDD)するときに最初にテストを書くこととは, 同じなんだよなぁと思っていました. そして型ファーストが重要な理由をつきつめていくと, Curry-Howard同型対応があるからだなぁという結論に至ったので, それを言語化しました. せっかくなのでスライドを公開するとともに、口頭で補ったところも含めて丁寧に記事として書き起こしました。
続きを読む自分の過去の登壇・執筆情報の管理が面倒になってきたのと, Twitter等に貼ってあった自己紹介のページがあまりに得体が知れない感じになってしまっていたので, ポートフォリオというかプロフィールというか, そういうものを用意することにした. 静的ページでいいけど, 1次情報はYAMLかなにか, 管理しやすいものになっていると助かるので, まぁJekyllでいいでしょ, という感じでミニマルに作りはじめた. ブログ記事とかGitHubのリポジトリとかもかいつまんで載ってるといいかもね, とやっていったらそこそこのボリュームになってしまった. でも最近は歳を取ったのか趣味でコードを書くモチベーションが低くて全体的に意識が低い.
続きを読む