GUIアプリをターミナルで動かす!まさかの技術でどんなアプリもコマンドラインから操作可能に
引用元:https://news.ycombinator.com/item?id=45181535
俺、Wayland Compositorをスクラッチで自作して、どんなGUIアプリ*もターミナルで表示できるようにしたんだ!カスタムWayland Compositorにはまだ探求されていない可能性がたくさんあると思うんだよね。既存のアプリを色々なクールなものに組み込めるんだからさ!だから、まずはターミナルにアプリを埋め込むことから始めたんだ。だって、それが一番簡単な入出力だからね(出力はutf-8で、素晴らしいchafa
ライブラリを使ってるし、入力はstdinから読み込むだけだから)。
もしクールなWayland Compositorのアイデアがあったら、教えてほしいな。俺は意図的にアプリの80%をTypescriptで書いたんだ。より多くの開発者にアピールして、クールな貢献を募りたいからね(描画はみんながよく知ってるCanvas2D APIで全部やってるから、もし興味があれば、これをクールなターミナルCanvasとして独立させることもできるかも、教えてね!)。
どうやったかのブログ記事もあるんだけど、かなりハイレベルで技術的じゃないから、質問があったら気軽に聞いてね。
How I Did It
*厳密にはWaylandアプリとXwaylandを使ったx11アプリだけだけどね。でもLinuxではほとんど全部だよ。
これ、めちゃくちゃ素晴らしいのに役に立たないね!プログラミングとアートの境目を行く感じだ。きっと最高の学習経験になっただろうし、楽しかったんじゃないかな。よくやったね!
いや、100%無駄ってわけじゃないよ。Dockerコンテナの中でアプリを動かすときに使えるんじゃないかな。GUIアプリをコンテナ内から表示させる方法はあるけど、もしかしたらこれの方がDockerfileをちゃんと書くより簡単かもね。追記:Dockerでやるのは思ったよりずっと簡単みたい[0]。明日試してみるよ。Windowsでもこの解決策が動くのか気になるな。
[0] https://medium.com/@priyamsanodiya340/running-gui-applicatio…
WindowsがほとんどのLinuxディストロより先にWaylandサポートしてたなんて、ちょっと驚きだね!
WindowsがほとんどのLinuxディストロより先にWaylandサポートしてたって?WSLに非加速のWaylandサポートがあったのは一時期だけだよ。それが“ほとんどのディストロより前”って言えるのかな?何を言いたいのか理解できないよ。Linux環境でのWaylandサポートってのは、ソフトウェアがWayland Compositor上で動くことを意味するんだ。WindowsがWayland Compositorじゃないのは有名な話で、どれだけ現実を曲げようとしても変わらないよ。
このプロジェクト、なんでか分からないけどめちゃくちゃ嬉しいんだよね。いつ使うかって言われると全然思いつかないんだけど、見るだけでニヤニヤしちゃうんだ。
これ、「珍道具」をちょっと思い出すね。独創的だけど、ちょっとおかしかったり役に立たないものに特別な喜びを感じるんだよ。
Emacsには珍道具がいっぱいあるよね。あとは、geekcode、xroach、megahal/hailo、xneko、aalibで動画をレンダリングするaatvやmplayer、aaquake、subleq仮想マシンでeforthが動いたりとかね!
昔、aalibライブラリを使ってtelnet経由でワールドカップを見たのを思い出したよ。テレビよりも5秒早く信号が届いてたんだよね!
小さなフレームバッファフォントを使えば、aatvは遠くからでもほぼ見られたけど、fbtvが出てきてからはもう使われなくなったね。mplayer -vo aalibも同じで、映画はXと同じくらいフレームバッファで動いたからね。でも、BBデモは覚えてるし、あのキャッチーなs3mモジュールもまだ記憶に残ってるよ。
https://aa-project.sourceforge.net/bb/
で、まあAAじゃないけど、俺は今でもたくさんのテキストアドベンチャーやローグライク(それにBSDgamesとか)をプレイしてるんだ。俺のメインのX環境はCWM(Window manager)、MPV/MuPDF/NSxiv(画像)、djview4(DJVUファイル)以外は全部CLI/TUIベースなんだよね。
xeyes
って実は使えるんだよ。常にカーソルを見てる二つの目で、動物的な脳が相手の視線の方向を判別するようにできてるから、大きな画面でカーソルを見失っても見つけやすいんだ。
macOSだとマウスを振ればカーソルが大きくなる機能もあるね。普段はxeyes
を動かしてないけど、これは由緒正しいハックだよ。
KDEでもマウスを振ってカーソルを大きくする機能があるよ。Macと違って、振るのを止めない限りカーソルは成長し続けるんだ。画面全体を覆うくらい大きくできるから、マジで面白いよ。
SSHと適切なターミナル表示があれば、どんな低スペックデバイスでもアプリを実行できるよ。動画バッファリングをホストにオフロードすればデータ使用量を制限できるし(それが純粋な節約になるかは不明だけどね)、ホストをVPNの背後に置けば地域制限も避けられるよ。
昔56Kモデムの時代、Netscape NavigatorをSSH経由でXorgサーバーを使ってCommodore Amigaのデスクトップにトンネルしてたよ。AmigaにNetscapeがなかったし、当時のAmigaOSのブラウザじゃWebをまともに使えなかったからね。
今はブロードバンドインターネットや高性能なPCがあって本当に良かった。ポケットのスマホでさえ、子供の頃のデスクトップよりずっと高性能だよ。
おっと、Xを再発明しちゃったね。
これは、より一般的なBrowshみたいなものだね。[1] https://www.brow.sh/
でも一つ重要な違いは、Browshがテキストコンテンツを実際のテキストとしてレンダリングするから、コピーアンドペーストができる点だと思うよ。
Waylandのコピーアンドペーストインターフェース(wl_data_device_manager)を実装すれば、term.everythingでもコピーアンドペーストができるようになるよ。
マジで!?それ最高じゃん。でもGUIの文字はターミナルフォントにはならないんだよね?
そう、テキストはピクセル化されたままだよ。画像にOCRをかけてテキストに変換することもできるけど、それはまた別の話だね。興味があればGitHubで機能リクエストを出してみて。
♡
俺も同じコメントをしに来たよ。面白そうだから自分で試してニヤニヤしたいね。ナイスな仕事!
君にも♡をあげる!
これ、絶対無駄じゃないよ!ttydサーバーでHTTPS経由でターミナル使ってて、carbonylをその上で仕事に使ってたんだ。でもそれはウェブブラウザに限定されるから、フルGUIサポートはめっちゃ便利だね。
これは、限界をどこまでも押し広げる、とんでもなく素晴らしい技術だね!無限に自慢できるやつだ。すごい!これでVDIをどう実装するか分からなくなったよ。攻殻機動隊にも新しい意味を与えてるね。でも、これDoom動くの?
聞けば叶うってね。Doomを動かしてるよ: https://github.com/mmulet/term.everything/blob/main/resource…
いくつか変更が必要だったんだ。term.everythingはstdinからしか入力を受け付けないからね(これでSSHでも幅広いターミナルで動く)。
1. コントロールキーに別のキーを割り当てた(通常はシグナルを送るから)。
2. キー入力のタイムアウトも変更した。stdinではキーダウンイベントは来るけど、キーアップイベントは来ないんだ。だから、いつキーを離したいか推測する必要がある。ほとんどの場合はすぐにキーアップを送れるんだけど、Doomにはキーデバウンスがあるみたいで、キーアップを50-100ms待つ必要があった。あと、ゲームで前進するのに通常は上矢印を押しっぱなしにするけど、これだと連打しなきゃならないね!理想的じゃないけど、ちゃんと動くし遊べるよ。
すごいね!!!俺も昔はtelnetゲームを書いてたから、キーアップが来ないことについてはよく知ってるよ。イミディエイトモード(キーを押しっぱなしにすると連続でキーコードが送られる)でも、いつ止まったか教えてくれないんだよね。バッファをアスキーバイトごとに読み込む必要があったんだ。それでも、これを見れるのは最高だよ。素晴らしい仕事だ!!!
aaquakeはこれが生まれる前からASCIIターミナルで動いてたぞ。
ここのノリ、マジで最高!お前、完全に”ターミナル”を極めたな。もう俺、完全にシェルショック状態だよ。
ひどいダジャレだな。でも、少なくとも頑張ったな(bash)。
もっとコメントを表示(1)
レスが超早いな。このスレッド、いい感じになってきたな(Bourne fruit)。マジで感心した(uTTYerly impressed)。
これ面白いけど、昔もっとすごいのがあったんだよ。GTKテーマで、デコレーションもウィジェットも全部テキスト文字で描画して、GDKバックエンドがテキストにレンダリングするやつ。両方合わせたら、どんなGTKアプリもターミナルで読めるテキストと綺麗なTUIで動かせたんだ。URL:http://zemljanka.sourceforge.net/cursed/screenshots/
リンク切れてるよ。アーカイブはこちら:https://web.archive.org/web/20080924152845/http://zemljanka.sourceforge.net/cursed/screenshots/
くそー、これFedora Coreで見た記憶がうっすらあるわ。
なんでこれ、なくなっちゃったの?
多分、このリンクがオーナーにSourceForgeのアカウント持ってることを思い出させて、それで削除する機会になったんじゃない?ってね。
これ、マジでクールなプロジェクトだね。個人的には、Waylandの上に構築できる面白いユースケースってめちゃくちゃあると思うんだ、例えばこれとか:https://github.com/udevbe/greenfield
あと、今回のやつもね。
以前CarbonylプロジェクトでChromiumをターミナルで動かすのに興奮したけど、メンテされなくなっちゃったんだよね。これってあのプロジェクトをさらに強化した感じだね。めちゃくちゃクールだわ。良い仕事してる!
https://github.com/fathyb/carbonyl
数年前、Kerberosを有効にしたHadoopクラスターのデバッグでSSHポートしか開いてない環境でWebブラウザ無しだと大変だったな。結局macOSにX11クライアント入れて、クラスターノードにGnomeとFirefoxをインストールしたよ。Waylandだとできないことだね。このプロジェクトはすごくうまくいくから、Incusコンテナでテストする例を紹介するね。
apt install -y kitty
kitty
incus –project default launch images:ubuntu/24.04 term
incus –project default shell term
apt install -y curl firefox libharfbuzz0b libfontconfig1
curl -L -o term https://github.com/mmulet/term.everything/releases/download/0.5.1/term.everything.mmulet.com-dont_forget_to_chmod_+x_this_file
mv term.everything.mmulet.com-dont_forget_to_chmod_+x_this_file term
chmod u+x term
echo ’<h1>Hello</h1>’ > test.html
./term firefox test.html
ヘッドレスWaylandのVNCやRDPソリューションができる前に、SSH over TCP経由でvt100エスケープコードを使ったWaylandが実現したんだね。
これはまさにHacker News向きのぶっ飛んだプロジェクトだね。当然のようにTypeScriptで書かれてるし。
この動画を思い出すよ: https://m.youtube.com/watch?v=0mCsluv5FXA
以前Carbonylって似たようなプロジェクトを見た記憶があるよ。偶然だね、笑。それと、これめちゃくちゃクールだね。
https://github.com/fathyb/carbonyl
関連するプロジェクトを紹介してくれるのはすごくありがたいよ。ただ、term.everythingってブラウザよりはるかに広範囲なプロジェクトみたいだね、僕の勘違いじゃなければだけど。
そうだね。他のプロジェクトも素晴らしいけど、目指してるものが違うんだよね。それは「リンゴとオレンジ」くらい違うことだよ。
Awritも似てるプロジェクトだよ。
https://github.com/chase/awrit
面白いね。Xvfbを使ったトリックを思い出したよ。例えばこんな感じ。
$ Xvfb :7 &
$ xeyes -display :7 &
$ xwd -display :7 -name xeyes -out /dev/stdout | convert xwd:- sixel:-
見た目はこんな感じだよ: https://imgur.com/a/Eq2ToVO
もちろん入力はできないから、xdotoolを使うことになるね!最大の利点は、これらのツールはほとんどインストール済みだってことかな。
WindowsユーザーならXMingでXアプリ動かせるよ。昔使ってたけど、スクショじゃなくて実際にアプリを操作できるんだ。
ターミナル(XTermとかKonsoleとか)で表示するのがポイントなんだよね。Xサーバーで動かせるのは当たり前じゃん。
これ、アプリのUI要素のテストに使えるかもね。最近のUIアプリって密結合すぎてテストしにくいし、’関心の分離’ができてないと特に難しい。UIバックエンドなしでUIアプリのテストを書けるようになるかも。
今後の開発、頑張ってね。応援してるよ!
brow.shっていうコンセプトも好きだったけど、これはもっといいな。XとかRDPでごちゃごちゃしたくない時に、ちょっとしたハックとして実用的に使える場面がすぐ想像できるよ。
これ、結構すごいね。リモートで一回きり動かすのに役立ちそう。実行中のプログラムにアタッチ・デタッチしたりミラーリングしたりするのはどうかな?
SSHでデスクトップにつないで、動いてるDiscordクライアントとかを操作できるようになるといいな。RDPのリモートアプリも気になる。
CLIのDiscordクライアントを使えばいいし、Bitlbeeサーバーに対してIRCクライアントを起動する手もあるよ。
あれはあくまで例で、唯一の使い方じゃないよ。俺がリモートでやりたいことの99%はSSH(Wireguard経由)で全然OK。旅行中にノートPCよりデスクトップの方が高性能だから、主にリモートでVS Codeを使ってる。
わぁ、これめっちゃ好き!実はこれには、VS CodeをiPadで使うっていう、特定のかなりマニアックな使い道があるんだ。いつかiPadOSをサポートしてくれるといいな。
私はリモート開発にはhttps://github.com/coder/code-server#code-serverをよく使ってるよ。
iPad用のSSHクライアントがあるのは知ってるよ。だから動くはず!今すぐ試してみるね!
見て!iPadで動いてるよ!スクリーンレコーディングはhttps://github.com/mmulet/term.everything/blob/main/resource…、iPadで動いてるビデオはhttps://github.com/mmulet/term.everything/blob/main/resource…を見てね。でもマウスサポートが全くないんだ。iPad用のマウスサポートがあるSSHクライアント知ってる人いる?(VSCodeをスムーズに動かすのはまだ作業中だよ)
マウスサポートがあるiPad用SSHクライアントを知ってる人いる?→iOSとiPadOS用のBlink terminalだよ。VSCodeのサポートも内蔵されてるんだ。
もっとコメントを表示(2)
マウスサポートがあるiPad用SSHクライアントを知ってる人いる?→Panic社のPrompt 3だね。
ありがとう、チェックしてみるね。
これ好きだなぁ。いつもターミナルで何かを動かしたいんだ。理由はね、1. Xより安全だと思ってたから。2. TTYで動かす動画はいつも音声が良くて、マウスもずっとスムーズなんだ。そう、TTYでもマウスは動かせるよ。
誰かがCarbonylみたいなクールなプロジェクトも言ってたよね。Brow.shも聞いたことあるけど、詳しく説明してくれてたから、term.everythingみたいなプロジェクトが出てくると、他のクールなプロジェクトも注目されるのは良いことだね。1つ目の理由はただの迷信かも。term.everythingがTTYでどう動くかは知らないけど、解像度の問題でひどいことになるかもしれない。でも、それでも良い方向性だよね。
Kitty image protocolで作業を始めたけど、残念ながらあれはこの手のものには全く向いてないね。パフォーマンスがひどいことになる。プロトコルはPNGを表示して→データ受け取って→指定位置に表示して→画面から消す、みたいな感じ。まるでmotion-PNGだよ。最悪だよね。誰かAV1-over-terminalプロトコルを追加してくれないかな。そしたら本当に役に立つんだけど。他には、ウィジェットのテキストには通常のターミナルテキストを使い、残りはKittyの画像を使うカスタムGUIも試そうとしたけど、これはかなり難しい問題だよ。
君が説明しているのはグラフィカルシェルだよ。ネットワーク経由で使いたいなら、Xっていうプロトコルがあるんだ。ターミナルをこの目的で使うのは根本的に無意味だよ。
いや。Xはローカルネットワーク以外では遅すぎて使い物にならないし、FreeNXやxpraみたいな代替も設定が難しくて不安定だよ。それにXは死につつあるから、Waypipeみたいなものか、もっと悪いものを意味してるんだろ(これも前回試したときは外部コマンドをうまく実行できなかった)。
でも、僕はそもそもそれが欲しいわけじゃないんだ。ターミナルに実際に統合されたグラフィカルなものが欲しいんだよ。
これ見てみて!https://www.youtube.com/watch?v=dcjkezf1ARY
多分、ネットワーク経由では動かないだろうね。それに、GUIっぽいものも見当たらないんだけど。
じゃあこれはどうかな?https://github.com/saitoha/libsixel
Sixelは笑っちゃうくらい非効率的だよ。「motion xpm」を想像してみて。
でも、それはネットワーク経由で動くんでしょ?それ以外に何を求めているのかよくわからないな。
これは、僕が所有するビルドマシンで使えるかもしれないね。たまにそのマシン上のデスクトップやブラウザを操作する必要があるんだけど、VNCや他のデスクトップ共有だと実用的じゃないか、セキュリティ上の問題があるんだ。
また同じことを繰り返す嫌なやつだけど、エンジニア向けのマーケティングの教訓その1を思い出してほしい:まず動画やスクリーンショットを投稿することを学ぶんだ。
あと、言葉を失うね、これは素直にすごいよ。
なんかさ、俺のキーボード、“V”、“N”、“C”キーがなぜか見当たらないんだよね。新しいキーボード買わずに済んだから助かったよ!ありがとう!
すごいね!この技術を掘り下げていけば、RDPに発展させられるよ(xrdpとかGNOMEのRemotingとかで試せるやつね)。ターミナルエコシステムがもっと洗練されないのは、群衆のまとまりのなさだけじゃなくて、蒸発冷却現象も関係してるんだ。ターミナルでめちゃくちゃクールなことする人たちは、結局求めてるのは(ルートレスな)リモートデスクトップだって気づいて、ターミナルはそのままにして、もっと洗練されたシステムに投資しちゃうんだよね。
これはさ、なんか変な理由で特定の時に必要になるまで、俺の秘密兵器として取っておくやつだね。マジで気に入ったわ。
純粋な尊敬の念からインストールするアプリってあるじゃん、これまさにそれだわ。俺もEagle View持ってるけど、全然使ってないんだよね。
めっちゃクールじゃん!GitHubリポジトリに動画と例を追加してくれてるのも本当に嬉しいわ。概要を掴むのにすごく助かる!
俺も全く違うアプローチで同じようなことやってたんだよ。いい仕事してるね!この調子で頑張って!
これをdesktop-tui[1]と組み合わせれば、グラフィカルなデスクトップマネージャーとは永遠におさらばできるぜ!
1: https://github.com/Julien-cpsn/desktop-tui
うわー、これマジですごいね。俺、いろんな理由でデフォルトで多くのものをコンテナで実行してるんだけど、グラフィカルなアプリを動かしたい時に、これがあればワークフローがもっと良くなるかも。
動くよ。GIFはすぐ公開するね。