ターミナルエミュレーションの基本
この年末年始で、やってることがあって、いわゆるターミナルエミュレータっていう概念がありますよね。
概念っていうかジャンル、Windowsとか、あとMacとかLinuxとか、あとFreeBSDとか、Freeじゃないか、NetBSDとかもあるか、BSDとかあるじゃないですか。
いわゆるパソコンの端末上で、本当のガチの端末、なんかサーバーマシンとかの画面出力って、
だいたいよく見るのが黒い画面に白い文字だけ出てるとか、緑の文字が出てるとか、そういうやつあるじゃないですか。
あれをパソコンのWindowsの中に再現しているソフトがターミナルエミュレータっていうのがあって、
そのパソコン自体をいじるのにも使うし、サーバーにネットワークから繋いで操作したりするのにも使う。
そういうコマンドを打ち込んで何かをさせるときに使うアプリっていうのがターミナルエミュレータっていうのがあって、
MacのときはデフォルトでTerminal.appっていうアプリが入っていて、基本的にはこれで困らないっていうか。
年々改善されてもいるし、あんま困らないし、私はTerminal.appをずっと使ってたんですよ。
なんですけど、いわゆるコーディングエージェントとか、私はClaude Codeを使ってるんですけど、
そういうやつを使うにあたってめちゃくちゃログがバババって流れてったりとか、結構目まぐるしい動きをするんですよね、ああいうのを使っていると。
そのときに描画が追いついてないんじゃないか問題みたいな、私はあんまそうは感じないんですけどね。
目がいい人、胴体視力がいい人たちは描画が追いついてないとか言って、なんか俺じゃなきゃ見逃しちゃうねみたいな感じの人いる。
知らんけど。
まあ私は気になってはいないんだけど、描画速度が超速くて快適だってみんなが言っている、
ゴースティーっていう、ゴーストって幽霊ですか?幽霊のTTYっていうのがそのターミナルエミュレーターの概念の名前としてあるんですよね。
それと掛けてるのかな?ゴーストのTとTTYを合体させて、Ghosttyっていう。
Ghosttyかなこれ。多分Ghosttyって呼ぶんだと思うんですけど。
ちょっと今話題になってるんですよ、このGhosttyっていうターミナルエミュレーターが。
なんでちょっと年末年始で新規一点、普段使っている道具を変えてみようかなと思ってセットアップしてたんですよ。
機能と利点の比較
したら確かにちょっと動きがいいかもしれない。
これはでもあらかじめ動きがいいって聞いていた状態で使っているからそう思うだけなのかもしれませんけど。
確かになんかヌルヌル動いてるような気がするから、いいんでしょうね多分。
なんか、マシンの中のCPUだけじゃなくてGPUっていうグラフィックを司るプロセッサーもちゃんと使ってくれるっていう特徴があるらしくて、
ターミナルアップの方はどうやら使わないらしいんですよね。
そういう違いがあるっていうか。
だからこそ1秒間に何回書き換えるみたいなやつもうまくいくっていうことだと思うんですけど。
その他にもGPUを使うっていうことの他に、フォントリガチャ。
リガチャっていうのは何ですか。
2つ文字が並んでたときにまとめて表示するみたいな機能だった気がするんですけど。
例えば、ハイフンとダイナリみたいなやつ。
ハイフンとダイナリを組み合わせるとこういう感じですよね。
こうなると矢印に勝手にしてくれるみたいな。
どうなんだとは思うんですけど。
一文字に見えちゃうのはどうなんだとは私は思うんですけど。
ただ綺麗に見えるよねっていう。
多分そういうやつのことをリガチャって言う?
私はそう理解してるんだが。
あとキッティグラフィックスっていう企画。
並びにアイタームイメージプロトコルっていうやつに対応していて。
これら別々の同じ目的を持った企画らしいんですけど。
ターミナルエミュレーターって言うからには、
とにかく画面の中に文字がバーって表示されさえすれば目的は達してるわけですけど。
別に最近のパソコンであればそれに限らなくてもいいわけですよね。
なので割り切って、割り切ってっていうか思い切って画像とか表示しちゃいます?みたいな。
画像ファイルをコマンドで呼び出したときに
ターミナルエミュレーター上にその画像の表示ができるとか。
そういう機能に対応してたりとか。
あとハイパーリンク機能。
https://とかで始まる文字列があったとしたら、
Macだとしたらコマンドキーか何かを押しながらカーソルを持っていくとクリックできて、
クリックするとデフォルトブラウザでURLが開くとか。
そういう細かいいろんな機能が充実しているのがGhostyっていう。
モダンターミナルエミュレーターみたいな感じなんですかね。
シェルの変更について
よくわかんないんですけど。
多少は調べましたが。
あとClaudeにここ最近流行っているターミナルエミュレーターの機能のサポート度合いの
マトリックス表を作ってとかって言えば作ってくれるんで。
ここであえて貼りませんよ。
これを読んだり聞いたりしてる人が各々自分の環境で一言AIに聞けば出てくるもんだから
私は貼らないっていう。
その都度正解が違うかもしれないからね。
正解などないのかもしれないけど。
こう聞けばその時最新の情報が手に入るよとだけ言っておきます。
導入したまではいいんですけど、それだけでは済まなくて。
普段はターミナルに限らずMac上で様々な入力作業をするときに
例えばTabボタン。キーボードの中にTabボタンってあると思うんですけど。
あれを押すと保管が効いたりするじゃないですか。
例えば何ですかね。
suとかまで入れてTabを押すとdoとかsudoになったりするじゃないですか。
ああいう保管にTabを使うんですけど。
キーボードのAに指がある状態からTabに小指を持っていくのだるいじゃないですか。
せいぜいAの左隣にあるコントロールまでしか押したくないじゃないですか。
というときにどうするかというと、コントロール。
左手の小指でコントロールキーを押しながらキーボードのiボタン。
iボタンは右手で押す。
コントロールiを押すとTabの機能が発現するわけですよ。
なので私の中でキーボードでTabを押すときはだいたいCtrl+iなんですよ。
それで今までうまくやってきたんですよ。
あとエンターキー。
エンターキーも右手の小指で右端の方まで指を持っていかないとエンターキーって押せないじゃないですか。
割と面倒じゃないですか。
ほんのわずかの差ですけど。
それもコントロールを押しながらmボタンを押すとエンターキーになるわけですよ。
エンターというか開業というか。
だからそれで快適に過ごしてきたんですが、
このゴースティーにした瞬間それが効かなくなって。
ようわからん文字が出てくる。
数字の 9;5u みたいな。
なんかのエスケープシーケンスっていうんですかね。
エスケープシーケンスがそのまま出てきちゃってて。
これは困ったなって。
そんな文字を入力したくてコントロールiとかを押してないんだよなって。
そういう状態になっちゃってすごい困ったんですよね。
もちろん今時そういうトラブルに遭遇した時にわざわざググらないわけですよ。
苦労度にこういう状況になって困ってるんだけどどういうことって聞いたらもちろんわかります。
キッティーボードプロトコルとかっていう。
調べてもらったんだけどよくわかってないんですけど。
このエスケープシーケンスがそういうことなのかな。
ちょっとよくわかってないんですけどマジで。
それがゴースティからは使ってるSHELLっていうアプリがあるわけですけど。
だいたいターミナルを立ち上げたときにSHELLっていうアプリが立ち上がって、
対話式の操作を受け付けてくれるわけですけど。
Macだとzsh。
zshっていうやつが今デフォルトになってて、
私もzshを使ってるんですよ。
その前はbashっていうやつがオーソドックスなshellと言われていて、
世代が違うっていうよりはトレンドっていう感じですかね。
zshっていう読み方であってる?そもそも。
私はzshって呼んでるんですけど。
zshなんだろう。
今Macのデフォだから使っててもおかしくないと思うんですけど。
でもなんだかんだ言って私も15年くらい前から使ってるかもしれないですね。zshはね。
15年くらい使ってて読み方に自信ないってどうなの。
それはどうなのマジ。
雨降ってきた。
ちょっと話がそれたんですけど。
zshだとこのエスケープシーケンスに対応してないらしいと。
そうなるとMacのデフォルトのzshから
エスケープシーケンスに対応したzshにしなきゃいけないって言われて。
zshもbashもどっちも対応してません。
じゃあ対応してんの何かなって見てみたら、
そのマトリックス表を作ってもらって見てみたら
fishっていうやつがどうやら対応してると。
なんか聞いたことあるわfishと思って。
一部の既得な人が使っているイメージ。
ちょっとできる人が使っているっていうイメージありますけど。
そういう感じで、ついに私もfishを使う日が来たかと思って。
fishにしようって思ってfishにしたんですけど。
それが結構いいですね。
フィッシュシェルの機能
様々な補完とかも。
これいいのか悪いのかわかんない。
今までにない動きをしてるから新鮮だなって感じ。
でも使えなくないし、むしろ使いやすいかもしれない。
まだ今試してる最中だからなんとも言えないんですけど。
もちろんCtrl-IとかCtrl-Mとか、さっき言ってた
何て言うんだっけこれのこと。
CSI uっていうらしいですね。
Ctrl-IとかCtrl-MとかとTabとかEnterとかを別々のものとして区別して、
別々の機能を割り当てることができる方式っていうことらしいですね。
このCSI uじゃない場合にはCtrl-Iって入れたら
Tabを押してるのと区別がつかなかったっていうことっぽい。
そうなんだ。知らなかった。
ちゃんと区別がついてるらしい。
区別をつけたところでTabを押したときとCtrl-Iを押したときは同じ挙動にしてるし、
Enterを押したときとCtrl-Mを押したときは同じ挙動にしてるから、
区別がつくメリットは今のところ享受してないんですけど、
とにかく両方ちゃんと動くようになったんで、それは良かったですね。
なのでしばらくfishを使おうかなと思って。
フィッシュで合ってる読み方。
特にZシェルの方が特殊な読み方だった気がするんだよな。
そういう感じですね。
メインの話はここまでなんですけど、
さらに追加の話があって、
クロードコードに出してもらったマトリックス表ですね。
最近のモダンなシェル一覧みたいな。
縦軸が機能で横軸がシェルみたいな感じのやつを出してもらった後、
見慣れないシェルがあって、
NUシェルっていうのがあって、
これちょっと面白かった。
メインで使うことはないんですけど、知っておいて損ないなと思ったんで、
ちょっと紹介しておくんですけど。
数値計算っていうよりも、
テーブル上のデータの扱いに特化した感じのシェルっていうか、
例えばCSVっていうのがあるじゃないですか。
キャラクターセパレーテッドバリューズみたいな。
いわゆるカンマ区切りが有名ですけど、
カンマ区切りとかタブ区切りの行がたくさんあって、
行と列になってますみたいなやつとか、
あとはJSON-Lとか、
あとはJSONそのものとか。
そういうテキストではあるんだけど、
ローとカラムの構造を持っているようなテキストっていうのがあると思うんですよね。
そういうのをいい感じに扱えるパイプを介して。
JSON標準出力っていう、
ターミナルに出てくるテキストの出力があるんですけど、
その出力をパイプっていう仕組みを使って、
高速のプロセスに引き渡すことができるんですけど、
その時にパイプでfromJSONっていうプログラムを使って加わすと、
単なるテキストじゃなくて構造をちゃんと認識した状態で、
さらにパイプを介して後ろに構造化した情報として渡すことができるみたいな。
そうすると、JSONの標準出力をパイプで受け取ってfromJSONに加わせると、
その高速のパイプで受け取ったプログラムが、
フェアでカラムのキー、大なり小なりとかイコールとかを使って絞り込みができたりとか、
あとはグループバイとか、いわゆるSQLっていうストラクチャードクエリーランゲージってあってたかな。
データベースに命令するための言語があるんですけど、
私が一番好きと言っても過言ではない言語なんですけど、
Rubyとどっちが好きか分かんないぐらい。
SQLっぽい雰囲気で、シェル上でローとカラムのデータを扱うことができるっていうやつで、
ちょろっと触ってみましたけど結構楽しいですね。
あれっぽい、Windowsのパワーシェル。
パワーシェルはもっとやばくて、
普通シェルってあれなんですよね。
標準出力とかを介して、標準出力をパイプでやり取りするときにはテキストデータが基本なわけですけど、
パワーシェルの場合、オブジェクトそのものを後続のパイプに渡すことができる。
だから型が合わないと壊れちゃったりするんですけど、たぶん。
だからLSって言う、今いるディレクトリにあるファイルとかディレクトリの一覧を出してくるコマンドみたいなやつがあるんですけど、
そういうので出してきた情報が単なるテキストじゃなくて、
すごい、覆面パトが来た。
覆面パト来たで。
何が起きるんだ。
覆面パトがパカパカしてるの分かります?
車検かな?臨時車検かな?
ていうかそろそろ閉じるのかな?もしかして。
0時過ぎた。もしかしたらそうかも。
まあいいか。
そんな感じで、面白いなって。
NU処理。
NUっていうコマンドで呼び出せるんですよ、そのシェルが。
だから別にフィッシュを使っててもNUって打てば、
NUって打ってエンターを押せばNUのインタラクティブな状態に切り替わるので、
さまざまなデータ。
例えば、ビッグクエリっていう、
わしがよく使ってる大規模データを分析するためのSQL処理系があるんですけど、
それを叩くコマンドとかもあるんですよ。
そういうコマンドの出力をJSONフォーマットにして、
その出力を標準出力にJSONで引き出すとするじゃないですか。
だからクラウド上にあるデータベースの情報をSQLで引っ張ってきた後、
手元でNUシェルでパイプで絞り込んだりとかできる。
ただ、ビッグクエリにクエリして引き出してきたJSONをさらにクエリすることの無駄さ足るよ。
最初から。
ビッグクエリにクエリするときのクエリに条件とか入れればいいじゃんみたいなのはもちろんあるんですけど、
1回しか呼びたくないとか。
使うたびにお金かかるから、
標準出力でJSONを引き出したものをどっかのファイルにリダイレクトしておいて、
その後ファイルをキャットする形で取り扱ったりするのはいいのかもしれないですね。
でもそういうことをするんだったら、
手元でファイルとかを対象にSQLを発行することができるアプリ、
DACDBっていうのがあって、
そっちでやった方が良くないっていう。
NU-SHELLの特別な、
特別って言ってもそんなに複雑な命令じゃないんですけど、
一応新規で覚えなきゃいけないじゃないですか。
それはDACDBだったら標準SQLでいけるわけだから。
覚えること少なくて済むし、
なーっとは思いました。
だからいまいち何に使うんだろうって。
全てをデータベースで完結できる環境にない人、
手元にたくさんいろんなファイルがあってまとめなきゃいけないとか、
Pythonで分析してるけど残骸がいっぱいあるとか、
手元でいろいろガチャガチャやる人にとっては、
一瞬で結果が出てくるから、
いちいちDACDBとか立ち上げなくても結果が出てくるから楽みたいな、
そういうノリかもしれませんね。
でも今まで存在すら知らなかったんで、
触ってみるいい機会になりましたという感じです。
さすがに終わるか。
こんな感じで、いまこの一連のターミナルエミュレーターとかシェルとかを、
今までターミナルアップとZシェルだけで別にいいやと思っていた中、
新規っていろんなのを触ってみましたっていう話で、どうでしょう。
NUシェルの紹介
じゃあこんな感じで今日は終わりです。バイバイ。