<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
<title>kishima blog</title>
<subtitle>kishima のブログ</subtitle>
<id>https://blog.silentworlds.info/</id>
<link rel="alternate" type="text/html" href="https://blog.silentworlds.info/"/>
<link rel="self" type="application/atom+xml" href="https://blog.silentworlds.info/feed.xml"/>
<updated>2026-10-24T00:21:12+09:00</updated>
<author><name>kishima</name></author>
<entry>
<title>test</title>
<id>https://blog.silentworlds.info/2026/10/post-20261024-0021/</id>
<link rel="alternate" type="text/html" href="https://blog.silentworlds.info/2026/10/post-20261024-0021/"/>
<published>2026-10-24T00:21:12+09:00</published>
<updated>2026-10-24T00:21:12+09:00</updated>
<content type="html" xml:base="https://blog.silentworlds.info/2026/10/post-20261024-0021/">&lt;p&gt;&lt;img src=&quot;esp32wrober2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content>
</entry>
<entry>
<title>同人誌書きつつRustでmruby VMを作った話</title>
<id>https://blog.silentworlds.info/2026/09/tong-ren-zhi-shu-kituturustdemruby-vmwozuo-tutahua/</id>
<link rel="alternate" type="text/html" href="https://blog.silentworlds.info/2026/09/tong-ren-zhi-shu-kituturustdemruby-vmwozuo-tutahua/"/>
<published>2026-09-28T23:55:29+09:00</published>
<updated>2026-09-28T23:55:29+09:00</updated>
<summary>SabiRuby という、Rust で書いた mruby 互換の VM を作っています。mruby のバイトコード（mrbc が出す .mrb）をそのまま実行し、本家の mruby 4.1 と同じに動くことを目指したものです。crates.…</summary>
<content type="html" xml:base="https://blog.silentworlds.info/2026/09/tong-ren-zhi-shu-kituturustdemruby-vmwozuo-tutahua/">&lt;p&gt;SabiRuby という、Rust で書いた mruby 互換の VM を作っています。mruby のバイトコード（&lt;code&gt;mrbc&lt;/code&gt; が出す &lt;code&gt;.mrb&lt;/code&gt;）をそのまま実行し、本家の mruby 4.1 と同じに動くことを目指したものです。crates.io に出していて、先日 0.7.0 を公開しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;リポジトリ: &lt;a href=&quot;https://github.com/sabiruby/sabiruby&quot;&gt;https://github.com/sabiruby/sabiruby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ブラウザで試せる Playground: &lt;a href=&quot;https://sabiruby.github.io/sabiruby-playground/&quot;&gt;https://sabiruby.github.io/sabiruby-playground/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bevy（Rust のゲームエンジン）に組み込む crate: &lt;a href=&quot;https://github.com/sabiruby/rubevy&quot;&gt;https://github.com/sabiruby/rubevy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;先日、h6n さんが Cloudflare Workers 向けの mruby VM「Chiburu」の記事の中で SabiRuby に触れてくれていました（&lt;a href=&quot;https://hanachin.hateblo.jp/entry/2026/09/26/015735&quot;&gt;mruby VMをつくった👍📱&lt;/a&gt;）。その中に「結局みんな Rust で mruby を作っているなら何が違うのか？」という一文があります。&lt;/p&gt;
&lt;p&gt;いい問いだと思ったので、この記事では、SabiRuby がどういう経緯で生まれ、どういう作り方をしているかを書いてみます。ほかの実装との細かい比較ではなく、背景の話です。&lt;/p&gt;
&lt;h2 id=&quot;きっかけは本だった&quot;&gt;きっかけは本だった&lt;a href=&quot;#きっかけは本だった&quot; aria-label=&quot;Link to heading &#39;きっかけは本だった&#39;&quot; data-heading-content=&quot;きっかけは本だった&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;2019 年に「mruby バイトコードハンドブック」という同人誌を出しました。mruby の命令を 1 つずつ解説した本です。今、それを土台にした新しい本「Deep dive into mruby」（mruby 4.1 対応）を書いていて、11 月の技術書典に出す予定です。&lt;/p&gt;
&lt;p&gt;mruby は 2.0 から 4.1 までの間に、命令の数も、例外処理の仕組みも、コンパイラ（Prism への移行）も大きく変わりました。前の本の内容はほとんどそのままでは使えなくなっていたので、書き直すなら、命令の解説だけでなく、VM・GC・コンパイラまで含めた「mruby の解説書の決定版」にしたいと思いました。&lt;/p&gt;
&lt;p&gt;今回の本には、もう一つ目的があります。&lt;strong&gt;この本と本家のソースがあれば、別の言語に mruby の VM を移植できる。そういう仕様書として使えること&lt;/strong&gt;です。&lt;/p&gt;
&lt;p&gt;命令の意味を書くだけなら、ソースを読めば分かります。移植する人が本当に知りたいのは、「どこまでを再現しなければならず、どこからは mruby がそう決めただけで選び直してよいのか」という線引きです。たとえば、例外の伝わり方やメソッドの探し方は再現しなければなりません。一方で、値の表現（NaN boxing）や GC の細かい仕組み、&lt;code&gt;setjmp&lt;/code&gt;/&lt;code&gt;longjmp&lt;/code&gt; は、移植先に合わせて選び直してかまいません。本ではこの線引きを、各章に書いています。&lt;/p&gt;
&lt;p&gt;そう書くからには、本当に移植できるのかを確かめたくなります。SabiRuby は、その確かめとして始まりました。本の説明（レジスタの重ね方、&lt;code&gt;OP_ENTER&lt;/code&gt;、環境、&lt;code&gt;ensure&lt;/code&gt; をまたぐ大域脱出……）を、そのまま Rust に写していく形で作っています。&lt;/p&gt;
&lt;p&gt;移植先に Rust を選んだのは、Bevy でゲームを作るときに、ゲームのロジックを Ruby で書きたかったからです。C の mruby を組み込むこともできますが、VM が Rust で書かれていれば、ゲームと同じ言語・同じビルドの中に収まり、ブラウザ（WebAssembly）にもそのまま持っていけます。&lt;/p&gt;
&lt;h2 id=&quot;何ができるか2026-年-9-月末の時点&quot;&gt;何ができるか（2026 年 9 月末の時点）&lt;a href=&quot;#何ができるか2026-年-9-月末の時点&quot; aria-label=&quot;Link to heading &#39;何ができるか（2026 年 9 月末の時点）&#39;&quot; data-heading-content=&quot;何ができるか（2026 年 9 月末の時点）&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;本家 mruby 4.1.0-rc2 の &lt;code&gt;mrbc&lt;/code&gt; が出すバイトコードを実行する（119 命令すべて）&lt;/li&gt;
&lt;li&gt;本家のテストスイートで互換を確かめている（既定のビルドで 2508 件中 2344 件が通る）&lt;/li&gt;
&lt;li&gt;本家と同じ追跡型の GC、Fiber、mruby-task（タスクスケジューラ）、&lt;code&gt;eval&lt;/code&gt;・&lt;code&gt;binding&lt;/code&gt;、&lt;code&gt;require&lt;/code&gt;、正規表現、数値の塔（bigint・有理数・複素数）など、本家の gem のほとんど&lt;/li&gt;
&lt;li&gt;VM は pure Rust で &lt;code&gt;no_std&lt;/code&gt;（+ &lt;code&gt;alloc&lt;/code&gt;）。&lt;strong&gt;VM の crate に &lt;code&gt;unsafe&lt;/code&gt; は 1 行もありません&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;本家のコンパイラ（Prism と mruby の codegen）も crate として同梱していて、実行中に Ruby のソースをコンパイルできる&lt;/li&gt;
&lt;li&gt;速さは、27 本のベンチの合計で本家の 2.57 倍の時間がかかります。つまり遅いです。速さで勝つことより、互換と安全を優先しています&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;VM が安全な Rust だけで書かれていると、スクリプトの誤りや VM の不具合があっても、メモリが壊れて謎のクラッシュ、ということが構造的に起きません。ゲームに他人の書いたスクリプトを載せる、といった使い方を考えると、この性質はかなり効きます。&lt;/p&gt;
&lt;h2 id=&quot;bevy-に組み込む-rubevy&quot;&gt;Bevy に組み込む: rubevy&lt;a href=&quot;#bevy-に組み込む-rubevy&quot; aria-label=&quot;Link to heading &#39;Bevy に組み込む: rubevy&#39;&quot; data-heading-content=&quot;Bevy に組み込む: rubevy&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;作りたかったのは、Bevy の中でゲームのロジックを Ruby で書けることでした。そのためのつなぎが rubevy です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スクリプト 1 本が mruby-task のタスク 1 本になり、フレームごとに、命令数の予算の中で動きます&lt;/li&gt;
&lt;li&gt;ゲームに問い合わせて答えを待てます（&lt;code&gt;Rubevy.ask&lt;/code&gt;）。待っている間、タスクは CPU を使いません&lt;/li&gt;
&lt;li&gt;ECS のコンポーネントに名前で触れ（&lt;code&gt;e[:Transform]&lt;/code&gt;）、Bevy のイベントを受けられます（&lt;code&gt;on(:hit) { ... }&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;ゲームを動かしたまま、ゲーム内のエディタでスクリプトを書き換えると、すぐに反映されます&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;rubevy を使ったサンプルのゲームが 3 本あり、ブラウザで遊べます（3 本の入口: &lt;a href=&quot;https://sabiruby.github.io/rubevy_games/&quot;&gt;https://sabiruby.github.io/rubevy_games/&lt;/a&gt; ）。どれも、ゲームの振る舞いが Ruby のファイルに書かれていて、ゲームを動かしたまま書き換えられます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SabiRuby Battle&lt;/strong&gt;: ロボットどうしが戦うゲーム。ロボット 1 台の振る舞いが Ruby のファイル 1 つです &lt;a href=&quot;https://sabiruby.github.io/rubevy_games/sabibots/&quot;&gt;https://sabiruby.github.io/rubevy_games/sabibots/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;箱庭（Garden）&lt;/strong&gt;: 3D の小さな世界。生き物が自分の ECS のコンポーネントを Ruby から名前で読み書きし、遺伝子を混ぜて増えます。クリックした生き物のファイルをその場で書き換えられます &lt;a href=&quot;https://sabiruby.github.io/rubevy_games/garden/&quot;&gt;https://sabiruby.github.io/rubevy_games/garden/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Factory&lt;/strong&gt;: 上から見る小さな工場。品物やレシピを Ruby で宣言し、工場で起きたことを Ruby で受け、インサーター 1 台ずつが自分のスクリプトで「いつ物を運ぶか」を決めます &lt;a href=&quot;https://sabiruby.github.io/rubevy_games/factory/&quot;&gt;https://sabiruby.github.io/rubevy_games/factory/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最新の 0.7.0 では、ゲーム用の DSL を書きやすくするために、&lt;strong&gt;block の中でも「待つ」ができるようにしました&lt;/strong&gt;。たとえば &lt;code&gt;instance_exec&lt;/code&gt; で評価する DSL の block の中で、タスクがゲームの答えを待てます。&lt;/p&gt;
&lt;p&gt;これを作る途中で、本家 mruby の振る舞いを 36 通りの経路で実測しました。すると、本家のほうが待てる経路が多いことが分かり、本に書いていた説明の誤りも 2 か所見つかりました。その結果は本の VM 章に反映しています。VM を作ると本が直り、本を直すと VM が直る。この往復があるのが、本と VM を一緒に作っている面白さです。&lt;/p&gt;
&lt;h2 id=&quot;作り方-ai-と一緒に作る&quot;&gt;作り方: AI と一緒に作る&lt;a href=&quot;#作り方-ai-と一緒に作る&quot; aria-label=&quot;Link to heading &#39;作り方: AI と一緒に作る&#39;&quot; data-heading-content=&quot;作り方: AI と一緒に作る&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;SabiRuby も rubevy も、ほとんどのコードは Claude Code（Anthropic の AI）が書いています。私の役割は、方針を決めること、計画を承認すること、結果を見て直しを頼むこと、そして公開するかを判断することです。&lt;/p&gt;
&lt;p&gt;VM のように、正しさを細かく確かめなければならないものを AI と作るうえで、効いたと思うやり方がいくつかあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;計画書を先に書く。&lt;/strong&gt; 段階ごとに「到達点」と「どう確かめるか」を決めてから、実装を任せます&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;作業の記録（worklog）を必ず残させる。&lt;/strong&gt; 何を試して、何を測って、何を捨てたか。後から同じ調査をやり直さないためです。ここに溜まった知見は、本の素材にもなっています&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本家で確かめる。&lt;/strong&gt; 振る舞いに迷ったら、本家の mruby を Docker で動かして比べます。推測で書かせません&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;決まり事を短く書いておく。&lt;/strong&gt; たとえば「根拠のない数を書かない（測るか、導く）」「VM の crate に &lt;code&gt;unsafe&lt;/code&gt; を入れない」&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能は測ってから言う。&lt;/strong&gt; 変更の前後を交互に何度も測ります。その前に、同じバイナリどうしのばらつきを測って、「遅くなった」とみなす線を決めておきます&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;うまくいかなかったこともあります。0.7.0 の前に、数 % の性能の差の原因を追いかけさせすぎて、測っては直す、を何巡も続けてしまいました。時間もトークンも有限です。「最初の目標を満たしたら一度止まって報告する」と決めておくことが、AI と長く作業するうえでいちばん大事な決まり事かもしれません。&lt;/p&gt;
&lt;p&gt;副産物として、作業の途中で見つけた本家 mruby の不具合について、PR を 3 本出し、マージしてもらいました。&lt;/p&gt;
&lt;h2 id=&quot;これから&quot;&gt;これから&lt;a href=&quot;#これから&quot; aria-label=&quot;Link to heading &#39;これから&#39;&quot; data-heading-content=&quot;これから&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;まずは本を仕上げて、11 月の技術書典で頒布します。本と一緒に使う移植キット（検証用のデータとテストの一式）も公開しています。SabiRuby と rubevy は、ゲームで Ruby を使いたい人、mruby を別の環境に持っていきたい人に触ってもらえるとうれしいです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本「Deep dive into mruby」: 11 月の技術書典で頒布予定&lt;/li&gt;
&lt;li&gt;移植キット: &lt;a href=&quot;https://github.com/kishima/mruby-porting-kit&quot;&gt;https://github.com/kishima/mruby-porting-kit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;SabiRuby: &lt;a href=&quot;https://github.com/sabiruby/sabiruby%EF%BC%88crates.io:&quot;&gt;&lt;a href=&quot;https://github.com/sabiruby/sabiruby&quot;&gt;https://github.com/sabiruby/sabiruby&lt;/a&gt;（crates.io:&lt;/a&gt; &lt;code&gt;sabiruby&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;rubevy: &lt;a href=&quot;https://github.com/sabiruby/rubevy%EF%BC%88crates.io:&quot;&gt;&lt;a href=&quot;https://github.com/sabiruby/rubevy&quot;&gt;https://github.com/sabiruby/rubevy&lt;/a&gt;（crates.io:&lt;/a&gt; &lt;code&gt;rubevy&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;Playground: &lt;a href=&quot;https://sabiruby.github.io/sabiruby-playground/&quot;&gt;https://sabiruby.github.io/sabiruby-playground/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
</entry>
<entry>
<title>RubyKaigi 2026 で登壇した話</title>
<id>https://blog.silentworlds.info/2026/04/rubykaigi-2026-dedeng-tan-sitekita/</id>
<link rel="alternate" type="text/html" href="https://blog.silentworlds.info/2026/04/rubykaigi-2026-dedeng-tan-sitekita/"/>
<published>2026-04-30T00:37:41+09:00</published>
<updated>2026-06-07T21:20:20+09:00</updated>
<summary>先週は、会社を休んでRubyKaigiに参加するため、函館に行ってきました。</summary>
<content type="html" xml:base="https://blog.silentworlds.info/2026/04/rubykaigi-2026-dedeng-tan-sitekita/">&lt;p&gt;&lt;img src=&quot;icon.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;先週は、会社を休んでRubyKaigiに参加するため、函館に行ってきました。&lt;/p&gt;
&lt;p&gt;この記事は登壇までの記録です。&lt;/p&gt;
&lt;h2 id=&quot;経緯&quot;&gt;経緯&lt;a href=&quot;#経緯&quot; aria-label=&quot;Link to heading &#39;経緯&#39;&quot; data-heading-content=&quot;経緯&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;もともとCFPが採択されたのは２回目で、１回目は2020年開催のRubyKaigiでした。ただちょうどCOVID-19の拡大の時期と被ってしまい、キャンセルされて、&lt;a href=&quot;https://rubykaigi.org/2020-takeout/&quot;&gt;RubyKaigi Takeout 2020&lt;/a&gt;として実施されました。&lt;/p&gt;
&lt;p&gt;以下はその時の資料です。&lt;/p&gt;
&lt;iframe src=&quot;https://www.slideshare.net/slideshow/embed_code/key/ybh5UIRr4ZsAWS&quot; width=&quot;510&quot; height=&quot;420&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border: var(--border-1) solid #CCC; border-width:1px; margin-bottom:5px; max-width:100%;&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.slideshare.net/slideshow/now-is-the-time-to-create-your-own-mruby-computer/238398245&quot;&gt;now-is-the-time-to-create-your-own-mruby-computer&lt;/a&gt;&lt;/strong&gt;from &lt;strong&gt;&lt;a href=&quot;https://www.slideshare.net/kishima7&quot;&gt;kishima7&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;楽しみにしていたので、当時は、大変意気消沈してしまいました。その後、仕事の方もCOVID-19の影響もあり、色々とどたばたして、転職したり、結婚したり、など趣味の時間を取れない時期が数年続きました。&lt;/p&gt;
&lt;p&gt;生活もやっと落ち着いてきた2025年から本格的に個人プロジェクトを再開させて、その成果が採択されて、今回発表させていただくことができました。&lt;/p&gt;
&lt;h2 id=&quot;事前準備&quot;&gt;事前準備&lt;a href=&quot;#事前準備&quot; aria-label=&quot;Link to heading &#39;事前準備&#39;&quot; data-heading-content=&quot;事前準備&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;本格的に開発に着手したのが2025年の10月ごろで、そこからまずはLinuxシミュレーション環境で開発進めて、基本形を12月までに作り、2026年1月のCFPに応募しました。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;demo4.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;CFP投稿時点のLinuxシミュレーション環境でのデモ&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;実機については、基板も並行して設計進めており、2025年11月に最初の基板を注文してます。CFP提出後、本格的に基板を使った開発に移行し、2026年2月末に基板の不具合を直した二次試作を発注し、3月末に本番向けの三次試作を発注しました。間に合うかどうか不安でしたがオプション積んだおかげか、１週間で基板が届き、それをつかって最後の調整ができました。&lt;/p&gt;
&lt;p&gt;OSとしてのベースができあがってきたおかげで、Claude Codeでのデモアプリの実相が捗りまくって、4月に入ってから、一気にかなり映える感じにできました。アプリを作るとまた問題点も浮かび上がってくるので、それをぎりぎりまで潰しつつ、移動の日を迎えました。&lt;/p&gt;
&lt;h2 id=&quot;day0&quot;&gt;Day0&lt;a href=&quot;#day0&quot; aria-label=&quot;Link to heading &#39;Day0&#39;&quot; data-heading-content=&quot;Day0&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;午前中少しだけ仕事としてから、新幹線での移動でした。前日にあった大きな地震の影響があるかもしれず心配でしたが、無事予定通り移動できました。移動中に資料の最後の仕上げをして完成させ、やんちゃハウス入り後、先入りしてたみなさんと軽く飲んで緊張しつつも気持ちよくその日を終えました。&lt;/p&gt;
&lt;h2 id=&quot;day1&quot;&gt;Day1&lt;a href=&quot;#day1&quot; aria-label=&quot;Link to heading &#39;Day1&#39;&quot; data-heading-content=&quot;Day1&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;発表当日です。&lt;/p&gt;
&lt;p&gt;はすみさんの発表を聞いて、すげーと思ったらすぐ通訳さんとの打ち合わせでした。初めてでしたが、こんな感じで意識合わせするのか、と新鮮な体験でした。資料が前日に修正しててごめんなさい。&lt;/p&gt;
&lt;p&gt;私の発表は午後からだったので事前に接続確認してたのですが、基板の映像がでなくてかなり焦りましたが、結局ケーブルの接続ミスでした・・・。&lt;/p&gt;
&lt;img src=&quot;image-1.png&quot; alt=&quot;&quot; width=&quot;388&quot;&gt;
&lt;p&gt;&lt;em&gt;あわてて会場の外で動作確認中の様子&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;直前のhadashiAさんの発表も何とか聞けました。落ち着いて資料見返したいです。&lt;/p&gt;
&lt;h3 id=&quot;本番&quot;&gt;本番&lt;a href=&quot;#本番&quot; aria-label=&quot;Link to heading &#39;本番&#39;&quot; data-heading-content=&quot;本番&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://rubykaigi.org/2026/presentations/kishima.html&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;PicoRuby as a Multi-VM Operating System&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;RubyKaigi 2026, #rubykaigi&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;RubyKaigi&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-82bbf777.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;p&gt;&lt;img src=&quot;RubyKaigi2026.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;@Kirika_K2 さんにとって頂いた写真&lt;/em&gt;&lt;/p&gt;
&lt;iframe id=&quot;talk_frame_1532610&quot; class=&quot;speakerdeck-iframe&quot; src=&quot;https://speakerdeck.com/player/6626f6126a464ec4b3937ff25c00f79d&quot; width=&quot;710&quot; height=&quot;502&quot; style=&quot;aspect-ratio:710/502; border:0; padding:0; margin:0; background:transparent;&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;em&gt;本番のスライド&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;最新のデモ動画&lt;/p&gt;
&lt;figure class=&quot;embed-youtube&quot;&gt;
&lt;a class=&quot;embed-youtube-link&quot; href=&quot;https://www.youtube.com/watch?v=9vkRaOoxJJI&quot; data-video-id=&quot;9vkRaOoxJJI&quot; aria-label=&quot;Family mruby OS 0.1.0 Demo movie (YouTube で再生)&quot;&gt;&lt;img src=&quot;_card-032be411.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;span class=&quot;embed-youtube-play&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
&lt;figcaption&gt;Family mruby OS 0.1.0 Demo movie&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;最新のデモ動画&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;ちゃんと説明できてなかったですが、以下はGUIのアプリを作るだけでなく、I2CやLEDマトリクスをつないで制御するRubyアプリも作れます、というデモです。２VM間のpub/sub型のメッセージ通信もしている、というデモも兼ねています。&lt;/p&gt;
&lt;p&gt;ここからCLIだけでは思いつかなかった楽しみ方が生まれるのではないかと思ってます。&lt;/p&gt;
&lt;figure class=&quot;embed-youtube&quot;&gt;
&lt;a class=&quot;embed-youtube-link&quot; href=&quot;https://www.youtube.com/watch?v=08XT5BTwYB8&quot; data-video-id=&quot;08XT5BTwYB8&quot; aria-label=&quot;Family mruby LED Matrix and I2C keyboard (YouTube で再生)&quot;&gt;&lt;img src=&quot;_card-137c7683.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;span class=&quot;embed-youtube-play&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
&lt;figcaption&gt;Family mruby LED Matrix and I2C keyboard&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;I2Cキーボードと、LEDマトリクスをGUI Rubyアプリｘ２で制御するデモ&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;概要は、資料や動画のほかに、過去のブログ記事にも詳しく書いてます。&lt;/p&gt;
&lt;p&gt;/2025/12/family-mruby-os-freertosbesunomicrorubymarutivmgou-xiang/&lt;/p&gt;
&lt;p&gt;冒頭でのデモの内容飛ばしたりしましたが、おおむね時間内に予定してた内容を話すことができました。&lt;/p&gt;
&lt;p&gt;前提の説明をそこそこに、主要なトピックを駆け足でめぐる内容で、デモにも長めに時間を割いたので、ちょっと何しているか分かりにくい発表だったなあ、というのは反省点です。後のharukasanの発表を見て思いました。&lt;/p&gt;
&lt;p&gt;欲張りでしたが、デモだけでも見て、なんかPicoRubyで面白いことやってるなー、という雰囲気だけでも持って帰ってもらえれたら嬉しいなと思ってます。&lt;/p&gt;
&lt;p&gt;やったことが多すぎて、説明しきることが困難なので、詳細はブログの記事か、同人誌か、でまとめられたらなと思ってます。&lt;/p&gt;
&lt;p&gt;あと、発表を応援しに来てくださった皆様もありがとうございました！こんなに応援してもらいながら発表できるとは2020年には思ってもみなかったことなので、とてもうれしかったです。&lt;/p&gt;
&lt;h3 id=&quot;harukasanさんの発表&quot;&gt;harukasan(さん)の発表&lt;a href=&quot;#harukasanさんの発表&quot; aria-label=&quot;Link to heading &#39;harukasan(さん)の発表&#39;&quot; data-heading-content=&quot;harukasan(さん)の発表&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://rubykaigi.org/2026/presentations/harukasan.html&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;Building a Standalone Ruby Programming Environment&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;RubyKaigi 2026, #rubykaigi&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;RubyKaigi&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-9a1c2065.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;p&gt;PicoPicoRubyのDiscordでなんとなくやられていることは、見てましたが、気が付いたら私とかなりやってることのゴールが近くて驚きました。（PicoRubyで独立した開発環境を備えたミニPCをハードから作る）&lt;/p&gt;
&lt;p&gt;おなじRubyKaigiでこのニッチなテーマで並んで発表できたことは、PicoRubyの応用のすそ野の広さと、同じテーマでもいろいろなアプローチ手法がある、ということをお見せすることができて、とても有意義だったのではないかな、と勝手に思ってます。&lt;/p&gt;
&lt;p&gt;私も大いに刺激を受けたので、今後の開発にも生かしていきたいです。Harucom 基板も買えました。 （仕事もお忙しいはずなのに、基板を量産してRubyKaigi本番で売るまでもっていくのは超人過ぎる・・・）&lt;/p&gt;
&lt;p&gt;以降のことは、長くなりそうなので、忘れないうちに別記事にまとめたいと思います。&lt;/p&gt;
&lt;h2 id=&quot;謝辞&quot;&gt;謝辞&lt;a href=&quot;#謝辞&quot; aria-label=&quot;Link to heading &#39;謝辞&#39;&quot; data-heading-content=&quot;謝辞&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;2025年にモチベーション高く活動を続けることができたのはPicoPicoRubyやそのDiscordでPicoRubyやってる同士のみなさんと触れ合えたおかげだと思っています。主催の @makicamel さん @youchan さんをはじめとしたコミュニティの皆さんには感謝でいっぱいです。&lt;/p&gt;
&lt;p&gt;私の活動は完全に趣味でやっているので、仕事の外でも活動してる仲間が居る、という事実に大変勇気づけられました。これは2019年ごろの状況とは大きく違う点です。&lt;/p&gt;
&lt;p&gt;また、Omotesando.rbでも時々LTさせて頂いて、アウトプットの場を頂けて大変感謝しております。&lt;/p&gt;
&lt;h2 id=&quot;追伸基板も販売してます&quot;&gt;追伸：基板も販売してます。&lt;a href=&quot;#追伸基板も販売してます&quot; aria-label=&quot;Link to heading &#39;追伸：基板も販売してます。&#39;&quot; data-heading-content=&quot;追伸：基板も販売してます。&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://silentworlds.booth.pm/items/8128031&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;Family mruby Narya 基板 (v3 prod r1) - Kishima Craft Works - BOOTH&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;# 注意 2026/5/27までに受け付けた注文については、2026年5月中に発送予定です。 # Narya基板（v3 Prod R1） ESP32上で動作するPicoRubyベースOS「Family mruby」に対応した検証用基板です。 PicoRubyをベースに、マイコン単体でGUIアプリケーションの開発・実行が可能です。 デモ動画： https://www.youtube.com/watch?v=9vkRaOoxJJI ディスプレイ出力・入力デバイス・音源制御を統合し、Rubyコードで直接制御できます。&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;silentworlds.booth.pm&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-8869f36b.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
</content>
</entry>
<entry>
<title>2025年の振り返りと2026年の抱負</title>
<id>https://blog.silentworlds.info/2026/01/2025nian-nozhen-rifan-rito2026nian-nobao-fu2/</id>
<link rel="alternate" type="text/html" href="https://blog.silentworlds.info/2026/01/2025nian-nozhen-rifan-rito2026nian-nobao-fu2/"/>
<published>2026-01-01T21:11:23+09:00</published>
<updated>2026-05-09T12:30:56+09:00</updated>
<category term="Tech"/>
<category term="News"/>
<summary>明けましておめでとうございます。今年も無事新年を迎えられてありがたい限りです。</summary>
<content type="html" xml:base="https://blog.silentworlds.info/2026/01/2025nian-nozhen-rifan-rito2026nian-nobao-fu2/">&lt;p&gt;&lt;img src=&quot;https://images.unsplash.com/photo-1546074177-31bfa593f731?crop=entropy&amp;amp;cs=tinysrgb&amp;amp;fit=max&amp;amp;fm=jpg&amp;amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDgwfHxuZXclMjB5ZWFyfGVufDB8fHx8MTc2NzI2OTYxM3ww&amp;amp;ixlib=rb-4.1.0&amp;amp;q=80&amp;amp;w=2000&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;明けましておめでとうございます。今年も無事新年を迎えられてありがたい限りです。&lt;/p&gt;
&lt;p&gt;昨年は色々対外的な活動も増やしたり、自分の趣味プロジェクトも新しく始めたりしたので、活発な一年だったと思います。&lt;/p&gt;
&lt;p&gt;今年は仕事始めて２０周年でもありますし、色々頑張り時な年だと思うので、抱負と合わせて、昨年の振り返りを残しておきたいと思います。&lt;/p&gt;
&lt;h2 id=&quot;2025年振り返り&quot;&gt;2025年振り返り&lt;a href=&quot;#2025年振り返り&quot; aria-label=&quot;Link to heading &#39;2025年振り返り&#39;&quot; data-heading-content=&quot;2025年振り返り&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;2025年は、４月までは仕事のほうがかなり忙しく、日々仕事で忙殺される日々でした。&lt;/p&gt;
&lt;h3 id=&quot;22-tokyurb新年会2025&quot;&gt;2/2 &lt;a href=&quot;https://tokyurb.doorkeeper.jp/events/181568&quot;&gt;Tokyu.rb新年会2025&lt;/a&gt;&lt;a href=&quot;#22-tokyurb新年会2025&quot; aria-label=&quot;Link to heading &#39;2/2 Tokyu.rb新年会2025&#39;&quot; data-heading-content=&quot;2/2 Tokyu.rb新年会2025&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;まだ忙しい季時期でしたが、地方出張前に荷物抱えて参加した記憶があります。&lt;/p&gt;
&lt;p&gt;Tokyu.rbは、みんなで美味しいもの（主に肉）をいただく集まりなのですが、そこで関西Ruby会議のことを聞いたことが、この後の動きの伏線になりました。&lt;/p&gt;
&lt;p&gt;５月になって仕事が落ち着いてきたので、一念発起して久しぶりに地域Ruby会議へのプロポーザルを送ったのでした。&lt;/p&gt;
&lt;h3 id=&quot;526picopicoruby-1&quot;&gt;5/26&lt;a href=&quot;https://picopicoruby.connpass.com/event/355869/&quot;&gt;PicoPicoRuby #1&lt;/a&gt;&lt;a href=&quot;#526picopicoruby-1&quot; aria-label=&quot;Link to heading &#39;5/26PicoPicoRuby #1&#39;&quot; data-heading-content=&quot;5/26PicoPicoRuby #1&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;待望のmruby関連の勉強会！ということでウキウキで参加しました。&lt;/p&gt;
&lt;p&gt;以降も月イチで安定して開催されており、私の活動のモチベーションの源のひとつとなってます。&lt;/p&gt;
&lt;h3 id=&quot;528-shinjukurb-99&quot;&gt;5/28 &lt;a href=&quot;https://shinjukurb.connpass.com/event/354627/&quot;&gt;Shinjuku.rb #99&lt;/a&gt;&lt;a href=&quot;#528-shinjukurb-99&quot; aria-label=&quot;Link to heading &#39;5/28 Shinjuku.rb #99&#39;&quot; data-heading-content=&quot;5/28 Shinjuku.rb #99&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;自由な時間が取れるようになってきたのは５月くらいからでした。そんな中でKaigiEffectネタで募集があったので、参加してみました。&lt;/p&gt;
&lt;iframe id=&quot;talk_frame_1376100&quot; class=&quot;speakerdeck-iframe&quot; src=&quot;//speakerdeck.com/player/0db54250baff4065bfe255eabf21184d&quot; width=&quot;710&quot; height=&quot;399&quot; style=&quot;aspect-ratio:710/399; border:0; padding:0; margin:0; background:transparent;&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;この時点で、関西Ruby会議08での採択通知が届いており、気合を入れて、準備を進めていました。&lt;/p&gt;
&lt;h3 id=&quot;628-関西ruby会議08&quot;&gt;6/28 &lt;a href=&quot;https://regional.rubykaigi.org/kansai08/&quot;&gt;関西Ruby会議08&lt;/a&gt;&lt;a href=&quot;#628-関西ruby会議08&quot; aria-label=&quot;Link to heading &#39;6/28 関西Ruby会議08&#39;&quot; data-heading-content=&quot;6/28 関西Ruby会議08&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;京都で発表してきました。とても素敵なイベントで、アフターイベントや夜通し鴨川で語ったり、記憶に残りました。&lt;/p&gt;
&lt;p&gt;やはり来年のRubyKaigiは行きたいなあ、と思ったのもここが起点でした。&lt;/p&gt;
&lt;p&gt;詳しいレポートは &lt;a href=&quot;/2025/07/guan-xi-rubyhui-yi-08defa-biao-sitekimasita/&quot;&gt;こちら&lt;/a&gt;参照。&lt;/p&gt;
&lt;iframe id=&quot;talk_frame_1391097&quot; class=&quot;speakerdeck-iframe&quot; src=&quot;//speakerdeck.com/player/e6d165b646fc4d3f8b861fda94e6484f&quot; width=&quot;710&quot; height=&quot;399&quot; style=&quot;aspect-ratio:710/399; border:0; padding:0; margin:0; background:transparent;&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt;&lt;/iframe&gt;
&lt;h3 id=&quot;719-picoruby-overflow会議&quot;&gt;7/19 &lt;a href=&quot;https://naniwarb.github.io/picorubyoverflowkaigi/&quot;&gt;PicoRuby Overflow会議&lt;/a&gt;&lt;a href=&quot;#719-picoruby-overflow会議&quot; aria-label=&quot;Link to heading &#39;7/19 PicoRuby Overflow会議&#39;&quot; data-heading-content=&quot;7/19 PicoRuby Overflow会議&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;PicoPicoRubyでお誘い頂いこともあり、応募して、ポスターセッション形式で発表してきました。大阪日本橋ではんだ付けしたりもできて、地域をまたいでmrubyの輪が広がっていることを感じられて良かったです。&lt;/p&gt;
&lt;iframe id=&quot;talk_frame_1410454&quot; class=&quot;speakerdeck-iframe&quot; src=&quot;//speakerdeck.com/player/40df232090f545f5937f82d364e041bb&quot; width=&quot;710&quot; height=&quot;502&quot; style=&quot;aspect-ratio:710/502; border:0; padding:0; margin:0; background:transparent;&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;このあたりから、Family mrubyの方のアイデアも固まってきました。&lt;/p&gt;
&lt;h3 id=&quot;828-ruby-association-activity-report&quot;&gt;8/28 &lt;a href=&quot;https://www.ruby.or.jp/ja/news/20250602&quot;&gt;Ruby Association Activity Report&lt;/a&gt;&lt;a href=&quot;#828-ruby-association-activity-report&quot; aria-label=&quot;Link to heading &#39;8/28 Ruby Association Activity Report&#39;&quot; data-heading-content=&quot;8/28 Ruby Association Activity Report&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Family mrubyで使いたい部品である、ファミコン音源をマイコンで鳴らすことをテーマに、LTしてきました。&lt;/p&gt;
&lt;p&gt;Claude Codeにがっつり課金して使うようになってきたのはこのあたりからですね。&lt;/p&gt;
&lt;iframe id=&quot;talk_frame_1430532&quot; class=&quot;speakerdeck-iframe&quot; src=&quot;//speakerdeck.com/player/6cda1ddc1cc448f09d33b363a01a812e&quot; width=&quot;710&quot; height=&quot;399&quot; style=&quot;aspect-ratio:710/399; border:0; padding:0; margin:0; background:transparent;&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt;&lt;/iframe&gt;
&lt;h3 id=&quot;94-omotesandorb-113&quot;&gt;9/4 &lt;a href=&quot;https://omotesandorb.connpass.com/event/366283/&quot;&gt;Omotesando.rb #113&lt;/a&gt;&lt;a href=&quot;#94-omotesandorb-113&quot; aria-label=&quot;Link to heading &#39;9/4 Omotesando.rb #113&#39;&quot; data-heading-content=&quot;9/4 Omotesando.rb #113&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;activity reportでのLTでは、デモを失敗してしまったので、リベンジしてきました。ついでにMIDI連携の基礎も確認できました。&lt;/p&gt;
&lt;iframe id=&quot;talk_frame_1433835&quot; class=&quot;speakerdeck-iframe&quot; src=&quot;//speakerdeck.com/player/0a28b838144f4bc495f4a57572b39e54&quot; width=&quot;710&quot; height=&quot;399&quot; style=&quot;aspect-ratio:710/399; border:0; padding:0; margin:0; background:transparent;&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;このあたりから、仕事の方でも開発、インテグレーション業務に加えて、本格的にマネージャー業の重みも増えてきた時期でした。&lt;/p&gt;
&lt;h3 id=&quot;99-rosconjp2025&quot;&gt;9/9 &lt;a href=&quot;https://roscon.jp/&quot;&gt;ROSConJP2025&lt;/a&gt;&lt;a href=&quot;#99-rosconjp2025&quot; aria-label=&quot;Link to heading &#39;9/9 ROSConJP2025&#39;&quot; data-heading-content=&quot;9/9 ROSConJP2025&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;残念ながらプロポーザルは通らかなかったので、一般参加でした。ここで得た繋がりで仕事関係でも関係が増えたりして、行った甲斐ありました。&lt;/p&gt;
&lt;p&gt;関西RubyKaigiの内容をベースに、LTも準備してたのですが、抽選の結果、残念ながら時間内の発表枠はもらえませんでした。&lt;/p&gt;
&lt;iframe id=&quot;talk_frame_1435445&quot; class=&quot;speakerdeck-iframe&quot; src=&quot;//speakerdeck.com/player/8a3f18eefd5f4d4cb4a54a520c60222a&quot; width=&quot;710&quot; height=&quot;399&quot; style=&quot;aspect-ratio:710/399; border:0; padding:0; margin:0; background:transparent;&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt;&lt;/iframe&gt;
&lt;h3 id=&quot;family-mruby開発&quot;&gt;Family mruby開発&lt;a href=&quot;#family-mruby開発&quot; aria-label=&quot;Link to heading &#39;Family mruby開発&#39;&quot; data-heading-content=&quot;Family mruby開発&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ROSConJPも終わったことで、イベントは一区切りついたので、本格的にFamily mrubyプロジェクトの開発に取り掛かりました。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://github.com/family-mruby/family-mruby&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;GitHub - family-mruby/family-mruby: A development platform that enables mruby development and execution directly on microcontrollers. It features audio and graphics capabilities and is designed to run on ESP32.&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;A development platform that enables mruby development and execution directly on microcontrollers. It features audio and graphics capabilities and is designed to run on ESP32. - family-mruby/family-...&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;GitHub&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;p&gt;久しぶりにKiCADを開いて、基板の設計もしました。そしてJLCPCBでPCBAの発注も行いました。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;1129-tokyuruby会議16&quot;&gt;11/29 &lt;a href=&quot;https://tokyurubykaigi.github.io/tokyu16/&quot;&gt;TokyuRuby会議16&lt;/a&gt;&lt;a href=&quot;#1129-tokyuruby会議16&quot; aria-label=&quot;Link to heading &#39;11/29 TokyuRuby会議16&#39;&quot; data-heading-content=&quot;11/29 TokyuRuby会議16&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;これまではずっとスタッフ参加でしたが、この回は、LTをしたり飯を持ち込んだりして、一般参加を満喫できました。&lt;/p&gt;
&lt;iframe id=&quot;talk_frame_1472590&quot; class=&quot;speakerdeck-iframe&quot; src=&quot;//speakerdeck.com/player/f38a3cbf4ff045bd9423bb4efd9265fa&quot; width=&quot;710&quot; height=&quot;399&quot; style=&quot;aspect-ratio:710/399; border:0; padding:0; margin:0; background:transparent;&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;そして飯王の称号をいただきました。これも夢だったので嬉しかった。&lt;/p&gt;
&lt;p&gt;/2025/11/tikintomatozhu-torebapesutonoresipinoji-yi-2/&lt;/p&gt;
&lt;h3 id=&quot;124-omotesandorb-116&quot;&gt;12/4 &lt;a href=&quot;https://omotesandorb.connpass.com/event/376018/&quot;&gt;Omotesando.rb #116&lt;/a&gt;&lt;a href=&quot;#124-omotesandorb-116&quot; aria-label=&quot;Link to heading &#39;12/4 Omotesando.rb #116&#39;&quot; data-heading-content=&quot;12/4 Omotesando.rb #116&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;movさん開催ということで、オフィス遊びに行ってみたかったので、LTもって参加してきました。&lt;/p&gt;
&lt;p&gt;ニーズが根強いM5Unified for PicoRubyについて発表してきました。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://github.com/kishima/picoruby-m5unified&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;GitHub - kishima/picoruby-m5unified&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;Contribute to kishima/picoruby-m5unified development by creating an account on GitHub.&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;GitHub&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-13536849.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;iframe id=&quot;talk_frame_1472590&quot; class=&quot;speakerdeck-iframe&quot; src=&quot;//speakerdeck.com/player/f38a3cbf4ff045bd9423bb4efd9265fa&quot; width=&quot;710&quot; height=&quot;399&quot; style=&quot;aspect-ratio:710/399; border:0; padding:0; margin:0; background:transparent;&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt;&lt;/iframe&gt;
&lt;h3 id=&quot;1219-shinjukurb-101&quot;&gt;12/19 &lt;a href=&quot;/2025/12/dian-zi-gong-zuo-bian-li-wotadoru-2/&quot;&gt;Shinjuku.rb #101&lt;/a&gt;&lt;a href=&quot;#1219-shinjukurb-101&quot; aria-label=&quot;Link to heading &#39;12/19 Shinjuku.rb #101&#39;&quot; data-heading-content=&quot;12/19 Shinjuku.rb #101&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;資料は載せられないですが、技術的というよりは、仕事の体験談やそこからの学び、的な話をしました。&lt;/p&gt;
&lt;h3 id=&quot;picorubyへのコントリビュート&quot;&gt;PicoRubyへのコントリビュート&lt;a href=&quot;#picorubyへのコントリビュート&quot; aria-label=&quot;Link to heading &#39;PicoRubyへのコントリビュート&#39;&quot; data-heading-content=&quot;PicoRubyへのコントリビュート&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;R2P2-ESP32向けにファイル転送機能を追加する提案中です。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://github.com/picoruby/R2P2-ESP32/issues/64&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;Add USB-Serial-based file transfer feature for ESP32 environment · Issue #64 · picoruby/R2P2-ESP32&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;Unlike the Raspberry Pi Pico version, the ESP32 version of R2P2 does not currently support MSC (Mass Storage Class). As a result, users must rebuild and flash the firmware every time they update th...&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;GitHub&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;h2 id=&quot;2026年の抱負&quot;&gt;2026年の抱負&lt;a href=&quot;#2026年の抱負&quot; aria-label=&quot;Link to heading &#39;2026年の抱負&#39;&quot; data-heading-content=&quot;2026年の抱負&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;仕事も忙しくなりそうなので、どこまでできるか未知数ですが、日々体力も頭のキレも鈍くなってるのだから、あとは効率をよくせんといかんです。&lt;/p&gt;
&lt;h3 id=&quot;趣味のプロジェクト&quot;&gt;趣味のプロジェクト&lt;a href=&quot;#趣味のプロジェクト&quot; aria-label=&quot;Link to heading &#39;趣味のプロジェクト&#39;&quot; data-heading-content=&quot;趣味のプロジェクト&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Family mrubyを実際に自作基板にのせて配布できるレベルまで仕上げていきたいです。&lt;/p&gt;
&lt;p&gt;派生や発展させたいユースケースもたくさんアイデアあるので、早く基盤を固めて、そういうアプリケーション作りを楽しめるところまで行きたい。&lt;/p&gt;
&lt;h3 id=&quot;発表&quot;&gt;発表&lt;a href=&quot;#発表&quot; aria-label=&quot;Link to heading &#39;発表&#39;&quot; data-heading-content=&quot;発表&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;今CFPオープン中の、RubyKaigi2026で発表したい！と思って準備してます。&lt;/p&gt;
&lt;p&gt;その他にも関西の方の地域Ruby会議も面白そうなので、CFPトライしようかどうか、悩み中・・・　&lt;/p&gt;
&lt;h3 id=&quot;料理&quot;&gt;料理&lt;a href=&quot;#料理&quot; aria-label=&quot;Link to heading &#39;料理&#39;&quot; data-heading-content=&quot;料理&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;昨年、やれなかった自作クラフトビール体験もやってみたい。問題はどうやって消費するか・・・。&lt;/p&gt;
&lt;p&gt;製麺も加水率高めの麺はまた再開してみたい。生パスタもいいかもしれない。&lt;/p&gt;
&lt;p&gt;仲間内で振る舞う会ともいつかできたらいいなと思ったりしてます。&lt;/p&gt;
&lt;h3 id=&quot;旅&quot;&gt;旅&lt;a href=&quot;#旅&quot; aria-label=&quot;Link to heading &#39;旅&#39;&quot; data-heading-content=&quot;旅&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;円安物価高だし、時間的にも2026年中は、難しいかもですが、海外もまた旅行してみたいですね。欧州の行ったこと無い地域いってみたい。&lt;/p&gt;
&lt;p&gt;キャンプやりたい。キャンプベアードは行きたい。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://bairdbeer.com/ja/pages/camp-baird&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;キャンプベアード&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;キャンプ・ベアードへようこそキャンプベアードは日本のクラフトブルワリーの老舗、ベアードブルーイングが経営するキャンプ場です。ここは、ビール愛に負けないくらいの情熱で自然を愛するベアードブルーイングの従業員チームにより運営されています。個性あふれるベアードビールを楽しみながら、修善寺の素晴らしい自然を存分に満喫してください。伊豆半島の豊かな自然に囲まれ、美しい狩野川とベアードビールの工場の間にキャンプ場は位置しています。狩野川のほとり、木立が整然と並ぶフリーテントサイト(24サイト)・キャンピングカーサイト(2サイト)、オートキャンプサイト(11サイト)・キャビン(3棟)にトレーラーハウス(1棟)、そして2024年8月からは車中泊サイ&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;Baird Beer&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-135db7a4.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;h3 id=&quot;運動&quot;&gt;運動&lt;a href=&quot;#運動&quot; aria-label=&quot;Link to heading &#39;運動&#39;&quot; data-heading-content=&quot;運動&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;仕事と、趣味の開発に集中する結果、運動する時間が犠牲になっているので、なんとかしたいんですが、自分のタスク管理にブレイクスルーが必要・・・。&lt;/p&gt;
&lt;h3 id=&quot;仕事&quot;&gt;仕事&lt;a href=&quot;#仕事&quot; aria-label=&quot;Link to heading &#39;仕事&#39;&quot; data-heading-content=&quot;仕事&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;あまり詳しくは欠けないですが、新しい取り組みが始まり、立場上、自分への期待も大きいと理解してます。視野を広く、事業に貢献できるような動きをしていきたいな、と思ってます。&lt;/p&gt;
</content>
</entry>
<entry>
<title>電子工作遍歴をたどる（２）</title>
<id>https://blog.silentworlds.info/2025/12/dian-zi-gong-zuo-bian-li-wotadoru-2/</id>
<link rel="alternate" type="text/html" href="https://blog.silentworlds.info/2025/12/dian-zi-gong-zuo-bian-li-wotadoru-2/"/>
<published>2025-12-30T21:45:44+09:00</published>
<updated>2026-05-09T12:31:00+09:00</updated>
<category term="Tech"/>
<summary>前回の話のつづきです。</summary>
<content type="html" xml:base="https://blog.silentworlds.info/2025/12/dian-zi-gong-zuo-bian-li-wotadoru-2/">&lt;p&gt;&lt;img src=&quot;IMG_0819-1.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/2025/07/dian-zi-gong-zuo-bian-li-wotadoru-1/&quot;&gt;前回の話&lt;/a&gt;のつづきです。&lt;/p&gt;
&lt;h2 id=&quot;作例５-ラズパイとgroveによる音楽プレーヤ&quot;&gt;作例５ ラズパイとGroveによる音楽プレーヤ&lt;a href=&quot;#作例５-ラズパイとgroveによる音楽プレーヤ&quot; aria-label=&quot;Link to heading &#39;作例５ ラズパイとGroveによる音楽プレーヤ&#39;&quot; data-heading-content=&quot;作例５ ラズパイとGroveによる音楽プレーヤ&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;2017/08ごろ&lt;/p&gt;
&lt;p&gt;ラズパイで遊び始めて、そろそろ単なるミニPCとしてではなく、いろいろ電子工作っぽいことをやってみたくなってきました。&lt;/p&gt;
&lt;p&gt;そのころSeeedの&lt;a href=&quot;https://wiki.seeedstudio.com/ja/Grove_System/&quot;&gt;Grove&lt;/a&gt;というものを知って、これなら初心者でも色々電子デバイス試せる！となって色々買ってきて作ったのがこちらです。&lt;/p&gt;
&lt;p&gt;/2018/04/a-first-step-to-raspberry-pi-project/&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://github.com/kishima/RaspiMusicServer&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;GitHub - kishima/RaspiMusicServer: An music server on Raspberry pi and Arduino&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;An music server on Raspberry pi and Arduino. Contribute to kishima/RaspiMusicServer development by creating an account on GitHub.&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;GitHub&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;figure class=&quot;embed-youtube&quot;&gt;
&lt;a class=&quot;embed-youtube-link&quot; href=&quot;https://www.youtube.com/watch?v=xel442RrTm4&quot; data-video-id=&quot;xel442RrTm4&quot; aria-label=&quot;RaspiMusicServer demo (YouTube で再生)&quot;&gt;&lt;img src=&quot;_card-cda0de06.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;span class=&quot;embed-youtube-play&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
&lt;figcaption&gt;RaspiMusicServer demo&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;ラズパイをプラスチック箱に入れて、テキストディスプレイに情報表示しつつ、ジェスチャセンサやスライドバー、ジョイスティックなどで制御してます。&lt;/p&gt;
&lt;p&gt;ラズパイのシャットダウン電源制御も外部のArduinoから行うようにして、独立したデバイスとして使えるようにしました。&lt;/p&gt;
&lt;p&gt;この開発で、いろいろなセンサーやデバイスの使い方や、マイコン間の連携など、今後のオリジナルデバイス開発の基礎をここで勉強できたと思います。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_0553.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;箱に入れる前の様子&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;作例６gameboy-zero&quot;&gt;作例６　GameBoy Zero&lt;a href=&quot;#作例６gameboy-zero&quot; aria-label=&quot;Link to heading &#39;作例６　GameBoy Zero&#39;&quot; data-heading-content=&quot;作例６　GameBoy Zero&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;この作品は電子工作のスキルを一段引き上げてくれたものなので、印象深いですね。&lt;/p&gt;
&lt;p&gt;2017/11 ごろ&lt;/p&gt;
&lt;p&gt;もともとレトロゲーム好きで、いろいろ電子工作の情報をあさっていたら、&lt;a href=&quot;https://www.youtube.com/watch?v=0sd4KbB8Odg&quot;&gt;mintyPi&lt;/a&gt;など見かけて、いいなあ、自分も作ってみたいなあと思っていました。&lt;/p&gt;
&lt;p&gt;そんな中、ラズパイゼロを使って、ゲームボーイの中身を置き換えて、ラズパイマシンに改造するプロジェクトを知りました。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://gigazine.net/news/20160408-game-boy-zero/#google_vignette&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;ゲームボーイにRaspberry Piをぶち込んでスーファミタイトルなどゲーム三昧な魔改造を施した「Game Boy Zero」&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;単3電池を詰め込んで、小さなモノクロ画面でどこでも任天堂のゲームを楽しめるようになった「ゲームボーイ」は、いまではレトロに思えるデザインのせいか今でもゲーム愛好家に大人気の存在です。そんなゲームボーイにシングルボードコンピューター「Raspberry Pi Zero」をぶち込んで、ゲームボーイだけでなくスーパーファミコンなどさまざまなプラットフォームのゲームタイトルをプレイできる様に改造した「Game Boy Zero」を作り上げた強者が登場しています。&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;GIGAZINE&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-15ad87da.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;p&gt;実際に参考にした情報が何だったのかは、思い出せなかったのですが、当時は何かのYouTubeの動画を参考してました。&lt;/p&gt;
&lt;p&gt;細かい設計図などはなかったので、動画を見つつ、必要な部品を整理して注文して、配線を考えたりしました。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_0792.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;手書きの設計図&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;まずは中古でジャンクのゲームボーイを買って、分解して、洗浄します。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_0742.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;img src=&quot;IMG_0731.JPG&quot; alt=&quot;&quot; width=&quot;540&quot;&gt;
&lt;p&gt;&lt;img src=&quot;IMG_0778.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;下の部分だけ再利用する&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;基板をカットします。&lt;/p&gt;
&lt;p&gt;ここで&lt;a href=&quot;https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%AF%E3%82%BD%E3%83%B3-PROXXON-%E3%83%9F%E3%83%8B%E3%83%AB%E3%83%BC%E3%82%BF%E3%83%BC-%E5%9B%9E%E8%BB%A2%E6%95%B0%E3%81%8C%E8%AA%BF%E7%AF%80%E5%8F%AF%E8%83%BD-No-28525/dp/B001LF3OJC/ref=sr_1_8?dib=eyJ2IjoiMSJ9.eiGbhyOh_47FOFyJPUZLDsDBzaYtxPUIv6gJbGx42O4KMNUQqa8Nwvtvdbp2xfUbPQfyoPnsZ3i2H5HXTOUaGLx4dr0wdA-UVcYyo6FyRkXegL7ISG_K-ugVI2ogO1iHd-7WklvtgoTSHK5L-N2Rf2bgwc_XR78nmxN0aWO-Qc5DjQC5us3jseCVWm3erUd7ClpSRWyQrP-NSWoO8vqPmhtMG55g6weFregTmFb6s6N3ZYw4iKxUxMMf1B2O_-gNMpkfZ8HU_E058cJDc9CNmvwXOemnYy_71ksvoe60buk.3NbScBfpeX9Q_jKh27luKBa5IhbXzsOsdu15AZs-8To&amp;amp;dib_tag=se&amp;amp;keywords=%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%BC&amp;amp;qid=1767097115&amp;amp;sr=8-8&amp;amp;ufe=app_do%3Aamzn1.fos.f851e75d-a860-4774-84a1-525c65264f29&amp;amp;th=1&quot;&gt;リューター&lt;/a&gt;というものを買って使いました。こういうものを切るときは砥石を使うことも新しい知識でした。&lt;/p&gt;
&lt;p&gt;液晶のサイズを大きくするために、枠をカットして、ボタンを増やすために、穴開けたりもしました。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_0760.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_0779.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;別のコントローラから剥がしてきたボタンガイドを増設&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_0794.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;ボタンの接点のために、元基板の一部を利用&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_0795.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;パターンから信号を取る&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_0799.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;銅箔テープで接点を作ったり&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;銅箔テープの使い方を知ったり。グルーガンで配線固定したり。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_0767.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;ラズパイゼロと液晶を取り付けた図&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;LiPoバッテリーも初めて使いました。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_0789.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;USB Auidoのパーツを分解してつかったり、右下は充放電管理だったような&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_0813.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;これをケースに詰めます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_0819.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;正面&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_0821-1.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;背面。バッテリーを入れた様子。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_0823.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;背面。ソフトのカバーを被せてなるべく基板が見えないように&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;参考にした動画より液晶のコネクタの高さが高かったようで、ケースとラズパイが干渉して、背面を少し削ることに。&lt;/p&gt;
&lt;p&gt;かなり時間かかりましたが無事、動いたときは感動でしたね。&lt;/p&gt;
&lt;p&gt;この作品では、細かいはんだ付け作業や、プラスチックの加工や、LiPoバッテリーを使ったり、かなり本格的な電子工作でした。&lt;/p&gt;
&lt;p&gt;これをやり切れたことで、自信がついて、以降の工作へのモチベーションもあがっていったと記憶してます。&lt;/p&gt;
&lt;p&gt;少し背伸びしたトライも大切ですね。&lt;/p&gt;
</content>
</entry>
<entry>
<title>Family mruby OS: A Multi-VM MicroRuby System Built on FreeRTOS</title>
<id>https://blog.silentworlds.info/2025/12/family-mruby-os-freertosbesunomicrorubymarutivmgou-xiang-2/</id>
<link rel="alternate" type="text/html" href="https://blog.silentworlds.info/2025/12/family-mruby-os-freertosbesunomicrorubymarutivmgou-xiang-2/"/>
<published>2025-12-26T02:32:08+09:00</published>
<updated>2026-05-09T12:30:50+09:00</updated>
<category term="Tech"/>
<category term="family_mruby"/>
<category term="ESP32"/>
<category term="en"/>
<summary>Today, I’d like to introduce Family mruby, a personal project I’ve been working on recently, and its evolution into Fami…</summary>
<content type="html" xml:base="https://blog.silentworlds.info/2025/12/family-mruby-os-freertosbesunomicrorubymarutivmgou-xiang-2/">&lt;p&gt;&lt;img src=&quot;logo_fmrb.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Today, I’d like to introduce &lt;strong&gt;Family mruby&lt;/strong&gt;, a personal project I’ve been working on recently, and its evolution into &lt;strong&gt;Family mruby OS&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;(This post is translated from &lt;a href=&quot;/2025/12/family-mruby-os-freertosbesunomicrorubymarutivmgou-xiang/&quot;&gt;a previous post&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;family-mruby3.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This is a demo running on the current Linux-based simulation environment. Wouldn’t it be exciting if a UI like this could run on an ESP32 microcontroller using mruby, and you could even develop and execute mruby code directly on it?&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;background-and-motivation&quot;&gt;Background and Motivation&lt;a href=&quot;#background-and-motivation&quot; aria-label=&quot;Link to heading &#39;Background and Motivation&#39;&quot; data-heading-content=&quot;Background and Motivation&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Family mruby is a project that I originally started in 2019.&lt;br /&gt;
I also presented an early prototype at &lt;strong&gt;RubyKaigi Takeout 2020&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;what-is-family-mruby&quot;&gt;What is Family mruby?&lt;a href=&quot;#what-is-family-mruby&quot; aria-label=&quot;Link to heading &#39;What is Family mruby?&#39;&quot; data-heading-content=&quot;What is Family mruby?&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://kishima.github.io/jp/family_mruby/&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;Family mruby(legacy)&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;Kishima’s projects&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;Kishima Craft Works&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;blockquote&gt;
&lt;p&gt;Long ago, BASIC was often the first programming language that children encountered.&lt;br /&gt;
Despite its limitations, there were products like &lt;a href=&quot;https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%83%9F%E3%83%AA%E3%83%BC%E3%83%99%E3%83%BC%E3%82%B7%E3%83%83%E3%82%AF&quot;&gt;Family BASIC&lt;/a&gt;, which allowed BASIC programming not only on PCs but also on platforms such as the MSX or the Famicom(NES). Many programmers discovered the joy of programming through these environments.&lt;br /&gt;
Today, development environments for most programming languages are freely available and easily installable on PCs. However, because so much is possible, beginners often don’t know where to start. Even reaching the point where you can make something slightly beyond “Hello World,” such as a simple game, can require a surprisingly high setup cost.&lt;br /&gt;
With that in mind, I wanted to create an environment where you could build small games or applications using a scripting language on a single microcontroller board. That idea became Family mruby.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;features-of-the-original-family-mruby&quot;&gt;Features of the Original Family mruby&lt;a href=&quot;#features-of-the-original-family-mruby&quot; aria-label=&quot;Link to heading &#39;Features of the Original Family mruby&#39;&quot; data-heading-content=&quot;Features of the Original Family mruby&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Standalone mruby editor and execution environment running directly on ESP32&lt;/li&gt;
&lt;li&gt;Designed to run on ESP32 with PSRAM&lt;/li&gt;
&lt;li&gt;Custom-designed dedicated hardware board&lt;/li&gt;
&lt;li&gt;VGA video output&lt;/li&gt;
&lt;li&gt;Analog audio output&lt;/li&gt;
&lt;li&gt;PS/2 keyboard input&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;dormant-period&quot;&gt;Dormant Period&lt;a href=&quot;#dormant-period&quot; aria-label=&quot;Link to heading &#39;Dormant Period&#39;&quot; data-heading-content=&quot;Dormant Period&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Due to the COVID-19 pandemic and the busyness of my personal life, development stopped for a while.&lt;br /&gt;
Still, the idea of rebooting the project always lingered in the back of my mind.&lt;/p&gt;
&lt;h3 id=&quot;encounter-with-picoruby--microruby&quot;&gt;Encounter with PicoRuby / MicroRuby&lt;a href=&quot;#encounter-with-picoruby--microruby&quot; aria-label=&quot;Link to heading &#39;Encounter with PicoRuby / MicroRuby&#39;&quot; data-heading-content=&quot;Encounter with PicoRuby / MicroRuby&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;While I was away from the project, I learned that &lt;strong&gt;@hasumikin&lt;/strong&gt; had developed &lt;a href=&quot;https://github.com/picoruby&quot;&gt;&lt;strong&gt;PicoRuby&lt;/strong&gt;&lt;/a&gt;, which greatly inspired me.&lt;/p&gt;
&lt;p&gt;In my original implementation, I ported raw mruby to the ESP32 and built a custom editor on top of it. PicoRuby, however, was much more resource-efficient and implemented many features that significantly improved user experience, such as a filesystem and USB device support.&lt;/p&gt;
&lt;p&gt;Inspired by this design philosophy, I decided to rebuild my own ideal mruby development and execution environment from scratch.&lt;/p&gt;
&lt;p&gt;PicoRuby is based on the &lt;strong&gt;mruby/c VM&lt;/strong&gt;, but I heard that &lt;strong&gt;MicroRuby&lt;/strong&gt; would be based on the standard &lt;strong&gt;mruby VM&lt;/strong&gt;, which meant I could leverage my previous mruby experience.&lt;br /&gt;
By 2025, my personal life had stabilized enough to allow me to fully reboot the project and resume development seriously.&lt;/p&gt;
&lt;h2 id=&quot;differences-between-the-original-and-the-new-family-mruby&quot;&gt;Differences Between the Original and the New Family mruby&lt;a href=&quot;#differences-between-the-original-and-the-new-family-mruby&quot; aria-label=&quot;Link to heading &#39;Differences Between the Original and the New Family mruby&#39;&quot; data-heading-content=&quot;Differences Between the Original and the New Family mruby&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;During the project’s dormant period, I changed jobs and shifted from a PM-focused role back to hands-on coding. With my development instincts refreshed, I decided to design the new system with a “do everything I want” mindset, partly as a skills refresher.&lt;/p&gt;
&lt;p&gt;The architecture of the original Family mruby looked like the diagram below.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Original Family mruby diagram&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The new Family mruby architecture is shown in the next diagram.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://imgr.whimsical.com/object/2aSFVsTXAU4vxDs1MFyUnM&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;New Family mruby diagram&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The system has been reconstructed as an &lt;strong&gt;OS&lt;/strong&gt;, allowing the world of “developing and running software in mruby” to expand significantly.&lt;/p&gt;
&lt;p&gt;The main differences are summarized in the table below.&lt;br /&gt;
To address pain points from the original version—such as the cumbersome setup for PS/2 keyboards and VGA output—I switched to USB devices and enabled development on Linux as well.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;family-mruby-os&quot;&gt;Family mruby OS&lt;a href=&quot;#family-mruby-os&quot; aria-label=&quot;Link to heading &#39;Family mruby OS&#39;&quot; data-heading-content=&quot;Family mruby OS&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In the new Family mruby, USB mice can also be connected. Taking advantage of this, I wanted to provide a simple window-based GUI inspired by &lt;strong&gt;Windows 3.1&lt;/strong&gt; and &lt;a href=&quot;https://ja.wikipedia.org/wiki/FM_TOWNS&quot;&gt;&lt;strong&gt;FM-TOWNS OS&lt;/strong&gt;&lt;/a&gt;, which I personally grew up with.&lt;/p&gt;
&lt;p&gt;Since ESP-IDF is built on &lt;strong&gt;FreeRTOS&lt;/strong&gt;, I realized that it should be possible not only to run mruby code but also to execute multiple VMs concurrently.&lt;/p&gt;
&lt;p&gt;I decided to call this new environment &lt;strong&gt;Family mruby OS&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;assumptions&quot;&gt;Assumptions&lt;a href=&quot;#assumptions&quot; aria-label=&quot;Link to heading &#39;Assumptions&#39;&quot; data-heading-content=&quot;Assumptions&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Compared to PicoRuby and similar systems, Family mruby OS is expected to require several times more memory.&lt;br /&gt;
Therefore, it assumes an ESP32 equipped with several megabytes of PSRAM, such as:&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://akizukidenshi.com/catalog/g/g117256/&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;Wi-Fiモジュール ESP32-S3-WROOM-1-N16R8: 半導体 秋月電子通商-電子部品・ネット通販&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;電子部品,通販,販売,半導体,IC,LED,マイコン,電子工作Wi-Fiモジュール ESP32-S3-WROOM-1-N16R8秋月電子通商 電子部品通信販売&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;akizukidenshi.com&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;p&gt;In a sense, this might be the “luxurious microcontroller environment” that mruby originally envisioned.&lt;br /&gt;
In the future, I’d also like to support the &lt;strong&gt;ESP32-P4&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;key-features&quot;&gt;Key Features&lt;a href=&quot;#key-features&quot; aria-label=&quot;Link to heading &#39;Key Features&#39;&quot; data-heading-content=&quot;Key Features&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;adoption-of-microruby&quot;&gt;Adoption of MicroRuby&lt;a href=&quot;#adoption-of-microruby&quot; aria-label=&quot;Link to heading &#39;Adoption of MicroRuby&#39;&quot; data-heading-content=&quot;Adoption of MicroRuby&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;By using MicroRuby as the primary VM, we benefit from its compact yet dynamic compilation capabilities, as well as various picoruby-gems.&lt;/p&gt;
&lt;p&gt;Since MicroRuby is under active development and may introduce breaking internal changes, it’s important to track upstream carefully rather than maintaining a fork.&lt;/p&gt;
&lt;p&gt;I initially considered PicoRuby for its stability, but since mruby/c relies heavily on global variables, it appeared difficult to isolate memory spaces cleanly, so I decided against it.&lt;/p&gt;
&lt;p&gt;MicroRuby’s built-in multitasking features remain useful. Combined with FreeRTOS-level concurrency (machine-code level), we can also retain bytecode-level concurrency.&lt;br /&gt;
(Currently, instead of using interrupt handlers, each VM’s tick is driven from a dedicated task.)&lt;/p&gt;
&lt;h4 id=&quot;multi-vm-architecture&quot;&gt;Multi-VM Architecture&lt;a href=&quot;#multi-vm-architecture&quot; aria-label=&quot;Link to heading &#39;Multi-VM Architecture&#39;&quot; data-heading-content=&quot;Multi-VM Architecture&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;​FreeRTOS is a real-time operating system that provides task functionality.&lt;br /&gt;
Each task (similar to a thread) has its own stack and can operate independently.&lt;/p&gt;
&lt;p&gt;By placing one VM per task and creating multiple tasks, multiple VMs can run concurrently.&lt;br /&gt;
To make this possible, memory isolation and hardware resource separation are essential.&lt;/p&gt;
&lt;p&gt;To manage VMs like processes, various supporting mechanisms have been implemented.&lt;br /&gt;
FreeRTOS &lt;strong&gt;Thread Local Storage (TLS)&lt;/strong&gt; is used to manage VM contexts.&lt;/p&gt;
&lt;p&gt;Each VM is assigned its own memory allocator handle, limiting its accessible memory to a predefined pool. This approach:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prevents system-wide memory fragmentation&lt;/li&gt;
&lt;li&gt;Isolates failures so one VM does not corrupt others&lt;/li&gt;
&lt;li&gt;Improves overall system stability&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the worst case, a misbehaving application can be terminated, its memory pool reallocated, and restarted.&lt;br /&gt;
(Of course, illegal memory access at the C level or hardware resource conflicts are a different matter.)&lt;/p&gt;
&lt;p&gt;To avoid busy loops in a resource-constrained environment, event waiting is implemented using FreeRTOS queues.&lt;br /&gt;
When inter-VM events arrive, the corresponding callback method is invoked immediately in the target VM.&lt;/p&gt;
&lt;p&gt;As long as memory and hardware resources are properly isolated and size constraints are met, languages other than mruby can also be supported.&lt;br /&gt;
Currently, &lt;strong&gt;Lua&lt;/strong&gt; is integrated as a proof of concept, and &lt;strong&gt;MicroPython&lt;/strong&gt; is a future candidate.&lt;/p&gt;
&lt;h4 id=&quot;hardware-abstraction&quot;&gt;Hardware Abstraction&lt;a href=&quot;#hardware-abstraction&quot; aria-label=&quot;Link to heading &#39;Hardware Abstraction&#39;&quot; data-heading-content=&quot;Hardware Abstraction&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;With a system of this scale, development directly on a microcontroller can be challenging.&lt;br /&gt;
To address this, all hardware- and OS-dependent functionality is accessed through an abstraction layer.&lt;/p&gt;
&lt;p&gt;As a result, the same code can now run on Linux as on the ESP32.&lt;br /&gt;
This leverages ESP-IDF’s Linux build support and &lt;a href=&quot;https://github.com/lovyan03/LovyanGFX&quot;&gt;&lt;strong&gt;LovyanGFX&lt;/strong&gt;&lt;/a&gt;, which can also run on Linux via &lt;strong&gt;SDL2&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A well-defined abstraction layer improves portability and opens the door to future possibilities such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Running via WASM&lt;/li&gt;
&lt;li&gt;Supporting new board designs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One challenge is that existing picoruby-gems for peripherals may not align perfectly with Family mruby OS’s abstraction model, especially regarding memory management.&lt;br /&gt;
Additionally, many are not designed for multi-VM environments, so some form of mutual exclusion will likely be required.&lt;/p&gt;
&lt;p&gt;For GPIO and I2C, I think I should rewrite implementations to be thread-safe while using the hardware abstraction layer (HAL).&lt;/p&gt;
&lt;h3 id=&quot;development-location&quot;&gt;Development Location&lt;a href=&quot;#development-location&quot; aria-label=&quot;Link to heading &#39;Development Location&#39;&quot; data-heading-content=&quot;Development Location&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Development is carried out under the following GitHub organization:&lt;/p&gt;
&lt;p&gt;Documentation is still sparse, but I plan to improve it gradually.&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://github.com/family-mruby&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;Family mruby&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;Family mruby has 10 repositories available. Follow their code on GitHub.&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;GitHub&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-03333871.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;h3 id=&quot;execution-environments&quot;&gt;Execution Environments&lt;a href=&quot;#execution-environments&quot; aria-label=&quot;Link to heading &#39;Execution Environments&#39;&quot; data-heading-content=&quot;Execution Environments&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Family mruby is designed to run either on dedicated hardware or on Linux.&lt;/p&gt;
&lt;h4 id=&quot;dedicated-hardware&quot;&gt;Dedicated Hardware&lt;a href=&quot;#dedicated-hardware&quot; aria-label=&quot;Link to heading &#39;Dedicated Hardware&#39;&quot; data-heading-content=&quot;Dedicated Hardware&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;There is no mass-produced board yet, but I designed a development board and had it assembled via JLCPCB’s PCBA service.&lt;br /&gt;
Unfortunately, it didn’t work as expected, and debugging is currently underway.&lt;/p&gt;
&lt;p&gt;The rough block diagram is shown below.&lt;br /&gt;
In a somewhat desperate move, I mounted two ESP32 chips on the board. Someday, with an ESP32-P4 and a dedicated display, I might be able to consolidate this into a single chip.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://imgr.whimsical.com/object/XUTvoPYx4yPu455GVmjhrF&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;All hardware design data is publicly available:&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://github.com/family-mruby/narya-board&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;GitHub - family-mruby/narya-board: Dual ESP32 board for Family mruby&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;Dual ESP32 board for Family mruby. Contribute to family-mruby/narya-board development by creating an account on GitHub.&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;GitHub&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;p&gt;Here is a photo of the actual development board. The BOM was correct, and assembly quality was excellent.&lt;br /&gt;
This was my first time having through-hole components assembled as well, which was a valuable learning experience.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;aaIMG_8941.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4 id=&quot;linux&quot;&gt;Linux&lt;a href=&quot;#linux&quot; aria-label=&quot;Link to heading &#39;Linux&#39;&quot; data-heading-content=&quot;Linux&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;By using &lt;a href=&quot;https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-guides/host-apps.html&quot;&gt;ESP-IDF’s Linux simulation&lt;/a&gt; along with SDK2 and LovyanGFX, fmrb-core runs almost unchanged on Linux.&lt;/p&gt;
&lt;p&gt;The secondary ESP32 is represented by a separate process.&lt;br /&gt;
Instead of SPI, communication is implemented using a custom protocol over sockets.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://imgr.whimsical.com/object/Cs7cP43QpyvHwj79AB2kTw&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Architecture on Linux Environment&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;current-demo&quot;&gt;Current Demo&lt;a href=&quot;#current-demo&quot; aria-label=&quot;Link to heading &#39;Current Demo&#39;&quot; data-heading-content=&quot;Current Demo&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I recorded a demo video of &lt;strong&gt;Family mruby OS&lt;/strong&gt;. So far I’ve only verified it in the Linux environment, so my next step is to finish debugging the board and then get the same setup running on the ESP32 in the near future.&lt;/p&gt;
&lt;p&gt;The OS management features, the wallpaper/system bar screen, and a pseudo-shell app are each running in their own independent &lt;strong&gt;MicroRuby VM&lt;/strong&gt;. &lt;strong&gt;Lua&lt;/strong&gt; is also running separately in its own VM.&lt;/p&gt;
&lt;p&gt;Since there’s no launcher yet, I open the pseudo-shell and Lua windows in response to mouse clicks.&lt;/p&gt;
&lt;p&gt;The pseudo-shell app doesn’t implement shell functionality yet, but keyboard input is sent to the MicroRuby VM running the pseudo-shell app and reflected on screen.&lt;/p&gt;
&lt;p&gt;Mouse interaction is still incomplete as well, so for now I move the shell window using the arrow keys.&lt;/p&gt;
&lt;figure class=&quot;embed-youtube&quot;&gt;
&lt;a class=&quot;embed-youtube-link&quot; href=&quot;https://www.youtube.com/watch?v=cJsHcUooq20&quot; data-video-id=&quot;cJsHcUooq20&quot; aria-label=&quot;Family mruby OS prototype3 (YouTube で再生)&quot;&gt;&lt;img src=&quot;_card-08c4fdce.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;span class=&quot;embed-youtube-play&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
&lt;figcaption&gt;Family mruby OS prototype3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&quot;bouncing-ball-app-demo-application-code&quot;&gt;Bouncing Ball App Demo Application Code&lt;a href=&quot;#bouncing-ball-app-demo-application-code&quot; aria-label=&quot;Link to heading &#39;Bouncing Ball App Demo Application Code&#39;&quot; data-heading-content=&quot;Bouncing Ball App Demo Application Code&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/family-mruby/fmruby-core/blob/main/flash/app/sample/mruby.app.rb&quot;&gt;https://github.com/family-mruby/fmruby-core/blob/main/flash/app/sample/mruby.app.rb&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;highlight&quot; data-lang=&quot;ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;BouncingBallApp&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;FmrbApp&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;initialize&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@counter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@bounce_count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Ball properties&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@ball_x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@window_width&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@ball_y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@window_height&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@velocity_x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@velocity_y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@ball_radius&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Colors&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@bg_col&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;FmrbGfx&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;BLACK&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@ball_col&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;FmrbGfx&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;RED&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;on_create&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;log_puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;[BallApp] on_create called&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;log_puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;[BallApp] user_area: x0=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;vi&quot;&gt;@user_area_x0&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;, y0=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;vi&quot;&gt;@user_area_y0&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;, width=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;vi&quot;&gt;@user_area_width&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;, height=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;vi&quot;&gt;@user_area_height&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;log_puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;[BallApp] window: width=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;vi&quot;&gt;@window_width&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;, height=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;vi&quot;&gt;@window_height&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Initialize ball position within user area&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@ball_x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@user_area_x0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@user_area_width&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@ball_y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@user_area_y0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@user_area_height&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;draw_full_screen&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;log_puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;load my_lib&quot;&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;/lib/my_lib&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;log_puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;load my_lib done&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;inspect_env&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;draw_full_screen&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@gfx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;clear&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;FmrbGfx&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;WHITE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;draw_window_frame&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;draw_ball&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@gfx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;present&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;draw_ball&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@gfx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;fill_circle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;vi&quot;&gt;@ball_x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@ball_y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@ball_radius&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@ball_col&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;erase_ball&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@gfx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;fill_circle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;vi&quot;&gt;@ball_x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@ball_y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@ball_radius&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;FmrbGfx&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;WHITE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;on_update&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# Erase old ball position&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;erase_ball&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Update ball position&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@ball_x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@velocity_x&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@ball_y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@velocity_y&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Calculate user area boundaries&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;left_boundary&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@user_area_x0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@ball_radius&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;right_boundary&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@user_area_x0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@user_area_width&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@ball_radius&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;top_boundary&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@user_area_y0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@ball_radius&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;bottom_boundary&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@user_area_y0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@user_area_height&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@ball_radius&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Check collision with left/right walls&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@ball_x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;left_boundary&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@ball_x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;right_boundary&lt;/span&gt;
      &lt;span class=&quot;vi&quot;&gt;@velocity_x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;vi&quot;&gt;@velocity_x&lt;/span&gt;
      &lt;span class=&quot;vi&quot;&gt;@ball_x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@velocity_x&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Move away from boundary&lt;/span&gt;
      &lt;span class=&quot;vi&quot;&gt;@bounce_count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Check collision with top/bottom walls&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@ball_y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;top_boundary&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@ball_y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bottom_boundary&lt;/span&gt;
      &lt;span class=&quot;vi&quot;&gt;@velocity_y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;vi&quot;&gt;@velocity_y&lt;/span&gt;
      &lt;span class=&quot;vi&quot;&gt;@ball_y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@velocity_y&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Move away from boundary&lt;/span&gt;
      &lt;span class=&quot;vi&quot;&gt;@bounce_count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Draw new ball position&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;draw_ball&lt;/span&gt;

    &lt;span class=&quot;vi&quot;&gt;@gfx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;present&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@counter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Return sleep time in milliseconds (33ms = ~30fps)&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;33&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;on_event&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ev&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;on_destroy&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;log_puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;[BallApp] Destroyed&quot;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;begin&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;app&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;BouncingBallApp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;new&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;start&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;rescue&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;log_puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;[BallApp] Exception: &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;log_puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;[BallApp] Message: &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;what-has-been-implemented-so-far&quot;&gt;What Has Been Implemented So Far&lt;a href=&quot;#what-has-been-implemented-so-far&quot; aria-label=&quot;Link to heading &#39;What Has Been Implemented So Far&#39;&quot; data-heading-content=&quot;What Has Been Implemented So Far&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;OS Framework
&lt;ul&gt;
&lt;li&gt;Implementation of basic functionality&lt;/li&gt;
&lt;li&gt;Launching multiple MicroRuby VMs using FreeRTOS tasks
&lt;ul&gt;
&lt;li&gt;During the process of enabling multitasking, issues were found with memory space isolation and tick behavior, so patches have been applied. How these should ultimately be handled still requires further consideration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Launching a guest VM (Lua) using FreeRTOS tasks&lt;/li&gt;
&lt;li&gt;Memory pool management
&lt;ul&gt;
&lt;li&gt;The system is designed so that each VM is assigned an independent memory pool. For memory allocation, the default &lt;strong&gt;estalloc&lt;/strong&gt; allocator is used inside MicroRuby, while &lt;strong&gt;TLSF&lt;/strong&gt; is used elsewhere. estalloc has also been configured to operate correctly in a multitasking environment.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Foundation of an inter-core communication protocol&lt;br /&gt;
Currently implemented using sockets&lt;/li&gt;
&lt;li&gt;Simple drawing API&lt;br /&gt;
RPC implemented on top of LovyanGFX&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;For Linux
&lt;ul&gt;
&lt;li&gt;Execution environment using SDL2 + LovyanGFX
&lt;ul&gt;
&lt;li&gt;Audio is not yet implemented&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;For real hardware
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://speakerdeck.com/kishima/mruby-picoruby-de-huamikonyin-le-wozou-deru2&quot;&gt;Porting the APU block from an NES emulator to the ESP32&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Proof-of-concept for &lt;a href=&quot;https://github.com/family-mruby/fmruby-graphics-audio&quot;&gt;fmrb-audio-graphics&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Simultaneous operation of LovyanGFX (NTSC) and the APU has been confirmed&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Board
&lt;ul&gt;
&lt;li&gt;Design and implementation of a prototype board
&lt;ul&gt;
&lt;li&gt;However, issues remain&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Applications
&lt;ul&gt;
&lt;li&gt;Only development-time drawing samples so far&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;future-development-items&quot;&gt;Future Development Items&lt;a href=&quot;#future-development-items&quot; aria-label=&quot;Link to heading &#39;Future Development Items&#39;&quot; data-heading-content=&quot;Future Development Items&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;OS framework improvementsHID event handling / STDIO replacementWindow management (z-order, movement)Application lifecycle managementFullscreen modeGUI redesign&lt;/li&gt;
&lt;li&gt;LinuxExpanded graphics supportAudio implementation&lt;/li&gt;
&lt;li&gt;HardwareInter-core communicationUSB host support (keyboard, mouse)Sub-ESP32 firmware&lt;/li&gt;
&lt;li&gt;BoardDebuggingMass-production design&lt;/li&gt;
&lt;li&gt;ApplicationsShellFile managerGPIO/I2C sample apps&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;looking-ahead&quot;&gt;Looking Ahead&lt;a href=&quot;#looking-ahead&quot; aria-label=&quot;Link to heading &#39;Looking Ahead&#39;&quot; data-heading-content=&quot;Looking Ahead&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;My next step is to submit a CFP to RubyKaigi, then aim for a full presentation.&lt;br /&gt;
This project is far too large to complete in a few months, so I plan to continue gradual development throughout the coming year.&lt;/p&gt;
&lt;p&gt;Once things stabilize, I’d like to sell the board as a set at events.&lt;/p&gt;
&lt;h2 id=&quot;dreams&quot;&gt;Dreams&lt;a href=&quot;#dreams&quot; aria-label=&quot;Link to heading &#39;Dreams&#39;&quot; data-heading-content=&quot;Dreams&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If this project takes shape, I’d like to explore:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enhanced inter-VM communication&lt;/li&gt;
&lt;li&gt;Integrating MicroPython and reusing its ecosystem&lt;/li&gt;
&lt;li&gt;Pixel-art and music editors for game development&lt;/li&gt;
&lt;li&gt;GUI-based GPIO and I2C control&lt;/li&gt;
&lt;li&gt;Wi-Fi connectivity and app sharing/downloading&lt;/li&gt;
&lt;li&gt;Ports to LCD-equipped ESP32-S3 or Tab5 devices&lt;/li&gt;
&lt;li&gt;A PicoCalc-style device with LCD and mini keyboard&lt;/li&gt;
&lt;li&gt;Browser execution via Emscripten, with sensors handled by companion boards&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;references&quot;&gt;References&lt;a href=&quot;#references&quot; aria-label=&quot;Link to heading &#39;References&#39;&quot; data-heading-content=&quot;References&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;picotron---fantasy-desktop&quot;&gt;Picotron - Fantasy Desktop&lt;a href=&quot;#picotron---fantasy-desktop&quot; aria-label=&quot;Link to heading &#39;Picotron - Fantasy Desktop&#39;&quot; data-heading-content=&quot;Picotron - Fantasy Desktop&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I discovered this during development. While it’s not for microcontrollers, its UI closely matches my ideal vision.&lt;br /&gt;
It’s a retro, 8-bit-style game development environment.&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://www.lexaloffle.com/picotron.php&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;Picotron by Lexaloffle&lt;/strong&gt;&lt;span class=&quot;card-link-site&quot;&gt;www.lexaloffle.com&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;
</content>
</entry>
<entry>
<title>Family mruby OS：FreeRTOSベースのMicroRubyマルチVM構想</title>
<id>https://blog.silentworlds.info/2025/12/family-mruby-os-freertosbesunomicrorubymarutivmgou-xiang/</id>
<link rel="alternate" type="text/html" href="https://blog.silentworlds.info/2025/12/family-mruby-os-freertosbesunomicrorubymarutivmgou-xiang/"/>
<published>2025-12-25T12:19:48+09:00</published>
<updated>2026-05-09T12:30:58+09:00</updated>
<category term="family_mruby"/>
<category term="ESP32"/>
<category term="Tech"/>
<summary>この記事は、mrubyファミリ (組み込み向け軽量Ruby) Advent Calendar 2025の12/25の記事です。25日の枠が空いていたので、滑り込ませていただきました。</summary>
<content type="html" xml:base="https://blog.silentworlds.info/2025/12/family-mruby-os-freertosbesunomicrorubymarutivmgou-xiang/">&lt;p&gt;この記事は、&lt;a href=&quot;https://qiita.com/advent-calendar/2025/mruby-family&quot;&gt;mrubyファミリ (組み込み向け軽量Ruby) Advent Calendar 2025&lt;/a&gt;の12/25の記事です。25日の枠が空いていたので、滑り込ませていただきました。&lt;/p&gt;
&lt;p&gt;今日は私が最近取り組んでいる個人プロジェクトであるFamily mrubyとそこから発展したFamily mruby OSについて紹介したいと思います。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-10.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;現在のLinuxシミュレーション環境上でのデモ。ESP32マイコン上で、こんなUIがmrubyで動いていて、mrubyのコードも開発、実行できたら夢が広がりますよね？&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;開発に至る経緯&quot;&gt;開発に至る経緯&lt;a href=&quot;#開発に至る経緯&quot; aria-label=&quot;Link to heading &#39;開発に至る経緯&#39;&quot; data-heading-content=&quot;開発に至る経緯&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Family mrubyは2019年から開発着手したプロジェクトです。2020のRubyKaigi Takeoutでも初期型について発表しました。&lt;/p&gt;
&lt;h3 id=&quot;family-mrubyとは&quot;&gt;Family mrubyとは？&lt;a href=&quot;#family-mrubyとは&quot; aria-label=&quot;Link to heading &#39;Family mrubyとは？&#39;&quot; data-heading-content=&quot;Family mrubyとは？&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://kishima.github.io/jp/family_mruby/&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;Family mruby(legacy)&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;Kishima’s projects&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;Kishima Craft Works&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;blockquote&gt;
&lt;p&gt;今は昔、子供が最初に触れるプログラミング言語といえば、BASICという時代がありました。 制約は多いですが、パソコン以外にも、MSXやファミコンでBASICができるFamily BASICという製品もあり、そこからプログラミングの面白さを知り、プログラマーになった方もたくさん居られると思います。&lt;br /&gt;
そして現在は無料で大抵のプログラミング言語の開発環境はパソコンにインストールすることができる時代になりましたが、できることが多すぎて何をしたらよいのかわからなかったり、Hello Worldの先のゲームを作ったりするまでの環境構築ハードルが高かったり、するような気がしています。&lt;br /&gt;
そこで、マイコン一つでちょっとしたゲームなどをスクリプト言語で作れる環境を作ってみたい、と思って開発したのが、Family mrubyです。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;特徴&quot;&gt;特徴&lt;a href=&quot;#特徴&quot; aria-label=&quot;Link to heading &#39;特徴&#39;&quot; data-heading-content=&quot;特徴&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;mruby専用のエディタおよび実行環境をESP32上でスタンドアロンで実現&lt;/li&gt;
&lt;li&gt;PSRAM付きESP32上での動作を想定&lt;/li&gt;
&lt;li&gt;専用の基板も設計&lt;/li&gt;
&lt;li&gt;映像はVGAで出力&lt;/li&gt;
&lt;li&gt;音声はアナログで出力&lt;/li&gt;
&lt;li&gt;PS/2のキーボードで入力&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;休眠期&quot;&gt;休眠期&lt;a href=&quot;#休眠期&quot; aria-label=&quot;Link to heading &#39;休眠期&#39;&quot; data-heading-content=&quot;休眠期&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;コロナの流行や、私生活のあわただしさもあり、しばらく開発がストップしてました。でも頭の片隅にはプロジェクトをリブートしたいという思いがずっとありました。&lt;/p&gt;
&lt;h3 id=&quot;picorubymicrorubyとの出会い&quot;&gt;PicoRuby/MicroRubyとの出会い&lt;a href=&quot;#picorubymicrorubyとの出会い&quot; aria-label=&quot;Link to heading &#39;PicoRuby/MicroRubyとの出会い&#39;&quot; data-heading-content=&quot;PicoRuby/MicroRubyとの出会い&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;私がしばらくプロジェクトから遠ざかっているうちに、@hasumikinさんが&lt;a href=&quot;https://picoruby.org/&quot;&gt;PicoRuby&lt;/a&gt;を開発されたことを知り、大いに刺激を受けました。&lt;/p&gt;
&lt;p&gt;私の初期型では、ESP32へ素のmrubyを移植して、自作のエディタを動かすまででしたが、PicoRubyでは、より省リソースになり、ファイルシステムやUSBデバイス化などユーザ体験を向上させるための機能が多数実装されてました。&lt;/p&gt;
&lt;p&gt;この設計思想を一部受け継いで、自分なりに自分が求める新しいmrubyの開発実行環境をまた１から作り直したくなりました。&lt;/p&gt;
&lt;p&gt;PicoRubyはmruby/cのVMがベースになっていましたが、&lt;a href=&quot;https://rubykaigi.org/2025/presentations/hasumikin.html&quot;&gt;MicroRuby&lt;/a&gt;ではmruby VMベースになると聞いて、mrubyでの経験も生かせるのではと思いました。&lt;/p&gt;
&lt;p&gt;ある程度私生活も落ち着いてきた2025年から本格的にプロジェクトをリブートして開発に着手しました。&lt;/p&gt;
&lt;h2 id=&quot;初期family-mrubyと新family-mruby-は何が違うのか&quot;&gt;初期Family mrubyと新Family mruby は何が違うのか&lt;a href=&quot;#初期family-mrubyと新family-mruby-は何が違うのか&quot; aria-label=&quot;Link to heading &#39;初期Family mrubyと新Family mruby は何が違うのか&#39;&quot; data-heading-content=&quot;初期Family mrubyと新Family mruby は何が違うのか&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;プロジェクト休眠期中に転職をしてPM寄りから、コーディングもする仕事になって、多少開発の勘も戻ってきたこともあり、腕試しの意味も込めて、やりたいこと全部やる方針で設計しました。&lt;/p&gt;
&lt;p&gt;初期型の構成は↓の図のような感じです。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;初期型Family mrubyの構成&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;新型Family mrubyの構成は↓のようになってます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://imgr.whimsical.com/object/2aSFVsTXAU4vxDs1MFyUnM&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;新型Family mrubyの構成&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;mrubyで開発、実行できる世界を拡張できるようにOSとして再構築しました。&lt;/p&gt;
&lt;p&gt;主な違いは以下の表にまとめてみました。PS/2キーボードやVGA出力がちょっと準備が面倒なので、USBに変えたり、Linux上でも開発できるようにしたり、と旧型で気になった部分を解消するように見直しています。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-11.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;旧Family mrubyとの違い&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;family-mruby-os&quot;&gt;Family mruby OS&lt;a href=&quot;#family-mruby-os&quot; aria-label=&quot;Link to heading &#39;Family mruby OS&#39;&quot; data-heading-content=&quot;Family mruby OS&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;新型Family mrubyでは、USBマウスもつなぐことできるようになります。それを生かして、昔の&lt;a href=&quot;https://ja.wikipedia.org/wiki/Microsoft_Windows_3.x&quot;&gt;Windows3.1&lt;/a&gt;や私が親しんだ&lt;a href=&quot;https://ja.wikipedia.org/wiki/FM_TOWNS&quot;&gt;FM-TOWNS OS&lt;/a&gt;をオマージュして、シンプルなWindow GUIを提供したいと考えました。&lt;/p&gt;
&lt;p&gt;ESP-IDFのベースになっているFreeRTOSを生かせば、単にmrubyのコードを実行する環境としてだけでなく、コンカレントに複数のVMを実行できるはずです。&lt;/p&gt;
&lt;p&gt;この新しい環境をFamily mruby OSと呼ぶことにしました。&lt;/p&gt;
&lt;h3 id=&quot;前提&quot;&gt;前提&lt;a href=&quot;#前提&quot; aria-label=&quot;Link to heading &#39;前提&#39;&quot; data-heading-content=&quot;前提&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Family mruby OSを動かすためには、PicoRubyなどと比較して何倍ものメモリが必要なることが見込まれます。そのため、PSRAMを数MB以上搭載したESP32を前提としました。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://akizukidenshi.com/catalog/g/g117256/&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;Wi-Fiモジュール ESP32-S3-WROOM-1-N16R8: 半導体 秋月電子通商-電子部品・ネット通販&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;電子部品,通販,販売,半導体,IC,LED,マイコン,電子工作Wi-Fiモジュール ESP32-S3-WROOM-1-N16R8秋月電子通商 電子部品通信販売&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;akizukidenshi.com&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;p&gt;mrubyが当初想定していた富豪的マイコン環境がこれなのかなと思ってます。&lt;/p&gt;
&lt;p&gt;将来的には&lt;a href=&quot;https://www.espressif.com/ja-jp/products/socs/esp32-p4&quot;&gt;ESP32-P4&lt;/a&gt;にも対応できたらいいなと思ってます。&lt;/p&gt;
&lt;h3 id=&quot;特徴-1&quot;&gt;特徴&lt;a href=&quot;#特徴-1&quot; aria-label=&quot;Link to heading &#39;特徴&#39;&quot; data-heading-content=&quot;特徴&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;microrubyを採用&quot;&gt;MicroRubyを採用&lt;a href=&quot;#microrubyを採用&quot; aria-label=&quot;Link to heading &#39;MicroRubyを採用&#39;&quot; data-heading-content=&quot;MicroRubyを採用&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://rubykaigi.org/2025/presentations/hasumikin.html&quot;&gt;MicroRuby&lt;/a&gt;を主たるVMとすることで、コンパクトでダイナミックなコンパイル機能や、各種pico-gemなど、たくさんの恩恵を受けることができます。&lt;/p&gt;
&lt;p&gt;MicroRubyは絶賛開発中で内部的には破壊的変更も発生するので、Forkはしないでうまく追従していくように努力が必要です。&lt;/p&gt;
&lt;p&gt;より安定しているPicoRubyの採用も最初考えましたが、ベースのmruby/cがグローバル変数が前提の実装になっており、メモリ空間の分割が難しそうだったため断念してます。&lt;/p&gt;
&lt;p&gt;MicroRubyの提供するマルチタスク機能も有効なので、FreeRTOSによる機械語レベルの並行動作に加えて、バイトコードレベルでの並行動作も変わらず使えるはずです。（現在は、割り込みハンドラではなくて、専用タスクから各VMのTickを呼び出す形にしてます）&lt;/p&gt;
&lt;h4 id=&quot;マルチvm&quot;&gt;マルチVM&lt;a href=&quot;#マルチvm&quot; aria-label=&quot;Link to heading &#39;マルチVM&#39;&quot; data-heading-content=&quot;マルチVM&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;​FreeRTOSは、リアルタイムOSであり、タスク機能を提供しています。タスクはいわゆるスレッド的なもので、それぞれがスタックをもって独立して動作することができます。&lt;/p&gt;
&lt;p&gt;１タスクに１VMを載せ、タスクを複数生成することで、VMを並行で動かすことができます。そのためにはメモリ空間やHWリソースの分離などが必須になります。&lt;/p&gt;
&lt;p&gt;VMをプロセスのように管理するために、必要な各種機能を実装しています。タスクのTLS（Thread Local Storage）を活用することで、VMのコンテキストを管理しています。&lt;/p&gt;
&lt;p&gt;VMごとにメモリアロケータのハンドルを割り与えることで、１つのVMがアクセスできるメモリはあらかじめ確保したメモリの範囲に限定しています。こうすることで、メモリのフラグメンテーションがシステム全体に波及することを防いだり、１アプリのメモリが壊れても、他アプリへの影響しないようにしたり、などシステム全体の安定化に大きな効果があります。最悪、アプリの状態がおかしくなっても、タスクを強制的に終了させて、またメモリプールを割り与え直せば復帰できます。（もちろんC言語レベルでなにか不正なメモリアクセスしたり、HWの取り合いなど起こしたときは別の話になります）&lt;/p&gt;
&lt;p&gt;性能が限られた環境でビジーループ的なことは極力避けたいので、イベント待ちはFreeRTOSのキュー機能で実装してます。アプリ側ではVM間イベントが届き次第即座に所定のメソッドがコールバックされるようしています。&lt;/p&gt;
&lt;p&gt;基本的にメモリ分離、HWリソース分離ができて、バイナリサイズ、実行メモリサイズが適合すれば、mruby以外の言語も搭載可能です。現状はPoCとしてLuaを仮搭載してます。将来的にはMicroPythonも搭載してみたいです。&lt;/p&gt;
&lt;h4 id=&quot;hwの抽象化&quot;&gt;HWの抽象化&lt;a href=&quot;#hwの抽象化&quot; aria-label=&quot;Link to heading &#39;HWの抽象化&#39;&quot; data-heading-content=&quot;HWの抽象化&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;これだけ大規模な実装になるとマイコン上での開発はなかなか大変です。そのためLinuxでも実行できるようになると嬉しいです。そのために、HWやOSに関する機能は全て抽象化レイヤーを介してアクセスするようにしました。&lt;/p&gt;
&lt;p&gt;その結果、Linux上でもESP32向けと同じコードを実行できるようになりました。ESP-IDFがLinux向けのビルドが可能なのと、描画用に採用している&lt;a href=&quot;https://github.com/lovyan03/LovyanGFX&quot;&gt;LovyanGFX&lt;/a&gt;も&lt;a href=&quot;https://github.com/libsdl-org/SDL&quot;&gt;SDL2&lt;/a&gt; on Linuxでも実行可能なので、それを生かしています。&lt;/p&gt;
&lt;p&gt;抽象化レイヤーをしっかり実装することで、移植性が向上するので、将来的にWASMで実行したり、新しい設計の基板で実行したり、応用の幅が広がることも期待しています。&lt;/p&gt;
&lt;p&gt;課題としては、既存のペリフェラルに関するpico-gemは、メモリの管理など、Family mruby OSの抽象化レイヤーに必ずしも適合しない場合があります。また、そもそもマルチVM環境での動作も想定されてないので、複数VMで動かないようにするために、何らかの排他機構も必要になるはずです。&lt;/p&gt;
&lt;p&gt;GPIO、I2Cあたりは、HW抽象化レイヤー(HAL)を使いつつ、スレッドセーフな実装に書き直すべきかなと思っています。&lt;/p&gt;
&lt;h3 id=&quot;開発場所&quot;&gt;開発場所&lt;a href=&quot;#開発場所&quot; aria-label=&quot;Link to heading &#39;開発場所&#39;&quot; data-heading-content=&quot;開発場所&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;以下のOrganazationで開発してます。&lt;/p&gt;
&lt;p&gt;ドキュメント等まだ全然整理できてないので、徐々に整えていきたいと思ってます。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://github.com/family-mruby&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;Family mruby&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;Family mruby has 10 repositories available. Follow their code on GitHub.&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;GitHub&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-03333871.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;h3 id=&quot;実行環境&quot;&gt;実行環境&lt;a href=&quot;#実行環境&quot; aria-label=&quot;Link to heading &#39;実行環境&#39;&quot; data-heading-content=&quot;実行環境&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Family mrubyは、専用の基板か、Linuxでの実行を想定しています。&lt;/p&gt;
&lt;h4 id=&quot;専用基板&quot;&gt;専用基板&lt;a href=&quot;#専用基板&quot; aria-label=&quot;Link to heading &#39;専用基板&#39;&quot; data-heading-content=&quot;専用基板&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;まだ量産版はありませんが、開発基板を設計して、&lt;a href=&quot;https://jlcpcb.com/&quot;&gt;JLCPCB&lt;/a&gt;のPCBAで生産してみました。しかし、うまく動かなかったので、現在デバック中です。&lt;/p&gt;
&lt;p&gt;大まかなブロック図は以下のようになってます。半分やけくそでESP32を２つ搭載してます。将来、&lt;a href=&quot;https://www.espressif.com/en/products/socs/esp32-p4&quot;&gt;ESP32-P4&lt;/a&gt;で専用ディスプレイ使えば１チップ化もできるかな、と妄想してます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://imgr.whimsical.com/object/XUTvoPYx4yPu455GVmjhrF&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;HW設計データはすべて公開してます。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://github.com/family-mruby/narya-board&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;GitHub - family-mruby/narya-board: Dual ESP32 board for Family mruby&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;Dual ESP32 board for Family mruby. Contribute to family-mruby/narya-board development by creating an account on GitHub.&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;GitHub&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;p&gt;実際の開発基板の写真です。BOMも間違いなく、きれいに実装できました。スルーホール部品の実装までやってもらったことはなかったので、勉強になりました。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;aaIMG_8941.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4 id=&quot;linux&quot;&gt;Linux&lt;a href=&quot;#linux&quot; aria-label=&quot;Link to heading &#39;Linux&#39;&quot; data-heading-content=&quot;Linux&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-guides/host-apps.html&quot;&gt;ESP-IDFのLinuxシミュレーション&lt;/a&gt;および、SDK2とLovyanGFXを利用することで、fmrb-coreはほぼそのままに、Linux上でも実行できるようできました。&lt;/p&gt;
&lt;p&gt;サブESP32に相当するものとして、別プロセスを立ち上げてます。SPIの代わりにソケットで独自プロトコルで通信してます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://imgr.whimsical.com/object/Cs7cP43QpyvHwj79AB2kTw&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Linux環境での構成&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;現状のデモ動画&quot;&gt;現状のデモ動画&lt;a href=&quot;#現状のデモ動画&quot; aria-label=&quot;Link to heading &#39;現状のデモ動画&#39;&quot; data-heading-content=&quot;現状のデモ動画&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Family mruby OSのデモ動画を撮りました。Linux環境でしか確認できてないので、基板のデバッグを完了させて、近いうちにこれをESP32でも同様に動かしていきたと考えています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OSの管理機能と、壁紙やシステムバーの画面と、疑似Shellアプリをそれぞれ独立したMicroRuby VMで実行してます。Luaも独立して実行してます。&lt;/li&gt;
&lt;li&gt;まだランチャーがないので、マウスのクリックに合わせて、疑似ShellとLuaのウィンドウを開いてます。&lt;/li&gt;
&lt;li&gt;疑似Shellアプリは、Shellとしての機能はまだ実装されてませんが、キー入力は疑似Shellアプリが動くMicroRubyVMへ送信して、画面に反映してます。&lt;/li&gt;
&lt;li&gt;マウス操作もまだ実装不十分なので、十字キー入力で、Shellウィンドウを動かしてます。&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;embed-youtube&quot;&gt;
&lt;a class=&quot;embed-youtube-link&quot; href=&quot;https://www.youtube.com/watch?v=Vh8td6vWD4w&quot; data-video-id=&quot;Vh8td6vWD4w&quot; aria-label=&quot;Family mruby OS prototype (YouTube で再生)&quot;&gt;&lt;img src=&quot;_card-87dbfd6e.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;span class=&quot;embed-youtube-play&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
&lt;figcaption&gt;Family mruby OS prototype&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;デモ動画&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;shell風アプリ表示だけデモのコード&quot;&gt;Shell風アプリ（表示だけデモ）のコード&lt;a href=&quot;#shell風アプリ表示だけデモのコード&quot; aria-label=&quot;Link to heading &#39;Shell風アプリ（表示だけデモ）のコード&#39;&quot; data-heading-content=&quot;Shell風アプリ（表示だけデモ）のコード&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;これは現状デモ用なので、STDIO対応などした上で将来大きく変更されると思います。どれくらいのコードでデモ動画のようなことが実現できているのかの参考になれば。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/family-mruby/fmruby-core/blob/main/main/app/default_app/mrblib/shell.app.rb&quot;&gt;https://github.com/family-mruby/fmruby-core/blob/main/main/app/default_app/mrblib/shell.app.rb&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;highlight&quot; data-lang=&quot;Ruby&quot;&gt;&lt;code&gt;class ShellApp &amp;lt; FmrbApp
  def initialize
    super()
    @current_line = &quot;&quot;
    @history = []  # Line history
    @cursor_x = 0
    @cursor_y = 0
    @char_width = 6
    @char_height = 8
    @prompt = &quot;&amp;gt; &quot;
    @need_redraw = false
  end

  def on_create()
    @gfx.clear(FmrbGfx::WHITE)
    draw_window_frame
    draw_prompt
    @gfx.present
    puts &quot;[ShellApp] on_create called&quot;
  end

  def on_update()
    if @need_redraw
      redraw_screen
      @need_redraw = false
    end
    33 # msec
  end

  def draw_prompt
    # Draw all history lines
    @history.each_with_index do |line, i|
      x = @user_area_x0 + 2
      y = @user_area_y0 + 2 + (i * @char_height)
      @gfx.draw_text(x, y, line, FmrbGfx::BLACK)
    end

    # Draw current input line
    x = @user_area_x0 + 2
    y = @user_area_y0 + 2 + (@history.length * @char_height)
    @gfx.draw_text(x, y, @prompt + @current_line, FmrbGfx::BLACK)
  end

  def redraw_screen
    # Clear user area
    @gfx.fill_rect(@user_area_x0, @user_area_y0,
                    @user_area_width, @user_area_height, FmrbGfx::WHITE)
    draw_window_frame
    draw_prompt
    @gfx.present
  end

  def on_event(ev)
    puts &quot;on_event: shell app&quot;
    p ev

    if ev[:type] == :key_down
      handle_key_input(ev)
    elsif ev[:type] == :key_up
      handle_key_up(ev)
    end
  end

  def handle_key_up(ev)
    keycode = ev[:keycode]

    # Window position control with arrow keys
    x = 0
    y = 0
    case keycode
    when 82  # up
      y = -10
    when 81  # down
      y = 10
    when 80  # left
      x = -10
    when 79  # right
      x = 10
    end

    if x != 0 || y != 0
      set_window_position(@pos_x + x, @pos_y + y)
    end
  end

  def handle_key_input(ev)
    keycode = ev[:keycode]
    puts &quot;[Shell] keycode=#{keycode}&quot;

    # Enter key (keycode 13 = CR)
    if keycode == 13
      handle_enter
      return
    end

    # Backspace key (keycode 8 = BS)
    if keycode == 8
      handle_backspace
      return
    end

    # Ignore arrow keys (79-82)
    if keycode &amp;gt;= 79 &amp;amp;&amp;amp; keycode &amp;lt;= 82
      return
    end

    # Convert keycode to character (ASCII printable range)
    if keycode &amp;gt;= 32 &amp;amp;&amp;amp; keycode &amp;lt;= 126
      char = keycode.chr
      @current_line += char
      @need_redraw = true
    end
  end

  def handle_enter
    puts &quot;[Shell] Command: #{@current_line}&quot;

    # Add current line to history
    @history &amp;lt;&amp;lt; (@prompt + @current_line)

    # TODO: Execute command here and add output to history

    # Clear current line
    @current_line = &quot;&quot;

    # Check if we need to scroll
    max_lines = @user_area_height / @char_height
    if @history.length &amp;gt;= max_lines - 1
      # Remove oldest line to make room
      @history.shift
    end

    @need_redraw = true
  end

  def handle_backspace
    if @current_line.length &amp;gt; 0
      @current_line = @current_line[0...-1]
      @need_redraw = true
    end
  end

  def on_destroy
    puts &quot;[ShellApp] Destroyed&quot;
  end

end

# Create and start the system GUI app instance
puts &quot;[ShellApp] ShellApp.new&quot;
begin
  app = ShellApp.new
  puts &quot;[ShellApp] ShellApp created successfully&quot;
  app.start
rescue =&amp;gt; e
  puts &quot;[ShellApp] Exception caught: #{e.class}&quot;
  puts &quot;[ShellApp] Message: #{e.message}&quot;
  puts &quot;[ShellApp] Backtrace:&quot;
  puts e.backtrace.join(&quot;\n&quot;) if e.backtrace
end
puts &quot;[ShellApp] Script ended&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;これまでにやったこと&quot;&gt;これまでにやったこと&lt;a href=&quot;#これまでにやったこと&quot; aria-label=&quot;Link to heading &#39;これまでにやったこと&#39;&quot; data-heading-content=&quot;これまでにやったこと&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;OS Framework
&lt;ul&gt;
&lt;li&gt;基本的な機能の実装&lt;/li&gt;
&lt;li&gt;FreeRTOSタスクでのマルチMicroRuby VM起動
&lt;ul&gt;
&lt;li&gt;マルチタスク化にあたって、メモリ空間の分離や、Tickの挙動などで、問題があったため、パッチをあててます。最終的にどう扱うかはもう少し検討したいところです。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;FreeRTOSタスクでのゲストVM(Lua)起動&lt;/li&gt;
&lt;li&gt;メモリプール管理
&lt;ul&gt;
&lt;li&gt;VMごとに独立したメモリプールを与えるように設計してます。アロケータについては、MicroRuby内ではデフォルトの&lt;a href=&quot;https://github.com/picoruby/estalloc&quot;&gt;estalloc&lt;/a&gt;を利用し、その他では&lt;a href=&quot;https://github.com/mattconte/tlsf&quot;&gt;TLSF&lt;/a&gt;を利用してます。estallocもマルチタスク環境で動くように設定してます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Linux向け
&lt;ul&gt;
&lt;li&gt;SDL2+LovyanGFXの実行環境
&lt;ul&gt;
&lt;li&gt;Audioは未実装&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;実機向け
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://speakerdeck.com/kishima/mruby-picoruby-de-huamikonyin-le-wozou-deru2&quot;&gt;NESエミュレータからESP32へのAPUブロック移植&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/family-mruby/fmruby-graphics-audio&quot;&gt;fmrb-audio-graphics&lt;/a&gt;の原理検証
&lt;ul&gt;
&lt;li&gt;LovyanGFX(NTSC)とAPUの同時動作確認済み&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;基板
&lt;ul&gt;
&lt;li&gt;試作基板の設計実装
&lt;ul&gt;
&lt;li&gt;ただし不具合あり&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;アプリケーション
&lt;ul&gt;
&lt;li&gt;開発用の描画サンプルのみ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;今後の主な開発アイテム&quot;&gt;今後の主な開発アイテム&lt;a href=&quot;#今後の主な開発アイテム&quot; aria-label=&quot;Link to heading &#39;今後の主な開発アイテム&#39;&quot; data-heading-content=&quot;今後の主な開発アイテム&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;OS Framework
&lt;ul&gt;
&lt;li&gt;HIDのイベント管理/STDIOの差し替え&lt;/li&gt;
&lt;li&gt;Window管理（表示順、移動）&lt;/li&gt;
&lt;li&gt;アプリのライフサイクル&lt;/li&gt;
&lt;li&gt;フルスクリーンモード&lt;/li&gt;
&lt;li&gt;GUIデザインの刷新&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Linux向け
&lt;ul&gt;
&lt;li&gt;Graphics系の拡充&lt;/li&gt;
&lt;li&gt;Audio系の実装&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;実機向け
&lt;ul&gt;
&lt;li&gt;コア間通信の実装&lt;/li&gt;
&lt;li&gt;USB HOST対応（キーボード、マウス）&lt;/li&gt;
&lt;li&gt;サブESP32のファームウェア実装&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;基板
&lt;ul&gt;
&lt;li&gt;ESP32ボードのデバッグ&lt;/li&gt;
&lt;li&gt;量産型の設計、試作&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;アプリケーション
&lt;ul&gt;
&lt;li&gt;シェル&lt;/li&gt;
&lt;li&gt;ファイルマネージャ&lt;/li&gt;
&lt;li&gt;GPIOやI2Cデバイス連携のサンプルアプリ&lt;/li&gt;
&lt;li&gt;etc...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;今後&quot;&gt;今後&lt;a href=&quot;#今後&quot; aria-label=&quot;Link to heading &#39;今後&#39;&quot; data-heading-content=&quot;今後&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;今後は、まずはRubyKaigiへのCFP投稿、うまくいけば発表を目指して完成度を上げていきます。&lt;/p&gt;
&lt;p&gt;開発アイテムは多岐にわたり、発展課題も含めると、とても数カ月で完了する内容ではないので、来年はずっと少しずつ開発を進めて完成度を上げていくつもりです。&lt;/p&gt;
&lt;p&gt;ある程度、安定したら基板もセットで、イベントで販売したりしてみたいですね。&lt;/p&gt;
&lt;h2 id=&quot;夢&quot;&gt;夢&lt;a href=&quot;#夢&quot; aria-label=&quot;Link to heading &#39;夢&#39;&quot; data-heading-content=&quot;夢&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;このプロジェクトが形になってきたら、色々やってみたいことがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VM間通信の強化&lt;/li&gt;
&lt;li&gt;MicroPythonも取り込んで、MicroPython資産をどうにかして生かす&lt;/li&gt;
&lt;li&gt;ドット絵エディタや音楽エディタも実装して、ゲーム開発環境として成立させる&lt;/li&gt;
&lt;li&gt;GUIでI2CとかGPIOも操作できるようなアプリを作る&lt;/li&gt;
&lt;li&gt;WiFiもつないで、ネットでアプリをシェアしたりDLできる仕組みを作る&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.m5stack.com/en/core/Tab5&quot;&gt;Tab5&lt;/a&gt;やESP32-S3搭載の液晶パネル付きデバイスへの移植&lt;/li&gt;
&lt;li&gt;LCD対応して、ミニキーボードも搭載して、&lt;a href=&quot;https://www.clockworkpi.com/picocalc&quot;&gt;PicoCalc&lt;/a&gt;風のデバイスを作る&lt;/li&gt;
&lt;li&gt;Emscriptenでビルドできるようにして、ブラウザ上でも実行する。センサーとかの接続は、コンパニオンボードを開発してそれで行う&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;参考にしたプロジェクト&quot;&gt;参考にしたプロジェクト&lt;a href=&quot;#参考にしたプロジェクト&quot; aria-label=&quot;Link to heading &#39;参考にしたプロジェクト&#39;&quot; data-heading-content=&quot;参考にしたプロジェクト&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;picotronのfantasy-desktop&quot;&gt;PicotronのFantasy Desktop&lt;a href=&quot;#picotronのfantasy-desktop&quot; aria-label=&quot;Link to heading &#39;PicotronのFantasy Desktop&#39;&quot; data-heading-content=&quot;PicotronのFantasy Desktop&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;開発中に存在を知って、マイコン向けではないですが、UIのイメージが自分の理想にとても近かったです。&lt;/p&gt;
&lt;p&gt;レトロな8bit風ゲーム開発環境です。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://www.lexaloffle.com/picotron.php&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;Picotron by Lexaloffle&lt;/strong&gt;&lt;span class=&quot;card-link-site&quot;&gt;www.lexaloffle.com&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;
</content>
</entry>
<entry>
<title>PicoRubyとMicroRubyの歩き方</title>
<id>https://blog.silentworlds.info/2025/12/picorubytomicrorubynobu-kifang/</id>
<link rel="alternate" type="text/html" href="https://blog.silentworlds.info/2025/12/picorubytomicrorubynobu-kifang/"/>
<published>2025-12-15T03:02:44+09:00</published>
<updated>2026-05-09T12:30:54+09:00</updated>
<category term="Tech"/>
<category term="mruby"/>
<summary>この記事は、mrubyファミリ (組み込み向け軽量Ruby) Advent Calendar 2025に参加してます。</summary>
<content type="html" xml:base="https://blog.silentworlds.info/2025/12/picorubytomicrorubynobu-kifang/">&lt;p&gt;&lt;img src=&quot;Clipboard012.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;この記事は、&lt;a href=&quot;https://qiita.com/advent-calendar/2025/mruby-family&quot;&gt;mrubyファミリ (組み込み向け軽量Ruby) Advent Calendar 2025&lt;/a&gt;に参加してます。&lt;/p&gt;
&lt;p&gt;今日は、PicoRubyとMicroRubyについて、具体的にどんな技術なのか、どんな活用が可能なのか、いまいち想像がついていない方向けへの情報を提供できればと思っています。&lt;/p&gt;
&lt;h2 id=&quot;picorubyとは&quot;&gt;PicoRubyとは&lt;a href=&quot;#picorubyとは&quot; aria-label=&quot;Link to heading &#39;PicoRubyとは&#39;&quot; data-heading-content=&quot;PicoRubyとは&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/picoruby/picoruby&quot;&gt;PicoRuby&lt;/a&gt;とは、hasumikinさんが開発されたオリジナルのmrubyバイトコードコンパイラとmruby/cのVMを組み合わせた、Raspberry Pi Picoのようなメモリのリソースが少ない環境向けのRuby環境です。&lt;/p&gt;
&lt;img src=&quot;image-5.png&quot; alt=&quot;&quot; width=&quot;576&quot;&gt;
&lt;p&gt;mruby単体でもコンパイラやVMを持っていますが、それだとRaspberry Pi Picoで動かすにはちょっとメモリが足りなかったのもあり、開発されたようです。&lt;/p&gt;
&lt;p&gt;PicoRubyは、限られたリソースでmruby互換のコードを動かすだけでなく、以下のような特徴を備えてます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;フラッシュメモリ上のファイルシステムをFATで実装&lt;/li&gt;
&lt;li&gt;動的コンパイルの仕組みを導入、ファイルシステム上のコードをrequireも可能に&lt;/li&gt;
&lt;li&gt;USBのマスストレージクラスに対応して、簡単にファイルを読み書きできる&lt;/li&gt;
&lt;li&gt;などなど&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらの特徴を備えることにより、単なる言語のマイコンポーティングを超えた統合された環境として実装されています。hasumikinさんもMicroPythonについて言及されてますが、PicoRubyによって、mrubyがMicroPythonに肩を並べるところまできたのではないかと思います。&lt;/p&gt;
&lt;h2 id=&quot;r2p2とは&quot;&gt;R2P2とは？&lt;a href=&quot;#r2p2とは&quot; aria-label=&quot;Link to heading &#39;R2P2とは？&#39;&quot; data-heading-content=&quot;R2P2とは？&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;R2P2とは、PicoRubyのアプリケーションとして、シリアル通信でアクセスできる簡易シェルを実装したものです。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;Clipboard01.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PicoRuby Shellが起動した様子&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;中身では、以下のようなことを行ってます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/picoruby/R2P2/blob/master/src/main.c&quot;&gt;main.c で main_task.rbを起動&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/picoruby/R2P2/blob/master/mrblib/main_task.rb&quot;&gt;main_task.rbでShellを起動&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;shellの実装はpicoruby/mrbgemsにあるので、R2P2は、アプリケーションの実装ではなく、エントリーポイントやターゲットにあわせたビルド環境の提供を行う役割になってます。&lt;/p&gt;
&lt;h2 id=&quot;r2p2-esp32とは&quot;&gt;R2P2-ESP32とは？&lt;a href=&quot;#r2p2-esp32とは&quot; aria-label=&quot;Link to heading &#39;R2P2-ESP32とは？&#39;&quot; data-heading-content=&quot;R2P2-ESP32とは？&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;R2P2をESP32に移植したものです。ビルド環境としてESP-IDFを利用するので、picorubyのコードはESP-IDFの作法のcomponent（picoruby-esp32）としてビルドする形式を取っています。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://qiita.com/Y_uuu/items/2f9910284b7dfb57d55d&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;PicoRubyをESP32マイコン上で動かすR2P2-ESP32のはじめかた - Qiita&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;R2P2 はRaspberry Pi Pico上で動作する PicoRuby で書かれたシェルシステムです。 私はこのR2P2をESP32という別のマイコンで動作させる取り組みをしています。先日、 R2P2-ESP32 という名前でGitHubリポジトリも公開しました。 ...&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;Qiita&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-ffadffb9.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;iframe src=&quot;https://hatenablog-parts.com/embed?url=https%3A%2F%2Fdevelopers.techouse.com%2Fentry%2FRubyKaigi-2025-okazaki-day3&quot; title=&quot;RubyKaigi 2025 - Porting PicoRuby to Another Microcontroller ESP32(Day3) - Techouse Developers Blog&quot; class=&quot;embed-card embed-blogcard&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;&quot;&gt;&lt;/iframe&gt;
&lt;h2 id=&quot;picorubyはどんな要素から構成されるのか&quot;&gt;PicoRubyはどんな要素から構成されるのか？&lt;a href=&quot;#picorubyはどんな要素から構成されるのか&quot; aria-label=&quot;Link to heading &#39;PicoRubyはどんな要素から構成されるのか？&#39;&quot; data-heading-content=&quot;PicoRubyはどんな要素から構成されるのか？&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/picoruby/picoruby/tree/ff5693303ff27c5a11d3cb5cb0db7a29db9171dd/mrbgems&quot;&gt;picoruby/mrbgems&lt;/a&gt;以下には、Rubyコードから使うgemや、コンパイラのバイナリや、mrubyやmruby/cのVMコードなど色々なレイヤーのmrbgemが並んでいます。&lt;/p&gt;
&lt;p&gt;全体像を理解する上で重要なmrbgemは以下のあたりかなと思います。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mruby-compiler2
&lt;ul&gt;
&lt;li&gt;Prismパーサーを取り込んでコンパイラが実装されています。ホスト側でのmrbcでも使われますし、マイコン上の実行中も使われます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;picoruby-mruby
&lt;ul&gt;
&lt;li&gt;lib/にmrubyのリポジトリがサブモジュールとして取り込まれています。VMやmruby用のgemが参照されています。&lt;/li&gt;
&lt;li&gt;src/にはmrubyには元々含まれてないタスク機能に必要なtask.cなどが居たりします。&lt;/li&gt;
&lt;li&gt;mruby本家から改造が入っているので、hasumikin/mrubyを参照してます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;picoruby-mrubyc
&lt;ul&gt;
&lt;li&gt;lib/にmruby/cのリポジトリがサブモジュールとして取り込まれています。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;picoruby-filesystem-fat
&lt;ul&gt;
&lt;li&gt;PCで使うように使うにはファイルシステムが大切です。こちらではFATのコードをビルドしてファイルシステムを実現してます、&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;picoruby-machine
&lt;ul&gt;
&lt;li&gt;Sleep処理など、VMの実行に必要なHW依存部を定義しています。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;picoruby-sandbox
&lt;ul&gt;
&lt;li&gt;コンパイラを使って動的にコードをロードして実行するための仕組みを提供してます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ビルドも含めて詳しく知りたい方は、以下の記事を読まれると良いかもしれません。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://hasumikin.com/?2023/11/28/how-to-walk-through-mruby-family.html&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;hasumikin.com&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;hasumikin is a programmer.&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;hasumikin.com&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;h2 id=&quot;microrubyとは&quot;&gt;MicroRubyとは？&lt;a href=&quot;#microrubyとは&quot; aria-label=&quot;Link to heading &#39;MicroRubyとは？&#39;&quot; data-heading-content=&quot;MicroRubyとは？&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;MicroRubyとは、RubyKaigi2025でhasumikinさんが&lt;a href=&quot;https://rubykaigi.org/2025/presentations/hasumikin.html&quot;&gt;発表&lt;/a&gt;したPicoRubyから派生した実装です。ざっくりいうとVMがmruby/cベースから、mrubyベースに変わっています。PicoRubyとの比較は、以下のhasumikinさん発表時の資料がわかりやすいと思います。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;RubyKaigi2025 @hasumikin さんスライドより&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;その他参考になる記事はこちら。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://hasumikin.com/2025/05/05/MicroRuby.html&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;RubyKaigi 2025 で発表したMicroRubyとはなんだったのか - hasumikin.com&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;RubyKaigi 2025 で発表したMicroRubyとはなんだったのか&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;hasumikin.com&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;p&gt;特に面白いのは、mruby/cの特徴であるマルチタスク機能をmrubyに取り込んでいる点です。以下のあたりで実装されてます。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://github.com/picoruby/picoruby/blob/ff5693303ff27c5a11d3cb5cb0db7a29db9171dd/mrbgems/picoruby-mruby/src/task.c&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;picoruby/mrbgems/picoruby-mruby/src/task.c at ff5693303ff27c5a11d3cb5cb0db7a29db9171dd · picoruby/picoruby&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;PicoRuby is the smallest Ruby implementation for one-chip microcontrollers - picoruby/picoruby&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;GitHub&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-9737e9ef.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;h3 id=&quot;picorubyとmicrorubyは別のリポジトリ&quot;&gt;PicoRubyとMicroRubyは別のリポジトリ？&lt;a href=&quot;#picorubyとmicrorubyは別のリポジトリ&quot; aria-label=&quot;Link to heading &#39;PicoRubyとMicroRubyは別のリポジトリ？&#39;&quot; data-heading-content=&quot;PicoRubyとMicroRubyは別のリポジトリ？&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;いいえ、今は同じpicorubyのリポジトリ上で開発されています。&lt;/p&gt;
&lt;p&gt;各mrbgemの内部で、コンパイルオプションにより、PicoRuby向けと、MicroRuby向けの実装のどちらかが選ばれてビルドされています。&lt;/p&gt;
&lt;h2 id=&quot;どうやってr2p2をビルドするのか&quot;&gt;どうやってR2P2をビルドするのか？&lt;a href=&quot;#どうやってr2p2をビルドするのか&quot; aria-label=&quot;Link to heading &#39;どうやってR2P2をビルドするのか？&#39;&quot; data-heading-content=&quot;どうやってR2P2をビルドするのか？&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;rakeでビルドできますが、現時点での最新版だと以下のようなオプションが選べるようです。&lt;/p&gt;
&lt;p&gt;PicoRubyとMicroRubyそれぞれについて、Raspberry Pi Pico, Pico-W, Pico2, Pico2-Wがターゲットとして選択できます。&lt;/p&gt;
&lt;p&gt;私は試したこと無いのですが、Posixビルドもできるらしいので、Linuxでもデバイス依存しない部分は試せるようです。&lt;/p&gt;
&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ rake -T
rake microruby:pico2:clean    # Clean microruby for pico2 (both debug and prod)
rake microruby:pico2:debug    # Build microruby for pico2 (debug)
rake microruby:pico2:prod     # Build microruby for pico2 (prod)
rake microruby:pico2_w:clean  # Clean microruby for pico2_w (both debug and prod)
rake microruby:pico2_w:debug  # Build microruby for pico2_w (debug)
rake microruby:pico2_w:prod   # Build microruby for pico2_w (prod)
rake microruby:pico:clean     # Clean microruby for pico (both debug and prod)
rake microruby:pico:debug     # Build microruby for pico (debug)
rake microruby:pico:prod      # Build microruby for pico (prod)
rake microruby:pico_w:clean   # Clean microruby for pico_w (both debug and prod)
rake microruby:pico_w:debug   # Build microruby for pico_w (debug)
rake microruby:pico_w:prod    # Build microruby for pico_w (prod)
rake picoruby:pico2:clean     # Clean picoruby for pico2 (both debug and prod)
rake picoruby:pico2:debug     # Build picoruby for pico2 (debug)
rake picoruby:pico2:prod      # Build picoruby for pico2 (prod)
rake picoruby:pico2_w:clean   # Clean picoruby for pico2_w (both debug and prod)
rake picoruby:pico2_w:debug   # Build picoruby for pico2_w (debug)
rake picoruby:pico2_w:prod    # Build picoruby for pico2_w (prod)
rake picoruby:pico:clean      # Clean picoruby for pico (both debug and prod)
rake picoruby:pico:debug      # Build picoruby for pico (debug)
rake picoruby:pico:prod       # Build picoruby for pico (prod)
rake picoruby:pico_w:clean    # Clean picoruby for pico_w (both debug and prod)
rake picoruby:pico_w:debug    # Build picoruby for pico_w (debug)
rake picoruby:pico_w:prod     # Build picoruby for pico_w (prod)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ビルドの仕組みは、rakeとCMakeが連動していて、かつ多段でビルドしたり、生成されるバイナリが複数あったりと、すこし複雑です。&lt;/p&gt;
&lt;p&gt;またリポジトリもgit サブモジュールで複数のリポジトリが階層関係を持っています。下の図にその関係を図示してます。&lt;/p&gt;
&lt;p&gt;ビルド全体の詳細を理解するには各サブモジュールのCMakeList.txtやRakefileも確認する必要があります。&lt;/p&gt;
&lt;p&gt;R2P2は、picorubyを内包する形になっています。ESP32の場合は、ESP-IDFのcomponentとして、picorubyを扱うために、picoruby-esp32が存在しています。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://imgr.whimsical.com/object/KkLWie63aAa9ujMCXVqcXv&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;サブモジュールの関係&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;picorubyの構成のポイントとしては、現在はmrubyのコードは、本家をフォークしたhasumikin/mrubyを参照してる点と、mrubycは本家を参照している点、picoruby/mruby-compiler2が、ruby/prismを参照している点あたりかなと思います。&lt;/p&gt;
&lt;h3 id=&quot;r2p2-espの場合は&quot;&gt;R2P2-ESPの場合は？&lt;a href=&quot;#r2p2-espの場合は&quot; aria-label=&quot;Link to heading &#39;R2P2-ESPの場合は？&#39;&quot; data-heading-content=&quot;R2P2-ESPの場合は？&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;コマンドは異なりますが、ESP-IDFが有効な環境で、R2P2同様にrakeでビルドできます。&lt;/p&gt;
&lt;h3 id=&quot;esp32でmicorrubyは使える&quot;&gt;ESP32でMicorRubyは使える？&lt;a href=&quot;#esp32でmicorrubyは使える&quot; aria-label=&quot;Link to heading &#39;ESP32でMicorRubyは使える？&#39;&quot; data-heading-content=&quot;ESP32でMicorRubyは使える？&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;今は使えません。&lt;/p&gt;
&lt;p&gt;現状のpicorubyのESP32向けビルド設定（&lt;a href=&quot;https://github.com/picoruby/picoruby/blob/ff5693303ff27c5a11d3cb5cb0db7a29db9171dd/build_config/xtensa-esp.rb&quot;&gt;xtensa-esp.rb&lt;/a&gt;）では、PicoRubyのビルド用の設定しか用意されていないです。&lt;/p&gt;
&lt;p&gt;また、picoruby/mrbgems以下の必須のmruby向けのポートが存在していません。&lt;/p&gt;
&lt;h2 id=&quot;どう使えばよいのかあなたはどう使いたいのか&quot;&gt;どう使えばよいのか？（あなたはどう使いたいのか？）&lt;a href=&quot;#どう使えばよいのかあなたはどう使いたいのか&quot; aria-label=&quot;Link to heading &#39;どう使えばよいのか？（あなたはどう使いたいのか？）&#39;&quot; data-heading-content=&quot;どう使えばよいのか？（あなたはどう使いたいのか？）&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;使い方は以下のようなパターンに分かれると思います。&lt;/p&gt;
&lt;h3 id=&quot;ハードはこだわらずrubyのコードでセンサーやデバイスを使いたい&quot;&gt;ハードはこだわらずRubyのコードでセンサーやデバイスを使いたい&lt;a href=&quot;#ハードはこだわらずrubyのコードでセンサーやデバイスを使いたい&quot; aria-label=&quot;Link to heading &#39;ハードはこだわらずRubyのコードでセンサーやデバイスを使いたい&#39;&quot; data-heading-content=&quot;ハードはこだわらずRubyのコードでセンサーやデバイスを使いたい&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Raspberry Pi Pico2 あたりで、R2P2のビルド済みバイナリを書き込んで、Rubyで開発するのが王道と思います。（ただしmrbgemで対応できてないデバイスはC言語でバインドを書く必要がでてくることもあり）&lt;/p&gt;
&lt;h3 id=&quot;m5stackとかのデバイスでr2p2使いたい&quot;&gt;M5StackとかのデバイスでR2P2使いたい&lt;a href=&quot;#m5stackとかのデバイスでr2p2使いたい&quot; aria-label=&quot;Link to heading &#39;M5StackとかのデバイスでR2P2使いたい&#39;&quot; data-heading-content=&quot;M5StackとかのデバイスでR2P2使いたい&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;R2P2-ESP32を使うことなります。&lt;/p&gt;
&lt;p&gt;現状はコードの転送のたびに、フラッシュを上書きする必要があったりするので、開発の利便性に劣るところがありますが、ハードの選択肢が広いのが魅力です。&lt;/p&gt;
&lt;h3 id=&quot;microrubyでr2p2使いたい&quot;&gt;MicroRubyでR2P2使いたい&lt;a href=&quot;#microrubyでr2p2使いたい&quot; aria-label=&quot;Link to heading &#39;MicroRubyでR2P2使いたい&#39;&quot; data-heading-content=&quot;MicroRubyでR2P2使いたい&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;現状は、Raspberry Pi Pico2 で &lt;code&gt;rake microruby:pico2:prod&lt;/code&gt; とかするのが良さそうです。Pico1だとメモリ不足しがちなので。&lt;/p&gt;
&lt;h3 id=&quot;r2p2以外のアプリケーションをpicorubymicorrubyで作りたい&quot;&gt;R2P2以外のアプリケーションをPicoRuby/MicorRubyで作りたい&lt;a href=&quot;#r2p2以外のアプリケーションをpicorubymicorrubyで作りたい&quot; aria-label=&quot;Link to heading &#39;R2P2以外のアプリケーションをPicoRuby/MicorRubyで作りたい&#39;&quot; data-heading-content=&quot;R2P2以外のアプリケーションをPicoRuby/MicorRubyで作りたい&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;R2P2の実装を雛形にして、起動のシーケンスを書き換えることで、すぐ作り始めることができます。&lt;/p&gt;
&lt;h2 id=&quot;今後の展望&quot;&gt;今後の展望&lt;a href=&quot;#今後の展望&quot; aria-label=&quot;Link to heading &#39;今後の展望&#39;&quot; data-heading-content=&quot;今後の展望&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;思っていることをつらつらと。&lt;/p&gt;
&lt;p&gt;個人的にはESP32推しなので、コメントがそちらに偏りますが、MicroRubyがより安定したら、ESP32向けの対応も進むのかな、と思ってますが、どうなのかな？（色々実装を追加することで、個人的なプロジェクトではMicroRubyをESP32で動かしてる実績ありますが、本家の方向性とは異なるので）&lt;/p&gt;
&lt;p&gt;今準備中のシリアルによるファイル転送も取り込まれると、ESP32でも毎回ビルドしたりフラッシュの領域ごと上書きとかは不要になるはず。&lt;/p&gt;
&lt;p&gt;Raspberry Pi Pico2でも、最近はPSRAM付きボードが出てきているので、メモリ面では結構緩和される日が来るのかな、と思ったりします。&lt;/p&gt;
</content>
</entry>
<entry>
<title>PicoRuby向けのM5Unified/GFX mrbgemを作る話</title>
<id>https://blog.silentworlds.info/2025/12/picorubyxiang-kenom5unified-m5gfx-mrbgemwozuo-ruhua/</id>
<link rel="alternate" type="text/html" href="https://blog.silentworlds.info/2025/12/picorubyxiang-kenom5unified-m5gfx-mrbgemwozuo-ruhua/"/>
<published>2025-12-02T02:43:02+09:00</published>
<updated>2026-05-09T12:31:02+09:00</updated>
<category term="ESP32"/>
<category term="mruby"/>
<category term="Tech"/>
<summary>この記事は、mrubyファミリ (組み込み向け軽量Ruby) Advent Calendar 2025に参加しています。</summary>
<content type="html" xml:base="https://blog.silentworlds.info/2025/12/picorubyxiang-kenom5unified-m5gfx-mrbgemwozuo-ruhua/">&lt;p&gt;&lt;img src=&quot;logo1.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;この記事は、&lt;a href=&quot;https://qiita.com/advent-calendar/2025/mruby-family&quot;&gt;mrubyファミリ (組み込み向け軽量Ruby) Advent Calendar 2025&lt;/a&gt;に参加しています。&lt;/p&gt;
&lt;p&gt;本日の記事では、先日の&lt;a href=&quot;https://tokyurubykaigi.github.io/tokyu16/&quot;&gt;TokyuRuby会議16&lt;/a&gt; でLTした内容をブログ記事としても残しておきたいと思います。&lt;/p&gt;
&lt;iframe id=&quot;talk_frame_1472590&quot; class=&quot;speakerdeck-iframe&quot; src=&quot;//speakerdeck.com/player/f38a3cbf4ff045bd9423bb4efd9265fa&quot; width=&quot;710&quot; height=&quot;399&quot; style=&quot;aspect-ratio:710/399; border:0; padding:0; margin:0; background:transparent;&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt;&lt;/iframe&gt;
&lt;h2 id=&quot;esp32とpicoruby&quot;&gt;ESP32とPicoRuby&lt;a href=&quot;#esp32とpicoruby&quot; aria-label=&quot;Link to heading &#39;ESP32とPicoRuby&#39;&quot; data-heading-content=&quot;ESP32とPicoRuby&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/picoruby/picoruby&quot;&gt;PicoRuby&lt;/a&gt;はもともと、@hasumikin さんがRaspberry Pi Picoをターゲットとしてスタートしたプロジェクトです。&lt;/p&gt;
&lt;p&gt;その後、&lt;a href=&quot;https://zenn.dev/y_uuu/scraps/8f8dda1c74dd44&quot;&gt;ESP32への対応&lt;/a&gt;も@Yuuuさんの尽力もありなされています。(&lt;a href=&quot;https://github.com/picoruby&quot;&gt;picoruby-esp32&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;PicoRubyをESP32のcomponentsとしてビルドしてリンクするような形でポーティングされています。&lt;/p&gt;
&lt;p&gt;現在は主なESP32シリーズで、PicoRubyを動かすことができるようになっています。&lt;/p&gt;
&lt;h2 id=&quot;m5stackシリーズを使いたい&quot;&gt;M5Stackシリーズを使いたい&lt;a href=&quot;#m5stackシリーズを使いたい&quot; aria-label=&quot;Link to heading &#39;M5Stackシリーズを使いたい&#39;&quot; data-heading-content=&quot;M5Stackシリーズを使いたい&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ESP32を使いたい理由の一つとして、市場にいろいろなバリエーションのESP32をコアとしてパッケージングされた製品があるという点があると思います。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;data-src-image-c01787ed-82d5-4d2e-bf0e-5affd112361e.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;m5unifiedgfxを使いたい&quot;&gt;M5Unified/GFXを使いたい&lt;a href=&quot;#m5unifiedgfxを使いたい&quot; aria-label=&quot;Link to heading &#39;M5Unified/GFXを使いたい&#39;&quot; data-heading-content=&quot;M5Unified/GFXを使いたい&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;M5シリーズにはディスプレイやボタンやスピーカーなど色々なデバイスが標準搭載されていますが、機種を変えるたびにAPIの仕様が微妙に異なることがあったのを解決するために、機種をまたいだAPIとして、M5Unified（グラフィクスはM5GFXが担当）というライブラリがあります。Arduino以外にもESP-IDF環境でも利用可能です。言語はC++です。&lt;/p&gt;
&lt;p&gt;機種を違いを意識しないでプログラミングするには、これを利用しない手はないわけです。&lt;/p&gt;
&lt;p&gt;しかし当然PicoRubyには対応していないので、PicoRubyから使うには各メソッドのバインディングを書く必要があります&lt;/p&gt;
&lt;h2 id=&quot;どうやって大量のバインディングをさばくか&quot;&gt;どうやって大量のバインディングをさばくか&lt;a href=&quot;#どうやって大量のバインディングをさばくか&quot; aria-label=&quot;Link to heading &#39;どうやって大量のバインディングをさばくか&#39;&quot; data-heading-content=&quot;どうやって大量のバインディングをさばくか&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;メソッドの数が少なければ、手作業でバインディング書けばよいところではあるのですが、幅広い機能を抽象化しているため、メソッドの数が数百もあります。&lt;/p&gt;
&lt;p&gt;これを手作業で書くのはあまり現実的ではないというか、あまりやりたくない作業です。&lt;/p&gt;
&lt;p&gt;たとえばCRubyであれば、Ruby-FFIというものがあり、Ｃ言語のライブラリをダイナミックリンクして、各関数のインタフェースを自動で定義する機能があります。&lt;/p&gt;
&lt;p&gt;こういう場面で役に立つ機能なのですが、マイコン上で動くmrubyではそのままではFFIを動かすことはできません。&lt;/p&gt;
&lt;p&gt;そのため、Claude Codeでどこまでやれるか試してみることにしました。&lt;/p&gt;
&lt;h2 id=&quot;aiに仕事をやらせるための手順&quot;&gt;AIに仕事をやらせるための手順&lt;a href=&quot;#aiに仕事をやらせるための手順&quot; aria-label=&quot;Link to heading &#39;AIに仕事をやらせるための手順&#39;&quot; data-heading-content=&quot;AIに仕事をやらせるための手順&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;これまでClaude Code使ってきた感覚として、漠然と大量の仕事をやらせても、途中でコンテキストが切れて、一貫性のある作業が難しくなります。&lt;/p&gt;
&lt;p&gt;そのため、作業をステップに分割しつつ、進捗もドキュメントに書きつつ、途中でとまって再開できるようなことを意識しつつ、作業してもらう必要あります。&lt;/p&gt;
&lt;p&gt;今回は以下のような手順でやってもらいました。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;実装対象の関数をC++ヘッダからスクリプトで抽出&lt;/li&gt;
&lt;li&gt;抽出した結果をYAMLにまとめる&lt;/li&gt;
&lt;li&gt;YAMLからmrubyバインディングのスケルトン関数を生成&lt;/li&gt;
&lt;li&gt;スケルトン関数を段階的に実装&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;中間生成物&quot;&gt;中間生成物&lt;a href=&quot;#中間生成物&quot; aria-label=&quot;Link to heading &#39;中間生成物&#39;&quot; data-heading-content=&quot;中間生成物&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;作業する中で、各メソッドは以下のようなYAMLで抽出されます。&lt;/p&gt;
&lt;pre class=&quot;highlight&quot; data-lang=&quot;YAML&quot;&gt;&lt;code&gt;classes:
- name: M5Unified
  namespace: m5::m5
  file: M5Unified.hpp
  methods:
  - name: getPin
    return_type: int8_t
    parameters:
    - type: pin_name_t
      name: name
    modifiers: []
    line: 250
  - name: getButton
    return_type: Button_Class&amp;amp;
    parameters:
    - type: size_t
      name: index
    modifiers: []
    line: 252
  - name: getDisplay
    return_type: M5GFX&amp;amp;
    parameters:
    - type: size_t
      name: index
    modifiers: []
    line: 256
  - name: getDisplayCount
    return_type: std::size_t
    parameters:
    - type: void
      name: &#39;&#39;
    modifiers:
    - const
    line: 260
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;これベースにをCのmruby/c用のバインディングの作法に則った形のスケルトン関数にします。&lt;/p&gt;
&lt;h2 id=&quot;結果&quot;&gt;結果&lt;a href=&quot;#結果&quot; aria-label=&quot;Link to heading &#39;結果&#39;&quot; data-heading-content=&quot;結果&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;まずは一番ニーズがあるであろう描画系を試してみました。&lt;/p&gt;
&lt;p&gt;よく使うであろうメソッドから対応して、100メソッドほど実装しました。&lt;/p&gt;
&lt;h4 id=&quot;全体-99180-55&quot;&gt;&lt;strong&gt;全体: 99/180 (55%)&lt;/strong&gt;&lt;a href=&quot;#全体-99180-55&quot; aria-label=&quot;Link to heading &#39;全体: 99/180 (55%)&#39;&quot; data-heading-content=&quot;全体: 99/180 (55%)&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;h5 id=&quot;m5unified-core-2020-100-&quot;&gt;M5Unified Core: 20/20 (100%) ✅&lt;a href=&quot;#m5unified-core-2020-100-&quot; aria-label=&quot;Link to heading &#39;M5Unified Core: 20/20 (100%) ✅&#39;&quot; data-heading-content=&quot;M5Unified Core: 20/20 (100%) ✅&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;M5GFX Color: 12/12 (100%) ✅&lt;/li&gt;
&lt;li&gt;M5GFX Draw: 30/30 (100%) ✅&lt;/li&gt;
&lt;li&gt;M5GFX Fill: 3/13 (23%)&lt;/li&gt;
&lt;li&gt;M5GFX Text: 9/31 (29%)&lt;/li&gt;
&lt;li&gt;M5GFX Image: 2/13 (15%)&lt;/li&gt;
&lt;li&gt;M5GFX Display: 9/29 (31%)&lt;/li&gt;
&lt;li&gt;M5GFX Low-level: 4/18 (22%)&lt;/li&gt;
&lt;li&gt;M5GFX Utility: 0/13 (0%)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;サンプルコード&quot;&gt;サンプルコード&lt;a href=&quot;#サンプルコード&quot; aria-label=&quot;Link to heading &#39;サンプルコード&#39;&quot; data-heading-content=&quot;サンプルコード&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;以下のコードを、/home/m5.rb として保存して、R2P2を起動させて実行してみます。&lt;/p&gt;
&lt;pre class=&quot;highlight&quot; data-lang=&quot;Ruby&quot;&gt;&lt;code&gt;r# M5Unified Basic Display Example
# Based on actual C extension implementation

require &#39;m5unified&#39;

puts &quot;Initializing M5Unified...&quot;

# Initialize M5
M5.begin

disp = M5.Display

w = disp.width
h = disp.height
puts &quot;Display: #{w}x#{h}&quot;

# Clear screen to black
disp.fill_screen(0x000000)

# Set text properties and display title
disp.set_text_color(0xFFFFFF)  # White
disp.set_text_size(2)
disp.set_cursor(10, 10)
disp.print(&quot;Hello M5!&quot;)

# Draw shapes with RGB888 colors
puts &quot;Drawing shapes...&quot;

# Red rectangle
disp.fill_rect(10, 40, 100, 60, 0xFF0000)

# Green circle
disp.fill_circle(w/2, h/2, 40, 0x00FF00)

# Blue line
disp.draw_line(0, 0, w-1, h-1, 0x0000FF)

# Yellow triangle (now implemented!)
disp.fill_triangle(w-80, h-40, w-30, h-60, w-10, h-20, 0xFFFF00)

# Cyan text label
disp.set_text_color(0x00FFFF)
disp.set_text_size(1)
disp.set_cursor(10, h-20)
disp.print(&quot;PicoRuby on M5&quot;)

puts &quot;Drawing complete!&quot;
puts &quot;Press Ctrl+C to exit&quot;

loop do
  M5.update
  sleep 0.1
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;m5.rb&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;ターゲットデバイス&quot;&gt;ターゲットデバイス&lt;a href=&quot;#ターゲットデバイス&quot; aria-label=&quot;Link to heading &#39;ターゲットデバイス&#39;&quot; data-heading-content=&quot;ターゲットデバイス&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;M5Stack FireとM5StickC Plust2でさっきのサンプルコード試してみました。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;無事、同じコードで、同じような描画がされましたね。&lt;/p&gt;
&lt;p&gt;M5Unifiedは自動でデバイス認識する機能があるため、特に機種を指定することなく違うLCDでも正しく動作します。&lt;/p&gt;
&lt;h2 id=&quot;課題&quot;&gt;課題&lt;a href=&quot;#課題&quot; aria-label=&quot;Link to heading &#39;課題&#39;&quot; data-heading-content=&quot;課題&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;おそらくこの調子でやれば、全メソッド制覇もできそうではあるのですが、そのメソッドのコードレビューと動作確認をするのがかなり大変です。&lt;/p&gt;
&lt;p&gt;また何かバージョンアップがあった時の追従も大変そうです。&lt;/p&gt;
&lt;p&gt;個人的に使う分にはいいのですが、継続的なメンテナンスが厳しそうなので、今後どうしたものか悩ましいです。&lt;/p&gt;
&lt;p&gt;またFFI的なアプローチもあるかなと思ったのですが、M5UnifiedがC++なので、Cと違って、シンボルテーブルを解析して、FFI的なものを自作するのも厳しそう、となっています。&lt;/p&gt;
&lt;p&gt;以下は、現在のPicoRuby mrbgem実装です。一応、導入方法も記載したので、試して頂くこともできるかと思います。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://github.com/kishima/mruby-m5unified&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;GitHub - kishima/mruby-m5unified&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;Contribute to kishima/mruby-m5unified development by creating an account on GitHub.&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;GitHub&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-5bab886b.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;p&gt;R2P2-ESP32に統合したブランチはこちら&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://github.com/kishima/R2P2-ESP32/tree/m5unified_dev3&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;GitHub - kishima/R2P2-ESP32 at m5unified_dev3&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;PicoRuby shell for ESP32. This project runs PicoRuby on ESP32 using picoruby-esp32.  - kishima/R2P2-ESP32&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;GitHub&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;
</content>
</entry>
<entry>
<title>チキントマト煮と鶏レバーペーストのレシピの記憶</title>
<id>https://blog.silentworlds.info/2025/11/tikintomatozhu-torebapesutonoresipinoji-yi-2/</id>
<link rel="alternate" type="text/html" href="https://blog.silentworlds.info/2025/11/tikintomatozhu-torebapesutonoresipinoji-yi-2/"/>
<published>2025-11-30T23:28:50+09:00</published>
<updated>2026-05-09T12:31:04+09:00</updated>
<summary>昨日はTokyuRuby会議１６があり、そこで差し入れ料理の投票で１位を取ることができました。食べて頂いたみなさん、ありがとうございました。</summary>
<content type="html" xml:base="https://blog.silentworlds.info/2025/11/tikintomatozhu-torebapesutonoresipinoji-yi-2/">&lt;p&gt;&lt;img src=&quot;Header.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;昨日はTokyuRuby会議１６があり、そこで差し入れ料理の投票で１位を取ることができました。食べて頂いたみなさん、ありがとうございました。&lt;/p&gt;
&lt;p&gt;長年スタッフ側で参加してて、いつか飯提供したい気持ちをずっと、温めてたんですが、今回は一般参加で飯提供の念願叶った上に、飯王までとれて最高でした。&lt;/p&gt;
&lt;p&gt;その時のレシピを自分のためにも残しておきます。&lt;/p&gt;
&lt;p&gt;分量は目分量でやってたので、そのあたりは適宜補完ください。&lt;/p&gt;
&lt;p&gt;今回の料理の品目アイデア出しのブレストにはChatGPTにも手伝っていただきました。ありがとう。&lt;/p&gt;
&lt;h2 id=&quot;チキントマト煮&quot;&gt;チキントマト煮&lt;a href=&quot;#チキントマト煮&quot; aria-label=&quot;Link to heading &#39;チキントマト煮&#39;&quot; data-heading-content=&quot;チキントマト煮&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;IMG_9069-1.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;3リットル分つくった&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;材料&quot;&gt;材料&lt;a href=&quot;#材料&quot; aria-label=&quot;Link to heading &#39;材料&#39;&quot; data-heading-content=&quot;材料&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;国産鶏むね肉（ハナマサで購入）&lt;/li&gt;
&lt;li&gt;トマト缶&lt;/li&gt;
&lt;li&gt;赤ワイン&lt;/li&gt;
&lt;li&gt;たまねぎ&lt;/li&gt;
&lt;li&gt;にんじん&lt;/li&gt;
&lt;li&gt;にんにく&lt;/li&gt;
&lt;li&gt;マッシュルーム&lt;/li&gt;
&lt;li&gt;ローリエの葉&lt;/li&gt;
&lt;li&gt;ローズマリー（生）&lt;/li&gt;
&lt;li&gt;塩&lt;/li&gt;
&lt;li&gt;コンソメの素&lt;/li&gt;
&lt;li&gt;オリーブオイル&lt;/li&gt;
&lt;li&gt;サラダオイル&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;下処理&quot;&gt;下処理&lt;a href=&quot;#下処理&quot; aria-label=&quot;Link to heading &#39;下処理&#39;&quot; data-heading-content=&quot;下処理&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;鶏肉はまず塩を強めに降って揉み込んで数十分おいておく&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_9068.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;鶏もも肉５枚分。包丁研いでなかったので、カット大変だった&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;塩で処理した鶏肉は水で洗い流して、余分な油を切り落として、一口サイズに切り分ける&lt;/p&gt;
&lt;p&gt;切り分けた肉は皮を背にして、サラダオイルを引いたフライパンで表面を焼いて、余分な脂を落とす&lt;/p&gt;
&lt;p&gt;赤ワインは半量くらいまで煮詰めておく&lt;/p&gt;
&lt;h3 id=&quot;本調理&quot;&gt;本調理&lt;a href=&quot;#本調理&quot; aria-label=&quot;Link to heading &#39;本調理&#39;&quot; data-heading-content=&quot;本調理&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;鍋でオリーブオイルを引いて、にんにく、玉ねぎ入れる。塩を軽く振る。&lt;/p&gt;
&lt;p&gt;玉ねぎを焦げ付かないよう、玉ねぎが小麦色程度まで炒める。&lt;/p&gt;
&lt;p&gt;トマト缶を入れて、とろみが出るまで煮詰める。&lt;/p&gt;
&lt;p&gt;鍋に、焼いた鶏肉、煮詰めた赤ワイン、カットしたマッシュルーム、刻んだ人参、ローリエの葉、ローズマリー、コンソメの素、水を入れる&lt;/p&gt;
&lt;p&gt;しばらく煮込む&lt;/p&gt;
&lt;p&gt;味見して、必要ならローリエ、ローズマリーを引き上げる。&lt;/p&gt;
&lt;p&gt;味を見て、塩で調整。&lt;/p&gt;
&lt;p&gt;シャトルシェフの保温ケースに入れて、２，３時間おく&lt;/p&gt;
&lt;p&gt;（最初、ローズマリーの香りが結構強く出ていたが、保温することで全体的に味や香りがまろやかになり、肉もほろほろになって最高だったので、この２，３時間の保温は重要）&lt;/p&gt;
&lt;p&gt;完成&lt;/p&gt;
&lt;h2 id=&quot;鶏レバーペースト&quot;&gt;鶏レバーペースト&lt;a href=&quot;#鶏レバーペースト&quot; aria-label=&quot;Link to heading &#39;鶏レバーペースト&#39;&quot; data-heading-content=&quot;鶏レバーペースト&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;IMG_9064.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;クラッカーと合わせて&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;材料-1&quot;&gt;材料&lt;a href=&quot;#材料-1&quot; aria-label=&quot;Link to heading &#39;材料&#39;&quot; data-heading-content=&quot;材料&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;国産鶏レバー（ハナマサ）&lt;/li&gt;
&lt;li&gt;玉ねぎ&lt;/li&gt;
&lt;li&gt;にんにく&lt;/li&gt;
&lt;li&gt;生クリーム&lt;/li&gt;
&lt;li&gt;バターたくさん&lt;/li&gt;
&lt;li&gt;塩&lt;/li&gt;
&lt;li&gt;こしょう&lt;/li&gt;
&lt;li&gt;ローリエの葉&lt;/li&gt;
&lt;li&gt;イタリアンパセリ&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;下処理-1&quot;&gt;下処理&lt;a href=&quot;#下処理-1&quot; aria-label=&quot;Link to heading &#39;下処理&#39;&quot; data-heading-content=&quot;下処理&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;レバーを水で洗う。ハツがついていたら外す。&lt;/p&gt;
&lt;p&gt;血の塊が血管につまってたらしごいて出す&lt;/p&gt;
&lt;p&gt;（できれば包丁でレバーを開いたほうがよい）&lt;/p&gt;
&lt;p&gt;水を交換しながら濁りがすくなくなるまで洗って、しばらく水につけておく&lt;/p&gt;
&lt;h3 id=&quot;本調理-1&quot;&gt;本調理&lt;a href=&quot;#本調理-1&quot; aria-label=&quot;Link to heading &#39;本調理&#39;&quot; data-heading-content=&quot;本調理&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;玉ねぎはみじん切りにする&lt;/p&gt;
&lt;p&gt;フライパンで玉ねぎにんにくをオリーブオイルで炒める&lt;/p&gt;
&lt;p&gt;レバーを入れて軽く炒める&lt;/p&gt;
&lt;p&gt;生クリームとローリエ。コンソメ、塩コショウを入れて少し煮込む（煮立てすぎるとクリームの油分が分離するので弱火で）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_9042.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;レバー＆ハツ４パック分&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;レバーに火が通ったら、火を止めて、ローリエを引き上げる（レバーに火を通しすぎると滑らかさが減るのでいい塩梅で火を通す）&lt;/p&gt;
&lt;p&gt;網で裏ごしする（量が多いと、とても大変なのでミキサー推奨）&lt;/p&gt;
&lt;p&gt;バターも予熱で溶かして、全体をよく混ぜる&lt;/p&gt;
&lt;p&gt;味見をして塩で調整&lt;/p&gt;
&lt;p&gt;容器に入れて冷蔵庫で冷やす&lt;/p&gt;
&lt;p&gt;完成&lt;/p&gt;
&lt;p&gt;食べるときにパセリを散らすとよい&lt;/p&gt;
&lt;h2 id=&quot;tokyuruby会議16での提供のようす&quot;&gt;TokyuRuby会議16での提供のようす&lt;a href=&quot;#tokyuruby会議16での提供のようす&quot; aria-label=&quot;Link to heading &#39;TokyuRuby会議16での提供のようす&#39;&quot; data-heading-content=&quot;TokyuRuby会議16での提供のようす&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;IMG_9075.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;チキントマト煮をシャトルシェフごと持ち込んだ&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_9074.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;リッツと合わせて提供&lt;/em&gt;&lt;/p&gt;
</content>
</entry>
<entry>
<title>PicoRubyベースのミニコンピュータ（PicoCalc編）</title>
<id>https://blog.silentworlds.info/2025/11/picorubybesunominikonpiyuta-picocalcbian/</id>
<link rel="alternate" type="text/html" href="https://blog.silentworlds.info/2025/11/picorubybesunominikonpiyuta-picocalcbian/"/>
<published>2025-11-26T08:58:48+09:00</published>
<updated>2026-05-09T12:31:06+09:00</updated>
<category term="mruby"/>
<summary>以前の記事で、PicoCalcが届いたら、PicoRubyを動かしてみたい、というお話をしていました。</summary>
<content type="html" xml:base="https://blog.silentworlds.info/2025/11/picorubybesunominikonpiyuta-picocalcbian/">&lt;p&gt;&lt;img src=&quot;IMG_64702.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;以前の記事で、PicoCalcが届いたら、PicoRubyを動かしてみたい、というお話をしていました。&lt;/p&gt;
&lt;p&gt;/2025/06/picorubybesunominikonpiyuta/&lt;/p&gt;
&lt;p&gt;9月頭に実際に&lt;a href=&quot;https://www.clockworkpi.com/&quot;&gt;PicoCalc&lt;/a&gt;が実際届きました。5月に注文していたので、4カ月弱で届いたことになりますね。&lt;/p&gt;
&lt;p&gt;PicoCalcはRaspberry pi Picoで動くコンソールマシンです。&lt;/p&gt;
&lt;p&gt;320x320の液晶とキーボードにスピーカーなどもついてきます。&lt;/p&gt;
&lt;p&gt;付属のPicoにブートローダソフトがあらかじめインストールされており、SDからアプリを起動することができます。&lt;/p&gt;
&lt;p&gt;インストールされているバイナリのソースはこちら。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://github.com/clockworkpi/PicoCalc&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;GitHub - clockworkpi/PicoCalc: A calculator like nothing you&amp;#39;ve ever seen before, right?&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;A calculator like nothing you&amp;#39;ve ever seen before, right? - clockworkpi/PicoCalc&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;GitHub&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-cdb5f5b0.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;p&gt;以下、PicoCalcの写真たち。&lt;/p&gt;
&lt;img src=&quot;IMG_6185.JPG&quot; alt=&quot;&quot; width=&quot;480&quot;&gt;
&lt;p&gt;&lt;em&gt;外箱&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_6187.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;組立前の中身&lt;/em&gt;&lt;/p&gt;
&lt;img src=&quot;IMG_6203.jpg&quot; alt=&quot;&quot; width=&quot;392&quot;&gt;
&lt;p&gt;&lt;em&gt;PicoMiteを起動させたところ&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;開発環境&quot;&gt;開発環境&lt;a href=&quot;#開発環境&quot; aria-label=&quot;Link to heading &#39;開発環境&#39;&quot; data-heading-content=&quot;開発環境&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ファームウェア側をいじることになるため、毎回手作業でファイルコピーするのは面倒です。そのためPicoProbeを繋いでみました。ただ、そのままで背面からデバッガー用の線を出すのはちょっと厳しかったので、ケースの背面の一部だけカットして線を通す穴を作ってます。&lt;/p&gt;
&lt;img src=&quot;IMG_6274.JPG&quot; alt=&quot;&quot; width=&quot;480&quot;&gt;
&lt;p&gt;&lt;em&gt;Probeを接続したところ&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;改造の方法&quot;&gt;改造の方法&lt;a href=&quot;#改造の方法&quot; aria-label=&quot;Link to heading &#39;改造の方法&#39;&quot; data-heading-content=&quot;改造の方法&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;PicoCalcでPicoRubyを動かすためには、PicoRubyの文字列の入出力周りを置き換える必要があります。&lt;/p&gt;
&lt;p&gt;PicoRuby Overflow Kaigiで展示した以下の資料で考え方を説明しています。&lt;/p&gt;
&lt;iframe id=&quot;talk_frame_1410454&quot; class=&quot;speakerdeck-iframe&quot; src=&quot;//speakerdeck.com/player/40df232090f545f5937f82d364e041bb&quot; width=&quot;710&quot; height=&quot;502&quot; style=&quot;aspect-ratio:710/502; border:0; padding:0; margin:0; background:transparent;&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;em&gt;PicoRuby Overflow Kaigi&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;この時は、まだ実機が無かったので、類似の液晶コントローラで動いている液晶と、キーボードはI2C対応の別のM5Stackから出ているやつを使ってます。&lt;/p&gt;
&lt;p&gt;実際にPicoCalc実機に移植するときは、最低限の修正で１日で動かすことができました。&lt;/p&gt;
&lt;p&gt;コードはこちら。PicoCalcお持ちであれば試せます。私はRpi-Pico 2で試してます。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://github.com/kishima/picocalc-R2P2&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;GitHub - kishima/picocalc-R2P2: PicoRuby shell for PicoCalc&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;PicoRuby shell for PicoCalc. Contribute to kishima/picocalc-R2P2 development by creating an account on GitHub.&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;GitHub&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;p&gt;実際に起動させるときには、横幅の解像度が標準より狭いので、そのままだとPicoRubyのロゴが表示されません。そのためShell起動処理にあるロゴの絵文字を手作業でいじって、ぎりぎり収まるように修正してます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_6470.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PicoRubyを起動させたところ&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;一応、基本的な機能は使えるはずです。&lt;/p&gt;
&lt;h3 id=&quot;課題&quot;&gt;課題&lt;a href=&quot;#課題&quot; aria-label=&quot;Link to heading &#39;課題&#39;&quot; data-heading-content=&quot;課題&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;画面のスクロールするときに全画面かきなおしているため、スクロールがとても遅いです。液晶コントローラとうまく連携して高速描画やスクロール処理するなど、改善が必要です。&lt;/p&gt;
&lt;h2 id=&quot;今後のこと&quot;&gt;今後のこと&lt;a href=&quot;#今後のこと&quot; aria-label=&quot;Link to heading &#39;今後のこと&#39;&quot; data-heading-content=&quot;今後のこと&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;いったん、動かせて満足しちゃったところはありますが、自作のESP32コアの基板と連携させたりできたらいいな、とか、この素晴らしい機体を生かす方法は考えていきたいと思っています。&lt;/p&gt;
</content>
</entry>
<entry>
<title>昔、Arduino Uno（RAM 2KB）でmrubyのバイトコードを走らせた話</title>
<id>https://blog.silentworlds.info/2025/10/xi-arduino-unodemrubynobaitokodowozou-rasetahua-2/</id>
<link rel="alternate" type="text/html" href="https://blog.silentworlds.info/2025/10/xi-arduino-unodemrubynobaitokodowozou-rasetahua-2/"/>
<published>2025-10-14T00:27:02+09:00</published>
<updated>2026-05-09T12:31:09+09:00</updated>
<category term="mruby"/>
<category term="Tech"/>
<summary>最近、生活が落ち着いてきたので、また電子工作やmrubyを触るようになりました。</summary>
<content type="html" xml:base="https://blog.silentworlds.info/2025/10/xi-arduino-unodemrubynobaitokodowozou-rasetahua-2/">&lt;h2 id=&quot;背景&quot;&gt;背景&lt;a href=&quot;#背景&quot; aria-label=&quot;Link to heading &#39;背景&#39;&quot; data-heading-content=&quot;背景&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;最近、生活が落ち着いてきたので、また電子工作やmrubyを触るようになりました。&lt;/p&gt;
&lt;p&gt;ここ数年はPicoRubyが一部で盛り上がっており、私も勉強会に参加しつつエンジョイしているところであります。&lt;/p&gt;
&lt;p&gt;PicoRubyのすごいところは、Raspberry Pi Picoのような264kBというメモリが少なめの環境でも、マイコン上でmrubyのコードをコンパイルして、実行できるところです。これまでいちいちPCでバイトコードにコンパイルしてマイコンに焼いたりしないといけないところが不要になります。加えてPicoRubyではターミナルで動くShellや、USBストレージまで実装されていて、それもまた使いやすさに大きく貢献してます。&lt;/p&gt;
&lt;p&gt;※ちなみに素のmrubyでもESP32のPSRAM(2MBや4MB)付きのものであればマイコン上でコンパイルできます。（&lt;a href=&quot;https://kishima.github.io/jp/family_mruby/&quot;&gt;Family mruby&lt;/a&gt;の取り組み）&lt;/p&gt;
&lt;p&gt;作者の羽角さんと以前、Arduinoでmrubyをなんか動かしたことがある、という話をしたときに、ふつう動かないよね？となったのですが、その時自分でも自分が何をしたのか完全に忘れていたので、それを振り返っておこうかなと思いました。&lt;/p&gt;
&lt;h2 id=&quot;arduino-unoで動かすとは&quot;&gt;Arduino Unoで動かすとは？&lt;a href=&quot;#arduino-unoで動かすとは&quot; aria-label=&quot;Link to heading &#39;Arduino Unoで動かすとは？&#39;&quot; data-heading-content=&quot;Arduino Unoで動かすとは？&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Arduino UnoはFROM32KB、RAM2KBです。RAMについて言えば、Raspberry Pi Picoの1/100です。&lt;/p&gt;
&lt;p&gt;mrubyの小型VMであるmruby/cでも実行時のメモリ40KBとあるので、ふつうに考えて全く動かないのです。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://www.s-itoc.jp/support/technical-support/mrubyc/&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;mruby/c&lt;/strong&gt;&lt;span class=&quot;card-link-site&quot;&gt;ITイノベーションセンター（ITOC）｜公益財団法人しまね産業振興財団&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-70266171.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;h2 id=&quot;動かすために何をした&quot;&gt;動かすために何をした？&lt;a href=&quot;#動かすために何をした&quot; aria-label=&quot;Link to heading &#39;動かすために何をした？&#39;&quot; data-heading-content=&quot;動かすために何をした？&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;自分の本に詳しく書いてました。2018年の技術書典5で出した同人誌です。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://nextpublishing.jp/book/10601.html&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;mruby/cの小さな世界 | インプレス NextPublishing&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;【マイコン上でもRubyを使ってみよう】 本書はRubyの組み込みハード向け実装であるmrubyをベースとし、よりリソースの限られたマイコンなどの環境...&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;NextPublishing  デジタルファースト宣言！&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-0a534f02.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;p&gt;商用本にもなっているので、ブログにはあまり書き残してなかったので、詳細忘れてました…&lt;/p&gt;
&lt;p&gt;やったのは以下のようなことです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mrubyのバイトコードのうち、対応するものを削る＝mrubyの機能を削る&lt;/li&gt;
&lt;li&gt;mruby/cのVM実装をベースに不要な部分を削っていく&lt;/li&gt;
&lt;li&gt;シンボルなど、定数として扱えるものをROMへ割り当てるようにする
&lt;ul&gt;
&lt;li&gt;Arduino用プレフィックスが必要になるため、バイトコードファイルを解析して、C言語コードを吐くような、ポストプロセスを実装&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ArduinoIDEでコンパイルでは、8bitマイコンでも、8bit以上の変数を扱えるように対応してくれているので、mruby/cベースのコードもコンパイルできた&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;とにかくROMに割り当てることで、2KBのメモリには実行時に生成するオブジェクトだけ乗るようにしました。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;データ構造とビルドの流れ&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;ROMにシンボルを置いてRAMを節約、という発想の取り組みはmruby本家でも対応されて、presymとして利用されています（私の理解があってれば）。&lt;/p&gt;
&lt;p&gt;結果、この挑戦では、簡単なメソッド呼び出しやループくらいは動くようになりました。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;サンプルコードとVMをビルドした結果&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;コードは以下で公開しています。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://github.com/kishima/micro_mruby_for_arduino_uno&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;GitHub - kishima/micro_mruby_for_arduino_uno: An Arduino library of mircro mruby VM implementation for Arduino uno&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;An Arduino library of mircro mruby VM implementation for Arduino uno  - kishima/micro_mruby_for_arduino_uno&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;GitHub&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;p&gt;このときはmicro mrubyなんて名前をつけてました。&lt;/p&gt;
&lt;p&gt;PicoRubyやMicroRubyが存在している現在だと、FemtoRuby とでも呼んだほうがいいのかもしれませんね。&lt;/p&gt;
&lt;h2 id=&quot;利用してくださった方々&quot;&gt;利用してくださった方々&lt;a href=&quot;#利用してくださった方々&quot; aria-label=&quot;Link to heading &#39;利用してくださった方々&#39;&quot; data-heading-content=&quot;利用してくださった方々&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;実用性皆無と思ってましたが、ググッてみたら、利用してくださった方がいることを今さら見つけて嬉しかったので、リンクしておきます。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://qiita.com/GORO_Neko/items/8f78a212601669275948&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;micro_mruby_for_arduino_uno を使って Arduino Uno の上で動くアプリケーションを Ruby で書く - Qiita&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;この記事は、Fujitsu Advent Calenderの 19 日目の記事です。 はじめに @GORO_Nekoです。ご存知の方ご無沙汰してます。初めての方お初にお目にかかります。 えーっと、先にお断りをば一言。 自分、仕事では一切 mruby や mruby/c を...&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;Qiita&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-18874eae.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://fukuno.jig.jp/2472&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;Ruby on Jam!? micro mruby VM for LPC1114, ひとまずIchigoCakeで動かしてみよう&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;IchigoJamでRubyを動かす2つ目のアプローチ、mrubyの中間コードをIchigoJamで動かすトライ、ひとまずプログラムサイズが50KB程度だったので、ROM56KB/RAM8KBのIchigoCakeで動作確認！点滅しました！...&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;福野泰介の一日一創 / create every day&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-d03e962f.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;h2 id=&quot;今後のこと&quot;&gt;今後のこと&lt;a href=&quot;#今後のこと&quot; aria-label=&quot;Link to heading &#39;今後のこと&#39;&quot; data-heading-content=&quot;今後のこと&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Arduino Unoでバイトコード動かすのはちょっと無理があるので、この件については特に何も展望はないですが、こういう隅っこを攻める開発は頭の体操によいと思います。&lt;/p&gt;
&lt;p&gt;最近は、ESP32を２個使って、Family mrubyの進化版を開発してます。&lt;/p&gt;
</content>
</entry>
<entry>
<title>電子工作遍歴をたどる（１）</title>
<id>https://blog.silentworlds.info/2025/07/dian-zi-gong-zuo-bian-li-wotadoru-1/</id>
<link rel="alternate" type="text/html" href="https://blog.silentworlds.info/2025/07/dian-zi-gong-zuo-bian-li-wotadoru-1/"/>
<published>2025-07-25T01:16:40+09:00</published>
<updated>2026-05-09T12:30:52+09:00</updated>
<category term="Tech"/>
<summary>最近、Rubyの界隈で自作キーボードからの派生も含めて電子工作を始める人が増えているようで、もう少し前からやってた自分としては、そんな状況がとても嬉しく小躍りしてます。</summary>
<content type="html" xml:base="https://blog.silentworlds.info/2025/07/dian-zi-gong-zuo-bian-li-wotadoru-1/">&lt;p&gt;&lt;img src=&quot;IMG_0471.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;経緯&quot;&gt;経緯&lt;a href=&quot;#経緯&quot; aria-label=&quot;Link to heading &#39;経緯&#39;&quot; data-heading-content=&quot;経緯&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;最近、Rubyの界隈で自作キーボードからの派生も含めて電子工作を始める人が増えているようで、もう少し前からやってた自分としては、そんな状況がとても嬉しく小躍りしてます。&lt;/p&gt;
&lt;p&gt;私は色々動画とか見つつ、それに憧れて、真似をしたり創作をしたりを繰り返して、だんだん作りたいものを作るのに何をすればよいか判断できるようになってきました。&lt;/p&gt;
&lt;p&gt;一応組み込みに近い開発やら研究やらPMの仕事をしてきましたが、直接的にマイコンを触ることはほとんどなかったので、背景知識はありつつも、それ以外は初心者からスタートした人間です。&lt;/p&gt;
&lt;p&gt;最初のハードルの高さを超えると一気に楽しくなった実感があるので、そのハードルを下げるお手伝いを色々したいなと思っています。&lt;/p&gt;
&lt;p&gt;話は変わりますが、先日、&lt;a href=&quot;https://dev.events/conferences/pico-ruby-overflow-kaigi-2025-xeusgloa&quot;&gt;PicoRuby Overflow会議&lt;/a&gt;というのがあり、少しポスターセッション的な枠で参加したりして、とてもいい時間を過ごしてきました。そこで色々新しいことの挑戦される方の話を聞いて、応援したい気持ちが更に高まりました。&lt;/p&gt;
&lt;p&gt;支援の一つとして、昔書いた「ゼロから始めるmrubyデバイス作り」のLight版を無償公開しました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://kishima.github.io/my_books/20250719/my_mruby_device_light_v1.0.pdf&quot;&gt;https://kishima.github.io/my_books/20250719/my_mruby_device_light_v1.0.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;私も最初から、基板を作ったりしたわけではなく、色々既存のものを組み合わせたり、真似したりして楽しむところからのスタートでした。ネットを眺めるとすごい作例ばかり目につきますが、誰でも最初は小さなところからのスタートだったはずなので、その過程の例を紹介できれば、電子工作の気持ちの面での壁を超えるサポートができるかと思って、作例を紹介することにしてみました。守破離の流れをお伝えできればと思います。&lt;/p&gt;
&lt;p&gt;最初の２つは思い出話から。写真とかはなく。&lt;/p&gt;
&lt;h2 id=&quot;作例１じゃんけんマシン&quot;&gt;作例１　じゃんけんマシン&lt;a href=&quot;#作例１じゃんけんマシン&quot; aria-label=&quot;Link to heading &#39;作例１　じゃんけんマシン&#39;&quot; data-heading-content=&quot;作例１　じゃんけんマシン&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;小学生のころ、小学校の図書館にあった工作の本に、ICとか使わずに配線だけで、じゃんけん対戦ができる装置の作り方が書いてありました。&lt;/p&gt;
&lt;p&gt;夏休みの自由研究でそれを見様見真似で作ったことがあります。多分これが記憶に残っているうちで最初の電子工作だと思います。&lt;/p&gt;
&lt;p&gt;はんだ付けもした記憶があります。ホームセンターに売ってる安いはんだごてで、人にも聞かずだいたいは一人で延々と取り組んでた記憶があります。当時の状況を思うと、感傷的になる思い出です。&lt;/p&gt;
&lt;p&gt;どんな回路だったんだろうなあ。あの本をもう一度読んでみたい。&lt;/p&gt;
&lt;h2 id=&quot;作例2音でledが光るマシン&quot;&gt;作例2　音でLEDが光るマシン&lt;a href=&quot;#作例2音でledが光るマシン&quot; aria-label=&quot;Link to heading &#39;作例2　音でLEDが光るマシン&#39;&quot; data-heading-content=&quot;作例2　音でLEDが光るマシン&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;多分その次の年の夏休みに作ったもの。小学６年生でしょうか。&lt;/p&gt;
&lt;p&gt;当時かそのちょっと前、音に反応してくねくねするダンシングフラワーが流行っていて、それを見て、音で反応するトリガーにできるのなら、何か光らすことができるんじゃないかと思い、ダンシングフラワーを分解しました。&lt;/p&gt;
&lt;p&gt;ダンシングフラワーのコアを、スイッチを入れると複数のLEDがチカチカする電子工作キットのスイッチとして無理やり合体させました。&lt;/p&gt;
&lt;p&gt;電圧とか電流とかよくわかってないのに、よくやったなあ、と思います。&lt;/p&gt;
&lt;p&gt;たぶんこれが最初の創作電子工作だと思います。&lt;/p&gt;
&lt;p&gt;それ以降は、BASICを触り始めたり、部活が忙しくなって、電子部品関連触るのは大学の工学部の授業までおあずけになります。&lt;/p&gt;
&lt;p&gt;大学では電気系だったので、最低限の電気回路関係の基礎は学びました（不真面目な生徒でしたが）。当時はどうやって使う知識なのかよくわかってなかったですが、電子工作を始めてやっと肌身をもって感じことができた知識も多いです。&lt;/p&gt;
&lt;h2 id=&quot;作例３esp32で温度センサー&quot;&gt;作例３　ESP32で温度センサー&lt;a href=&quot;#作例３esp32で温度センサー&quot; aria-label=&quot;Link to heading &#39;作例３　ESP32で温度センサー&#39;&quot; data-heading-content=&quot;作例３　ESP32で温度センサー&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;時間は流れて、社会人になりました。社会人になって本格的な産業用の組み込みソフト開発にも触れて、RTOSや組み込みLinuxなどの経験も積みましたが、電子工作はほとんどやってませんでした。&lt;/p&gt;
&lt;p&gt;特に2014～2016年まで、仕事で海外出張繰り返して、人生で最高にやばい時間を過ごしてた反動で、何かいままでやりたいと思ってできてなかったこととして、電子工作にも手を出そうと思いました。&lt;/p&gt;
&lt;p&gt;加えて、そのやばい仕事で、ソフトウェアのPMとして初めてHW屋さんとバチバチやりあった経験もあって、HW屋さんとの会話について行けるように電子機器の基礎知識を付けたいという思いもありました。仕事で長年組み込みやっているフリーランスの方にもArduino使った治具作ってもらって助けてもらったのもあり、それくらい自分で作れるようになりたい、という思いとかいろいろ重なっていたように思います。&lt;/p&gt;
&lt;p&gt;記録を振り返ると、やっとプロジェクトが落ち着いてきた2016年の中ごろに、ESPシリーズを触り始めたようです。&lt;/p&gt;
&lt;p&gt;ESP8266で温湿度センサーをつないで、結果をさくらVPSのサーバに送っていたと記憶してます。&lt;/p&gt;
&lt;p&gt;温度センサがマイコンに近いと、放射温度を拾っているのか、結構温度が高くでてしまう現象に遭遇して、センサの難しさも学びました。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_8059.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;ブレッドボードを始めてまともに使ったかも&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_8076.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;ユニバーサル基板にセンサのせて、長時間稼働させたりした&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;作例４ラズパイ遊びとusbスピーカー&quot;&gt;作例４　ラズパイ遊びとUSBスピーカー&lt;a href=&quot;#作例４ラズパイ遊びとusbスピーカー&quot; aria-label=&quot;Link to heading &#39;作例４　ラズパイ遊びとUSBスピーカー&#39;&quot; data-heading-content=&quot;作例４　ラズパイ遊びとUSBスピーカー&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;それから勤務場所の変化とかあり、少し間が空いて、2017年。このあたりから電子工作を本格的にやってみようという気が出てきたようです。&lt;/p&gt;
&lt;p&gt;ラズパイ３を買って、モニタ付きのセットに乗せてみたりしました。&lt;/p&gt;
&lt;p&gt;ゲームを動かしたりしたくて、USBスピーカーを繋ぎましたが、ちょっと市販品が大きかったので、練習がてら、小さなスピーカー＋アンプ回路＋USBオーディオ変換を合体させて、小さなUSBスピーカーを作りました。&lt;/p&gt;
&lt;p&gt;ここのあたりからコロナ期になるまでの数年間集中的にいろいろ作りました。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_0439.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;市販のUSBスピーカーを繋ぐ&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_0437.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;ラズパイ搭載モニタ&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_0471-1.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;USBオーディオ変換を分解して信号と電源を横取り&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_0470.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;アンプの基板（秋月？）&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_0465.JPG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;はんだ付け汚い&lt;/em&gt;&lt;/p&gt;
</content>
</entry>
<entry>
<title>関西Ruby会議08で発表してきました</title>
<id>https://blog.silentworlds.info/2025/07/guan-xi-rubyhui-yi-08defa-biao-sitekimasita/</id>
<link rel="alternate" type="text/html" href="https://blog.silentworlds.info/2025/07/guan-xi-rubyhui-yi-08defa-biao-sitekimasita/"/>
<published>2025-07-01T02:37:42+09:00</published>
<updated>2026-05-09T12:31:11+09:00</updated>
<category term="Tech"/>
<category term="mruby"/>
<summary>ありがたいことに投稿した発表が採択されたので、2025/6/28 京都にて開催された関西Ruby会議08にて、発表してきました。</summary>
<content type="html" xml:base="https://blog.silentworlds.info/2025/07/guan-xi-rubyhui-yi-08defa-biao-sitekimasita/">&lt;p&gt;&lt;img src=&quot;IMG_4703a.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;ありがたいことに投稿した発表が採択されたので、2025/6/28 京都にて開催された&lt;a href=&quot;https://regional.rubykaigi.org/kansai08/&quot;&gt;関西Ruby会議08&lt;/a&gt;にて、発表してきました。&lt;/p&gt;
&lt;p&gt;とてもよい２日間だったので、その記憶を残しておきたいと思います。&lt;/p&gt;
&lt;h2 id=&quot;cfpに応募した経緯&quot;&gt;CFPに応募した経緯&lt;a href=&quot;#cfpに応募した経緯&quot; aria-label=&quot;Link to heading &#39;CFPに応募した経緯&#39;&quot; data-heading-content=&quot;CFPに応募した経緯&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;２月にあったTokyu.rb（＝飲み会）に参加した際に、どんな話の流れだったか覚えてないですが、&lt;a href=&quot;https://x.com/makicamel&quot;&gt;@makicamel&lt;/a&gt;さんから、kishimaさんも参加しましょうよ！という話をしてもらって、それがきっかけで、イベントの存在を知りました。&lt;/p&gt;
&lt;p&gt;遠征するのであれば、発表するくらいの理由がほしいと思っているのと、久しぶりに個人開発も再開していきたいと思ったので、会議ドリブン開発も意図して応募してみました。&lt;/p&gt;
&lt;p&gt;直近の半年くらいのお仕事がROS 関係でだいぶ忙しく、その分、未知の分野の経験が蓄積された感触があったので、これをなんとかRubyの世界に引っ張ってきたいと思って生まれたテーマです。&lt;/p&gt;
&lt;h2 id=&quot;当日までの準備&quot;&gt;当日までの準備&lt;a href=&quot;#当日までの準備&quot; aria-label=&quot;Link to heading &#39;当日までの準備&#39;&quot; data-heading-content=&quot;当日までの準備&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;久しぶりに本格的にmruby触るので、勘所復習するところからで、なかなか大変でした。特にビルド環境整理したり、寄り道でPicoRuby関係のデバッグしたりに時間をだいぶ使ってしまったので、直前にだいぶばたばたしてしまいました。若いときほど体力もないので無理はよくない・・・。&lt;/p&gt;
&lt;h2 id=&quot;発表の内容&quot;&gt;発表の内容&lt;a href=&quot;#発表の内容&quot; aria-label=&quot;Link to heading &#39;発表の内容&#39;&quot; data-heading-content=&quot;発表の内容&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;登場する際に出囃子的な音楽を掛けていただけるということで、悩んだ結果、ロボット絡みの発表テーマに合いそうで、好きな曲ということで、FF6の「&lt;a href=&quot;https://www.youtube.com/watch?v=Ys-oKc88tXY&quot;&gt;魔導研究所&lt;/a&gt;」が頭に浮かんだので、それでお願いしました。（FF6は子ども頃にサントラCDずっと聴いたり、ピアノコレクションの楽譜買って打ち込んだりしてた程度には好き）&lt;/p&gt;
&lt;p&gt;もともと子供の頃遊んだレトロゲームにずっと脳を焼かれている人なので、好きな音楽をバックに花道から登場する、という体験ができて思い出になりました。&lt;/p&gt;
&lt;p&gt;資料はこちら。&lt;/p&gt;
&lt;iframe id=&quot;talk_frame_1391097&quot; class=&quot;speakerdeck-iframe&quot; src=&quot;//speakerdeck.com/player/e6d165b646fc4d3f8b861fda94e6484f&quot; width=&quot;710&quot; height=&quot;399&quot; style=&quot;aspect-ratio:710/399; border:0; padding:0; margin:0; background:transparent;&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;伝えたいところは、20分の範囲で詰め込められたかなと思ってます。&lt;/p&gt;
&lt;p&gt;mruby micro-ROSまだ道半ばなので、もっとAPIを整理して、他の人にも使ってもらえる形で紹介できればと思ってます。私の個人のgithubで開発中。&lt;/p&gt;
&lt;p&gt;追記：発表中、ROSを使ったことある方～？という質問をしました。ライトがまぶしくて、手を上げてくださっている方が見つからなかったのですが、あとで聞いたら数名いらっしゃったようで、気づかず申し訳なかったです。ぜひお話してみたかった。&lt;/p&gt;
&lt;p&gt;追記２：資料中の動画はオフライン再生できる準備をしておくこと&lt;/p&gt;
&lt;h2 id=&quot;聴講者としての感想&quot;&gt;聴講者としての感想&lt;a href=&quot;#聴講者としての感想&quot; aria-label=&quot;Link to heading &#39;聴講者としての感想&#39;&quot; data-heading-content=&quot;聴講者としての感想&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;他のトークの内容もそれぞれ色々なアプローチで、Rubyで何かを作る、作ってきたお話で、一貫して自分もなにか作ってみたくなる、そんなインスピレーションがもらえる内容だったと思います。そういった皆さんのすばらしい活動の一端に自分の活動も並べてもらえたと思うと、嬉しさが込み上げて来ました。&lt;/p&gt;
&lt;p&gt;運営さんが熱量持ってこの会を作っておられるのも、端々に感じて、それも気持ちが上がりました。&lt;/p&gt;
&lt;p&gt;過去にTokyuRuby会議の実行委員長をやらせて頂いたときの経験を思い返すと、こういう大きなイベントを運営することは、きっととても大変なはずなので、ydahさんはじめとする運営スタッフの皆さんには感謝しかないです。&lt;/p&gt;
&lt;p&gt;最後の地域Rubyコミュニティのパネルセッションもたくさんのコミュニティが集まりつつ面白い軽妙なやり取りが繰り広げられていて、関西のパワー感じました。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_4727a.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;準備で睡眠削ってしまってふらふらでしたが、あの鴨川の「川」にも合流できてこれも良い思い出になりました。端っこの方で先輩Rubyistの方々とお話してたら気がついたら４時前まで居たようです。&lt;/p&gt;
&lt;h2 id=&quot;翌日&quot;&gt;翌日&lt;a href=&quot;#翌日&quot; aria-label=&quot;Link to heading &#39;翌日&#39;&quot; data-heading-content=&quot;翌日&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;どうせ遠征するなら色々参加しようと思って、叡電LTと非公式打ち上げにも参加しました。&lt;/p&gt;
&lt;p&gt;電車一両の参加者みっしり乗って、車内放送でLTするのが面白くないわけがなく、@makicamelさんの電車の中で、PicoRuby on Railsする発表は忘れられないLTになりました。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_4736as.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;京都&quot;&gt;京都&lt;a href=&quot;#京都&quot; aria-label=&quot;Link to heading &#39;京都&#39;&quot; data-heading-content=&quot;京都&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;LTのあと、ご褒美でうなぎ食べました。ラーメンとかも考えましたが、二日酔い的にちょっと厳しそうだったのでスキップ。&lt;/p&gt;
&lt;p&gt;今年に入って仕事の出張ついでに京都に泊まる機会があり、そのとき中学生の修学旅行ぶりに二条城行こうと思って行ってみたら、受付終了してたということがあったので、そのリベンジとして、二条城行ってみました。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_4750a.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;異例の６月の猛暑でかなりきつかったですが、歴史の舞台をしっかり目に焼き付けることができました。&lt;/p&gt;
&lt;p&gt;ちょっと移動に時間かかりすぎて、打ち上げに遅れてしまったのが申し訳無かった。&lt;/p&gt;
&lt;h2 id=&quot;最後に&quot;&gt;最後に&lt;a href=&quot;#最後に&quot; aria-label=&quot;Link to heading &#39;最後に&#39;&quot; data-heading-content=&quot;最後に&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;行ってよかった。&lt;/p&gt;
&lt;p&gt;色々作ってくの、もっとがんばりたい。そう思えるイベントでした。&lt;/p&gt;
</content>
</entry>
<entry>
<title>PicoRubyベースのミニコンピュータ</title>
<id>https://blog.silentworlds.info/2025/06/picorubybesunominikonpiyuta/</id>
<link rel="alternate" type="text/html" href="https://blog.silentworlds.info/2025/06/picorubybesunominikonpiyuta/"/>
<published>2025-06-15T23:53:07+09:00</published>
<updated>2026-05-09T12:31:13+09:00</updated>
<category term="mruby"/>
<category term="Tech"/>
<summary>先日、SNSを見ていたらPicoCalcというデバイスを見つけた</summary>
<content type="html" xml:base="https://blog.silentworlds.info/2025/06/picorubybesunominikonpiyuta/">&lt;p&gt;先日、SNSを見ていたらPicoCalcというデバイスを見つけた&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://www.clockworkpi.com/picocalc&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;PicoCalc | ClockworkPi&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;ClockworkPi - Creators of PicoCalc uConsole DevTerm and GameShell, Open Source Portable Hardware for Every Dev.&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;ClockworkPi&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-5578e100.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;p&gt;これはclockworkから出ているRaspberryPi Picoをコアとして、キーボードとモニタを搭載したスタンドアロンなポケットコンピュータキットです。&lt;/p&gt;
&lt;p&gt;clockworkはRaspberryPiベースのロマンあふれるデバイスをこれまで提供している会社で、私も昔クラウドファンディングに参加したこともありました。&lt;/p&gt;
&lt;p&gt;私自身も、以前、ラズパイをタカチケースに入れて気合でポケコンもどきを作ったりしたこともあったので、この洗練された筐体には当然心が躍りました。&lt;/p&gt;
&lt;img src=&quot;IMG_1040.jpg&quot; alt=&quot;&quot; width=&quot;580&quot;&gt;
&lt;p&gt;&lt;em&gt;電子工作始めたころ作ったラズパイコンソールデバイス&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;デフォルトで動くのはBasicで、これもまた味わいがあってよきですが、やはり自分としてはmruby動かしたい、ということで、Raspi PicoといえばPicoRubyの出番です。特にR2P2がこの画面とキーボードで動くと熱い。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://github.com/picoruby/R2P2&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;GitHub - picoruby/R2P2: PicoRuby shell for Raspberry Pi Pico (RP2040)&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;PicoRuby shell for Raspberry Pi Pico (RP2040). Contribute to picoruby/R2P2 development by creating an account on GitHub.&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;GitHub&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;p&gt;そんな風に思って、とりあえず注文したのですが、結構発送に時間かかりそうです。&lt;/p&gt;
&lt;p&gt;もし間に合えば、７月の&lt;a href=&quot;https://naniwarb.github.io/picorubyoverflowkaigi/&quot;&gt;PicoRuby Overflow会議&lt;/a&gt;に持っていきたいなと思っています。ちょっと実機で動かせる状態にするのは間に合わないかも、と思って試作用にI2Cキーボードの例を準備したりしてました。SPIのモニタは確か部品箱に何か眠っていたはず…&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;IMG_4406.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;M5StackのI2Cキーボードカード&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;実現方法としては、RaspberryPi PicoのSDKによれば、stdioのドライバは任意のものが追加可能らしいので、そこを差し替えればよいはず。一度基本的なものが作れれば、あとはPicoCalc環境に移植するのも難しくはないはずです。&lt;/p&gt;
&lt;p&gt;PicoCalcには、PSRAMやスピーカーとかも載っているので、専用のmrbgem開発するとより楽しく遊べそうです。&lt;/p&gt;
</content>
</entry>
<entry>
<title>PicoRubyを理解する１</title>
<id>https://blog.silentworlds.info/2025/05/picorubywoli-jie-suru1/</id>
<link rel="alternate" type="text/html" href="https://blog.silentworlds.info/2025/05/picorubywoli-jie-suru1/"/>
<published>2025-05-28T19:17:50+09:00</published>
<updated>2026-05-09T12:31:15+09:00</updated>
<category term="mruby"/>
<category term="Tech"/>
<summary>ちゃんと中身を理解できてなかったので、コードや資料を読んで理解したい。</summary>
<content type="html" xml:base="https://blog.silentworlds.info/2025/05/picorubywoli-jie-suru1/">&lt;a class=&quot;card-link&quot; href=&quot;https://github.com/picoruby&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;PicoRuby&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;A Ruby interpreter implementation for one-chip microcontrollers - PicoRuby&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;GitHub&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-a705b95e.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;p&gt;ちゃんと中身を理解できてなかったので、コードや資料を読んで理解したい。&lt;/p&gt;
&lt;p&gt;特にパーサーやVMの周りをどうやって小さくできているのか。&lt;/p&gt;
&lt;p&gt;まずは基礎知識から。&lt;/p&gt;
&lt;h2 id=&quot;公式情報&quot;&gt;公式情報&lt;a href=&quot;#公式情報&quot; aria-label=&quot;Link to heading &#39;公式情報&#39;&quot; data-heading-content=&quot;公式情報&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://picoruby.github.io/&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;PicoRuby Documentation&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;API documentation&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;PicoRuby Documentation&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-018dd6c2.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;h2 id=&quot;羽角さんの資料&quot;&gt;羽角さんの資料&lt;a href=&quot;#羽角さんの資料&quot; aria-label=&quot;Link to heading &#39;羽角さんの資料&#39;&quot; data-heading-content=&quot;羽角さんの資料&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;2025&quot;&gt;2025&lt;a href=&quot;#2025&quot; aria-label=&quot;Link to heading &#39;2025&#39;&quot; data-heading-content=&quot;2025&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://rubykaigi.org/2025/presentations/hasumikin.html&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;MicroRuby: True Microcontroller Ruby&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;RubyKaigi 2025, #rubykaigi&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;RubyKaigi&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-8690a534.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://hasumikin.com/2025/05/05/MicroRuby.html&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;RubyKaigi 2025 で発表したMicroRubyとはなんだったのか - hasumikin.com&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;RubyKaigi 2025 で発表したMicroRubyとはなんだったのか&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;hasumikin.com&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;p&gt;MicroRubyとは？&lt;/p&gt;
&lt;p&gt;Ruby会議には参加できてないので、詳細はブログの記事からの理解ですが、以下のような、図のような感じなのかと理解しました。コンパイラをカスタムして準備してしまうのが驚くべきところ。パーサーもPrismに置き換わっているらしい。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;picoruby.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;で、コンパイラの周りやmrbgemの扱いなどは、やはりコードを追っていかないといけない。&lt;/p&gt;
&lt;h3 id=&quot;2024&quot;&gt;2024&lt;a href=&quot;#2024&quot; aria-label=&quot;Link to heading &#39;2024&#39;&quot; data-heading-content=&quot;2024&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://rubykaigi.org/2024/presentations/hasumikin.html#day2&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;Unlock The Universal Parsers: A New PicoRuby Compiler&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;RubyKaigi 2024, #rubykaigi&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;RubyKaigi 2024&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-447f7e73.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://slide.rabbit-shocker.org/authors/hasumikin/OsakaRubyKaigi04/&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;令和の隙間産業——PicoRubyはどこから来てどこへ行くのか - HASUMI Hitoshi - Rabbit Slide Show&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;Presentation slide for 大阪Ruby会議04&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;Rabbit Slide Show&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-53b4722a.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://rubyprize.jp/21_rubyprize/21_iv-nominees02-ja.html&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;Ruby Prize 2021 最終ノミネート者 羽角 均 インタビューRubyPrize&lt;/strong&gt;&lt;span class=&quot;card-link-site&quot;&gt;RubyPrize | Rubyコミュニティの「個人賞」&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;blockquote&gt;
&lt;p&gt;Matz：「そっか、256KBあったらmryubyのVMだけなら動くのか。」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ESP32でPSRAM 8M乗ってると&lt;a href=&quot;https://kishima.github.io/jp/family_mruby/&quot;&gt;mrubyのパーサ/コンパイラも込みで動かせた実績&lt;/a&gt;あるので、Raspi PicoでもPSRAM搭載ボードなら行けるはず。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;羽角さん「僕としては、PicoRubyとかmrubyのエコシステムを広げていくのに、PicoRubyコンパイラを作っただけじゃ面白くなくて、使われないと楽しくないわけですよね。」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;とても共感。C書けるなら、Cで書いてしまっても良いのだけど、せっかく環境を作るからには他の人に使ってほしい。羽角さんは一人でエコシステムまで作ろうとしててほんとすごい。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://www.lambdanote.com/collections/frontpage/products/nmonthly-vol-4-no-1-2024&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;n月刊ラムダノート Vol.4, No.1(2024)&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;計算機好きのための技術解説情報誌 エヌゲッカンラムダノート（不定期刊行）106ページ A5判 紙書籍は1色刷 2024年2月6日 第4巻第1号／通巻7号 発行 目次 #1 手を動かして学ぶストリーム処理入門（中谷翔）#2 WebAssemblyの制約を越える（齋藤優太） #3 PicoRubyといっしょに学ぶ、プログラミング言語が電気回路を動かす仕組み（羽角均）&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;技術書出版と販売のラムダノート&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-715ecdf6.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;p&gt;買って読んでみた。&lt;/p&gt;
&lt;p&gt;基本的なところからとても丁寧に書いてあるので、PicoRubyちゃんと使いこなしたい方は必読と思いました。&lt;/p&gt;
&lt;h2 id=&quot;その他&quot;&gt;その他&lt;a href=&quot;#その他&quot; aria-label=&quot;Link to heading &#39;その他&#39;&quot; data-heading-content=&quot;その他&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://rubykaigi.org/2025/presentations/kaz0505.html&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;mruby/c and data-flow programming for small devices&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;RubyKaigi 2025, #rubykaigi&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;RubyKaigi&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-737eed05.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://www.slideshare.net/slideshow/mruby-c-and-data-flow-programming-for-small-devices/278614229&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;mruby/c and data-flow programming for small devices&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;In my presentation, I will show how data-flow programming can be used for software development of small devices. The effectiveness of the proposed method is demonstrated with a microcontroller implementation in mruby/c.

In IoT programming, we want to focus on the flow of data generation and processing. This is data flow programming, also known as the Node-RED development environment.

Data flow is processed asynchronously. I will explain how to implement this asynchronous processing in a reasonable manner using mruby/c and demonstrate its operation on a real microcontroller. - Download as a PDF, PPTX or view online for free&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;Slideshare&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-6078b380.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;p&gt;mruby/cについて、田中先生のスライドが公開されていた。&lt;/p&gt;
&lt;p&gt;Node-REDから使えるようにした、というお話。&lt;/p&gt;
&lt;h2 id=&quot;次のステップ&quot;&gt;次のステップ&lt;a href=&quot;#次のステップ&quot; aria-label=&quot;Link to heading &#39;次のステップ&#39;&quot; data-heading-content=&quot;次のステップ&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;PicoRubyのコードを読む。&lt;/p&gt;
</content>
</entry>
<entry>
<title>RubyとROS 2</title>
<id>https://blog.silentworlds.info/2025/05/rubytoros-2/</id>
<link rel="alternate" type="text/html" href="https://blog.silentworlds.info/2025/05/rubytoros-2/"/>
<published>2025-05-24T22:29:56+09:00</published>
<updated>2026-05-09T12:31:17+09:00</updated>
<category term="Tech"/>
<category term="ROS"/>
<summary>普段仕事でROSを触るときはPythonかC++を利用することになるが、Ruby好きとしては、やはりRubyでもノードを書いたりしたくなる。</summary>
<content type="html" xml:base="https://blog.silentworlds.info/2025/05/rubytoros-2/">&lt;p&gt;普段仕事でROSを触るときはPythonかC++を利用することになるが、Ruby好きとしては、やはりRubyでもノードを書いたりしたくなる。&lt;/p&gt;
&lt;p&gt;ということで、すこし調べてみた。&lt;/p&gt;
&lt;h2 id=&quot;ros-2以前&quot;&gt;ROS 2以前&lt;a href=&quot;#ros-2以前&quot; aria-label=&quot;Link to heading &#39;ROS 2以前&#39;&quot; data-heading-content=&quot;ROS 2以前&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;調べるとROS 2ではなくて、ROSに関する取り組みはあるようだった。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://github.com/OTL/rosruby&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;GitHub - OTL/rosruby: ruby ROS client.&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;ruby ROS client. Contribute to OTL/rosruby development by creating an account on GitHub.&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;GitHub&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-8e297b64.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;p&gt;九州工業大学の田中先生の研究室の学生さんの記事。対象はNoetic。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://qiita.com/tytymch/items/40705cab30d0d903be24&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;【Ruby】RubyでROSを動かしてみた - Qiita&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;九州工業大学 田中和明研究室の大学院生です。Rubyと産業用ロボットに関する研究に携わっています。 背景 ROSでロボットを動かす場合、一般的にはPythonやC++を使用したプログラムが基本です。また、ROSは主にUbuntu上で動作し、ターミナル操作やUNIX系コマ...&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;Qiita&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-79816fb4.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;h2 id=&quot;ros-2対応のrclrb&quot;&gt;ROS 2対応のrclrb&lt;a href=&quot;#ros-2対応のrclrb&quot; aria-label=&quot;Link to heading &#39;ROS 2対応のrclrb&#39;&quot; data-heading-content=&quot;ROS 2対応のrclrb&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;やはり今ならROS 2使いたいので、調べてみると１つだけ見つかった。&lt;/p&gt;
&lt;p&gt;2024年5月の記事。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://discourse.ros.org/t/rclrb-bindings-for-using-ros2-with-ruby/37715&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;rclrb: bindings for using ROS2 with Ruby&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;Hi everyone, I am happy to announce here bindings to use ROS2 RCL with the Ruby programming language. The bindings have been stable for a few months now and are ready for more wide spread usage. Feel free to report any issue on the gitlab tracker.  The bindings can be installed as a gem or as a colcon package. Instructions can be found in the readme of the repository:    Documentation is sparse, but the API is generally similar to Python/C++ one. The main difference is that the only available ex...&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;Open Robotics Discourse&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-90157b55.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;p&gt;リポジトリ&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://gitlab.com/rosrb/rclrb&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;rosrb / rclrb · GitLab&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;GitLab.com&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;GitLab&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-e45ce033.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;p&gt;FFIでrclをラップしてRubyから使えるようにしてある実装で、コードもシンプルで素敵です。&lt;/p&gt;
&lt;h3 id=&quot;動かしてみる&quot;&gt;動かしてみる&lt;a href=&quot;#動かしてみる&quot; aria-label=&quot;Link to heading &#39;動かしてみる&#39;&quot; data-heading-content=&quot;動かしてみる&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;サンプルコードを動かしてみる。Pythonで書いたような雰囲気でROSのノードが書けている。&lt;/p&gt;
&lt;p&gt;Publisher&lt;/p&gt;
&lt;pre class=&quot;highlight&quot; data-lang=&quot;ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;rclrb&#39;&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;std_msgs/msg&#39;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MinimalPublisher&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Rclrb&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Node&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;publisher_node&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;string_msg&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;StdMsgs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Msg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;new&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;string_msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Hello World!&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;pub&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;create_publisher&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;StdMsgs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Msg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;topic&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@timer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;create_timer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;pub&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;pub&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;string_msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;no&quot;&gt;Rclrb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;arguments: &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;no&quot;&gt;Rclrb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;spin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;MinimalPublisher&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;vg&quot;&gt;$0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;__FILE__&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;ARGV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Subscriber&lt;/p&gt;
&lt;pre class=&quot;highlight&quot; data-lang=&quot;ruby&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;rclrb&#39;&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;std_msgs/msg&#39;&lt;/span&gt;

&lt;span class=&quot;vg&quot;&gt;$stdout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;sync&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MinimalSubscriber&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Rclrb&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Node&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;initialize&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;subscriber&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;create_subscription&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;StdMsgs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Msg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;topic&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;start subscriber node&quot;&lt;/span&gt;
  &lt;span class=&quot;no&quot;&gt;Rclrb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;arguments: &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;no&quot;&gt;Rclrb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;spin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;MinimalSubscriber&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;vg&quot;&gt;$0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;__FILE__&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;ARGV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ROSのインストールとか大変なので、Dockerで簡単に試してみる環境を準備しました。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://github.com/kishima/try-rclrb&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;GitHub - kishima/try-rclrb&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;Contribute to kishima/try-rclrb development by creating an account on GitHub.&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;GitHub&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;p&gt;実行結果&lt;/p&gt;
&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ docker compose up
[+] Running 1/1
 ✔ Container try-rclrb-ros-nodes-1  Created                                                                                     0.2s
Attaching to ros-nodes-1
ros-nodes-1  | run publisher node
ros-nodes-1  | ros2 node list
ros-nodes-1  | /publisher_node
ros-nodes-1  | ros2 topic list
ros-nodes-1  | /parameter_events
ros-nodes-1  | /rosout
ros-nodes-1  | run subscriber node
ros-nodes-1  | start subscriber node
ros-nodes-1  | Hello World!
ros-nodes-1  | Hello World!
ros-nodes-1  | Hello World!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;細かいところ対応してなさそうだが、シンプルな使い方なら普通に使えそうと感じた。必要があれば、自力でrcl叩いて拡張することもできそう。&lt;/p&gt;
&lt;p&gt;こちらも踏まえて、mruby絡めたり、いろいろ可能を探っていきたいと思って色々試しているところです。&lt;/p&gt;
</content>
</entry>
<entry>
<title>JetCobotとJetson Orin NXを迎えた</title>
<id>https://blog.silentworlds.info/2025/05/jetcobottojetson-orin-nxwoying-eta-2/</id>
<link rel="alternate" type="text/html" href="https://blog.silentworlds.info/2025/05/jetcobottojetson-orin-nxwoying-eta-2/"/>
<published>2025-05-07T22:09:53+09:00</published>
<updated>2026-05-09T12:31:19+09:00</updated>
<category term="Tech"/>
<summary>最近本業でロボットアームを扱う機会があり、いろいろ新しく知識も得たので、その経験を生かしてRubyと組み合わせていろいろ試してみたいと思って、個人でも買えるロボットアームを探してみた。</summary>
<content type="html" xml:base="https://blog.silentworlds.info/2025/05/jetcobottojetson-orin-nxwoying-eta-2/">&lt;p&gt;&lt;img src=&quot;20250506_231338_001a.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;jetcobot&quot;&gt;JetCobot&lt;a href=&quot;#jetcobot&quot; aria-label=&quot;Link to heading &#39;JetCobot&#39;&quot; data-heading-content=&quot;JetCobot&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;最近本業でロボットアームを扱う機会があり、いろいろ新しく知識も得たので、その経験を生かしてRubyと組み合わせていろいろ試してみたいと思って、個人でも買えるロボットアームを探してみた。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://shop.elephantrobotics.com/ja&quot;&gt;ElephantRobotics&lt;/a&gt;の&lt;a href=&quot;https://shop.elephantrobotics.com/ja/collections/mycobot-280&quot;&gt;myCobot280&lt;/a&gt;が手ごろで扱いやすそうなので、こちらを購入してみることにした。単体で買うとグリッパーや台座などついてなかったり、SwitchScience経由で買ったりするとちょっと高くなったりするのだけど、Yahboomの&lt;a href=&quot;https://category.yahboom.net/collections/r-robotics-arm/products/jetcobot&quot;&gt;JetCobot&lt;/a&gt;だと、一式揃って、加えてJetsonも付いて安かったので、そちらを&lt;a href=&quot;https://www.amazon.co.jp/dp/B0DD7L66L2&quot;&gt;Amazon&lt;/a&gt;で注文した。&lt;/p&gt;
&lt;p&gt;香港からの発送で、１週間ほどでUPSで届いた（配達はヤマトだった）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;20250506_223351_005.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;梱包の様子&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;組み立ては難しくなく、JetsonNanoをケースに収めて、本体とUSB接続して、電源を入れると自動で起動する。（付属の無線は使わないでおく）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;20250506_231338_001.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;myCobot本体はUSBシリアルで認識されており、それをPythonで制御している。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.yahboom.net/study/JetCobot&quot;&gt;チュートリアル&lt;/a&gt;に従えば、紹介動画にあるような画像認識と制御のデモも簡単に試せそう。&lt;/p&gt;
&lt;figure class=&quot;embed-youtube&quot;&gt;
&lt;a class=&quot;embed-youtube-link&quot; href=&quot;https://www.youtube.com/watch?v=MCuzjrofysc&quot; data-video-id=&quot;MCuzjrofysc&quot; aria-label=&quot;JetCobot 7-axis visual collaborative robotic arm for Jetson NANO 4GB/Orin NANO/Orin NX (YouTube で再生)&quot;&gt;&lt;img src=&quot;_card-e5a110c1.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;span class=&quot;embed-youtube-play&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/a&gt;
&lt;figcaption&gt;JetCobot 7-axis visual collaborative robotic arm for Jetson NANO 4GB/Orin NANO/Orin NX&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;jetson-orin-nx-16gb&quot;&gt;Jetson Orin NX 16GB&lt;a href=&quot;#jetson-orin-nx-16gb&quot; aria-label=&quot;Link to heading &#39;Jetson Orin NX 16GB&#39;&quot; data-heading-content=&quot;Jetson Orin NX 16GB&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;今回はさらに奮発して、Jetson Orin NX 16GBも購入した。&lt;/p&gt;
&lt;p&gt;仕事では会社のプロダクトがJetsonベースだったりして、Jetsonをよく使うので、&lt;a href=&quot;https://github.com/NVIDIA-ISAAC-ROS&quot;&gt;Isaac ROS&lt;/a&gt;を自分でも試して勉強したかったので購入した。別途買ってるロボカーと組み合わせてROSでVSLAMやNavigationあたりももっと試したかったのが理由。&lt;/p&gt;
&lt;p&gt;JetCobot付属のJetsonNanoだとあまり自由が利かないので、Orin NXから制御しようと思う。&lt;/p&gt;
&lt;h2 id=&quot;動かしてみる&quot;&gt;動かしてみる&lt;a href=&quot;#動かしてみる&quot; aria-label=&quot;Link to heading &#39;動かしてみる&#39;&quot; data-heading-content=&quot;動かしてみる&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Jetson nanoに最初からPythonの制御プログラムが起動するようにサービスが設定されているので、電源を入れると自動で初期位置に戻る。&lt;/p&gt;
&lt;p&gt;そのプログラム&lt;/p&gt;
&lt;h3 id=&quot;ubuntu2204とmycobot280のシリアル&quot;&gt;Ubuntu22.04とmyCobot280のシリアル&lt;a href=&quot;#ubuntu2204とmycobot280のシリアル&quot; aria-label=&quot;Link to heading &#39;Ubuntu22.04とmyCobot280のシリアル&#39;&quot; data-heading-content=&quot;Ubuntu22.04とmyCobot280のシリアル&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;JetPack6.2をインストールした環境で試していたが、myCobotにつながっているUSBシリアルをつないでもOrinNX側でうまく認識したい。&lt;/p&gt;
&lt;p&gt;CH341のドライバが読み込まれていない模様だったので、次の手順で対応してつながるようになった。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://gist.github.com/dattasaurabh82/082d13fd61c0d06c7a358c5e605ce4fd&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;Fix Driver issues for CH340N usb serial chip in Linux (Ubuntu 22.04)&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;Fix Driver issues for CH340N usb serial chip in Linux (Ubuntu 22.04) - CH340N_linux_fix.md&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;Gist&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-096d86c2.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;p&gt;そしてアームのUSBカメラの映像をCheeseで見ようとしたら、JetPack環境のlibjpegとマッチしてないようで、エラーが起きた。ffplayでUSBカメラも映ることが確認できた。JetPack環境は素のUbuntu環境と微妙に異なるので、ちょいちょいこういうことが起こる。&lt;/p&gt;
&lt;h3 id=&quot;自由に制御する&quot;&gt;自由に制御する&lt;a href=&quot;#自由に制御する&quot; aria-label=&quot;Link to heading &#39;自由に制御する&#39;&quot; data-heading-content=&quot;自由に制御する&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;JetCobotにはあまり依存したくないので、まずはmyCobotの環境をDockerでOrinNX側に作って、今後はそちらで開発を進めたい。elephantroboticsのPythonライブラリをインストールする。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://github.com/elephantrobotics/pymycobot&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;GitHub - elephantrobotics/pymycobot: This is a python API for ElephantRobotics product.&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;This is a python API for ElephantRobotics product. - elephantrobotics/pymycobot&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;GitHub&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;p&gt;バージョンによって依存関係があれこれあってビルドが通らなかったりしたが、とりあえず動かせたDockerの設定を以下に置いてある。いったんPythonを経由するが、余裕があればシリアルを叩く部分を移植できればと思う。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://github.com/kishima/mycobot-ruby&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;GitHub - kishima/mycobot-ruby&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;Contribute to kishima/mycobot-ruby development by creating an account on GitHub.&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;GitHub&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;p&gt;今後これをROS2、moveit2とも組み合わせて、rclrbとも連携させていく予定。&lt;/p&gt;
&lt;h2 id=&quot;ロボカーmentorpi&quot;&gt;ロボカー(MentorPi)&lt;a href=&quot;#ロボカーmentorpi&quot; aria-label=&quot;Link to heading &#39;ロボカー(MentorPi)&#39;&quot; data-heading-content=&quot;ロボカー(MentorPi)&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;20250510_005717_003.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;SLAM関係も試してみたいので、LiDAR、深度カメラ付きのミニカーも購入した。&lt;/p&gt;
&lt;p&gt;MentorPiという製品。Raspi5でコントロールするタイプ。&lt;/p&gt;
</content>
</entry>
<entry>
<title>mrubyとESP32 2024</title>
<id>https://blog.silentworlds.info/2024/12/eps32tomruby-2024/</id>
<link rel="alternate" type="text/html" href="https://blog.silentworlds.info/2024/12/eps32tomruby-2024/"/>
<published>2024-12-21T11:47:37+09:00</published>
<updated>2026-05-09T12:31:22+09:00</updated>
<summary>こちらはmrubyファミリ (組み込み向け軽量Ruby) Advent Calendar 2024に参加している記事です。</summary>
<content type="html" xml:base="https://blog.silentworlds.info/2024/12/eps32tomruby-2024/">&lt;p&gt;こちらは&lt;a href=&quot;https://qiita.com/advent-calendar/2024/mruby-family&quot;&gt;mrubyファミリ (組み込み向け軽量Ruby) Advent Calendar 2024&lt;/a&gt;に参加している記事です。&lt;/p&gt;
&lt;p&gt;※すみません、まだ準備中です。冬休み中に公開したいです&amp;gt;忙しい状態が続いているので、春くらいになりそう…&lt;/p&gt;
</content>
</entry>
<entry>
<title>M5シリーズのESP-IDF開発環境をWSL2&amp;Dockerで作る</title>
<id>https://blog.silentworlds.info/2024/12/m5sirizunoesp-idfkai-fa-huan-jing-wowsl2-dockerdezuo-ru/</id>
<link rel="alternate" type="text/html" href="https://blog.silentworlds.info/2024/12/m5sirizunoesp-idfkai-fa-huan-jing-wowsl2-dockerdezuo-ru/"/>
<published>2024-12-01T23:36:03+09:00</published>
<updated>2026-05-09T12:31:26+09:00</updated>
<category term="ESP32"/>
<category term="Tech"/>
<summary>ESP32 PSRAM Timer Camera X</summary>
<content type="html" xml:base="https://blog.silentworlds.info/2024/12/m5sirizunoesp-idfkai-fa-huan-jing-wowsl2-dockerdezuo-ru/">&lt;p&gt;&lt;img src=&quot;IMG_8468.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;ESP32 PSRAM Timer Camera X&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;​この記事は、&lt;a href=&quot;https://qiita.com/advent-calendar/2024/m5stack&quot;&gt;M5Stack Advent Calendar 2024&lt;/a&gt; に参加してます。&lt;/p&gt;
&lt;h2 id=&quot;久しぶりのm5esp32&quot;&gt;久しぶりのM5、ESP32&lt;a href=&quot;#久しぶりのm5esp32&quot; aria-label=&quot;Link to heading &#39;久しぶりのM5、ESP32&#39;&quot; data-heading-content=&quot;久しぶりのM5、ESP32&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;いろいろと作ってみたいものはありつつも、なかなか手がつかない日々でしたが、試したいことができたので久しぶりにM5シリーズのデバイスを買ってみました。&lt;/p&gt;
&lt;p&gt;買ってみたのは、ESP32 PSRAM Timer Cameraです。こちらを使って、HTTPSでクラウドのサービスにつないでみるのが目的です。&lt;/p&gt;
&lt;p&gt;で、今後また色々ビルドしたり、ESP32の機能を使うためにESP-IDF上で開発をしたいと思い準備しました。&lt;/p&gt;
&lt;p&gt;ESP-IDFの環境はバージョンによってしばしば互換性が失われるので、昔のコードが最新Verでビルドできないのはしょっちゅうあるかと思います。そのときESP-IDFバージョンを上げ下げするのも大変です。&lt;/p&gt;
&lt;p&gt;なので、試行錯誤するにはDockerで環境を作れると何かと便利です。その内容を共有したいと思います。環境はWSL2です。&lt;/p&gt;
&lt;h2 id=&quot;準備&quot;&gt;準備&lt;a href=&quot;#準備&quot; aria-label=&quot;Link to heading &#39;準備&#39;&quot; data-heading-content=&quot;準備&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;基本的には、&lt;a href=&quot;https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-guides/tools/idf-docker-image.html&quot;&gt;公式の手順&lt;/a&gt;を読めばわかる内容ではありますが、すこし躓いた点もあったのでそのあたり説明したいと思います。&lt;/p&gt;
&lt;h3 id=&quot;ビルドのコマンド例&quot;&gt;ビルドのコマンド例&lt;a href=&quot;#ビルドのコマンド例&quot; aria-label=&quot;Link to heading &#39;ビルドのコマンド例&#39;&quot; data-heading-content=&quot;ビルドのコマンド例&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;例えば以下のようになります。&lt;/p&gt;
&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ docker run --rm \
   -e MY_ENV_VAR=&quot;$MY_ENV_VAR&quot; \
   -v $PWD/$TARGET_PROJECT:/project -w /project -u $(id -u $USER):$(id -g $USER) -e HOME=/tmp espressif/idf:$IDF_VER idf.py build
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;$PWD/$TARGET_PROJECT:/project&lt;/code&gt; の部分でホスト側のプロジェクトをコンテナから参照できるようにしてます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$(id -u $USER):$(id -g $USER)&lt;/code&gt; ホスト側のユーザIDでコンテナ内で作業するようにします。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$IDF_VER&lt;/code&gt;の変数で、使用するIDFのバージョンを調整します。&lt;/p&gt;
&lt;h3 id=&quot;flash時のコマンド&quot;&gt;Flash時のコマンド&lt;a href=&quot;#flash時のコマンド&quot; aria-label=&quot;Link to heading &#39;Flash時のコマンド&#39;&quot; data-heading-content=&quot;Flash時のコマンド&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;通常は&lt;code&gt;&amp;quot;idf.py -p (PORT) flash&amp;quot;&lt;/code&gt;でよいはずですが、なぜそれだとエラーが起きてしまったので、build時に表示されるesptoolを使ったコマンドを利用してます。&lt;/p&gt;
&lt;h3 id=&quot;作業用のスクリプト&quot;&gt;作業用のスクリプト&lt;a href=&quot;#作業用のスクリプト&quot; aria-label=&quot;Link to heading &#39;作業用のスクリプト&#39;&quot; data-heading-content=&quot;作業用のスクリプト&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;長いDockerコマンドを毎回打つのも面倒なので、簡単なシェルスクリプトにまとめました。menuconfigやイメージの書き込みなどもコンテナで実行できます。&lt;/p&gt;
&lt;p&gt;実際のスクリプトはgithubで公開してます。（リンクは下の方に）&lt;/p&gt;
&lt;h3 id=&quot;wsl2でesp32とシリアル通信&quot;&gt;WSL2でESP32とシリアル通信&lt;a href=&quot;#wsl2でesp32とシリアル通信&quot; aria-label=&quot;Link to heading &#39;WSL2でESP32とシリアル通信&#39;&quot; data-heading-content=&quot;WSL2でESP32とシリアル通信&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;usbipdを使って、Windowsのホスト側のUSBデバイスをIP通信を介して、WSL2上でUSBデバイスとして認識させます。usbipdインストールについて検索すると色々情報が出てきますが、少し古くて、今だと不要な手順が書いてあったりするようです。&lt;/p&gt;
&lt;p&gt;今(2024/12)は以下の公式の手順で準備するのがよいと思います。うまくいくと&lt;code&gt;/dev/ttyUSB0&lt;/code&gt;として認識されました。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://learn.microsoft.com/ja-jp/windows/wsl/connect-usb&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;USB デバイスを接続する&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;usbipd-win を使用して、USB デバイスを WSL 2 Linux ディストリビューションに接続する方法について説明します。&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;learn.microsoft.com&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-e52a7e7c.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;h2 id=&quot;cameraのサンプルコードについて&quot;&gt;Cameraのサンプルコードについて&lt;a href=&quot;#cameraのサンプルコードについて&quot; aria-label=&quot;Link to heading &#39;Cameraのサンプルコードについて&#39;&quot; data-heading-content=&quot;Cameraのサンプルコードについて&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ESP32 PSRAM Timer Cameraのサンプルはいくつか存在しているのですが、それぞれ依存しているESP-IDFのバージョンが異なっているようで、最新のIDFだとビルドできなかったりして、サンプルを動かすことが難しかったです。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://github.com/m5stack/TimerCam-idf&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;GitHub - m5stack/TimerCam-idf: TimerCam idf example&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;TimerCam idf example. Contribute to m5stack/TimerCam-idf development by creating an account on GitHub.&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;GitHub&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;p&gt;こちらはアーカイブになってました。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://github.com/m5stack/M5_Camera_Examples/tree/main&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;GitHub - m5stack/M5_Camera_Examples: M5 camera series product examples.&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;M5 camera series product examples. Contribute to m5stack/M5_Camera_Examples development by creating an account on GitHub.&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;GitHub&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-4adf3254.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
&lt;p&gt;今はこちらを使うのが良さそうでした。対応してるESP-IDFのバージョンがReadmeに書いてないのですが、v5系はダメなようなので、v4.4.8で動かしました。&lt;/p&gt;
&lt;h2 id=&quot;docker開発環境の例&quot;&gt;Docker開発環境の例&lt;a href=&quot;#docker開発環境の例&quot; aria-label=&quot;Link to heading &#39;Docker開発環境の例&#39;&quot; data-heading-content=&quot;Docker開発環境の例&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;githubで開発環境用のサンプルスクリプトを公開してます。&lt;/p&gt;
&lt;p&gt;.envをいじったり、src以下にプロジェクトを配置したりして、使用できるかと思います。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://github.com/kishima/dev-esp-idf-docker&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;GitHub - kishima/dev-esp-idf-docker: Development environment for ISP-IDF on Docker&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;Development environment for ISP-IDF on Docker. Contribute to kishima/dev-esp-idf-docker development by creating an account on GitHub.&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;GitHub&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;
&lt;h2 id=&quot;さいごに&quot;&gt;さいごに&lt;a href=&quot;#さいごに&quot; aria-label=&quot;Link to heading &#39;さいごに&#39;&quot; data-heading-content=&quot;さいごに&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Dockerを使うと簡単に環境を差し替えたり、持ち運びできるので楽ですね。またmrubyビルドしたりして、面白いものを少しずつでも作っていきたいです。&lt;/p&gt;
&lt;p&gt;会社のサービスに繋いでみた話は、会社の技術ブログで後ほど公開予定です。&lt;/p&gt;
&lt;a class=&quot;card-link&quot; href=&quot;https://tech.aptpod.co.jp/&quot;&gt;&lt;span class=&quot;card-link-body&quot;&gt;&lt;strong class=&quot;card-link-title&quot;&gt;aptpod Tech Blog&lt;/strong&gt;&lt;span class=&quot;card-link-desc&quot;&gt;株式会社アプトポッドのテクノロジーブログです&lt;/span&gt;&lt;span class=&quot;card-link-site&quot;&gt;aptpod Tech Blog&lt;/span&gt;&lt;/span&gt;&lt;img class=&quot;card-link-image&quot; src=&quot;_card-3bd39505.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/a&gt;
</content>
</entry>
</feed>
