うなすけとあれこれ

QUIC実装月報 2026年11月

Translated by AI (and reviewed by me) from handwritten Japanese text. (日本語が後に続きます)

I spoke at 北陸Ruby会議02

Following up on September (?), I was given another opportunity to speak about QUIC in November. Thank you very much.

北陸Ruby会議02で基調講演をさせていただきました | うなすけとあれこれ

Here, I will provide more detailed descriptions of the QUIC-related progress from my presentation.

I’ve switched this blog to be served by my own QUIC implementation

Originally, after various iterations, this blog was operated as a static website where HTML generated by Middleman was placed on S3 and served via CloudFront. While it remains a static website powered by Middleman, I have replaced the delivery mechanism from CloudFront+S3 to my own implementation of the QUIC protocol.

I implemented two components: raiha, which also implements the QUIC protocol layer in Ruby, and the quic gem (described later), which is a binding for ngtcp2. I have both running on the same server and use pf to randomly route packets, ensuring that a response is returned from one of the implementations.

As I mentioned with pf, this is running on OpenBSD. There are two reasons for this. First, it is to verify whether it works in an environment with a cryptographic backend other than OpenSSL. Second, at RubyKaigi a few years ago, jeremyevans recommended OpenBSD to me, and I’ve always felt a sense of guilt for never having given it a try.

Just as osyoyu, who creates a profiler, implemented his own blog with Rails as a testing ground for that profiler, I felt the need to create a place where I could verify that my own implementation is working correctly, which is why I’m doing this.

Railsでブログ自作(2024) - osyoyu.com/blog

How is it? Seeing this instead of the website you expected? If so, it means HTTP/3 is working thanks to my implementation.

dohyo: The Authoritative DNS Server for blog.unasuke.com

In previous monthly reports, I mentioned that I’ve deployed a custom-implemented full-service resolver at home and am using it as a testbed for DoT and DoQ. While I will continue to operate it, a situation where I’m the only one inconvenienced when it goes down lacks a sense of urgency; moreover, it isn’t particularly well-suited for verifying DoQ. While I’ve been able to verify DoT by incorporating it into my systemd-resolved configuration, for DoQ, there are no clients to send requests to, even if the full-service resolver is listening.

To address this, I have implemented and deployed a new authoritative server called dohyo for blog.unasuke.com.

https://github.com/unasuke/dohyo

Claude suggested the name because names starting with “Do”—such as DoH and DoQ—are similar in meaning to a sumo ring (dohyo) when incorporating the meaning of “Zone.” If this authoritative server goes down, this blog will become inaccessible, which adds a sense of urgency. Incidentally, I am using socketry/protocol-quic for the QUIC layer implementation of dohyo. The reason it is not my own implementation is that my own implementation is tested by the web server for this blog itself; thus, I want to verify that protocol-quic—the other QUIC implementation that (for some reason) has commit access—is working correctly.

While this serves as a practical verification of DoQ, the reality is that even if this authoritative server were listening for requests via DoQ or DoT, widely adopted full-service resolvers would rarely send queries using DoQ, DoT, or DoH. However, an initiative called ADoX is currently underway, and the proportion of name resolution traffic that is encrypted will likely gradually increase.

ADoX Status and Deployment :: dnsprivacy.org

Of course, I also want to set up my own home full-resolver to support ADoX, so that when I access my own blog, the name resolution queries are sent and received in an encrypted state.

By the way, 「基礎と実践が1冊で学べる! DNSマスターブック」 was very helpful for gaining knowledge about DNS. Reading this book helped me understand that operating my own authoritative DNS server (and doing so via a new implementation!) would actually be reckless, but well… yes.

北陸Ruby会議02で話してきました

9月に引き続き(?)11月もQUICについて話す機会をいただきました。ありがとうございます。

北陸Ruby会議02で基調講演をさせていただきました | うなすけとあれこれ

ここでは発表の内容のうち、QUIC関連の進捗に絞ってより詳細に記載していきます。

このブログを自分のQUIC実装によって配信するようにしました

もともとこのブログは様々な変遷を経て、Middlemanが生成したHTMLをS3に配置し、Cloudfront越しに配信する静的Webサイトとして運用していました。Middlemanによる静的Webサイトのままではあるのですが、その配信をCloudfront+S3から自分の実装したQUICプロトコルによるものへと差し替えました。

自分が実装したのは、QUICプロトコルレイヤもRubyで実装されているraihaと、ngtcp2のbindingであるquic gem(後述)の2つあるのですが、その両方を同じサーバー上で動かし、pfによりランダムにパケットを振り分けることで、どちらかの実装からレスポンスを返すようにしています。

pfと書いたように、これはOpenBSD上で動かしています。なぜOpenBSDなのかという理由は2つあります。まず1つが、OpenSSLではない暗号バックエンドの環境において動作するかどうかの検証目的というもの。2つ目が、数年前のRubyKaigiにてjeremyevans氏にOpenBSDをお勧めされたものの、一向に触れられていなかった負い目をずっと感じていたというものです。

プロファイラを作っているosyoyuさんが、そのプロファイラの実験場として自分のブログをRailsで実装したのと同様に、自分も自分の実装がちゃんと動いているか検証できる場を作る必要があると感じたためにこれをやっています。

Railsでブログ自作(2024) - osyoyu.com/blog

どうでしょうか。あなたの予想に反して、 このページが見えているでしょうか?見えていれば僕の実装によってHTTP/3が動いていることになります。

blog.unasuke.com の権威DNSサーバー、dohyo

これまでの月報において、自前実装のフルサービスリゾルバを宅内に配置し、DoTやDoQのテストベッドとして運用しているという話をしました。これについては引き続き運用していくのですが、どうしても落ちたときに自分だけしか困らない状況というのは切迫感が出ませんし、そもそもDoQの検証として使用するのにはあまり適してはいません。DoTこそsystemd-resolvedの設定として投入することで検証できていますが、DoQについてはフルサービスリゾルバが待ち受けたとしてもリクエストを送ってくれるクライアントがいません。

そこで、blog.unasuke.com の権威サーバーとして新規にdohyoというものを実装し、deployしています。

https://github.com/unasuke/dohyo

名前は、DoH、DoQなど “Do” から始まり、Zoneという意味を取り入れると相撲の土俵が意味として似ていることからこうしました、Claudeが。この権威サーバーが落ちたらこのブログが見れなくなってしまうことになり、緊張感も増すというものです。ちなみにdohyoのQUIC層の実装として使用しているのはsocketry/protocol-quicです。自分の実装ではないのは、自分の実装のテストは前述のこのブログ自体のWebサーバーが担っているので、(なぜか)commit bitを持っているもうひとつのQUIC実装であるところのprotocol-quicがうまく動いているかの検証のためです。

DoQの実地検証としての取り組みではあるのですが、実のところ、この権威サーバーがDoQないしDoTでリクエストを待ち受けていたとて、世に普及しているフルサービスリゾルバがDoQやDoT、DoHでクエリを送ってくることは滅多にありません。しかしそこはADoXという試みがまさに今行われており、徐々に世間一般で行われる名前解決の通信内容が暗号化される割合は上がっていくことでしょう。

ADoX Status and Deployment :: dnsprivacy.org

もちろん自分の宅内フルリゾルバもADoXに対応させ、自分が自分のブログを読みにいくときに名前解決のクエリが暗号化された状態で送受信されるようにしたいです。

ところでDNSについての知識を得るのに、「基礎と実践が1冊で学べる! DNSマスターブック」がとても役立ちました。この本を読んでいくことで、むしろ権威DNSサーバーを自分で運用する(それも新規実装で!)ということが無謀であることは理解できていくのですが、そこはまあ……はい。

2026年11月15日

北陸Ruby会議02で基調講演をさせていただきました

この度は、北陸Ruby会議02の基調講演者としてお招きいただき、ありがとうございました。

https://regional.rubykaigi.org/hokuriku02/

オファーをいただいたタイミングで、会場が福井県立恐竜博物館になると聞き、化石発掘を絡めて「dig」という単語を使いたいというのと、プロトコルのossificationについてのネタは入れたいなという2つのアイデアがありました。ただ、その時点でも自分のQUIC実装は不完全な段階であり、digないし関連するDNSのことについては完全に無策な状態でした。

ossificationを題材にするとはいっても、RFC 9000の内容を話すのはそもそも時間も足りませんし、内容も難しすぎます。これに関しては、RFC 8999についてはあまり着目されていないだろうという仮定のもと、そこから誤った仮定やgreasing、ossificationについての話題に繋げられそうだと考えました。(まあdigはDoQに対応してはいませんけど)

ただ、digをどうするか、DNSをどうするかについては少し悩み、一旦考えることを後回しにしていました。そして、protocol-quicの実運用について考えていたとき、これで権威DNSサーバーを実装してDoQに対応させたうえで、そこに対してdigで問い合わせるというアイデアを思い付きました。

そういうわけで、トークの内容をざっくり3部構成とし、まず自己紹介、次にプロトコルのossification、最後に自分のこれまでの取り組みとその現時点での成果という流れでトークを組み立てることにしました。そしてあとは実装するだけ……

さて発表本番では、どうにか実装を間に合わせることができ、かつ当日皆さんにお披露目したデモが成功してひと安心しています。デモでお見せした内容の技術的詳細については、また別のQUIC実装月報にまとめようと思っています。発表資料はこちらです。

北陸Ruby会議02 基調講演 "Dig It!"

個人的には、QUICの仕様及び実装の複雑な部分に深入りして聴衆を置いてけぼりにすることなく、楽しく、かつ学びになる話ができたかなと思っています。皆さんもそうだったでしょうか?

最後に、北陸Ruby会議02を開催してくださり、自分を基調講演者として招待してくださった運営の皆さま、そして会場にお越しいただいた参加者の皆さま、本当にありがとうございました。

2026年11月15日

Kaigi on Rails 2026 - an organizer's weblog

Kaigi on Rails 2026 photo booth with nobody

Acknowledgments

Thank you to everyone who attended Kaigi on Rails 2026. Thanks to the speakers, those who submitted proposals, the sponsoring companies, and all the participants, Kaigi on Rails 2026 was successfully completed.

Below is a brief retrospective.

Kaigi apps

This year, we made significant updates to the conference-app and also modified the signage-app to better align with our specifications. Additionally, we implemented Kamal’s deployment for the conference-app and cfp-app. We benefited greatly from AI-powered coding assistance in these projects. I feel that the improved capabilities of AI have helped alleviate some of the workload involved in conference management.

Next year

I’ll do my best.

感謝

Kaigi on Rails 2026に参加していただいたみなさま、ありがとうございました。登壇者の皆様、Proposalを出してくださった皆様、協賛してくださった企業の皆様、そして参加者の皆様のご協力のおかげでKaigi on Rails 2026も無事に終えることができました。

以下、簡単なふりかえりです。

Kaigi apps

今年もconference-appには大幅に手を入れましたし、signage-appも我々仕様になるような改変を加えました。それに、conference-appとcfp-appはKamalによるdeployを導入しました。それらにはAIによるコーディング支援を多大に受けています。AIの向上した能力によって、カンファレンス運営の労力はいくらか軽減できたのではないかと感じます。

来年

がんばるぞ

2026年10月27日

QUIC実装月報 2026年9月

Translated by AI (and reviewed by me) from handwritten Japanese text. (日本語が後に続きます)

RubyKaigi 2026 follow up and Fastly Tech Meetup vol.1

I gave talks at two events in September:

RubyKaigi 2026 followup
Fastly Tech Meetup vol.1: QUIC, 103 Early Hints

At both events, the people I met there greatly influenced my progress this month. Thank you all very much. Perhaps I should make a habit of regularly stepping outside my home.

quic-ruby (quic gem)

https://github.com/unasuke/quic-ruby

At the follow-up event, I was encouraged by someone saying, “Since you’ve secured a good namespace, you should…”, which motivated me to finally address the untouched diffs in my repository. The diff in question was related to distributing the gem as a fat package by adopting LibreSSL as the encryption layer, as ngtcp2 had listed it as “experimental” in their README.

Later, during a conversation with kazuho at the Fastly event, he suggested using h2o/picotls. At that time, one unclear point was whether picotls would function properly when running on systems with LibreSSL instead of OpenSSL (specifically, whether the OpenSSL APIs picotls uses were available in LibreSSL). However, subsequent testing with MCP app revealed that this approach might actually work, so I decided to proceed with this direction. In other words, instead of distributing as a fat gem containing both ngtcp2 and LibreSSL, I modified the distribution method to download and install ngtcp2 and picotls at runtime, utilizing the C APIs of either OpenSSL or LibreSSL depending on the execution environment.

https://github.com/unasuke/quic-ruby/releases/tag/v0.0.2

Raiha

This is a Pure Ruby implementation. As previously noted in an issue reported by thekuwayama regarding TLS layer implementation, there were some inefficient aspects in the initial design. While I could use AI to drive the development process and successfully discuss the QUIC protocol, I realized that continuing implementation while carrying over these inefficiencies would be overly challenging, so I decided to thoroughly redesign the architecture.

My Personal MPC: mcp-coderunner-app

Throughout the extensive design iterations, there were numerous instances where I needed to write code to validate whether the design was reasonable or to determine which approach would perform better in benchmarks. While I could technically use Claude Code on my local machine, when I wanted to do this even on my smartphone while on the go, the terminal interface becomes significantly limited in screen size, making operations noticeably sluggish. Therefore, I developed a Rails application that communicates with MCP. The screenshot at the beginning shows the management interface for this application.

https://github.com/unasuke/mcp-coderunner-app

This is a MCP server that allows you to execute arbitrary Dockerfiles and scripts on your home machine via MCP and return the results. While lightweight scripts can be executed directly on Claude.ai, scenarios like wanting to test different language versions, testing in environments with specific libraries, or verifying that external library builds succeed would naturally benefit from offloading these tasks to more powerful resources. Thus, I created this application that combines a lightweight management interface with local docker run workers. Although it’s publicly released as OSS, it’s strictly for my personal use. Having the code publicly available means I get free CI services and easier deployment…

I’ll be off in October.

Everyone, please come to Kaigi on Rails 2026.


RubyKaigi 2026 follow upとFastly Tech Meetup vol.1

9月は2つのイベントで喋っていました。(スライド本体は冒頭にて)

どちらのイベントにおいても、そこで話した人達から今月の進捗に多大な影響を貰っています。皆さんありがとうございます。やはりこまめに家の外に出るべきなのかもしれません。

quic-ruby (quic gem)

https://github.com/unasuke/quic-ruby

follow upイベントにて「いい名前空間を抑えてるんだから」という発破をかけられたので、手付かずだった手元のdiffを整えはじめました。そのdiffというのが、ngtcp2がREADMEに “experimental” として記載していたために暗号化層としてLibreSSLを採用することに伴うfat gemとしての配布です。

その後Fastlyのイベントでkazuhoさんと話し、h2o/picotlsを使うアイデアを頂きました。このときはpicotlsを使用した際、動作環境にOpenSSLではなくLibreSSLがある場合にうまいこと動くのか(picotlsが使用しているOpenSSLのAPIがLibreSSLに存在するか)という部分が不明瞭だったのですが、後述するMCPでの検証でどうやらうまくいきそうだということがわかったので、そのように方針転換しました。

つまり、ngtcp2とLibreSSLを同梱したfat gemとして配布するのではなく、実行環境のOpenSSL/LibreSSLのC APIを使用するようにinstall時にngtcp2とpicotlsをダウンロードしてbuildする形式になったということです。

https://github.com/unasuke/quic-ruby/releases/tag/v0.0.2

Raiha

こっちはPure Rubyでの実装です。以前にthekuwayamaさんからTLSレイヤの実装についてissueで報告を受けたことがあるように、初期の設計に非効率な部分がありました。AIに開発をドライブしてもらってQUICプロトコルを話すことはできたものの、それをひきずったまま実装を重ねてもしんどいだけだなと感じていたので、入念に設計しなおすことにしました。

自分専用MPC : mcp-coderunner-app

設計をずっと重ねていくうちに、妥当な設計かどうか、ベンチマーク上で有利なのはどちらかなど、確かめるためにコードを書かなければいけないということが多々あります。ローカルマシンのClaude Codeでやればいいのかも知れませんが、移動中のスマートフォンでもやりたいとなるとターミナルの操作は画面も小さいですし、どうしてももたつきます。というわけでMCPを話すRails appを作りました。冒頭のスクリーンショットはこれの管理画面です。

https://github.com/unasuke/mcp-coderunner-app

これは、任意のDockerfileと任意のscriptをMCP経由で自宅マシン上で実行し、結果を返すことのできるMCPサーバーです。軽いスクリプトならClaude.ai上で実行できますが、言語のバージョンを色々試したいだとか、特定のライブラリのある環境で試したいだとか、外部ライブラリのビルドが通るか確認したいだとかは、強力なリソースがあればそこにオフロードしてやりたいものです。なので、薄い管理画面とローカルでdocker runをするワーカーの組み合わせからなるアプリを作りました。OSSとして公開してはいるものの、自分専用です。コードがpublicになっているとCIが無料ですし、deployがやりやすいので……

10月はお休みです

みなさんKaigi on Rails 2026に来てくださいね。

2026年09月27日

QUIC実装月報 2026年8月

carbuncle DoH query result

Translated by AI (and reviewed by me) from handwritten Japanese text. (日本語が後に続きます)

July and August Achievements

I skipped the monthly report for July because I was completely occupied with tasks like reviewing proposals for Kaigi on Rails 2026, working on Ferryman, and the preparatory work surrounding Kaigi on Rails that led to its creation.

As for what I’ve been working on, I’m continuing to implement a DNS full-service resolver. For name resolution within my home network (using the Tailscale network), it’s already at a stable, usable level with occasional name resolution failures that I’m addressing one by one through development (handled by Claude Code).

In addition to this, I’ve added DoH implementation alongside DoT to enable operation of our own TLS implementation. The screenshot above shows the results of a DoH query.

It’s been quite some time now since I’ve done any work on QUIC at all.

RubyKaigi 2026 follow up event

https://rhc.connpass.com/event/392503/

While I didn’t talk at RubyKaigi 2026, I’ll be speaking about 2026’s achievements at the follow-up event. This will essentially serve as a summary of this monthly report. As of when I’m writing this blog post, there are still some available spots for in-person attendees, so anyone interested in learning about the progress made by people since RubyKaigi 2026 is welcome to attend.

7月、8月やったこと

7月の月報はサイレントにスキップしましたが、Kaigi on Rails 2026のproposalレビューとか、Ferrymanとか、それを作るきっかけとなったKaigi on Rails回りの準備作業をやっていたらそれどころじゃなかったのが原因です。

というわけでやっていたことですが、6月の月報にも書いていたDNS full service resolverの実装を進めています。自宅内(Tailscale network)内での名前解決については常用できるレベルで、たまに名前解決ができないケースがあるので都度修正、というふうに開発を(Claude Codeが)行っています。

それに追加し、自前のTLS実装の運用環境として動かせるように、DoTの実装に加え、DoHの実装を追加しました。冒頭のスクリーンショットはDoHでクエリしたときの結果です。

いよいよQUICのことをなにもしていない期間が長いですね。

RubyKaigi 2026 follow upで発表します

https://rhc.connpass.com/event/392503/

今年もRubyKaigiで発表した訳ではないですがfollow up eventで2026年の成果について話します。基本的にはここの月報のまとめとなる予定です。ブログを書いている時点では現地参加の枠がまだ少し残っているので、RubyKaigi 2026以降の人々の進捗に興味のある方はぜひお越しください。

2026年08月30日

IETF 126 Viennaの個人的まとめと、MCPサーバーへの機能追加

IETF 126

https://datatracker.ietf.org/meeting/126/proceedings

IETF 126は2026年7月18日〜24日にオーストラリア、ウィーンで開催されました。例によって以下は個人的な感想を無責任に書き散らかしたものです。内容の誤りなどについては責任を取りませんし、まとめもAIによって生成したものです。

WGの記載はscheduleの順です。

happy

どこかの集まりで「HEv3を実装できてるところはまだないんじゃないか」とか発言した記憶がありますが、全然そんなことなかったですね。Firefox Nightlyではデフォルトで有効になっています。実装は https://github.com/mozilla/happy-eyeballs に。あと https://www.happy-eyeballs.net というものができています。

ChromiumのほうではOptimistic DNSというものに取り組んでいるとか。

iOSで実装されている、期限切れDNSキャッシュを活用する Optimistic DNS について - ASnoKaze blog

moq

このセッション自体MoQで配信されたんだとか。

前回のまとめで言及するつもりで忘れていたんですが、 https://buttondown.com/moqmonthly/archive/ というものがあって定期的にmoq関連の動きをまとめる動きがあるようです。が、あまり更新されない……

moqt:// というschemeが定義されるようですね。

ccwg

はい。(一応まとめてはみたものの何もわからんな……)

tiptop

アドレス空間をどうするか、という問題についての議論が多かったようだ。

webbotauth

“Crawler Best Practices” は読んでおいたほうがよさそう……

関連する話として、Cloudflare Walletsが発表されていましたね。

Announcing Cloudflare Wallets: The programmable wallet for the agentic Internet | Cloudflare Blog

masque

recharterの話とか。proxy-dns-svcbについての話で盛り上がっていた様子。

quic

QMuxの実装が結構行われている。qlogもそろそろWGLCになりそう。

tls

TLSのmlは荒れてましたね……そういえばTLS 1.3のRFCとしてRFC 8446をObsoleteするRFC 9846が出ましたね。

https://datatracker.ietf.org/doc/html/rfc9846

httpbis

Oblivious HTTPについてどうするという話でどうするかという議論になっていそう。

scone

SCONEがそろそろRFCになりそう。

AIのまとめページを共有可能にした

という感じでざっとIETF 126をおさらいしました。前回のまとめ記事でMCPサーバーを運用している話をしましたが、今回は各WGでの議論の様子をまとめた内容をAIに書いてもらったテキストとして共有できる仕組みを実装しました。そのせいもあってこっち側に書くことがあんまりなくなってしまいましたが。これはこれで。

一応真偽については裏を取る必要があるとは思っていますが、前々回同様に実際に読んでまとめるよりはるかに楽にサマリーを生成してくれるのはありがたいですね。そして読めているかについては……まあ……盲目的に信じることもできないので、隅々までは読めてないです。

2026年08月23日

リモートマシンでListenしているポートをPort forwardingするのを手軽にするツールを作りました

ferrymanのスクリーンショット。現在接続しているhost、forwardingしているポート、forward候補のサジェスト、ステータス、forwardの追加フォームが表示されている。

Zedを常用するようになって地味に困っていること

もっぱらVS Codeを日々の開発で使用していたのを、最近はZedを使うようにしています。キーバインドやUIの作法が違っていて操作にとまどうのは慣れの問題なのでいいとして、機能そのものが欠けている点についてはどうしようもありません。

現在のZedになく、VS Codeで常用していた機能に、リモートマシンのポートを自動でPort forwardingしてくれるというものがあります。僕の日々の開発は家の中にあるUbuntuマシンに対して、同じく家の中のWindowsマシンからVS Code Remote SSHしたり、外出先のMacBookやiPhoneからTailscale経由で接続してコードを書いたり書かせたりして行っています。VS CodeやZedを動かしているのはWindowsやMacBook上ですが、SSH先のUbuntu上で起動したrails serverやbridgetownでlisternし始めたポートに対してホスト機からアクセスしたくなることが頻繁にあります。そのようなとき、VS Code Remote SSHであれば、VS Code上のterminalで起動したプロセスのlistening portに自動でport forwardingしてくれる便利機能がありますし、そうでなくてもforwardしたいポートを手軽に追加できます。

https://code.visualstudio.com/docs/remote/ssh#_forwarding-a-port-creating-ssh-tunnel

対してZedでは、port forwardを指定する機能はあります。ですがこれはZedを再起動する必要がありますし(自分が試したとき確かそうだった)、設定ファイルを編集する必要があります。

https://zed.dev/docs/remote-development#port-forwarding

この便利な機能のためにVS CodeをZedの裏で動かしておく、ということをしていたのですが、単機能のものなら作れるんじゃないかということでClaude Codeとお話ししながら作ったのがこのFerrymanというGUIアプリケーションです。

unasuke/ferryman

https://github.com/unasuke/ferryman

実装はGo、GUIにはFyneを使っています。Goを使った理由は開発、配布が簡単なことが主な理由です。名前もClaudeに考えてもらいました1。

開発はWindows上で、Claude Codeと行いました。一応macOSでも動くことは軽く確認していますが、検証という意味ではWindowsでしか行っていません。

設定の保持、forward対象の追加、新規forward対象の提案を行います。ターミナルの出力を監視するのではなく、裏側で新規にlisternしているportを見つけるという挙動になっているため、Railsのsystem specを実行するとSuggestionsが暴れるという挙動があったのですが、提案上限や検出方法を調整して、まあこのくらいなら……という挙動にしています。

7月中はこれを使ってKaigi on Rails 2026のWebページの開発であったり、cfp-appの開発などを行っていました。その過程で個人的には大分満足できる程度の完成度まで上げられたので公開に踏み切りました。

まとめ

万人に使ってほしいと思っているわけではないですし、似たようなツールも見つけられてないだけで既に存在しそうですが、同じような課題を抱える人が自分以外にも数人くらいはいそうなので公開しました。こういうちょっとしたツールをAIの力で作れるようになったのは良いですね。

  1. Go界隈で “ferryman” はユニークではなく、 https://pkg.go.dev/github.com/rharmse/ferryman という既存のものがありますし、「ネットワーク」という観点で見れば領域も被ってはいるのですが……どちらも一個人のツールというところで衝突はそんなに問題にならないだろうとは思っています。 ↩

2026年07月31日

QUIC実装月報 2026年6月

carbuncleのtelemetry

Translated by AI (and reviewed by me) from handwritten Japanese text. (日本語が後に続きます)

June’s progress

While I hinted at working on QUIC implementation in our monthly report last month, I haven’t actually made any progress on QUIC implementation this month. However, this was intentional - I’ve been working on something else instead.

There are three QUIC implementations that particularly interest me: Raiha, my own Pure Ruby implementation; ruby-quic, a binding for ngtcp2; and Samuel’s implementations of protocol-quic and protocol-http3. I’ve been considering how best to test these implementations - how they actually function, what API interfaces they provide, and how they perform over extended periods of operation. The perfect test environment turned out to be a DNS full-service resolver. By supporting both DoQ and DoH3, it could serve as comprehensive testing ground for both QUIC and HTTP/3.

https://github.com/unasuke/carbuncle

Since I know absolutely nothing about DNS resolver, I’ve been accepting Claude Code’s generated code without thoroughly reviewing it and proceeding with development. I started having Claude Code work on this mid-last month, and it’s currently running on a Raspberry Pi at home, functioning perfectly for my daily personal name resolution needs and serving as my home’s DNS full-service resolver. The screenshot at the beginning shows the results of enabling telemetry output. Currently, DoQ support isn’t implemented yet1, and I’m focusing on developing the basic resolver functionality. While I’ve made the code publicly available, I don’t intend to promote widespread adoption at this time.

6月やったこと

さて先月の月報でやっていきそうな素振りを見せましたが、今月は特にQUICの実装に関しては動いていません。ですがこれは意図的で、別のものを作っています。

自分の関心があるQUIC実装は現時点で3つあります。Pure Ruby実装で自分が取り組んでいるRaiha、ngtcp2のbindingであるruby-quic、Samuel氏の実装しているprotocol-quic及びprotocol-http3です。これらの実装が実際にどう動くのか、どのようなAPIで使用できるのか、長時間運用してみてどうか、などのことを検証する方法について考えていました。そしてちょうどいいのがDNS full service resolverです。DoQ、DoH3に対応すれば、QUICとHTTP/3の両方についての検証環境となりえます。

https://github.com/unasuke/carbuncle

こればかりは本当に何もわからないので、Claude Codeの生成するコードをろくに確認もせずにacceptして開発を進めています。先月中旬からClaude Codeに開発させ始め、現在は自宅のRaspberry Pi上で動かしていて、日々の個人的な名前解決、宅内でのDNS full service resolverとしての運用に関しては問題なく稼動しています。冒頭のスクリーンショットは、telemetryを出力させた結果になります。まだDoQ対応はできておらず1、基本的なリゾルバとしての機能を満たせるように開発を進めています。とりあえずコードは公開はしていますが、広く使ってもらおうとは考えていません。

  1. Although DoT implementation is complete at this point, it hasn’t been deployed for actual operation yet. / 現時点ではDoTの実装が完了しているものの、まだ実運用には乗せていません。 ↩ ↩2

2026年06月28日

QUIC実装月報 2026年5月

Claude Codeに手助けしてもらっている様子

Translated by AI (and reviewed by me) from handwritten Japanese text. (日本語が後に続きます)

May’s progress

As mentioned in the April monthly report, I’ve been developing with significant AI assistance. While I didn’t push any changes in April, I recently committed my local modifications.

Although I haven’t completed full interop testing with quic-interop-runner, I have passed interop tests with both quic-go and quiche, reaching a stage where QUIC and HTTP/3 communication is now possible. I’ve also prepared sample scripts under /examples. We can already establish connections with several known HTTP/3 endpoints, including cloudflare-quic.com. I need to set aside dedicated time to thoroughly review the entire codebase at some point. Now, regarding the Pure Ruby QUIC implementation discussed above - in practical use cases, no one would deliberately choose to use a potentially slower implementation when there are established, proven solutions available. Both in terms of interoperability and security, relying on such established implementations is superior.

With this in mind, I’ve also created a binding implementation for ngtcp2 and been advancing the development process (with AI assistance). Since I was able to acquire the exact namespace I wanted1, I feel a significant responsibility to build on this foundation. I’ll continue enhancing the implementation’s quality to serve as a viable option for those looking to perform QUIC communication in Ruby.

This initiative began when I received encouragement from kazuho at RubyKaigi 2026 (or at least that’s how I interpreted it?).

protocol-quic, yet another QUIC implementation for Ruby

By the way, Mr. Samuel Williams as known as ioquatix is also working on making QUIC and HTTP/3 available from Ruby. He focuses on enriching the asynchronous I/O ecosystem and has released several projects under https://github.com/socketry, including falcon and protocol-http2.

Inside these repositories, you’ll find https://github.com/socketry/protocol-quic, a gem that uses ngtcp2 as its backend also. After encountering build issues in my environment during RubyKaigi 2026’s post-event gathering at SmartHR, I consulted with them about these problems, and through various circumstances, I was added to the Maintainers Team for the Socketry organization.

Just a few days later, https://github.com/socketry/protocol-http3—which uses nghttp3 as its backend—was also released. Around this time, I collaborated with them at a coffee shop just before RubyKaigi 2026’s post-event gathering at Pixiv, and we successfully incorporated some patches into the project.

I was able to discuss various things with Samuel regarding future Socketry-related projects, so I’ll be actively working on them to the best of my ability.

5月やったこと

先月の月報にも書いたように、実装の大部分をAIに支援してもらいながら開発を進めています。4月の時点ではpushしていませんでしたが、先日手元の変更をpushしました。

quic-interop-runnerでの完走こそしていませんが、quic-goやquicheとのinterop testは通過しており、ある程度の完成度でQUIC、HTTP/3による通信ができる段階までにはなっています。/examples 以下にサンプルスクリプトも用意しました。cloudflare-quic.com など、いくつかの既知のHTTP/3 endpointに対して通信が可能なところまではできています。どこかで腰を据えて改めてコード全体を読む時間を作りたいです。

さて、これまでの話はPure RubyによるQUIC実装についてでしたが、実ユースケースにおいてはわざわざ遅い(であろう)実装を使いたい人というのはいないでしょうし、実績のある既知の実装に頼るほうが相互運用性の面でも、セキュリティの面でも優れています。

そんなわけで、ngtcp2のbinding gemとしての実装も作成し、実装を(これもAIと共に)進めています。名前空間についてはそのものズバリのものを取得できた1ので、責任重大という感じがします。RubyでQUICによる通信を行いたい人の選択肢となれるように引き続き完成度を高めていきます。

この取り組みはRubyKaigi 2026でkazuhoさんに背中を押された(と僕が勝手に思い込んだ?)ことがきっかけで始まりました。

protocol-quic, yet another QUIC implementation for ruby

ところで、RubyからQUIC、HTTP/3を利用可能にするための活動はioquatixことSamuel Williams氏も取り組んでいます。彼は非同期I/Oのエコシステムを充実させることに注力しており、 https://github.com/socketry 以下で falcon や protocol-http2 などを公開しています。

それらのrepositoryの中にngtcp2を利用したgemである https://github.com/socketry/protocol-quic があるのですが、先日行われたSmartHR社でのRubyKaigi 2026アフターイベントにおいて自分の環境でbuildがうまくいかないことなどを相談した結果、色々あってSocketry orgのMaintainers Teamに加えていただきました。

またその数日後にnghttp3をbackendとする https://github.com/socketry/protocol-http3 も公開されたのですが、こちらもピクシブ社でのRubyKaigi 2026アフターイベント直前の喫茶店において一緒に作業をし、patchを取り込んでもらいました。

Socketry関連でこれからやりたいこと、やるべきことについてはSamuel氏と色々話すことができたので、自分のできる範囲で手を動かしていきたいです。

  1. I’m willing to relinquish it if necessary. / 何かあれば明け渡すつもりはあります ↩ ↩2

2026年05月28日

RubyKaigi 2026 参加記

RubyKaigi 2026函館アリーナ側1F サブアリーナに向かう階段に設置していたサブアリーへの案内板

函館に辿り着く方法

大型自動二輪免許を取得したうえに、全然そのつもりはなかったけどバイクを購入したので、せっかくなら函館にもバイクで向かおうと考えてはいました。ただ、4月の函館、というよりはフェリーを利用した場合の苫小牧から函館までの経路において雪の可能性を捨てきれないという助言を頂き、リスク回避のため飛行機で向かうことにしました。結果としては桜の開花も早まるくらいには暖かく、雪の心配はなかったわけなのでちょっと悔しい思いはしています。

#RubyKaigiNOC

これは#rubykaigiお前しか撮ってないやろ選手権 に参加できそうな、会場のとある部屋にあった「インターネット」の壁

今年もNOC memberの一員として関わらせていただきました。また、昨年からサブスクリーンやサイネージのオペレーションも一部担当しています。朝に “good morning!” とか言ってるのはサブスクリーンのテストだったりして。ちなみにこの運用経験はKaigi on Railsに輸入されており、大変ありがたく思っています。

hallway track

さて、「カンファレンスの本質は廊下にある」12というように、今年のRubyKaigiでも懇親会やWhite Seedなどの概念廊下で色々な方と話し、相談させていただきました。特にkazuhoさん、まつもとさん(Matz)、成瀬さん、しおいさん、おしょうゆさんらとの会話ないし議論において、自分が今後やるべきことについての方向性が見えてきた気がしています。できれば例年開催されるfollow-up eventで何か話せるといいんですが。

レジャー

北海道に来るのは初めてではないですが、函館は初めてだった3ので、会期後、撤収作業までの間に色々なところを見て回りました。以下はその写真達です。

RubyKaigi 2026 Day4 北海道最南端の岬 白神岬の看板。めちゃくちゃ寒かった。

RubyKaigi 2026 Day4 白神岬付近の青函トンネル記念館。青函トンネルの函館側がこの付近にある。このときはもう閉館時間になっていて入ることはできなかった。

RubyKaigi 2026 Day4 函館山山頂にて。夜景についての写真もあるけど、あんまりうまく撮れなかった&実際に観たほうがいいのでナシ!

RubyKaigi 2026 Day5 「中華そば 櫓屋 本店」の櫓塩ラーメン全部のせ。函館の塩ラーメンはもっとスープが澄んでいるとか。

RubyKaigi 2026 Day5 あいす118でのソフトクリーム

荷物取り違え

旅というのは最後まで何が起こるかわからないものですね。空港の手荷物受取所で自分の荷物全然が出てこないなと待ちぼうけてたらついに荷物のコンベアが終了し、そこには誰にも引き取取られていないスーツケースがぽつんと……

係員さん曰く荷物の航空機からの積み下ろしは完了しており、どうやら取り違えということで残った荷物の持ち主の方に連絡してもらうことになり、僕はそれを待つということに……という状況になり空港でしばらく待機していたのですが、連絡がつかないということで一旦お家に帰るということになりました。

一晩経ち、これを書いている時点では航空会社側での僕のスーツケースの確保が完了し、自宅に発送する手続が完了しているので僕はあとは待つだけの状態となっています。

このような事態を防ぐために、スーツケースにはステッカーをたくさん貼っておく、AirTagなどのトラッカーを忍ばせておく4などの対策を取ることをおすすめします。僕はどちらもしていませんでした!

  1. https://unasuke.fm/ep/9 ↩

  2. https://s01.ninja/ja/party-at-rubykaigi.html ↩

  3. 下見のために来たのが初の函館で、RubyKaigi 2026当日の時点では2回目ではある ↩

  4. AirTagがあるからといって盗まれないということはないですが、少なくともどこにあるか追えるのは良い点ですね ↩

2026年04月29日
古い投稿