Road to RubyKaigi 2027 in Miyazaki

2026-04-28 ruby /posts/2026/2026-04-28-ruby-kaigi-counter.png

次のRubyKaigiまでの日数を表示するカウンターを作りました。数え方はお馴染みの(?)開催前日=Day0になる奴です。本当はワークショップで頂いたRP2040搭載のBoard43に実装して壁に飾っとこうと思って始めたんですが、現在時刻の取得方法を思いつかず…断念して、ruby.wasmを使ったウェブページとして実装しました。誰かよいアイデアがあれば教えてほしいです🙏

# 2027/4/14 までの日数 (4/12=-1, 4/13=0, 4/14=1)
now  = Time.now
jst  = now.getlocal("+09:00")
day1 = Time.new(2027, 4, 14, 0, 0, 0, "+09:00")
today_midnight = Time.new(jst.year, jst.month, jst.day, 0, 0, 0, "+09:00")
n = 1 - ((day1 - today_midnight) / 86400).round

day1 は1日目(4/14)の深夜0時です。ポイントは now をそのまま使わずに、JST基準で「今日の深夜0時」today_midnight)を計算してから差を求めるところです。now は現在時刻なので昼間に実行すると now - day1 が「〜日と〜時間」の端数を含み、切り上げや切り捨ての処理が複雑になります。一方、today_midnight はその日の0時ちょうどなので、day1 - today_midnight は常に86400の整数倍になり、終日ぴったり同じ値が返ります。1 - days_until という式は、4/14を「1」・4/13を「0」・4/12を「-1」とする数え方に対応しています(開催前日=Day0のスタイル)。

2026.06.17: 0時0分ちょうどに起動しないと日数が期待した通りにならない不具合を修正しています。

RubyKaigi 2027 Counter

おまけ1: ruby.wasmでブラウザ上でRubyを動かす

<script type="text/ruby"> タグを1行書くだけでブラウザ上でRubyが動きます。Time.nowRUBY_VERSION もそのまま使えます。DOMを触りたいときは JS.global[:document] 経由になります。

<script src="https://cdn.jsdelivr.net/npm/@ruby/4.0-wasm-wasi/dist/browser.script.iife.js"></script>
<script type="text/ruby">
  require 'js'
  doc = JS.global[:document]
  doc.getElementById("debug")[:textContent] = "Hello from Ruby #{RUBY_VERSION}!"
</script>

ロード時間はそれなりにかかりますが、Rubyのコードがそのままブラウザで動くのは不思議な感覚です。

おまけ2: 3×5ピクセルフォントを手書きする

LEDに数字を表示するために、各文字の点灯パターンをハッシュで手書きしています。

'2' => [[1,1,1],[0,0,1],[1,1,1],[1,0,0],[1,1,1]],

1 が点灯、0 が消灯です。配列をそのまま眺めると、なんとなく "2" の形に見える…かも?

おまけ3: Rubyのロゴ

Board43風のLEDクラスを作って、set_rgbを使って描画しています。

[51,52,53,66,67,68,69,70,83,84,85,100].each do |pos|
  led.set_rgb(pos, 230, 50, 25)
end
RubyKaigi 2026 Day3 at Hakodate
2026年5月のはじめ