<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Diary - Harukasan-dot-dev</title>
    <link>https://harukasan.dev/posts/diary/</link>
    <description>日々の記録</description>
    <language>ja</language>
    <copyright>© 2025 Shunsuke Michii. Except where otherwise noted, content on this site is licensed under a Creative Commons Attribution 4.0 International license. https://creativecommons.org/licenses/by/4.0/</copyright>
    <lastBuildDate>Sat, 29 Aug 2026 17:15:16 GMT</lastBuildDate>
    <atom:link href="https://harukasan.dev/posts/diary/rss.xml" rel="self" type="application/rss+xml"/>
    <image>
      <url>https://harukasan.dev/images/pixelcat_96x96.png</url>
      <title>Diary - Harukasan-dot-dev</title>
      <link>https://harukasan.dev/posts/diary/</link>
    </image>
    <item>
      <title>アクセスカウンターと拍手の実装</title>
      <link>https://harukasan.dev/posts/diary/20260830-access-counter-and-clap</link>
      <guid isPermaLink="true">https://harukasan.dev/posts/diary/20260830-access-counter-and-clap</guid>
      <pubDate>Sat, 29 Aug 2026 17:15:00 GMT</pubDate>
      <dc:creator>Harukasan</dc:creator>
      <description>個人サイトといえばやはりアクセスカウンターとWeb拍手、これらは承認欲求を満たすための二大要素です。 従前であればCGIを使って実装していたと思いますが、さいきんなのでCloudflare D1で実装しました。 実装はぜんぶClaude Codeにおまかせなので、こういうかんじで...</description>
      <content:encoded>&lt;p&gt;個人サイトといえばやはりアクセスカウンターとWeb拍手、これらは承認欲求を満たすための二大要素です。
従前であればCGIを使って実装していたと思いますが、さいきんなのでCloudflare D1で実装しました。
実装はぜんぶClaude Codeにおまかせなので、こういうかんじでっていう設計しかしていません。以下の説明もClaude Codeに書いてもらったのでそういうことでよろしくおねがいします。&lt;/p&gt;
&lt;p&gt;このサイトharukasan.devはCloudflare Pagesで構成されておりHonoXを使ってつくられています。
サイト本体はSSGしていますが、Pagesの前段にはWorkerがいるので、動的なエンドポイントだけはWorkerで動かすことができます。&lt;/p&gt;
&lt;h2 id=&quot;m-islandで数字を出す&quot;&gt;islandで数字を出す&lt;/h2&gt;
&lt;p&gt;記事のHTMLはSSGされた静的ファイルなので、数字はビルドした時点で固定されてしまいます。そこで数字の部分だけをHonoXのislandにして、ページを開いたあとにブラウザから取りにいきます。日付の隣の閲覧数と拍手数、記事末尾の拍手ボタンがそれぞれislandです。取得できるまでは何も描かないので、数字があとから出てきてもレイアウトは動きません。&lt;/p&gt;
&lt;h2 id=&quot;m-かぞえかた&quot;&gt;かぞえかた&lt;/h2&gt;
&lt;p&gt;閲覧数はのべ日次ユニーク訪問者数です。同じ人が同じ記事を何度リロードしても、その日は1しか増えません。翌日になるとまた1増えます。「同じ人」は日次ハッシュで見ています。秘密の値・日付・IPアドレス・User-Agentのハッシュで、日付が入っているので日をまたぐと別の値になります。&lt;/p&gt;
&lt;p&gt;テーブルは3つです。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;pl-c&quot;&gt;-- 記事ごとの累計&lt;/span&gt;
&lt;span class=&quot;pl-k&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;pl-en&quot;&gt;page_counts&lt;/span&gt; (
  &lt;span class=&quot;pl-k&quot;&gt;path&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;TEXT&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;PRIMARY KEY&lt;/span&gt;,
  count &lt;span class=&quot;pl-k&quot;&gt;INTEGER&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;NOT NULL&lt;/span&gt; DEFAULT &lt;span class=&quot;pl-c1&quot;&gt;0&lt;/span&gt;,
  claps &lt;span class=&quot;pl-k&quot;&gt;INTEGER&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;NOT NULL&lt;/span&gt; DEFAULT &lt;span class=&quot;pl-c1&quot;&gt;0&lt;/span&gt;
) WITHOUT ROWID;

&lt;span class=&quot;pl-c&quot;&gt;-- 閲覧数の重複排除用。visitor は日次ハッシュ&lt;/span&gt;
&lt;span class=&quot;pl-k&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;pl-en&quot;&gt;page_count_visitors&lt;/span&gt; (
  &lt;span class=&quot;pl-k&quot;&gt;path&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;TEXT&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;NOT NULL&lt;/span&gt;,
  visitor &lt;span class=&quot;pl-k&quot;&gt;TEXT&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;NOT NULL&lt;/span&gt;,
  created_at &lt;span class=&quot;pl-k&quot;&gt;INTEGER&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;NOT NULL&lt;/span&gt; DEFAULT (unixepoch()),
  &lt;span class=&quot;pl-k&quot;&gt;PRIMARY KEY&lt;/span&gt; (&lt;span class=&quot;pl-k&quot;&gt;path&lt;/span&gt;, visitor)
) WITHOUT ROWID;

&lt;span class=&quot;pl-c&quot;&gt;-- 拍手の日次上限用。claps はその訪問者の今日の回数&lt;/span&gt;
&lt;span class=&quot;pl-k&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;pl-en&quot;&gt;page_clap_visitors&lt;/span&gt; (
  &lt;span class=&quot;pl-k&quot;&gt;path&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;TEXT&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;NOT NULL&lt;/span&gt;,
  visitor &lt;span class=&quot;pl-k&quot;&gt;TEXT&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;NOT NULL&lt;/span&gt;,
  claps &lt;span class=&quot;pl-k&quot;&gt;INTEGER&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;NOT NULL&lt;/span&gt; DEFAULT &lt;span class=&quot;pl-c1&quot;&gt;0&lt;/span&gt;,
  created_at &lt;span class=&quot;pl-k&quot;&gt;INTEGER&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;NOT NULL&lt;/span&gt; DEFAULT (unixepoch()),
  &lt;span class=&quot;pl-k&quot;&gt;PRIMARY KEY&lt;/span&gt; (&lt;span class=&quot;pl-k&quot;&gt;path&lt;/span&gt;, visitor)
) WITHOUT ROWID;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;累計は &lt;code&gt;page_counts&lt;/code&gt; の列に持っているので、表示のたびに数えなおすことはありません。日次ハッシュの行は2日で消します。&lt;/p&gt;
&lt;p&gt;加算はページを開いたときにブラウザから送るPOSTの処理でおこないます。SQLはこの2文です。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;pl-k&quot;&gt;INSERT INTO&lt;/span&gt; page_counts (&lt;span class=&quot;pl-k&quot;&gt;path&lt;/span&gt;, count) &lt;span class=&quot;pl-k&quot;&gt;VALUES&lt;/span&gt; (:&lt;span class=&quot;pl-k&quot;&gt;path&lt;/span&gt;,
  &lt;span class=&quot;pl-c1&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;-&lt;/span&gt; coalesce((&lt;span class=&quot;pl-k&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;FROM&lt;/span&gt; page_count_visitors
                &lt;span class=&quot;pl-k&quot;&gt;WHERE&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;path&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;=&lt;/span&gt; :&lt;span class=&quot;pl-k&quot;&gt;path&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;AND&lt;/span&gt; visitor &lt;span class=&quot;pl-k&quot;&gt;=&lt;/span&gt; :visitor), &lt;span class=&quot;pl-c1&quot;&gt;0&lt;/span&gt;))
&lt;span class=&quot;pl-k&quot;&gt;ON&lt;/span&gt; CONFLICT (&lt;span class=&quot;pl-k&quot;&gt;path&lt;/span&gt;) DO &lt;span class=&quot;pl-k&quot;&gt;UPDATE&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;SET&lt;/span&gt; count &lt;span class=&quot;pl-k&quot;&gt;=&lt;/span&gt; count &lt;span class=&quot;pl-k&quot;&gt;+&lt;/span&gt;
  (&lt;span class=&quot;pl-c1&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;-&lt;/span&gt; coalesce((&lt;span class=&quot;pl-k&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;FROM&lt;/span&gt; page_count_visitors
                 &lt;span class=&quot;pl-k&quot;&gt;WHERE&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;path&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;=&lt;/span&gt; :&lt;span class=&quot;pl-k&quot;&gt;path&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;AND&lt;/span&gt; visitor &lt;span class=&quot;pl-k&quot;&gt;=&lt;/span&gt; :visitor), &lt;span class=&quot;pl-c1&quot;&gt;0&lt;/span&gt;));

INSERT &lt;span class=&quot;pl-k&quot;&gt;OR&lt;/span&gt; IGNORE INTO page_count_visitors (&lt;span class=&quot;pl-k&quot;&gt;path&lt;/span&gt;, visitor)
  &lt;span class=&quot;pl-k&quot;&gt;VALUES&lt;/span&gt; (:&lt;span class=&quot;pl-k&quot;&gt;path&lt;/span&gt;, :visitor);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;その訪問者をその日まだ記録していなければ1、記録済みなら0になる式を足しこみます。増える量をSQLのなかで決めるのがポイントで、アプリが読んでから書くと、途中で失敗したときに訪問者の記録だけ残って二度と数えられなくなります。2文は1トランザクションで実行します。&lt;/p&gt;
&lt;p&gt;拍手は1人が1記事につき1日10回までです。連打されるので1クリックごとには送らず、クリックが止まって1秒たったらまとめて送ります。送るのは差分ではなく「今日この記事に拍手した累計」で、増える量はこう求めます。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;pl-c1&quot;&gt;max&lt;/span&gt;(:total &lt;span class=&quot;pl-k&quot;&gt;-&lt;/span&gt; coalesce((&lt;span class=&quot;pl-k&quot;&gt;SELECT&lt;/span&gt; claps &lt;span class=&quot;pl-k&quot;&gt;FROM&lt;/span&gt; page_clap_visitors
                       &lt;span class=&quot;pl-k&quot;&gt;WHERE&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;path&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;=&lt;/span&gt; :&lt;span class=&quot;pl-k&quot;&gt;path&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;AND&lt;/span&gt; visitor &lt;span class=&quot;pl-k&quot;&gt;=&lt;/span&gt; :visitor), &lt;span class=&quot;pl-c1&quot;&gt;0&lt;/span&gt;), &lt;span class=&quot;pl-c1&quot;&gt;0&lt;/span&gt;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同じ数字が何度届いても2回目からは0です。送信が重なってもタブが複数あっても二重になりません。&lt;/p&gt;
&lt;p&gt;というわけで、ここまで読んでいただいた方はぜひ拍手ボタンを押していってください。1日10回まで押せます。&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>MOGRA 17th ANNIVERSARY PARTY DAY1</title>
      <link>https://harukasan.dev/posts/diary/20260829-mogra-17th-anniversary</link>
      <guid isPermaLink="true">https://harukasan.dev/posts/diary/20260829-mogra-17th-anniversary</guid>
      <pubDate>Sat, 29 Aug 2026 10:30:00 GMT</pubDate>
      <dc:creator>Harukasan</dc:creator>
      <description>2026年8月28日(金)、東京都千代田区外神田にあるMOGRAにて開催された「MOGRA 17th ANNIVERSARY PARTY DAY1」に行ってきました。 最後にいつMOGRAに来たのか思い出せない……秋葉原のこの地で17年続いているのはすごい。そんなMOGRAの周年...</description>
      <content:encoded>&lt;img src=&quot;https://harukasan.dev/images/diary/20260829.jpg&quot; class=&quot;header-image&quot; alt=&quot;ヘッダー画像: MOGRA入口のサイネージに映る17周年の告知と、お祝いのスタンド花の写真&quot;/&gt;
&lt;p&gt;2026年8月28日(金)、東京都千代田区外神田にあるMOGRAにて開催された&lt;a href=&quot;https://club-mogra.jp/2026/08/28/9885/&quot;&gt;「MOGRA 17th ANNIVERSARY PARTY DAY1」&lt;/a&gt;に行ってきました。&lt;/p&gt;
&lt;p&gt;最後にいつMOGRAに来たのか思い出せない……秋葉原のこの地で17年続いているのはすごい。そんなMOGRAの周年イベントに最近推している桃井はるこさんがでるということで。
MOGRAといえばやはり配信で、今日もお昼からやってるから&lt;a href=&quot;https://www.twitch.tv/mogra&quot;&gt;Twitch&lt;/a&gt;で聴きながら筆をとっています。&lt;/p&gt;
&lt;p&gt;金曜日はわりと仕事がつまってしまったので、会社からそのまま秋葉原に向かうことにした。パーティーが開くまでは1時間半くらいありそうだったので、以前伺ったときにフードもけっこうありそうだった&lt;a href=&quot;https://www.instagram.com/craft_beer_2mugi/&quot;&gt;2むぎ&lt;/a&gt;さんでビールをいただいてから行くことにした。スワンレイクビールのバレルエイジドサワー「Rouge cerise」が良い色をしていておいしかった。&lt;/p&gt;
&lt;div class=&quot;tweet-card d_block max-w_[550px] my_30 p_30 bd-w_1px border-style_solid bd-c_border.secondary bdr_m bg_background textStyle_caption/regular/m&quot;&gt;&lt;div class=&quot;d_flex ai_center gap_20 mbe_20&quot;&gt;&lt;a href=&quot;https://x.com/harukasan&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;img src=&quot;https://pbs.twimg.com/profile_images/1702627260199776256/k-9Mv7na_normal.jpg&quot; alt=&quot;&quot; width=&quot;44&quot; height=&quot;44&quot; loading=&quot;lazy&quot; class=&quot;d_block w_[44px] h_[44px] bdr_full flex-sh_0&quot;/&gt;&lt;/a&gt;&lt;div class=&quot;d_flex flex-d_column min-w_[0] lh_[1.2]&quot;&gt;&lt;a href=&quot;https://x.com/harukasan&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;tweet-name textStyle_caption/bold/m c_text td_none ov_hidden tov_ellipsis white-space_nowrap&quot;&gt;はるかさん&lt;/a&gt;&lt;a href=&quot;https://x.com/harukasan&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;tweet-handle textStyle_caption/regular/s c_text.secondary td_none ov_hidden tov_ellipsis white-space_nowrap&quot;&gt;@harukasan&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;tweet-body textStyle_caption/regular/m c_text white-space_pre-wrap wb_break-word mbe_20&quot;&gt;&lt;span&gt;そろそろ行こうと思ってたらスワンレイクの barrel-aged sourが追加されてしまった。めっちゃ良い色&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;d_grid gap_[2px] mbe_20 bdr_m ov_hidden bd-w_1px border-style_solid bd-c_border.secondary grid-tc_[1fr]&quot;&gt;&lt;img src=&quot;https://pbs.twimg.com/media/HQzx0l6bsAAb3aa.jpg&quot; width=&quot;2048&quot; height=&quot;1536&quot; alt=&quot;&quot; loading=&quot;lazy&quot; class=&quot;d_block w_full h_full asp_[16/9] obj-f_cover bg_background.secondary&quot;/&gt;&lt;/div&gt;&lt;div class=&quot;d_flex ai_center gap_30 pbs_20 bd-t-w_1px border-top-style_solid bd-t-c_border.secondary&quot;&gt;&lt;a href=&quot;https://x.com/intent/tweet?in_reply_to=2093313818558693729&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; aria-label=&quot;Reply on X&quot; class=&quot;tweet-action-reply d_inline-flex ai_center gap_10 textStyle_caption/regular/s c_text.secondary td_none bdr_full px_10 py_10&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; aria-hidden=&quot;true&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M4.648 17.192l-.451 3.611 4.252-.531a9 9 0 10-3.801-3.08zM12 19a6.97 6.97 0 01-3.223-.785L6.5 18.5l.236-1.886A7 7 0 1112 19z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span&gt;0&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://x.com/intent/like?tweet_id=2093313818558693729&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; aria-label=&quot;Like on X&quot; class=&quot;tweet-action-like d_inline-flex ai_center gap_10 textStyle_caption/regular/s c_text.secondary td_none bdr_full px_10 py_10&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; aria-hidden=&quot;true&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M13.087 21.021C18.792 17.831 22 13.81 22 8.91A5.91 5.91 0 0016.09 3c-1.529 0-2.976.747-4.09 1.834C10.886 3.747 9.439 3 7.91 3A5.91 5.91 0 002 8.91c0 4.9 3.208 8.92 8.913 12.111a2.227 2.227 0 002.174 0zM16.09 5A3.91 3.91 0 0120 8.91c0 3.86-2.482 7.342-7.889 10.366a.229.229 0 01-.222 0C6.482 16.252 4 12.77 4 8.91A3.91 3.91 0 017.91 5c1.115 0 2.38.723 3.287 1.943L12 8.021l.803-1.078C13.71 5.723 14.975 5 16.09 5z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span&gt;8&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://x.com/harukasan/status/2093313818558693729&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;textStyle_caption/regular/s c_text.secondary td_none ms_auto&quot;&gt;&lt;time dateTime=&quot;2026-08-28T12:24:40.000Z&quot;&gt;2026/08/28 21:24 JST&lt;/time&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;私ははじまってすぐのゆったり揺れてるフロアがわりと好きな人間なので、ついてすぐのフロアに降りたところ、これぞアニクラって雰囲気がよかった。いくつか覚えている曲でいうとGalaxy Angelはやはり&lt;a href=&quot;https://www.youtube.com/watch?v=yBO2bpPNjck&quot;&gt;Eternal Love&lt;/a&gt;がいちばん良いと思ってます。そのあとの&lt;a href=&quot;https://mora.jp/package/43000002/AVCA-14145/&quot;&gt;Be My Angel&lt;/a&gt;もよかった。アイプリでフロアを湧かせる&lt;a href=&quot;https://x.com/aiobahn81&quot;&gt;Aiobahn +81&lt;/a&gt;は本当によかったです。1Fにわりとひろいラウンジがあったので、休憩したりモモイストのみなさんと乾杯したり談笑したりしながら過ごせたのもよかった。&lt;/p&gt;
&lt;p&gt;それで桃井さんの番になったので、またフロアにもどったのだけど、最前のモモイストはすくないもののフロアがめちゃくちゃあたたまっていたので最初から安心してジャンプできた。クラブで聴くMOECOM LYNXは良いものですね。DJブースではしゃいでる桃井さんかわいいなって思いながらはしゃいでたら一瞬でおわってた。そのあと&lt;a href=&quot;https://x.com/kanad_aniclub&quot;&gt;カナD&lt;/a&gt;さんがこれでもかってモモーイメドレーしてくれてたすかった。完全に良い選曲だった。&lt;/p&gt;
&lt;p&gt;ワンマンライブとちがうけれどMOGRAっていうフロアだからこそできあがった空間だった。あらためて17周年おめでとうございます。やっぱりフロアでさわぐのはいいですね。また来られるといいな。&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>桃井はるこワンマンライブ「覚醒」大阪公演に行ってきた</title>
      <link>https://harukasan.dev/posts/diary/20260728-momo-i-osaka</link>
      <guid isPermaLink="true">https://harukasan.dev/posts/diary/20260728-momo-i-osaka</guid>
      <pubDate>Mon, 27 Jul 2026 19:49:00 GMT</pubDate>
      <dc:creator>Harukasan</dc:creator>
      <description>先週の土曜日になりますが、2026年7月25日、大阪府大阪市中央区心斎橋にあるライブハウス Pangeaで開催された「桃井はるこワンマンライブ 覚醒〜言霊ノ儀、共鳴シ捧グ〜 関西公演」に行ってきました。この日はゆずの弾き語りアリーナツアーのラストとなる横浜公演の真っ只中であったの...</description>
      <content:encoded>&lt;img src=&quot;https://harukasan.dev/images/diary/2026072802.jpg&quot; class=&quot;header-image&quot; alt=&quot;ヘッダー画像: ライブハウスPangeaの前の写真&quot;/&gt;
&lt;p&gt;先週の土曜日になりますが、2026年7月25日、大阪府大阪市中央区心斎橋にあるライブハウス &lt;a href=&quot;https://livepangea.com/&quot;&gt;Pangea&lt;/a&gt;で開催された&lt;a href=&quot;https://momoiharuko.com/static/Live20260725/&quot;&gt;「桃井はるこワンマンライブ 覚醒〜言霊ノ儀、共鳴シ捧グ〜 関西公演」&lt;/a&gt;に行ってきました。この日は&lt;a href=&quot;https://yuzu-official.com/pages/yuzu_arenatour2026/&quot;&gt;ゆずの弾き語りアリーナツアー&lt;/a&gt;のラストとなる横浜公演の真っ只中であったのだけれど、土曜日のチケットはとれてなくて、偶然余白があったのだ。&lt;/p&gt;
&lt;p&gt;家族には「ももーいのおーさかはまあいいんじゃない」って言われたけど、次にいつチャンスがあるかわからない地方公演だったので諦めきれずにいて、日曜は幕張の方でイベントがあるので土曜のうちにかならず帰ってくるのであれば良い、ということで了解を得られて参加できることになった。ただでさえ金曜と日曜ライブでいないのに送りだしてくれてありがとう。お土産には551の豚まんを買って帰った。&lt;/p&gt;
&lt;p&gt;そういえば私がまだ学生だった頃、桃井さんのライブが福岡であって、そのときのチケットがたぶんとらのあなで売ってたんだけど、結局行かなかったのがちょっと心残りだったことを思い出した。&lt;/p&gt;
&lt;p&gt;ということで、金曜のライブの興奮おさまらぬなか、洗濯物だけどうにか片づけてちょっとだけ寝て、起きてすぐに大阪に向かっていた。&lt;/p&gt;
&lt;p&gt;会場についたのは物販がはじまる10分くらい前だったと思うけれど、前の方に並ぶことができたので、ちょうど特典券に届く金額のTシャツと大阪セットをいただいた。
こないだのせーけん放送でTシャツにサインをいただいていた方がいて羨ましかったのと、着ていったライブTシャツはこのあと汗だくになるにきまっていたので、ちょうどもう一枚ほしかったのであった。&lt;/p&gt;
&lt;p&gt;ガラガラ抽選も5回まわしたらポスターが2枚当ってしまったので、荷物を近くのコインロッカーに押し込んで会場にもどった。そういえば今回は特典会が後半にしかなかったので荷物は全て預けちゃうのが正解だったと思うけれどこのへんの学習が足りないのである。&lt;/p&gt;
&lt;p&gt;桃井さんのライブでわりと詰め詰めのオールスタンディングは殆んど初めてみたいなかんじだったので、はじめはちょっと緊張していたけれど、気がついたらめっちゃジャンプしてましたよね。不思議である。これまで参加したどの公演よりも桃井さんが目の前にいる感覚があって舞いあがっちゃった。もう何度も目線がくるからどきどきするよね。そのあと逃げ場もなく圧縮やらサークルなどあり、なかなか大変であった。参加できて楽しかったけれど、それ以前になんか衝撃の方が大きかった。&lt;/p&gt;
&lt;p&gt;話をもどすと、東京公演ではきらびやかに見えていた桃井さんが目の前ではしゃいでいるのは本当によくて、おなじようなセトリでも全く異なる体験で、なんか円盤とかで見ていた桃井さんのライブに参加できた気分があって本当によかった。はー。「はじめての夏」聴けたのよかったですね。今回のワンマンライブは夏の曲がメドレーになっているのだけど、この曲は大阪公演で追加されていた。&lt;/p&gt;
&lt;p&gt;今気がついたけどまだ7月なのか……あとは私たぶん「21世紀」が大好きなのだけれど、この曲を聴くとどうしたらいいかよくわかんなくなっちゃうんだよな。桃井さんの曲って心を抉る詞があってその度にかたまってしまいますね。このときの「Friendship」とかは感極まってしまってた。とにかく桃井さんが目の前にいてしあわせだった。&lt;/p&gt;
&lt;p&gt;何回かイベント行かせていただいて、桃井さんが目の前にいること自体には慣れてきた気がしていたけれど、その場の空気感に呑まれるというか、そのときどきで感じとれるものが違っていて、今、このときを、思いっきり感じるのが大事だなって、そう気づかされた体験だった。&lt;/p&gt;
&lt;p&gt;ひとつだけ気になった点があるとすれば、PAが慣れてないのか直前のリハができてないのか曲出しにとまどっていたり、音作りがいまいちだったりが多くみられたのはちょっと微妙だった。シールドの抜け止めはちゃんとやってあげてほしいし、あまり東京ではみられなくなってきているので、地方イベントならではなのかもしれない。&lt;/p&gt;
&lt;p&gt;あっというまに汗だくになって昼公演が終わってしまった。そこから1時間くらい時間があいていて、ちょうど一杯飲めそうだったので、Twitterで教えてもらった座標の&lt;a href=&quot;https://maps.app.goo.gl/pzv51XH8U28dbMWCA&quot;&gt;スタンドうみねこ3tR&lt;/a&gt;に行ってビールをいただきながら休憩した。よく考えるとオールスタンディングのライブのあとに立ち飲みに行くのはちょっと危なかったかもしれない。2杯いただいたけど、&lt;a href=&quot;https://derailleurbrewworks.com/product_detail/new-world-order/&quot;&gt;NEW WORLD ORDER&lt;/a&gt;おいしかったですね。Derailleur Brew Worksさんは副原料をたくさん使ったビールをよくだしてる印象があったけど、これはすすすっと飲めちゃう感じで体調とマッチしていてよかった。&lt;/p&gt;
&lt;p&gt;その後は会場にもどってファンクラブイベントへ。整理番号はライブとあまり変わらなかったはずだけれど最前列がなぜか空いていたので、そこに座らせていただいてまたビールをいただいていた。ライブハウスってはじまる前に飲むビールがいちばんおいしいと思うんですよね。おわりでも良いんだけど、そうするとなんか感情がぐちゃぐちゃになっちゃうから先に飲んでおきたい。&lt;/p&gt;
&lt;p&gt;ファンクラブイベントのメインコンテンツは朗読劇で、ラジオを聴いているかんじでよかったけれど、脚本がゆるふわだったので和気藹々したかんじだった。LLMにはもっと桃井さんというか、アニラジの台本を学習していただきたく。&lt;/p&gt;
&lt;p&gt;そのあとはミニライブコーナーがあったのだけれど、最前でしずかに座って観られたの本当によかったですね。さっきまで大興奮で盛りあがっていて、そのあとにしっとりと聴けた温度差で大満足だった。最後に「てれてれてっててーてーてれてれてーてーてててててーれーてれてれ」ってみんなでメロディーをハモったのよかったし、アカペラで桃井さんの歌を聴くと本当にうまくてびっくりしますね。会場全体で桃井さんのイベントならではの温かさが形成されていたのがとても印象的だった。&lt;/p&gt;
&lt;figure class=&quot;figure-image&quot;&gt;&lt;img src=&quot;https://harukasan.dev/images/diary/2026072801.jpg&quot; alt=&quot;特典会でサインしてもらったラミカとチェキの写真&quot;/&gt;&lt;figcaption&gt;特典会でサインしてもらったラミカとチェキ&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;特典会ではTシャツとラミカにサインをいただいたのと、手形も使ってチェキも撮ってもらいました。最近ようやくチェキのよさに気づきつつあるけれど、この日の一枚はとくによかった気がする。&lt;/p&gt;
&lt;p&gt;特典会は前の方に並べたおかげで会場をすぐにでて、そのあとは去年のPicoRuby Overflow会議のときにお世話になった&lt;a href=&quot;https://maps.app.goo.gl/KWCD8CgMYuJxboVi9&quot;&gt;BAK BEER STOP 心斎橋&lt;/a&gt;さんに寄らせていただいて、苦渋をいただきつつ、反省会をしていた。なんかとてもしあわせだったからなのか、少し慣れてきたからなのか、反省するべきことも多かった気がしてきた。まあ、ずっとフジロックで藤井風が流れていたせいかもしれないけれど。とにかく一日満喫して東京に帰ったのでした。また大阪にも行きたいし、桃井さんにも会えるといいな。&lt;/p&gt;
&lt;figure class=&quot;figure-image&quot;&gt;&lt;img src=&quot;https://harukasan.dev/images/diary/2026072803.png&quot; alt=&quot;桃井はるこフォトフレームで撮った写真&quot;/&gt;&lt;figcaption&gt;桃井さんフォトフレームで撮った写真から。最後のフレームどうやっても晩酌にしかならなくておもしろかった&lt;/figcaption&gt;&lt;/figure&gt;</content:encoded>
    </item>
    <item>
      <title>解説「照らす技術」をRubyで照らす #kanrk09</title>
      <link>https://harukasan.dev/posts/diary/20260720-illuminating-the-technology-of-illumination-using-ruby</link>
      <guid isPermaLink="true">https://harukasan.dev/posts/diary/20260720-illuminating-the-technology-of-illumination-using-ruby</guid>
      <pubDate>Mon, 20 Jul 2026 14:50:00 GMT</pubDate>
      <dc:creator>Harukasan</dc:creator>
      <description>7月18日(土)に大津市伝統芸能会館で開催された関西Ruby会議09にて、「『照らす技術』をRubyで照らす」という題で登壇させていただきました。今回の発表はデモが多く、スライドもアニメーションを多用しておりそのまま公開するのが難しいです。また、発表中にふれられなかった要素がたく...</description>
      <content:encoded>&lt;img src=&quot;https://harukasan.dev/images/diary/20260720.jpg&quot; class=&quot;header-image&quot; alt=&quot;ヘッダー画像: 大津市伝統芸能会館の能舞台に設置したムービングライトから照らされる光&quot;/&gt;
&lt;p&gt;7月18日(土)に大津市伝統芸能会館で開催された&lt;a href=&quot;https://regional.rubykaigi.org/kansai09/&quot;&gt;関西Ruby会議09&lt;/a&gt;にて、「『照らす技術』をRubyで照らす」という題で登壇させていただきました。今回の発表はデモが多く、スライドもアニメーションを多用しておりそのまま公開するのが難しいです。また、発表中にふれられなかった要素がたくさんあるので、当日用意していたスクリプトをもとに、そのへんもあわせてテキストで紹介したいと思います。Markdown形式のスライドはGitHubに公開しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/harukasan/harucom-os/blob/lumica-lighting-show/rootfs/slides/kanrk09.md&quot;&gt;rootfs/slides/kanrk09.md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回の記事もまあまあ長いので、ルビが要らない方は右上のボタンから消すと読みやすいかもしれません。&lt;/p&gt;
&lt;h2 id=&quot;m-harucom&quot;&gt;Harucom&lt;/h2&gt;
&lt;p&gt;さて、今回の発表でもノートパソコンは使わず、わたしがつくっている&lt;a href=&quot;https://harucom.org/&quot;&gt;Harucom&lt;/a&gt;を使って発表しました。HarucomはPicoRubyでつくっている小さなRubyコンピュータで、モニターとキーボードをつなぐだけでIRBが動いて、Rubyでグラフィカルなアプリケーションを動かすことができます。&lt;/p&gt;
&lt;p&gt;RubyKaigi 2026で発表したときからさらに開発を進めていて、&lt;a href=&quot;https://github.com/harukasan/harucom-os/pull/13&quot;&gt;エディターの動きがスムーズになったり&lt;/a&gt;、&lt;a href=&quot;https://github.com/harukasan/harucom-os/pull/14&quot;&gt;音声出力にのっていたノイズが消えてクリーンになったり&lt;/a&gt;、&lt;a href=&quot;https://github.com/harukasan/harucom-os/pull/20&quot;&gt;発表中に画面が見やすいように2倍解像度で表示できるようになったり&lt;/a&gt;、&lt;a href=&quot;https://github.com/harukasan/harucom-os/pull/27&quot;&gt;Ctrl-zでサスペンドできたり&lt;/a&gt;、&lt;a href=&quot;https://github.com/harukasan/harucom-os/pull/28&quot;&gt;Ctrl-oでIRBにスクリプトファイルをロードできたり&lt;/a&gt;、今回あまりふれていないところでもいろいろな改善を進めています。&lt;/p&gt;
&lt;p&gt;また、今回の発表のためにPicoRabbitの日本語描画もつくってみました。発表に使った&lt;a href=&quot;https://github.com/harukasan/harucom-os/commits/lumica-lighting-show/&quot;&gt;ブランチ&lt;/a&gt;をpushしているので、このへんをみればどうやるかわかると思います。HarucomはBOOTHで販売しているので、もしご興味あれば買ってもらえるとうれしいです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/harukasan/harucom-os/commits/lumica-lighting-show&quot;&gt;GitHub: harukasan/harucom-os - lumica-lighting-show&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;m-照&quot;&gt;照&lt;/h2&gt;
&lt;p&gt;わたしは音楽ライブにいくと、ステージが建て込まれていて、ラインアレイがつながれていて、PAが組まれているんですけど、そういう機材をながめながら、開演にむけてテンションをあげていくようなことをやっています。今回のテーマは「照」ということで、舞台機材のなかでも普段は光が直接あたることのない照明にスポットライトをあててみたいとおもいました。&lt;/p&gt;
&lt;p&gt;こういった舞台照明の装置にもソフトウェアが組込まれていて、それぞれが通信することで、遠隔で複雑な動きを実現しています。目にすることがあってもその仕組みまで理解したことがないものでも、近づいてみればおもしろい発見があるかもしれません。&lt;/p&gt;
&lt;h2 id=&quot;m-舞台照明のしくみ&quot;&gt;舞台照明のしくみ&lt;/h2&gt;
&lt;p&gt;さて、舞台照明では、光をだすライトそのもののことを「灯体」と呼びます。この会場でも後方にいくつかPARライトが設置されていますが、こういった灯体はただの電球なので、暗くしたり明るくしたり、それ自体で明るさを調整することはできません。&lt;/p&gt;
&lt;p&gt;そこで、明るさを調整するために、調光器と呼ばれる機械を使います。実際の照明の操作はステージ裏だったり、ライブだと客席の後方にブースを建て込んでそこから行うので、調光器を操作するためにいわゆる「卓」と呼ばれる調光卓を使います。&lt;/p&gt;
&lt;h2 id=&quot;m-トライアック調光&quot;&gt;トライアック調光&lt;/h2&gt;
&lt;p&gt;さきほど触れたように、PARライトに使われているのは普通の電球なので、交流電源、つまり一般的な100V電源で光らせます。そのため、明るくしたり暗くしたりするためには、電球に供給する電力を調整してあげる必要があります。&lt;/p&gt;
&lt;p&gt;このような調光にトライアックと呼ばれる素子を使っていたのでトライアック調光と呼ばれます。交流波形の一部を落とすことで、灯体に流れる実効電力を制御して、それによって明るくしたり暗くしたりする仕組みです。&lt;/p&gt;
&lt;h2 id=&quot;m-led照明&quot;&gt;LED照明&lt;/h2&gt;
&lt;p&gt;最近は電球を使うPARライトではなく、LEDを使った照明を使うことが多くなりました。LEDだと電球より省電力で発熱もおさえられます。また、色を変えられたり、さまざまな形状があったりと、いろいろな機能をもっています。&lt;/p&gt;
&lt;p&gt;今日会場にもってきたムービングライトもLED照明です。こういったLED照明の多くは調光器を内蔵しているので、電源をつなぐだけで単体で使うことができ、外部から操作可能になっています。&lt;/p&gt;
&lt;h2 id=&quot;m-rubyで照らす&quot;&gt;Rubyで照らす&lt;/h2&gt;
&lt;p&gt;さて、今回のタイトルは「Rubyで照らす」ということで、このLED照明をどのように光らせるのか、Rubyを使ってみていこうと思います。ふだん触れることのない、難しくみえる照明の技術もRubyであれば、なんとなくわかった気になれるかもしれません。使っているコードはHarucomだけではなく、ふつうのPicoRubyでもうごくはずなので、Raspberry Pi PicoやM5Stackでも試せるはずです。&lt;/p&gt;
&lt;h2 id=&quot;m-lチカ&quot;&gt;Lチカ&lt;/h2&gt;
&lt;p&gt;当日の発表では時間の関係でスキップしてしまったのですが、PicoRubyでLEDを光らせるといえばまずはLチカです。PicoRubyでLチカするには &lt;code&gt;picoruby-gpio&lt;/code&gt; を使います。HarucomのIRBで次のスクリプトを実行してみてください。赤いLEDがチカチカ点滅するはずです(Raspberry Pi Picoの場合は1を25に変える必要があります)。&lt;/p&gt;
&lt;div class=&quot;github-code&quot;&gt;&lt;p class=&quot;github-code-meta&quot;&gt;&lt;a href=&quot;https://github.com/harukasan/harucom-os/blob/lumica-lighting-show/rootfs/kanrk09/led1.rb&quot;&gt;&lt;code&gt;rootfs/kanrk09/led1.rb&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;pl-k&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;pl-s&quot;&gt;&lt;span class=&quot;pl-pds&quot;&gt;&amp;quot;&lt;/span&gt;gpio&lt;span class=&quot;pl-pds&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;

led &lt;span class=&quot;pl-k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;GPIO&lt;/span&gt;.&lt;span class=&quot;pl-k&quot;&gt;new&lt;/span&gt;(&lt;span class=&quot;pl-c1&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;pl-c1&quot;&gt;GPIO&lt;/span&gt;::&lt;span class=&quot;pl-c1&quot;&gt;OUT&lt;/span&gt;)
&lt;span class=&quot;pl-k&quot;&gt;loop&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;do&lt;/span&gt;
  led.write &lt;span class=&quot;pl-c1&quot;&gt;1&lt;/span&gt;
  &lt;span class=&quot;pl-c1&quot;&gt;sleep&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;0.5&lt;/span&gt;
  led.write &lt;span class=&quot;pl-c1&quot;&gt;0&lt;/span&gt;
  &lt;span class=&quot;pl-c1&quot;&gt;sleep&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;0.5&lt;/span&gt;
&lt;span class=&quot;pl-k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;コンストラクタの引数には物理ピンとGPIOのモードを設定します。上のスクリプトだとGPIOの1番ピンを出力モードで初期化します。Harucomには &lt;code&gt;GPIO01&lt;/code&gt; (赤)と &lt;code&gt;GPIO23&lt;/code&gt; (緑)のLEDがついています。Raspberry Pi Picoの場合は &lt;code&gt;GPIO25&lt;/code&gt; です。&lt;/p&gt;
&lt;p&gt;出力するには &lt;code&gt;GPIO#write&lt;/code&gt; メソッドを使います。
GPIOでは &lt;code&gt;1&lt;/code&gt; を書き込むとそのピンをHIGH (電源電圧、Raspberry Pi Picoではふつう3.3V) に、 &lt;code&gt;0&lt;/code&gt; を書き込むとそのピンをLOW (GND = 0V)にします。
以下の回路図のようにLEDのアノードがチップの出力ピン、カソードがGNDにつながっているので、出力ピンをHIGHにしてあげると電流が流れて光るようになります。&lt;/p&gt;
&lt;p&gt;ちなみに &lt;code&gt;true&lt;/code&gt; と &lt;code&gt;false&lt;/code&gt; を使わず、&lt;code&gt;1&lt;/code&gt; と &lt;code&gt;0&lt;/code&gt; を使う理由は、出力するか/しないかという論理値を表しているからではなく、ピンの出力ビットを &lt;code&gt;1&lt;/code&gt; にするか &lt;code&gt;0&lt;/code&gt; にするかという処理を表しているからです。
ほかにも &lt;code&gt;1&lt;/code&gt; と &lt;code&gt;0&lt;/code&gt; を使っていればビット演算を使って複数ビットをまとめて操作できる利点もあります。&lt;/p&gt;
&lt;h2 id=&quot;m-pwm-pulse-width-modulation&quot;&gt;PWM (Pulse Width Modulation)&lt;/h2&gt;
&lt;p&gt;これでLEDをチカチカさせることができるようになりましたが、これだけだとLEDを明るくしたり暗くしたりすることができません。LEDの場合はさきほどやったチカチカを高速で繰り返すことで調光を実現します。
この方法に使われているのがPWMです。PWMでは一定の周波数でON/OFFを高速に繰り返し、ONの時間の割合を変えることで明るさを調整します。このONの割合のことをduty比と呼びます。&lt;/p&gt;
&lt;p&gt;Rubyスクリプトのようなソフトウェアで高速にチカチカさせるのは難しいですが、マイコンチップにはハードウェアPWM機能がついていてPWM制御を実現できるようになっています。
PicoRubyでは &lt;code&gt;picoruby-pwm&lt;/code&gt; を使うことで簡単にハードウェアPWMを利用できます。ループ内でduty比を変えていくだけで、ふわっと光るLEDをつくることができます。&lt;/p&gt;
&lt;div class=&quot;github-code&quot;&gt;&lt;p class=&quot;github-code-meta&quot;&gt;&lt;a href=&quot;https://github.com/harukasan/harucom-os/blob/lumica-lighting-show/rootfs/kanrk09/led2.rb&quot;&gt;&lt;code&gt;rootfs/kanrk09/led2.rb&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;pl-k&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;pl-s&quot;&gt;&lt;span class=&quot;pl-pds&quot;&gt;&amp;quot;&lt;/span&gt;pwm&lt;span class=&quot;pl-pds&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;

pwm &lt;span class=&quot;pl-k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;PWM&lt;/span&gt;.&lt;span class=&quot;pl-k&quot;&gt;new&lt;/span&gt;(&lt;span class=&quot;pl-c1&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;pl-c1&quot;&gt;frequency:&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;1000&lt;/span&gt;, &lt;span class=&quot;pl-c1&quot;&gt;duty:&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;0.0&lt;/span&gt;)

&lt;span class=&quot;pl-k&quot;&gt;loop&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;pl-c1&quot;&gt;0&lt;/span&gt;.upto(&lt;span class=&quot;pl-c1&quot;&gt;100&lt;/span&gt;) &lt;span class=&quot;pl-k&quot;&gt;do&lt;/span&gt; |&lt;span class=&quot;pl-smi&quot;&gt;i&lt;/span&gt;| &lt;span class=&quot;pl-c&quot;&gt;# 0 -&amp;gt; 100&lt;/span&gt;
    pwm.duty((i &lt;span class=&quot;pl-k&quot;&gt;**&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;2&lt;/span&gt;) &lt;span class=&quot;pl-k&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;100.0&lt;/span&gt;)
    &lt;span class=&quot;pl-c1&quot;&gt;sleep&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;0.015&lt;/span&gt;
  &lt;span class=&quot;pl-k&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;pl-c1&quot;&gt;100&lt;/span&gt;.downto(&lt;span class=&quot;pl-c1&quot;&gt;0&lt;/span&gt;) &lt;span class=&quot;pl-k&quot;&gt;do&lt;/span&gt; |&lt;span class=&quot;pl-smi&quot;&gt;i&lt;/span&gt;| &lt;span class=&quot;pl-c&quot;&gt;# 100 -&amp;gt; 0&lt;/span&gt;
    pwm.duty((i &lt;span class=&quot;pl-k&quot;&gt;**&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;2&lt;/span&gt;) &lt;span class=&quot;pl-k&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;100.0&lt;/span&gt;)
    &lt;span class=&quot;pl-c1&quot;&gt;sleep&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;0.015&lt;/span&gt;
  &lt;span class=&quot;pl-k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;pl-k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;m-調光の制御&quot;&gt;調光の制御&lt;/h2&gt;
&lt;p&gt;PWMを使うことでLEDを明るくしたり暗くしたりすることができることはわかりました。実際の調光の制御では調光卓からたくさんのLED照明を操作する必要があります。調光卓と照明の間には距離があるのでなるべく少ない配線で通信を実現したいです。また、たくさんの種類の灯体を組み合わせることで理想の照明を実現します。メーカーごとに互換性がないとそれぞれの卓が必要になってしまいます。これらの問題を解決するため、米国劇場技術協会によって約40年前に制定されたのがDMX512という通信規格です。&lt;/p&gt;
&lt;h2 id=&quot;m-dmx512-digital-multiplex-512&quot;&gt;DMX512: Digital Multiplex 512&lt;/h2&gt;
&lt;p&gt;DMX512では512chの制御信号を多重化(Multiplex)して送ります。成瀬さんの発表でも出てきましたが、512chのデジタル信号を多重化して送るのでDigital Multiplex 512 = DMX512です。この512chのまとまりを1 Universe (宇宙)と呼びます。&lt;/p&gt;
&lt;p&gt;灯体はデイジーチェーンで数珠つなぎに接続し、それぞれの灯体に開始アドレスを設定します。それぞれの灯体は自分のアドレスから必要なチャンネル数ぶんの値を読みます。たとえば13chの制御信号を使う灯体をアドレス1に設定すると1-13chを、次の灯体はアドレス14に設定し14-26chを使うように割り当てます。&lt;/p&gt;
&lt;h2 id=&quot;m-rs485&quot;&gt;RS485&lt;/h2&gt;
&lt;p&gt;DMX512の電気的な通信規格にはRS485というバランス接続のシリアル通信規格が採用されています。FAなどの工場でよく使われている規格で、おなじような規格だと、RS232Cとかは聞いたことがあるかもしれません。&lt;/p&gt;
&lt;p&gt;RS485ではD+とD-の2つの信号線で反転させたデータを送信する差動信号を使います。外部ノイズがのったとしても2本の信号間で相殺されるのでノイズに強い安定した通信ができるため、最大で1200m、32台の機器を接続できます。&lt;/p&gt;
&lt;h2 id=&quot;m-uart&quot;&gt;UART&lt;/h2&gt;
&lt;p&gt;RS485の上を流れるデータにはUARTが使われます。UARTはマイコンどうしのシリアル通信規格としてよく使われるので、電子工作をやっていたら聞いたことがあるかもしれません。UARTではその通信速度(baud rate)とデータ転送フォーマットを設定できます。DMX512の場合は250kbps、パリティがない8N2の設定が使われます。
つまり、1bitのスタートビット、8bitのデータ、2bitのストップビットで通信します。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; 1 bit           8 bit             2 bit
|start| b0 b1 b2 b3 b4 b5 b6 b7 |stop|stop|
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;m-dmxパケット&quot;&gt;DMXパケット&lt;/h2&gt;
&lt;p&gt;DMX512では512chのデータをひとまとめに送信しますが、UARTにはパケットの概念がありません。そこで、DMX512ではBREAKとMABという信号をつくりだすことでパケットの区切りをつくります。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;|BREAK|MAB|SC| 1 | 2 | 3 | ... |512|
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;BREAK: 最低88マイクロ秒の間LOWにする&lt;/li&gt;
&lt;li&gt;MAB (Mark After Break): 最低8マイクロ秒の間HIGHにする&lt;/li&gt;
&lt;li&gt;SC (Start Code): 1byteのスタートコード。調光データは0x00&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;BREAKで「フレームのおわり」、MABで「フレームのはじまり」という区切りをつくり、スタートコードに続けて512個のチャンネルデータを送ります。これを繰り返すことで照明を操作します。&lt;/p&gt;
&lt;h2 id=&quot;m-ムービングライト&quot;&gt;ムービングライト&lt;/h2&gt;
&lt;p&gt;今回デモにはSHEHDS LED Spot 80Wというムービングライトを使いました。このムービングライトは10chと13chモードが使えますが、13chの場合パラメーターの割り当ては次のようになっています。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ch 1  Pan
ch 2  Pan fine
ch 3  Tilt
ch 4  Tilt fine
ch 5  Speed
ch 6  Dimmer
ch 7  Strobe
ch 8  Color wheel
ch 9  Gobo wheel
ch 10 Focus
ch 11 Prism
ch 12 Motor auto
ch 13 Function
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;m-dmxパケットを送信する&quot;&gt;DMXパケットを送信する&lt;/h2&gt;
&lt;p&gt;今回の構成は以下のようになっています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://harukasan.booth.pm/items/8127045&quot;&gt;Harucom (RP2350)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.switch-science.com/products/9926&quot;&gt;M5Stack DMX512ユニット&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;HarucomとM5Stack DMX512ユニット間はふつうのロジックレベルのUARTで通信します。M5Stack DMX512ユニットには絶縁型のRS485トランシーバーICがのっていて、XLRケーブルでムービングライトと直接接続できます。&lt;/p&gt;
&lt;h2 id=&quot;m-uartで送ってみる&quot;&gt;UARTで送ってみる&lt;/h2&gt;
&lt;p&gt;さきほど説明したとおりDMXのデータはUARTで通信されるので、&lt;code&gt;picoruby-uart&lt;/code&gt; を使えばデータを送信できます。スクリプトは次のようになります。&lt;/p&gt;
&lt;div class=&quot;github-code&quot;&gt;&lt;p class=&quot;github-code-meta&quot;&gt;&lt;a href=&quot;https://github.com/harukasan/harucom-os/blob/lumica-lighting-show/rootfs/kanrk09/dmx1.rb&quot;&gt;&lt;code&gt;rootfs/kanrk09/dmx1.rb&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot;&gt;uart &lt;span class=&quot;pl-k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;UART&lt;/span&gt;.&lt;span class=&quot;pl-k&quot;&gt;new&lt;/span&gt;(&lt;span class=&quot;pl-c1&quot;&gt;unit:&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;:RP2040_UART1&lt;/span&gt;,
                &lt;span class=&quot;pl-c1&quot;&gt;txd_pin:&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;20&lt;/span&gt;, &lt;span class=&quot;pl-c1&quot;&gt;rxd_pin:&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;21&lt;/span&gt;,
                &lt;span class=&quot;pl-c1&quot;&gt;baudrate:&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;250_000&lt;/span&gt;, &lt;span class=&quot;pl-c1&quot;&gt;stop_bits:&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;2&lt;/span&gt;)

universe &lt;span class=&quot;pl-k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;pl-s&quot;&gt;&lt;span class=&quot;pl-pds&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;pl-cce&quot;&gt;\x00&lt;/span&gt;&lt;span class=&quot;pl-pds&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;*&lt;/span&gt; (&lt;span class=&quot;pl-c1&quot;&gt;512&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;1&lt;/span&gt;) &lt;span class=&quot;pl-c&quot;&gt;# SC + 512ch&lt;/span&gt;
universe[&lt;span class=&quot;pl-c1&quot;&gt;3&lt;/span&gt;] &lt;span class=&quot;pl-k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;38&lt;/span&gt;.chr
universe[&lt;span class=&quot;pl-c1&quot;&gt;14&lt;/span&gt;&lt;span class=&quot;pl-k&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;3&lt;/span&gt;] &lt;span class=&quot;pl-k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;38&lt;/span&gt;.chr
universe[&lt;span class=&quot;pl-c1&quot;&gt;6&lt;/span&gt;] &lt;span class=&quot;pl-k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;100&lt;/span&gt;.chr &lt;span class=&quot;pl-c&quot;&gt;#&lt;/span&gt;
universe[&lt;span class=&quot;pl-c1&quot;&gt;14&lt;/span&gt;&lt;span class=&quot;pl-k&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;6&lt;/span&gt;] &lt;span class=&quot;pl-k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;100&lt;/span&gt;.chr

&lt;span class=&quot;pl-k&quot;&gt;loop&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;do&lt;/span&gt;
  uart.break &lt;span class=&quot;pl-c1&quot;&gt;1&lt;/span&gt;
  uart.write universe
  uart.flush
&lt;span class=&quot;pl-k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;1 universeぶん、つまり512chとスタートコードで513byteの文字列を用意し、これを送信するだけです。&lt;code&gt;picoruby-uart&lt;/code&gt; では &lt;code&gt;UART#break&lt;/code&gt; メソッドを使うことでBREAK信号を送信できます。&lt;/p&gt;
&lt;p&gt;ただし、この方法ではUARTの送信がブロッキングになってしまうのでデータを送り続けている間ほかのことが何もできなくなってしまいます。そこでDMAを使ってDMXパケットを送信する &lt;code&gt;picoruby-dmx&lt;/code&gt; というmrbgemをつくりました。&lt;/p&gt;
&lt;h2 id=&quot;m-picoruby-dmx&quot;&gt;picoruby-dmx&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;picoruby-dmx&lt;/code&gt; では、C言語側でuniverseのバッファを確保しておき、タイマーとDMAが約40fpsでDMXパケットを送信し続けます。これによって、Ruby側はバッファに値を書き込むだけでDMXを送信することができるようになります。&lt;/p&gt;
&lt;div class=&quot;github-code&quot;&gt;&lt;p class=&quot;github-code-meta&quot;&gt;&lt;a href=&quot;https://github.com/harukasan/harucom-os/blob/lumica-lighting-show/rootfs/kanrk09/dmx2.rb&quot;&gt;&lt;code&gt;rootfs/kanrk09/dmx2.rb&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;pl-k&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;pl-s&quot;&gt;&lt;span class=&quot;pl-pds&quot;&gt;&amp;quot;&lt;/span&gt;board/dmx&lt;span class=&quot;pl-pds&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;

dmx &lt;span class=&quot;pl-k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;Board&lt;/span&gt;::&lt;span class=&quot;pl-c1&quot;&gt;DMX&lt;/span&gt;.&lt;span class=&quot;pl-k&quot;&gt;new&lt;/span&gt;
dmx.start
&lt;span class=&quot;pl-k&quot;&gt;loop&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;do&lt;/span&gt;
  t &lt;span class=&quot;pl-k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;Machine&lt;/span&gt;.board_millis &lt;span class=&quot;pl-k&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;1000.0&lt;/span&gt;
  [&lt;span class=&quot;pl-c1&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;pl-c1&quot;&gt;14&lt;/span&gt;].each_with_index &lt;span class=&quot;pl-k&quot;&gt;do&lt;/span&gt; |&lt;span class=&quot;pl-smi&quot;&gt;b&lt;/span&gt;, &lt;span class=&quot;pl-smi&quot;&gt;i&lt;/span&gt;|
    dir &lt;span class=&quot;pl-k&quot;&gt;=&lt;/span&gt; i.zero? &lt;span class=&quot;pl-k&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;1&lt;/span&gt; : &lt;span class=&quot;pl-k&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;1&lt;/span&gt;
    dmx[b]     &lt;span class=&quot;pl-k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;171&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;+&lt;/span&gt; (&lt;span class=&quot;pl-c1&quot;&gt;40&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;Math&lt;/span&gt;.sin(t &lt;span class=&quot;pl-k&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;0.7&lt;/span&gt;) &lt;span class=&quot;pl-k&quot;&gt;*&lt;/span&gt; dir).to_i  &lt;span class=&quot;pl-c&quot;&gt;# Pan (171=正面)&lt;/span&gt;
    dmx[b &lt;span class=&quot;pl-k&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;2&lt;/span&gt;] &lt;span class=&quot;pl-k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;41&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;+&lt;/span&gt; (&lt;span class=&quot;pl-c1&quot;&gt;29&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;Math&lt;/span&gt;.sin(t &lt;span class=&quot;pl-k&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;1.1&lt;/span&gt;)).to_i        &lt;span class=&quot;pl-c&quot;&gt;# Tilt (12〜70)&lt;/span&gt;
    dmx[b &lt;span class=&quot;pl-k&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;5&lt;/span&gt;] &lt;span class=&quot;pl-k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;255&lt;/span&gt;
  &lt;span class=&quot;pl-k&quot;&gt;end&lt;/span&gt;
  dmx.keepalive
  sleep_ms &lt;span class=&quot;pl-c1&quot;&gt;20&lt;/span&gt;
&lt;span class=&quot;pl-k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;m-デッドマンスイッチ&quot;&gt;デッドマンスイッチ&lt;/h2&gt;
&lt;p&gt;DMXで制御する照明は信号が停止してもその状態を維持する実装になっていることが一般的です。これは急にケーブルが抜けてしまったときに状態を維持してくれるという意味では良い実装ですが、プログラムがハングしてもムービングライトが明かりをつけたまま固まってしまいます。そこで、ループをまわしている間は &lt;code&gt;DMX#keepalive&lt;/code&gt; メソッドを呼び続け、呼び出しが止まったら自動でブラックアウトするデッドマンスイッチを実装しました。&lt;/p&gt;
&lt;h2 id=&quot;m-シーケンサー序破急&quot;&gt;シーケンサー「序破急」&lt;/h2&gt;
&lt;p&gt;さて、ここまででPicoRubyからDMX512で照明を操作することができるようになりました。実際にライブで使うにはより複雑な動きをプログラミングし、音と光を同期させて動かす必要があります。そこで、音と光を同時に扱えるシーケンサーを実装しました。これを序破急と呼びます。&lt;/p&gt;
&lt;p&gt;序破急はRubyKaigi 2026でasonasさんが発表していたstrudel-rbをもとにしており、スクリプトで照明と音のパターンを記述でき、REPLで演奏することができます。&lt;/p&gt;
&lt;p&gt;たとえば、4つ打ちにあわせて光らせるなら次のようなかんじです。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ruby&quot;&gt;fixture &lt;span class=&quot;pl-c1&quot;&gt;:s1&lt;/span&gt;, &lt;span class=&quot;pl-s&quot;&gt;&lt;span class=&quot;pl-pds&quot;&gt;&amp;quot;&lt;/span&gt;shehds_80w_led_spot_light&lt;span class=&quot;pl-pds&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;pl-c1&quot;&gt;mode:&lt;/span&gt; &lt;span class=&quot;pl-s&quot;&gt;&lt;span class=&quot;pl-pds&quot;&gt;&amp;quot;&lt;/span&gt;13ch&lt;span class=&quot;pl-pds&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;pl-c1&quot;&gt;address:&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;1&lt;/span&gt;
fixture &lt;span class=&quot;pl-c1&quot;&gt;:s2&lt;/span&gt;, &lt;span class=&quot;pl-s&quot;&gt;&lt;span class=&quot;pl-pds&quot;&gt;&amp;quot;&lt;/span&gt;shehds_80w_led_spot_light&lt;span class=&quot;pl-pds&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;pl-c1&quot;&gt;mode:&lt;/span&gt; &lt;span class=&quot;pl-s&quot;&gt;&lt;span class=&quot;pl-pds&quot;&gt;&amp;quot;&lt;/span&gt;13ch&lt;span class=&quot;pl-pds&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;pl-c1&quot;&gt;address:&lt;/span&gt; &lt;span class=&quot;pl-c1&quot;&gt;14&lt;/span&gt;

tempo &lt;span class=&quot;pl-c1&quot;&gt;120&lt;/span&gt;

track(&lt;span class=&quot;pl-c1&quot;&gt;:strobe&lt;/span&gt;) { dmx(&lt;span class=&quot;pl-c1&quot;&gt;:s1&lt;/span&gt;).dimmer(&lt;span class=&quot;pl-s&quot;&gt;&lt;span class=&quot;pl-pds&quot;&gt;&amp;quot;&lt;/span&gt;[1 0]*4&lt;span class=&quot;pl-pds&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;).color(&lt;span class=&quot;pl-s&quot;&gt;&lt;span class=&quot;pl-pds&quot;&gt;&amp;quot;&lt;/span&gt;&amp;lt;red blue green&amp;gt;&lt;span class=&quot;pl-pds&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;) }
track(&lt;span class=&quot;pl-c1&quot;&gt;:wash&lt;/span&gt;)   { dmx(&lt;span class=&quot;pl-c1&quot;&gt;:s2&lt;/span&gt;).dimmer(sine.slow(&lt;span class=&quot;pl-c1&quot;&gt;2&lt;/span&gt;)).pan(sine.range(&lt;span class=&quot;pl-c1&quot;&gt;0.3&lt;/span&gt;, &lt;span class=&quot;pl-c1&quot;&gt;0.7&lt;/span&gt;).slow(&lt;span class=&quot;pl-c1&quot;&gt;8&lt;/span&gt;)) }
track(&lt;span class=&quot;pl-c1&quot;&gt;:drums&lt;/span&gt;)  { sound(&lt;span class=&quot;pl-s&quot;&gt;&lt;span class=&quot;pl-pds&quot;&gt;&amp;quot;&lt;/span&gt;bd*4, ~ sd ~ sd, hh*8&lt;span class=&quot;pl-pds&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;) }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;灯体の定義には&lt;a href=&quot;https://open-fixture-library.org/&quot;&gt;Open Fixture Library&lt;/a&gt;のJSONを使っていて、dimmerやpanといったパラメーターをチャンネルにマッピングできるようになっています。&lt;/p&gt;
&lt;h2 id=&quot;m-qoa-quite-ok-audio&quot;&gt;QOA: Quite OK Audio&lt;/h2&gt;
&lt;p&gt;さて、本来のデモはシーケンサーでおわりだったのですが、出囃子に桃井はるこさんの「ルミカ」という素敵な曲を使わせていただいたので、せっかくならもうすこし長くみなさんに聴いてもらいたいと思いました。&lt;/p&gt;
&lt;p&gt;実は内部生成するドラム音源以外にサンプリング音も扱えるようにQOAとWAVの読み込み機能もHarucomにつくっていました。そこで、このQOAデコーダーを使い、曲をまるっと再生できるような機能を序破急に組込みました。&lt;/p&gt;
&lt;p&gt;QOAは整数演算だけでデコードできる超軽量のオーディオフォーマットです。リファレンス実装はC言語で400行くらいしかありません。HarucomのFlashは2MBほどの空き領域があったので、ここをフルに使って1番のみに編集した「ルミカ」をぎゅうぎゅうに詰め込みました。&lt;/p&gt;
&lt;p&gt;照明プログラムは序破急の機能を使い、ビートにあわせて光らせたり、イントロ、Aメロ、Bメロ、サビでそれぞれ再生パターンが変化するようになっています。サビではムービングライトのプリズムも使い、能楽堂全体を光らせるようにしたのですが、うまくサビのタイミングできまって良かったです。&lt;/p&gt;
&lt;p&gt;スクリプトをみると小節ごとにパターンを切り替えている様子がよくわかると思います。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/harukasan/harucom-os/blob/lumica-lighting-show/rootfs/data/johakyu/lumica.rb&quot;&gt;rootfs/data/johakyu/lumica.rb&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;たとえば、以下の配列で照明の動きを定義していて、曲のはじまりから11小節がイントロ、その次の23小節がAメロ/Bメロ、そのあとの39節がサビからラストにかけての動きになっています。&lt;/p&gt;
&lt;div class=&quot;github-code&quot;&gt;&lt;p class=&quot;github-code-meta&quot;&gt;&lt;a href=&quot;https://github.com/harukasan/harucom-os/blob/lumica-lighting-show/rootfs/data/johakyu/lumica.rb#L62-L91&quot;&gt;&lt;code&gt;rootfs/data/johakyu/lumica.rb#L62-L91&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot;&gt;pan_left &lt;span class=&quot;pl-k&quot;&gt;=&lt;/span&gt; [
  [hold(&lt;span class=&quot;pl-c1&quot;&gt;0.667&lt;/span&gt;), &lt;span class=&quot;pl-c1&quot;&gt;11&lt;/span&gt;],
  [sine.range(&lt;span class=&quot;pl-c1&quot;&gt;0.60&lt;/span&gt;, &lt;span class=&quot;pl-c1&quot;&gt;0.73&lt;/span&gt;).slow(&lt;span class=&quot;pl-c1&quot;&gt;8&lt;/span&gt;).segment(&lt;span class=&quot;pl-c1&quot;&gt;16&lt;/span&gt;), &lt;span class=&quot;pl-c1&quot;&gt;23&lt;/span&gt;],
  [sine.range(&lt;span class=&quot;pl-c1&quot;&gt;0.60&lt;/span&gt;, &lt;span class=&quot;pl-c1&quot;&gt;0.73&lt;/span&gt;).slow(&lt;span class=&quot;pl-c1&quot;&gt;2&lt;/span&gt;).segment(&lt;span class=&quot;pl-c1&quot;&gt;16&lt;/span&gt;), &lt;span class=&quot;pl-c1&quot;&gt;39&lt;/span&gt;],
  [hold(&lt;span class=&quot;pl-c1&quot;&gt;0.667&lt;/span&gt;), &lt;span class=&quot;pl-c1&quot;&gt;1&lt;/span&gt;],
  [rest, &lt;span class=&quot;pl-c1&quot;&gt;286&lt;/span&gt;],
]

pan_right &lt;span class=&quot;pl-k&quot;&gt;=&lt;/span&gt; [
  [hold(&lt;span class=&quot;pl-c1&quot;&gt;0.667&lt;/span&gt;), &lt;span class=&quot;pl-c1&quot;&gt;11&lt;/span&gt;],
  [sine.range(&lt;span class=&quot;pl-c1&quot;&gt;0.73&lt;/span&gt;, &lt;span class=&quot;pl-c1&quot;&gt;0.60&lt;/span&gt;).slow(&lt;span class=&quot;pl-c1&quot;&gt;8&lt;/span&gt;).segment(&lt;span class=&quot;pl-c1&quot;&gt;16&lt;/span&gt;), &lt;span class=&quot;pl-c1&quot;&gt;23&lt;/span&gt;],
  [sine.range(&lt;span class=&quot;pl-c1&quot;&gt;0.73&lt;/span&gt;, &lt;span class=&quot;pl-c1&quot;&gt;0.60&lt;/span&gt;).slow(&lt;span class=&quot;pl-c1&quot;&gt;2&lt;/span&gt;).segment(&lt;span class=&quot;pl-c1&quot;&gt;16&lt;/span&gt;), &lt;span class=&quot;pl-c1&quot;&gt;39&lt;/span&gt;],
  [hold(&lt;span class=&quot;pl-c1&quot;&gt;0.667&lt;/span&gt;), &lt;span class=&quot;pl-c1&quot;&gt;1&lt;/span&gt;],
  [rest, &lt;span class=&quot;pl-c1&quot;&gt;286&lt;/span&gt;],
]

tilt_path &lt;span class=&quot;pl-k&quot;&gt;=&lt;/span&gt; [
  [hold(&lt;span class=&quot;pl-c1&quot;&gt;0.141&lt;/span&gt;), &lt;span class=&quot;pl-c1&quot;&gt;11&lt;/span&gt;],
  [hold(&lt;span class=&quot;pl-c1&quot;&gt;0.141&lt;/span&gt;), &lt;span class=&quot;pl-c1&quot;&gt;23&lt;/span&gt;],
  [cosine.range(&lt;span class=&quot;pl-c1&quot;&gt;0.0&lt;/span&gt;, &lt;span class=&quot;pl-c1&quot;&gt;0.3&lt;/span&gt;).slow(&lt;span class=&quot;pl-c1&quot;&gt;2&lt;/span&gt;).segment(&lt;span class=&quot;pl-c1&quot;&gt;16&lt;/span&gt;), &lt;span class=&quot;pl-c1&quot;&gt;39&lt;/span&gt;],
  [hold(&lt;span class=&quot;pl-c1&quot;&gt;0.141&lt;/span&gt;), &lt;span class=&quot;pl-c1&quot;&gt;1&lt;/span&gt;],
  [rest, &lt;span class=&quot;pl-c1&quot;&gt;286&lt;/span&gt;],
]

prism_path &lt;span class=&quot;pl-k&quot;&gt;=&lt;/span&gt; [
  [hold(&lt;span class=&quot;pl-c1&quot;&gt;0&lt;/span&gt;), &lt;span class=&quot;pl-c1&quot;&gt;34&lt;/span&gt;],
  [hold(&lt;span class=&quot;pl-c1&quot;&gt;180&lt;/span&gt;), &lt;span class=&quot;pl-c1&quot;&gt;39&lt;/span&gt;],
  [hold(&lt;span class=&quot;pl-c1&quot;&gt;0&lt;/span&gt;), &lt;span class=&quot;pl-c1&quot;&gt;1&lt;/span&gt;],
  [rest, &lt;span class=&quot;pl-c1&quot;&gt;286&lt;/span&gt;],
]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;さいごにスポットライトがスクリーンを向くところは、trackのミュートを切り替えてライブで動かしていました。ちょっと遅れてしまったけど、こういうのをリアルタイムにできるのが序破急のよさです。&lt;/p&gt;
&lt;h2 id=&quot;m-まとめ&quot;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;舞台照明はふだんの生活で触れることがない世界ですが、こういったよくわからないものについていろいろと話しているときって一番楽しいですよね。今回の発表では能舞台を光らせるっていう、これまでにない体験ができました。なにかよくわからないけど、なんか楽しそうに話しているのが伝わったらいいな、と思っています。今週末の土曜日、7月25日には大阪で&lt;a href=&quot;https://momoiharuko.com/static/Live20260725/&quot;&gt;桃井はるこさんのワンマンライブ&lt;/a&gt;があるのでまた関西に行く予定です!&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>関西Ruby会議09で「照らす技術」をRubyで照らします</title>
      <link>https://harukasan.dev/posts/diary/20260714-kanrk09</link>
      <guid isPermaLink="true">https://harukasan.dev/posts/diary/20260714-kanrk09</guid>
      <pubDate>Tue, 14 Jul 2026 04:20:00 GMT</pubDate>
      <dc:creator>Harukasan</dc:creator>
      <description>日記を書こうと思っていたら今週末になってしまいましたが、2026年7月18日(土)に滋賀県大津市にある大津市伝統芸能会館で開催される関西Ruby会議09にて、「『照らす技術』をRubyで照らす」という題で登壇させていただきます。 最近「ゆず」と桃井はるこさんのライブに行くようにな...</description>
      <content:encoded>&lt;img src=&quot;https://harukasan.dev/images/diary/20260714.jpg&quot; class=&quot;header-image&quot; alt=&quot;ヘッダー画像: ライブ会場で吊り下げられたトラスとステージ照明の写真&quot;/&gt;
&lt;p&gt;日記を書こうと思っていたら今週末になってしまいましたが、2026年7月18日(土)に滋賀県大津市にある大津市伝統芸能会館で開催される&lt;a href=&quot;https://regional.rubykaigi.org/kansai09/&quot;&gt;関西Ruby会議09&lt;/a&gt;にて、「『照らす技術』をRubyで照らす」という題で登壇させていただきます。&lt;/p&gt;
&lt;p&gt;最近「ゆず」と桃井はるこさんのライブに行くようになり、10年以上たってまた音楽に触れる機会が多くなっているのですが、ライブ会場に着いてまず気になるのは、建て込まれているステージ、ブース、機材、たくさんのケーブルです。はやめに会場にはいって、これからライブで使われる機材をながめながらわくわくしています。&lt;/p&gt;
&lt;p&gt;今回のテーマは「照」ということで、舞台照明のうらがわの仕組みについて、Rubyを用いてその技術を照らし出すことにチャレンジしてみようと思います。能舞台にはムービングライトを持ちこんでデモンストレーションする予定です。発表時間の都合であまり触れられなさそうなので先に言ってしまうのですが、デモンストレーションには &lt;a href=&quot;https://rubykaigi.org/2026/presentations/asonas.html&quot;&gt;RubyKaigi 2026 で asonas さんが発表&lt;/a&gt;していた &lt;a href=&quot;https://github.com/asonas/strudel-rb&quot;&gt;strudel-rb&lt;/a&gt; をもとにしたシーケンサーを使います。事前に資料を振り返っておくとすこし理解しやすいかもしれません。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://speakerdeck.com/player/236b35b862ab412fa3967f9ffadb103d&quot;&gt;スライドを見る (Speaker Deck)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;いろいろと機材を持ち込まないといけない都合上いつもより動きづらいところが難点ですが、その分、この会議でしかできない登壇になっているはずです。それでは、会場でおあいしましょう！&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>関ケ原Ruby会議01に西軍大名として参戦してまいった</title>
      <link>https://harukasan.dev/posts/diary/20260531-sekigahara</link>
      <guid isPermaLink="true">https://harukasan.dev/posts/diary/20260531-sekigahara</guid>
      <pubDate>Sun, 31 May 2026 02:40:00 GMT</pubDate>
      <dc:creator>Harukasan</dc:creator>
      <description>やあやあ遠からん者は音にも聞け、近くば寄って目にも見よ！ それがし、「道井 筑後微漠権頭 源朝臣 俊頼」と申す！ 令和8年5月30日に岐阜県関ケ原町にてひらかれし 関ケ原Ruby会議01 に、西軍大名として参戦してまいった。 どなたのお話であったかおぼえておらぬのだが「忠臣は二君...</description>
      <content:encoded>&lt;img src=&quot;https://harukasan.dev/images/diary/20260531.jpg&quot; class=&quot;header-image&quot; alt=&quot;ヘッダー画像: 合戦の様子&quot;/&gt;
&lt;p&gt;やあやあ遠からん者は音にも聞け、近くば寄って目にも見よ！
それがし、「道井 筑後微漠権頭 源朝臣 俊頼」と申す！
令和8年5月30日に岐阜県関ケ原町にてひらかれし &lt;a href=&quot;https://regional.rubykaigi.org/sekigahara01/&quot;&gt;関ケ原Ruby会議01&lt;/a&gt; に、西軍大名として参戦してまいった。&lt;/p&gt;
&lt;p&gt;どなたのお話であったかおぼえておらぬのだが「忠臣は二君に仕えず」という考え方ができたのは江戸時代にはいってからであって、安土桃山時代にはそれほど重視されておらなんだようで、まさにそのとおり、武将がそれぞれの思いでなにやらおもしろきことをやっておるかんじがいとよかった。&lt;/p&gt;
&lt;h2 id=&quot;m-rubykaja-の儀&quot;&gt;RubyKaja の儀&lt;/h2&gt;
&lt;p&gt;関ケ原Ruby会議にてはRubyKajaという表彰の儀がとりおこなわれた。
RubyKajaというのは「自分の近くの優れたRubyistを皆で褒め称えたい」というコンセプトで行われる若手Rubyistの奨励賞のようなものなれど、各コミュニティが主体となって選出するということで、普段は表彰されることのない、それぞれのコミュニティにおいてコミュニティ活動を支えておられる方々が受賞されておったのが印象的であった。&lt;/p&gt;
&lt;p&gt;某が最近よく参陣しておるPicoRubyにまつわるコミュニティであるPicoPicoRubyからは &lt;a href=&quot;https://x.com/makicamel&quot;&gt;@makicamel&lt;/a&gt; 殿がSpecial Awardを受賞なされた。&lt;/p&gt;
&lt;p&gt;先週催された &lt;a href=&quot;https://picopicoruby.connpass.com/event/392714/&quot;&gt;PicoPicoRuby #13&lt;/a&gt; に参じたところ、&lt;a href=&quot;https://x.com/makicamel&quot;&gt;@makicamel&lt;/a&gt; 殿は「受賞スピーチの壇上にてプラレールのからくりを走らせたく、助太刀願いたい」とのことであったゆえ、壇上にて使うタイマーを &lt;a href=&quot;https://harucom.org/&quot;&gt;Harucom&lt;/a&gt; にてこしらえさせてもろうた。
一座の興のままにきまっていったゆえ、ひじょうにふわっとした要件しかなかったが、どうにか作品として仕あがってなによりであった。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/makicamel&quot;&gt;@makicamel&lt;/a&gt; 殿には事前検分いただく必要があったゆえ、PicoRuby.wasmを用いてブラウザにて動かせるプレビューもこしらえた。
Harucomの応用指示書はことごとくRubyにて記されておるゆえ、かんたんな継ぎ手をこしらえるだけでさまざまな環境にて動かせる。
&lt;a href=&quot;https://x.com/hasumikin&quot;&gt;@hasumikin&lt;/a&gt; あらため「橘羽角前下総守情操指南匠均之助」殿が発表されておったrefinementsのごとき機能が &lt;a href=&quot;https://github.com/mruby/mruby/tree/master/mrbgems/mruby-task&quot;&gt;mruby-task&lt;/a&gt; に加われば、よりデバイスの抽象化がかんたんになりて重畳かとおもう。
どういうつくりか容易に知れるとおもうゆえ、&lt;a href=&quot;view-source:http://harukasan.dev/posts/projects/harucom/rubykaja2026.html&quot;&gt;源符号&lt;/a&gt;も検分されよ。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://harukasan.dev/posts/projects/harucom/rubykaja2026.html&quot;&gt;RubyKaja お祝いタイマー（PicoRuby.wasm プレビュー）を開く&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;壇上におると舞台がどう見えておったかはよくわからぬのだが、いつものPicoPicoRubyというかんじで、まさに &lt;a href=&quot;https://x.com/makicamel&quot;&gt;@makicamel&lt;/a&gt; 殿がコミュニティにいかなる影響を与えておるかが壇上にて披露されたのがよかったとおもう。
あらためて受賞、祝着至極に存じ候。&lt;/p&gt;
&lt;h2 id=&quot;m-天下分け目の関ケ原&quot;&gt;天下分け目の関ケ原&lt;/h2&gt;
&lt;p&gt;地域Ruby会議はふつう地元の方と遠征してまいった者どもが交流するのが主題のひとつとしてあると思うておるが、関ケ原は天下分け目の地だけあって、上方、東海道、坂東、あるいはそれよりも遠き地などと、それぞれの土地より兵どもがあつまっておった気がした。
わざわざ関ケ原まで馳せ参じる者どもゆえ、普段よりもコミュニティが濃縮されておるかんじもあった。&lt;/p&gt;
&lt;p&gt;これまでかんじておった地域Ruby会議とはまたちがった発見があって、よりいろんなところに出陣したき気持ちがたかまったが、あまり遠征しすぎるのもよろしからぬゆえ、これからもうまくこれぞというものを見つけてまいりたいとおもう。
次は &lt;a href=&quot;https://regional.rubykaigi.org/kansai09/&quot;&gt;関西Ruby会議09&lt;/a&gt; にて登壇する所存なれば、いざ尋常に励みまする。&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>はじめての RubyKaigi</title>
      <link>https://harukasan.dev/posts/diary/20260512-rubykaigi2026</link>
      <guid isPermaLink="true">https://harukasan.dev/posts/diary/20260512-rubykaigi2026</guid>
      <pubDate>Tue, 12 May 2026 11:00:00 GMT</pubDate>
      <dc:creator>Harukasan</dc:creator>
      <description>日本Ruby会議2011 私がRubyKaigiにはじめて参加したのは2011年、まだ日本Ruby会議という名前だった。当時のスケジュールを振り返ってみたらちょうどRuby 1.8と1.9の境だったり、松田さんがRails開発のはなしをしていたりしておもしろい。バックアップから当...</description>
      <content:encoded>&lt;h2 id=&quot;m-日本ruby会議2011&quot;&gt;日本Ruby会議2011&lt;/h2&gt;
&lt;p&gt;私がRubyKaigiにはじめて参加したのは2011年、まだ&lt;a href=&quot;https://rubykaigi.org/2011/&quot;&gt;日本Ruby会議&lt;/a&gt;という名前だった。当時のスケジュールを振り返ってみたらちょうどRuby 1.8と1.9の境だったり、松田さんがRails開発のはなしをしていたりしておもしろい。バックアップから当時の写真がでてきた。&lt;/p&gt;
&lt;p&gt;そのあと&lt;a href=&quot;https://www.pixiv.co.jp/&quot;&gt;PHPをメインで使っている会社&lt;/a&gt;にインフラエンジニアとして入社することになるのだが、当時、私は「Railsエンジニア」という肩書きで入社するはずで、入社式でインフラチーム配属と発表され私が「えっ」ってなってて、&lt;a href=&quot;https://x.com/norio&quot;&gt;norio&lt;/a&gt;さんが「そんなの聞いてない」って言ってておもしろかった。その&lt;a href=&quot;https://x.com/norio&quot;&gt;norio&lt;/a&gt;さんは日本Ruby会議にデザイナーとして携わっていたりする。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://harukasan.dev/images/diary/20260512/rubykaigi-1.jpg&quot; alt=&quot;写真:まつもとさんとはじめて撮った写真&quot;/&gt;&lt;/p&gt;
&lt;h2 id=&quot;m-rubykaigi-2025&quot;&gt;RubyKaigi 2025&lt;/h2&gt;
&lt;p&gt;はじめてRubyKaigiの壇上にたったのは昨年のRubyKaigiのライトニングトーク。わたしはふだんRubyを開発しているわけではないし、例年のRubyKaigiではいつも壇上のプレゼンテーションを眺めているだけだった。&lt;/p&gt;
&lt;p&gt;そんなとき、プレゼンはできなくても「プレゼンする」ということはLTのネタになるのでは、と思いついた。Rubyでの組み込み開発ネタは毎年あり、とくにゲーム枠は定番のひとつだと思う。またRabbitはRubyKaigiでよく使われているRuby製のプレゼンテーションツールだ。Raspberry Pi PicoはPicoRubyの標準的なターゲット環境であり、Raspberry Pi PicoをつかってDVI出力をするプロジェクト PicoDVI は知っていたので、つまりmrubyからDVI出力をうまく制御できれば、mrubyで画面出力が可能になる。あとはRabbitをつくればプレゼンができる。ここまでは自然な発想である。&lt;/p&gt;
&lt;div class=&quot;tweet-card d_block max-w_[550px] my_30 p_30 bd-w_1px border-style_solid bd-c_border.secondary bdr_m bg_background textStyle_caption/regular/m&quot;&gt;&lt;div class=&quot;d_flex ai_center gap_20 mbe_20&quot;&gt;&lt;a href=&quot;https://x.com/sora_h&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;img src=&quot;https://pbs.twimg.com/profile_images/827706661091450881/-_fmliNC_normal.jpg&quot; alt=&quot;&quot; width=&quot;44&quot; height=&quot;44&quot; loading=&quot;lazy&quot; class=&quot;d_block w_[44px] h_[44px] bdr_full flex-sh_0&quot;/&gt;&lt;/a&gt;&lt;div class=&quot;d_flex flex-d_column min-w_[0] lh_[1.2]&quot;&gt;&lt;a href=&quot;https://x.com/sora_h&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;tweet-name textStyle_caption/bold/m c_text td_none ov_hidden tov_ellipsis white-space_nowrap&quot;&gt;そらは&lt;/a&gt;&lt;a href=&quot;https://x.com/sora_h&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;tweet-handle textStyle_caption/regular/s c_text.secondary td_none ov_hidden tov_ellipsis white-space_nowrap&quot;&gt;@sora_h&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;tweet-body textStyle_caption/regular/m c_text white-space_pre-wrap wb_break-word mbe_20&quot;&gt;&lt;span&gt;一旦申し込んで逃げ道無くしましょう&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;d_flex ai_center gap_30 pbs_20 bd-t-w_1px border-top-style_solid bd-t-c_border.secondary&quot;&gt;&lt;a href=&quot;https://x.com/intent/tweet?in_reply_to=1902945297426420008&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; aria-label=&quot;Reply on X&quot; class=&quot;tweet-action-reply d_inline-flex ai_center gap_10 textStyle_caption/regular/s c_text.secondary td_none bdr_full px_10 py_10&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; aria-hidden=&quot;true&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M4.648 17.192l-.451 3.611 4.252-.531a9 9 0 10-3.801-3.08zM12 19a6.97 6.97 0 01-3.223-.785L6.5 18.5l.236-1.886A7 7 0 1112 19z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span&gt;0&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://x.com/intent/like?tweet_id=1902945297426420008&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; aria-label=&quot;Like on X&quot; class=&quot;tweet-action-like d_inline-flex ai_center gap_10 textStyle_caption/regular/s c_text.secondary td_none bdr_full px_10 py_10&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; aria-hidden=&quot;true&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M13.087 21.021C18.792 17.831 22 13.81 22 8.91A5.91 5.91 0 0016.09 3c-1.529 0-2.976.747-4.09 1.834C10.886 3.747 9.439 3 7.91 3A5.91 5.91 0 002 8.91c0 4.9 3.208 8.92 8.913 12.111a2.227 2.227 0 002.174 0zM16.09 5A3.91 3.91 0 0120 8.91c0 3.86-2.482 7.342-7.889 10.366a.229.229 0 01-.222 0C6.482 16.252 4 12.77 4 8.91A3.91 3.91 0 017.91 5c1.115 0 2.38.723 3.287 1.943L12 8.021l.803-1.078C13.71 5.723 14.975 5 16.09 5z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span&gt;0&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://x.com/sora_h/status/1902945297426420008&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;textStyle_caption/regular/s c_text.secondary td_none ms_auto&quot;&gt;&lt;time dateTime=&quot;2025-03-21T04:48:08.000Z&quot;&gt;2025/03/21 13:48 JST&lt;/time&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;こういうことは迂闊にツイートすることで逃げ場をなくすことができる。&lt;a href=&quot;https://sorah.jp/&quot;&gt;sorah&lt;/a&gt;に後押ししてもらったので、あとはプロポーザルを書くだけだ。&lt;/p&gt;
&lt;p&gt;mrubyで画面出力をしたい、という発想は&lt;a href=&quot;https://2024.rubyworld-conf.org/ja/&quot;&gt;RubyWorld Conference 2024&lt;/a&gt;より前には思いついていて、&lt;a href=&quot;https://hasumikin.com/&quot;&gt;hasumikin&lt;/a&gt;さんに相談したところ「Pico 2だったらできるのでは」ということだったので、Raspberry Pi Pico 2を使って取り組みはじめた。ちょうどいいことに、RP2350にはHSTXというDVI出力のためにあるような機能があってこれがかなりたすかった。&lt;/p&gt;
&lt;p&gt;とはいえいろいろ忙しかったので、プロポーザル時点でできあがっていたのは&lt;a href=&quot;https://github.com/harukasan/picorabbit/blob/97dce13eea0cdc721196a5395fcf407b9a261d5c/mrblib/main_task.rb&quot;&gt;青い画面に &amp;quot;Hello, World!&amp;quot;&lt;/a&gt; できたところまでだった。RubyKaigiの前週はアメリカ出張だったので、2週間ちょっとしかなかったがCursorのおかげでなんとかなった。LLMはこういうプロトタイプにはとても良い。&lt;/p&gt;
&lt;p&gt;最終的にできあがったのはDay 1のお昼ぐらい、夕方ぐらいに&lt;a href=&quot;https://yujiyokoo.dev/&quot;&gt;Yuji Yokoo&lt;/a&gt;さんがRubyKaigi 2024の発表で&lt;a href=&quot;chrome://dino/&quot;&gt;Dinosaur Game&lt;/a&gt;を実装していたのを思い出して、最後にこれを追加してコミットしてとりあえず完成とした。&lt;/p&gt;
&lt;p&gt;このときの画面出力はかなり不安定で、最終的に解像度を640x240にして縦を2倍スケーリングすることでどうにかダブルバッファリングして映ってるかんじだった。当時は &lt;a href=&quot;https://github.com/raspberrypi/pico-examples/&quot;&gt;pico-examples&lt;/a&gt; のコードをほとんどそのまま使っていたが、mrubyを動かすと画面の中央はグリッチしていて、実はそこを避けて文字を配置したりしている。縦解像度を半分にするアイデアは土壇場で思いついたが、LTが終わった後に&lt;a href=&quot;https://x.com/yukihiro_matz&quot;&gt;まつもとさん&lt;/a&gt;と&lt;a href=&quot;https://yujiyokoo.dev/&quot;&gt;Yokooさん&lt;/a&gt;と話していたところ、昔のNECにも縦の解像度を半分にする200ラインモードというのがあったというのを教えてもらった。&lt;/p&gt;
&lt;p&gt;このときは他にもできていないことはかなりあって、evalするのは諦めたし、発表練習する時間もなく、うまくいけば奇跡というかんじだったので、2分くらいずっと壇上でゲームしつづけることになったが、とにかくうまく動いてよかった。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://speakerdeck.com/player/fab558bfbc2f4ab39019a9a8d3ab1ba6&quot;&gt;スライドを見る (Speaker Deck)&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;m-rubykaigi-2025-follow-up&quot;&gt;RubyKaigi 2025 Follow up&lt;/h2&gt;
&lt;p&gt;ということで、RubyKaigi 2025ではじめて壇上に立つことになったわけだが、さきほど書いたように、この時点でできていないことがたくさんあった。というのは私が松江で&lt;a href=&quot;https://hasumikin.com/&quot;&gt;hasumikin&lt;/a&gt;さんに相談していたことは「PicoRubyを使って画面出力とキーボードをつくれれば、Rubyだけでコンピューターができないか」ということだったからである。ということで、そのアイデアをRubyKaigi 2025 Follow upではなした。このときのスライドにはDVI出力の安定化のためにやろうとしていたアイデアがだいたい書いてある。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://speakerdeck.com/player/fce6dea8faa84ae4b5617b49a2b46145&quot;&gt;スライドを見る (Speaker Deck)&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;m-proposal-をだす&quot;&gt;Proposal をだす&lt;/h2&gt;
&lt;p&gt;松山にいたとき、RubyKaigi 2026のCFPに応募するというのは決めていた。というのはRubyKaigi 2026とNext &amp;#39;26のスケジュールが被ってしまっており、登壇でもしないと函館に行く理由がなくなってしまうからだ。そんなことを深夜、道後温泉からの帰り道に金子さんに話した。&lt;/p&gt;
&lt;p&gt;PicoRabbitの後継にはHakodate Projectと名付け、まずはCでDVI出力の安定化にチャレンジしはじめた。このHakodate Project、うまくいったかというとそんなことはまったくなかった。&lt;/p&gt;
&lt;p&gt;RubyKaigi 2026のCFPに応募したあとも、娘の受験がありプライベートも仕事も相変わらず忙しく、あまり進捗が出ない状態だった。ここから先の進捗は&lt;a href=&quot;https://picopicoruby.github.io/&quot;&gt;PicoPicoRuby&lt;/a&gt;のDiscordの &lt;a href=&quot;https://discord.com/channels/1345382324694548500/1473105189690019892&quot;&gt;#times-harukasan&lt;/a&gt; チャンネルを遡るとわかる。2月17日の時点でC実装に立ち戻って画面をアニメーションできただけであるが、昨年が2週間しかなかったなかで基板まで発注していたので、まあ2ヶ月あればどうにかなるのではないかと思っていた。&lt;/p&gt;
&lt;p&gt;このころにはClaude Codeがかなり賢くなっていて、ARMのアセンブリを直接書けたり、mrubyのバイトコードをデバッグできるようになっていたのでかなりたすかった。&lt;/p&gt;
&lt;h2 id=&quot;m-harucom&quot;&gt;Harucom&lt;/h2&gt;
&lt;p&gt;プロトタイピングがすすみ、DVI出力、キーボード入力、オーディオなどCで実装できてきた。あとはこれらをmrbgemにしてmrubyに組み込めばできるわけである。もともとやろうとしていたR2P2D2の目標はだいたいクリアすることになる。&lt;/p&gt;
&lt;p&gt;ここでもとに立ち返って、Rubyでコンピューターができないか、と考えていた理由を思い出した。そもそも、Rubyでコンピューターをつくる理由は、自由に書き換えて壊したいというのがある。&lt;/p&gt;
&lt;p&gt;ほとんどのコードをCで書いてmrbgemにしてしまえばそれが安定するのは当然であるが、そうするとRubyで書ける部分がすくなくなってしまう。そこで、Cで書く部分は最低限にして、Rubyのコードはすべて実行時にオンザフライでコンパイルすることを目指すことにする。&lt;/p&gt;
&lt;p&gt;なるべくRubyで動くコンピューターを目指す。このプロジェクトがHarucomである。&lt;/p&gt;
&lt;p&gt;Harucomにはいくつかの目標がある。ひとつめはmrubyで十分にうごくコンピューターを作り上げること、ふたつめはR2P2D2の実現にむけて十分な知見をためること、そして3つめはRubyKaigi 2026での発表を成功させることである。&lt;/p&gt;
&lt;p&gt;Harucomの名前の由来はいくつかあり、桃井はるこさんの名前の由来にもなっているといわれているHAL 9000からとっているが、単純にHarukasan&amp;#39;s Computerの略でもある。harukasanというハンドルの由来は桃井はるこさんとは関係ないけれど桃井さんに「はるかさんとはるこさんじゃん」って言ってもらえたのはうれしい。&lt;/p&gt;
&lt;p&gt;さて、実際にHarucomのルートファイルシステムはスクリプトを書き換えて再起動すれば破壊することができるようになっている。mrubyなんだからコンパイルしてmrbファイルだけおけばいいのに毎回コンパイルしていて富豪的だが、こうすることで誰でも簡単に壊すことができる。&lt;/p&gt;
&lt;p&gt;これを実現するためにはかなり多くのメモリが必要になることは明白である。RP2350について調べていくうちにPSRAMのサポートが加わっていることを知っていたので、PSRAMを搭載した基板をつくることでこれを解決する。ここまでの考えはRubyKaigi 2026のCFPに応募した時点では固まりきっていなかったので、提出したProposalではプロジェクト名がR2P2D2のままになっている。&lt;/p&gt;
&lt;p&gt;試作がうまくいっていたので、RubyKaigiではボードを頒布することにした。これで多くの人に試してもらえれば、たくさん問題がみつかるはずである。ここまでの試作はうまくいっていたので、50枚発注したのが4月3日。JLCPCBは発注からだいたい一週間ぐらいでできるので、よゆうがあるなとおもっていたが、製造工程の問題で途中で部品が足りなくなり、到着予定日が4月21日になってしまった。この日は函館に移動する予定日だったのでまずい。サポートチャットに連絡して発送をDHLに切り替え、無事前週の木曜日には受け取れた。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://harukasan.dev/images/diary/20260512/rubykaigi-2.jpg&quot; alt=&quot;中国から届いた基板&quot;/&gt;&lt;/p&gt;
&lt;p&gt;土日は学校の保護者会があったり、髪を切ったりしたら時間がなくなり、ここにきて今まで発現しなかった問題をひきあててしまって時間がなくなっていった。最終的に徹夜作業して全品検査して箱詰めがおわったのは函館に出発する日のお昼くらいである。なんでこの日私は有休をとっていなかったのだろうか。普通にミーティングしてて地獄になってしまった。もうしわけない。&lt;/p&gt;
&lt;h2 id=&quot;m-day-0-函館に着陸&quot;&gt;Day 0: 函館に着陸&lt;/h2&gt;
&lt;p&gt;月曜日を移動日としていたことで交通のトラブルには巻き込まれず、無事に函館につくことができた。今回のおもしろいところとして、すでにソフトウェアはボードに組み込んでいるので、前日に追い込み作業ができないことがある。去年とはえらいちがいだ。&lt;/p&gt;
&lt;p&gt;火曜日は五稜郭の桜をみたり、おいしいお寿司をいただいたりゆっくりすごすことができた。前回五稜郭にきたときは一面の雪景色でそれもとても美しかったが、桜が満開の五稜郭はまたちがった美しさがあった。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://harukasan.dev/images/diary/20260512/rubykaigi-3.jpg&quot; alt=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://harukasan.dev/images/diary/20260512/rubykaigi-4.jpg&quot; alt=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://harukasan.dev/images/diary/20260512/rubykaigi-5.jpg&quot; alt=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://harukasan.dev/images/diary/20260512/rubykaigi-6.jpg&quot; alt=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;夜はスカラシップで参加いただいた学生との懇親会があった。そのあと&lt;a href=&quot;https://sakahukamaki.hatenablog.jp/entry/rubykaigi-2026&quot;&gt;炬燵さんがきりもりするyancya bar&lt;/a&gt;でビールをいただいた。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://harukasan.dev/images/diary/20260512/rubykaigi-7.jpg&quot; alt=&quot;&quot;/&gt;&lt;/p&gt;
&lt;h2 id=&quot;m-day-1-登壇&quot;&gt;Day 1: 登壇&lt;/h2&gt;
&lt;p&gt;Day 1はKeynoteから聞くことができた。午前中にHarucomを本屋さんに納品にいったのだけど、お昼過ぎには完売してしまっていた。まだBOOTHでは売っているのでよかったら買ってほしい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://harukasan.booth.pm/items/8127045&quot;&gt;Harucom Board - はるかさんのBOOTH - BOOTH&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://harukasan.dev/images/diary/20260512/rubykaigi-8.jpg&quot; alt=&quot;写真:本屋さんで売っていただいたHarucom&quot;/&gt;&lt;/p&gt;
&lt;p&gt;そんなこんなで発表だったのだけど、発表前に部屋に荷物をとりにもどったところ暗証番号を忘れてiPhoneを部屋の中においたまま出てしまい締め出しをくらってしまった。偶然廊下に&lt;a href=&quot;https://x.com/EHamachang&quot;&gt;hamachang&lt;/a&gt;さんがいらっしゃって&lt;a href=&quot;https://x.com/yancya&quot;&gt;yancya&lt;/a&gt;さんを呼んでもらったところ、偶然ちかくにいた&lt;a href=&quot;https://x.com/yancya&quot;&gt;yancya&lt;/a&gt;さんがすぐに来てくれてたすかった。&lt;/p&gt;
&lt;p&gt;発表前はどきどきしながら、廊下のスペースで練習していたが、急に動かなくなってめちゃくちゃ焦った。これは使っていたUSBケーブルのせいだとわかって、同僚に急遽USBケーブルを貸してもらってたすかった。&lt;/p&gt;
&lt;p&gt;そんなこんなでいろんな人にたすけてもらって無事発表を終わらせることができた。Harucomにはたくさんのこだわりがつまっているが、この日記があまりにも長くなっているし、&lt;a href=&quot;https://pixiv.connpass.com/event/392661/&quot;&gt;5月25日にあるピクシブのアフターイベント&lt;/a&gt;で話すので、ぜひこれを聞きに来てください。とにかく無事に発表がおわってよかった。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://speakerdeck.com/player/0c57de576eb047d59daf9afcc9e94b2c?slide=2&quot;&gt;スライドを見る (Speaker Deck)&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;m-day-2-picopicoruby&quot;&gt;Day 2: PicoPicoRuby&lt;/h2&gt;
&lt;p&gt;Day 2は&lt;a href=&quot;https://andpad.connpass.com/event/385946/&quot;&gt;コード懇親会&lt;/a&gt;と共催された&lt;a href=&quot;https://picopicoruby.connpass.com/event/389163/&quot;&gt;PicoPicoRuby#12@コード懇親会&lt;/a&gt;に参加した。事前にDiscordでリレーの使い方の相談を受けており、そのリレーは秋月電子通商で買ってきたのだが、はんだづけしてもっていく必要があって、一旦部屋にもどってはんだづけしたりしていた。 コード懇親会にはテスターとか安定化電源とかを持っていったのだけど役立っていたようでよかった。主催してくださったANDPADの皆さんと須藤さん、ありがとうございました。&lt;/p&gt;
&lt;h2 id=&quot;m-day-3-rubyilluminations&quot;&gt;Day 3: RubyIlluminations&lt;/h2&gt;
&lt;p&gt;Day 3の夜は恒例になりつつあるピクシブ主催のイベントがあった。今年も無事に開催できてほんとうによかった。くわしいことは&lt;a href=&quot;https://inside.pixiv.blog&quot;&gt;pixiv inside&lt;/a&gt;にでもまた書こうとおもうけど、会場にもめぐまれてすばらしいイベントになったとおもう。思いのほかはやく片付けがおわってしまって、この日もyancya barのラストに間に合ってしまった。&lt;/p&gt;
&lt;h2 id=&quot;m-day-4-市電lt&quot;&gt;Day 4: 市電LT&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://harukasan.dev/images/diary/20260512/rubykaigi-9.jpg&quot; alt=&quot;写真:市電LTの出発点になった駒場車庫&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Day 4は朝からSmartHRさんの&lt;a href=&quot;https://smarthr.connpass.com/event/385269/&quot;&gt;函館市電LT&lt;/a&gt;に参加した。京都でも叡電LTに乗ったんだけどすごくおもしろくてまた参加したかったので発表枠で申しこんだ。電車内ではスクリーンが使えないので出力をどうするかという問題があり、HDMIモニターも函館に持っていたが、これはつかわずにディスプレイモジュールをつかうことにした。&lt;/p&gt;
&lt;p&gt;Harucomは基板に&lt;a href=&quot;https://akizukidenshi.com/catalog/g/g112031/&quot;&gt;0.96インチのOLEDディスプレイモジュール&lt;/a&gt;を搭載できるようにしてある。これをつかってゲームをつくって、ゲームであそんでもらっている間に発表するスタイルにした。函館といえばイカ、イカといえばゲーム、というのは自然な発想であるが、その商標をつかうことはLLMによって阻止され、函館イカ釣りゲームという名前になった。イカ釣りゲームけっこうよくできたとおもうので遊んでみてほしい。自動起動周りをちゃんとデバッグしてないけどいまは&lt;a href=&quot;https://github.com/harukasan/harucom-os/pull/4&quot;&gt;このPR&lt;/a&gt;にあります。&lt;/p&gt;
&lt;p&gt;その後は歩いて函館を観光した。私は箱館山の南、立待岬からスタートしたんだけど、ちょうど反対側にある函館どつくから歩いてきた金子さんたちと中間にあるロープウェイ近辺で再会しておもしろかった。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://harukasan.dev/images/diary/20260512/rubykaigi-10.jpg&quot; alt=&quot;写真:市電LTの様子&quot;/&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://harukasan.dev/images/diary/20260512/rubykaigi-11.jpg&quot; alt=&quot;写真:立待岬&quot;/&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://harukasan.dev/images/diary/20260512/rubykaigi-12.jpg&quot; alt=&quot;写真:函館公園&quot;/&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://harukasan.dev/images/diary/20260512/rubykaigi-13.jpg&quot; alt=&quot;写真:公会堂からみた景色&quot;/&gt;&lt;/p&gt;
&lt;p&gt;夜になり急に寒くなったので&lt;a href=&quot;https://www.instagram.com/whiteseed_beer/&quot;&gt;White seed&lt;/a&gt;に立ち寄ってお礼を伝えて一杯いただいた。夕食のことはなにもかんがえていなかったが隣にいた地元の方にジンギスカンのお店をおしえてもらい、&lt;a href=&quot;https://hasumikin.com/&quot;&gt;hasumikin&lt;/a&gt;さんといただいた。一見するとふつうの居酒屋だったので教えてもらわないとたどりつかなかったとおもう。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://harukasan.dev/images/diary/20260512/rubykaigi-14.jpg&quot; alt=&quot;写真:hasmuikinさんとたべたジンギスカン&quot;/&gt;&lt;/p&gt;
&lt;h2 id=&quot;m-はじめてのrubykaigi&quot;&gt;はじめてのRubyKaigi&lt;/h2&gt;
&lt;p&gt;こういったかたちでRubyKaigiは毎年新しい発見があるし、全国をまわるし、もちろん毎回「はじめてのRubyKaigi」がある。今回はSpeakerとしてはじめての参加だったし、壇上に上がったのも去年のLTがはじめてだった。&lt;/p&gt;
&lt;p&gt;RubyKaigi 2025の &amp;quot;Ruby Committers and the World&amp;quot; でまつもとさんが「壇上と参加者の距離はそんなに遠くないと思っている」と言ったのを覚えている。もちろんこれはRuby CommittersとRubyistsの距離のことを言っているのだけれども、自分があがるとも思っていなかったRubyKaigiの壇上にあがることになったのはなんだか感慨深かった。そのあと松田さんには「はるかさんはこっち側の人間だと思ってましたよ」って言われたのも覚えているけれど、どこでそう思われたのかはよくわかっていない。&lt;/p&gt;
&lt;p&gt;毎年いろんなことが起こるんだけど、ずっと参加しているといろんなところでいろんなことがつながるのでおもしろい。思い返すと日本Ruby会議2011の壇上でWindowsサポートについてキレている人がいて嫌なかんじだなあと思っていたusaさんとは後に同僚となり、私がはじめたプロダクトを支えてもらっている。念のため書いておくとプロレスみたいなものとのことで本人は非常にいい人である。&lt;/p&gt;
&lt;p&gt;そんなこんなでいろんな人にたすけられながら日々を生きている。それで思い出したけど、今回はやんちゃハウスが隣にあって本当にたすかった。大量の荷物を持ち歩かないといけなかったので、となりじゃなかったら無理だったとおもう。その恩もあり毎日yancya barに通い詰めたのだけど、RubyKaigiビールをのむならyancya barが最高だった。私としてはHakodate Ruby on Aleのほうが好みだったかな。提供されるプラカップがどんどんでかくなってサイズ選び放題になったのがおもしろかった。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://harukasan.dev/images/diary/20260512/rubykaigi-15.jpg&quot; alt=&quot;写真:Day0に苫小牧から到着したyancyaさん&quot;/&gt;&lt;/p&gt;
&lt;h2 id=&quot;m-これから&quot;&gt;これから&lt;/h2&gt;
&lt;p&gt;Harucomは&lt;a href=&quot;https://harukasan.booth.pm/items/8127045&quot;&gt;BOOTHでも頒布している&lt;/a&gt;けどありがたいことに結構注文をいただいているので、今週はその発送作業をしないといけない。いくつかすでに不具合が見つかっていてPicoRubyをなおさないといけないのもあるので、どうにか時間をみつけてなおしていきたい。GWがおわって会社のカレンダーが大変なことになっているのもある。&lt;/p&gt;
&lt;p&gt;こんなに長く書いたのに観たセッションのことはひとことも書けていない。来週からはまた&lt;a href=&quot;https://smarthr.connpass.com/event/390319/&quot;&gt;SmartHRさんの事後勉強会&lt;/a&gt;に参加する予定で、再来週の月曜日はさっき言ったとおり&lt;a href=&quot;https://pixiv.connpass.com/event/392661/&quot;&gt;ピクシブのRubyKaigiアフターイベント&lt;/a&gt;でまた登壇するのでみんなきてほしい。そうこうしていたらもう&lt;a href=&quot;https://regional.rubykaigi.org/sekigahara01/&quot;&gt;関ケ原Ruby会議&lt;/a&gt;ですね。&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>RubyKaigi 2026 の本屋さんで Ruby コンピューター Harucom ボードを頒布します</title>
      <link>https://harukasan.dev/posts/diary/20260420-atdot-bookstore</link>
      <guid isPermaLink="true">https://harukasan.dev/posts/diary/20260420-atdot-bookstore</guid>
      <pubDate>Mon, 20 Apr 2026 13:28:00 GMT</pubDate>
      <dc:creator>Harukasan</dc:creator>
      <description>いよいよRubyKaigi 2026 まであと2日になりました。私もさきほど函館に到着したばかりです。 今年の RubyKaigi の1日目、Small Hall (#rubyKaigiC) 16:40〜17:10 にて &amp;quot;Building a Standalone Ruby P...</description>
      <content:encoded>&lt;img src=&quot;https://harukasan.dev/images/diary/20260420.jpg&quot; class=&quot;header-image&quot; alt=&quot;ヘッダー画像: 組み立て後のHarucom boardの写真&quot;/&gt;
&lt;p&gt;いよいよRubyKaigi 2026 まであと2日になりました。私もさきほど函館に到着したばかりです。&lt;/p&gt;
&lt;p&gt;今年の RubyKaigi の1日目、Small Hall (#rubyKaigiC) 16:40〜17:10 にて &lt;a href=&quot;https://rubykaigi.org/2026/presentations/harukasan.html&quot;&gt;&amp;quot;Building a Standalone Ruby Programming Environment&amp;quot;&lt;/a&gt; というタイトルで登壇させていただくことになりました。このトークは Ruby が動作する小さなプログラミング環境をつくった話になっています。このトークで登場する私が作っているちいさな Ruby コンピューター &lt;a href=&quot;https://harucom.org/&quot;&gt;Harucom&lt;/a&gt; のボードの量産試作品を、RubyKaigiの会場内の本屋さん &amp;quot;@. bookstore&amp;quot; にて委託頒布していただくことになりました。&lt;strong&gt;価格は 3900 円&lt;/strong&gt; です。ぜひお立ち寄りいただき、お手にとってもらえるとうれしいです。&lt;/p&gt;
&lt;p&gt;登壇内容については &lt;a href=&quot;https://harukasan.dev/posts/diary/20260325-harucom&quot;&gt;先日日記にも書いたのでこちら&lt;/a&gt; もご覧ください。&lt;/p&gt;
&lt;h2 id=&quot;m-頒布情報&quot;&gt;頒布情報&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;商品名&lt;/strong&gt;: Harucom Bundle with Acrylic Panels&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;場所&lt;/strong&gt;: RubyKaigi 2026 会場の本屋さん &amp;quot;@. bookstore&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;価格&lt;/strong&gt;: 3900 円&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回頒布するものは、ボードにアクリルパネルが付属したモデルです。会場以外にも &lt;a href=&quot;https://harukasan.booth.pm/items/8127045&quot;&gt;BOOTH&lt;/a&gt; でも頒布する予定です。こちらもぜひチェックしてください。&lt;/p&gt;
&lt;h2 id=&quot;m-harucom-とは&quot;&gt;Harucom とは&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://harucom.org/&quot;&gt;Harucom&lt;/a&gt; は、PicoRubyで動作するシングルボードコンピューターです。USB キーボードとモニターやテレビを繋ぐだけで、Ruby のプログラミング環境がすぐに使えます。Harucomはオープンソースプロジェクトです。次のリポジトリでソースコードを公開しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基板: &lt;a href=&quot;https://github.com/harukasan/harucom-board&quot;&gt;harukasan/harucom-board&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ファームウェア: &lt;a href=&quot;https://github.com/harukasan/harucom-os&quot;&gt;harukasan/harucom-os&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;詳しい使い方は下記ドキュメントサイトをごらんください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://harucom.org/&quot;&gt;https://harucom.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;会期中は会場のいろんなところにいるとおもいますので、お気軽に話しかけていただけるとうれしいです。それでは会場でおあいしましょう！&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>RubyKaigi 2026で発表するRuby Computer Project &quot;Harucom&quot;について</title>
      <link>https://harukasan.dev/posts/diary/20260325-harucom</link>
      <guid isPermaLink="true">https://harukasan.dev/posts/diary/20260325-harucom</guid>
      <pubDate>Wed, 25 Mar 2026 06:00:00 GMT</pubDate>
      <dc:creator>Harukasan</dc:creator>
      <description>2026年4月22日(水)から北海道函館市にある函館アリーナ・函館市民会館にて開催される RubyKaigi 2026 において &amp;quot;Building a Standalone Ruby Programming Environment&amp;quot; というタイトルで発表します。わたしの発表枠は...</description>
      <content:encoded>&lt;img src=&quot;https://harukasan.dev/images/diary/20260325.jpg&quot; class=&quot;header-image&quot; alt=&quot;ヘッダー画像: Harucomボードのイメージ&quot;/&gt;
&lt;p&gt;2026年4月22日(水)から北海道函館市にある函館アリーナ・函館市民会館にて開催される &lt;a href=&quot;https://rubykaigi.org/2026/&quot;&gt;RubyKaigi 2026&lt;/a&gt; において &lt;a href=&quot;https://rubykaigi.org/2026/presentations/harukasan.html&quot;&gt;&amp;quot;Building a Standalone Ruby Programming Environment&amp;quot;&lt;/a&gt; というタイトルで発表します。わたしの発表枠は1日目のSmall Hall (#rubyKaigiC)の16:40-17:10の枠です。&lt;/p&gt;
&lt;h2 id=&quot;m-building-a-standalone-ruby-programming-environment&quot;&gt;Building a Standalone Ruby Programming Environment&lt;/h2&gt;
&lt;p&gt;以下は &lt;a href=&quot;https://rubykaigi.org/2026&quot;&gt;RubyKaigi 2026&lt;/a&gt; に提出した &lt;a href=&quot;https://rubykaigi.org/2026/presentations/harukasan.html&quot;&gt;Abstract&lt;/a&gt; の日本語訳です。&lt;/p&gt;
&lt;p&gt;現代のコンピューティング環境は複雑すぎて、初学者がプログラミング感覚を掴むためには難しいことがたくさんあります。
Ruby を書こうとするだけでも、初心者はまず OS のことだったり、エディターのセットアップ、Ruby 自体のインストールといったことを学ばなければなりません。
こうしたノイズはプログラミングの本質に辿り着くことを困難にしています。&lt;/p&gt;
&lt;p&gt;このトークでは、mruby を用いて作っているスタンドアローンな Ruby コンピューターである Harucom について発表します。
Harucom は約20ドルの自作シングルボードコンピューターで、ホスト PCをいっさい介さず、ディスプレイ出力とキーボード入力を備えたプログラミング環境を提供します。&lt;/p&gt;
&lt;p&gt;具体的には、リアルタイムな 640x480 出力やテキスト・図形描画をサポートするグラフィックスエンジンの実装に加え、USB キーボードやR2P2 デバイスとの通信に対応した Ruby シェルについて深く掘り下げる予定です。
これらすべてのコンポーネントが mruby VM で動作する様子を通じて、小さなマイコン上であっても、ゼロから完全なコンピューティング体験を構築できるほどの強力なポテンシャルが mruby に備わっていることを実証します。&lt;/p&gt;
&lt;h2 id=&quot;m-harucom&quot;&gt;Harucom&lt;/h2&gt;
&lt;p&gt;Harucom とは、この発表のために製作している PicoRuby で Ruby コンピューターが作れることを示すための技術証機です。
Harucom という名前には決まった定義がありませんが、
&lt;b&gt;H&lt;/b&gt;euristically &lt;b&gt;A&lt;/b&gt;ccessible &lt;b&gt;Ru&lt;/b&gt;by &lt;b&gt;Com&lt;/b&gt;puter、
&lt;b&gt;Ha&lt;/b&gt;kodate &lt;b&gt;Ru&lt;/b&gt;byKaigi &lt;b&gt;Com&lt;/b&gt;ponent、
あるいは &lt;b&gt;Ha&lt;/b&gt;rukasan&amp;#39;s &lt;b&gt;Ru&lt;/b&gt;by &lt;b&gt;Com&lt;/b&gt;puter の略としています。&lt;/p&gt;
&lt;p&gt;シングルボードコンピューターである &lt;a href=&quot;https://github.com/harukasan/harucom-board&quot;&gt;Harucom-board &lt;/a&gt; はCERN Open Hardware Licence Version 2 - Permissive (CERN-OHL-P v2)、ファームウェアである &lt;a href=&quot;https://github.com/harukasan/harucom-os&quot;&gt;Harucom-OS&lt;/a&gt; はMIT Licenseのもとに公開しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/harukasan/harucom-board&quot;&gt;Harucom-board&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/harukasan/harucom-os&quot;&gt;Harucom-OS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;m-stay-tuned-harucom-量産試作モデルの頒布について&quot;&gt;Stay tuned; Harucom 量産試作モデルの頒布について&lt;/h2&gt;
&lt;p&gt;Harucom の量産試作モデルをRubyKaigi 2026の会場、及び &lt;a href=&quot;https://harukasan.booth.pm/&quot;&gt;BOOTH&lt;/a&gt; にて頒布する予定です。
ただし、いま試作を発注していてそれが届くのが来週とかなので、RubyKaigi本編に間に合うかはかなり怪しいスケジュールです。
間に合わなかったら &lt;a href=&quot;https://harukasan.booth.pm/&quot;&gt;BOOTH&lt;/a&gt; での頒布になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://harukasan.booth.pm/items/8127045&quot;&gt;Harucom Board - はるかさんのBOOTH - BOOTH&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://harukasan.booth.pm/&quot;&gt;BOOTH&lt;/a&gt; で頒布する発注数はまだ決めていないので、BOOTHにおいて「入荷お知らせメールを受け取る」ボタン、「スキ！」ボタンを押してもらえると助かります。
よろしくお願いします。&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>高専プロコン島根大会の旅 #procon36</title>
      <link>https://harukasan.dev/posts/diary/20251013-procon36</link>
      <guid isPermaLink="true">https://harukasan.dev/posts/diary/20251013-procon36</guid>
      <pubDate>Mon, 13 Oct 2025 12:00:00 GMT</pubDate>
      <dc:creator>Harukasan</dc:creator>
      <description>2025年10月11日、12日に開催された全国高等専門学校プログラミングコンテスト (高専プロコン) 第36回松江大会に企業審査委員として参加させていただきました。 松江 今回の主幹校である松江高専がある島根県松江市は Ruby City MATSUE としても知られている。その...</description>
      <content:encoded>&lt;img src=&quot;https://harukasan.dev/images/diary/20251013.jpg&quot; class=&quot;header-image&quot; alt=&quot;ヘッダー画像: くにびき大橋にたなびく高専プロコンの旗&quot;/&gt;
&lt;p&gt;2025年10月11日、12日に開催された&lt;a href=&quot;https://www.procon.gr.jp/?page_id=80481&quot;&gt;全国高等専門学校プログラミングコンテスト (高専プロコン) 第36回松江大会&lt;/a&gt;に企業審査委員として参加させていただきました。&lt;/p&gt;
&lt;h2 id=&quot;m-松江&quot;&gt;松江&lt;/h2&gt;
&lt;p&gt;今回の主幹校である松江高専がある島根県松江市は Ruby City MATSUE としても知られている。そのためRubyistにとってはなじみ深い土地である。&lt;/p&gt;
&lt;p&gt;今回の高専プロコンと同じ会場である島根県立産業交流会館 「くにびきメッセ」では今年も11月に &lt;a href=&quot;https://2025.rubyworld-conf.org/ja/&quot;&gt;RubyWorld Conference 2025&lt;/a&gt; が開かれる。
私も参加する予定なので、今回の訪問は今年二回あるうちの一回目になるはず。&lt;/p&gt;
&lt;p&gt;今回の高専プロコンでは、 RubyWorld Conference のメインホールとなる国際会議場がまるっと審査委員会の部屋になっていて贅沢だな～って思っていた。
RubyWorld Conference でしか来たことないからそうじゃないくにびきメッセは新鮮でおもしろかった。&lt;/p&gt;
&lt;h2 id=&quot;m-審査&quot;&gt;審査&lt;/h2&gt;
&lt;p&gt;高専プロコンはいつも朝が早く、審査委員の集合は8:30になっている。
それから審査委員連絡会があって開会式があって、一日目のプレゼンテーション審査が始まる。&lt;/p&gt;
&lt;p&gt;プレゼンテーション審査では学生のプレゼンテーションを聞いて評価したり、いろいろ質問したり、ソースコードを確認したりして結構忙しい。&lt;/p&gt;
&lt;p&gt;一日目の夕方には学生交流企画としてまつもとゆきひろさんが出演する講演会があってちょっとおもしろそうだったんだけど、裏で情報交換会があったので見ることはできなかった。
&lt;a href=&quot;https://www.youtube.com/live/Y5eJJkdOgsM&quot;&gt;アーカイブが Youtube にある&lt;/a&gt;ので気が向いたらあとで見るかもしれない。&lt;/p&gt;
&lt;p&gt;二日目はデモ審査でデモ会場となるブースをぐるぐると廻っていると、今年もあっという間に終わってしまった。
企業賞のコメントとかは &lt;a href=&quot;https://inside.pixiv.blog/&quot;&gt;pixiv inside&lt;/a&gt; に書くと思います。&lt;/p&gt;
&lt;h2 id=&quot;m-石見神楽&quot;&gt;石見神楽&lt;/h2&gt;
&lt;img src=&quot;https://harukasan.dev/images/diary/20251013-2.jpg&quot; class=&quot;header-image&quot; alt=&quot;ヘッダー画像: 大蛇に囲まれ草薙剣を振るう須佐之男命&quot;/&gt;
&lt;p&gt;二日目の閉会式前には特別公演として&lt;a href=&quot;https://iwamikagura.jp/&quot;&gt;石見神楽&lt;/a&gt;の上演があった。
今回上演された演目である「大蛇」は石見神楽の中でも最も人気のある演目で、1970年の大阪万博では13頭立ての「大蛇」が披露された事は皆さんご存知らしい（知らなかった）。
今年の大阪・関西万博ではなんと55頭の大蛇が登場したとのこと。
大蛇ってそんなにたくさんいるんだ。&lt;/p&gt;
&lt;p&gt;最初のうちは老夫婦とか姫とか出てきてなるほどこういう話だったよな～って思いながら見ていたんだけど、そうこうしているうちに8頭の大蛇がでてきてステージがいっぱいになった。&lt;/p&gt;
&lt;p&gt;大蛇が酒を飲んで寝てしまったら須佐之男命が出てきて寝込みを襲って大立ち回りを演じるんだけど、大蛇は火を噴いていてとにかく大迫力だった。
この会場、火気使ってもいいんだ。
8頭でも倒すのに結構な時間掛かっていたからこの調子で55頭の大蛇を倒すのは大変だと思う。&lt;/p&gt;
&lt;p&gt;地元の人が言うには、8頭立ての大蛇はなかなか見られるものではないらしい。
良いものをみられて良かった。&lt;/p&gt;
&lt;h2 id=&quot;m-松江の夜&quot;&gt;松江の夜&lt;/h2&gt;
&lt;p&gt;松江に行くと毎回たくさんおいしい日本酒を頂いている。&lt;/p&gt;
&lt;p&gt;いつもはRubyistsがたくさんいるけれど、今回は暇そうにしていたら羽角さんが夜誘ってくれた。
Rubyistsは飲んでるとどこかから人が増えていくのでサシ飲みできるのは贅沢なことであると勝手に思っている。
忙しい中付き合ってもらってありがとうございました。&lt;/p&gt;
&lt;p&gt;そのあと羽角さんに教えてもらったバーでウイスキーを頂いていた。
Ardbeg TRAIGH BHAN 19 years oldがめちゃくちゃ美味しかったです。&lt;/p&gt;
&lt;h2 id=&quot;m-出雲大社&quot;&gt;出雲大社&lt;/h2&gt;
&lt;img src=&quot;https://harukasan.dev/images/diary/20251013-3.jpg&quot; class=&quot;header-image&quot; alt=&quot;画像: 出雲駅伝のスタート地点である出雲大社&quot;/&gt;
&lt;p&gt;最終日は時間があったので出雲大社にお詣りしてから帰ることにした。
この日、出雲ではちょうど出雲駅伝が開かれていて、前日の夜もその話をしたはずなんだけどスタート地点が出雲大社であることはすっかり忘れていた。
お昼食べたらちょうどスタート時刻で、スタートの瞬間を見られたのでよかった。&lt;/p&gt;
&lt;p&gt;バックパックにずっと出雲大社の縁結びのお守りをつけているんだけど、大分古くなってしまっていたのでこの機会に真新しいものを授かってきた。
ついでにおみくじをひいたらすごい運勢がよくてよかった。&lt;/p&gt;
&lt;h2 id=&quot;m-おみやげ&quot;&gt;おみやげ&lt;/h2&gt;
&lt;p&gt;松江に来ると定番のお土産がいくつかあるんだけど、今回もいくつか買って帰った。
板わかめを買わずに帰ったら何で買ってこなかったのか、って言われたので次回は買って帰ります。&lt;/p&gt;
&lt;h3 id=&quot;m-風流堂-朝汐&quot;&gt;風流堂 朝汐&lt;/h3&gt;
&lt;p&gt;松江は日本三大和菓子処と呼ばれていていくつも和菓子屋さんがある。
いくつも美味しいものがあるんだけど、今回は風流堂の朝汐を買って帰った。
朝汐は甘さ控えめで毎日食べられるかんじで、一日一個ずつ消費している。
出雲縁結び空港でも買えるのでおすすめです。&lt;/p&gt;
&lt;h3 id=&quot;m-因幡の白うさぎ&quot;&gt;因幡の白うさぎ&lt;/h3&gt;
&lt;p&gt;福岡でいうところのひよこ的ポジションに君臨する代表的な銘菓。
おまんじゅうの他にフィナンシェとかフィナンシェプレミアムショコラとかもある。&lt;/p&gt;
&lt;h3 id=&quot;m-來間屋生姜糖本舗-生姜糖&quot;&gt;來間屋生姜糖本舗 生姜糖&lt;/h3&gt;
&lt;p&gt;はじめて買って帰ったけれど、砂糖の塊なのにショウガが効いていて美味しかった。
板チョコみたいになっていて一片ずつ割って食べるようになっている。
1枚で十分なサイズ感です。&lt;/p&gt;
&lt;h2 id=&quot;m-次回&quot;&gt;次回&lt;/h2&gt;
&lt;p&gt;次回の高専プロコンは香川県高松市で開催。
今年も主催いただいたプロコン委員のみなさま、大会関係者のみなさま、出場された学生のみなさま、ありがとうございました。
来年も参加する際はよろしくお願いします。&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>Kaigi on Rails 2025 に参加した / #kaigionrails</title>
      <link>https://harukasan.dev/posts/diary/20250928-kaigi-on-rails-2025</link>
      <guid isPermaLink="true">https://harukasan.dev/posts/diary/20250928-kaigi-on-rails-2025</guid>
      <pubDate>Sat, 27 Sep 2025 13:00:00 GMT</pubDate>
      <dc:creator>Harukasan</dc:creator>
      <description>東京駅の目と鼻の先、　KITTE にある JP TOWER Hall &amp;amp; Conference で9月26日、27日の二日間開かれた Kaigi on Rails　2025 に参加してきた。今回も朝から夜、あるいは朝から朝まで充実した時間だった。 Keynote: dynamic...</description>
      <content:encoded>&lt;img src=&quot;https://harukasan.dev/images/diary/20250927.jpg&quot; class=&quot;header-image&quot; alt=&quot;dynamic!&quot;/&gt;
&lt;p&gt;東京駅の目と鼻の先、　KITTE にある JP TOWER Hall &amp;amp; Conference で9月26日、27日の二日間開かれた &lt;a href=&quot;https://kaigionrails.org/2025/&quot;&gt;Kaigi on Rails　2025&lt;/a&gt; に参加してきた。今回も朝から夜、あるいは朝から朝まで充実した時間だった。&lt;/p&gt;
&lt;h2 id=&quot;m-keynote-dynamic&quot;&gt;Keynote: dynamic!&lt;/h2&gt;
&lt;p&gt;初日のスタートは &lt;a href=&quot;https://github.com/moro&quot;&gt;moro&lt;/a&gt; さんによる &amp;quot;Keynote: dynamic!&amp;quot;。「変化」ではなく、ソフトウェア開発における「動的」な様態に着目しているのが良い視点だなあと思って聞いていた。あと、タイトルの &lt;code&gt;#dynamic!&lt;/code&gt; が破壊的メソッドなのがとても好き。聴きながら「重要なことに取り組むのが重要」とか「難しいことは難しい」とか自分もよく使っている構文が出てきたのがすごく共感した。&lt;/p&gt;
&lt;p&gt;この発表における「動的」という表現は、プログラミング言語における「静的/static」に対する「動的/dynamic」のメタファーになっている。
これは単に「変化し続ける」ということを超えて「実行時に評価」されそうなかんじがして良い例えだなあと思っていて、たとえば「rails cで動作を確認する」とか「ハッピーパスに集中する」とか「実際に動かして開発する」とかそのへんがまさに「動的」ぽさっぽい。&lt;/p&gt;
&lt;p&gt;カンファレンスの始まりとしてはすごくまとまってるなと思ったけど、こういうのから始まるのが Kaigi on Rails っぽさを感じる。人の振る舞いにおいても、こういった「動的」な性質を持っておこうね、というのはカンファレンスにおける良い心得のひとつだと思う。&lt;/p&gt;
&lt;h2 id=&quot;m-今改めて-service-クラスについて考える&quot;&gt;今改めて Service クラスについて考える&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/joker1007&quot;&gt;joker1007&lt;/a&gt; さんのセッション。これすごいコンテキストが深いから、あと何回かスライド読まないと全然わかってない気分になっているけど、 Service クラスがもともと持つ複雑性とそれにどう向き合うかが説明されていてとてもよかった。モジュラーモノリスのインターフェースが Service クラスに近いかはよくわかってないけど、何かしら型がついたメソッドにはなりそうな気がする。&lt;/p&gt;
&lt;h2 id=&quot;m-schedule&quot;&gt;Schedule&lt;/h2&gt;
&lt;p&gt;今回の Schedule はめちゃくちゃ意図を感じとれてよかった。複数のトークがストーリーを作っていたり、これとこれが裏になってたらめっちゃ悩むよなあみたいなのを一日に何度も経験しておもしろかった。waiwaiルームでもたくさんおしゃべり出来てよかった。そうやってたら聞き逃したセッションもあるけれど。&lt;/p&gt;
&lt;h2 id=&quot;m-マンガアプリapiと共存するweb体験版の作り方--コンテンツ保護技術を添えて&quot;&gt;マンガアプリAPIと共存するWeb体験版の作り方 〜 コンテンツ保護技術を添えて&lt;/h2&gt;
&lt;p&gt;同僚の &lt;a href=&quot;https://github.com/pxp-baba&quot;&gt;baba&lt;/a&gt; さんのセッション。いろんなものが複雑になるだけで、なんかこういうのでいいんだよな、みたいな技術選択が難しくなってきている気がして、その中でこういう技術選択の話がいくつかあるような気がした。この話は前に書いたように続くhogelogさんの話とテーマがつながっているのもよかった。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.sakura.ad.jp/services/imageflux/&quot;&gt;ImageFlux&lt;/a&gt; の宣伝もしてもらってありがとうございます。 GridShuffle に興味ある方は是非お気軽にお声がけください。意外と自分で作ると面倒なやつだ。&lt;/p&gt;
&lt;h2 id=&quot;m-keynote-building-and-deploying-interactive-rails-applications-with-falcon&quot;&gt;Keynote: Building and Deploying Interactive Rails Applications with Falcon&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ioquatix&quot;&gt;Samuel Williams&lt;/a&gt; さんがつくられた &lt;a href=&quot;https://github.com/socketry/falcon&quot;&gt;Falcon&lt;/a&gt; の話。 &lt;a href=&quot;https://github.com/socketry/falcon&quot;&gt;Falcon&lt;/a&gt; 自体は &lt;a href=&quot;https://rubykaigi.org/2024/presentations/ioquatix.html#day2&quot;&gt;RubyKaigiでも紹介されていた&lt;/a&gt;けれど、さまざまな機能が搭載されていてすごかった。とにかくたくさんの機能がでてきたけど、プレゼンテーションの流れがうまくて誰でも簡単にできるようにみえるようになっていて、しかも最後にみんなでVive codingするのがとても楽しかった。RubyKaigiにはないスタイルのセッションでとてもKaigi on Railsの色が出ていたと思う。&lt;/p&gt;
&lt;h2 id=&quot;m-おわり&quot;&gt;おわり&lt;/h2&gt;
&lt;p&gt;二日目はbabaさんや会社のメンバーで打ち上げをしたあと東京駅八重洲口にある &lt;a href=&quot;https://www.antenna-america.com/pages/tokyo&quot;&gt;Antenna America Tokyo&lt;/a&gt; でビールを頂いていた。みんなでわけてのんだKarl Straussの36th Anniversary barrel aged、めちゃくちゃおいしかったですね。&lt;/p&gt;
&lt;p&gt;最後はなんか懇親会場かっていうくらい広い中華料理店でずっと青島ビールがでてきておもしろかった。あと久しぶりにホッピーを飲んだ。&lt;/p&gt;
&lt;p&gt;最近の仕事では殆どコーディングすることはなくなってしまっていているんだけど、私はもともとRailsエンジニアして採用された（はず）と今でも思っているので、今でもRailsと頑張っている人達を見られると尊敬したり共感したりできてうれしい。頑張ってついていこうと気持ちを新たにした。&lt;/p&gt;
&lt;p&gt;毎回オーガナイザー大変そうだなあ、とおもっているけど、今年も開催していただいた Kaigi on Rails Team の皆さん、関わってくださっている皆さんありがとうございました。&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>桃井はるこのファンクラブイベントに行ってきた</title>
      <link>https://harukasan.dev/posts/diary/20250923</link>
      <guid isPermaLink="true">https://harukasan.dev/posts/diary/20250923</guid>
      <pubDate>Tue, 23 Sep 2025 13:00:00 GMT</pubDate>
      <dc:creator>Harukasan</dc:creator>
      <description>わたしがはじめて桃井はるこを認識したのは、たぶん父が購読していた月間アスキーに寄稿していた頃で、なんかインターネットで有名なお姉さんっていうイメージだったけど、ちゃんと曲を聴き始めたのは先輩に「くじびきアンバランス」とか「ナースウィッチ小麦ちゃんマジカルて」を布教されてからだった...</description>
      <content:encoded>&lt;img src=&quot;https://harukasan.dev/images/diary/20250923.jpg&quot; class=&quot;header-image&quot; alt=&quot;ヘッダー画像: もらったサイン&quot;/&gt;
&lt;p&gt;わたしがはじめて桃井はるこを認識したのは、たぶん父が購読していた月間アスキーに寄稿していた頃で、なんかインターネットで有名なお姉さんっていうイメージだったけど、ちゃんと曲を聴き始めたのは先輩に「&lt;a href=&quot;https://dic.pixiv.net/a/%E3%81%8F%E3%81%98%E3%81%B3%E3%81%8D%E3%82%A2%E3%83%B3%E3%83%90%E3%83%A9%E3%83%B3%E3%82%B9&quot;&gt;くじびきアンバランス&lt;/a&gt;」とか「&lt;a href=&quot;https://dic.pixiv.net/a/%E3%83%8A%E3%83%BC%E3%82%B9%E3%82%A6%E3%82%A3%E3%83%83%E3%83%81%E5%B0%8F%E9%BA%A6%E3%81%A1%E3%82%83%E3%82%93%E3%83%9E%E3%82%B8%E3%82%AB%E3%83%AB%E3%81%A6&quot;&gt;ナースウィッチ小麦ちゃんマジカルて&lt;/a&gt;」を布教されてからだったと思う。そのあと、いつでも行こうと思えば行けたんだろうけど、いつのまにか20年も経っていた。&lt;/p&gt;
&lt;p&gt;いつもどおり &lt;a href=&quot;https://x.com/&quot;&gt;&lt;span style=&quot;margin: 1rem&quot;&gt;X&lt;/span&gt;&lt;/a&gt; を眺めていると、桃井さんが事務所を移籍していて、さらにニューシングルを出す情報が流れてきた。びっくりである。そろそろ令和にも慣れたなと思っていたけど、平成だった。&lt;/p&gt;
&lt;p&gt;とりあえず、これはやばいとおもって、いちばん近かった&lt;a href=&quot;https://momoiharuko.com/news/public/_/baajs7cyvjpvkj7t.html&quot;&gt;ファンクラブイベント&lt;/a&gt;に申込んだ。そもそも所謂アイドルライブには殆ど参戦したことがないので &lt;a href=&quot;https://www.youtube.com/@momoiktkr&quot;&gt;Youtube&lt;/a&gt; で予習した。&lt;/p&gt;
&lt;p&gt;会場はもっとぎゅうぎゅうになってほしいところだけどそんなことはなく、古参の方々はやさしくて、めちゃくちゃ良い体験だった。隣の人からサイリウム分けてもらって、これほんとうにあるんだ、って思った。かがやきサイリュームを思い出した。桃井さんは「現場が殺伐とするくらい新規に来てほしい」って言ってて格好良かった。&lt;/p&gt;
&lt;p&gt;とにかく目の前で神がステージ上で跳ねててすごかった。ラジオで聴いていた人が目の前に存在していた。サイン会では「はるこさんとはるかさんじゃん！」って言ってもらえて、このハンドルネームで本当によかった。おもいだすと今でもちょっとドキドキするけど、まさに目の前に神がいた。&lt;/p&gt;
&lt;p&gt;上京してからも仕事とかいわゆる生活環境の変化というやつで、なかなか踏み出せないでいたけれど、いまなら私も「&lt;a href=&quot;https://momoiharuko.com/static/Single20251014/&quot;&gt;NewGame+&lt;/a&gt;」できる気がする。とりあえず次は12月14日（日）、桃井さんの誕生日の&lt;a href=&quot;https://momoiharuko.com/news/public/_/nyei1a2qwxiriqnx.html&quot;&gt;ワンマンライブ&lt;/a&gt;に行きます。推しは推せるときに推せってね。&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>Hello, World!</title>
      <link>https://harukasan.dev/posts/diary/hello</link>
      <guid isPermaLink="true">https://harukasan.dev/posts/diary/hello</guid>
      <pubDate>Mon, 09 Jun 2025 17:00:00 GMT</pubDate>
      <dc:creator>Harukasan</dc:creator>
      <description>個人ページをようやくつくりなおしました！</description>
      <content:encoded>&lt;p&gt;個人ページをようやくつくりなおしました！&lt;/p&gt;</content:encoded>
    </item>
  </channel>
</rss>
