Partty!.org始めました - みんなでペアプロできるサービス
今操作しているターミナルを共有できるサービスPartty!.orgを始めました。
Partty!.orgソフトウェアを使ってシェルを起動すると、Webブラウザやtelnetコマンドを使って、その操作の様子が見られるようになります。パスワードを入力すれば、そのまま操作することもできます。
操作の様子は録画されているので、後から再生することができます。↑このようにブログに貼り付けることもできます。
ペアプログラミングにはぴったりです。同じディスプレイをのぞき込んだり、二人が同じ場所に並んでいる必要もありません。「ちょっとコレ見て!」とPartty!.orgのURLを送るだけで、とても気軽に始められます。
とりあえず録画してブログに貼りまくる、というスタイルもオススメです。
Partty!.orgソフトウェアを入れるだけで始められるので、ぜひご利用ください。
ご意見・ご感想がありましたら、このブログのコメント欄かコメントページまでお願いします。
セッションを主催する
セッションを主催してターミナルを共有するには、Partty!.orgソフトウェアをダウンロードして、partty.orgコマンドをインストールしてください。
注意:partty.orgコマンドを起動すると、操作画面がPartty!.orgで配信され、誰でも見られるようになります。パスワードや機密情報を表示しないように注意してください。
Mac OS X、Linuxの場合
コンパイル済みのパッケージをインストールするか、ソースコードをダウンロードして./configure && make && make install でコンパイルしてください。
gccのバージョンが4.1未満の場合は、boostライブラリをインストールして(yumやurpmiなどでboost(-devel)パッケージをインストールすればOK)、./configureに「--with-boost」オプションを指定してコンパイルしてください。
Windowsの場合
コンパイル済みのパッケージが便利です。ソースコードをコンパイルするにはCygwinとboostが必要で、./configureに「--with-windows」オプションを指定してコンパイルしてください。
partty.orgコマンドの使い方
$ partty.org [options] [command...] options: -s <session name> -m <message> -w <operation password> -c <lock character>
partty.orgコマンドを実行すると、[command...]引数で指定したプログラムが起動し、その動作がPartty!.orgで配信されます。[command...]引数を省略するとシェルが起動するので、通常は引数無しでpartty.orgを実行すればOKです。
$ partty.org
- -s
- セッション名を指定します。省略するとpartty.orgコマンドの起動時に尋ねられます。
- -m
- 短いメッセージを指定します。Partty!.orgのセッション名の一覧に表示されます。省略するとユーザー名が使われます。
- -w
- 他の人がセッションを操作するためのパスワードを指定します。省略するとpartty.orgコマンドの起動時に尋ねられます。パスワードは暗号化されずに送られます。また、パスワードを設定できるのは操作のためだけで、見るだけならパスワードを入力せずに誰でも見られます。
- -c
- 他の人がセッションを操作するのを一時的にロックするためのキーを指定します。デフォルトは']'になっており、Ctrl+]でロックできます。
Partty!.orgソフトウェアのインストール:
http://www.partty.org/session/install-partty/2008/03/13/02/42/16
セッションに参加する
共有されているターミナルを見るには、Partty!.orgのトップページにある「Active Session」に表示されている一覧から、参加したいセッションを選んでください。左側にターミナル画面、右側にIRCのチャット画面が出てきます。
パスワード入力欄にパスワードを入力して「Connect」ボタンをクリックすると、そのターミナルを操作することができます。*1
telnetを使ってセッションに参加することもできます。www.partty.orgの7777番ポート(ラッキーポート!)に接続してください。
$ telnet www.partty.org 7777
Windowsから接続するときは、Partty!.orgソフトウェアに入っているguest-partty.orgが便利です。(※中身はputty)
接続するとセッション名を聞かれるので、参加したいセッションのセッション名を入力してください。
次にパスワードを聞かれます。見るだけでいい場合はそのままEnterキーを押してください。
Captty - ターミナル録画ツール
ターミナルを録画するツールにはttyrecがありますが、Partty!.orgではCapttyというツールを開発しました。Capttyはttyrecと比べて、データを圧縮する、ウィンドウサイズを保存するという利点があります。
CUIの操作画面は、普通の動画と比べればサイズは小さいですが、塵も積もれば山となり、長時間使っていると結構な大きさのデータ量になります。特に画面をスクロールしたり、vimやscreenなどを使って画面を分割して操作していたりすると、サイズがどんどん増えます。
しかしデータのほとんどがテキストなので、エントロピーが小さく、かなり圧縮が効きます。普通にdeflateで圧縮するだけで、ざっと10%くらいになります(90%減!)(もちろんデータによって違いますが)
というわけで、Capttyはデータを圧縮して保存します。保存するファイルのデータ形式自体が圧縮を考慮して設計してあります。
それから、ttyrecはウィンドウサイズ(ターミナルの縦横の文字数)を保存してくれないので、再生するときのウィンドウサイズが録画したときと異なっていると、表示が崩れてしまいます。Capttyはウィンドウサイズも保存しているので、ターミナルの大きさを自動的に調節してくれます*1。この録画データのように、途中でウィンドウサイズが変わっても追随します。
Capttyは最初はコマンドラインツールとして実装したのですが、プレイヤーをFlexにも移植してみました。再生処理がFlex内で完結しているので、サーバーに負荷がかからないのがポイントです。録画データをHTTPでサーバーからダウンロードしたら、もうサーバーとは通信しません。
Flex Capttyプレイヤーは、インターフェイスでちょっと挑戦してみました。再生している画面をクリックすると、操作パネルが もやっ と浮き出てきて、マウスジェスチャの要領で上下左右にマウスを動かすと、巻き戻しや早送りができるというものです*2。「もやっ」というようなエフェクトが簡単に使えるのはFlexのいいところですねー。
ブログに貼り付けられた録画データでも もやっ とできるので、試してみてください。
コマンドライン版Capttyのデモ:
http://www.partty.org/session/captty-demo/2008/03/13/02/54/23
コマンドライン版のCapttyはPartty!.orgソフトウェアに入っています。どうぞご利用ください。
Ramzeを使ってみる
Partty!.orgのWebインターフェイスはRubyで書いたのですが、Ruby on Railsではなく、Ramazeという変な名前のWebフレームワークを使ってみました。Railsと比べてブラックボックスがずっと少なく、分かりやすいのがいい感じです。データベースを使わずにVCモデルで構築することもでき、現にPartty!.orgはデータベースを使っていません。(これはターミナル共有プログラムがデータベースに対応していないのが主な理由です)
RamazeのHello, World!は↓こんな感じで、ファイル1つで完結します。
require 'rubygems' require 'ramaze' class HelloController < Ramaze::Controller map '/' def index "Hello, World!" end end Ramaze.start :adapter => :webrick, :port => 8888
これでhttp://localhost:8888/にアクセスすると、「Hello, World!」と表示されます。
テンプレートエンジンくらいは使いたいよね、ということで、↓こんな感じにするとErubisを使えます。
require 'rubygems' require 'ramaze' require 'erubis' # Erubis class HelloController < Ramaze::Controller map '/' engine :Erubis # Erubis def index # メンバ変数にいろいろ入れる @a = "Hello, World!" end end Ramaze.start :adapter => :webrick, :port => 8888
- view/index.rhtmlファイル
<html> <body> <!-- メンバ関数からいろいろ取り出す --> <p><%=h @a %></p> </body> </html>
index以外にパブリックなメソッドを定義しておくと、「/メソッド名/引数1/引数2」というURLにアクセスがあったときに、そのメソッドが呼ばれるようになります。
require 'rubygems' require 'ramaze' require 'erubis' class HelloController < Ramaze::Controller map '/' engine :Erubis def index @a = "Hello, World!" end def session(name, year, month, day) @name = name @year = year @month = month @day = day end end Ramaze.start :adapter => :webrick, :port => 8888
- view/session.rhtmlファイル
<html> <body> <h1><%=h @name %></h1> <p><%=h [@year, @month, @day].join('-') %></p> </body> </html>
http://localhost:8888/session/test/2008/3/12 にアクセスすると、name = test、year = 2008、month = 3、day = 12になっています