SlideShare a Scribd company logo
emruby:
ブラウザで動くRuby
銀座Rails #32
Yusuke Endoh
1
自己紹介:遠藤侑介 (@mametter)
• クックパッドで働くフルタイムRubyコミッタ
• Ruby 3添付の静的解析ツールTypeProf作ってます
• https://github.com/ruby/typeprof
• でも今日はぜんぜん違う話をします
2
emruby: ブラウザの上で動くRuby
https://mame.github.io/emruby/
3
emrubyの狙い
• ブラウザでRubyが動くのは楽しい
• 頑張ればTryRuby(お試し環境)くらいにはなるか?
• 将来的にJavaScriptの代替になるかはWASM次第?
• Rust / Go / KotlinなどもWASM出力に対応してるので
• おことわり
• この発表にはRailsもRuby言語もほとんど出てきません
• Rubyのビルドの知識が少し身につきます
4
Rubyをブラウザで動かす関連研究
• Opal: JavaScriptで書かれたRubyインタプリタ
• https://github.com/opal/opal
• Artichoke: Rustで書かれたRubyインタプリタ(WASM出力対応)
• https://github.com/artichoke/artichoke
• repl.it: Ruby 1.8をEmscriptenしたもの(らしい)
• https://github.com/replit-archive/emscripted-ruby
• Ruby on WebAssembly: mrubyをEmscriptenしたもの
• https://github.com/blacktm/ruby-wasm
• RubyのNaClサポート(2012~2017)
• よくまとまってる記事
• https://blog.unasuke.com/2021/products-about-webassembly-and-ruby/
5
アジェンダ
• ➔WASM / Emscriptenとは
• emrubyが動くまで
• まとめ
6
WebAssembly (WASM)
• ブラウザの上で動く実行ファイル形式
• 2017年頃からメジャーブラウザが対応している
• JavaScriptより速くて (?) 小さいらしい
7
Emscripten
• C/C++のプログラムをWASMに変換するコンパイラ
• LLVMベース
• デモ一覧(古そう):https://github.com/emscripten-
core/emscripten/wiki/Porting-Examples-and-Demos
• http://kripken.github.io/boon/boon.html
• https://files.unity3d.com/jonas/AngryBots/
• http://coolwanglu.github.io/vim.js/emterpreter/vim.html
8
Emscriptenの基本的な使いかた
9
#include <stdio.h>
int main() {
printf("hello, world!¥n");
return 0;
}
emcc hello.c –o hello.js && node hello.js
emcc hello.c –o hello.html
アジェンダ
• WASM / Emscriptenとは
• ➔emrubyが動くまで
• まとめ
10
前提知識:Rubyのふつうのビルド
• Rubyソースのディレクトリで次のコマンドを打つ
• ./configure: 環境ごとにビルド方法を調整する
• どのシステム関数が使えるか、コンパイラオプションが使えるか
• OS、コンパイラ、バージョンなどの違いを調べる
•make: ソースコードをコンパイルする
• まずminirubyという制限版ruby実行ファイルを作る
• minirubyを使ってスクリプト(Rubyで書かれている)を動かし、
拡張ライブラリや最終的なruby実行ファイルを作る
11
./configure && make
話の流れ
• minirubyをWASMにする
• 本当のrubyをWASMにする
• 最終目標:irbを動かす?
12
./configure && makeのEmscripten化
• Emscriptenはconfigure+makeに対応している
• emconfigure / emmakeはビルドをうまくだまして
Emscriptenコンパイラを使わせる
• これだけ……ではない
• 実用プログラムがゼロ変更でビルドできることは無いと思う
13
emconfigure ./configure && emmake make
Emscriptenが未実装のC関数に対処する
• 問題:Emscriptenで利用できないC関数がいっぱいある
• popenがない
• pthread_createはあるがpthread_killはない
• pthread_createはあるがpthread_attr_getguardsizeがない
• pthread_sigmaskはあるけど実際には動かない (!) 、など
• configureの盲点をつくような未実装がいろいろあった
• 対処:Rubyのconfigureを改善して対応した
• コミッタなので、Ruby側を直接変更しまくった
14
Rubyは関数の引数の数にルーズだった
• C言語では、関数に引数を余分に渡しても良い (!?)
• C言語仕様違反だが、
多くのCコンパイラで動く
• Rubyはこれに依存していた
• Emscriptenのオプションで
対応した
• -s EMULATE_FUNCTION_POINTER_CASTS=1
15
int foo(int a) {
printf("%d¥n", a);
}
int main() {
int(*foo2)(int,int) =
(int(*)(int,int))foo;
foo2(42, 43); // 42
}
1引数の関数fooを2引数で呼び出す例
miniruby.wasmできた!
• 2018年はこの段階で公開した
• 残念なお知らせ
• EMULATE…オプションがEmscirptenから削除された
• コンパイルできなくなった
• どうしたか
• 放置した → 3年経ったら、Ruby側が直っていた!
• 微修正で2021年1月に再ビルドに成功した
16
話の流れ
• minirubyをWASMにする
• ここまでできた
• 本当のrubyをWASMにする
• 最終目標:irbを動かす?
17
ruby.wasmを作るには
• ふつうのrubyのビルドには、minirubyが必要
• しかしminiruby.wasmはLinuxで実行できない
• クロスコンパイルする
• ビルド環境とはちがう環境の実行ファイルを作ること
• Linuxでruby.exe(Windowsの実行ファイル)を作る、とか
• 今回はLinuxでruby.wasmを作る
• emconfigureはかえってややこしくなるのでやめた
18
Rubyのクロスコンパイル
• Rubyのconfigureはクロスコンパイルに対応している
• minirubyの代わりにビルド環境のrubyを使ってくれる
• これで一応ruby.wasmはできた
• が、全然動かないのでデバッグ&ドキュメント&ソース読み
19
$ ./configure ¥
--build x86_64-pc-linux-gnu ¥
--host wasm32-unknown-emscripten ¥
CC=emcc LD=emcc AR=emar RANLIB=emranlib
$ make
ビルド環境
対象環境
Emscripten
問題:Rubyの保守的GC
• 保守的GCとは
• マシンスタックの値がオブジェクトの参照であると仮定して
マーク対象とするガベージコレクタの方式
• https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%BC%E3%82%AF%E3%83%BB%E3%82%A2%E3%83%B3%E3%83%89%E3%83%BB%E3%82%B9%E3%82%A4%E3%83%BC%E3%
83%97#%E4%BF%9D%E5%AE%88%E7%9A%84%E3%81%AA%E3%82%AC%E3%83%99%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%BF
• つまり意図的にC言語仕様違反なメモリアクセスをする
• Emscriptenのメモリモデルでは全然動かない
• 対処:Emscriptenが保守的GC用のAPIを用意していた
• emscripten_scan_stack / emscripten_scan_registers
• スタックの先頭と終端がわかる、これらを使うようにした
20
余談:Fiberに対応する(未完)
• Rubyは2018年末にFiberの一部をアセンブリで実装した
• Emscriptenでx86アセンブリはコンパイルできないので
コンパイルエラーになっていた
• 対処:EmscriptenのAPIを使って実装した
• emscripten_fiber_init / emscripten_fiber_swap
• コンパイルオプション -s ASYNCIFY と合わせて使う
• miniruby.wasmでは動いたが、ruby.wasmでは動かない
• 原因未解明、今後の課題
• とりあえずFiber使わなければ問題ない
21
問題:動的リンクができない
• つまり、拡張ライブラリの require ができない
• require "ripper"したらripper.soを動的リンクする
• しかしEmscriptenは動的リンクに未対応(たぶん)
• 解決:ripperを静的リンクした
• 他にも必要な拡張ライブラリを色々足した
22
$ ./configure ¥
--with-static-linked-ext --with-ext=ripper …
$ make
その他Emscripten特有っぽい話
• リンクが失敗する(htonsが見つからない、とか)
• -lcでlibcを明示的にリンクすれば動いた
• -fstack-protectorも対応してないようなので消した
• すぐメモリ不足エラーになる
• Emscriptenはデフォルトでメモリサイズを固定確保する
• サイズ可変にするオプションをつけた
(-s ALLOW_MEMORY_GROWTH=1)
• stack overflowの検出が動かないので止めた、など
23
ruby.wasmできた!
• require "ripper.so"も動く
• ある程度複雑なRubyスクリプトも動く
24
話の流れ
• minirubyをWASMにする
• 本当のrubyをWASMにする
• ここまでできた
• 最終目標:irbを動かす?
25
irbを動かすのに必要なもの
• Rubyインタプリタ(できた)
• ripper.soなどの拡張ライブラリ(できた)
• irbのソースコード(あるけどまだ組み込んでない)
• 端末エミュレータ(無い)
26
仮想ファイルシステム
• Emscriptenのfile_packagerツールで作れる
• irbやrubygemsなど必要なRubyソースコードをまとめた
• fs.jsとfs.dataができた
• がんばってロードできるようにした
• コンパイルオプションに-s FORCE_FILESYSTEM=1追加
• fs.jsを<script>で呼ぶだけ……なのだが意外と苦労した
27
xterm.jsを組み込む
• xterm.js: ブラウザで動く端末エミュレータ
• https://xtermjs.org/
• VS Codeでも使われている
• 残念なお知らせ
• Emscriptenは標準入出力の実装がいまいち
• とりあえずの対応
• ライン編集はxterm.js側でやり、irbには行単位で送る
• reline(irbの新しい編集機能)の活用は今後の課題
28
ということで
https://mame.github.io/emruby/irb/
29
CPU 100%を防ぐ
• Emscriptenの生成物はほぼ同期で動く(asyncでない)
• 入力待ちをポーリングでやるみたい(ゲーム想定?)
• 対処:別スレッド(Web Worker)で動かすようにした
• 通信方法はvim.wasmに習った(SharedArrayBuffer使用)
https://rhysd.hatenablog.com/entry/2019/06/13/090519
• 残念なお知らせ:5月に動かなくなる見込み
30
ということで
• (かなり妥協したけど)irbがブラウザで動いた!
• rubygems、did_you_meanなども一応動いているっぽい
31
落ち穂拾い
• ruby.wasmのサイズ:29 MB
• コンパイルオプションで調整して8 MB
• -Os: 省サイズ重視で最適化する
• -g0: デバッグ情報を省く
32
Emscripten所感
• 夢の技術ではない
• 現実のC言語コードをゼロ変更でビルドできることは無い
• いっぱい問題に遭遇する
• が、とてもよくできている
• 一生懸命調べればたいてい対処方法やAPIがある
• 検索に頼らずドキュメントを通して読むのが早道
• 動いたらとても嬉しい
33
まとめ
• ブラウザで動くRuby、emrubyを紹介しました
• 大体Ruby側で対応したのでたったこれだけでビルドできる
34
$ ./configure ¥
--build x86_64-pc-linux-gnu ¥
--host wasm32-unknown-emscripten ¥
--with-static-linked-ext ¥
--with-ext=ripper,date,strscan,io/console,…,psych ¥
optflags=-Os debugflags=-g0 ¥
CC=emcc LD=emcc AR=emar RANLIB=emranlib
$ make
今後の予定
• ほそぼそとメンテナンスするつもり
• WASMが大ヒットする日に備える
• そのとき「RubyもWASM対応してます」と言いたい
• RubyからJSやDOMを操作できたらいいなあ
• 当面はOpalを使うのがいいと思います
• WASM版TryRubyができたらいいなあ
• Opalであまり問題はないですが
35

More Related Content

What's hot

Ruby で高速なプログラムを書く
Ruby で高速なプログラムを書くRuby で高速なプログラムを書く
Ruby で高速なプログラムを書く
mametter
 
Railsアプリのモジュールはどこに置くべきか問題 (公開版)
Railsアプリのモジュールはどこに置くべきか問題 (公開版)Railsアプリのモジュールはどこに置くべきか問題 (公開版)
Railsアプリのモジュールはどこに置くべきか問題 (公開版)
Ken Muryoi
 
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版
Masahito Zembutsu
 
JSでファミコンエミュレータを作った時の話
JSでファミコンエミュレータを作った時の話JSでファミコンエミュレータを作った時の話
JSでファミコンエミュレータを作った時の話
sairoutine
 
大規模スクラムの失敗から学んだこと #AgileJapan2015
大規模スクラムの失敗から学んだこと #AgileJapan2015大規模スクラムの失敗から学んだこと #AgileJapan2015
大規模スクラムの失敗から学んだこと #AgileJapan2015
Itsuki Sakitsu
 
PHP の GC の話
PHP の GC の話PHP の GC の話
PHP の GC の話
y-uti
 
協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用
協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用
協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用
Life Robotics
 
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLiveDXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
Tokoroten Nakayama
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
shinjiigarashi
 
40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること
onozaty
 
error_highlight: User-friendly Error Diagnostics
error_highlight: User-friendly Error Diagnosticserror_highlight: User-friendly Error Diagnostics
error_highlight: User-friendly Error Diagnostics
mametter
 
Intel 82599 10GbE Controllerで遊ぼう
Intel 82599 10GbE Controllerで遊ぼうIntel 82599 10GbE Controllerで遊ぼう
Intel 82599 10GbE Controllerで遊ぼうTakuya ASADA
 
[NEDO特別講座] OSS活用のためのライセンス解説コース
[NEDO特別講座] OSS活用のためのライセンス解説コース[NEDO特別講座] OSS活用のためのライセンス解説コース
[NEDO特別講座] OSS活用のためのライセンス解説コース
NEDOROBOMARC
 
自作flutterアプリをリファクタリングしてみた!
自作flutterアプリをリファクタリングしてみた!自作flutterアプリをリファクタリングしてみた!
自作flutterアプリをリファクタリングしてみた!
とさ はるき
 
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
Tadahiro Ishisaka
 
DSLの使い所
DSLの使い所DSLの使い所
DSLの使い所
disc99_
 
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くかDDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
Koichiro Matsuoka
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
Akihiko Horiuchi
 
Deflate
DeflateDeflate
Deflate
7shi
 

What's hot (20)

Ruby で高速なプログラムを書く
Ruby で高速なプログラムを書くRuby で高速なプログラムを書く
Ruby で高速なプログラムを書く
 
Railsアプリのモジュールはどこに置くべきか問題 (公開版)
Railsアプリのモジュールはどこに置くべきか問題 (公開版)Railsアプリのモジュールはどこに置くべきか問題 (公開版)
Railsアプリのモジュールはどこに置くべきか問題 (公開版)
 
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版
 
JSでファミコンエミュレータを作った時の話
JSでファミコンエミュレータを作った時の話JSでファミコンエミュレータを作った時の話
JSでファミコンエミュレータを作った時の話
 
大規模スクラムの失敗から学んだこと #AgileJapan2015
大規模スクラムの失敗から学んだこと #AgileJapan2015大規模スクラムの失敗から学んだこと #AgileJapan2015
大規模スクラムの失敗から学んだこと #AgileJapan2015
 
PHP の GC の話
PHP の GC の話PHP の GC の話
PHP の GC の話
 
協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用
協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用
協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用
 
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLiveDXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
 
40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること
 
error_highlight: User-friendly Error Diagnostics
error_highlight: User-friendly Error Diagnosticserror_highlight: User-friendly Error Diagnostics
error_highlight: User-friendly Error Diagnostics
 
Intel 82599 10GbE Controllerで遊ぼう
Intel 82599 10GbE Controllerで遊ぼうIntel 82599 10GbE Controllerで遊ぼう
Intel 82599 10GbE Controllerで遊ぼう
 
[NEDO特別講座] OSS活用のためのライセンス解説コース
[NEDO特別講座] OSS活用のためのライセンス解説コース[NEDO特別講座] OSS活用のためのライセンス解説コース
[NEDO特別講座] OSS活用のためのライセンス解説コース
 
自作flutterアプリをリファクタリングしてみた!
自作flutterアプリをリファクタリングしてみた!自作flutterアプリをリファクタリングしてみた!
自作flutterアプリをリファクタリングしてみた!
 
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
 
DSLの使い所
DSLの使い所DSLの使い所
DSLの使い所
 
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くかDDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
 
Deflate
DeflateDeflate
Deflate
 

Similar to emruby: ブラウザで動くRuby

Ruby on Windows
Ruby on WindowsRuby on Windows
Ruby on Windows
Tomoya Kawanishi
 
苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1
苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1
苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1
Takuya Mukohira
 
mrubyでゲームを書いてみた
mrubyでゲームを書いてみたmrubyでゲームを書いてみた
mrubyでゲームを書いてみた
Yousuke Kuroda
 
PHPer のための Ruby 教室
PHPer のための Ruby 教室PHPer のための Ruby 教室
PHPer のための Ruby 教室
higaki
 
軽量Ruby『mruby』について
軽量Ruby『mruby』について軽量Ruby『mruby』について
軽量Ruby『mruby』について
Ryosuke MATSUMOTO
 
RubyからC#を扱う
RubyからC#を扱うRubyからC#を扱う
RubyからC#を扱う
107steps
 
mrubyボードを使って こんなことしてみました Kansai.mrb 2014 dec
mrubyボードを使って こんなことしてみました Kansai.mrb 2014 decmrubyボードを使って こんなことしてみました Kansai.mrb 2014 dec
mrubyボードを使って こんなことしてみました Kansai.mrb 2014 dec
Yoshito Tanaka
 
RubyでGUIアプリケーションを書く
RubyでGUIアプリケーションを書くRubyでGUIアプリケーションを書く
RubyでGUIアプリケーションを書く
Misao X
 
Ruby Enterprise Environment
Ruby Enterprise EnvironmentRuby Enterprise Environment
Ruby Enterprise Environment
Tomoya Kawanishi
 
mruby for embedded systems
mruby for embedded systemsmruby for embedded systems
mruby for embedded systems
masayoshi takahashi
 
VMを改めて学んで見る
VMを改めて学んで見るVMを改めて学んで見る
VMを改めて学んで見る
kishima7
 
RubyConfの話の続きのおはなし
RubyConfの話の続きのおはなしRubyConfの話の続きのおはなし
RubyConfの話の続きのおはなし
yamanekko
 
V6 Interpreter (Nagoya Geek Bar 2011-05-02)
V6 Interpreter (Nagoya Geek Bar 2011-05-02)V6 Interpreter (Nagoya Geek Bar 2011-05-02)
V6 Interpreter (Nagoya Geek Bar 2011-05-02)
7shi
 
Ruby東京プレゼン 資料
Ruby東京プレゼン 資料Ruby東京プレゼン 資料
Ruby東京プレゼン 資料
Kazuaki Tanaka
 
マニアックなRuby 2.7新機能紹介
マニアックなRuby 2.7新機能紹介マニアックなRuby 2.7新機能紹介
マニアックなRuby 2.7新機能紹介
mametter
 
Ruby と C# をつなぐ
Ruby と C# をつなぐRuby と C# をつなぐ
Ruby と C# をつなぐ
107steps
 
VimとRubyのアツい関係
VimとRubyのアツい関係VimとRubyのアツい関係
VimとRubyのアツい関係Misao X
 
Ember コミュニティとわたし
Ember コミュニティとわたしEmber コミュニティとわたし
Ember コミュニティとわたし
Ryunosuke SATO
 
Rubinius Under a Microscope
Rubinius Under a MicroscopeRubinius Under a Microscope
Rubinius Under a Microscope
高広 内山
 

Similar to emruby: ブラウザで動くRuby (20)

Ruby on Windows
Ruby on WindowsRuby on Windows
Ruby on Windows
 
Mrubyの始め方
Mrubyの始め方Mrubyの始め方
Mrubyの始め方
 
苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1
苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1
苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1
 
mrubyでゲームを書いてみた
mrubyでゲームを書いてみたmrubyでゲームを書いてみた
mrubyでゲームを書いてみた
 
PHPer のための Ruby 教室
PHPer のための Ruby 教室PHPer のための Ruby 教室
PHPer のための Ruby 教室
 
軽量Ruby『mruby』について
軽量Ruby『mruby』について軽量Ruby『mruby』について
軽量Ruby『mruby』について
 
RubyからC#を扱う
RubyからC#を扱うRubyからC#を扱う
RubyからC#を扱う
 
mrubyボードを使って こんなことしてみました Kansai.mrb 2014 dec
mrubyボードを使って こんなことしてみました Kansai.mrb 2014 decmrubyボードを使って こんなことしてみました Kansai.mrb 2014 dec
mrubyボードを使って こんなことしてみました Kansai.mrb 2014 dec
 
RubyでGUIアプリケーションを書く
RubyでGUIアプリケーションを書くRubyでGUIアプリケーションを書く
RubyでGUIアプリケーションを書く
 
Ruby Enterprise Environment
Ruby Enterprise EnvironmentRuby Enterprise Environment
Ruby Enterprise Environment
 
mruby for embedded systems
mruby for embedded systemsmruby for embedded systems
mruby for embedded systems
 
VMを改めて学んで見る
VMを改めて学んで見るVMを改めて学んで見る
VMを改めて学んで見る
 
RubyConfの話の続きのおはなし
RubyConfの話の続きのおはなしRubyConfの話の続きのおはなし
RubyConfの話の続きのおはなし
 
V6 Interpreter (Nagoya Geek Bar 2011-05-02)
V6 Interpreter (Nagoya Geek Bar 2011-05-02)V6 Interpreter (Nagoya Geek Bar 2011-05-02)
V6 Interpreter (Nagoya Geek Bar 2011-05-02)
 
Ruby東京プレゼン 資料
Ruby東京プレゼン 資料Ruby東京プレゼン 資料
Ruby東京プレゼン 資料
 
マニアックなRuby 2.7新機能紹介
マニアックなRuby 2.7新機能紹介マニアックなRuby 2.7新機能紹介
マニアックなRuby 2.7新機能紹介
 
Ruby と C# をつなぐ
Ruby と C# をつなぐRuby と C# をつなぐ
Ruby と C# をつなぐ
 
VimとRubyのアツい関係
VimとRubyのアツい関係VimとRubyのアツい関係
VimとRubyのアツい関係
 
Ember コミュニティとわたし
Ember コミュニティとわたしEmber コミュニティとわたし
Ember コミュニティとわたし
 
Rubinius Under a Microscope
Rubinius Under a MicroscopeRubinius Under a Microscope
Rubinius Under a Microscope
 

More from mametter

TRICK 2022 Results
TRICK 2022 ResultsTRICK 2022 Results
TRICK 2022 Results
mametter
 
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
mametter
 
Enjoy Ruby Programming in IDE and TypeProf
Enjoy Ruby Programming in IDE and TypeProfEnjoy Ruby Programming in IDE and TypeProf
Enjoy Ruby Programming in IDE and TypeProf
mametter
 
TypeProf for IDE: Enrich Development Experience without Annotations
TypeProf for IDE: Enrich Development Experience without AnnotationsTypeProf for IDE: Enrich Development Experience without Annotations
TypeProf for IDE: Enrich Development Experience without Annotations
mametter
 
Ruby 3の型解析に向けた計画
Ruby 3の型解析に向けた計画Ruby 3の型解析に向けた計画
Ruby 3の型解析に向けた計画
mametter
 
Type Profiler: Ambitious Type Inference for Ruby 3
Type Profiler: Ambitious Type Inference for Ruby 3Type Profiler: Ambitious Type Inference for Ruby 3
Type Profiler: Ambitious Type Inference for Ruby 3
mametter
 
Ruby 3の型推論やってます
Ruby 3の型推論やってますRuby 3の型推論やってます
Ruby 3の型推論やってます
mametter
 
A Static Type Analyzer of Untyped Ruby Code for Ruby 3
A Static Type Analyzer of Untyped Ruby Code for Ruby 3A Static Type Analyzer of Untyped Ruby Code for Ruby 3
A Static Type Analyzer of Untyped Ruby Code for Ruby 3
mametter
 
A Plan towards Ruby 3 Types
A Plan towards Ruby 3 TypesA Plan towards Ruby 3 Types
A Plan towards Ruby 3 Types
mametter
 
Ruby 3 の型解析に向けた計画
Ruby 3 の型解析に向けた計画Ruby 3 の型解析に向けた計画
Ruby 3 の型解析に向けた計画
mametter
 
A Type-level Ruby Interpreter for Testing and Understanding
A Type-level Ruby Interpreter for Testing and UnderstandingA Type-level Ruby Interpreter for Testing and Understanding
A Type-level Ruby Interpreter for Testing and Understanding
mametter
 
本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能
mametter
 
Transcendental Programming in Ruby
Transcendental Programming in RubyTranscendental Programming in Ruby
Transcendental Programming in Ruby
mametter
 
Cookpad Hackarade #04: Create Your Own Interpreter
Cookpad Hackarade #04: Create Your Own InterpreterCookpad Hackarade #04: Create Your Own Interpreter
Cookpad Hackarade #04: Create Your Own Interpreter
mametter
 
TRICK 2018 results
TRICK 2018 resultsTRICK 2018 results
TRICK 2018 results
mametter
 
Type Profiler: An Analysis to guess type signatures
Type Profiler: An Analysis to guess type signaturesType Profiler: An Analysis to guess type signatures
Type Profiler: An Analysis to guess type signatures
mametter
 
Esoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in RubyEsoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in Ruby
mametter
 
Cookpad Spring 1day internship 2018 超絶技巧プログラミングコース資料
Cookpad Spring 1day internship 2018 超絶技巧プログラミングコース資料Cookpad Spring 1day internship 2018 超絶技巧プログラミングコース資料
Cookpad Spring 1day internship 2018 超絶技巧プログラミングコース資料
mametter
 
Esoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in RubyEsoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in Ruby
mametter
 
An introduction and future of Ruby coverage library
An introduction and future of Ruby coverage libraryAn introduction and future of Ruby coverage library
An introduction and future of Ruby coverage library
mametter
 

More from mametter (20)

TRICK 2022 Results
TRICK 2022 ResultsTRICK 2022 Results
TRICK 2022 Results
 
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
 
Enjoy Ruby Programming in IDE and TypeProf
Enjoy Ruby Programming in IDE and TypeProfEnjoy Ruby Programming in IDE and TypeProf
Enjoy Ruby Programming in IDE and TypeProf
 
TypeProf for IDE: Enrich Development Experience without Annotations
TypeProf for IDE: Enrich Development Experience without AnnotationsTypeProf for IDE: Enrich Development Experience without Annotations
TypeProf for IDE: Enrich Development Experience without Annotations
 
Ruby 3の型解析に向けた計画
Ruby 3の型解析に向けた計画Ruby 3の型解析に向けた計画
Ruby 3の型解析に向けた計画
 
Type Profiler: Ambitious Type Inference for Ruby 3
Type Profiler: Ambitious Type Inference for Ruby 3Type Profiler: Ambitious Type Inference for Ruby 3
Type Profiler: Ambitious Type Inference for Ruby 3
 
Ruby 3の型推論やってます
Ruby 3の型推論やってますRuby 3の型推論やってます
Ruby 3の型推論やってます
 
A Static Type Analyzer of Untyped Ruby Code for Ruby 3
A Static Type Analyzer of Untyped Ruby Code for Ruby 3A Static Type Analyzer of Untyped Ruby Code for Ruby 3
A Static Type Analyzer of Untyped Ruby Code for Ruby 3
 
A Plan towards Ruby 3 Types
A Plan towards Ruby 3 TypesA Plan towards Ruby 3 Types
A Plan towards Ruby 3 Types
 
Ruby 3 の型解析に向けた計画
Ruby 3 の型解析に向けた計画Ruby 3 の型解析に向けた計画
Ruby 3 の型解析に向けた計画
 
A Type-level Ruby Interpreter for Testing and Understanding
A Type-level Ruby Interpreter for Testing and UnderstandingA Type-level Ruby Interpreter for Testing and Understanding
A Type-level Ruby Interpreter for Testing and Understanding
 
本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能
 
Transcendental Programming in Ruby
Transcendental Programming in RubyTranscendental Programming in Ruby
Transcendental Programming in Ruby
 
Cookpad Hackarade #04: Create Your Own Interpreter
Cookpad Hackarade #04: Create Your Own InterpreterCookpad Hackarade #04: Create Your Own Interpreter
Cookpad Hackarade #04: Create Your Own Interpreter
 
TRICK 2018 results
TRICK 2018 resultsTRICK 2018 results
TRICK 2018 results
 
Type Profiler: An Analysis to guess type signatures
Type Profiler: An Analysis to guess type signaturesType Profiler: An Analysis to guess type signatures
Type Profiler: An Analysis to guess type signatures
 
Esoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in RubyEsoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in Ruby
 
Cookpad Spring 1day internship 2018 超絶技巧プログラミングコース資料
Cookpad Spring 1day internship 2018 超絶技巧プログラミングコース資料Cookpad Spring 1day internship 2018 超絶技巧プログラミングコース資料
Cookpad Spring 1day internship 2018 超絶技巧プログラミングコース資料
 
Esoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in RubyEsoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in Ruby
 
An introduction and future of Ruby coverage library
An introduction and future of Ruby coverage libraryAn introduction and future of Ruby coverage library
An introduction and future of Ruby coverage library
 

Recently uploaded

ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
Matsushita Laboratory
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
Matsushita Laboratory
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
chiefujita1
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
Yuuitirou528 default
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
t m
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
Toru Tamaki
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
0207sukipio
 

Recently uploaded (8)

ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
 

emruby: ブラウザで動くRuby