Mosh + clang-tidy

伝説のプログラマポッドキャストJohn Carmack: Doom, Quake, VR, AGI, Programming, Video Games, and Rockets | Lex Fridman Podcast #309 - YouTubeを聴いていたらデバッガと static analyzer がいかに素晴らしいかを説いていたので clang-tidy を使ってみることにした。 Ubuntu 20.04 aarch64 上で

$ apt install bear clang-tidy
$ cd mosh.git
# clang-tidy が必要とする mosh.git/compile_commands.json を make コマンドの結果から生成
$ bear make
# とりあえずチェックする
$ run-clang-tidy -checks="-*,bugprone-macro-parentheses"
# 修正も実行
$ run-clang-tidy -checks="-*,bugprone-macro-parentheses" -fix

CS25: Transformers United を受講した

Stanford CS 25 Transformers Unitedを受講した。猫も杓子も Transformer という時代なので基礎の復習とキャッチアップを兼ねて。

良かった点

  • Transformer の基礎の復習がきちんとできた
  • self attention について「分かったような分からないような」という理解から「ぎりぎり他人に説明できるかも」くらいの理解になった。
  • LSTM は近くがよく見える。Transformer は遠くまでよく見える。という以前の学びも。そうだよねと腹落ちした。
  • 言語以外の応用エリア(Vision・音声)などが学べた
  • Transformer の登場に関わった人の話が面白かった

イマイチな点

  • 一部の講師・ゲストスピーカーは準備不足 or 説明が退屈だった。オンラインでの講義に慣れていないのもあると思う。
  • 自分が学生で単位を取ろうとしていたら大変だったかも。前提知識もかなり必要だし。話題の幅も広い。

The Rust Programming Language を読んだ - 2022夏休み

〇〇言語の後継XYZ言語がリリース。とニュースがあるたびに「少し触っとくか?まあいいか」を繰り返し。最後に「新しい」言語を学んだのは Swift という状態だったのでRust の本をオンラインで読みできる限りコードを写経した。以下感想。

  • メインで学びたかった Ownership 。コンパイラによる強制部分は「これがコンパイルエラーになるのか面白い」と楽しかった。
  • String と str は分かるけど分からない。String の内部表現が UTF-8 みたいな話は UTF-32 にすればいいの(誰にも支持されない)
  • OOP の話がほんのかなり終盤に出てくるのは言語の思想なんだろうか?
  • cargo は便利。
  • VS Code のサポートが貧弱な気がする。ちゃんと拡張を調べられてないだけかも。
  • VM Loop とかどう書くのだろうか。VM 命令の Pattern Match で十分速度出るのかな?

データ解釈学入門を読んだ - 2022 夏休み

統計検定2級や Kaggle で学んだものたちの隙間を埋めてくれる良い本だった。どことは言わないが、読んでいる途中に仕事のことを思い出す記述があり背筋がピンと伸びた。以下雑多なメモ。

  • 測りやすいデータが選ばれがち。
  • データを歪めるモチベーション(犯罪件数、いじめ件数は少なくレポートしたい)
  • (大きな声で何度でも)データの前処理は一番時間がかかる。手を抜かない。1つ1つの処理前後で正しいか必ず確認する。決してまとめて処理しない。
  • 多重検定に注意。過去にこれやってたな。
  • HARKing, p-hacking これは・・・
  • 数々の認知バイアス

Bitcoin and Cryptocurrency Technologies を履修した - 2022 夏休み

Coursera の Bitcoin and Cryptocurrency Technologies | Coursera というクラスを履修した。Princeton University が提供している仮想通貨のオンライクラス。

自分は仮想通貨を所有していない。仮想通貨やそれらにまつわる技術については、どこかのまとめ記事で読んだ程度という状態だったのだがこれを脱するべく受講。最近は Web3やらDAOやらNFTというワードが飛び交っており、数週間前にもとある書籍が炎上していた。これらを感覚ではなく知識に基づく理解ができるようになるのが目標。もし仮に否定的な立場だとしても「自分が理解できないから否定する」だけは避けたい。

良かった点

  • ごまかしのない大学の授業。講師陣が深い理解をしていることが分かる。
  • 基礎技術(Cryptographic Hash, Digital Signatures, Public key as identitiesなど)の詳細を丁寧に教えてくれる。
  • シンプルな仮想通貨を紹介し Double Spending を防ぐ方法など段階を追って説明してくれる。
  • Bitcoin に関しても多くの時間を割いてる。Bitcoinトランザクションの生データまで追っているのはとても良かった。

イマイチな点

  • Andrew Ng の Machine Learning のようなコースを想像すると期待はずれかも。Andrew Ng は抜群に教えるのがうまい。本コースは大学の授業を録画しましたというレベルのもの。
  • コードを書く宿題がスパルタで万人向けではない。ユーザーレビューでもこれが一番の不満として挙げられている
    • 宿題の意図は仮想通貨トランザクションの一部を実装することでドメイン知識の理解と定着を狙っていると思われる。そこは大変よい。授業の動画を見ただけではスルーしていたようなユーザー間で何をやりとりしているかなどがよくわかる。
    • Java が分からないと終わる。
    • Jupyter notebook とかではなくて zip ファイルでソースコードをダウンロードしてコードを書き、コードをフォームから submit する方式。テストやビルドファイルもない。
    • ノーヒントすぎる。
    • Java のクラスインターフェースの設計がイマイチ(これは僕の主観)

感想

  • 本質が理解できた(と思わせられた)のは本当に良かった。
  • hot/cold ストレージ、ウォレット、マイニング、ブロックチェーンの詳細、合意形成、soft/hard folk など技術要素が理解できた。
  • Bitcoin Scripts 全く知らなかったのだが面白かった。
  • 匿名性についてもかなり深く突っ込んでおり面白かった。2ch, reddit, Bitcoin がどのような意味での匿名性を提供しているのか分かった。
  • 政府の関与とか BitLicense なども。まあそうなるよねという感想。
  • 夢のような技術というよりは、ブロックチェーンという基礎技術の上にかなり苦労して複雑なアプリケーションを構築している感じなのね。このアングルで見ていくと Web3 の見え方も違うかも。

Mosh の Apple Silicon 対応 - 2022夏休み

scheme.org の方から mosh.scheme.org の利用について声をかけていただいた。せっかくなので MoshApple Silicon 対応をしようと思いたった。なお最後のリリースは 0.2.7 で 2011/6/14 に okuoku さんによって行われている。10年以上前である。

C/C++ で書かれたソフトウェアなので新しいアーキテクチャ(=Apple Silicon)でちょいちょいとコンパイルし直せば良い。という話ではない。なぜならば Moshコンパイルには安定して動く Mosh が必要だから。これは gcc のビルドに gcc が必要なのと同じ問題で、bootstrap 問題と呼ばれる。さらにややこしいのが MoshコンパイラScheme で書かれており、これを VM で実行可能なコードにコンパイルするために Gauche で書かれた VM を使っていたりするので厄介である。

Step1: 0.2.7 リリースを雑にビルドする

まずは安定して動く Mosh のバイナリが欲しいのでリリースビルドをビルドする。リリースビルドのビルドには Mosh は必要ない。ビルドするとすぐに GC 周りのエラーになった。10年前の Boehm GCApple Silicon に対応していないので以下のエラーになる。

 "The collector has not been ported to this machine/OS combination."
#   error "The collector has not been ported to this machine/OS combination."
    ^

そこでまず最新の Boehm GC を入手してビルドを試みる。10年の間に Boehm GCディレクトリ構造などが変更になっており Mosh 側の Makefile に変更が必要である。行儀悪いが直接 Makefile を編集してことなきを得た。

続いて奇妙な以下のテストエラー。

(let ((b (make-bytevector 4 0)))
  (bytevector-sint-set! b 0 -1 'little 4)
  (bytevector-uint-ref b 0 'little 4)) : expected 4294967295 but got -1.

詳しく調べてみると Fixnum の 乗算内部で行われているオーバーフローチェックが意図通りうまく動いていないっぽい。

    static Object mul(int n1, int n2)
    {
        const fixedint ret = (fixedint)n1 * n2;

        /* Overflow check from Gauche */
        if ((n2 != 0 && ret / n2 != n1) || !Fixnum::canFit(ret)) {
            Return

const fixedint ret = (fixedint)n1 * n2; この部分の fixedint は int の alias なのだが Apple のドキュメントによると乗算がオーバーフローしたときの動作は不定のようだ。なのでここは int よりも大きなサイズで判断しなければならず。const long ret = (fixedint)n1 * n2; とするのが良さそう。

これを直してめでたく M1 上で動く Mosh がビルドできた。

Step2: macOS 上で bootstrap してみる

さて M1 mac 上で動く安定 Mosh バイナリができたので./gen-git-build.shを実行してみるがエラー。Scheme で書かれたコンパイラを gosh を利用して変換している処理。詳細を調べたり Gauche のバージョンを当時のものに合わせてみたがダメだった。不安定な土台な上で何かをやるのは筋が悪いと気づいた。

Step3: Ubuntu on Docker を試す

Linux 上で Mosh をビルドして動かす方が枯れていて良いだろうということで Docker で。i386 Ubuntu image ではうまくいかなかったので i686 Ubuntu image でやってみたら動いた。依存ライブラリの大半は apt install で取得できるのだが、正規表現ライブラリの oniguruma は特定のバージョンをソースコードからビルド。 ./gen-git-build.sh では autoconf も利用しているのだが正直なところエラーが出たとしても対処できそうにない。

無事 bootstrap できたので tar.gz にまとめてドキュメントを書き。 Release mosh-0.2.8-rc1 · higepon/mosh · GitHub にリリースしておいた。

所感

10年以上前に書かれたコードを新しいアーキテクチャで動かすのは思ったよりも面倒。記憶を頼りにいくつものツール・デバッグを繰り返してやりたいことができたが、最近ではそういう面倒にはほとんど遭遇しない。Tensorflow のバージョン違いで問題が起きるとか、cuda のインストールとか平和なものばかりである。懐かしい気持ちだが、ツールの試行錯誤より本質に時間を使える今の方が良いね。

詳細なログはNotes: Mosh 0.2.7 on M1 mac · Issue #14 · higepon/mosh · GitHubに。