Cloudflare Tech Talk in Fukuoka Uchio Kondo / @udzura
Uchio Kondo
@udzura
Fukuoka.wasm をやります!!!!!!!!1
9/17 にもくもく会をします。
はじめに
Cloudflare WorkersでRubyを動かすモチベって?
前半
Uzumibiの紹介
すぐ試せます
後半
今開発しているもの「Uzumibi2(仮)」
ruby.wasm
ruby+stdlib.wasm はおよそ 9 MB (gzip) 程度あるため、無料プラン (Free) の 3 MiB バンドル上限を超えてしまいます。
プラットフォームごとに adapter / template を用意
mruby/edge
import wasmModule from "./app.wasm"; const instance = await WebAssembly.instantiate( wasmModule, { env: { /* Ruby向けのhost functions */ } }, ); const wasm = instance.exports;
Rubyアプリは、Wasm化したmruby/edge(Ruby VM)の上で動く
Rubyの返り値をエンコードしてWasmから渡し、JavaScriptで復元する
app.rb
app = Proc.new do |env| [ 200, { "content-type" => "text/plain" }, ["Hello, world!\n"] ] end Picoruby.run app
アプリケーションとサーバの間の規約。PSGI / WSGI と同じ考え方。
4.2.1
$ npm run check Total Upload: 734.10 KiB / gzip: 292.33 KiB --dry-run: exiting now.
bare raise
\Z
*
match = /\A(?<path>.*?)\Z/.match("a/b") match["path"] # CRubyでは "a/b", mruby では nil
||=
&&=
def example result = :result begin result ensure value ||= [] end end example # CRubyでは :result、修正前mrubyでは nil
class FooError < StandardError; end begin raise FooError, "bar" rescue raise end
raise
RuntimeError
begin raise FooError, "bar" rescue => e raise e # これだけで対応できる end
class SinatraCoversApp < Sinatra::Base get "/" do "Sinatra #{Sinatra::VERSION}" end end
scenario "GET route" do get "/" assert_status 200 assert_body "Sinatra 4.2.1" end
picoruby-cloudflare-template
gem install picoruby-cloudflare-template --pre picoruby-cloudflare new ./my-mruby-worker cd ./my-mruby-worker && bundle install && npm install PICORUBY_ROOT=/path/to/picoruby npm run dev