Rustでのエラーハンドリング

34日連続で雨だったそうで、そりゃー今年は涼しかったわけですね。その分千葉のあたりは大変なことになっておりますが。 Rustで真面目にWeb APIを作っていると、とても悩ましいのがエラーハンドリングだと思います。ちょっとやってみた内容を紹介します。 Result or panic これについては、Javaとか他の言語のノリでpanicすると大変なことになるので、まず 原則panic禁止 くらいでいいかと思います。CLIならpanicしたほうがいいケースも多いと思いますが、Web APIでやったら多分ぶっ殺されます。 panic自体はhandlerがあったりはしますが、それに頼ったところでrewindとかそういったものもないので、SpringBootとかの黒魔術に慣れた人は、わりと気をつける必要があります(自分)。 anyhow/eyreで潰す or 潰さない エラーハンドリングを語るときに外せない eyreまたは anyhow がまず出てくると思います。これは Box<dyn std::error::Error + Sync + Send + 'static> あたりを都度定義する・・・というところに対するカウンターだと理解してます。 これが効果を発揮するのは、 とりあえずResultにするけど、エラー定義がめんどくせぇ ってときだと思います。基本的に eyre! などで潰すことで、なんでも放り込めるエラーを作れます。これはプロトタイピングとか、 APIのトップレベル みたいな、もうハンドリングする必要がないところでは役立ちます。 が、これはTraitでは使えません。というか使うと困るのは多分自分です :angel: pub trait Hoge { // うーん、失敗するんだろうけどどう失敗するかわかんないな。とりあえず潰しとこう fn foobar() -> eyre::Result<Huga>; } fn main() { let foo = Foo::new(); foo.foobar().map_err(|e| { match e { // さて・・・?あれ、区別できないぞ } }) } traitはinterfaceというか操作の契約=contractを表すので、エラーになるのであれば、きちんと定義しておくのがベターであるとは思います。今のところはこのように整理しました。 Trait境界ではeyre/anyhowを 使わない eyre/anyhowはmainとかでは使ってよし どうせpanicするレベルなので DDDとかでドメイン層がある場合は・・・後述 みんなの味方、thiserror thiserror は、おそらくエラーを定義する際にはほぼ必携のcrateです。手で書くとひっじょーにめんどくさいError traitの実装を肩代わりしてくれるのとともに、color_eyreを利用したときに役立つsource chainのハンドリングもしてくれます。 ...

October 3, 2026 · derui

Flutterを触り始めてみた

今年の夏は、記憶の感じではこの10年くらいで一番涼しい夏だったんではないでしょうか。35℃行く日が少ないだけで涼しいってのもどうなんだ?と冷静に思いますけども。 今まで触ってこなかったものの一つにAndroidというかスマホアプリがあるのですが、ちょうど節目を迎えたことと、ちょうどいい題材を見つけたのでチャレンジしてみることにしました。 最初から最難関、Nixでの環境構築 せっかくなのでFlutter × dartでやっていきます。 さて、何はともあれ開発環境・・・なんですが、いかんせん私の環境はNixOSです。いろいろ有志の方が研究しているものの、どうも直近のAndroid SDKは、 SDKのdirectoryを弄り倒す という、nix側からすると狂気の行為をするようです。 https://github.com/NixOS/nixpkgs/issues/355045#issuecomment-2466910779 local.propertiesだといったぞ?とか https://github.com/tadfisher/android-nixpkgs/issues/91 そもそもandroid-studioが使えないぞ・・・とか。nix storeは完全immutableが基本なので、そこに書き込もうとするのはすでにどうしようもありません。事前に全部定義したらいい、ってのがnix wayではあるんですが、SDKとimageとemulatorを・・・とか全部事前に用意するのはなかなかというかだいぶ辛いです。 ちなみに私は、local.propertiesまでは行ったんですが、Gradleのエラーで 読み込み専用のところに書き込めない ってエラーをみて、諸々諦めました :angel: Android Studioを使わない、とかならいいんでしょうが、Gradleで出るのはもはや如何ともしがたいと判断しました。となるとどうなるんですか・・・?なんですが、Android SDKは基本的にhome directoryの下に増えますので、純粋Nixな人は許せないかもしれません。私はhome directoryの下については流石に実利を取ってるので、これで進めることにしました。なおこのエラーはFlutterを利用するgradleの設定というかプラグインがこういう仕様になっているようです。ただ、 flutter コマンドからなら普通にできたので、これは気にしないようにしたほうがFlutterではよさそうです。 なお、この場合Android SDKについてはandroid-studioから入れるか、sdkmanager / android CLI から入れるか、とする必要があります。私はandroid-studioから入れました。 emulatorの起動 本家NixのWikiにもこう書かれております。 View the Android wiki page for more info, but you can set up emulators in Android Studio, run them from there, then target the emulator in VSCode when running your flutter code. Otherwise, you can Nixify or even manually add your emulators as stated in the Android wiki page ...

September 23, 2026 · derui

最近のEmacsの使い方

あれ?というくらいに季節が過ぎてますね。そろそろ梅雨が明けそうな昨今、いかがお過ごしでしょうか。 キーボードの話題ばっかなので、たまにはEmacsの話題をしてみます。あ、前のキーボードは無事v2となり、かなりThockyな音が出るようになったので、個人的にはだいぶ満足です。 gptelを利用したcommit message生成 https://github.com/derui/gptel-commit-message LLMを使ってガツッと作りました。非常にシンプルな作りとしていて、カスタマイズも最小限です。部屋のGPUだと90token/sとか出るので、Gemma 4/4bと組み合わせると、速いと1秒くらいで生成がおわったりします。後でsquashするからとりあえずcommit、みたいなときに重宝します。 ちなみにこの類は、同じようなものがあと2つくらいあるのは見かけましたが、差異としては アニメーションを追加 他は割となかったんですが、個人的に視覚的にわかるものがほしかったので IntelliJとかも勝手に生成したりしますが、 今生成しているのかどうなのか がわからないのが大変にストレスだったので、自分でハンドリングできるようにしてます くらいですね。git diffをcontextに突っ込んでいるので、尋常じゃないサイズとかだと遅くなりますが、そもそもそんなケースは少ないので無視してます。 eglotのsignatureの出し方試行 https://github.com/derui/eglot-signature-display もう一個、LLMを使って作ってみました。何かというと、eglotを利用しているときに、LSPから返ってくるsignatureをどう見やすく永続化するか・・・?というポイントに対してです。IntelliJとかVSCodeとかだとwindowになるんですが、posframeを利用したところ、AeroSpaceを利用しているお仕事PCでとても大変なことになったので、overlayを利用してみてます。 逆にいえば、これがなかったらposframeだけで良かったとも言えます。Aerospace以外には https://github.com/typester/yashiki ってものも見つけたので、こっちも試してみようかなと。 だいたい動くんですが、overlayの宿命として、空白行だったりするとガコンと下がる問題があり、これについてはなかなかいかんともしがたい・・・っていうところになってます。AeroSpaceにchild frame対応が入ったらまた考えようとはしてます。 eglot標準のsignatureが気に入らなかった理由 eglotは、当然標準としてsignatureの表示に対応しています。いるんですが、表示される場所が echo area となっており、これは変数の型表示とかですごい勢いで更新されます。で、かつecho areaに出るということは、都度視線をそっちに持っていく必要がある、ということにもなります。これは割とストレスです。 これに対する対策というか案として、side windowにeldocを永続化して、そっちに表示する、みたいなのも試しましたが、これはこれで結局は 都度固定しないといけない triggerでいきなり出るとすっごい邪魔 という課題が発生しました。signatureがLSPから送られるのは基本的にtriggerになるキーが押された場合とかで、LSPサーバー側から一方的に送られる形になっています。なので編集するときにいきなりレイアウトが切り替わるのは、ちょっと色々許せない感じです。 agent-shell + agent-shell-pet https://github.com/xenodium/agent-shell https://github.com/lgmoneda/agent-shell-pet 自分でforkしたもの。 https://github.com/derui/agent-shell-pet 現在Emacsに統合されたcoding agent環境がほしいのであれば、ほぼagent-shell一択でいいのではないかとは思います。高速なrendering、visual、diffのみやすさなどは群を抜いています。agent-shell-petはまあ賑やかしといったところですね。ただ、agent-shell-petは自分の設定をサポートしていなかったのと、macOSしかまともに動作しない🤣状態だったので、以下の改善を施してます。 viewport modeへの対応 child frameのサイズ設定バグの対応 image insertではなく、事前生成したanimated webpを利用することによる性能改善 child frameのサイズ計算がちょっとミスっていそうだったのを修正 これをやることで、概ね問題ない感じになってます。ただ、event handlingがちょっと変・・・?というところがあったので、暇があればそのへんも対応しようかな、とは思ってます。 とはいえ、terminal経由でagentを直接利用することがほとんどで、そこまで使いこなしているわけではないのですが。 mozcからの脱却 記憶にある限りだと、かれこれ10年くらいmozcにお世話になってきましたが、mozc自体のバージョン管理とかとmozc.elのミスマッチとかが重なったため、macOSではnative、LinuxではFcitxを利用する形に変更しました。なんか以前は色々できなかった気がしますが、Wayland対応の一環で、そこら辺がなんとかなるアダプターだけ作ったから、あとはなんとかしてくれ、ということになったっぽいです。さすがOSたるEmacs(なんか違う気がする)。 今この文章もFcitxで打ってますが、まあ特になんの問題もなく打てていますし、keybindについても自由にできているので、ここらへんについては隔世の感を強く感じますね。Meadowとか使ってて、Windows IMEと戦ってた時代が大変に懐かしいです。 これから Emacs(Meadow/Xyzzyも含む)をなんだかんだ使い続けて20年くらいになりそうですが、最近は良くも悪くも Emacsならでは ってものはなくなり、逆に言えばエディターとしての機能そのものは収斂進化したという感覚があります。ただ、よく言うXxx is deadみたいなのは、ほぼほぼマーケティングの言葉だと思ってるので、まだEmacsは進化するとも思ってます。 Vim(neovim)/Emacsがまだ熱い支持を受けているのは、両方とも 完全なるカスタマイズが可能 であること、つまりなんらかのアイディアがある場合の実験場として利用できることそのものでもあると思います。VSCodeもカスタマイズできるとはいえ、その場で環境そのものをいじれるわけでもないですし。Emacsがvimとも一線を画すのは、まさにLisp Machineそのものであるがゆえの、「なんでもできる」ことそのものだと思います。最近はSVGなども利用できるようになったりしているので、表現力についても色々向上していますし、develでは shaderを利用する とか、いい感じに狂気を感じる提案が出ていたりしています。 仕事ではなかなか使ってられない場合もありますが、より快適だったり、使っていて楽しい、みたいなものは追い求めたいですね。 ...

July 18, 2026 · derui

自作キーボードでも音にこだわりたい

長袖なのか半袖なのか、それが問題だ、という季節ですね。毎年毎年困ってます。 半年ぶりくらいにキーボードを設計しましたので、その紹介をしたいと思います。 外観 恒例の外観です。 特徴としては割といつもどおりです。 カラムスタッガード 乾電池駆動 今回は単4×2にしてます。昇圧効率を考えると、ほぼ同容量である単3一本よりも圧倒的に持ちます 大体1ヶ月弱利用してますが、電圧が下がってくる気配がなかなか見えません。power profilerでざっくり計算すると3ヶ月は持つという 完全無線 たまーに色々ラグいとかありますが、一回これに染まってしまうと、なかなか抜け出せないです ガスケットマウント 印刷したケースも真っ黒なのでわかりにくいですが、ほぼ全面にPORONを入れてガスケットマウントにしてあります 16.8mmピッチ with low profile 今回はLofreeのPhantomを利用してます。タクタイルはそんな得意じゃないんですが、タクタイルっぽくないタクタイルなので割と問題なさげです ちなみに前使ってたキーボードでは、初めてキースイッチ自体がだめになる、という経験をしました。5000万回も押してなかったんだけどな 今回のお題 今回のコンセプトは、ずばり Thockyな音にしたい です。前回作ったキーボードは、スイッチプレートをネジ止めするという都合上、かなり音としては高めになっていまして、使ってて割と気になる感じでした。 現場でもキーボード使ってる人は多いんですが、やはり聞こえてくる音でもThockyな音のほうが心地良い感じがします。ただ、これは相当に主観が絡むので、青軸とかでもなければ職場では聞き流すのも肝要ですね。青軸はさすがに苦言を呈していいと思います。 ちなみにThockyとかClackyとかについてはみんな大好き遊舎工房さんを参照するとわかりやすいかと。 https://shop.yushakobo.jp/pages/typing_sound?utm_source=ec&utm_medium=pages&utm_campaign=yomimono Thockyな音にするためには? すでに先人が色々検討・実験してくださってるので、まずこの辺を読み込みました。 https://piroriblog.hatenablog.com/entry/2024/12/01/124054 https://kgnwsknt-chef.hatenablog.com/entry/2023/02/02/224137 私の理解では、 波長が短い=音が高い、波長が短い=音が低い 振幅はエネルギーなので、低音でも振幅が大きい、とかは普通にあります 短波長の波は、 減衰が激しい なので、多孔質のフォームとかを通すと外に出る前に減衰する 長波長の波は、 減衰しづらい よく低音が〜ってのがありますが、反射回数と減衰はニアリーイコールなので、そもそも減衰しづらいです 完全に減衰させると音にならない 考えたら当たり前ですが、音が聞こえるということは振幅が耳に届いている、ということです というところになりました。つまりうまいこと短波長を減衰させつつ、長波長をコントロールする・・・というのが基本になります。なのですが、音は単純に広がるのに加えて、 共振 振動数によってはケースとかも振動する そもそもケース自体も振動する 反響・残響 あまり残りすぎると、今度は余韻としてのこります。これはこれで嫌がられる 干渉 音波なので干渉します。ある音を強めたい場合は干渉で同位相を重ねる・・・といったことも必要になります 干渉するためにもスペースが必要ですね とかの要素も加わってきます。正直ただのソフトウェアエンジニアではこの辺を測るなりなんなりするのは、まー無理ですね。 とりあえず目指した部分 ケースはアルミで・・・みたいな話まで出てくるものでもありますが、それをやらなくてもできるポイントはあるのではないか?ということで、一旦以下を妥協ポイントとしました。 音の調整は ボトムケース内の詰め方 で調整する スイッチプレートと基盤の間にはIXPEフォームを挟む これはやってもやらなくてもあんまり・・・という感じではありましたが。複合しないとなかなか ケースへの振動はガスケットで塞ぐ として、音を調整する変数をできるだけ減らす、という形に落としてます。 ケースについて 今回も3D printerでケース・キーキャップを全部作ってますが、音を閉じ込めようとして全面を塞ごうとした結果、ひじょーに厄介な設計になってしまいました。もっとシンプルでいいのに。 ただ、今回PLA Matteを利用したところ、予想以上にいい手触りでした。Matteおすすめです。 結果と次回にむけて 今回はギミック・機能というよりは音という部分にフォーカスしたものにはなりますが、やってみて色々と発見がありました。 今回の基盤ですが、1枚で4つ含める形にしてます。(緑に緑なんであれですが。どうせ何も見えなくなるので、最速&最安でできる緑にしてます) 基盤を分割する、ということの有用性 今回初めてコネクタを利用して繋いでみましたが、思ったより問題がない上、基盤の自由度が上がるというメリットも享受できました ただ、ケーブルが長すぎたのが反省ポイント TPUの可能性 一個前のキーボードでは、TPUでボトムを埋めましたが、これをPORONと組み合わせることで、より制振と音響を制御できそうな予感がしました あと、TPUは振動の吸収もいい(スマホケースで利用されてます)のと、丁度いい硬さももっているので、これをガスケットとして利用するのはあり 音自体は多少Thocky似できたのですが、隙間の調整だったりなんだり、そういったクリアランスの制御などを見ると、やはり既製のキーボードは強いですし、普通に使うだけならそっちにしたほうが絶対いいです。 ...

May 9, 2026 · derui

Emacsでのcursor移動をisearchに1本化しようとしている

気づいたら新入社員がはいって来てました。なんか去年も同じこと書いた気がしますが、気のせいでしょう。 まだまだEmacsを現役で利用していますが、カーソルの移動に対するアプローチを変えつつあります。 もともとの課題感 私はEmacs上では multistate という、modal editingの仕組みだけを提供しているpackageを利用して、modal editingそのものは すべて 自前で定義しています。evilとかmeowとかも使ってたので、そういったもののエッセンスも入ってます。 ちなみにevilを利用しなくなったのは単純で、Qwertyを利用しなくなったのでマッスルメモリーが使えなくなった、というのが最大です。ただ、なんだかんだEmacs上でのエミュレートではあるのと、個人的にはtext objectよりもpuni/treesitterベースでの選択ができればそれでよかったです。 そんな中で、ずっと悩ましかったのがカーソル移動です。上下左右についてはそりゃー定義していますが、 10行下にあるfoo に行きたい、となった場合に、大抵10回キーを押してます。word単位の移動とかならまだいいんですが。一応avyとかも入れていたんですが、よくある文字だと候補が多すぎて・・・っていうのにもなります。 avyを激推しする記事 2021年の記事にはなりますが、すっごい長文の記事があります。めちゃくちゃ長いのですが、Emacsを利用している場合は読んでおくといいと思います。 https://karthinks.com/software/avy-can-do-anything/ この記事の要旨としては、 カーソルの移動というものは換言すると3stepの話でしかない 同じ筆者が書いた、Emacsのウィンドウ管理に対する記事でも、同じような話があります avyがすでにそれを提供している isearchかavyで十分だ というところです。間違ってたらごめんなさい。この記事を何回か読んで、なんとなーく把握できました。 移動の優先度を見直す 私がやるカーソル移動(検索含む)は以下です。上から順に頻度が高いです。 hjkl likeな文字単位移動 word単位移動 consult-xxx consult-lineが最も頻度が高いです isearch 色々見直した感じ、以下のようになるようにしてます。 hjkl likeな文字移動 isearch + avy consult-xxx mode-specificな移動 orgだったらheading単位とか insert modeのままで・・・というのであれば他の選択肢もあると思いますが、いかんせんQwertyじゃないのでキー配置が色々ございまして、移動はnormal mode、と割り切っている次第です。 さて、isearchなんかいらなくて、全部consult-lineでいいじゃん?という方もいるでしょう。そこは自由なので「そうですね」となるのですが。それだと面白くないので、理由を書いてみようかと思います。 isearch vs consult-line Emacsの検索というとisearchがまずデフォルトであるのですが、大抵は consult-line などの利用を勧めているケースが見られます。これがなんでかなーというところを考えると、 スペース区切りだったりで検索できる(ように見える) 結果の一覧が見える のが大きいのだと思います。これについては全く違和感がないのですが、ことカーソル移動を主眼に置くと、以下の点でoverpowerです。 本質は filtining なので、検索はしていない 今見えてる場所を一覧しても何も嬉しくない 逆にminibuffer/bufferへの視線移動を伴う 同一行に複数の結果がある場合に対応できない 特に最後は、consultの本来的な目的を考えると、サポートは難しいというかしないと思います。が、移動となると頻繁にありえます。isearchならなんの問題もなくできますよね?という。 isearchのカスタマイズ 激推しされるavyには、 avy-isearch というもうそのまんまな機能があります。対象のfilterをisearchでやり、selectをavyでやる、という形で1本化することができます。お、これで解決では? キー数が増えてる、非効率だ!ってのはあると思いますが、単一操作であらゆるケースに対応できるので、記憶容量はむしろ減ると思います。avy/isearchの使い分けを・・・って考える時間のほうがもったいないんじゃ?と参照元も書いてた気がします。 さて、そんなisearchですが、欠点もあります。それは 検索方向を最初に決めないといけない ということです。 isearch-forward と isearch-backward ですね。isearchをカーソル移動として利用しようとしたとき、これが困ることが多いです。 ...

April 22, 2026 · derui

project管理をできるだけシンプルに行うpackageを作った話

気づけば卒業式シーズン。いかがお過ごしでしょうか。というかこっちの卒業式って3月の半ばなんですかね?(わかってない) 最近Emacs弄りの熱がまた上がってきたところですが、生成AIにコンセプトを伝えて作らせたものを紹介します。 できたもの https://github.com/derui/projab Project.el + Tab-bar というところで projab としました。一応ググってもそれっぽいのは出てこなかったので大丈夫だとは思います。 余談ですが、生成AIが提案した名前に workroom (後で出てきます)ってのがありましたが、もう全く同じ名前のpackageがありました。事前調査は重要ですね。 Project management系統なので、基本的に画面とかはありませんが、自分が欲しい以下の機能を兼ね備えたpackageがなかったので作成しました。 標準パッケージにだけ依存する Emacsの標準パッケージはすでにかなり充実していますので 特に、visualにかかわらない部分については、大半が汎用性のある形でできてます Bufferのリストだけ保存される 意外と Window layoutも 復元しようとするケースがあるのですが、これは究極に複雑な系統になるのと、だいたいその辺キー一発なので切りたかったんです 自動レストア機能 + Projectを開いたときだけ 復元 大抵、projectを含めて全体を復元・・・ってやるのですが、それをやられると、長時間使ってると、次回起動時にとっても時間がかかるようになります 実際、Nixをdirenvで有効にしているprojectがあったりすると、開くだけでLSPの起動やらなんやら含め、長時間待たされます 私のsetupは、起動速度に重点を置いているので、ちょっと許容できなくなってきたという背景もあります そんなことで、以下のことができるように、というコンセプトで作ってます。 project.el / tab-bar / desktop.el を利用する project外のファイルも復元のリストに入れられる 復元単位はproject = tab Window/frameの復元は不要 とりあえず使える・・・って状態になるまで1,2時間くらいでした。ほぼほぼ利用する関数は自分でも把握していたので、reviewも早いですね。 自分が把握している範囲が広いほど、生成させるときも速い です。 他のpackageを利用しなかった理由 このsession管理というのは、Emacsの歴史上何度となく大きなトピックになってきた(と勝手に思ってます)ものであり、多数のpackageが存在しています。 Tabspaces もともと利用していたもの。project.el + tab-barというのはほぼほぼ同一 ただし、 自動restoreは全体の復元が強制される ことと、Windowやtemporary bufferまで保存しようとすることで、復元するときに結構厄介な状態になったり、ということがあったのが、今回作った主な動機です emacs-workroom ほぼほぼ同じ動機。 project.el + desktop.el ただ、tab-barのintegrationを作者がする気がない様子 perspective-el この分野の有名どころ より複雑な管理(merge/split)を可能としてます。elscreenとか書いてあるくらいなので、非常に歴史があるpackageでもあります これも昔使ってました つまり、個人的には 帯に短し襷に流し を地で行っている状態だった・・・というのが、ド新規でわざわざ作ろうと思った動機です。以前であれば、こうなると妥協して・・・ってのがありましたが、今はこれくらい(400〜500行程度)のElispであれば数分で作成できてしまうため、アイディアなりコンセプトの具現化は非常にやりやすいと思います。 やらないこと、を決める このpackageでは、最初から以下はやらん、と決めていました。多分作らせようと思えばできるのですが、そもそもやる理由がないのと、コンセプトからブレるためです。 ...

March 15, 2026 · derui

tabspaceをtab-barなしで利用するようにしてみた

まだEmacs使ってるの?って空気を感じる中、変わらず触っています。最近ちょっと一念発起して、header lineをカスタマイズしてみたので、ちょっと紹介します。 問題意識 Emacsのsession managementについては、色々試した結果、紆余曲折ありつつもtabspaceを利用しています。このpackageは、名前の通りEmacs標準のtab-barをprojectの単位として利用することで、spaceの切り替えを明示的にすることができるようになっています。 そんなtab-barですが、デフォルトだとこんな感じの表示です。 簡素ですがまー用は足ります。なんですが、最近の流行りに合わせてbreadcrumbを利用してheader lineも利用していると、以下のような課題が出てきます。 そもそもの領域が削れてしまう header-line + tab-bar + mode-line + echo area、という固定領域が発生してしまいます 切り替えたときに、別のprojectが見えてる意味が薄い そもそもなのですが、一回切り替えると、大体はそのprojectに関連したものに統一されるわけで・・・ 常に見えてる必要もないね? tabspaceのecho areaに表示するoptionも試してみたが、これはこれでなかなか厳しい 多分相当にいじれば問題はなさそうなんですが、上記にあるとおり、 そもそも常時見えている必要とは 🤔 と。 実際はもうちょっとカスタマイズしていたので、さらに高さがありました。 ヘッダーラインとモードライン さて、ヘッダーラインとモードラインですが、それぞれ色々と用途はあります。ただ、現状はヘッダーラインがほぼほぼbreadcrumbの領域しかないことと、大体projectの内容も含まれていることから、ヘッダーラインを追加することにします。 (defun my/header-line-project-name () "Get the current project name (tab name) for header line" (alist-get 'name (tab-bar--current-tab))) (defvar my/header-line-separator nil "Cached separator string for header line, rebuilt on theme changes") (defun my/header-line-update-separator (&rest _) "Rebuild the cached separator string" (setq my/header-line-separator (concat (propertize "|" 'face 'shadow) " "))) (add-hook 'enable-theme-functions #'my/header-line-update-separator) (defvar-local my/header-line-element-project-name '(:eval (concat "[" (my/header-line-project-name) "] " (or my/header-line-separator (my/header-line-update-separator) my/header-line-separator))) "An elenemt of header line to display project name") ;; set local variable for header line (put 'my/header-line-element-project-name 'risky-local-variable t) (defun my/setup-header-line () "Setup `header-line-format' for my purpose" (setq-default header-line-format '("%e" my/header-line-element-project-name (:eval (breadcrumb--header-line))))) (with-low-priority-startup (my/setup-header-line)) こんな感じの設定になりました。ミソとしては breadcrumb--header-line です。これはbreadcrumbの内部処理なのですが、breadcrumbが提供するheader lineがちょうどいい感じなので、これを利用しています。また、注意としては breadcrumb-modeを有効化してはならない ってのがあります。これはbreadcrumb-modeは有効化した瞬間にheader lineを強制的に変更してしまうため、こっちが想定した形にならなくなります。 ...

February 15, 2026 · derui

自分用のEmacs packageをLLMで作る

あれ、1月ってありましたっけ?という勢いで1月が終わりました。あれを何月くらいにやろうかな、とか考えてるとすぐに終わっちゃいますね。 今回はちょっと最小限で欲しいEmacs lispのpackageを作って・・・というか作らせてみました。 できたもの とりあえず画像を見るのが一番早いので貼っときます。 こんな感じに、 置換対象のものだけを、置換後とside by sideで見える ってものです。とってもシンプルで単機能です。 モチベーション できたものは、概ね行数としても150行とかなのです。もともとは単純に 置換前後をみたい というものなのですが、これが地味に対応するものがない・・・というところなので、探してました。 より高機能なものとして visual-replace やanzu.elなどがあるのですが、こちらは 検索処理そのものを置換している という課題があります。なんだかんだ、interactiveな検索・置換というのは恐ろしく複雑な行為なので、自作はしたくない・・・。また、標準へのalignが最近のトレンドと考えると、既存の継続的にメンテナンスが行われているlibraryを利用しない、というのもなかなかもったいないことだなーと。 発見と作成 ふとした発見は、 replace-update-post-hook というhookを見つけたことです。これは置換を行う直前くらいで呼び出されるhookで、今回やりたいやつにぴったりでした。 ちょうどよかったので、完全にLLMでやっていい規模だったので、全面的に生成させてます。 全体のデフォルト構成はCopilot Agentに初期生成 実際の実装はClaude Codeでplanさせてから実装 テストの生成/documentもClaude Code 動作確認は自分 という感じで、大体はClaude Codeに生成させたものになります。やっぱり一発では無理で、存在しないlexical変数を使おうとしたり、エラーハンドリングが足りずに C-g でキャンセル・・・とか気の利いた感じにはやはりなりませんでした。 とはいえ、overlayの作成やdefvarの作成といった、Emacs Lispお決まりの管理などを含めると、実際のロジックはほんの2,30行程度、というのが実態でした。やはり色々言われている、 大体定型的な処理になるもの とかは、生成させるのに向いていますね。 Emacs Lispとの向き合い方 Emacs Lispは、Emacsを触るうえで絶対に避けられないものですし、色々な概念が絡み合って、大変に複雑です。しかし、シンプルなpackageを作るとかは、今だと1時間とかあったら、 ボイラープレート的にやるもの を含め、だいぶ楽に作れます。 作れるからといって何でも作る と、それはそれでメンテナンスが不可能になっていくのですが、Unix wayのように、単機能のものをいじったり作ったりする分には、問題はそこまで露出しないかな〜、とも思っています。 Emacsを触ってみるいいチャンスとして、一個気に食わない部分をpackageにしてみる、とかいかがでしょう?

February 5, 2026 · derui

RustでOperator Overloadを利用したDSLを作ってみる

気が付いたら2025年が終わってました。今年の抱負とか考える前に仕事が始まったので、今年もいきあたりばったりに行きていければと思います。 最近Rustで細々と格闘しているんですが、ちょっとやってみたいことがあってやってみたらできたので、小ネタとして残しておこうかと思います。 やりたいこと 諸事情で、代数式をstructとして管理することをしています。毎度ですが、なんでそういうことをしようとしているのか?は聞いてはなりません。 // こんなtraitを定義しておく trait Equation { // envは変数のhashmap fn evaluate(&self, env: &HashMap<String, f32>) -> f32; } こんなtraitを実装したものを考えたいです。なお実装は自明なので省きます。で、これを普通に実装すると、ちょっと複雑になっただけで大変なことになります。 // 3.2 + 3.4 let e = ArithmeticEquation::new(Add, ConstantEquation::new(3.2), ConstantEquation::new(3.4)) // 掛け算とかがnestすると大変なことになる これをなんとかある程度楽にしたい、というのがモチベーションです。 方法の検討 Rustだと、大きく3通りのやり方があると思います。 procedural macroを実装する lexer/parserを利用してparseを実装する operator overloadとstructを駆使して頑張る macroとoperator overloadはcompile時に、lexer/parserは動的になる感じです。最終的にはlexer/parserが必要になりそうなんですが、一旦は静的にできれば(テストを書いたりするときに)便利です。となると、macroかoperator overloadが選択肢になる感じですね。 lexer/parser自体を生成するmacroとかはあるようですが、そもそもparseするという行為自体が、compileした後の話になるので。 Operator overloadを検討してみる RustのOperator overloadは大変に強力である意味シンプルなのですが、 Scopingが困難 です。 KotlinとかのOperator overloadでは、interfaceの実装元とかで切り分けられたり、scoped functionを利用することで、DSL/operator overloadの利用範囲をscopingすることがるできます。 object Ops { operator fun invoke(f: Ops.() -> Unit) { f() } infix fun String.test(rhs: String): boolean {...} } // こんな感じで使える Ops { "hoge" test "foo" } // 外だと明示的なimportが必要。 翻ってRustのOperator overloadは、標準にある Add や Sub といったTraitを型に対して実装する・・・という形です。 ...

January 12, 2026 · derui

トラックボールを搭載したキーボードを作った話

気が付いたら11月も終わって師走になりそうですね?一年が年々早くなっていきますな。 この二ヶ月くらい格闘していたものができました。なんかこないだもこの書き出しをした気がしますが気にしてはいけない。 まずは写真 最近は一体型にしてましたが、roBaとかroRaとか人気ですんで、分割型に戻ってきました。やっぱ楽ですね。 スペックはこんなんです。 いつもの40%/42キー 30%はあんまり興味ないので 16.6mmピッチ Choc v2専用 PMW3610センサーを利用したトラックボール 完全無線 単三電池駆動 エンコーダー対応 ケース、キーキャップ、エンコーダー、トラボケース、スイッチプレートまで全部3Dプリンター製 今回発注したのは基盤類だけです それなりの薄さ キートップまで2.2cmです 名前は、それなりに薄さを追求してみよう、ということで ThingnusBall です。いつもどおりケースやらなんやらは以下のリポジトリで公開してます。 https://github.com/derui/ThingnusBall 今回の物理配列 今回ですが、前作った Orbit One を分割型に持っていったような感じにしてます。やっぱ自分の手をそれなりに測って作っただけあって、しっくりきていたのは強いですね。 挟ピッチにしているのは、もはや一回慣れてしまうと、MacBook(仕事用)ですら広く感じてしまいます。キーキャップも自炊(なにか違う気がする)できるようになったということもあり、自由度が上がっています。 キーキャップ 前回は初めて印刷しましたが、今回もうちょっと頑張ってコンベックスとスフェリカルのキーを印刷しました。こんな感じ。 物理になると分かりづらいんですが、コンベックスはちゃんとコンベックスしてます。なお、前回印刷したスフェリカルは指を置く面がちと狭かったので、全面に広げています。なお、色々めんどうなので、 印刷時にはサポートがいらないように 印刷してます。側面を立てる感じにして印刷しているので、どうしてもこういう形だと、底面になる面の角がヌルくなりますね。とはいえ、これが嫌だとすると、 光造形 か 焼結方式 、または射出形成が必要になってくるんではないかと。FDMで軸を下にしてサポートを追加するのはだいぶリスキーです。 DMM.makeで販売されているキーキャップは、大半が焼結方式・・・のはずです。私もちょっとだけ持ってますが、手触りとかいいですよね。高いんですが。 もしかしたらMXキーであれば余裕が出るのかもしれないですが :thinking: 今回は厚さをメインテーマにしたので、そもそもMXは選択肢に入っていませんでしたね。とはいえ、実際に指を置く面はかなり滑らかで、手元にあるNuphyのキーと比較してもひけをとりません(当社比)。 厚さ 前回がトータル4cmくらいの大作になってしまって、尊師スタイルをやろうとしたら 分厚すぎてほぼできなかった :cry: という悲しい現実がありました。 https://salicylic-acid3.hatenablog.com/entry/sonshi-introduction 尊師スタイルはこちらなどを参考に。尊師=RMSです。色々批判もある方ですが。 前々回も結構分厚かったので、今回は トラックボールのブレイクアウトボード含めて(できるだけ)薄くしよう! というのを唯一のデザイン目標にしました。 最小の厚さとは? さて、一般的なキーボード(ロープロ)で実現できる最小の厚みとはどれくらいなのでしょう?一旦以下の条件を前提にして計算してみましょう。 ホットスワップする スイッチプレートを使う choc v2 構成物 厚さ(mm) ソケット 2 基盤 1.6 スイッチプレート 1.5 choc v2 6.4 キーキャップ 3 合計 14.5 (choc v2は軸の頂点まで、キーキャップはキーの軸の頂点から天面まで、です) ...

November 24, 2025 · derui