yhara.jp
フィード

herdr-appで複数のAI Agentを管理する
yhara.jp
最近herdrというOSSを使い始めたのでその紹介をします。AI Agentを並列に走らせるAI Agentに複数の作業を並行してやってもらうにはどうすればよいでしょうか。例えばターミナルを複数作り、それぞれでclaudeなりcodexなりを実行するという方法があります。が、この方法だとAI君が元気に動いているか、人間がターミナルを巡回して見回る必要があり大変です。herdr(ハーダー?)はこのためのツールで、各AI Agentが「作業中」「確認待ち」「作業完了」のどれなのかを一覧で見ることができ、管理コストが大幅に下がります。herdr TUIとherdr-app2026-11現在、herdrには2つの形があります。一つは、ターミナル上で完結するherdr TUI。もう一つはデスクトップアプリのherdr-appです。herdr-appの下回りはherdr-coreとして切り出されており、hcコマンドで操作できます。hc --skillでAI向けの説明が表示されるので、これをAIに読んでもらうことでAIにherdr-app自体の操作を任せることもできます。herdr-appにはテーマ機能(layout)があり、Slack風とか、羊さん牧場みたいにすることもできますhttps://herdr.dev/gallery/Machineherdrで面白いのが、外部のマシンで動いているAgentも管理対象にできるところです。例えば常時起動のためにVPSやEC2で動かしているAgentや、セキュリティのために独立したマシンで動かしているAgentも「Machine」として登録すれば、ローカルにいるAgentと同じように話しかけたり状態を見たりできます。また、前の記事で紹介したようなDockerコンテナ内にAgentがいる場合も、コンテナをMachineとして登録すれば対応できます。Worktreeherdrのもう一つの便利機能が、git worktreeの管理です。herdr-appの右クリックメニューからワンクリックでgit worktreeを作り、新しいブランチとディレクトリでターミナルを開くことができます。ただ、worktreeだけだとまだ並列開発には困る点もあり、いくつか工夫が必要でした。作業ディレクトリが衝突すると困るので、環境変数で変えられるようにする。リポジトリ
4時間前

Dockerとmise bootstrapでAI用の作業環境を作る
yhara.jp
AI Agentを使った開発をしていると、人間の許可を求められるたびにyキーを押すのがだんだん面倒になってきます。かといって、「何でも好きにやっていいよ」からのhome以下全削除ミスとかも怖いです。ということで、Dockerで作業環境を作ってその中でやってもらうようにしてみました。(注意点)(サンドボックスとして何を選ぶかは、何を気にしているかによって決まります。今回は「うっかり関係のないファイルが削除されること」をケアするためにDockerを選びましたが、Dockerは一般に「悪意あるコードを安全に実行するサンドボックス」としては弱いです。Dockerがあればなんでも安心、というわけではないので注意してください)Docker + mise bootsrapDockerで開発環境をつくる場合、永続したいファイルはコンテナ外に置くと思いますが、今回の手順ではほとんどのファイルをコンテナ内に置いています。作業成果はgithubにpushするのでそれでいいという判断です。反面、うっかりコンテナを削除すると途中の作業が失われるので注意してください。DockerfileはDebianにmiseを入れただけの簡潔なものにし、以降の環境構築はすべてmise bootstrapでやります。miseの設定ファイルくらいはホストと共有でもいいかもしれません。mise bootstrapmiseはrbenvやnodeenvなどのように複数の言語処理系を簡単に管理できるツールでしたが、その後いろんな機能が追加され、最近はmise bootstrapでtomlに書いた設定をもとに開発環境の初期設定ができるようになっています。今使っているmise/config.tomlは以下のような感じです。これで、mise bootstrapで必要なaptパッケージのインストール、git repoのclone、設定ファイルのsymlink作成、rubyとrustのインストールなどが走ります。(AI用ならvimは要らないんじゃないの?と思われそうですが、作業状況を手で確認したい場面がたまにあるので、「いつものツール」一式が入っていると嬉しいのです)[bootstrap.packages]"apt:git" = "latest""apt:build-essential" = "latest""apt:tmux"
5時間前

関西Ruby会議09で発表しました
yhara.jp
先月、滋賀県大津市で行われた関西Ruby会議09に参加しました。Can you see? I'm GC - 関西Ruby会議09スライド楽しんでいただけたようでよかったです。大津市は地元なので、場所が発表されたときからぜひ登壇したいと思っていたのでした。内容は、最近のRubyに入った「Modular GC」という機能を使ってカスタムのGCを作成し、GC状況をraylibで可視化するという話でした。主に性能向上のために入った機能ですが、こういう学習用途にも便利に使えると思います。実装:https://github.com/yhara/imgcスライドについて以下、振り返りと反省を兼ねて各スライドについて何を考えていたのかメモしておきます。出囃子最近の関西Ruby会議には「出囃子」という謎の文化があるみたいで、事前に伝えた曲を入場時に流してくれます。今回は発表タイトルのもとになったこれでお願いしました。Can you see? I'm SUSHI~NHK Minna no Uta ver(NHKみんなのうたバージョン)~ / PIKOTARO (ピコ太郎) - YouTube入場舞台が能楽堂(!)ということで神妙に歩こうと思ったが、笑っちゃった。無理。前口上能楽堂には必ず松の絵が書いてあって、これは神様への奉納という意味で〜みたいな話をしました。特殊な舞台をお借りしているので、「場への敬意」みたいなものをみなさんと共有したかったのです。琵琶湖は滋賀県の6分の1(元)県民アピールです。他には「琵琶湖にはたくさんの川が流入しているが、流出は瀬田川1本のみ」などがあります。まず... GCとは何か...ネットミームです。が、特に知っている必要はないです。小ネタに関しては基本、知らなくても大丈夫な範囲にとどめるのが良いと考えています。ただ知っている人に対しては、単に「GCとは何か」と書くよりも追加のニュアンス(説明の一番初めからやるということ)が伝わるという仕掛けです。「そこまでは知っている」最近無料公開でHUNTERxHUNTERが流行ってたので入れたくなりました。あと、これがないと「GCとか既に知ってるよ」という人が油断しそうなので。GCはメモリの払い出しも担当するこれ、結構意外じゃないですか?僕も今回のスライドを作るまであまり意識してない点でした。メモリとは何かこのあたり
3ヶ月前

Shapez2 クレイジー マイルストーン7&8
yhara.jp
あまりにも難しかったので解法をメモしておきます。Shapez2とは図形をコンベアで運んで加工してお題の図形を作るゲーム。クラシック クレイジー(insane)とはハードのもう一つ上の難易度。お題がことごとくダルい。タスクはほとんどやってなくてマイルストーンだけやってます。マイルストーン7お題が2個あるんですが、下の方が簡単なので、下からやると良いです。上はその3倍くらい難しいです。何が難しいって、間に隙間があるのと、隙間の上に結晶があるところですね。1手前なるべく自分で考えたい人のために、ヒントということで完成の一歩手前を示します。最後の一手がこれで、2つの図形をスワップして完成品を作っています。2手前2手前がこれ。(左右はどちらも同じやりかたで作れるので、片方だけ見せています)1/4のパーツを2つスワップして合成するのですが、左のほうだけサポート材が付いています。これが今回の肝で、これがないと隙間を維持できません。サポート材は最後に捨てるので何の図形でも大丈夫です。ということをやっている部分のようす。右下の電車は、隙間のない方のパーツをこの右で作っているので、それを取りに行っています。隙間のない方は下から順に作るだけなので特に難しくないです。…難しくないといいつつ、これくらいの面積を消費していますが。結晶を作るときに不要な部分を埋めるために、適当な図形を右から拝借しています。一度に2個作って、最後に1個ずつにばらしています。3手前隙間ありの方ですが、こうやって作っていました。黄色い部分(何色でも良い)はすべて結晶で、これの下半分だけを取り出すことで結晶が割れて隙間ができるというわけです。最初は2層目全体を黄色結晶にしてたんですが、そうすると割ったときに上のパーツが落ちちゃうんですよね。右隣・左隣の少なくとも片方は結晶じゃない図形をサポート材にしないといけなかった。全体像最後に全体像を貼っておきます。黄色の部分が簡単なほうの課題図形を、赤色の部分が難しいほうを作っています。赤色の方は手順が複雑すぎるのでさらに4ブロックに分けているという。いやはや。マイルストーン87と一緒でしょ・・・と思いきや、隙間のすぐ上に結晶があることで、7と同じ手順ではできなくなっています。結晶が割れると、そこに上下または左右に接している結晶も割れてしまうため。やり方攻略法を考えていると、意外
5ヶ月前

RubyKaigi2026函館で発表しました
yhara.jp
RubyKaigi 2026 函館でRuby on NES - how to make a smallest ruby everという発表をしました。メインセッションでの登壇は2019年ぶり。Day 0松江から羽田経由で函館空港に飛ぶプランだったのだけど、羽田全体が管制トラブルでダウンするというまさかの事態に。仕方ないので東京から新幹線で函館まで。Day 1When Can You Skip a Test? Tracking Test Impact - RubyKaigi 2026ある変更に対し、影響を受けるテストだけを実行させたいという話。定数の参照箇所を列挙するのは難しいが、YARV bytecodeを覗くとか頑張ってて面白かった。(TracePointにそういうイベントがあるべきという話なのかもしれないけど)これ実際どれくらいの精度でてるんかな?「必要なテストが実行されなかった」というケースがたまに発生するのであれば、結局全部動かさないといけなくて・・・みたいになりそうだが。mruby on C#: From VM Implementation to Game Scripting - RubyKaigi 2026Unityに組み込めるRubyを作った話。スライドが2時間話せそうなくらいあって面白かった。C#のasync/awaitとRuby側をうまく組み合わせるのどうやるんだろう(これだけで30分話せそうだが)mruby in the 8-bit world: mruby VM for Zilog Z80 - RubyKaigi 2026Z80 CPUで動くRubyを作った話。Z80用のCコンパイラがあり、それを使ってmruby VMを作ったということだった。自分のタイトルにsmallest everとか書いてしまったので抜かされたかと思っていたが、セガ・マスターシステムはメモリ8KBなのでセーフだった(?)。From Live Code to Sound: Building a Ruby Live Coding Engine - RubyKaigi 2026音枠。TwitterでPure Dataを純粋にDAWとして使ってるという人がいて、Rubyでもそういうことしてみたいんだよな。Discordで「出力を16分割する理由がわからんかった」と書いたところ、夜
6ヶ月前

「よろしくお願いします」が「よろしくお願いし〼」になってしまうタイプの文字化けがあるらしい
yhara.jp
メモ。Devin が突然 "どちらの方針で実装し〼か?" とか言い出して何かと思ったらこれだった。 Discretionary Ligatures というのか https://t.co/vTjz51C23L https://t.co/Xsf9hVXmb4— Yuki Fujisaki / rai (@tnj) March 25, 2026 リガチャ合字 - Wikipedia特定の文字の並びを、見やすさや美しさのために特殊な1文字にまとめるという習慣があり、それをコンピュータ上でも実現できるようにしたもの。Discretionary Ligaturesf+fのような伝統的なリガチャに加え、フォント固有のオリジナルのリガチャを持てるようにしたもの。(OpenTypeの仕様?)これを表示するには以下の条件が必要フォントがDiscretionary Ligaturesを持っている(例:ま+す=〼)テキスト上にその並びが現れる(例:「ます」)フォントの描画エンジンで、Discretionary Ligaturesを有効にする例えばCSSで設定するとかghosttyの場合Font quirk: Broken “ます” ligature with BIZ UDGothic when discretionary ligatures are enabled · Issue #5372 · ghostty-org/ghosttyターミナルエミュレータghosttyでdligが全面的にオンになっていて、この手の文字化けが発生していたというIssueがあった。font-feature = -dligで直るらしい(現在どうなっているかは未確認)Devinの場合Twitterを見ているとDevinユーザで同様の事象を報告している人を見る。Devinは使ったことがないのでわからないけど、WebインターフェイスのCSSでdligが全面オンになってるとかなのかもしれない。なぜこのような問題が起きるのか?issueからもリンクされていますがOpenTypeの使い方が間違っていて dlig というデフォルトオフで特殊な場合に適用されるべき合字をデフォルトオンにしてしまってるので起きてる問題ですね https://t.co/BOO5icuSYs— にゃんだーすわん (@tadsan) January 1
8ヶ月前

2025年
yhara.jp
開発Shiikaの非同期ランタイム対応を進めた一年だった。思ったよりかかってるけどさすがに来年には終わりそう。Copilotを解約してClaude Code課金勢になった。自明な型パズルとかを代わりにやってもらえるのが楽。キーボード30%キーボードをうまく使えるようになった。あと、GB到着待ちのアイテムがついに一つも無くなった。(自分がロープロに興味がないというのが大きそう)とはいえまだ打鍵すべきキーボードがたくさん積んであるので、来年は40%がメインになるかも。音楽長年のiTunes Matchユーザなんだけど、購入したアルバムが日本語/英語の2枚に分裂するという許容しがたいバグがあり、iTunesをほとんど使わなくなった。とりあえず代わりにYouTube Musicを使っているが、今後はどうしようかなあ。色々な十字架『少し大きい声』『1年生や2年生の挨拶』おいしくるメロンパン『antique』『bouquet』GRAPEVINE『あのみちから遠くはなれて』米津玄師『LOST CORNER』Kasai Takara『life』Alfa Mist『Roulette』Moonchild『Starfruit』Heteromorphic Zoo『New World』あとは、YouTube上のdj mixをよく聴いた。一つ再生すると無数に出てくるけど、なんでもいいってわけじゃないんだよな。お気に入りはこのへん。Deep House - Electronic Beats - [Matsue] - Cities #802 - YouTubeMinimal House Vinyl mix in a tiny apartment in Japan Vol.5 - by Itou - YouTubeilovesync | Minimal House mix in Shanghai | 2025 - YouTubeYoyaku instore session with Giorgio Maulini - YouTubeゲーム主にSteamゲーをやってた。面白かったやつ:ほりほりドリルLoop HeroA Solitaire MysteryÖooインクリメンタルゲームYour Chronicle(継続)Evolve(継続)Idle Planet Miner(半引退)Advent Incr
10ヶ月前

yhara配列(2025) - 30%キーボードを実用する
yhara.jp
これはキーボード #2 Advent Calendar 2025 - Adventarの記事です。9日目がまだ空いていたのでお邪魔しました。前日の記事はkiyokaさんによる親指Ctrlの話でした。私もEmacsで小指を痛めたことがあります(懐かしい)。翌日の記事はt-miyajimaさんによるPuszleの紹介でした。4段目の下にさらに一段あるのは面白いですね。ケースもすごい。てか工房もすごい。30%キーボードを実用する今年はDetour、acai、littolと40%未満のキーボードを使う年でした。特にlittolは29キーとすごく小さいですが、工夫の結果、いくらかのタイプミスはあるものの仕事で普通に使えるくらいになりました。本記事ではそのキーマップを紹介しようと思います。↑littol。かわいいね↑acai。見た目重視で最下段に6uスペースバーを選んだため、打鍵難易度が上昇↑detour。最下段が充実しており、35%キーボード入門に最適Ctrl, Shift30%キーボードで最初に考えないといけないのが「ShiftとCtrlどこに置く問題」です。私はプログラマーなのでこの2つは押しやすい位置にいてほしい。かつ、ノートパソコンのキーボードや40%キーボードのときの配列と行き来したときに大きな違和感がないことが望ましい。ということで採用したのがこれです。AキーをCtrl、ZキーをShiftと兼用する。qmk firmwareでいうMod-Tapというやつですね。40%のときと比べると少し右にずれているだけなので、これが意外に押しやすいんです。というか慣れるとむしろ40%のキーが遠く感じられるくらい。これだけだとCtrl-AやShift-Zを押すことができないため、右端にも兼用キーを用意しています。左右対称なので覚えやすい。ちなみにベースレイヤーにセミコロンが置いてあるのは、AZIKでよく使うためです。AZIKはいいぞ。数字レイヤFキー長押しで、右手側がテンキーになります。40%キーボードのときは横一列に並べてたんですが、30%だと押しづらいため、テンキー配列に変更しました。ファンクションキーも同様の配列でレイヤを用意し、Qキーに割り当てています(たまにしか使ってないですが)。移動レイヤスペースキーを長押しすると、カーソルキーなどを入力できます。40%のときは左右に
1年前

Hello Worldが動かなくなった
yhara.jp
これは言語実装 - Qiita Advent Calendar 2025 - Qiitaの16日目の記事です。私はShiikaというRuby風文法の静的型付け言語を作っているのですが、今年はずっと非同期処理の対応をしていて大きな話題(新機能とか)がないため、日々のデバッグの様子を紹介しようと思います。現象開発中のブランチで、いつのまにかputs "Hello"が動かなくなっていました。$ ./a.outthread '<unnamed>' (43953217) panicked at lib/shiika_ffi/src/core_class/string.rs:43:17:null pointer dereference in SkString::value() - value field is nullどうやら出力すべきデータがnullになっているようです。ところで上記ではコマンド名がa.outになってますよね?これだけで実はやっかいなバグだとわかります。なぜか。バグの種類Shiikaのバグはたいていの場合、「コンパイラが落ちる」という形で現れます。ShiikaコンパイラはRustで書いているので、この場合デバッグはdbg!マクロとかで普通にやればいいだけです。ところが、たまに「実行ファイルの生成までは成功するが、それを実行すると落ちる」というパターンがあります。こうなると途端に取れる手段が限られてきます。ライブラリ部分にdbgを入れるまず簡単にできるのは、ライブラリ関数にデバッグプリントを入れることです。Shiikaの組み込みメソッドの一部はRustで実装しているので、その部分に限りdbg!が使えます。試しにやってみましょう。 --- a/lib/shiika_ffi/src/core_class/string.rs +++ b/lib/shiika_ffi/src/core_class/string.rs @@ -50,4 +50,13 @@ impl SkString { pub fn as_str(&self) -> &str { std::str::from_utf8(self.value()).unwrap() } + + pub fn inspect(&self) { + unsafe { + dbg!(self.0); + dbg!((*self
1年前

Advent Incremental感想
yhara.jp
この記事は放置ゲー・インクリメンタルゲーム Advent Calendar 2025 - Adventarの14日目の記事です。クリッカーゲームに脳を焼かれた人間による布教記事|たのんこちらの記事で知ったAdvent Incrementalをプレイしました。ちょうど12月ですし。Advent Incrementalとはクリスマスをモチーフにしたインクリメンタルゲームです。第1日から第24日までの24ステージに分かれていて、12/1から始めて1日1ステージずつ攻略するのがいちばん良いと思うのですが、今回は「時間に追われながらプレイすることになったら嫌だな…」と思ったので、クリスマスを待たずに巻きでプレイすることにしました。デフォルトだと当日になるまでステージが解禁されないんですが、OptionsのIgnore dateを設定することで先に進めるようになります。良かったところ1ステージ目はよくあるシンプルなインクリメンタルゲームなんですが、24個もステージがあるということで、凝った見た目やギミックのやつもいくつかあって良かったです。あのバーがびよんびよんするやつ楽しかったなあ。アップグレードで止めやすくなるのもいい。DayをWrappingするくだりは、過去のステージを再利用する形になっていて、tomerunさんが9日の記事で書かれていた初期要素が無意味になる問題がある程度ケアされているなあと思いました。ただあんまり過去をふり返る必要があると、見るところが多すぎて大変になったり、アップグレードが追加されたのを見逃したりしやすいんですよね。そのあたりもなかなか良いバランスだったんじゃないでしょうか。最後に、終盤のFactoryの様子を貼って終わりにしたいと思います。まだまだ詰められそうだけど、そこまでは要求されなかったですね。
1年前