@ledsun blog

Hのキーがhellで、Sのキーがslaveだ、と彼は思った。そしてYのキーがyouだ。

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

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

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ランタイムで動かす - @ledsun blog でブラウザで動くRubyスクリプトができました。 スマートフォンでみれるように、ホスティングします。 しました。 https://wordle-search.onrender.com/ です。 スマートフォンで見…

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スクリプト…

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部分をフロントエンドとバックエンドに分けました。 もう、この辺でわかり…

Roslynを使ってC#のクラス名を変更する

Roslynを使ってC#のソースコードを編集する - @ledsun blog でRoslynをつかうとC#のソースコードが編集出来るとわかりました。 編集内容を変えて練習します。 クラス名を変えてみます。 using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp;…

Roslynを使ってC#のソースコードを編集する

自分で自分用のC#のソースコード編集ツールをつくったら捗りそうなことに気がつきました。 ググってみたら GitHub - dotnet/roslyn: The Roslyn .NET compiler provides C# and Visual Basic languages with rich code analysis APIs. というのでC#のソース…

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…

Rubyでπを計算する

jRubyが並列に動くのか確かめたいです。 CPUバウンドな時間が掛かる処理があるといいはず。 計算に時間が掛かる処理と言えばπの計算です。 BigMath::PIより早く円周率を計算する - Qiitaを参考にして、Rubyでπを計算してみます。 require "bigdecimal" requi…

VPN接続するとWSL内でgitが使えなくて困っていたところを通りすがりの同僚に助けてもらった話

同僚に次のブログを教えてもらいました。 blog.jicoman.info 初めてこの現象に出会ったときは、VPN接続が必要なgitリポジトリが相手でした。 なんとなくそういうもんかな?と思ってスルーしました。 スルーというかMac端末で作業を進めることにしました。 そ…

WSLにjRubyをインストールしてみる

Ubuntu にrbenvを使ってrubyとjrubyをインストールする方法 - Qiita を参考にします。 rbenvはインストール済みです。 ledsun@MSI:~[1]►rbenv --version rbenv 1.2.0-1-g6cc7bff Javaもインストールされています。 ledsun@MSI:~►java --version openjdk 11.0…

WSL上のfish-shellからWindowsのホストのディレクトリでプロンプト表示に時間がかかることがある

現象 表題がわかりにくいですね。 動画で再現するとこうです。 gyazo.com lsコマンドを実行すると、結果が表示されます。 すこし待つとプロンプトが表示されます。 fishのversionは 3.3.1 です。 今、原因の候補と考えているもの プロンプトの右側にgitの情…

Rails 7のload_async

Rails 7の新機能を見ていて次の機能があることに気がつきました。 Ruby on Rails 7の主要な新機能・機能追加・変更点 - Qiita ActiveRecord::Relation#load_asyncを使用することによって、非同期でSQLクエリを実行し、結果を取得することができるようになり…

Railsガイド日本語訳への貢献

雑談会 - @ledsun blog で 昔使ってたDelayed::Jobがなくなっていた と書いたら次のような情報を頂きました。 ちなみに、Railsガイドの英語版を見ると、Delayed::Jobの記載はありますね~https://t.co/mSD6s4Gz5N— thinkAmi (@thinkAmi) August 14, 2022 修…

スレッドワーカーのSidekiqで並列化できるわけもなく

処理を並列化したらデータベースアクセス速度が低下した謎 - @ledsun blog で「SidekiqのジョブをつかってCPUバウンドな処理を並列化したのに速度低下しておかしい。」みたいなことを書きました。 冷静に考えたら並列化されてません。 RubyのスレッドにはGlo…

処理を並列化したらデータベースアクセス速度が低下した謎

ActiveJobとSidekiqで実装されたとある非同期処理を高速化しようと試みています。 入力ファイルからデータを読み取ってDBへ保存する処理です。 事前処理がそれなりにあるのでCPUバウンドな処理とI/Oバウンドな処理が半々ぐらいです。 CPUバウンドな処理は並…

thorのワーニング

現象 あるRailsアプリケーションのRailsのバージョンを6.1.5にアップグレードしたところ、rails consoleを実行すると次のようなthor gemのワーニングがでるようになりました。 ledsun@MSI:~/pubannotation►bin/rails c Deprecation warning: Expected string…

MSXって何が良かったの?

ツイッターでつぶやいたらいろいろなご意見が寄せられました。 まとめておきます。 ・ゲーム機感覚のカートリッジ・テレビに繋がる=安価・機体の選択肢豊富とかかなぁ。友達が持ってたけどゲーム機になってたな。 https://t.co/r4sXTcaIN0— さけいくら (@sa…

WezTerm

Windows Terminalに不満はないです。 俺は新しいツールも使いこなせるんだ、という欲望を満たすために wezterm - Wez's Terminal Emulator を使っています。 Windowsにはwingetでインストールできました。 6月27日にインストールを試したときは上手く行きま…

activerecord-importを速くつかう

速度を計測する簡単なスクリプトが手に入りました。 計測しやすくするために、よりシンプルに変更します。 class User < ApplicationRecord class << self def benchmark_bulk_insert # create data instances = [] 1_000.times { instances << new(name: 'n…