日記を読み返したりその他状況証拠から、今年の自分を振り返るのコーナー。 今年やったこと行ったとこ等と、今年読んだり聞いたりして好きになった 本/音楽などなどを適当に並べていきます。 後者は私が今年読んだ/聴いた作品から選んでいるので、必ずしも、 この一年の間に発表されたものとは限りません。
1月。
やったこと:修論 (MTran) 書いてたはず。XMLが木構造が正規表現がオートマトンがどうとかいう話。実装が
やっつけ仕事にもほどがあるのでなんとかしなきゃなあと思いつつはや1年。
マンガ:『いわせてみてえもんだ』の続きが気になってしかたなくなりました。夏頃から
ヤングガンガンで連載が始まって、今ちょうどもうすぐWeb版に話が追いつきそうな
ところなので続きが気になってしかたないです。
2月。
本:『考える脳 考えるコンピューター』 "予測" こそが "知能" である、という。
今年はぼーっとしてる時についこの命題について考えてることが多かったくらいには、
自分に影響があったかもしれません。
3月。
本:『豊饒の海』
を唐突に読んでみた。"輪廻"という非日常を使って、四度同じ姿で生まれ変わる魂によって
その長い年月を生き続けていく人間を映し出す、という話と理解したのだけれど。
三島由紀夫のこの研ぎ澄まされた無駄の無さというか、そういうのは本当凄いなあ。
4月。
やったこと:
Guy Steele Jr.
とお話したよ!というのがとにかくこの月の記憶です。今年は(今年も)いろんな方の
おかげでいろんな方と会って話すことができて、本当に感謝しています。
音楽:
『Toy Soldiers』。
なんでこれまでこの曲知らなかったんだろう?
5月。
やったこと:
Curry-Howard Isomorphism について書いた記事が
d.y.d.歴代被はてブ数最高を記録したのでした。一番気合いを入れて書いた記事でも
あるので、まあその。自分自身では、同じ月の文字コード判定の話とか
先日の>|ada|みたいな、思いついたこと投げっぱなしエントリの方が好きだったりもする。
投げっぱなさないで実装してみろよ俺、とは思う。反省。
★音楽:
『I believe ~海の底から~』 ほか。KOKIA にハマりまくった一年でした。
6月。
マンガ:
『東京トイボックス』
"大手町と秋葉原がこんなに近いなんて 知りませんでした"
,
"…お茶の水だって上野だって 歩いて行けらァ"
ていうお話。
本屋で1巻を立ち読みしてこれ面白ぇ!! と思った次の日に、諸処の事情で2巻で
完結しちゃってると聞いて愕然としたりしました。クライマックスの、台詞なしで
ゲーム画面とコントローラを交互に写して見せるシーンとかメチャ格好いい。
本:『狼と香辛料 II』
7月。
★映画:『時をかける少女』。
改めてどこが面白いのか、と問われると、…雰囲気が、という答えしか思いつかないのだけれど。
なんだろう。うーん。
8月。
やったこと:
これ。
本:
『ダーク・タワー』 シリーズ。
積んでた新潮版を夏休みに消化してました。S. King の作品は、自分がヒーローになる
系の無敵の夢のパワーをもった状態で、なんか物凄い化け物に追いかけられるんだけど
足に力が入らなくて逃げられない的悪夢の世界に放り込まれる、みたいな、何夢だか
わからない勢いが魅力だと思っています。このシリーズの、特に中盤は
その魅力が結晶していると思う。来年頭の最終巻待ちでワクワクしている今です。
9月。
やったこと:
前々月にあったProgramming Contestの表彰などで
ICFP に行ってきました。Portland 市が街中挙げてのウォーキングイベント中で、
たいへん楽しそうでした(ICFP関係ない。
10月。
やったこと:ひたすらCodeGolfでした!
11月。
本:
『ラギッド・ガール』所収の短編
『魔述師』。"情報的似姿"というテーマの掘り下げかたに唸らされました。
映画:
『DEATH NOTE』
前編の最後のポテチも、最後の最後の決着もとても巧いと思う。
12月。
やったこと:
Python Workshop
でライトニングトーク。しっかし発表はもっと巧くなりたいなあ。
★本:
『夜は短し歩けよ乙女』。
音楽:
『Where Is My Heaven?』
Jun Elding。少年の丘という大好きな曲があるのですが、歌ってる人がまだ活動されてるというのを
先日知りまして。早速CD取り寄せたところ。
来年はもっと"やったこと"増やしたいなあ、と、これも毎年言ってるなあ。 では皆様よいお年を。
『パプリカ』 を見てきました。なんか今年は筒井イヤーですね。
映画館まで行く電車に乗る直前に、何の気なしの時間つぶしのつもりで買って読んだ 『二〇〇二年のスロウ・ボート』 が(全然違う意味ではあるのだけれど)"夢"を解く話で始まり、映画を見て没入して帰る 帰りに読んだ後半部が"夢"の終わりを告げて去っていったので、なんとも不思議な気分に 浸りながらこの日記を書いています。こういう感覚は本当に楽しい。
テーマ曲の『白虎野の娘』(無料配信中!)が素晴らしくて、さっきからずっと繰り返し 聞いています。この歌がもう一つの原作と言ってもいいのではないかというくらい、 映画とぴったり合ってますね。
やっぱり鳥の詩はいいですなー。
それはさておき。先週から、はてなダイアリーのシンタックス・ハイライト実装を受けて、よく巡っている日記が 次々カラフルなソースで色づいてます。これは見てるだけで楽しい。 電飾が街を飾ってるのを見るのもわりと好きなのですが、そんな雰囲気があるかも。
あと、こういう機能があることで、ソースを日記に書くときに自然と言語名という
メタ情報が添えられることになるのが面白いな、と思いました。
「Ada(という単語)を含む日記」 じゃなくて 「Ada(で書かれたソースコード)を含む日記」
を一覧したいという需要は多寡はともかくあるはず。はてなの開発の人がやる気になれば、
それが 「 >|ada|
を含む日記」 的な処理だけで実現できる環境が
勝手に整うというのは、面白い。
STLのソース眺めていたところ、 std::inplace_merge は最悪 O(N logN) だから、これでマージソートするのでは O(N logN logN) しか達成できないよ!という結論に達しました。というわけで、 std::sort() が、余分な作業用メモリを使わずに O(N logN) でソートするには、 現実的には RandomAccess を要求するしかないんじゃないかと思います。 つつしんでSTLの中の人にお詫び申し上げます。 O(N logN) のinplaceマージソート は Bidirectional では難しいような操作が含まれているのかな。
それで次の疑問は std::stable_sort() が何故 RandomAccess を要求するかなのですが。
あ、VC付属のSTLは stable_sort(BidIt, BidIt)
になってる。
b2con の次の日は 言語雑談会2006 でした。
話してた中身はリンク先のshinhさんのメモにあるとおりで、えーと 感想としては、楽しすぎて困りましたみたいな感じです。 特に最近 C++ を真剣に追ってなかったので、 C++09 に提案されてる Concept についてid:Cryoliteさんに 教えていただいたり Move Semantics について語っていただいたりして、今夢が広がりまくって ます。正直コンセプトって、エラーがわかりやすくなってenable_ifが楽に書ける程度かと 思って流してました…ううむこれは不覚。
型をConceptに属させるための concept_map
というやつが、
型クラスの、影響範囲をレキシカルに切れるようにしたバージョンみたいな
感じで、これは間違いなく便利です。
Classbox
に似た方向の話じゃない?っていう話がでて、あーなんかMatzさんの日記で
名前見たけどスルーしてたなあこれまた不覚…と思いつつ
みずしまさん の説明を聞いたら確かにとても近そげ。これも調べてみなきゃ。
そだ。
- std::sort は何故 RandomAccess を要求するか。
std::sort() はランダムアクセスイテレータを引数にとるので、 うっかり list::iterator を渡すとそれは悲惨なことに…という前置きの途中で 「そういえば std::sort() ってなんでランダムアクセス要求するんですかね?」 と突然本題に関係のない疑問を口走った私です。
例えば 素直なクイックソート なら Bidirectional で十分なわけで。もちろんこれだと最悪ケースの計算量が O(N logN) にならないので、多くのSTL実装は再帰が深くなりすぎるとヒープソートに切り替えていて、 ヒープソートは確かに RandomAccess したいというのはわかります。あと、枢軸を選ぶのに 左端右端の他に中央の値をとりたいのでそれが定数時間で取れた方が高速だろうというのも確か。
とはいえ、例えば「中央の値を取るのはあきらめる」&「再帰が深くなるとinplace_mergeで
マージソート」とすれば完全にBidirectionalアクセスのみで O(N logN) のソートも
可能なはず。であれば、規格としては std::sort の要求は Bidirectional に
留めておいて sort(list.begin(), list.end());
を許した方が
ベターなのではないかなあ、と日頃疑問に思っていたのでした。パフォーマンスを追求したい
実装は、RandomAccess できるイテレータを特別扱いして最適化することにして。
どうなのだろう。
Binary 2.0 Conference 2.02006 の日でした。
会場に後ろから入ったところ、「オライリーの本10%引きセールしかも今なら Binary Hacks Tシャツ含む豪華特典も!!!」 コーナーだったので、思わずつられつつ ひねくれて、一番バイナリ関係なさそうな 『Rails レシピ』 を買ってしまいました。いつか役に立つ日を作りたいな、という投機的積ん読です。
個人的に一番興味深く聴いた発表は、akrさんの、 IA-64のレジスタスタックと getcontext() が出会うと大変なことになっていたという話。 SPARCでsetjmp系の関数を使ったことは何度か記憶にあるのですが、 そういう視点で考えたことはなかったなあ。あと、プロジェクタにつないだPS3をWiiリモコンで操作しながらプレゼンする八重樫さんと、Ajax→Gif画像→バイナリと Web 2.0 から Binary 2.0 に駆け抜ける竹迫さんの発表が、 もう面白すぎてハライタでした。凄いなあ。
の何が素晴らしいかというと、街中どこにいても Wham! の "Last Christmas" が聴けることだと思うのです。と、今日6カ所くらいでこの曲を耳にして思ったのでした。
id:u-no さんのとこなど経由で、Imagine Cup が始まってることを知りました! 速攻で登録!
Imagine Cup というのは Microsoft が開催してる学生向け(プログラ ミング)コンテストで、多くの部門に分かれています。 自分としては他の部門は興味ないのですが、 アルゴリズム部門 がオススメなので、ご紹介。 一口で言うと、みんな大好き 「問題をできるだけバイト数の少ないプログラムで解け」 大会です。
使う言語は、2次元平面上をさまようロボット "Herbert" 君を操作するための 専用プログラミング言語 "h"。
s // Herbert君 1歩前に進む l // 左に90度向きを変える r // 右に90度向きを変える
基本命令はこの3つだけ。
ssrssrssrssr
↑ Herbert君を2歩ずつ四角く右回りに動かすプログラム。 あとは、マクロというかLazyな関数というか、そういうのもありますが、まあ、 詳細は チュートリアル をどうぞ。それで、マップ
が与えられるので、白丸 ○ を全部踏むように Herbert 君を 動かすプログラムを、できるだけ少ないバイト数で書きましょう!っと。
残念なことに、参加資格は学生にしかありません。ただ 参加方法 を見ると Student 以外に Guest という選択肢があって、説明が 特に見あたらないんですけどこれで雰囲気見るくらいはできるんですかね。 謎です。
紹介ドリブン読書といいますか、最近わりと向井さんドリブン読書率が実は高いような 気がしてきたk.inabaですこんにちは。前置きはともかく、 『夜は短し歩けよ乙女』 が自分にとって大ヒットだったのです。
同じ著者の『太陽の塔』は読んだことが あって、で、大変面白かったのですけど、"これ"をもう一冊読む気はしないなあと 思ってその後の作品はスルーしてました。そんなある日前述の向井さんの感想を読んで、 これがまた実に面白そうに書かれているので、ちょっと本屋でパラパラ眺めてみるかという 気になりました。そこで取り上げた帯の文が
私はなるべく彼女の目にとまるよう心がけてきた。吉田神社で、出町柳駅で、百万遍交差点で、銀閣寺で、哲学の道で、「偶然の」出逢いは頻発した。我ながらあからさまに怪しいのである。そんなにあらゆる街角に、俺が立っているはずがない。「ま、たまたま通りかかったもんだから」という台詞を喉から血が出るほど繰り返す私に、彼女は天真爛漫な笑みをもって応え続けた。「あ!先輩、奇遇ですねえ!」(本文より)
なぜだか巧く説明はできないけれど1文字目から186文字目まで(数えた)ツボにハマりすぎて しまいまして。やっぱり"これ"であるよな気もするんですが、もうなんでもいいやとレジに直行。 中身はこの引用部が300ページに拡大されたような物語で、つまり、「私」は あからさまに不審であり、あらゆる街角は怪しい舞台となって、「彼女」は 天真爛漫に歩き続けて行くのでした。あ、今気づいたけど「私」も「彼女」も名前を 与えられていないんだなあ。
ともかく、この帯が気に入った人なら気にいるんじゃないかな、と思います。
Python Workshop 04 に行ってきました。
そしてトーカーの欄に自分がいるというこの不思議。 「デコレータ萌え!アルゴリズミックなコードに関しては本気で Psyco 加速は凄いよ!あと標準の random の充実度は地味に便利すぎるよ!以上!」と、なんかそれお前要するにただの Python の 感想文じゃないかってな話をしてきました。 (.ppt | .pdf)
WebとかCMSとかとはたぶん思いっきり逆方向からPythonに突撃しての感想なので、 そちら方面の方に「こんな側面もあるのかフーン」と僅かでも思ってもらえてたらいいな、 と、しかしやはりどう考えても明らかに自分より エキスパートな聴衆を前に標準ライブラリ便利ですね!!!とか言い出す 俺Python歴3ヶ月はチャレンジングすぎなのであった。
Django の話。 予備知識ゼロだったのですけど、一からチュートリアル形式での解説で、 よく理解できました。RoR が最初に吐くファイルの量にめげたことがあったので、 プロジェクト作成時に作られるファイルはこんなに少ないですよ、ていうのが魅力的でした。
Python て SciPy みたいな使われ方も結構あるんじゃないか、 とか。
Beautiful Soup。 変なマークアップでも頑張って解釈してくれるよパーザの紹介。 随所随所で名前付けのセンスが素晴らしいようです。今度使ってみよう。
別に Django に対して特に思ったとかではないんですが、しかも素人考えですが、 「タグやホスト言語のスクリプトで制御構造を埋め込めるHTMLテンプレート」を見るたびに、 もう全部RubyやPythonで記述するようにしちゃった方が簡単なのではないかなー、 と時々感じてしまう。「うっかりビューにロジックを入れてしまう過ちが起こりやすくなる」 欠点は、そこは気をつけましょうということで。「HTML部分を分離してデザイナーに 任せたりできなくなる」点は、諦める。個人用途向け/全部一人で書く人向けと割り切るとか。 そうでなくても、デザイナーに任せるのはCSS。HTMLでデザインはしない、とか。 あーよくわからなくなってきた。
pymixi。 Pythonからmixiの情報を読み取るライブラリだそうで。 たまにBeautiful Soupさんでも手に負えないHTMLが…
PyCon に行こう話。面白かった。 そいえば DCon が開かれるとしたら行こうという猛者はいらっしゃるのだろうか。
懇親会。会場に歩いてくまでの道すがらも会の最中も帰りも、なんかずーっと 皆様とお話させていただいてて、物凄く楽しかったです!ありがとうございました!!
昨日のは、よし最後はコンパイル時にHelloWorld出すプログラムで終わろう! と思って書き始めたはいいけどそういうことをするpragmaをすっかり忘れていたので諦めて、代わりになんかtempateとstaticの 飛び交うHelloWorld、という方向に切り替えようと思ったけど途中で飽きて、 ぐだぐだになってたのでした。つまりまとめると、私の思考/指向/嗜好は読まれすぎです。 Undocumented なメソッドを投入する手は思いつかなかった!あとそういえば
void main()
{
"Hello, world!".printf();
}
こう書くパターンも考えなかったなあ。
今日のどうでもいいことで悩もう大会。D言語でハローワールドはどう書くべきか。
void main() // D のプログラムはmain関数から始まります
{
printf( "Hello, world!\n" ); // その環境の C ランタイムのprintfを呼びます
}
案1。何もimportしなくていいのがポイント高い。けど printf ってCの関数だからなあ。 ハローワールドは「これがD言語だ!」と一発目に出すものであって、そこでいきなりCの関数を 呼ぶのはどうかという気もする。このくらいスムーズにCの関数を呼べるというのは、 もちろんDの特徴の一つではありましょうが、なんか違う。
import std.cstream; // 標準入出力ストリームライブラリ
void main()
{
dout.writefln( "Hello, world!" ); // 標準出力に、フォーマット一行出力
}
案2。私はこれまでこう書いてました。"\n" いらないし、printf よりD言語っぽいし。
import std.stdio; // Cの<stdio.h> + D風のラッパーライブラリ
void main()
{
writefln( "Hello, world!" ); // 標準出力に、フォーマット一行出力
}
案3。ただ、この書き方をよく見るからこっちの方がいいのかなー、と、ふと。 例えば Ruby でも、世界にこんにちはするときは $stdout.puts なんて書かないで 単なる puts でしょうし。問題は std.stdio って事実上 writefln しか関数がないので、 これを import しても標準入力とか取れないこと。ハローワールドでしか使わない モジュールという説が。(言い過ぎ)
import std.cstream; // 標準入出力ストリームライブラリ
void main()
{
dout.writeLine( "Hello, world!" ); // 標準出力に、文字列を一行出力
}
案4。ここまでの全ての案の問題点は、writefln が writefln であることで、
これはprintfに似た書式化文字列を受け取る関数なので、
dout.writefln( "Hello, 100% world!" )
とすると、実行時に "% " のところで例外が飛びます。
この手の関数を、無邪気に単なる文字列表示のために使うのは(例えハローワールドだとしても)
良くない習慣だと思う。というわけで、単なる文字列一行表示関数を使った方がベターかも、
と変えたのが writeLine 版です。
std.stdio には writeLine はないので、今度は dout. は外せません。
writeLine の問題は文字列1個しかとれない関数なことで、writeLine("He",11,"o") とか 書けないこと。逆に、writefln は可変個引数かつ型も文字列に限定されてないので、 そっちなら可能でした。ハローワールドだけならwriteLineで困らないんですが、 それ以上のことに一歩でも足を踏み出すと、要はintを画面に表示したくなると、 いきなりwritefln使わないと不便になります。というわけで、writeLine で 始めるのもちょっと微妙かなーとか。
まとめっていうか、要は phobos (標準ライブラリ) 使えねー! というD言語使いおなじみの 文句に落ち着きそうになってきました。writefln の "%" を特別扱いしない版があれば たぶん全て解決なんですよね。書いてsubmitしてみるかなあ。
他のD使いの方のお勧めの書き方はどんなんでしょうか。
import std.typetuple, std.stdio;
template Has(char c, char[] msg)
{
static if( msg.length==0 ) const Has = false;
else const Has = c==msg[0] || Has!(c,msg[1..$]);
}
template Args(char[] msg)
{
static if( Has!('%',msg) ) alias TypeTuple!("%s", msg) Args;
else alias TypeTuple!(msg) Args;
}
void main()
{
writefln( Args!("Hello, 100% world!") );
}