みんなでターミナル Partty!
複数の人で同時に操作できるターミナル「Partty」というものを作ってみました。一つのターミナルを複数の人が同時に操作することができます。
partty-0.0.2.tar.gz
※追記:バージョン0.1作りました>みんなでターミナル Partty! 0.1リリース!
Betaにも達していないAlpha版です。Linux(x86)とMac OS X(Intel)で動くことを確認しました。他の環境では…分かりません。pthreadとopenpty()が使える環境ならだいたい動かせると思います。
poll/epoll/kqueueを任意に切り替えられるコードを使っています。
Parttyとは?
複数の人で同時に操作することができるターミナルです。アイディア次第でいろいろなことができるはず。
ペア・プログラミング、グループ・プログラミング
ターミナルを共有しているので、打ち間違いまで生々しく共有されます。「ペアプロしよう」と言う代わりに「パーティーしよう!」と言えば盛り上がること間違いなし!
シェルの神業的操作や、目にもとまらぬエディタ捌きなど、ソースコードには現れないテクニックも共有することができます。
プログラマブル・リアルタイム・チャット
echoコマンドでチャットしよう! シェルスクリプトを駆使したプログラマブルなチャットが楽しめます。
bannerコマンドを使えば、いろんな気持ちを伝えられます。
####### ##### #### ############ ######### ##### ####### ############ ### ### ## ## ## ## ### ## ## #### ## ### ### ### ### ## ### ## ## ## ### ## ## ## ### ## ## ## ### ## ## ## ### ### ### ## ### ## ## ## ## ### ## ### ### ## ### ## ######### ############ ############ ####### ############ ############
テキストだけだと味気無いですか? printf "\a"でビープ音を鳴らしましょう!(ビープ音ってこのためにあったんですね)
…ところでGNU screenの共有機能と何が違う?と言う話がありますが、こちらは共有する機能のためだけに特化して、使い勝手を良くしたいと思っています。
機能追加
とりあえず現在は、UNIXドメインソケットを使って通信して、複数のクライアントから親のターミナルを操作できる、という機能だけです。他にこんな機能あんな機能を加えてみたいと思っています。
TCPで通信
UNIXドメインソケットだと同じマシンにログインしないといけないので、TCPでつなげられるようにしたいと思っています。実装は全然難しくないので、近いうちに作ります。
認証と暗号化
「Partty」の名前の由来は「みんなでぱーっとテレタイプ」だったりするので、認証なんて要らない!なんて大胆に言ってしまっても良いかなと思ったのですが、TCPで通信し始めるとさすがに認証が要るかなぁと思っています。opensslでSSL?
操作権限
操作はさせたくないけど見せたいというときに、接続してきているユーザーごとに操作権限を設定できるようにしたいと思っています。
パーティーコマンド
認証や権限の設定をするために、「パーティーコマンド」と言うものを作ろうと思っています。完全にネーミングありきです。
パーティコマンド発動!とやると、接続してきているユーザーを一覧表示してみたり、操作権限を剥奪してみたり、接続を切断してみたり。
パーティコマンドの起動方法は今悩み中で、GNU screenのようにエスケープコマンドで発動するか、あるいは操作用プログラム+ソケット等のIPCで外から操作するようにしようと思っています。エスケープコマンドだと、もうCtrl+なんとかなんて余ってない!ということになるので、外部プログラムにする線が濃厚です。
ただ、配布のしやすさを考えると単一のバイナリにしたいので、別のコマンドを作るのではなく、引数で処理を分けるようにすると思います。
マルチキャスト・サービスディスカバリ
相手にIPアドレスとかポート番号とかを伝えるのは面倒すぎてやってられないので、mDNS-SDで何とかできないかなーと思っています。
mDNS-SDでなくとも、ブロードキャストを使う何かで自動的に公開されているParttyを発見する機能を付けたいと思っています。
…さて、実はこれは次期V-FIELD用の実験だったりします。複数のクライアントを高速にさばく処理や(ターミナルがもっさりするのはイラつくので速度重要)、認証、ノードのモニタリング、動的な設定の変更、ブロードキャストで他のノードを発見などなど。
小物系プログラムなのに、マルチスレッドだったり、ちょっと気の利いたIO多重化機能を組み込んでいたりするのは、そのためだったりします。