@ledsun blog

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

Ruby

Railsのタスクを作成する

あるRailsアプリケーションではファイルアップロードのジョブの途中で失敗すると、処理途中のレコードやアップロードしたファイルが残ります。 削除の手順はわかっています。 次の2つのコマンドでDBに残ったデータとアップロードしたファイルが消せます。 bi…

DockerイメージのベースをAlpineからDebianに変えた

ruby:3.0.1-alpine Dockerイメージでsimstring gemがビルドできない - @ledsun blog でRuby 3.0.1 はAlpine上でC拡張Gemのビルドに失敗することがあるとわかりました。 では、3.0.5ではどうでしょうか? config.status: error: in `/simstring': config.stat…

ruby:3.0.1-alpine Dockerイメージでsimstring gemがビルドできない

simstringとswigの問題の切り分け - @ledsun blog で、simstringのgemをビルドするときはprepare.shに--swigオプションをつける必要があることがわかりました。 simstring gemをDocker上で使いたいです。 Dockerコンテナを小さめにするために、Alpine Linux…

simstringとswigの問題の切り分け

Rubyからsimstringを使うにはSWIGが必要です。 - @ledsun blog でビルドしたsimstring gemをRubyから実行時に次のエラーが出ていました。 ledsun@MSI:~/pubdictionaries►ruby -e 'require "simstring"' <internal:/home/ledsun/.rbenv/versions/3.0.1/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in `require': /home/ledsun/.rbenv/versions/3.0.</internal:/home/ledsun/.rbenv/versions/3.0.1/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>…

Rubyからsimstringを使うにはSWIGが必要です。

GitHub - chokkan/simstring: SimString という文字列を検索するライブラリーがあります。 Rubyから使うことができます。 というわけでインストールしてみたのですが次のエラーが起きました。 ledsun@MSI:~/pubdictionaries►ruby -e 'require "simstring"' <internal:/home/ledsun/.rbenv/versions/3.0.1/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:</internal:/home/ledsun/.rbenv/versions/3.0.1/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>…

RubyVMインストラクション1日目

25日間で理解するRubyVMインストラクション - @ledsun blog の1日目が公開されました。 RubyVMはスタックベース仮想マシンです。 スタックに入る値はRubyのオブジェクトがそのまま入る点が特徴的なようです。 例えばduparrayという命令では配列[1, 2, 3]がそ…

Vladimir MakarovさんのRubyKaigi 2022での発表を記事にしたもの?

developers.redhat.com ruby-jp slackで教えてもらいました。 A Faster CRuby interpreter with dynamically specialized IR - RubyKaigi 2022 の内容を記事にしたものらしいです。 この発表をみた僕の感想は A Faster CRuby interpreter with dynamically s…

25日間で理解するRubyVMインストラクション

kddnewton.com ruby-jp slackで教えてもらいました。 Syntax Tree - RubyKaigi 2022 を発表したケビン・ニュートンさんが25日間でRubyVMについて解説してくれるようです。 プロローグの本記事によるとRubyVMのインストラクションを表示する方法が挙げられて…

ruby.wasmのrequire_relativeでfetchする

ruby.wasmをブラウザで動かす時require_relativeを相対パスへのfetchに置き換えられる? - @ledsun blog で ruby.wasm ハックアイデアを思いつきました。 実際にやってみます。 packages/npm-packages/ruby-wasm-wasi/src/browser.script.ts に次のようなコ…

ruby.wasmのハックの仕方

ruby.wasmをブラウザで動かす時require_relativeを相対パスへのfetchに置き換えられる? - @ledsun blog で、ruby.wasmをハックしようと考えました。 実際どうすればハック出来るのかよくわかりません。 irb.wasm がgem関数でgemインストール出来ることがわ…

ruby.wasmをブラウザで動かす時require_relativeを相対パスへのfetchに置き換えられる?

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">…

久しぶりに見知らぬリポジトリにプルリクエストを作成した

プルリクエストを作りました RubyをWebAssemblyで動かすruby.wasmを、ブラウザで動かす時に便利なJavaScriptにbrowser.script.iife.jsがあります。 <script type="text/ruby">にインラインで書いたRubyスクリプトを実行してくれます。 これにsrc属性の対応を追加するパッチです。 アイ…

Stackprofで時間の掛かる処理を探そうとして上手く行かなかった話

RactorでWoker pool - @ledsun blog で、並列化の効果が芳しくないことがわかりました。 どこに原因があるのか知りたいのでstackprof情報を取得します。 Ractor版だと例外がおきます。 PubAnnotationのアノテーション取り込み処理をRactor化したものをStackp…

RactorでWoker pool

Ruby 並行・並列くらべ 2 - @ledsun blog でRactorの並列化とプロセスの並列化が大体同じような性能がでることがわかりました。 Ractorに絞ってもっと性能が出ないか試してみます。 Ractorを作る数を制限していないので、物理コアをこえる数のスレッドを作っ…

https://cdn.jsdelivr.net/npm/ruby-head-wasm-wasi@0.3.0-2022-09-06-f/dist/browser.script.iife.js のsrc属性対応

ruby.wasm/browser.script.ts at d92d1a82256c12604a1e6e15e1269f6d11a81af3 · ruby/ruby.wasm · GitHub を次のようにすれば良いじゃん簡単じゃん?と思っていました。 if (tag.type === "text/ruby") { if (tag.hasAttribute('src')){ const response = awa…

RubyスクリプトをWebAssembly化したRubyランタイムで動かす

wordleの候補をgrepするRubyスクリプト - @ledsun blogをブラウザで動くようにしたいと思います。 ruby.wasm/lucky.html at main · ruby/ruby.wasm · GitHub を参考にして実装していきます。 <html> <script src="https://cdn.jsdelivr.net/npm/ruby-head-wasm-wasi@0.3.0-2022-09-06-f/dist/browser.script.iife.js"></script> <script type="text/ruby"> require "js" di…</html>

wordleの候補をgrepするRubyスクリプト

Wordle - The New York Times を解くとき、次のようにgrepしています。 ledsun@MSI:~/wordle_rb►grep -e '^\w\w\wt\w$' /usr/share/dict/words | grep -v '[o sclh]' | grep a | grep e | grep r Berta Greta Harte grate irate prate これをRubyスクリプト…

Ruby 並行・並列くらべ 2

Ruby並行・並列くらべ - @ledsun blog でRubyの並行・並列の効果を測ってみました。 DBへのIO時間があると、効果がわかりにくかったです。 DBへの書き込み処理をコメントアウトしてリトライしました。 結果 シリアル処理 シリアル処理の実行結果 2m 4s。 DB…

Ruby並行・並列くらべ

Ractorで並列に動いているっぽい? - @ledsun blog の続きです。 Ractorで並列処理が出来そうなので、他の方法と性能を比べてみました。 比べるのは次の4つの方法です。 シリアル処理 スレッド プロセス Ractor シリアル処理は比較用の逐次処理です。 あるAc…

Ractorで並列に動いているっぽい?

次の感じのRubyのソースコードがあります。 annotations_collection_with_doc.each do |annotations, doc| messages += Annotation.prepare_annotations!(annotations, doc, options) end Annotation.prepare_annotations!(annotations, doc, options)の先の…

Stories from developing YJIT

rubykaigi.org は、RubyのYJITでどんな挑戦をしてきたかの話でした。 最初はRubyのinstructionを1:1で機械語に置き換えるところか始めました。 Railsでは遅くなりました。 つぎにJIT部分をフロントエンドとバックエンドに分けました。 もう、この辺でわかり…

ruby/debugをつかってみる

rubykaigi.org を見ました。 良い機会なのでruby/debugを素振りしてみます。 次のRubyスクリプトを書きます。 require 'debug' def baz n n end def bar n baz n end def foo n bar n end binding.b result = foo(100) p result 実行してみましょう。 ledsun…

Ruby複数の実装でたらい回しベンチマーク

sumim.hatenablog.com の追試です。 複数のRuby実装で速さの違いを比べてみます。 スクリプト require 'benchmark' def tak(x, y, z) if x > y then tak(tak(x-1, y, z), tak(y-1, z, x), tak(z-1, x, y)) else y end end Benchmark.bm do |x| x.report do t…

Ruby 3.2.0-preview2

rbevnとruby-buildを使ってRuby 3.2.0-preview2をインストールします。 ledsun@MSI:~►rbenv install 3.2.0-preview2 To follow progress, use 'tail -f /tmp/ruby-build.20220909111902.4631.log' or pass --verbose Downloading ruby-3.2.0-preview2.tar.gz…

もののついでにjRubyでもπを繰り返し計算してみる

JITが効くまでに時間が掛かるのではないか? - @ledsun blog でTruffleRubyを計測したスクリプトがあります。 そのまま流用してjRubyも計測してみます。 スクリプト require "bigdecimal" require "benchmark" def pi prec = 100 conv = 3 a = BigDecimal("1…

MJITとYJITはπの計算には効かないらしい

JITが効くまでに時間が掛かるのではないか? - @ledsun blog で、TruffleRubyはJITが効くまでに40秒の実行時間が必要という仮説を立てました。 YJITやMJITではどうなるのでしょうか? 次のスクリプトを実行して計測してみます。 require "bigdecimal" requir…

TruffleRubyのスイートスポットはどこ?

JITが効くまでに時間が掛かるのではないか? - @ledsun blog でπを1万回計算したらTruffleRubyがCRubyより速く動きました。 一旦TruffleRubyが速くなったら、計算回数をもっと増やしたらTruffleRubyがもっと速く動くことが期待できます。 50000回計算を試し…

JITが効くまでに時間が掛かるのではないか?

いろいろなRubyでπを計算して速さを比べる - @ledsun blog で比較したところTruffle RubyよりCRubyの方がずっと速かったです。 なぜでしょうか? 例えば Ruby 3.0のJITの特性 - @ledsun blog でCRuby 3.0 の MJIT を試した時は実行時間が20秒を超えたあたり…

いろいろなRubyでπを計算して速さを比べる

計測用のスクリプト require "bigdecimal" require "benchmark" Benchmark.bmbm do |x| x.report do prec = 100 conv = 3 a = BigDecimal("1") b = BigDecimal("1") / BigDecimal("2").sqrt(prec) t = BigDecimal("1") / 4 p = BigDecimal("1") for n in 1..…

jRubyでπを計算する

Rubyでπを計算する - @ledsun blog でπを計算するRubyスクリプトが動くことがわかりました。 WSLにjRubyをインストールしてみる - @ledsun blog で設定したjRubyで動かしてみます。 ledsun@MSI:~/ruby-pi►rbenv local jruby-9.3.7.0 ledsun@MSI:~/ruby-pi►ru…