@ledsun blog

無味の味は佳境に入らざればすなわち知れず

ruby.wasm

JS.falsy?

ruby.wasmように値がJavaScriptのFalsyな値か判定する関数を実装しました。 https://github.com/ledsun/ruby.wasm/blob/19b8f245af9806ceb67601f851300d2df6ac5674/packages/gems/js/lib/js.rb#L98-L109 def self.falsy?(value) value == JS::Null || value …

orbital ring その1

ruby.wasmを使ってRubyでフロントエンドフレームワークをつくったらどうなるかを考えてみましょう。 テンプレートエンジンはERBを使うと良さそうです。 イベントハンドラーのバインドはRailsのルーティングっぽくなる良さそうです。 次のイメージです。 Orbi…

ruby.wasmのJS::Object#newにブロックでコールバック関数を渡す

ruby.wasmのKernel#sleepをどう実装したものか? - @ledsun blog の続きです。 次のようにruby.wasmで動くKernel#sleepを実装できます。 <html> <head> <title>Kernel#sleep</title> <script src="https://cdn.jsdelivr.net/npm/@ruby/head-wasm-wasi@2.4.1-2024-01-26-a/dist/browser.script.iife.js"></script> <script type="text/ruby" data-eval="async">…</head></html>

ruby.wasmでオートロードする

kakikataというペン習字練習用紙を印刷するruby.wasmアプリケーションがあります。 ledsun.github.io 複数ページ印刷する機能を追加するついでに、requrie_relativeを使ってファイル分割していました。 やっている内に、単純作業が面倒臭くなってオートロー…

rustのWASI用のThreadのsleep関数を読む

https://github.com/rust-lang/rust/blob/e9271846294c4ee5bd7706df68180320c0b5ff20/library/std/src/sys/wasi/thread.rs#L137 *1 pub fn sleep(dur: Duration) { let nanos = dur.as_nanos(); assert!(nanos <= u64::MAX as u128); const USERDATA: wasi::…

ruby.wasmのKernel#sleepをどう実装したものか?

ruby.wasmを使ってブラウザ上でKernel#sleepを呼ぶとエラーが起きます。 <html> <body> <script src="https://cdn.jsdelivr.net/npm/@ruby/head-wasm-wasi@2.4.1-2024-01-05-a/dist/browser.script.iife.js"></script> <script type="text/ruby"> sleep 1 </script> </body> </html> エラーのスクリーンショット とりあえずこんなパッチを当てれば動くことはわかっています。 module Kernel de…

2023年にruby.wasmにマージできたプルリクエスト

https://github.com/ruby/ruby.wasm/pulls?q=+author%3Aledsun+is%3Amerged+created%3A%3E2023-01-01 で一覧できます。 6件でした。 時系列で見ていきます。 github.com JavaScriptのオブジェクトを、newメソッドで作れるようにしました。 それまでは、次の…

ruby.wasmのビルドの並列オプションの効果

ruby.wasmのコミットのなかで、make を並列実行する -j オプションを追加するコミットがありました。 build: use -jN option for "make install" in crossruby · ruby/ruby.wasm@02e84be · GitHub 本当に並列化されているのか観察してみました。 Rubyをビル…

リダイレクトレスポンス対応版 require_relativeを組み込んだruby.wasmを実際に動かして、問題を切り分ける

ruby.wasmでrequire_relativeしたときのリダイレクトレスポンスの扱い方 - @ledsun blog に書いたように、HTTPリクエストのリダイレクトレスポンスでURLが変わったら、変更後のURLをロード済みとして扱いたいです。 リダイレクトレスポンス対応版 require_re…

ruby.wasmでrequire_relativeしたときのリダイレクトレスポンスの扱い方

require_relativeでリダイレクトレスポンスをサポートしたいと思っています。 たとえば次のようなシナリオです。 require_relative "a" を実行する fetch('a.rb') を実行する a.rb にGETリクエストを送る サーバーから302レスポンスでb.rbが返ってくる b.rb …

require_relativeの動作確認する

自分でビルドしたruby.wasmを実行する環境をつくる - @ledsun blog で、ruby.wasmのカスタムビルドを動かせるようになりました。 実装中の require_relative が動くか確かめてみましょう。 次のような index.hml を作成します。 <html> <script src="browser.script.iife.js"></script> <script type="text/ruby"> require 'js/require_remo</html>…

自分でビルドしたruby.wasmを実行する環境をつくる

ブラウザからruby.wasmを実行するときは https://cdn.jsdelivr.net/npm/ruby-head-wasm-wasi@2.1.0/dist/browser.script.iife.js を使うことが多いです。 browser.script.iife.jsは https://cdn.jsdelivr.net/npm/ruby-head-wasm-wasi@2.1.0/dist/ruby+stdli…

ruby.wasmのE2Eテストをデバッグする その2

ruby.wasmのE2Eテストをデバッグする - @ledsun blog で、次のように書きました。 そこで、テストケースで次のようなイベントリスナーを設定します。 page.on("console", (msg) => console.log("LOG:", msg.text())); ruby.wasmのソースコードをみると元々組…

ruby.wasmのE2Eテストをデバッグする

ruby.wasmにPlayWrightで書かれたE2Eテストがあります。 https://github.com/ruby/ruby.wasm/blob/84707d656d007577947ced6c14a9a33e3ffd4033/packages/npm-packages/ruby-wasm-wasi/test-e2e/integrations/browser-script.spec.ts テストに失敗したときに、…

WebAssembly勉強メモ

ruby.wasmの発表ラッシュが終わりました。ruby.wasmのハックをしていると、WebAssemblyの理解があやふやなことが我ながら気になります。ここらで一度、足元を固めたいと思います。 じっくり、本を読んでみようと思います。 ハンズオンWebAssembly ―Emscripte…

RubyKaigi 2023 follow upでしゃべりました

発表 RubyKaigi 2023 follow up - connpass で発表しました。 発表資料です。 speakerdeck.com TokyuRuby会議14にてLTをした - @ledsun blog と とちぎRubyの勉強会 拡大版で発表しました - @ledsun blog につづき3連続です。 この3回ではスライドのテンプレ…

ruby.wasmのビルド中にruby/zlibのconfigureに失敗する

ビルド終盤の linking ruby のあとでエラーが起きています。 ruby.wasmのビルドエラー zlibがインストールされていない? dpkg -l |grep zlibを実行すると ledsun@MSI:~/ruby.wasm[1]►dpkg -l |grep zlib ii zlib1g:amd64 1:1.2.11.dfsg-2ubuntu9.2 amd64 co…

WebAssembly用語集

ruby.wasmのソースコードを読んでいるとWebAssemblyに関する用語が出てきます。用語を間違って読みとるとソースコードも間違って読んでしまいます。ソースコードを読むのに無駄に時間がかかります。そういうわけで、ソースコードを読みながら調べた用語をこ…

とちぎRubyの勉強会 拡大版で発表しました

とちぎRubyの勉強会 拡大版 で発表しました。 発表資料はこちらです。 自分がプルリクエストをつくるときの手順を例にハッキングの仕方を整理しました。我ながら、現時点のruby.wasmのハッキングの仕方の説明としてなかなか上手くできたと思います。 先週のT…

ruby.wasmの構成図を書いている

何度やってもruby.wasmのどこからどこまでがWebAssemblyでどこからがJavaScriptなのかわからなくなります。 あらためて絵を描いてみることにしました。 ruby.wasmの構成図 第1段 これだと、Rubyスクリプトがどう関わるのかわからないんですよね。 登場人物を…

JS::Object#new PR感想戦

ruby.wasmでJavaScriptのオブジェクトをnewメソッドで初期化する - @ledsun blogで、JS::Object#newを実装しました。 これを Create a JavaScript object with the new method. by ledsun · Pull Request #246 · ruby/ruby.wasm · GitHub にしました。 マー…

ruby.wasmにto_bを実装するには?

ruby.wasmでクエリ文字列を扱おうとしたら - @ledsun blog で、JavaScriptのオブジェクトの返す真理値が真か確認するために if searchParams.has('phrase') == JS.eval('return true;') と書きました。 if searchParams.has('phrase').to_b と書きたいです。…

ruby.wasmのJS::Objectをハックするときのテクニック

ruby.wasmでJavaScriptのオブジェクトをnewメソッドで初期化する - @ledsun blogでnewメソッドを試作しました。 せっかくなので、ruby.wasm本体に組み込みたいです。 で、ためしていて気が付きました。 ruby.wasmのJS::Objectをハックしてみる - @ledsun blo…

ruby.wasmでJavaScriptのオブジェクトをnewメソッドで初期化する

ruby.wasmでクエリ文字列を扱おうとしたら - @ledsun blogで JS.global.URLSearchParams.newと書きたい と書きました。 ためしに実装してみました。 class JS::Object def method_missing(sym, *args, &block) if sym == :new # new で呼び出されたら、コン…

ruby.wasmでクエリ文字列を扱おうとしたら

URLSearchParamsを使うと、こんなかんじになりました。 searchParams = JS.eval 'return new URLSearchParams(location.search)' if searchParams.has('phrase') == JS.eval('return true;') phrase = searchParams.get('phrase').to_s set phrase, template…

ruby.wasmの最新版を試す その1

ruby.wasmでrequire_relativeを使えるようにしたい - Qiita の続きです。 2回呼ぶとPromiseの完了待ちが無限にブロックされます と言う状況でした。 ruby/ruby.wasm側でコミットが進んでいるので、ここにリベースしてみます。 ですがmainブランチの最新はコ…

ruby.wasmのJS::Objectをハックしてみる

ruby.wasmでJavaScriptのオブジェクトのプロパティの操作を工夫する - @ledsun blog で考えたJS::Objectに対するパッチをいれてビルドしてみます。 まずテストコードを探しました。 https://github.com/ruby/ruby.wasm/blob/394841d142fabc2287e7f918a605c70…

ruby.wasmをビルドする

ruby.wasmをブラウザで動かす時に https://cdn.jsdelivr.net/npm/ruby-head-wasm-wasi@2.0.0/dist/browser.script.iife.js を使います。 このJavaScriptをハックして少し便利にしたいときには次の手順でビルドしています。 ビルド git clone git@github.com:…

ruby.wasmでJavaScriptのオブジェクトのプロパティの操作を工夫する

いまruby.wasmでブラウザ向けプログラミングするために <script src="https://cdn.jsdelivr.net/npm/ruby-head-wasm-wasi@2.0.0/dist/browser.script.iife.js"></script> を使うとプロパティを参照しようとすると次のように書きます。 require 'js' documetnt = JS.global[:document] これを次のように書きたいです。 require 'js' documetnt = JS.global.document 次のモ…

環境変数で大きなスタックサイズを指定したらrequire_relativeが動いた

ruby.wasmでrequire_relativeするやつの進捗状況 - @ledsun blogでSystemStackErrorがでると書きました。 ruby.wasmのリポジトリのissueで次の情報を見つけました。 https://github.com/ruby/ruby.wasm/issues/133#issuecomment-1365825417 evalAsync intern…