意外な組み合わせ Prologで書かれたX11ウィンドウマネージャーPlwm
引用元:https://news.ycombinator.com/item?id=44089424
ねえ,誰か「チュートリアルProlog」から「ガチのプロジェクトProlog」にどう移行すればいいか,教えてくれる? チュートリアルと全然違うんだよね.Prologは面白そうだけど,おもちゃレベル以上のことやろうとすると,無限再帰とか無理ゲーにぶつかるんだよ.
これ,“ガチの”Prologのための最高の資料の一つだよ:https://www.metalevel.at/prolog 彼のYouTube動画もマジでヤバいくらい良いから見てみて.
うん,俺もそう思う.Markus Triskaは今一番良いPrologの資料だよ.超分かりやすいし,今風の書き方etc.使ってるんだよね.
俺もそれに同意だな.マジで高品質な動画だよ.説明の丁寧さがハンパない.Prolog使うつもりがなくても,聞いてみる価値はあるよ.
論理が中心の動詞や名詞を持つ言語が,どうして「数学じゃない」って言えんのか,ちょっと気になるんだよね.
多くの人はね,数学って言うと連続数学のことだって思ってるんだ.職場で,同僚はほぼ統計家か保険数理士なんだけど,大学で数学は微積分1だけだったって冗談で言うことがあるよ.もちろん,もっと数学はやってるんだけど,それは全部CS系のやつで,論理とかグラフや木みたいな離散構造なんだ.連続系のやつとは全然違う世界なんだよね.
こういう文化の違いは,トウモロコシの食べ方でさえ決まるんだぜ:http://bentilly.blogspot.com/2010/08/analysis-vs-algebra-pre…(弱い証拠だし,もっと強い研究で否定されてるんだけどね.)
離散数学って,微積分で出てくる連続曲線よりずっと分かりやすいよね.
でもまあ、ある種の数学だよね。
WaylandのコンポジターAPIをプロトコルに置き換えるウィンドウマネージャーサービスができたらいいな。そうすれば、Waylandやコンポジターライブラリなしで、どんな言語でもWMが作れるようになるからさ。
riverを見てごらんよ、まさに今こんな感じのことやってるみたいだよ!
すごいニュースだね!riverのことは知ってたけど、こんな機能(プロトコル化)を計画してるなんて知らなかったよ。タイリング専用じゃなさそうだし、まさに求めてたものになりそう。ありがとう!
APIじゃなくてプロトコルなものがもっと増えるといいのにね。
違いを説明してもらえる?
プロトコルはプリミティブと相互作用を定義し、APIは規定的で特定のインターフェースを持つ傾向がある。IETF RFCのSMTPとメールAPIの違いを考えると分かりやすいよ。APIはテストできるけど、プロトコルは仕様への準拠を確認する感じ。RPCやOOPと関係ないプロトコルもあるよ。
詳しいわけじゃないけど、プロトコルは特定のフォーマットで別プロセスとやり取りするものだよ。既存を置き換えるより強力だと思うな。18行のPythonで書かれたX11 WMが良い例だよ。どんな言語でも既存コードと通信できるのがプロトコルの強みだね。
>私のお気に入りの例は、約18行のPythonで実装されたX11ウィンドウマネージャーです。
あの、そのプロジェクトがどこにあるか知ってますか?ほとんどの人にとって例としてかなり分かりやすそうです。
あのPythonプロジェクトのことはよく分からないんだけどさ、何年も前に数百行のCで書かれたこの超ミニマルなWMがすごく役に立ったんだ: https://github.com/dylanaraps/sowm
dwmとかより断然理解しやすかったね。
今年の始めにCで800行くらいの自作X11 WM [1] 作ったよ。長年dwm(4000行)使ってて書きたいと思ってて、steveWM [2] とTinyWM [3] の超小さいのがきっかけになったんだ。
[1] - https://github.com/ChanderG/cellwm
[2] - https://github.com/stodd1031/steveWM
[3] - https://github.com/mackstann/tinywm
TinyWMは僕のRubyのWMの出発点でもあったよ。どれだけちょっとあれば始められるかってことを本当に痛感させてくれるんだ。
もちろん!
https://github.com/mackstann/tinywm
ずいぶん前に一度動かしたことあるけど、僕には完璧に動いたよ。
どっちもあいまいだけど、GP(最初の投稿者)が言いたかったのは、FFIじゃなくてソケットみたいなのを使ってインターフェースしたいってことだと思うんだ。
この文脈での’プロトコル’には、Cのデータモデルとか呼び出し規約に頼れないから、追加のデータ記述レイヤーが必要になるんだよ。
見方はいろいろあるけど:
ー プロトコルは記述的、APIは指示的
ー プロトコルは実装されるもの、APIは実装するもの
プロトコルはSubwayの列みたいで、APIはバー&レストランみたいな感じだよ。
プロトコル = データ構造とかコマンド含めて、チャンネル全体を定義するもの.
API = どうやって接続するか.
何だって? Waylandはプロトコルだよ.APIじゃない.
OPはcompositorとwindow managerを分離してprotocolで話させたいみたい。全然できるんだけど、今のWayland protocolとかにはない(たしか)。shell protocolにその片鱗があるかな?
もっと高レベルで、window manager特化のprotocolのことだよ。低レベルな操作は全部飛ばしてさ。
何に一番驚くか分かんないよ。Prologでwindow managerを書いたって事実か、そもそも誰かがPrologを使ってるって事実か。
もっとコメントを表示(1)
>そもそも誰かがPrologを使ってるって事実か。
これ見てよ: [URL]。面白いPrologの事実: 96〜00年、Windows NT 4の一部としてPrologプログラムが数千万人に配布されてたんだ: [URL]。今Prolog使うかって?今日NT4使ってる人がいるんだから…レトロコンピューティングとかノスタルジー的に楽しむなら、昔のラバランプを今見るのと一緒だよ。
すごくいいね。dwmに慣れてるなら自然に使えるはず。ただし、僕みたいにdwmのtagsをworkspaces以上(別の使い方)で使ってるなら話は別だけどね。作者はそうじゃないからtagsじゃなくてworkspacesとして実装したんだ。だから、これ(Plwm)は僕のdwmの代わりにはならないな。
tagsって、一度分かると本当に素晴らしいアイデアだよね。でも、それに慣れてうまく使えるようになるまで1年くらいかかったのは認めざるを得ないな。
なんか、Erlangだらけだった時のHNのトップページ思い出したな。
面白い豆知識: Erlang interpreterの最初のバージョンはPrologで書かれたんだって。
ソースコード見てみたけど、めっちゃコンパクトだったよ。すげえな。
ただコンパクトなだけじゃなくて、すごく分かりやすいコメントがいっぱい書いてあるね。いいね!
今まで見たPrologと全然違う感じだね。論理のための宣言型言語を、ウィンドウマネージャーっていう実際アプリのためにひっくり返して使ってるなんて、マジすごいわ。ブラボー!
ウィンドウ管理とか、制約って一般的に論理プログラミングにめっちゃ合うよね。
X11向けだと、Schemeで書かれたのがあって、ちゃんと制約ソルバー使ってレイアウトしてたやつがあったよ。
うわー、これ試さなきゃ。ドキュメントもいっぱいあるんだ!最高!
これすごいね。Prolog詳しくないんだけど、これってPrologの論理機能使ってるの?それとも”関数的”な部分だけ?見た感じ’det’とか’semidet’ばっかで、論理的な使い方はしてなさそうに見えるんだけど、何か見落としてるかな?Prologは関数型としてもいいけど、論理機能をもっと使ってて欲しかったな。
実は俺も去年PrologでX11のWM作り始めたんだ。他のことにかまけて放置しちゃったけど。最初は有理制約使ってBSP分割定義するモジュールからだった。そうすれば、有効なペインレイアウトを簡単に変えられるかなと思って。
JSとかCSSで実装されてるWMってあるのかな?それか少なくともJS/CSSを使えるやつとか?Web技術でウィンドウ管理したり装飾したりできたら最高だね。
言語の選択はさておき、plwmに似てるWMとか、何かインスピレーションになったWMとかあるのか気になるな。
全部ライブラリ入れてGentooでコンパイルしてみたんだけど、画面真っ暗でマウスカーソルしか出ないや。
それってたいていのタイリングウィンドウマネージャーと同じじゃん。キーバインド見てみ?ターミナルか何か起動してみなよ。
キーバインド(あと README.md も全部)読んだけど、”launch”とかそういうコマンド期待してたのに何もなかったんだよね。”Increase number of master windows”ってのが一番有望そうだったけど何も起きなかった。唯一反応したコマンドは super+shift+q で終了するやつだけ。Xorg とか plwm のログにも異常はなかったよ。
前からあるよ。
https://en.wikipedia.org/wiki/Scwm
あと、”GWM” ってのもあった。独自のlisp方言”WOOL”に基づいてて、少なくとも90年代初頭からあったみたい。
もっとメジャーなところだと、sawfish(elispっぽい何かを使ってたはず)とか stumpwm (Common Lisp) がいたね。
Sawfish(一時 Gnome の公式VMだった)は Lisp のプラグインがあったね(それとも本体も Lisp で書かれてたっけ?)
Guile Scheme で書かれたのがこれだよ。
https://wingolog.org/archives/2008/07/31/introducing-griddy
これは Lisp でカスタマイズできて、全体的にかなりイケてるよ。https://sawfish.tuxfamily.org/
もう何年も毎日楽しく使ってるんだ。:-)
もうあるよ。
https://github.com/mwitmer/guile-wm
他の Scheme でも存在するかもしれないけど、FFI が Scheme 間で標準化されてないから、実装に依存しないのはなさそうかな。
1991年頃に作ったNeWSベースのX11ウィンドウマネージャーだよ。全部PostScriptで書いてて、パイメニューとかタブ付きウィンドウとかあったんだ。仮想デスクトップとかもあって、これらがシームレスに動いたんだ。リンク色々あるから見てね。僕はICCCMはマジで技術的な大災害だと思ってるよ。Jamie Zawinskiも「マッシュポテトで本棚作るみたい」って言ってる(笑)。X10時代のWMの話もあるよ。
見てくれてサンキュー!Sunは採用しなかったけど書くのは楽しかったな。ICCCMとか関連リンク、別のNeWSコード例も見てね。OWMにはXCalcのボタンを全部個別の窓として扱って、リサイズとかアイコン化できるようにするイースターエッグを仕込んでたんだ(コード付き)。XCalcはリサイズするとグリッドがずれて壊れたからね(笑)。あれはAthena Widgetがひどかった。僕らはそれ見て爆笑したけど、直してあげたかったんだ。ICCCM WMでもできなくはないけど、僕らのNeWS WMは自動でやってくれたんだよ。
Xaw3Dってxcalcのあのジオメトリの問題、解決したっけ?
”.pl”って Perl でよく使う拡張子じゃない?まさか Perl で書かれた Prolog インタプリタとか?(regex で)
Prolog の方が Perl より10年以上前から ”.pl” 使ってたんだよ。
両方で使われてるから、ファイル拡張子だけで何の言語か推測するツールとかは混乱しちゃうよね。
Prolog は Perl より古いし、ファイル拡張子に「これはうちの!」って独占権主張する必要もないでしょ。