おんがえしの blog

作ったプログラムと調べた技術情報

rconv - Ruby WASMでプログラム電卓を作りました

https://rconv.ongaeshi.me

Ruby on Browser に続いて Ruby WASM/WASI で電卓っぽいものを作りました。 ongaeshi.hatenablog.com

テキストボックスの内容を入力としてRubyスクリプトに渡して評価し実行結果を出力します。つまり入力→変換→出力するRubyアプリケーションがブラウザ上で簡単に作れます。コードはURLに記録されるので簡単に共有することができます。

基本

Rconv.set()メソッドに渡したブロックの中身が変換プログラムになります。ブロック引数に渡されるのはテキストボックスの内容がevalされたものです。Always string = true のときは常に文字列になります。ブロックの戻り値、もしくは標準出力に何か出力されたときはその内容が、そうでないときはブロックの戻り値が出力されます。

例えば irb 風の挙動を作りたいときはこんな感じ。(入力途中で出てくるエラーメッセージも大変分かりやすくてここはCRubyの蓄積が効いているなぁと思います)

Rconv.set(title: "Rconv", default: 1) do |e|
  p e
end

自分はRubyでいくつかのキーワードをまとめて置換するテキストフィルターみたいなやつをよく書くのですが、そういうのも得意です。

Rconv.set(title: "テキスト置換", default: 1) do |e|
  e.gsub(/\bProgress\b/, "Progressssss")
  .gsub(/@color\b/, "@colorrrr")
  .gsub(/@tty\b/, "@ttyyyyyy")
end

応用

10進数を16進数、2進数に変換したり、

def to_hex_bin(num)
  puts num
  puts "0x" + num.to_s(16)
  puts "0b" + num.to_s(2)
end

Rconv.set(title: "10進数を16進数、2進数に変換",
          default: 4660) do |e|
  to_hex_bin(e)
end

byteからKiB, MiB, GiBに変換とか。

def b2k(byte, n)
  (byte / (2 ** n).to_f).round(2)
end

def puts_b2k(byte, n, unit)
  v = b2k(byte, n)
  puts "#{v} #{unit}" if v != 0
end
  
def byte_to_kib(byte)
  puts "#{byte} byte"
  puts_b2k(byte, 10, "KiB")
  puts_b2k(byte, 20, "MiB")
  puts_b2k(byte, 30, "GiB")
  puts_b2k(byte, 40, "TiB")
  puts_b2k(byte, 50, "PiB")
  puts_b2k(byte, 60, "EiB")
end

Rconv.set(title: "byteからKiB, MiB, GiBに変換") do |e|
  byte_to_kib(e)
end

またRuby/WASMはCRubyなのでちまたにあるRubyスクリプトを移植することができます。自分は昔作ったcaseninjaというgemを移植しました。(変数名を任意のケースに変換することができるプログラム) 結構愛用しています。

(これは長いのでリンク貼ります) Caseninja -rconv

おわりに

rconv/sample.ja.md at main · ongaeshi/rconvにここで紹介したサンプルコードも置いてあるので是非遊んでみてください。よいものができたら #rconv とかで教えてくれると喜びます。