Russ Coxの自己複製zipファイル

Quine の圧縮ファイル版のつくりかたをCox氏が種明かしする。

http://research.swtch.com/zip

なんと次のようなファイルを作ることが可能なのだ:


$ gunzip < r.gz > r
$ cmp r r.gz
$

内容

  • 「turtles all the way down」の逸話
  • 「the way down」テーマのユーモラスな画像
  • Quineの歴史とpython, scheme, go言語による実例
  • Lempel-Zivの仕組み
  • zipフォーマットレベルでロジックを解説
  • 自己複製するファイル実例: r.gz r.tar.gz r.zip
  • これらを生成するgoプログラム

こんな難問を娯楽とするぐらいでなければ偉大なハッカーにはなれないんだろうか…

いつか理解したいポスト: http://research.swtch.com/zip

mosh: MITからモバイル時代のSSH代替品

http://mosh.mit.edu/

  • ローミング可能
  • 断続的な接続でも平気
  • ローカルエコーで快適なレスポンス

などの機能をそなえたSSH代替ターミナルソフト。その名も「モッシュ

iPhone/iPadでウロウロしながらサーバ作業をするのを想定しているようだ。ドキュメントやパッケージの充実度からしてもかなり高質のプロジェクト。こいつら本気でSSHを越えようとしている。

こんな能書き

  • IPが変っても大丈夫
  • スリープ後もターミナルが生きている
  • 遅いリンクでもローカルエコーにより快適
    • 要は素早く打ち込んでいるときにスクリーンが止っちゃうことがない
    • フルスクリーンモードでも有効
    • サーバ側と同期化されていない入力はアンダーラインで記される
  • ルート権限がなくてもサーバのインストール可能
    • サーバは一般プログラムとしてインストールして、それをSSHで立ち上げる
    • SSHをinetdとして使っている感じだと思う。いったん立ち上がるとUDPでクライアントと通信しはじめる。
  • ユーザ認証はSSHに任せている
    • ので今迄通りに使える
    • セキュリティー上難しく危ない部分は実績のあるSSHにまかせているので安心できる
  • 頑丈なターミナルソフト
    • バイナリのエスケープシーケンスでセッションが文字化けするようなことが無い
    • 最初からutf8サポート。既存ターミナルのエンコーディング関係のバグをとってある。
  • Control-Cがいつでもきく

ローミングとか今やっていないので、全ての恩恵にはあずかれないが、いくつか検証できた。

  • ラップトップをスリープさせて起した後、ネットワークが接続するとターミナルが生き返った。これだけでも使う価値あり。
  • ローカルエコー: 素早く打ち込んでも全くラグがない。これは快適。

これならサーバにつなげっぱなしにしたターミナルをずっと開けていられる。カフェに移動したら再接続とかする必要がなくなる。

これだけでも凄いが、このプロジェクトは単にローミング可のターミナルを作ったのではない。State Synchronization Protocolという状態同期可プロトコルを開発し、moshはそれをもちいた「最初のアプリケーション」という位置付けになっている。単にGUI環境を作るのでなく、それを可能にするプロトコルとツールキットを開発したMITらしい壮大な発想だ。
学術的な話を読みたが、取りあえず使えるようにしよう。

「Getting Mosh」セクションに重なOS環境のパッケージが準備されている。
Lucidにはadd-apt-repository、apt-get update、installですんなり入った。
ソースからインストールする際のはprotocol buffersとboostライブラリとヘッダーが必要となるが、依存モジュールもちゃんと明記してある。

ライアントコマンドはなんとperlスクリプト。IO::Ptyが必要になる。debianならlibio-pty-perlで入る。あるいはcpan IO::Ptyで入れる。


$ mosh
Can't locate IO/Pty.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.10.1 /usr/local/share/perl/5.10.1 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .) at /usr/local/bin/mosh line 24.
BEGIN failed--compilation aborted at /usr/local/bin/mosh line 24.


$ mosh
Usage: /usr/local/bin/mosh [options] [--] [user@]host [command...]
--client=PATH mosh client on local machine
(default: "mosh-client")
--server=PATH mosh server on remote machine
(default: "mosh-server")

--predict=adaptive local echo for slower links [default]
-a --predict=always use local echo even on fast links
-n --predict=never never use local echo

-p NUM --port=NUM server-side UDP port

--help this message
--version version and copyright information

Please report bugs to mosh-devel@mit.edu.
Mosh home page: http://mosh.mit.edu

とりあえずサーバに向けてみる

サーバ側にmoshがインストールされていないとエラーになる。sshがユーザのパス上のmosh-serverを探して立ち上げる。


$ mosh example.com
bash: mosh-server: command not found
Connection to example.com closed.
/usr/local/bin/mosh: Did not find mosh server startup message.

ファイアーウォール設定:

サーバの60000-61000のUDPポートを開ける。
sudo ufw allow 60000:61000/udp
これが閉まっていると、ずっと接続待ち状態になってしまう。
そういうときは「Control-^ .」(コントロール+シフト+6押してからポチ)で終了。

設定のまとめ

  • クライアントとサーバにmoshをインストール
  • サーバでUDP 60000-61000を開ける

これだけ。

SSHなんてもう完結していて進化の余地が無いなんて思ってしまうのは想像力な無い証拠なんだな。どんなに優れたものでも、さらに向上の余地はある。それをイメージする想像力と実現する能力のある奴が歴史をつくっていくと感じさせるプロジェクトだ。