@ledsun blog

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

ruby.wasm

Ruby in the browserでWebSocketリクエスト送信

RubyでWebSocketサーバー - @ledsun blogで作ったWebSocketサーバーにRuby in the browserからリクエストを送信してみましょう。 <html> <head> <title>WebSocket Client</title> <script src="https://cdn.jsdelivr.net/npm/@ruby/[email protected]/dist/browser.script.iife.js"></script> </head> <body> <script type="text/ruby"> requ…</body></html>

ruby.wasmのテストが失敗する

最近ruby.wasmのテストが失敗します。 ビルドはできてテストの実行時にエラーがおきます。 自分の環境だけかと思ったらGitHub Actionsでも失敗しています。 例えば Nightly release · ruby/ruby.wasm@8da2029 · GitHub です。 rake npm:ruby-head-wasm-wasi:…

Async::WebSocket gemの素振り

ruby.wasmからのWebSocket - @ledsun blog では、faye-websocket-rubyを使いました。 このWebSocketサーバーを GitHub - socketry/async-websocket: Asynchronous WebSocket client and server, supporting HTTP/1 and HTTP/2 for Ruby. に変えてみましょう…

ruby.wasmからのWebSocket

WebSocketを使いたい理由 ruby.wasmでdRubyをやりたいです。 dRubyではサーバーとクライアントで双方からリクエストをおくります。 HTTPはクライアントからサーバーへの一方向のリクエストを想定しているので不十分です。 Server Sent Eventsを使う手もあり…

dRuby in the browserのネタ集め

ruby.wasmでRuby in the browserが可能になりました。 次にブラウザとサーバーで通信したいです。 「fetch APIを使って、REST APIなサーバーと通信する」じゃ面白くないですよね。 せっかくのRubyなので、drubyを使って分散Rubyしたいです。 GitHub - ruby/d…

いつも使っているディレクトリでもruby.wasmをビルドする

ruby.wasmがビルドできる - @ledsun blog で得た知見を元に、いつもの開発環境でビルドできるようできるでしょうか? Rubyのバージョンを安定版に rbenv local 3.3.2 submodule を recursiveに初期化 git submodule update --init --recursive 多分これが重…

ruby.wasmがビルドできる

ruby.wasmがビルドできない - @ledsun blogをリベンジします。 cloneからやり直してみます。 git clone [email protected]:ruby/ruby.wasm.git --recursive ruby.wasm_2 cd ruby.wasm_2 bin/setup ruby_wasmをビルドします。 rustup update rustup target add w…

ruby.wasmがビルドできない

ruby.wasmのビルドが通らなくなったので、環境を最新にします。 cd vendor/jco/ git reset --hard cd ../.. git submodule update します。 この手順が要るかはよくわかっていません。 雰囲気でやっています。 bin/setup に成功するまで bin/setupを実行する…

ブラウザでruby.wasmのJS.evalしたときのスコープはなんなのか?

事の発端 tmtms さんが ruby-jp slack に面白いコードを投稿していました。 JS.eval <<~EOS A = 123 class B { } console.log(A) //=> 123 console.log(B) //=> class B {} EOS begin JS.eval <<~EOS console.log(A) //=> 123 console.log(B) EOS rescue => …

Ruby in Browser観察日記 その2

世の中でruby.wasmがどのように使われているのか観察して、どんな機能があったら便利そうか妄想するネタにします。 今日はtmtmsさんに教えてもらった MySQL Parameters にお邪魔します。 エントリポイントはlib/inti.rbです。 require 'js/require_remote' r…

Ruby in Browser観察日記 その1

世の中でruby.wasmがどのように使われているのか観察して、どんな機能があったら便利そうか妄想するネタにします。 yancyaさんに教えてもらった 2024 - やんちゃハウスでは次のように使われていました。 require "js" Window = JS.global[:window] Document …

Ruby in Browserへのモチベーション

2000年代後半にRubyistの間で「ブラウザでRubyが書ければいいのに」という冗談がありました。当時はDartもありませんでした。ブラウザに任意のプログラミング言語が組み込まれるアイデアが一般的ではありませでした。Google Chromeの中の人であれば、技術的…

ruby_wasm gemをインストールしたい

bundle init bundle add ruby_wasm エラーが出ました。 thread 'main' panicked at /home/ledsun/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rb-sys-0.9.97/build/main.rs:64:59: called `Result::unwrap()` on an `Err` value: "Stable API is …

ruby.wasmのビルド環境整備

最新のruby.wasmをビルドするために rake npm:ruby-head-wasm-wasi を実行したら次のエラーが出ました。 npx jco transpile --no-wasi-shim --instantiation --valid-lifting-optimization /home/ledsun/ruby.wasm/packages/npm-packages/ruby-head-wasm-was…

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/[email protected]/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/[email protected]/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/[email protected]/dist/browser.script.iife.js を使うことが多いです。 browser.script.iife.jsは https://cdn.jsdelivr.net/npm/[email protected]/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回ではスライドのテンプレ…