ruby.wasm
ruby.wasmの発表ラッシュが終わりました。ruby.wasmのハックをしていると、WebAssemblyの理解があやふやなことが我ながら気になります。ここらで一度、足元を固めたいと思います。 じっくり、本を読んでみようと思います。 ハンズオンWebAssembly ―Emscripte…
発表 RubyKaigi 2023 follow up - connpass で発表しました。 発表資料です。 speakerdeck.com TokyuRuby会議14にてLTをした - @ledsun blog と とちぎRubyの勉強会 拡大版で発表しました - @ledsun blog につづき3連続です。 この3回ではスライドのテンプレ…
ビルド終盤の 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…
ruby.wasmのソースコードを読んでいるとWebAssemblyに関する用語が出てきます。用語を間違って読みとるとソースコードも間違って読んでしまいます。ソースコードを読むのに無駄に時間がかかります。そういうわけで、ソースコードを読みながら調べた用語をこ…
とちぎRubyの勉強会 拡大版 で発表しました。 発表資料はこちらです。 自分がプルリクエストをつくるときの手順を例にハッキングの仕方を整理しました。我ながら、現時点のruby.wasmのハッキングの仕方の説明としてなかなか上手くできたと思います。 先週のT…
何度やってもruby.wasmのどこからどこまでがWebAssemblyでどこからがJavaScriptなのかわからなくなります。 あらためて絵を描いてみることにしました。 ruby.wasmの構成図 第1段 これだと、Rubyスクリプトがどう関わるのかわからないんですよね。 登場人物を…
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でクエリ文字列を扱おうとしたら - @ledsun blog で、JavaScriptのオブジェクトの返す真理値が真か確認するために if searchParams.has('phrase') == JS.eval('return true;') と書きました。 if searchParams.has('phrase').to_b と書きたいです。…
ruby.wasmでJavaScriptのオブジェクトをnewメソッドで初期化する - @ledsun blogでnewメソッドを試作しました。 せっかくなので、ruby.wasm本体に組み込みたいです。 で、ためしていて気が付きました。 ruby.wasmのJS::Objectをハックしてみる - @ledsun blo…
ruby.wasmでクエリ文字列を扱おうとしたら - @ledsun blogで JS.global.URLSearchParams.newと書きたい と書きました。 ためしに実装してみました。 class JS::Object def method_missing(sym, *args, &block) if sym == :new # new で呼び出されたら、コン…
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でrequire_relativeを使えるようにしたい - Qiita の続きです。 2回呼ぶとPromiseの完了待ちが無限にブロックされます と言う状況でした。 ruby/ruby.wasm側でコミットが進んでいるので、ここにリベースしてみます。 ですがmainブランチの最新はコ…
ruby.wasmでJavaScriptのオブジェクトのプロパティの操作を工夫する - @ledsun blog で考えたJS::Objectに対するパッチをいれてビルドしてみます。 まずテストコードを探しました。 https://github.com/ruby/ruby.wasm/blob/394841d142fabc2287e7f918a605c70…
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でブラウザ向けプログラミングするために <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 次のモ…
ruby.wasmでrequire_relativeするやつの進捗状況 - @ledsun blogでSystemStackErrorがでると書きました。 ruby.wasmのリポジトリのissueで次の情報を見つけました。 https://github.com/ruby/ruby.wasm/issues/133#issuecomment-1365825417 evalAsync intern…
今は、ruby.wasmでrequire_relativeを使えるようにしたい - Qiitaからそんなに状況は変わっていません。 少し違うのは、このときは 2回呼ぶとPromiseの完了待ちが無限にブロックされます でした。 いま*1は SystemStackErrorがでます。 requrie_relativeは再…
JS::Object.awaitが返らないときがある? - @ledsun blog にて次のような疑問を持ちました。 this.vm.evalAsync(script.ScriptBody)の中でthis.vm.evalAsync(script.ScriptBody)するのがよくないのでしょうか? 素朴にevalAsyncの中でevalAsyncを呼ぶとどう…
JS::Object.await ふたたび - @ledsun blog で、JS::Object.awaitの使い方がわかりました。 そこでfetchを使ってrequire_relativeを実装します。 import { RubyScript } from "./RubyScript"; import { EvaluatedScriptStack } from "./EvaluatedScriptStack…
次のスクリプトはエラーになるでしょうか? <html> <script src="https://cdn.jsdelivr.net/npm/ruby-head-wasm-wasi@0.5.0/dist/browser.script.iife.js"></script> <script type="text/ruby"> require "js" JS::global.send(:require, 'erb') erb = ERB.new("Hello <%= val %>!") puts erb.result_with_hash val: "world" </script> </html> ヒ…
JS::Object.await - @ledsun blog に対してフォローをもらいました。 すごーく遅レスですが、最近追加したメソッドまで追っていただいてありがとうございます!コメントが大変紛らわしい書き方だったんですが、Ruby側でJSのPromiseを待てるもの、という認識…
ruby.wasmについて、現時点で僕が思っていることを記録しておきます。 思っていること 主にonブラウザ 僕がruby.wasmに興味があるのは、ブラウザで動かす方です。 エッジワーカーで動かす方は今のところあまり興味がありません。 また、ruby.wasmがプロダク…
require_relativeはパッチれない - @ledsun blog で、Rubyスクリプトの実行前に、Rubyスクリプトを静的にあつかってrequire_relativeを置き換えることにしました。 そこで次のアイデアを思いつきました。 Rubyスクリプトの実行前に、require_relativeの参照…
fetchは非同期だった - @ledsun blog でfetchの完了をRuby側で待てなくて、require_relativeの順番の制御が上手く行きませんでした。 ruby.wasmでJS::Object.awaitという関数を見つけました。 名前からするとPromiseを待てそうな関数です。 これを使えばfetc…
requrie_relativeをハックしたい require_relativeの相対参照の起点となるもの - @ledsun blog でRubyスクリプトのURLを保持する必要があるとわかりました。 そこで次の感じでURLを保持したVMクラスを作りました。 import { RubyScriptAndSourceURL } from "…
ruby.wasmのrequire_relativeでfetchする - @ledsun blog fetchは非同期だった - @ledsun blog の続きです。前回fetchで実装してみたところ、非同期APIではrequire_relativeの同期性*1を保証できないことに気が付きました。 ブラウザから同期でHTTPリクエス…
ruby.wasmのrequire_relativeでfetchする - @ledsun blog で良い感じに require_relative をfetchに置き換えられました。 ところがfetchは非同期関数なのです。 次のようなRubyスクリプトがあります。 require_relative "a-1" require_relative "a-2" p 'a l…
ruby.wasmをブラウザで動かす時require_relativeを相対パスへのfetchに置き換えられる? - @ledsun blog で ruby.wasm ハックアイデアを思いつきました。 実際にやってみます。 packages/npm-packages/ruby-wasm-wasi/src/browser.script.ts に次のようなコ…
ruby.wasmをブラウザで動かす時require_relativeを相対パスへのfetchに置き換えられる? - @ledsun blog で、ruby.wasmをハックしようと考えました。 実際どうすればハック出来るのかよくわかりません。 irb.wasm がgem関数でgemインストール出来ることがわ…
Enable src attribute in script tag in browser.script.iife.js. by ledsun · Pull Request #49 · ruby/ruby.wasm · GitHub が取り込まれたので使ってみました。 <script defer src="https://cdn.jsdelivr.net/npm/ruby-head-wasm-wasi@0.3.0-2022-10-01-a/dist/browser.script.iife.js"></script> <script type="text/ruby" src="main.rb">…