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が陛下に対し奉り畏れ多くも畏くも言語設定を御手ずから変更遊ばされんことを願い上げ奉りつつあるそのことばを聴いた」というようにひとりごとの口調で言わねばならない。
うーん、コマンド同士の絡みがうまくない。ホチキスと雲型定規の絡みはどう書けばいいのかわからず端折ってしまいました。どのコマンドを当てるのがいいかなあ。
2013年第1四半期を振り返る
勉強会編
1/10 - 1/12 | 第54回プログラミングシンポジウム | link |
1/19 | 第5回チューニンガソン | link |
1/20 | 第7回スタートHaskell2 | link |
1/25 | 第1回分散システム本読書会 | link |
1/26 | TypeScript勉強会 | link |
2/3 | 第1回PFAD読書会 | link |
3/1 | 第2回分散システム本読書会 | link |
3/2 | 第2回PFAD読書会 | link |
3/30 | Aizu.LT kanagawaWithIndex:1 | link |
めっちゃ行きました。
行くには行きましたが、参加で満足してブログなりコードなりでアウトプットできていないのが課題です。
軽く概要だけ触れておきますね。
- 第54回プログラミングシンポジウム
会社で作ってるソフトを発表しに行きました。発表したのは僕の上司で、僕は遊びに行っただけ感ありますが。
いろいろ有名な人にお会い出来ました。あとコンタクトレンズの溶液を持参するのを忘れて、女帝にお世話になりました。
- 第5回チューニンガソン
コードには一切手を触れることが許されない、プログラマ生殺しのチューニングハッカソンイベント。あらぶる沖縄勢。
【レポート】いろいろチューニングしてパフォーマンスを競うバトルイベント!「Tuningathon」第5弾! #tuningathon : ゼロスタートの広報ブログ
- 第7回スタートHaskell2
スタートHaskell2最終回。
オレはようやくのぼりはじめたばかりだからな このはてしなく遠いHaskell坂をよ… [未完]
- TypeScript勉強会
わかめさんを見に行きました。
- PFAD読書会
スタートHaskell2卒業生に降りかかった試練。「PFDSに比べれば余裕だろう」という当初の声に反して、超硬派すぎる内容。
第2回は音読を担当しました。
- 分散システム本読書会
弊社でやってるタネンバウム本輪読会。
参加してくださっている方の動機はほとんど「昔買って挫折した」というもの。700ページ超だからね・・・
分散システム本読書会
- Aizu.LT
大学のお知り合い同士でLT。今会社で作ってる製品を紹介してみました。
小説編
3ヶ月で6冊というと大したことないのですが、分厚い本も含まれていたので僕としては結構読んだという印象です。
2冊ほど紹介します。
- 作者: マルキドサド,Donatien‐Alphonse‐Francois de Sade,佐藤晴夫
- 出版社/メーカー: 青土社
- 発売日: 2002/07
- メディア: 単行本
- 購入: 1人 クリック: 11回
- この商品を含むブログ (11件) を見る
男色、小児愛、老人愛、近親相姦、獣姦、屍体愛、スカトロジー、嗜虐、フェティシスムと、強靱な構想力によって、人間の深層にひそむ性の異常を描きつくしたサド文学の代表作。ロマン主義の先駆、フロイト及びシュルレアリスムの祖として位置づけられるサドの形而上学の原点となった大作の完全翻訳。
ルイ14世治世の終わり頃、「殺人と汚職により莫大な財産を有する」45歳から60歳の4人の精神異常者であるブランジ公爵、公爵の兄弟である司教、キュルヴァルの法院長、財務官デュルセが真冬にシュヴァルツヴァルトの古城シリング城に集まり、彼ら4人の絶対権力の下に置かれた42人の犠牲者、4人の遣り手婆、8人の絶倫男と共に閉じ籠る。犠牲者は4人の妻(それぞれがそれぞれの娘と婚姻している)と、両親の下から誘拐された若い少年少女たちである。4人の遣り手婆=「語り女」たちが、1ヶ月交代で1人150話ずつ計600の倒錯した物語を語り、主人たちはしばしばその場でそれを実行に移す。作品は日誌の形で構成され、4ヶ月と「単純(性交を伴わない)」「複合」「犯罪」「殺人」の4種の情熱に対応した4部からなる(第1部は完成されているが、残りは素案のみと思われる)。犠牲者はありとあらゆる性的虐待と恐ろしい拷問の末に大半が殺される。
http://ja.wikipedia.org/wiki/ソドム百二十日あるいは淫蕩学校
「サディスト」の語源であるマルキ・ド・サドの作。
上記あらすじにあるように、金持ちのキチガイ4人が120日間城に閉じこもり、快楽のために好き勝手やる、という話です。30日ごとに4部に分けられているのですが、1部以外は素案のみが残されています。つまりはかなりの部分が未完なのですが、それでもこの本450ページもあって相当ヘビーでして、正直未完でよかったわーと思いました。
グロ描写自体は平山夢明作品で慣れていたので割と大丈夫でしたが、現代でもヤバイのに、サドがこの本を書いたのは1785年です。
- 作者: 筒井康隆
- 出版社/メーカー: 新潮社
- 発売日: 1992/08/28
- メディア: 文庫
- 購入: 9人 クリック: 851回
- この商品を含むブログ (81件) を見る
鼬族の惑星クォールの刑紀999年6月3日、国籍不明の2基の核弾頭ミサイルによって国際都市ククモが攻撃され、翌4日、無数の小型単座戦闘艇に乗ったオオカマキリを従えた文房具の殺戮部隊が天空から飛来した。それはジャコウネコのスリカタ姉妹の大予言どおりの出来事だった―。宇宙と歴史のすべてを呑み込んだ超虚構の黙示録的世界。鬼才が放つ世紀末への戦慄のメッセージ。
あらすじを見てもわけがわかりませんね。完全に狂っています。
Mathematica基礎文法最速マスター
Aizu Advent Calendar13日目の記事です。
さて、13期生というロートルがいったい何を書けばいいのかと思い悩んでいたのですが、TwitterのTLにたまにこんな文章が流れてきます。
「会津大学の学部カリキュラムには関数型言語の授業がない」。今でもそうかどうかははっきりとは知りませんが、少なくとも僕の頃にはそのように言われていました。
しかしそこで僕は上の文章にNoを突きつけたい。
会津大学生は1年前期に関数型言語に触れているのですよ?
そう、僕達にはMathematicaがあるじゃないか!
しかし触れる期間はごくわずかで資料も至極残念と言わざるをえないものなので、99.99%の1年生は「わけのわからないもの」として記憶から即消し去ってしまいます。
この記事では会津大生へのMathematica啓蒙を目的として、基礎文法を書いてみたいと思います。*1
基礎
Mathematicaの実行形式にはノートブック、スクリプト実行があります。
ノートブック形式は対話式インタプリタをやりとりごと保存する、というものです。
以下ではノートブック形式での実行に絞って解説します。
式の実行
> 2 + 3 5
式を入力する部分を「セル」といい、複数行のコードを記述することができます。
Enterで改行、Shift+Enterでセルを評価します。
評価後も、カーソルをセルに合わせてShift+Enterを押すと何度でも評価させることができます。
計算結果の表示/非表示
> x = 3*2; > y = x+3 > z = x+y; 9
文末にセミコロンをつけることで評価した結果を非表示にできます。
コメントアウト
> (* comment *) > (* > これも > コメント > *)
残念ながら1行コメントはありません。
基本演算
> 4*3 12 > 5-10 -5 > 9 * 0.3 2.7 > 10 / 4 5 - 2 > 2 + 3I 2+3i
除算した場合、分数になります。
未定義変数を含んだ計算
>Expand[(x+y)(x-y)] x^2-y^2 >x = 3 3 >Expand[(x+y)(x-y)] 9-y^2
未評価の変数を含んだ計算をすることができます。
ノートブック上では、未評価の変数は青色、何らかの値が束縛されている変数は黒色で表示されます。
リスト
>{1,2} + {3,4} {4,6} >Norm[{3,4}] 5 >Transpose[{{a,b},{c,d}}] {{a,c},{b,d}}
複数個の値はリストで表現する事ができます。
ネストさせることで行列、テンソルの表現も可能です。
関数
> zz /@ {1, {1}, {1,2}} (* Map *) {zz[1], zz[{1}], zz[{1,2}]} > zz @@ {1, {1}, {1,2}} (* Apply *) zz[1, {1}, {1,2}] > zz @@@ {1, {1}, {1,2}} (* Apply *) {1, zz[1], zz[1,2]} > Fold[zz, 0, {1, {1}, {1,2}}] zz[zz[zz[0,1], {1}], {1,2}] > Nest[zz, {1, {1}, {1,2}}]]] zz[zz[zz[{1, {1}, {1,2}}]]]
MathematicaはLispに大きく影響を受けている言語です。関数型プログラミングではおなじみの関数群が用意されています。
上記例ではzzが未定義ですが、関数を定義することで実際に適用させることができます。
> zz[x_]:=x+100 > zz /@ {1, {1}, {1,2}} {101, {101}, {101, 102}}
パターンマッチ
前項でzz[x_]を定義しましたが、以下の例では関数が展開されていません。
> zz @@ {1, {1}, {1,2}} zz[1, {1}, {1,2}]
これは、上記の場合3引数関数となっており、zzに3つの引数をとる関数が定義されていないためです。
> zz[x_, y_, z_]:= {100*x, 10*y, z} > zz @@ {1, {1}, {1,2}} {100, 10, {1,2}} > zz[1, y_, z_]:= 0 > zz @@ {1, {1}, {1,2}} 0
引数の数だけでなく、パターンマッチさせることもできます。
アニメーション
基礎文法でアニメーションとかほんと気持ち悪いですね。でもワンライナーですし。
> Manipulate[Plot[y^3 + (x - y)^2 + x == 0, {x, -3, 3}], {y, -3, 3}]
上部に表示されるスライドバーをマウスで操作することで、グラフが動く様子を見ることができます。
Q&A
- 会津大生なのですが、大学の環境(Solaris)で"mathematica &"を実行すると未だにMathematica 5.2が出てきて困っています。
現在はどうかわかりませんが、後ろにバージョン番号をつけると幸せになれるかもしれません。"mathematica6 &"とか"mathematica8 &"とか。
2012年12月現在の最新版はver.9ですが、まだ入ってないと思います。
- 書籍はありますか?
ver.6が最新版だったころは日本国内にver.6に対応した書籍は恐らく存在せず地獄のような状態でしたが、今はだいぶましになりました。
下に行くほど難しくなります。プログラミング言語を触ったことがある人なら、入門Mathematicaあたりがおすすめです。
- 作者: 榊原進
- 出版社/メーカー: 共立出版
- 発売日: 2010/03/24
- メディア: 単行本
- クリック: 27回
- この商品を含むブログ (4件) を見る
- 作者: 日本Mathematicaユーザー会編著
- 出版社/メーカー: 東京電機大学出版局
- 発売日: 2009/06/20
- メディア: 単行本
- 購入: 1人 クリック: 17回
- この商品を含むブログ (6件) を見る
- 作者: Sal Mangano,松田裕幸
- 出版社/メーカー: オライリージャパン
- 発売日: 2011/04/25
- メディア: 大型本
- 購入: 1人 クリック: 19回
- この商品を含むブログ (7件) を見る
- Wolfram Alphaでも使えますか?
「使えることがある」というぐらいです。Wolfram Alphaはパーサが狂っているので、シンタックスシュガーがあると正しく読み取ってくれなかったりします。
でも頑張ればFizzBuzzぐらいならいけます。
まとめ
1日で殴り書いたので、ボリュームが全然不足してますね。気が向いたら加筆します。
その他にもMathematicaは異常なまでの関数が用意されていますし、GUIコンポーネントもなぜか豊富です。
PS3のコントローラ挿して3Dモデルを回転させたりとかできますよ。しかもその辺の情報がMathematicaのヘルプから見れるので結構楽しいと思うので、ぜひお試しあれ。
Aizu Advent Calendarは14日目、@tyageさんに続きます。
*1:「基礎文法最速マスター」というフォーマットが現れてから2年も経つのにMathematicaについての当該記事がないあたり、Mathematicaの荒地具合がご推察いただけると思う
Fabricで多段ssh
Fabricで多段sshした上でコマンド実行させることができたので、書いておきます。
やり方は.ssh/configに書かれたProxyCommand設定を読み込む方法とFabricのenvをいじる方法の2つがあります。
ここではFabricのenvをいじる方法について解説します。
環境
+---------------+ |192.168.200.99 | +---------------+ ↓ +---------------+ |192.168.200.100| +---------------+ ↓ +---------------+ |192.168.200.101| +---------------+ ↓ +---------------+ |192.168.200.102| +---------------+
- 192.168.200.99
プログラムを動かすところ。
- 192.168.200.100
踏み台役。アクセス制限や鍵などの設定は何もしていない。
- 192.168.200.101
TCP Wrapperで、sshでの接続は192.168.200.100からのみに制限している。
- 192.168.200.102
コード
# fabric_test.py from fabric.api import run, env from fabric.state import connections, output from fabric.network import denormalize from fabric.exceptions import NetworkError via = [('user1@192.168.200.100:22', 'password1'), ('user2@192.168.200.101:22'. 'password2'), ('user3@192.168.200.102:22', 'password3')] try: for host, passwd in via: env.gateway = env.host_string env.host_string = host env.password = passwd run('', quiet=True) run('hostname') except NetworkError as e: print(e) finally: for key in connections.keys(): if output.status: print("Disconnection from %s" $ denormalize(key)) connections[key].close()
実行結果
% python fabric_test.py [user3@192.168.200.102] run: hostname [user3@192.168.200.102] out: server3 [user3@192.168.200.102] out: Disconnection from user3@192.168.200.102... Disconnection from user2@192.168.200.101... Disconnection from user1@192.168.200.100...
鍵情報が必要な場合は、env.key_filenameにファイルパスを渡してあげるといいです。
(ただし、ファイルパスは当然プログラムが動いている環境のパスになります。)
基本的にはtryの部分の処理のみでOKなのですが、プログラムが終了するときにconnectionをcloseしてあげないと、以下の様なエラーが飛んできます。
Exception in thread Thread-2 (most likely raised during interpreter shutdown): Traceback (most recent call last): File "/usr/lib64/python2.6/threading.py", line 532, in __bootstrap_inner File "/usr/lib/python2.6/site-packages/paramiko/transport.py", line 1613, in run <type 'exceptions.AttributeError'>: 'NoneType' object has no attribute 'error' Exception in thread Thread-3 (most likely raised during interpreter shutdown): Traceback (most recent call last): File "/usr/lib64/python2.6/threading.py", line 532, in __bootstrap_inner File "/usr/lib/python2.6/site-packages/paramiko/transport.py", line 1613, in run <type 'exceptions.AttributeError'>: 'NoneType' object has no attribute 'error'
初めはFabric1.4.3の状態で「うーん、できない・・・」と悩んでいたのですが、Fabric1.5でenv.gatewayと.ssh/configのProxyCommandを読み込む機能が追加されたのを知り、上記のような感じになりました。
参考
Gateway solutions in Paramiko & Fabric - bitprophet.org
多段 ssh / rsync するために ProxyCommand を使ってみる (2) - daily dayflower
Intermittent "'NoneType' object has no attribute 'error'" · Issue #513 · fabric/fabric · GitHub
Exception in thread · Issue #17 · paramiko/paramiko · GitHub
Disconnecting from host with Python Fabric when using the API - Stack Overflow
-
-
- -
-
追記(2014/10/07)
上記コードではFabricの現行のバージョンで動きませんので、修正しました。
Fabricの1.6.4/1.7.5/1.8.5/1.9.1/1.10.0で動作確認済みです。
1.5.5では動きませんでした。
# fabric_test.py from fabric.api import run, env from fabric.state import connections, output from fabric.network import denormalize from fabric.exceptions import NetworkError via = [('user1@192.168.200.100:22', 'password1'), ('user2@192.168.200.101:22'. 'password2'), ('user3@192.168.200.102:22', 'password3')] try: for host, passwd in via: env.gateway = env.host_string env.host_string = host env.password = passwd env.passwords[host] = passwd connections.connect(host) run('hostname') except NetworkError as e: print(e) finally: for key in connections.keys(): if output.status: print("Disconnection from %s" % denormalize(key)) connections[key].close()
2012年夏のプログラミング・シンポジウムに参加してきました
会場の様子
参加人数約160人と大変盛況でした。会場の後ろにはオーム社,オライリー・ジャパン,翔泳社という、このようなイベントに来る人がいかにも好きそうな出版社が書籍販売をしていました。(私も大好きです。)
オライリーさんは消費税なし、10%off、5000円以上購入でオライリーTシャツプレゼントというキャンペーンを行なっていました。私はTシャツが欲しかったので2冊何か買おうとしたら、定価だと2冊で5500円なのに1割引きのせいで4950円になってしまう、など非道とも言える組み合わせが存在し、みなさん苦悩していました。オライリーの人はニヤニヤしてました。
悩んだ結果、私は「Real World Haskell」と「リーダブルコード」を購入。Tシャツをバッチリいただきました。
プログラミング美学(仮)/ 竹内郁雄(早稲田大学)
(WIP)
Beautiful Error Handling / 田中英行(株式会社プリファードインフラストラクチャー)
Beautiful Programming Language and Beautiful Testing / 山本和彦(IIJ-II)
Haskellerはあまりテストを書かないけど、Haskellにも当然テストは必要だから、テストを書かせるようにしよう、という話。
Haskeller向けではない人向けと書いてはいましたが、最終的にはHaskellのコードでの説明になってしまったのは致し方無いですかね・・・
午前中のここまでの3つの発表で登場した言語がLisp, Haskell, Haskellと、関数型言語を触ったことがない参加者には随分と酷な並びだったような。
ビューティフルコードのためのN個の指針 / 久野靖(筑波大)
オライリーの「Beautiful Code」の訳者である久野先生による、コードの綺麗さに対するお話。(WIP)
Ruby を用いた超絶技巧プログラミング / 遠藤侑介
この日で一番盛り上がった発表。
「アスキーコードのように見える自己複製プログラム」「小文字アルファベットと空白のみでHello world」など、トンデモプログラム満載の発表。デモをする度に会場は笑いと拍手が巻き起こっていました。
「実用性なんかなくてもプログラミングは楽しい」という導入部の主張がとても素晴らしいと思いました。
ビスケットにおけるプログラムの美しさについて / 原田康徳(NTT)
(WIP)
キュート・アルゴリズム / 稲葉一浩
Redcoderである@kinabaさんによる、アルゴリズムのお話。
- 『最悪』のソートアルゴリズムは何か
- 非破壊型のQueueを実装する
- 正確な実数を計算する
私も一時期Topcoderにはまっていたのでとても楽しめました。競技プログラミング経験がある人はスライドをご覧になってみると良いと思います。
セルオートマトンのプログラムハック / 和田英一(IIJ-II)
個人的には今日一番難しかった発表。和田先生が今までに出会ってきたびっくりするようなプログラムの数々の中から、セルオートマトンに焦点をしぼっていくつか紹介されていました。
スライドを見てもよくわからないかも知れませんが、やりたいことをとにかく最速(or最小)で行うために限界まで意味をばらしてコードに再構築をしているものが多く、プログラマは数学ができた方が格段に強いな、と感じました。
このようなお話はクヌース先生のTAOCPやHacker's Delightに数多くあるようなので、ご興味がある方は読んでみるといいでしょう。
発表の最後で和田先生はこのように語っていました。
RT @aomoriringo: 「プログラムが複雑に見えるときは必ず改良できる」「良いプログラムが書ける人は作文もうまい」「文を書くときもおろそかにしないこと」 #spro12
— Yuichiro SAITOさん (@koemu) 8月 25, 2012
肝に命じたいですね。
まとめ
私は常々、今後数十年、ずっとプログラミングやソフトウェア開発に従事してご飯を食べていくことができるだろうか・・・と不安を抱きつつ勉強をしています。今回は最先端で活躍している方の発表を聞いて、全く意味がわからなくてお手上げになるということもなく、どの発表も楽しめたので、少し安心しました。
和田先生によると、プログラミングシンポジウムの夏は来年も今回のように日帰り・参加費無料で行うつもり、とのこと。来年もぜひ参加したいですね。
第3回 スタートHaskell2に参加してきました
今回はがんばったぞ!
- 作者: Miran Lipovača,田中英行,村主崇行
- 出版社/メーカー: オーム社
- 発売日: 2012/05/23
- メディア: 単行本(ソフトカバー)
- 購入: 13人 クリック: 490回
- この商品を含むブログ (28件) を見る
すごいH本、
- 第6章 モジュール
- 第7章 型や型クラスを自分で作ろう
をやりました。
第6章 モジュール(@aomoriringo)
わたし ^o^ です
6章は「モジュール」と銘打っておきながら、大半が標準モジュールの解説に当てられているので、ストーリーがつけにくくて苦労しました。
モジュールのインポート、エクスポートについては書いてあることをwebでいろいろ調べていくうちにいろんなことにぶちあたって、これまた発表にどこまで含めるか決めるのに苦労しました。
結果的に本には書いてない部分についてもちょっと話したのですが、そしたら@kazu_yamamotoさんあたりからためになる話も聞けたし、よかったんじゃないかと思います。
標準モジュールのあたりは随分ぐだぐだしてしまったと反省しているのですが、終わったあとに@seizans先生に慰めてもらったのでよいことにします。
発表の内容はスライドを見てもらうとして、その後の質疑応答では以下の様な話題がありました。
- import Map (Map), import qualified Map hiding (Map) as Mのように、同じモジュールを複数個にわけてimportすることができる。
- import Foo ()みたいな書き方をした場合、インスタンス宣言だけがimportされる。
- Hoogleは標準モジュールだけしか見れないが、Hayoo!だと標準モジュール以外も検索できる。(Hoogleにもドキュメントを追加できるけど、超絶めんどくさいらしい)
- HaskellのCharは4バイトで、実はとてもリッチなデータ構造らしい。
- foldl'はスライド中では「foldlと違ってスタックオーバーフローしない」と書いたが、foldl'の第1引数の関数が遅延評価するときは、スタックオーバーフローになることがある。
- module構文でエクスポートする関数は明記したほうが良い(推奨されている)。書くとGHCが書かない時よりも最適化をがんばってくれる。
- Mainモジュールのみモジュール宣言の名前はファイル名と一致しなくてもよい。(Mainを複数個作って使い分けたりできる)
- モジュール名を省略した場合はMainモジュールと見なされる。
- import文が多いコードは分割してimport文を減らした方が良さげ。
第7章 型や型クラスを自分で作ろう(@a_hisameさん)
正直7章は自分の発表が終わったのでとにかく安心しきって、話半分に聞いていました(ごめんなさい!)。
この部分については事前に読んできていたので、確認に近かったです。それにしても7章はとてもボリュームがあって@a_hisameさんすごいなーと思っていました。
6章は7章に比べてボリューム少なめだから、30~40分で切り上げて7章で時間を使ってもらいたいな・・・と思っていたのに、思い切り1時間使ってしまいました(´・ω:;.:...
LT | 再帰の俯瞰図(@kazu_yamamotoさん)
http://mew.org/~kazu/material/2012-recursion.pdf
すごいH本だと4章が再帰の話なのですが、あれではちょっと不十分だろうということで、末尾再帰や末尾再帰で書けないパターンの再帰などについての話でした。
このあとの演習問題では再帰をひたすら実装する課題があったのですが、再帰自体は書けるけど末尾再帰で書こうとするととても難しくて大変でした・・・もっと精進しなければいけません。
感想
プレゼン作成作業が思ったより難航してしまって、前日は朝6時までモンスターエナジーを飲みつつ作っていました。(あとで@a_hisameさんと話したらとても似た状態だったらしい)
自身の発表内容は反省点の多いものでしたが、本を1章ずつ担当するというスタイルの勉強会の発表者として、最低限の仕事はできたかなと思っています。いろいろ勉強になったし、やってよかった。
発表者のみなさま、主催者、運営者のみなさま、俺、お疲れ様でした。次回もぜひ参加したいと思います。
第2回 スタートHaskell2に参加してきました
最近趣味で触っていたHaskell、気になっていた勉強会についに今回はじめて参加することができました。
- 作者: Miran Lipovača,田中英行,村主崇行
- 出版社/メーカー: オーム社
- 発売日: 2012/05/23
- メディア: 単行本(ソフトカバー)
- 購入: 13人 クリック: 490回
- この商品を含むブログ (28件) を見る
いわゆる「すごいH本」を教科書にしています。
今回は
- 第3章 関数の構文
- 第4章 Hello 再帰!
- 第5章 高階関数
をやりました。
第3章 関数の構文(@mizu__tamaさん)
- パターンマッチ
- ガード
- where
- let式
- case式
それぞれについては「すごいH本」を読めばわかることなので略します。(めんどい)
その他、以下の様な話題がありました。
上記にあげたものは全部case式の糖衣構文
whereとletの使いどころ
「let よりも whereを(できるだけ)使え.caseは使うな」.なるほど #start_haskell
— nishioさん (@nishio_dens) 7月 22, 2012
where vs let に関しては、これを参考にして下さい。 is.gd/x6oniR #start_haskell
— 山本和彦さん (@kazu_yamamoto) 7月 22, 2012
letとlet inの違い
「すごいH本」の第3章の中では、
4 * (let a = 9 in a + 1) + 2
のように基本的にはletはinセットで使用しているのですが、リスト内包表記とあわせて使用する場合は
calcBmis xs = [bmi | (w, h) <- xs, let bmi = w / h ^ 2]
のようにin句がない。
また、ghcで
let hoge = 100
のように書くと、以降ghci中でhogeを使用することができるようになります。
これについては@kazu_yamamotoさんが解説してくれていました。モナドがどうとか言っていた気がするのですが、きちんと理解はできなかったので既に脳内から雲散霧消してしまいました。
- リスト内包表記では、リスト内包という表記の中で宣言するとスコープがその部分のみなのでwhereのようにリスト内包内部でのみ使用可能な変数みたいにして使える
- ghc中でletを宣言すると、ghc全体のスコープに対して置かれるのでどこでも使えるようになる。(グローバル的な?)
というのが私の現時点での理解です。
第4章 Hello 再帰!(@ko1kunさん)
いろんな本からの参照があったのが印象的でした。(読んでみたい、と思った本もちらほら。)
内容としては再帰を使った初歩的な関数を書いてみよう、というものでした。このへんはプログラミングHaskellでもやっていたので大丈夫かな。
途中フィボナッチ関数の計算速度に関する話題がいろいろと出てきたのですが、Haskellとは関係のない、アルゴリズムの話だったように思います。
普通の速度のフィボナッチ数列: is.gd/f98mUf #start_haskell
— 山本和彦さん (@kazu_yamamoto) 7月 22, 2012
素朴な fib が何故効率が悪いかの図: is.gd/ZiXFu7 #start_haskell
— 山本和彦さん (@kazu_yamamoto) 7月 22, 2012
第5章 高階関数(@S1E11さん)
今日のヤマだったと思います。
- カリー化
- map, filter
- ラムダ式
- foldl, foldr
- $を使った関数適用
- 関数合成
foldl, foldrと無限リストが絡むあたりが難しく、つまりました。これは次回までに自分で悩んでおきたいところですね。
foldl, foldl', foldrの使い分け
foldlとfoldrの選択:二項演算が対象律を満たさないとき→選択子がそもそもない、満たすとき→二項演算の左辺引数に対するコストが大きい or 無限リストを扱いたい→foldr、二項演算が引数に対して正格 -> foldl' それ以外→foldl #start_haskell
— Hideyuki Tanakaさん (@tanakh) 7月 22, 2012
関数合成をする際の.(ドット)、$について
関数合成は一番右だけ $ にして、残りは .にすれば大体うまくいく。#start_haskell
— Connieさん (@Slash_01) 7月 22, 2012
その他にもTLでは正格とか末尾再帰の話題がありましたが、かなりわかっていないので今は見なかったことにしておきましょう。
LT | 文芸的プログラミング(@shokosさん)
hsファイルはコードが基本で、コメント部分は--や{- -}で指定するのですが、それが逆になり、基本がコメントで、コードについては明示的に指定するlhsについてのお話。
Birdモード, LaTeXモードの2つがあるようです。
参考: Executing Haskell program
文芸的プログラミング (ASCII SOFTWARE SCIENCE Programming Paradigm)
- 作者: ドナルド・E.クヌース,Donald E. Knuth,有沢誠
- 出版社/メーカー: ASCII
- 発売日: 1994/03
- メディア: 単行本
- 購入: 1人 クリック: 31回
- この商品を含むブログ (23件) を見る
LT | idのナゾ、constのヒミツ(@kazu_yamamotoさん)
haskellのid, constはどこで使うの?という話題がいつの間にかSKIコンビネータとかどんどんdeepな話に・・・
コンビネータについてやけに興奮した調子で話す@kazu_yamamotoさんが面白かったです。
数学パズル ものまね鳥をまねる POD版 ―愉快なパズルと結合子論理の夢の鳥物語
- 作者: レイモンドスマリヤン,阿部剛久,黒沢俊雄,福島修身,山口裕
- 出版社/メーカー: 森北出版
- 発売日: 2010/04/05
- メディア: 単行本
- 購入: 2人 クリック: 23回
- この商品を含むブログ (1件) を見る
感想
100人超で5時間超え、という規模の勉強会は初めてでしたが、発表だけでなくTwitterでのやりとりも楽しく、集中力を途切れさせずに最後まで楽しく参加できました。
発表者のみなさま、主催者、運営者のみなさま、お疲れ様でした。次回もぜひ参加したいと思います。