
2026/08/29 11:43
永遠のドックを探して – ランブドック
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Lambdock は、Wayland ディスプレイサーバープロトコル(
gtk4-layer-shell を介して)に特化設計された、現代的で超ハック可能なデスクトップアプリケーションです。macOS の Dock と対抗するために、フルなランタイムでの可視性及び Lisp による洞察を目指しています。その核となる革新は、独自のアーキテクチャにあります:高性能 C レンダリングエンジンに埋め込まれた Guile Scheme インタープリタを融合させた構成です。これにより「双方向の実行」が可能となり、Scheme プロシージャが実行中の C エンジン内で直接アクションをトリガーし、Dock の動的生成やリアルタイムでのステート変更を実現します。ビルトインのUnix ドメインソケット REPL(デフォルトは /tmp/lambdock-repl.sock)を通じて、ユーザーはプログラムを再起動せずに応用ステートの即時修正、カスタムテーマの再読み込み、システムモニターの調整などが可能です。マルチ Dock オーケストレーションシステムにより、~/.config/lambdock/ に settings.scm に対応するファイルを監視することで、異なる画面に複数の独立した Dock を設置できます。新しいファイルを作成すると新しい Dock が生成され、それを削除すればインスタンスは安全に破棄されます。KDE Plasma、Sway、Hyprland、Niri などのコンポジターと互換性を持つ一方で、プロトコルの制限により GNOME との対応は現時点では実装されていません。Guix、Nix、RPM(OBS)などのパッケージマネージャから入手可能な Lambdock は、高度なスクリプト手順を通じて、技術的知識を有するユーザーにデスクトップ体験に対する完全な制御を提供します。本文
lambdock の物語:Wayland ネイティブデスクトップドックへの究極の道
lambdock は、現代的で極めてハッカブル(改修可能)な、Wayland ネイティブなデスクトップドックアプリケーションです。C と Guile Scheme + GTK4 を使用し、対話型の REPL を備えています。
物語の序章:夢と探求
私はデジタルライフの鑑賞者であり、「目の彩り」を愛するワークフロー最適化の愛好家として、究極のデスクトップドックを求めていました。
2026 年 7 月 30 日、ついにその物語が始まりました。lambdock は単なる模倣ではなく、完全なランタイムでの検査可能性、無限のハッカビリティ、そしてLisp 的啓蒙によって macOS や既存ドックの体験を超越する存在へと進化しました。
この道筋は、思考のプロセスから始まり、失敗したプロトタイプの墓場を通り、困難な戦いを乗り越え、GTK4 C ランタイムへの征服を経て、ついに息づく Lisp 心臓の埋め込みに辿り着きました。
永遠のドックへの探求
Wayland への移行を模索するユーザーは、Cairo-Dock や Plank のような深くハッカブルなドックの喪失を経験しました。2026 年現在も、他のプロジェクトは Wayland 互換性を確保するため尽力していますが、レイアウト配置、ダイナミックなウィンドウ追跡、自動非表示機能、そして流体ホバー物理演算といった機能を統合した真のアプリケーションドックを実現するには至難の業でした。
lambdock の物語はレジリエンス(回復力)そのものです。数え切れないほどのパラダイムとプロトタイプ実証(PoC)が破綻する前に、このビジョンを形にするための決断がありました。
ベッドで HackerNews を読みながら思考が巡る瞬間、突然絶対的な明晰さが訪れました。なぜなら、idiomatic な現代 GTK4を使用し、それを記述している言語であるCそのものを用いるべきだったからです。
- C は
を有しており、Lisp(GNU Guile Scheme)との優れた相互運用性を提供します。libguile.h - これにより双方向のバインディングと通信が可能になります。
- GNU Guile の理解を深めつつ、GTK への無摩擦なセットアップとネイティブ超高性能を実現できます。
その結果、以下のようなアーキテクチャが設計されました:
- 強力な C コア: プログラムのレンダリング、グラフィックス、低レベル詳細を制御。
- 埋め込み GNU Guile Scheme エンジン: 実行時における全システムの中核と脳となる。
- 独自機能:
- 対話型のソケット REPL 制御
- Lisp メタプログラミングマクロ
- ダイナミックなマルチドック生成
- ネイティブ Wayland foreign-toplevel ウィンドウ追跡
- フレームクロック駆動のホバーアニメーション
プロトタイプの墓場
lambdock への旅路は、死んでいった野心あるプロトタイプ実証(PoC)によって舗装されました。いくつかの試行錯誤がありました:
- 純粋 Lisp アプローチ: Guile GI を使用しましたが、GTK の命令的・オブジェクト指向の状態と関数的 Scheme パターンの間で構造的摩擦が生じ、バインディングのエッジケースに追い込まれました。
- Python + GTK3/4: 迅速なプロトタイピングは可能でしたが、スレッド単一によるボトルネックとGIL によるスタッターにより、流体アニメーションは台無しでした。
- Rust + バインディング: メモリ安全性を約束しましたが、冗長性があり、非同期イベントループとの不一致から borrow checker が PITA(面倒なもの)となりました。反射性の欠如が Lisp REPL 埋め込みの門を閉ざしました。
- JavaScript/Node + Layer Shell: ウェブスタイルスタイリングを目指しましたが、肥大化と低レベルプロトコルとの統合難易度、および Lisp 拡張パスの欠如から放棄されました。
鉄の骨格、Lisp の魂
最終的な選択はC + GTK4 + gtk4-layer-shellでした。これらはネイティブ Wayland サーフェス制御において無条件のチャンピオンです。
- C: 生々しいスピード、ゼロコストの GLib インテグレーション、メモリ配置効率、完璧な Wayland スキャンナープロトコル生成。
- GNU Guile Scheme (
): 究極の実行時の心脳。libguile
int main(int argc, char **argv) { #ifdef DEFAULT_GSK_RENDERER g_setenv("GSK_RENDERER", DEFAULT_GSK_RENDERER, FALSE); #endif scm_boot_guile(argc, argv, inner_main, NULL); return 0; }
このアーキテクチャにより、「神聖なる杯(ホーリーグレイル)が達成されます:
- 無限の拡張性: GNU Emacs 並みの機能。
- 妥協しないネイティブパフォーマンス。
- 超能力: ユーザー設定と生きた REPL 検査のための Lisp メタプログラミング。
語源
「lambdock」は以下の要素を組み合わせた言葉遊びです:
- Ship Docks ⚓: コンテナとアプリケーションが安全にドックする場所。
- Lambda λ 式: 関数型プログラミングおよび Lisp 的啓蒙からの由来。
- Lambs 🐑: 優しく、ふわふわとしていて、軽量で清潔。
- Docks: デスクトップ UI コンポーネント(Plank, Cairo-Dock, macOS Dock など)。
プロジェクトロゴにはAgnus Dei(神の羊)を採用しており、十字架と赤い旗を担う存在を表しています。このドックを使用することは、宗教体験に似たものと言えます。
マルチ設定およびマルチドックインスタンス
lambdock は組み込みのマルチドックオーケストレーション機能を備えています。単一のドックバーに限らず、異なる画面エッジやモニターにまたがって複数の独立したドックを同時に実行できます。
- 自動ディレクトリ監視:
を監視し、~/.config/lambdock/
またはsettings.scm
パターンのファイルを自動的に検出します。settings-*.scm- 例:
,settings-left.scmsettings-bottom.scm
- 例:
- 孤立した状態管理: 各設定ファイルは独自の隔離された
を定義します(ポジション、テーマ、モニターターゲット、アイテムランチャー配置など)。LambdockState - ダイナミックな生成: 新しい
ファイルを作成するだけで、画面上に即座に新しいドックバーが追加されます。settings-2.scm - ホットリロード: 設定ファイル編集時に特定のインスタンスのみ再開始され、他のインスタンスはフリーズしません。
- ダイナミックな破棄: 設定ファイルを削除すると、対応するドックウィンドウを安全に除去し、アプリケーション全体をクラッシュさせることなく処理されます。
lambdock がどのシステムをサポートしていますか?
lambdock は最初に GNU/Linux 向けのユーティリティとして設計されており、
gtk4-layer-shell を使用して画面へのレンダリングおよび位置付けを行います。
以下のWayland コンポジターと良好に動作します(
wlr-layer-shell-unstable-v1 プロトコルサポート):
- KDE Plasma (Wayland セッション)
- Smithay ベース: Niri, COSMIC Desktop
- wlroots ベース: Sway, Hyprland, River, Wayfire
- Mir ベース: Mir
※注意:**GNOME **(Mutter) は現在、このプロトコルを実装していないためサポートされていません。
双方向エンジンがどのように動作するか
lambdock は Scheme だけで設定されるだけでなく、埋め込まれた拡張可能な Lisp エンジンとランタイム環境を備えています。実行は C と Guile の間で双方向に流れます。
- エントリーポイント:
はmain.c
を使用して Guile 解释器を起動します。scm_boot_guile - C ランタイム: ホストとして作用し、状態管理や設定抽出のために Scheme プロシージャを呼び出します。
- Scheme の能動性: 受動的なデータ宣言ではなく、実行中の C エンジン内部のアクションをトリガーできます。
lambdock はアイテムとプレセットに基づいてドックを定義するための美しい Lisp DSL を提供します:
| Scheme コンストラクタ | 戻り値の種類 | 説明 |
|---|---|---|
| Record | カスタムアプリケーションランチャー定義 (, など) |
| Record | ポーリングウィジェットによるダイナミックテキストデータ表示 |
| Record | 内部リストから解決される標準ランチャー |
| Record | レイアウト分割線 |
| String | 指定されたプレセットのデフォルトアイコン名文字列 |
設定ファイルの例:
(define dock-auto-hide? #t) (define dock-position 'bottom) (define dock-theme 'vanilla) (define dock-items (append (preset-launchers-for 'alacritty 'google-chrome 'spotify-flatpak 'nautilus) (list (separator-item)) (preset-launchers-for 'emacs 'intellij 'bruno-flatpak))) ;; システムコマンドからホスト名を取得し、条件分岐 (use-modules (ice-9 popen) (ice-9 rdelim)) (define (sh-output cmd) (let* ((port (open-input-pipe cmd)) (output (read-line port))) (close-pipe port) (if (eof-object? output) "" output))) ;; ホスト名が thinkpad の場合は自動非表示を無効化 (define dock-auto-hide? (string=? (string-trim-both (sh-output "hostname")) "thinkpad"))
リード・イバル・プリントループ(REPL)#
開発と実験のための生きたハッカビリティを実現するために、lambdock は埋め込み REPL を備えています。Unix ドメインソケット経由で、実行中のドックの状態をリアルタイムで問い合わせたり修正したりできます。
- 背景ソケット: 各ドックインスタンスごとに
などにソケットを生成します。/tmp/lambdock-repl.sock - 安全な UI 更新: GTK4 はメインスレッドでのみ変更を受け付けますが、REPL はバックグラウンドスレッドで動作するため、GLib の
を使用して UI 更新を安全にディスパッチします。g_idle_add
Emacs で
(reload-dock!) を発行すると、テーマ変更やランチャー定義の変更が単一フレームの中断もなくライブで反映されます!
Emacs (Geiser) から接続する方法
で~/.config/lambdock/settings.scm
と設定。#:enable-repl? #t
を実行し、Guile を選択。M-x geiser-connect-local- ソケットパス
を指定。/tmp/lambdock-repl.sock
REPL での操作例:
scheme@(guile-user)> (use-modules (lambdock core)) scheme@(guile-user)> (get-dock-theme) ;; -> 'vanilla scheme@(guile-user)> (set-dock-theme! 'nature) scheme@(guile-user)> (reload-dock!)
直接接続(ターミナル)
socat, ncat, nc などのツールを使用してソケットに接続可能です:
socat - UNIX-CONNECT:/tmp/lambdock-repl.sock ncat -U /tmp/lambdock-repl.sock rlwrap socat - UNIX-CONNECT:/tmp/lambdock-repl.sock
勝利:上流化およびパッケージ化
混沌とした実験は、ついにグローバルなプラットフォームへと正式に上流化されました。
GNU Guix
guix time-machine コマンド一つで実行・インストール可能です:
guix time-machine --channels=channels.scm -- shell -f guix.scm -- lambdock
Nixpkgs
完全に Nixpkgs へと統合され、Flake としても利用可能です:
nix --extra-experimental-features 'nix-command flakes' run .#
他のエコシステム
- openSUSE / RPM: OBS でのネイティブパッケージ化 (
)。lambdock.spec - Debian / Ubuntu: 完全な
ビルドパイプライン(署名なし)。.deb - Arch Linux:
向けに用意された PKGBUILD。packaging/arch - Containers: DockerHub 上の軽量 OCI イメージ(Podman/Docker 対応)。
試練の後、一人は何を学ぶのか?
この旅路から得られた教訓は以下の通りです:
- プラットフォームと戦うな: GNU/Linux で Wayland ユーティリティを構築するなら、C と GTK4/Layer-Shellの直接採用が明晰さ、スピード、信頼性において優れています。
- Lisp は究極の拡張エンジン:
の埋め込みにより、単純な UI バーが拡張可能でプログラム可能なキャンバスへと変化します。シェルパイプラインやシステムクエリを配置ファイル内で直接実行できます。libguile - 「十分すぎる」に屈服するな: 失敗した PoC は無駄ではありません。それらは究極のアーキテクチャを鍛え上げた炉であったのです。
自由なソフトウェア萬歳、Lisp 萬歳、そして楽しいドッキング!🐑⚓λ