ローファイ日記

出てくるコード片、ぼくが書いたものは断りがない場合 MIT License としています http://udzura.mit-license.org/

mruby/edge 振り返り【RubyKaigi 2026】

帰福以来の微妙な喉の痛みも落ち着いたのと、経費精算におそらく成功したのでようやくRubyKaigiを締めることができる...。

ひとまず、発表もしたmruby/edgeとUzumibiに関しての振り返りを日本語で書く。AIは文章を書く上では使わない。はてなブログはなァ、AIなんか使って書いちゃだめなんだ。

続きを読む

Uzumibi の進捗...の話...

Uzumibi 0.5 をリリースした

リリースしたよ。

github.com

変えたところをいくつか。

router 、 * でマッチ可能にした

class App < Uzumibi::Router
  get '/hello' do |req, res|
    ...
  end

  get '/*' do |req, res|
    # catchallな処理を書く
    puts req.params[:*] #=> catchallしたslugが入ってる
  end
end

こうですね。ただ、そういえばSinatraは *.jpg とか *.* もできると気づいた。こっからっす!

ServiceWorker/WebWorkerを使って、ブラウザの中だけでRubyのルーティングにアクセスできるようにした

何言いよんねって感じの日本語になってしまった。

今、 uzumibi new -t serviceworker hoge みたいなコマンドを打つとServiceWorkerのプロジェクトが生成される。

make wasm && make serve するとWebサーバが立ち上がる。ブラウザでアクセスすると、Uzumibiアプリに対してリクエストを投げるためのフォームが表示されるので、色々操作するとリクエストが飛んでレスポンスが帰ってくる。404もわかる。

動作の様子

このUzumibiアプリが ServiceWorker のなかで動いているという塩梅。

techracho.bpsinc.jp

RailsでやっているこれをUzumibiでやってみたという感じで、 lib/app.rb にあるDSLでルーティングを追加して make wasm しなおせば反映される*1

ただ、ServiceWorker固有の制限(スーパーリロードすると動作しないとか)が面倒だなと思って*2、fetch() リクエストをただの WebWorker に送ってUzumibiからレスポンスを返すような実装も作った。それが webworker テンプレート。WebWorkerはただの非同期実行なので、ServiceWorkerでできるワーカの保持やfetch()の自動乗っ取りなどをしてくれないけど、「別途サーバを起動せずにRubyでAPIを用意する」みたいな用途はWebWorkerが合ってるかも。用途に応じて使い分けてください。

とはいえブラウザ標準技術は勉強したばかりで何もわからずなのです...。

今度、動的に Uzumibi App をServiceWorkerにデプロイするようなサンプルを作ってみたいところ。

newコマンドの受け入れテストをrunnでCIにした

uzumibi new コマンドからの開発の流れは、基本的に以下のようなことを想定している。

  • プロジェクトのテンプレートを作る
  • wasmをビルドする
  • サーバを立ち上げる
  • ブラウザなどでIt works! が出るのを確認する

uzumibi new で作られたファイルは何もしなくてもこれが動いて欲しいが、それなりの数サポートしているプラットフォームがあり、毎回手動で確認するのはアッ、ウッだった。

k1LoWさんが作っている runn は完全にこういうことの自動化にピッタリそうなので、AIの助けを借りながらCIに組み込んでみた。

github.com

始めは記法が難しかったがClaude Codeさんがググってくれたので徐々に理解できるようになった。

runn の良いところは、一つは上記の「サーバを立ち上げる」操作がバックグラウンド化できる(さらに、終了時の後始末も自動でやってくれる)点、もう一つは cdp ランナーがファーストクラスでサポートされている点だなと感じている。

例えば、 WebWorker テンプレートの場合こういう操作が想定されており、その性質上何かが表示されるだけではなく、「ブラウザでちゃんと動くか」が重要になる。

  • プロジェクトのテンプレートを作る
  • wasmをビルドする
  • サーバを立ち上げる
  • ブラウザでフォームから / へリクエストを送る
  • 結果が Status: 200 になるのを確認する

cdpを使えるため、ブラウザからfetchを送って結果を確認するという操作も自動化できる。まるでUzumibiのcliを検査するために作られたかのようなツールだなと感じている。

今後、例えば Cloudflare テンプレートでプロジェクトを作ったあと Durable Object を使ったコードを起動し、実際動くか試す...。みたいなテストも自動化できるのでは?と思っており、品質面で夢が広がる。

というかrunn、絶対仕事でも使おうと思った。肌感Rubyコミュニティの人にはあまり知られていなくて不思議。


という感じでUzumibiの方もじわじわ欲しい機能を作っているところ。

余談 of 余談: AI時代の個人OSS開発者の気持ち

*1:ServiceWorkerはこの辺むずくて、unregisterしないとダメか? 動的にキャッシュパス変えるとかしても良いかもな...

*2:ServiceWorker の用途を見ると、例えば事前に画像をfetchしてキャッシュして返すみたいなのを想定してそうで、スーパーリロードで動かないのはそういう関係っぽい?

続きを読む

mruby/edge 進捗 どうやって

進捗はない... 本質的な課題からも逃げがち... ではありますが、最近mruby/edgeでやってることを殴り書きします。

Playgroundをリリースした

mrubyedge.github.io

しました。正直まだそれなりに機能も足りず、バグもあるでしょうが、遊んでやってください。

1.1.0 で mruby/c と同じぐらいの数のメソッドを実装した(つもりな)ので、Rubyっぽいコードを試しやすくなってる気がします。気持ちの問題かもしれない。なおこの記事を書いてる時点では 1.1.5 が最新ということになっています。

github.com

mruby/edgeとしてはあとは math, json, regexp, random そして mruby-compiler2 と、 mruby-compiler2 の動作に必要なemscriptenの関数を含んでいます。

github.com

これだけ詰め込んでもまだ容量はギリ 1 MB を切っている。

$ ls -lh docs/*.wasm
-rwxr-xr-x  1 udzura  staff   922K  2月 15 15:15 docs/playground.wasm*

regexp がRustのregexベースで、でかいことがわかっているので若干工夫したいと思っています。このgem欲しい!とかあったら教えてください。

あとはPlaygroundなどを支える技術を...。

続きを読む

Uzumibi 0.3 のリリース

リリースした。往生際悪く(?)ブログを書く。


続きを読む