1000speakers:3

先日1000speakers:3で発表してきました。題は「Partty!.orgでペアプログラミング」で、Partty!.orgの仕組みについてです。


プレゼンの内容は、私の発表も含めてすべてニコニコ動画にアップされていて、アカウントを持っていれば誰でも見ることができます。すばらしい!マイリスト 1000speakers:3

Ustream.tvの録画データでも見られます。Ustream.tv - 1000speakers


2次会で何故かid:nyaxtさんと「3次会で分散ファイルシステムを書こう」という話になり、徹夜しても終わらなかったので、引き続いてひたすら書いています。writeは遅いけど、readがスケールアウトして、データがレプリケーションされてロバストなP2Pでzeroconfな分散ファイルシステム、という感じです(仮)。Partty!.orgペアプロしているので、録画データでコーディングの様子が見られます。


id:amachangさん, id:nishiohirokazuさんをはじめ、会の運営に当たっていただいた皆様、ありがとうございました。

プレゼンの補足いろいろ

プレゼンをブログでフォローするデザインパターン。ありがちな話ではありますが、プレゼンでは時間の関係でいろいろ端折っています。ブログには時間制限も紙面の制限も何もないのが嬉しい。


まず、何故にptyなるモノが存在するのか。ptyはpesudo-ttyの略で、日本語だと擬似端末と言うらしいです。実体はカーネルモードで動いているドライバで、キャラクタデバイスとしてアクセスできます。
デバイスノードのpathはOSに依存しますが、最近のLinuxの場合はdevptsという仮想ファイルシステムが/dev/ptsにマウントされており、/dev/pts/1, /dev/pts/2, ...のように自動的にデバイスノードが作られます。Mac OS Xの場合は/dev/pts/ttsXXX(XXXは001などの番号)にデバイスノードが作られます。


何が「擬似」なのかというと、元々「端末」(←ハードウェア)を制御するためのttyというキャラクタインターフェイスがあり、このttyの端末側(ハードウェア)をソフトウェアでエミュレーションする(←ターミナルエミュレータを実装する)ために作られたのがptyらしいです(man 4 pty参照)。


ptyの「端末側」と「端末に何かを表示するプログラム側」は明確に分けて考える必要があります。ptyでは、前者はmaster、後者はslaveと呼ばれます。Cのプログラムでは、master, slaveともファイルディスクリプタで表現され、read(2), write(2), ioctl(2)で制御できます。termios.hをincludeすると、ptyを制御するライブラリコール(man 3 termios)が使えます。


ptyはトンでもなく伝統を引きずっているので、時に極めて煩わしいことになります。移植性を考えるとさらに大変なことになります。
たとえば、man 3 termiosを見ると、多種多様な設定ができることが分かります。たとえば「キー入力をそのまま画面に表示する(echo)」「masterからの入力を行単位でバッファリングしてからslaveに出力する」などです。パスワードの入力中にはechoフラグを落としたりします。
masterから入力されたデータをそのままslaveから取り出せるようにするには、以下のフラグを設定する必要があります。

           termios_p->c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP
                           | INLCR | IGNCR | ICRNL | IXON);
           termios_p->c_oflag &= ~OPOST;
           termios_p->c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
           termios_p->c_cflag &= ~(CSIZE | PARENB);
           termios_p->c_cflag |= CS8;

(フラグの種類はOSによって異なる)
このフラグを一度に設定してくれるcfrmakeraw()という関数が、LinuxやBSDにはあるのですが、Cygwinにはありません。

プレゼンテーションで紹介したopenpty()という関数は、Mac OS Xではutil.hというヘッダに含まれていますが、FreeBSDにはutil.hは無く、代わりにlibutil.hをincludeします。Linuxではpty.hをincludeし、libutilというライブラリをリンクするとopenpty()が使えます。(詳しくはpartty.org@CodeReposのpartty/org/configure.in参照)


移植性がある簡単なttyの制御方法は、sttyコマンドを使うことです。ターミナルでstty -echoと実行すると、echoフラグを落とせます。stty rawでcfmakeraw()相当のことができます。
あるいはスクリプト言語を使うのがいいかもしれません。


ちなみに、ターミナルの文字色を変えたりするエスケープシーケンスは、ptyとはまったく無関係です。Flexでターミナルエミュレータを実装したので、そのあたりのこともPartty!.orgに関わっているのですが、それについてはまた書きます。