チューリング不完全

What are you afraid of? All you have to do is try.

momonga.vim #4 に行ってきました

f:id:aomori-ringo2:20140608233327j:plain
momonga.vim #4に行ってきました。


momonga.vim #3に引き続き2回目の参加です。前回は完全にvimがわからず、sudo yum install vimから始まりました。
前回のおかげでvim自体は入れられましたが、元々使用しているエディタはemacsです。vimを立ち上げても、「emacsだとこうなんだけど、vimだとどうすれば・・・?」というのをいちいち調べるのがめんどくさくなって、結局emacsを起動してしまうわけです。ダメなやつです。
というわけで、今回はそれを解消できるようにvimrc・・・というかそれ以前に今の疑問をちゃんと解消するということをしました。

やったこと

タブ

まずタブがよくわからんので調べました。
Vimの便利な画面分割&タブページと、それを更に便利にする方法 - Qiita
タブと画面分割のコマンドを覚えました。

Unite.vim

そういえばいれてなかったのでいれました。
unite.vim について語る - C++でゲームプログラミング
Unite fileとかUnite tabとか、ああ便利。

キーバインド

今使えているvimキーバインドはほんとに最低限で、hjkl, x, i, ESC, yy, p, dd, G, :q ぐらいでした。かなりやばさです。
(矢印キーはvimrcで無効にしてある)
以下のコマンドを覚えました。

コマンド
Ctrl + u 半画面分 上へ
Ctrl + d 半画面分 下へ
Ctrl + b 一画面分 上へ
Ctrl + f 一画面分 下へ
zz バッファ位置をカーソルが画面の真ん中に位置するようにする
zt バッファ位置をカーソルが一番上に位置するようにする
zb バッファ位置をカーソルが一番下に位置するようにする

前述のタブ、画面分割のコマンドは省略してます。
あ、そういえば矩形選択とか・・・ううっ

Pythonの設定

もともとemacsのelもそこまでもりもり設定を書いている方ではないし、とりあえずこのぐらいかな?ということでaomoriringo/number_bot · GitHubの進捗を出していました。
しかし、なにかおかしい。インデント幅が8だし、改行時に毎回カーソルが一番左にくる、これはめんどい。

そこでPython用の設定を書きました。

# ~/.vim/after/ftplugin/python.vim
setlocal shiftwidth=4 softtabstop=4 expandtab

この辺はthincaさんが教えてくれる通りに端末を打つだけのになりきっており、ファイルパスの意味とかよくわかってないです。

momonga.vim

momonga.vimの様子についても書いておきましょう。

開始前

momongaさん、thincaさん、rbtnnさんと一緒にお昼ごはんを食べました。thincaさんはラーメン大好きthincaさんと化していました。
(momonga.vim #4 に行ってきた - 永遠に未完成)

効果・効能

やったことを並べるとかなり大したことないのですが、momonga.vimでは周りが全員vimmerです。
Twitterで「これどうすればいいのかな・・・」とか書くと、replyが即座に3つぐらい飛んできて大変便利です。(マサカリではない)

momonga.vimにおけるマサカリ

thincaさんとLindanさんが「進捗どうですか?」という名のマサカリを満面の笑みで投げていました。

終了後

晩御飯を食べつつカラオケに行きました。しかしそこはやはりvimmerです、全員ノートPCを開いて進捗を出し、合間に歌うという状態でした。


まとめ

前回より実用的な進捗が出て大変有意義でした。
次回のmomonga.vimは7/26(土)予定です。

wgetでhttpsに接続すると証明書エラー

ハマったので書いておきます。

環境

現象

$ wget https://bitbucket.org/ringo/hogehoge/downloads/hoge.tar.gz
--2013-12-05 19:27:59--  https://bitbucket.org/ringo/hogehoge/downloads/hoge.tar.gz
bitbucket.org をDNSに問いあわせています... 131.103.20.168, 131.103.20.167
bitbucket.org|131.103.20.168|:443 に接続しています... 接続しました。
エラー: bitbucket.org の証明書(発行者: `/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV CA-1')の検証に失敗しました:
  発行された証明書はまだ有効ではありません。
bitbucket.org に安全の確認をしないで接続するには、 `--no-check-certificate` を使ってください。

wgetのURL、上記例ではbitbucketですが、https接続だとどこに接続してもこんなエラーが出る状態。

    • no-check-certificateを使えばダウンロードは可能ですが、そもそもなぜこれが出るのだろう、というお話です。

解決に向けて

  • ca-certificatesパッケージのインストール

2007/04/18-06、wget、証明書の検証エラー - debian-etch に関するメモ(後、lennyへアップグレード)

  • crtファイルの有無

githubで証明書エラー(certification error)になったときの対応 : : まめしみ


上記2点を確認しましたが現象は変わらず。頭をひねりながらエラーメッセージを眺めていたところ、変なメッセージが目につきました。

発行された証明書はまだ有効ではありません。

「まだ」有効ではありません・・・?

$ date
2013年  12月   5日 木曜日 18:30:11 JST
$ date -s "2014/05/23 10:58"
2014年   5月  23日 金曜日 10:58:00 JST
$ wget https://bitbucket.org/ringo/hogehoge/downloads/hoge.tar.gz
--2014-05-23 10:58:03--  https://bitbucket.org/ringo/hogehoge/downloads/hoge.tar.gz
bitbucket.org をDNSに問いあわせています... 131.103.20.168, 131.103.20.167
bitbucket.org|131.103.20.168|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 302 FOUND

(中略)

`hoge.tar.gz'に保存中

100%[===============================================>] 1,401,247     573K/s 時間 2.4s

2014-05-23 10:58:07 (573 KB/s) - `hoge.tar.gz' へ保存完了 [1401247/1401247]

時間かよ!盲点すぎた。

結論

エラーメッセージを良く読もう。

2013

そらはさんの記事Looking back at 2013を見て良いなと思い、マネ|パクリ|オマージュしました。


以前2013年第1四半期を振り返るという記事を書いており、四半期ごとに書ければよいと思っていたのですが、私の人生で3ヶ月の期間にあえて言うようなイベントはそうそう起こるものではないらしく、結果この体たらくです。

At the statistics

5 posts

ブログに関してはほとんど書けていなくて、ひどいとしか言い様がない。しかしMathematicaで任意画像の輪郭を数式に変換する記事がはてブの400以上のブックマークを頂きました。これまで自分の記事がこんな事になったことがなく、伸びまくるブクマをみてそわそわしていました。
大学時代にMathematicaを使ってGUIプログラミングしたりTwitterにPostしたりしていたせいで学内で「Mathematicaのヘンな人」と言われてしまったことがありましたが、結局大学を出ても私が一番言及できる言語はC#でもPythonでもなくMathematicaであるらしいです。2014年も機会があればMathematicaネタを投下したいです。

5651 tweets

Twitterをヘビーに使用している方から見るととても少ないかもしれませんね。
Twilogを見ても分かる通り、毎日10~30postあたりで安定しています。また、Twilog Statsによるとつぶやいた日数: 1723日、つぶやかなかった日数: 9日ということで、ほぼ毎日何かしら書いているようです。無理なく続いているとも言えるでしょう。

26 conferences/events

思ったより行っててびっくりした。
半分ぐらいは会社で主催している分散システム本読書会です。タネンバウムのDistributed Systemsを輪読する会で、日本語訳書籍の翻訳がとにかくひどいと話題になりました。そういえばこの本もピアソン桐原のアレで絶版になってしまいましたね。
その他はHaskell系、u-aizu系、Twilio系などに参加していたようです。
Haskell, 2013年の前半ははまってProject Eulerも30~40題ぐらい解いたのですが、最近めっきりやってませんね。

44 books, 366 comics

本については読書メーターで管理しています。
小説は筒井康隆、漫画は押切蓮介にはまった一年です。漫画以外の読了書籍44冊のうち、半分ぐらいが筒井康隆です。活字苦手の私としては結構読めたほうだと思います。
割と厚い本も読めており、例としてはゲーデル、エッシャー、バッハマルドゥック・スクランブルソドムの百二十日あたりです。
特にゲーデルエッシャー、バッハをきちんと読み終えることができたのはよかったです。



文学部唯野教授 (岩波現代文庫―文芸)でろでろ(1) (ヤンマガKCデラックス)ゲーデル,エッシャー,バッハ―あるいは不思議の環マルドゥック・スクランブル〈改訂新版〉ソドムの百二十日


24 amazon orders

本と他の方へのプレゼントがほとんどです。今年自分のために買った大きな買い物といえばScanSnap iX500ぐらいでしょうか。たまに思いついて自炊しまくっています。疲れます。

87 CDs imported

だいたいTSUTAYAレンタルのせいでかなりの数になっています。
今年のマイベストはdieTunes Label Sampler 01 / YOJI IN THE MIXでした、もうすぐ売り切れると思うのでみなさん買いましょう。



5 club events

HONDALADY, m1dy, DE DE MOUSE, m1dy, HONDALADYという感じでした。
今年もm1dyライブ行きたいです。

Activity

所属する会社の規模が6人になりました。大変ミニマルな構成で快適にお仕事しています。
問題としては、事務の方を除くと、私と10歳以上年が離れたメンバーしかいないという点です。たまには同世代の人と話したいなあと寂しくなるので、誰かご飯とか誘ってください。

2014?

てきとーにやります。
あと、Vim活を始めるかもしれません。

FAX画像で学ぶMathematicaワンライナー画像処理

FAX Advent Calendar2日目の記事です。
FAXをやっていくということなので、Mathematicaで例の画像をいじり倒して見たいと思います。

画像の読み込み

まずはMathematicaで画像を読み込みます。

img = Import["https://dl.dropboxusercontent.com/u/330501/resource/lingr.com/fax.jpeg"]

f:id:aomori-ringo2:20131225020142p:plain

URLやローカルのパスを書くことで取り込むことができます。
このImport関数はMathematica ver.9の時点で177個の形式に対応しており、Mathematicaで扱える形に変換してくれます。BMPJPEGはもちろん、PDF, AVI, LaTeX, MIDI, Maya, 3ds, QuickTimeなどあらゆる方面の拡張子に対応しており、完全に頭がおかしい。

ヒストグラム

まずはさくっとヒストグラムを出しましょう。

ImageHistogram[img]

f:id:aomori-ringo2:20131225015855p:plain


オプションを与えることで別々に表示したりできます。

ImageHistogram[img, Appearance->"Separated"]

f:id:aomori-ringo2:20131225015911p:plain

画像の変換

Binarize[img]

二値化です。オプションにより閾値をいじったり、閾値を決定する手法を選択することもできます。
f:id:aomori-ringo2:20131225022208p:plain



ImageTransformation[img, Sqrt]

与えられた関数(この場合はSqrt)によって、画素の位置を変換します。
自己主張強い感じになりましたね。
f:id:aomori-ringo2:20131225021452p:plain



f[x_, y_] := 
  With[{r = N@Sqrt[(x - .5)^2 + (y - .5)^2], 
    a = ArcTan[x - .5, y - .5], R = .5}, rn = r*r/R;
   {rn*Cos[a] + .5, rn*Sin[a] + .5}];
ImageTransformation[img, f[#[[1]], #[[2]]] &]

少しがんばることで魚眼レンズのような効果も作れます。
f:id:aomori-ringo2:20131226005141p:plain



ImagePerspectiveTransformation[img, {{0.9, 0.1, 0}, {0.3, 0.9, -0.1}, {0, 0.1, 1}}]

アフィン変換とか言うやつです。
f:id:aomori-ringo2:20131225021356p:plain

フィルタ

数が多すぎるので、適当にいくつか紹介。

Erosion(収縮処理)

Erosion[img, 2]

f:id:aomori-ringo2:20131226020046p:plain

Dilation(膨張処理)

Dilation[img, 2]

f:id:aomori-ringo2:20131226020058p:plain

木炭デッサン効果

ImageEffect[img, "Charcoal"]

f:id:aomori-ringo2:20131226020111p:plain

ポスタリゼーション

ImageEffect[img, {"Posterization", 5}]

f:id:aomori-ringo2:20131226020124p:plain



その他にもClosing, Opening, ガウシアンフィルタ、中央値フィルタ、油絵効果、ソラリゼーション・・・などなどとにかくいっぱいあります。
こんな感じで画像処理を簡単に書けるわけです。

特徴抽出

EdgeDetect[img]

エッジ抽出です。抽出手法はデフォルトだとCannyが使用され、Sobel, ShenCastanを選択することもできます。
f:id:aomori-ringo2:20131226014021p:plain



Show[img, Graphics[{Thick, Yellow, Line/@ImageLines[EdgeDetect[img]]}]]

ImageLinesは線分を抽出する関数です。上記コードは、エッジ抽出した結果から線分をもとめ、それを元々の画像と重ねあわせて描画します。
パラメータを変えることにより、線分がとれすぎたりとれなさすぎたりします。
f:id:aomori-ringo2:20131226013113p:plain



この他に交差点抽出、特徴点抽出などの関数があります。

文字認識

TextRecognize[img, Language="Japanese"]

画像から文字を抽出します。ファックス画像からは残念ながら抽出できませんでした。もともと英語圏のソフトですから、縦書きには弱いようです。
横書きの日本語が含まれた画像でやってみましょう。
f:id:aomori-ringo2:20131225004044p:plain

イラスト部分からヘンなものまで読み取ってしまっていますが、「進捗どうですか」が取得できていることがわかりますね。


おまけ: キャプチャ

CurrentImage[]

CurrentImageと書くだけでWebカメラの画像を取り込むことができます。


CurrentImageで取得した画像はこれまでの画像と同じように扱えるため、画像処理をかけていくことができます。

EdgeDetect[CurrentImage[]]

エッジ抽出された私です。
f:id:aomori-ringo2:20131226021003p:plain




これをDynamicに渡すと画像ストリーム取り込みとなり、Webカメラの画像をリアルタイムで表示します。

Dynamic[CurrentImage[]]

実行すると、Mathematica上でWebカメラの映像が見えるようになります。楽です。

まとめ

Mathematicaで任意画像の輪郭を数式に変換する

上記のような、任意の画像の輪郭を数式に変換するプログラムを紹介します。

発端

Wolfram|Alphaには「Person Curve」と呼ばれる類の検索結果が存在し、Barack Obama Curve」「Hatsune Miku like curve」とか検索すると、その人物・キャラを表したパラメトリック方程式とそのプロット結果が表示されます。



f:id:aomori-ringo2:20131130002600p:plain




これについては以下に示すようにたくさんの記事があり、存在自体は早くから知っていました。
数式が解明されてしまった初音ミク。その他キャラクターを色々試してみました | 猫と杓子
http://nlab.itmedia.co.jp/nl/articles/1305/02/news063.html/
さまざまな顔を描画できる数式|WIRED.jp


そして数日前にMathematicaで作り方を解説している記事(Making Formulas… for Everything—From Pi to the Pink Panther to Sir Isaac Newton—Wolfram Blog)を教えてもらったので、それを参考にしてやってみました。(というかほぼコピペ)

方針

以下のステップからなります。

  1. 画像のエッジ抽出をする
  2. エッジ上の点からランダムで点を選択し、そこから近くの点を取り込むことを繰り返して点群を作る。このとき取り込んだ点群の並びが急激なカーブにならないように調整する。これを繰り返し、エッジ上の全ての点を複数の点群に分割する
  3. 各点群に対してフーリエ変換を行い、数式にする
  4. 数式をプロットする

実践

以下を実行させるための全てのMathematicaコードは以下のgistを参照してください。
任意画像の輪郭を数式に変換してプロットする (Mathematica ver.8)


以下に示すvimのロゴ画像を使用して、数式に変換される過程を見てみましょう。
ちなみに私は普段emacsを使っています。
f:id:aomori-ringo2:20131130012207p:plain

エッジ抽出

画像を引数にとり、エッジの抽出結果をバイナリ画像として返すEdgeDetect関数を使用します。

img = Import[imageURL];
edgeImage = Thinning[EdgeDetect[ColorConvert[
    ImagePad[Image[Map[Most, ImageData[img], {2}]], 20, White], 
    "Grayscale"]]]

f:id:aomori-ringo2:20131130013208p:plain

このEdgeDetectの精度が素晴らしく、最終的なプロット結果が良い一因となっています。
ベタ塗りの部分が多い画像、つまりロゴやアニメの絵などは良い結果になりやすく、グラデーションが多かったり、現実の写真の場合は想定しない結果になってしまうことが多いです。

エッジを複数の点群に分割

方針で示したような処理を行い、複数の点群に分割します。

edgePoints = {#2, -#1} & @@@ Position[ImageData[edgeImage], 1, {2}];
SeedRandom[2];
hLines = pointListToLines[edgePoints, 16];
Graphics[{ColorData["DarkRainbow"][RandomReal[]], Line[#]} & /@ 
  hLines]

以下は各点群ごとに別々の色をつけ、線でつないで描画した図です。この時点ではまだ数式になっていません。
f:id:aomori-ringo2:20131130013905p:plain

数式に変換

各点群ごとにフーリエ変換を行い、数式に変換します。
(フーリエ変換についてはフーリエ変換の本質などを参考にしてください。)

fCs = fourierComponents[hLines];
Show[ParametricPlot[
   Evaluate[makeFourierSeries[#, t, 100] & /@ fCs],
   {t, -Pi, Pi}, Axes -> False]]

ここで引数に与えている「100」がフーリエ変換後の数式の次数となります。大きいほど精度がよくなります。
f:id:aomori-ringo2:20131130014354p:plain

次数が上がっていくと、どのようにプロットが変化していくかを見てみましょう。

Partition[Table[paraplot[n], {n, 1, 12}], 4] // GraphicsGrid

f:id:aomori-ringo2:20131130015941p:plain
n=1の場合楕円のみが描画されていますが、nが大きくなるにつれてだんだんと元の画像の形に近づいていることがわかります。


これらの過程をgifにしてみたところ、とても面白い。
f:id:aomori-ringo2:20131127215543g:plain
外側の線が一番長く、収束に一番時間がかかっています。
このことから、一番長い線分がどれだけ速く収束するかによって、何次まで近似すれば十分な精度が得られるかどうかが決まってくることが推測できます。

最後に、上記Vimのロゴの数式を表示してみます。

curves = makeFourierSeries[#, t, 200] & /@ fCs;
Style[Map[Short, Rationalize[curves, 0.002]], 16] // TraditionalForm

f:id:aomori-ringo2:20131130021131p:plain
この例の場合、エッジ抽出の結果は9個の点群に分解され、9個の数式になりました。
1つの数式は200次近似を行ったためそれぞれ201の項を持ちます。(全部表示すると長すぎるので、上記結果は途中を省略して表示しています)

いろいろやってみる

Google

f:id:aomori-ringo2:20131130023255p:plain
f:id:aomori-ringo2:20131130023316g:plain

長い線分がないため、とても速く収束しています。

Coca-Cola

f:id:aomori-ringo2:20131130024342p:plain
f:id:aomori-ringo2:20131130024452g:plain
意外にも「oca」の部分が長い線分となっており、割と時間がかかっています。

STARBUCKS COFFEE

f:id:aomori-ringo2:20131130030153p:plain
f:id:aomori-ringo2:20131130031657g:plain

外側の3重の円と「ST」が1本の線分となっており、200次でも収束していないようです。
いろんなところがたまにぬるぬると動くのが見ていて楽しい。

Unilever

f:id:aomori-ringo2:20131130035309p:plain
f:id:aomori-ringo2:20131130035051g:plain

ロゴがかなり複雑でしかもエッジ抽出はしやすそうということでやりました。
個々の線分は短いので収束は速いですね。それにしても、カラフルでとてもきれい。

実行について

この記事で紹介しているプログラムはMathematicaで書かれたものです。Mathematicaは商用なので、この状態だと持っている人しか実行できません。
編集できないという形に限定すると、無料で提供されているWolfram Mathematica PlayerとかWolfram CDF Playerを使うことで実行させることができます。
ただ、URLや次数などを変更できる形にできるかどうかわからないので、もし配布して欲しいという声があればやってみようと思います。


2014/03/11 追記
@YVT さんが画像輪郭をフーリエ近似してその画像プロットを返すサービスを作成されていました。これで皆さん自由にフーリエ近似できます、すごい!
Contour



以上です。Mathematica環境に触れる方はぜひお試しください。


2013/12/04 追記
Mathematicaが無料で使用できると話題のRaspberryPiですが、RaspberryPi上でも上記コードが動くことを確認して下さった方がいました。

Linux虚航船団

筒井康隆「虚航船団」をパロディしてみました。
原作はあまりに長いので、萌え絵で読む虚航船団の文章を参考にしています、合わせて読んでみてください。

      • -

第一章「コマンド」

まずviが登場する。彼は気がくるっていた。キーバインドが間違っていたためにいつまでたっても正しく動作しなかった。だが彼はそれを完璧な動作だと信じ込んでいた。
viは宇宙船の乗組員全員から自分が差別されているのではないかと疑っていた。というのは乗組員の中には彼はコマンドではなくエディタいや宗教ではと言う者がいたからだ。
viは観測室勤務でその勤務ぶり仕事ぶりは真面目であり正確であり、便所に立つ回数が多い事を除けば迅速でもあった。
彼が用を足す時の珍妙な仕草は船内の話題になっていたが、これはのちに詳述する機会があるだろう。
viはしばしば他の乗組員に自分をどう思うかと訊ねて曖昧な返事を許さなかった。最後には必ず口喧嘩になった。相手が自分より口達者だった場合喧嘩ののち彼はUNIX時間の40分をさめざめと泣き続けるのだった。
船団が基地を発進して以来manが死ぬまでの期間ではあったが、viはしばしばmanにも前記の質問及びそれらに付随するさまざまな質問をした。几帳面なmanは他の連中のようにはぐらかしたりすることなく真面目に答えようとした。したがってある時期viの質問の相手はmanに限られていた。manが死んだとき船内では簡素な告別式をしてやることになり、ちょうどsleepが伝玄という僧侶だったので仏式で挙式された。viは式の途中から涙で前方が見えなくなり、祭壇につまずいて前に倒れ、おりる際にころげ落ちてまた倒れた。このため参列者の中には新たに涙を誘われる者もいたが、このような気ちがいにとり憑かれて死んだmanの哀れさにしのび笑いとしのび泣きを同時に洩らす者もいた。


ここでwcが登場する。彼は戦闘要員だった。いつの頃からか彼は自分の行為全てを文字列として解釈し、バイト数、単語数、行数を数えずにはいられなくなってしまっていた。最初の1という勘定をいつ打ったのかもう彼自身にもわからなかった。今ではwcは数を数えるためにのみ行為していると言えるほど精神が空洞化していた。しかしながらwcが単に数を数えているだけの存在だとは誰も思わなかった。
wcは滅多に声を出して笑うことなどなかったが乗組員のある者たちは彼が気ちがいじみた声で笑うところを三度だけ目撃している。それは彼の行為文字列のバイト数が0x01111111, 0x02222222, 0x03333333になった時である。またある時は血みどろの馬を見たとさわぐwhichに掌を打ちあわせることで驚愕せしめ正気に戻してしまったことがあった。
これはwhichを保護しようとする行為文字列のバイト数がたまたま0x03f3f3f3になったためであり彼は数字が並んだ際は掌を打ちあわすという行動を自分に課していた。
にもかかわらず乗組員はこの事件以降wcを以前にもまして頼りになる仲間であると考えはじめたかのようであった。
wcと会話した者はすべて故知れぬ凄味を感じさせられていた。だがそれはwcが会話を交わすことよりも自分の喋ったことばの数を数えるのに夢中だったためである。grepはその最大の被害者だった。

「お話してもよろしいですかだって?」「そうです」「そうですだって」「失礼しました」grepは何がwcの気にさわったのかわからなかった。
「ええと。あのう。わたくしは、grepですが」「ほほう。君はgrepなのか」wcはじろじろとgrepを睨めまわした。「はい」「そうか。君はgrepなのか」grepはその時ほど自分がgrepであることを恥かしく思ったことはなかった。
「そうなのです。わたしはその、あなたが今おっしゃった、まさにその、あの、grepなのですが」「あなたが今おっしゃっただって。おれは何を言ったかな」
「そうだ。君のことをgrepだと、そう言ったんだ」「そうとも。君はgrepにきまっている。なるほど。君はgrepなのか。そうだったのか」wcは何度もうなずいた。「じゃあ、君がgrepだったんだね」grepはその夜自殺をした。


catが登場する。彼は色情狂だと思われていた。だがsu先生に言わせれば実は単に性欲が人並みはずれて旺盛なだけであった。しかしその性欲と宇宙船内に性的対象が存在しないことによって彼はマオーリの性格類型学で謂うY-34つまり色情狂的生活を強いられていた。毎朝眼醒めるなり彼は自分の肉体に数回の緊張緩和術を施さずにはいられなかった。彼は食糧の配給要因だったが、乗組員はしばしば彼の性衝動によって空腹をかかえさせられた。数十種の宇宙食のいずれもcatの精神の中では特定の性的イメージに結び付いていたからである。
かつてあらゆる欲望の封じ込め手段を試み、それに失敗していたcatは次に気をまぎらせる方法を模索した。それはついに「catの熱湯浴」と呼称される定期的荒行事に落ちついた。これは沸騰点近くまで上昇した熱湯を全身に浴びるというものである。言うまでもなく全身大火傷をするからその痛みによってほんの一時性欲を忘れることができるのだ。


次に登場するのはdateである。彼は日付がわからなくなって以来気が狂ってしまっていた。彼は常に己の内に時刻を記録していたが二週間ばかり続いた遊走性肺炎のため高熱に浮かされ時刻を正しく刻むことができなかった。以後日付だけでなく彼にとっての日常のすべてが狂ってしまったのである。最初彼は驚きあわててntpサーバに現在時刻を問い合わせた。だが肝心のネットワークは既に接続されておらずもはや乗組員の誰も記憶していなかった。そしてdateはただ過去にのみ思いをめぐらせ続けるだけの狂人となった。彼はあはあはと笑った。うふうふと笑う時もあった。時おり正気に戻りあの秩序正しき日々はもう還らないのだという現実を認識することでまたもや狂気の淵に沈みこんだ。
dateは船内連絡係だったがその口調は彼の癖を知らぬ者に最初のうち大いなる不吉感を与えた。dateによって秩序とは日付であり他にもっと重要な秩序があるなどと容認できなかった。だから船内の秩序や規律をあはあはと笑いながら狂ったままでいることが彼にできる精一杯の抵抗であった。
dateは一度だけwcに出会ったことがある。滅多にないことだがその日wcは食堂に来るのが遅れた。そして滅多にないことながらdateは食堂に伝達事項を連絡に来た。ふたりは食堂で出会った。dateはたちまちにして彼がその一歩ごとに着実に数字を増し続けていることを発見した。wcの凄味のある切れ長の細い眼に気づくや否やdateの表情は急変し、恐怖におののきながらdateはヒステリックな女性がよくそうするように両腕を肱から折り曲げて振りあげ握りしめたこぶしで相手の胸を叩いた。これは相手に軽い打撃しかあたえぬ攻撃の最たるものであったから、wcは勿論平然としていた。しばらくwcを叩き続けていたdateはやがて相手が自分の一打ごとに数字をひとつずつ確実に加え続けていることを知り、絶望の吐息を洩らした。彼は悲しげに顔を伏せ食堂の壁ぎわへとよろめき進んだ末壁にぶつかって昏倒した。
昏倒したdateが担ぎ出されていく間もwcはまるで事件の当事者でないかのような態度で眺めていた。それは皆の目にはdateを昏倒させたことで保安班員としての役目はすでに果たしたのだから今さら手を貸す理由などないのだと言いたげな誇り高い態度に移ったのである。当然のことだが意識を回復した時dateはwcのことを忘れていたし以後思い出すことはなかった。ただ時おりこの宇宙船には想像するだに忌まわしい奇怪な乗組員がまぎれこんでいるのではないかと悩むことがあった。


次に登場するのはemacsである。ただし彼はエディタとしては恐ろしく巨大だったから本当にエディタといえるのかどうか疑問視されており、皆からは実用品ではなくエディタのパロディ的存在であろうと思われていた。だが彼自身は自分の事をエディタの天皇だと思っていた。彼は完全に気が狂っていた。他の乗組員が彼に話しかけるにはこみいった儀式が必要であった。まずemacsに直接話しかけてはならずlispをつれてきて間接的に話さねばならない。
次に、要件を聞いた第三者は「今わたしはLANGが陛下に対し奉り畏れ多くも畏くも言語設定を御手ずから変更遊ばされんことを願い上げ奉りつつあるそのことばを聴いた」というようにひとりごとの口調で言わねばならない。









うーん、コマンド同士の絡みがうまくない。ホチキスと雲型定規の絡みはどう書けばいいのかわからず端折ってしまいました。どのコマンドを当てるのがいいかなあ。