TinyPilot: Month 43

Michael Lynch

TinyPilot:43か月目

一行まとめ

TinyPilotのリリース手順を、うっかり自分だけで抱え込んでいました。

目標の評価

毎月の初めに、その月に達成したいことを決めています。目標に対する結果は次のとおりです。

年間振り返り記事を公開する

公開は数週間遅れましたが、仕上がりには満足しています。

記事はHacker Newsで1位になりました。楽しい出来事ではありましたが、お金について話すことが諸刃の剣でもあると改めて感じました。数字を公開すると、読者はずっと強い関心を示して盛り上がってくれます。一方で、コメントの大半は数字の話だけに集中していました。

TinyPilotとのコラボレーションについて、ブロガー5人に連絡する

  • 結果:ブロガー2人に連絡
  • 評価:C

TinyPilotのリリース手順の文書化に予想以上の時間を使ったため、ブロガーへの連絡に割ける余力が少なくなりました。2人には連絡しましたが、どちらからも返事はありませんでした。

2023年の確定申告に向けて記録を準備する

  • 結果:税務書類をすべて準備
  • 評価:A

税金のことはいつも退屈ですが、今年はすべて予定どおり進んでいます。

TinyPilotの数字

指標2023年12月2024年1月変化
ユニークビジター数6,7007,800+1,100(+16%)
売上$75,198.00$100,008.98+$24,810.98(+33%)
エンタープライズ契約$290.70$290.700
ロイヤリティ$1,792.51$3,313.11+$1,520.60(+85%)
総収益$77,281.21$103,612.79+$26,331.58(+34%)
利益$-59,117.41$79,764.14+$138,881.55(+inf%)

TinyPilotの売上は、過去2番目に高い月になりました。特に理由は思い当たりません。単に売上の通常の変動だと思います。普段は月7万5,000ドルから9万5,000ドルの範囲に収まることが多いので、今回は変動の上振れを引き当て、いくつかの大口注文が10万ドル超えを押し上げたのだと思います。

利益は異常なほど高くなりましたが、これも委託製造業者への切り替え後、原材料費の発生が大きく波打つことによるものです。3か月移動平均がプラスになっているのはうれしいですが、普段よりは低い水準です。

TinyPilotのリリース手順を、うっかり抱え込んでいた

最初の数台のTinyPilotを販売したころ、開発マシンでmicroSDカードを正しく複製できませんでした。そこで、顧客ごとにmicroSDカードへLinuxを書き込み、その後TinyPilotのインストールスクリプトを各デバイス上で手動実行するという方法で、1枚ずつセットアップしていました。

それ以来、ハードウェアデバイス向けソフトウェアのリリース手順について、ずっと多くのことを学んできました。テストの拡充、再現性の向上、さらなる自動化によって、リリース手順はより成熟しています。

TinyPilotの共有Notionワークスペースにリリース手順を文書化し、今では新しいTinyPilotのリリースが私の作業待ちにならないよう、手順の大部分をチームメンバーに任せています。

少なくとも、私は手順の大部分を文書化したつもりでした。

最新リリースでは、リリース作業を自分で直接行わないことにしました。代わりに、私の文書をもとにチームメンバーにリリース手順を実行してもらいました。

最初の作業をチームメンバーに頼むことさえできないうちに、私がどれだけ多くの手順を頭の中だけに抱え込んでいたかに気づきました。リリースの各ステップ自体はすべて文書化されていましたが、それらが全体としてどうつながるのかを説明したものは何もありませんでした。

さらに、「変更履歴を更新する」とか「リリース告知を書く」といった作業が、短い言葉から受ける印象よりずっと複雑であることにも気づきました。告知ではどの機能を取り上げるのか。退屈な細部に埋もれずに機能を説明するには、どんな暗黙のルールがあるのか。

自分の手順を文書化するメリットは、あらゆる判断について意識的に考えさせられることです。過去のリリースを調べてパターンを推測しようとしたものの、自分の判断に一貫性がなかったと気づくことが何度もありました。逆に、毎回同じようにやっていたことでも、その理由を説明しようとすると、もっとよい方法があると気づく場合もありました。

リリース全体を委任する作業は、自分でやるより遅くなりました。それでも、価値のある取り組みでした。リリース手順が私に依存しにくくなり、手順を改善する機会が生まれ、将来的には一部の作業を並行して進めやすくなります。

サイドプロジェクト

Zigでバイトコードインタプリタを実装する

ここ数か月、Zigを試しています。さらに学ぶうえで大きな障害の一つは、Zigに合ったプロジェクトを見つけることです。

私が思いつくプロジェクトの大半はWebアプリです。Webアプリの構築用に設計されたGoを選ぶことが多いのはそのためです。一方、ZigはCに代わる、より汎用的な言語として設計されています。

ここ数か月、ときどきBob NystromのCrafting Interpretersと、Andreas M. AntonopoulosおよびGavin WoodのMastering Ethereumを読んでいました。Crafting Interpretersでは、Cでバイトコードインタプリタを実装する方法を解説しています。Mastering Ethereumでは、Ethereumの中核がEthereum Virtual Machine(EVM)と呼ばれるバイトコードインタプリタであることを説明しています。

そこで、いくつかの興味を組み合わせて、ZigでEthereum Virtual Machineを実装できると気づきました。eth-zvmというプロジェクトを始めました。

Ethereumの約2%しか実装していませんが、私のインタプリタはすでに実際のEthereumプログラムを実行し、結果を返せます。

Ethereumのバイトコードにコンパイルされた単純なプログラムを私のインタプリタで実行すると、次のようになります。

$ echo '600160005260206000f3' | xxd -r -p | zig-out/bin/eth-zvm -v
PUSH1 0x01
  Stack: push 0x1
---
PUSH1 0x00
  Stack: push 0x0
---
MSTORE
  Stack: pop 0x0
  Stack: pop 0x1
  Memory: Writing value=0x1 to memory offset=0
  Memory: 0x00000000000000000000000000000001
---
PUSH1 0x20
  Stack: push 0x20
---
PUSH1 0x00
  Stack: push 0x0
---
RETURN
  Stack: pop 0x0
  Stack: pop 0x20
  Memory: reading size=32 bytes from offset=0
  Return value: 0x0000000000000000000000000000000000000000000000000000000000000001
---
EVM gas used:    18
execution time:  792.395µs
0x0000000000000000000000000000000000000000000000000000000000000001

インタプリタの結果は、evm.codesのプレイグラウンドにあるJavaScript実装と比較できます。

Zig自体が非常に性能重視で最適化されているので、性能では他のインタプリタを簡単に圧倒できると思っていました。ところが、Ethereumの公式Go実装はかなり高速でした。

私のEthereum仮想マシン実装と、公式のGoベース実装を比較したベンチマーク(低いほど高速)

私のインタプリタには、まだ性能最適化の余地がかなり残っています。メモリ割り当てを減らすことに時間をかければ、他の実装を上回れると思います。

このプロジェクトをどこまで続けるかはわかりませんが、Zig、Ethereum、インタプリタについて実践的に知識を深める方法として役立っています。また、OSから読み込む、あるいはOSに割り当てる1バイト1バイトについて意識的に考える必要があるので、長いあいだやっていなかったタイプのプログラミングとして楽しめています。

まとめ

できたこと

学んだこと

  • 誰かが実際に文書を使って手順を進めるまでは、その手順は本当の意味で文書化されたとはいえません。

来月の目標

  • TinyPilot Pro 2.6.3を公開する。
  • TinyPilot Proのリリース手順を社内向けに文書化する。
  • 2023年の確定申告を行う。

原文は Michael Lynch により に公開されました。

この記事は「gpt-5.6-terra」を使用して翻訳されました。