2008-09-30

鯨はマズい

父親が前々から、鯨を食べに行こうと言うので連れて行ってもらうことにした。何でも、よしみという店で、鯨のサービスセットなるものが、三千円であるらしい。一人で注文するにはちょっと高いが、二人で行くなら注文してもいいというのが、父親の思うところらしい。しかしながら、私は鯨に対して特別に思い入れなどないし、酒も好きではないので、飲み屋に連れて行ってもらったところで、それほど嬉しくはない。

そして、サービスセットの、鯨のベーコン、ステーキ、刺身などを食べたわけだが、どれも脂っぽく、とても食べられたものではない。ステーキだけは唯一、焼くことによって脂がなくなっていたが、硬すぎて食べられたものではない。親父はうまいうまいと食べていたが、理解できないことだ。

結論、鯨は脂だらけか、さもなくば恐ろしく硬くてマズい。何が悲しゅうてこんなマズいモンを大金払って食わなあかんのや。東方朔の言葉に、「水至清則無魚、人至察則無徒」というものがあるが、マズいものをマズいと言い捨てる正直者と生まれたからには、親孝行はできないものだ。

ハローワークは酷い環境だった

昨日、ハローワークに行ってみたが、二十一世紀とは思えない酷さであった。

ハローワークには、パソコンが数十台置かれており、そこから希望の仕事を探すのだが、このシステムが、この上なく使いづらい。

使い方を述べてみる。操作はタッチパネルで行う。コンピュータに詳しくない人に対する配慮かもしれない。まず、年齢を入力する。次に、フルタイムやパートタイム、正社員や契約社員、派遣などの労働形態を選択する。

業種の選択が実に分かりにくい。詳しくは、ハローワーク・インターネットサービス(職業分類逆引き)に載っている。ちなみに、このページはいまだにフレームを使用している邪悪なページだ。
ハローワーク的分類では、プログラマもSEもWebデザイナも翻訳者も医者も按摩も画家も、すべて「専門的・技術的」というカテゴリに含められる。何という大きなカテゴリだろう。「管理」と「事務」はどう違うのだろう。飲食店の店主は「販売」のカテゴリに入るが、飲食店の従業員は「サービス」のカテゴリに入るのだ。とてもややこしい。

最後に勤務地を選択すれば、結果が一覧表示される。しかし、一覧で表示されるのは、会社名や一般的な業種名だけで、具体的に何をやっているのかさっぱりわからない。一覧から選択して、詳しく見ようとすると、用紙をスキャンした画像が表示される。とても荒く見づらい。なるほど、それですべてのパソコンの隣に、プリンタがついているのだろう。

何故、求人情報の画像をスキャンして取り込むのだろう。コンピュータを使った検索なら、会社名や勤務地、応募資格、広告主の文面などをすべてひっくるめて、全文検索できて然るべきだ。それなのに、検索できるのは、ごく限られた情報だけ、一覧では分からず、詳細な説明の画面を出して、印刷して、初めてまともに読むことができる。この二十一世紀になんとアナログなんだろう。

コンビニで配っているアナログのフリーペーパーに、検索力において負けているハローワークとはこれいかに。

怖い求人の例

ある、一ページ丸ごとつかっての求人広告の文面。

2人に1人がマンションを購入しています。入社一年半以上の社員に限定すれば、ほぼ1.4人に1人の割合です。固定給だから、安心できる。スタッフが口々にいう。この言葉を証明している数字がありました。持ち家比率です。

おお、高収入の仕事なんだな。どれどれ、仕事の内容は、

タイトル:未経験から始められるマンション営業(男女)
事業:新築分譲マンションの企画及び販売代理

マンションを買えるほど、社員には高給を払っているということを宣伝したいのだろうが、いかんせん仕事がマンションの営業なのだ。まさかこの会社ではノルマ消化のために自社物件を買わされているのではないか、と思われる恐れを考えなかったのだろうか。こんな広告を出す会社の営業は、なんだか怖い気がする。

ところで、なぜ日本ではマンションを集合住宅の意味で使うのだろう。まず確実に英語からの輸入だと思うのだが、一体いつ頃この言葉が日本に入ってきて、どういう経緯で集合住宅を意味するようになったのか。

と思ったら、語源由来辞典に載っていた。どうもアパートという語が、あまりにも賃貸の集合住宅という意味合いが強かったので、部屋を買い切る集合住宅と区別するために使うようになったらしい。

ツッコミどころ満載のブサヨ

http://www.jtu-net.or.jp/education/sansu/series/08.html

まずもうちょっとましなタイトルをつけよう。なんだよ"e-station"って。

文字コードが今どきシフトJISだ。

table要素をページ全体のレイアウトに使っている。

CSSではなく、非標準でIE独自規格の、leftmargin、topmargin、marginwidth、marginheightという属性を使ってマージンを設定している。

中身? 知ったことか。マッハ2.5で6120kmもの航続距離のある戦闘機なんてあったら欲しいよ。

不思議な求人の例

ドラッグストア兼雑貨屋のアルバイトの求人がある。最近見かけるようになった店だ。ただし、昼間の時給が1200円。なぜこんなに高いのだろう。考えれば、正社員より安いし(それでも、法律上は週何十時間を超えたら保険や有給の義務があるのだが)、派遣を使うよりは安いから、こんなものかという気もするが。

データ入力の仕事。別に、単体で見れば怪しいところは見当たらないのだが、毎週のように求人広告が出ている。しかし別会社名義でだ。会社名以外は、住所、電話番号、文面、写真(イラストではなく実写)まですべて同じだ。事業内容の文面もまったく同じなので、企画ごとに会社を作っているのだろうか。

2008-09-28

今日面白かったレス

36 名前:名刺は切らしておりまして[] 投稿日:2008/09/27(土) 12:33:24 ID:2uv52aVN
友人が宿泊した奈良のホテルは、部屋の浴室に見知らぬ老婆がおられて、
ご本人は数年前にお亡くなりになられたらしく、その事をしきりに訴えられるのだが、
いかんせん半身が壁にめり込んでおられて、いろいろ難儀だったようだ。

さすがに歴史と伝統のある土地柄だけに、
客を飽きさせないサービスもまたひとしおだと感心した由。

29 名前:オレオレ!オレだよ、名無しだよ!![] 投稿日:2008/09/27(土) 21:57:48 0
個人で放射性物質ゲットする方法ない?潰れた病院あたりいけばあるかな?
むかつく奴いるんだよね

33 名前:オレオレ!オレだよ、名無しだよ!![] 投稿日:2008/09/27(土) 22:21:48 0
>>29
昆布とガイガーカウンターをセットで送ってやれば?

35 名前:オレオレ!オレだよ、名無しだよ!![] 投稿日:2008/09/27(土) 22:30:35 0
>>29
あるよ。アトムレンズでググればわかる。
1本3千円くらい。

36 名前:オレオレ!オレだよ、名無しだよ!![] 投稿日:2008/09/27(土) 22:33:56 0
>>29
山行って花崗岩でも砕いてくれば?

37 名前:オレオレ!オレだよ、名無しだよ!![] 投稿日:2008/09/27(土) 22:35:25 0
>>29
閃ウラン鉱 100g 2万円  (これは強いから要注意)

石橋合戦事、佐奈田與一義貞

平家物語になく、源平盛衰記に出てきている話に、佐奈田與一義貞の話がある。なかなか面白い。佐奈田とは、さなだと読むのだが、苗字としては、真田の方が普通だ。しかし、与一と言えば、那須与一と紛らわしい。もちろん、石橋山の戦いの話なので、場所は、現代で言えば、神奈川県小田原市ということになる。

時は治承四年八月二十三日。源頼朝従五位下右兵衛権佐は謀反を起こし、その初めとして、兼隆判官を討ち取った。しかし味方は遅参続きでなかなか集まらない。わずか三百余騎で石橋山に陣を構えていたところ、平家からは、大場三郎景親を大将軍として、三千余騎が押し寄せてきた。既に辰時を過ぎ、落日西山に傾て、其日も既に暮れなんとす。雨もひどかったが、平家方は源氏の手勢の少ないうちに叩いておこうと、攻めてきた。

影親と時政の名乗りあいも面白いのだけれど省略。

与一は佐殿(頼朝)より先陣をおおせつかって進み出る。既に日も暮れ、雨も酷く、敵味方の区別がつかない。途中、岡部弥次郎というあはぬ敵が向かってきたので、首をかく。さて、俣野五郎景尚と組み合って落馬し、お互いに組んだまま、上になり下になり、ごろごろと転げて、あと一回転で海に入るといったところで止まった。上は与一、下は景尚であった。互いに組み合っていて、どうしようもない。与一は落ち合え落ち合えと叫んだが、あいにくと郎党は押隔てられてやってこれない。そこへ、景尚の郎党の長尾新五という者がやってきた。

しかし、暗くてどちらが主なのか分からない。長尾は「上や敵下や敵」と問う。与一は上に乗りながら機転を利かせて、「角宣ふは長尾殿か、上ぞ景尚、下ぞ与一、謬し給な」と言う。景尚は、「上ぞ与一、下ぞ景尚、誤すな」と言う。頭は一所にあり、くらさはくらし、音は息突て文明に不聞分、上よ下よと論じければ、思侘びてぞ立たりける。

結局、長尾は鎧の毛を探ってどちらが主か確かめる。与一は正体がバレてしまうと観念して、右足で長尾を踏む。長尾は踏まれて、弓長三杖ばかり走って倒れる。その隙に、与一は刀を抜いて景尚の首をかこうとするが、切れない。よく見ると、鞘ごと腰から抜けてしまっている。鞘を外そうとするが、あいにく岡部の首を切ったときの血が固まって抜けない。結局討たれる。無慙と云も疎か也。

WalMart(笑)がDRM鯖を停止、購入厨涙目

Wal*Mart shutting down DRM server, nuking your music collection -- only people who pay for music risk losing it to DRM shenanigans - Boing Boing

よう、購入厨。音楽をP2Pで落とさず、ちゃんとWalMart(笑)で買ったのかい。そりゃ良かったな。褒美にその正直に買った音楽を、二度と聴けなくしてやるよ感謝しろ。十月九日以降は、お前の買った音楽を聴けなくなるんだぜ。それでも聞きたきゃ、色々と面倒なことをしなきゃならん。まずメールアドレスを変えていたらアウトだし、パソコンに詳しくなきゃならん。

でも心配するこたあない。他のDRM会社には、絶対に起こり得ないことなんだから。自転車操業で夜逃げ上等のWalMart(笑)と違って、DRM会社は磐石な業界のベテランなんだから。まず数千年は安泰だろうよ。だからDRMプロテクトのかかったAudible bookやiTunesやZuneの音楽、EAのゲームをどんどん買うといい。これらのDRM提供会社は絶対に潰れたりしない。その磐石なること、CommodoreやAtariやソ連、あるいは米ドルや神聖ローマ帝国の如しと言える。

んで、購入厨よ。割れから守るためにプロテクトは必要だと思ってるのかい? 金出して買ったら、DRM鯖が止まるかもしれないぜ。無料で手に入れて一生聴くのが得だな。

DRMの認証鯖の停止とか、一番やっちゃいけないことだろ。それこそ今話題になっている、保険会社が潰れることに匹敵する事件だぜ。しかもこっちは本当に潰すんだからシャレにならん。

2008-09-27

ローグライクな東方同人ゲーム

BACK SPACE

いわゆる不思議のダンジョンのゲーム。キャラは東方。なかなか出来がいい。ただ、320x240の解像度はちといただけない。また、ジョイパッドはPOVに対応していない。方向のみの入力であれば、XY軸はどうかと、常々思うのだけれど。

2008-09-26

祇王祇女仏前事

源平盛衰記の祇王の話は、福原遷都の直後になっている。浄海入道が腹悪しき人であったことの逸話のひとつとして挙げている。平家物語の諸本では、大抵冒頭近くに置いてある事が多いのだが。

源平盛衰記では、祇王が初めて浄海入道の下へ行くときは、弟子を三人連れて行ったとか、祇王が再び被召たとき、今様を二つ歌ったなど、細部に相違が見られる。しかも、浄海入道は今様の出典を一々に挙げているのだから、なかなか博識だ。

もうすぐPDC2008

さて、どうなることやら

平家物語の蘇武はさらに酷い。

源平盛衰記の李陵と蘇武に関する記述が気に食わなかったが、ふと平家物語を見返してみたら、さらにひどかった。

いにしへ漢王胡国を攻られけるに、はじめは李小卿を大将軍にて、三十万騎むけられたりけるが……

次に蘇武を大将軍にて、五十万騎をむけらる。

おいおい。李陵はたったの五千の兵卒だけで向かったんだぜ。しかも馬などはない。蘇武は和平の使節団の一人だったのだ。

蘇武はしなざりけり。かた足なき身となつて、山にのぼつては木の實をひろい、春は澤の野芹を摘、秋は田づらのおち穂ひろひなどしてぞ、露の命を過ごしける。田にいくらもありける雁ども……

蘇武って片足を切られたんだろうか。源平盛衰記も蘇部は片足を切られたと書いてあるが、本当だろうか。それから、何で奴らを匈奴とか狄などと呼ぶかというと、農耕をせず、遊牧と狩猟で暮らしているからだ。田畑があるわけがない。それに、あのモンゴル辺りに芹が自生するような湿地帯ってあるんだろうか。人工的に作らないといけないとおもうのだが。

今度は李廣と云将軍に仰て、百万騎をさしつかはす。

まてまて、李廣は李陵の祖父だが、李陵がまだ子供の頃に自殺したはずだ。紀元前119年のことだ。

変わった求人広告

変わった仕事を探すべく、求人広告を見てみた。

まず死体洗いの求人は見つからなかった。葬儀屋の求人広告も、この二週間の求人誌の中には見つからなかった。

ラブホの清掃の求人はあった。ひとつは、ホテルの名前がいかにもだったのと、載っていたホテルの外観が異質だったので判別できた。ただし、言葉の上では、数時間単位で部屋を貸すホテルだとは書いていない。業種は、レジャーホテルとなっている。もうひとつは、ビルの清掃業者の求人だが、ブティックホテルの客室清掃となっている。ブティックホテルといえば間違いないだろう。掃除は業者の派遣を使っているホテルもあるらしい。

街頭のティッシュペーパー配りの求人は見当たらなかった。あるいは、サラ金の新人社員がやる仕事なのかもしれない。

キャバクラの客引きの求人も見当たらなかった。これは確実に違法なので、さすがに求人誌には載せられないのだろう。ただ、街頭に出ると、汚く臭いオッサンが看板を持って立っていることがある。その看板に、男性スタッフ募集と小さく書いてあったような気がする。しかし、あの浮浪者のようなオッサンは何なのだろう。キャバクラの客引きは、身なりだけはまだましなほうだが、あのオッサン達は、うわべすら取り繕おうとしていない。それこそ本当にホームレスの日雇いなのだろうか。

ピンクチラシ貼りの求人広告は見つからない。それこそピンクチラシに書いてあるのかもしれない。

ほかにも、性風俗関連特殊営業のスタッフの仕事があるだろうが、これらは当然載っていない。

言語の進化神の歩みはいかに

最先端の文学を構造で分析してみる - wiseler : WAR IS PEACE

コメントで書こうとしたが、長くなるのでここに。

曰く、日本語は文脈の自由度が高い。携帯小説と呼ばれている文体は、個々の節の独立性が高い。この傾向が続けば、将来はまったく異なった文体に発展して云々。

いかにも言語学者の言いそうな事だ。言文一致論を極めるとああなるのだろうか。

言わせてもらえば、古典が優れているわけではない。漢字の当て方は、音さえ同じならいいという考え方であり、現在のような学校教育がなかったので、漢字が統一されておらず、異字体だらけだ。それに、やたらと現代の出来事を昔の類似した出来事に当てはめたがる傾向がある。もし古典の手法をもって現代の小説を書けば、まず漢字の使い方が間違っていると言われ、次に送り仮名が間違っていると笑われ、さらには、コピペ小説と叩かれるだろう。源平盛衰記では、ある出来事に関連させて、「この事は支那のある朝に何某というもの侍しに云々。また我が朝でも某天皇の御宇に云々」などという文章が決まり文句のように出てくる。

村上春樹は、もうとっくの昔に死んでいる。あの小説は、七十年代、八十年代の時代背景がなければ理解できない。例えば、亀を撃退する方法として、フリオ・イグレシアスのレコードをかけるという話があるが、あれも当時の人間でなくては理解できない。当時の人間である私の父親に言わせると、フリオ・イグレシアスはとてつもなくつまらないそうだ。過去の偉業があるため、今でも、本を出せばそれなりに売れるが、海辺のカフカ、アフターダーク、東京奇譚集、つまらない小説ばかりだ。と言いつつ全部読んでしまうのが、往年の小説の愛読者としては悲しいところだが。

哲学の文章の拙さは、そもそも当時の文章が、ああいうものだったから仕方がない。何しろ馬琴の文章で育った世代だ。

コンセプトがCD入り

Concepts are in C++0x! « ConceptGCC Developer Blog

まあ、今入れなければいつ入れるんだという話だけれど。だいたいコンセプトは巨大すぎる。言語仕様からライブラリからかなり書き換えることになる。ところで、例の新しい関数宣言の文法はだいぶ議論していたが、どうなることやら。

ところで、CDがCandidate Draftになっている。なんかそっちの方がしっくりくるな。しかしBASICの略ではあるまいに(Beginner's All-purpose Symbolic Instruction Codeといわれている、こじつけのような略)

2008-09-25

最先端の文学

最新の文学というのは、常に理解されないものだ。私は常々、理解のある人間でありたいと思っていた。流行を追うというのは嫌いだが、新しいものに対して拒否反応を示す、古い人間にはなりたくないと、そう思っていたのだ。古くはエジプトのパピルスにも、「最近の若い者は」という言葉が書いてあったと聞くし、炊飯器が発明されたとき、「お前はこんなモノで米を炊くグータラな嫁さんを持ちたいかね」などという批判もあったそうだし、かつての電報会社の最大手、ウエスタンユニオンは、ベルの発明した電話に対して、実用にならないオモチャと一笑している。既存の価値観で縛られることの愚かさは、歴史を紐解けば列挙に暇がなく、切に分かっている。さて、

第3回日本ケータイ小説大賞:あたし彼女

やっぱり
おれわ
理解のない
古い
人間でもオッケー
みたいな
ってゆーか
これわ
最初
北朝鮮の暗号文かと
思ったし

変わった仕事がしたいものだ

求人誌を眺めていても、普通の仕事ばかりだ。法に触れるような仕事はしたくないが、何か変わった仕事がしたいものだ。後々までも話のネタにできるような変わった仕事だ。

こういう時、よく言われるのが死体洗いだ。よく語られるのは、医学生の解剖用の死体を洗う作業であるとか、あるいはホルマリンのプールに漬けてある死体が浮かび上がらないように棒でつつく作業であるとかだ。まあこれは都市伝説なのだけれど、葬儀屋では、死体を洗う作業があるはずだ。しかし、そんな求人広告が、フリーペーパーの求人誌に載っているものだろうか。「湯灌スタッフ大募集! 未経験大歓迎! 先輩達が優しく指導します。幅広い年齢の人が働いています。」という求人広告は、ちと考えづらい。しかし実際には必要なはずで、どうやって募集しているのだろうか。この仕事で作業内容を説明せずに求人はまず無理だと思うのだが

数時間単位で部屋を貸すホテルの清掃なんてのもある。これは死体洗いほど都市伝説化されてはいない。実際やるのはだいぶ疲れるのではないか。何しろ客に見られずにすばやく部屋の掃除を行わないといけないのだから。しかし、前々から思っていたのだが、あの手の旅館は、法律的にどうなのだろう。宿泊者名簿はまずないだろうが、いいのだろうか。

キャバクラの客引きは、言うまでもなく違法なので論外。ピンクチラシ貼りも論外。街頭のポケットティッシュ配りは微妙だが、まずサラ金だからなぁ。

思ったほど、変わった仕事に対する知識が少ないようだ。

十の百乗プロジェクトについて考えてみた

Project 10 to the 100th

あらゆる既存の価値観や倫理、道徳といった主観的な観念を排除して考えてみた。目的は、金に糸目をつけず、より多くの人に影響を与えることだ。

What one sentence best describes your idea?
テレビ漬けになっている情報弱者を洗脳する。
Describe your idea in more depth.
Web全盛の現代においても、テレビを全面的に信頼する輩はかなり多い。彼らは現に毎日テレビを見ている。彼らを狙い、各国のテレビで、ゴールデンタイム(業界用語:もっとも視聴率の高くなる時間帯)に毎日宣伝広告を打つ。
What problem or issue does your idea address?
何でも。平和主義や地球温暖化から、宗教や戦争賛美まであらゆる洗脳が可能。事実、ホワイトバンドから第二次世界大戦まで幅広い流行がテレビによって創作されてきた。
If your idea were to become a reality, who would benefit the most and how?
テレビ局がCM広告料により最高の恩恵を受ける。
What are the initial steps required to get this idea off the ground?
洗脳する内容の選定、効果的な動画の作成、各国テレビ局との交渉。
Describe the optimal outcome should your idea be selected and successfully implemented. How would you measure it?
日本のキー局のゴールデンタイムのCMが一本何百万といわれている。日本だけで年間十億円以上かかる。

What one sentence best describes your idea?
全人類乞食化
Describe your idea in more depth.
全人類に等しく平均した金を恵む。
What problem or issue does your idea address?
貧困、不平等、差別、格差などのあらゆる「違い」を消し去る。
If your idea were to become a reality, who would benefit the most and how?
正直ではない利己主義者。
What are the initial steps required to get this idea off the ground?
金、それも大量の金。全人類はイデオロギーによって勤労意欲を出すべきだという洗脳(さもなければ、誰も働かなくなり、食料、物資の困窮を招く)。
Describe the optimal outcome should your idea be selected and successfully implemented. How would you measure it?
年間に全世界のGDPの合計額ほど。ただしこの案が採用された暁には、GDPはもはや意味を成さない。

他にはニヒリズム案として、第三次世界大戦をけしかけ、全面核戦争で人類を絶滅させるという手法もある。人間がいなければ、もはや何の助けをも為す必要がない。第三次世界大戦をけしかけるのには、アメリカの一年分の国家予算を個人が自由に動かせる程度の金額で可能だろうと思う。ただし完璧に絶滅させるには、全陸地に核を投下しなければならないので、上の二案と比べて確実ではない。この案では主としての人間を絶滅させることに意味があるので、わずかでも生き残ってしまっては失敗である。

茨城民国

議会で居眠りの次は、議員に関連する土建屋を締め出す法案に対して脅迫沙汰か。心ある人の住むところにあらず。

まあ、考えてみれば昔からこんな感じだったのだろう。何しろあの徳川光圀の国だ。良政のわけがない。放蕩でホモで大日本史だとかいうオナニーのために水戸藩を傾け、八公二民の年貢を取り立てて民を虐げ、死後も藩を立て直せず、出生をだに嫌われたあげく、将軍の器にあらずとも言われた胤の祖なのだから。

放蕩であることは、光圀自ら能くうどんを打ち、諸国の名物を伝え聞いては、人をやっては調べさせたことから明らかだし、ホモであることは当時の慣習からして疑いようが無いし、大日本史は今の日本に誰も読むものがいない。そんな馬鹿げた史書編纂のためもあって、年貢は重かったし、奴の死後も一揆は立て続け、そもそも密かに産み落とされて、密かに育てられていた身だ。慶喜もその血を受け継いだのか、将軍らしくもなく、あっさりと政権を朝廷に返しているではないか。光圀は隋の煬帝と並ぶ暴君といって差し支えない。

何で現代において、光圀ごとき奴が名君として讃えられているかというと、理由はひとつしかない。奴が日本は天皇の治める国だと主張したからだ。だから明治政府にとって、天皇の威光を上げるために、都合が良かったのだ。

思えばケイキも面白い奴ではある。死後の名声ということを重んじ、賊徒の張本とされることを恐れたため、対して抵抗もせずに自宅に引きこもり、あっさりと政権を返上したのだから。その甲斐あってか、奴は学校の歴史教科書にも、悪人としては書かれていない。急に出てきてあっさり政権を返して、そのあとは知らんといった風にしか紹介されていない。ある意味、望みがかなったというべきか。中江兆民の三酔人経綸問答を地で行く君主ではある。なかなか安泰で悪くない余生を送ったそうだし。

なんだか途中で茨城が関係なくなってしまった。まあ、所詮は光圀の国だ。

In Case of your wife's machine is so slow

Mark's Blog : The Case of the Slooooow System

またAdobeのFlashとSonic Solutionsか。Flashはあるいは重いFlashを使ったサイトを見ていたのかもしれないという疑問はあっても、Sonic Solutionsは疑いようがないな。やれやれだ。あそこはcrapwareしか作っていないというイメージがある。

プリプロセッサメタプログラミングで25個以上のデータを扱いたい場合

せっかくいい機会なので、Boost.Preprocessorのその他のData Typeも紹介してみる。前回の例では、enumのメンバは25個までしか使えない。それはarrayやtupleの実装が25個までだからだ。しかし現実的には、enumのサイズは、32bitや64bitであったりする。25個しか使えないというのはすこし問題がある。

まず、sequenceを使ってみよう。これは現在、256個までの要素が使える。これを使って先ほどのコードを書き直すと、次のようになる。

#include <boost/preprocessor/repetition/enum.hpp>
#include <boost/preprocessor/seq/size.hpp>
#include <boost/preprocessor/seq/elem.hpp>

#define HITO_PP_ENUM_MEMBER( z, n, data ) \
BOOST_PP_SEQ_ELEM(n, data) = 1 << n

#define HITO_PP_SHIFT_ENUM( name, array ) \
enum name { \
BOOST_PP_ENUM( BOOST_PP_SEQ_SIZE( array ), HITO_PP_ENUM_MEMBER, array ) \
}


#define HITO_PP_SEQ_ENUM_IDENTIFIERS \
(ONE)(TWO)(THREE)(FOUR)(FIVE)(SIX)(SEVEN)(EIGHT)(NINE)(TEN) \
(ELEVEN)(THIRTEEN)(FOURTEEN)(FIFTEEN)(SIXTEEN)(SEVENTEEN)(EIGHTEEN)(NINETEEN)(TWENTY) \
(TWENTYONE)(TWENTYTWO)(TWENTYTHREE)(TWENTYFOUR)(TWENTYFIVE)(TWENTYSIX)(TWENTYSEVEN)(TWENTYEIGHT)(TWENTYNINE)(THIRTY)


HITO_PP_SHIFT_ENUM( foo, HITO_PP_SEQ_ENUM_IDENTIFIERS ) ;

#undef HITO_PP_SEQ_ENUM_IDENTIFIERS

これは256個までいけるのだが、ひとつひとつ括弧が必要なのが、ちょっと格好悪い。sequenceを使う利点として、その数を明示する必要がないことがあるが、しかしこの括弧の読みにくさを見れば、そんな利点はどうでもよくなってしまう。

さて、listだが、これは次回に回そう。とても面倒だ。

と思ったけれど、どうしてもこの問題の場合、数字が絡むので、256個以上は難しそうだ。とりあえず、sequenceからlistを生成するメタプログラミングでお茶を濁しておこう。

#include <boost/preprocessor/seq/size.hpp>
#include <boost/preprocessor/seq/elem.hpp>
#include <boost/preprocessor/seq/fold_right.hpp>

#define HITO_PP_SEQ_ENUM_IDENTIFIERS \
(ONE)(TWO)(THREE)(FOUR)(FIVE)(SIX)(SEVEN)(EIGHT)(NINE)(TEN) \
(ELEVEN)(THIRTEEN)(FOURTEEN)(FIFTEEN)(SIXTEEN)(SEVENTEEN)(EIGHTEEN)(NINETEEN)(TWENTY) \
(TWENTYONE)(TWENTYTWO)(TWENTYTHREE)(TWENTYFOUR)(TWENTYFIVE)(TWENTYSIX)(TWENTYSEVEN)(TWENTYEIGHT)(TWENTYNINE)(THIRTY)

#define op(s, state, elem) (elem, state)
BOOST_PP_SEQ_FOLD_RIGHT(op, BOOST_PP_NIL, HITO_PP_SEQ_ENUM_IDENTIFIERS)
#undef op

このメタコードは、プリプロセスの結果、

(ONE , (TWO , (THREE , (FOUR , (FIVE , (SIX , (SEVEN , (EIGHT , (NINE , (TEN , (ELEVEN , (THIRTEEN , (FOURTEEN , (FIFTEEN , (SIXTEEN , (SEVENTEEN , (EIGHTEEN , (NINETEEN , (TWENTY , (TWENTYONE , (TWENTYTWO , (TWENTYTHREE , (TWENTYFOUR , (TWENTYFIVE , (TWENTYSIX , (TWENTYSEVEN , (TWENTYEIGHT , (TWENTYNINE , (THIRTY , BOOST_PP_NIL)))))))))))))))))))))))))))))

となる。これがlistである。

2008-09-24

プリプロセッサメタプログラミングのすすめ

http://pc11.2ch.net/test/read.cgi/tech/1217008269/994

994 名前:デフォルトの名無しさん[sage] 投稿日:2008/09/24(水) 16:37:07
enum{
ONE=1,
TWO=2,
THREE=4,
FOUR=8
};

ってフラグ定数を宣言したい時いちいち=で設定しないでもenumと同じ使い心地の定数の宣言できないだろうか
勝手に2倍2倍にしてくれるenumみたいな

プリプロセッサメタプログラミングにかかればこの通り。

#include <boost/preprocessor/repetition/enum.hpp>
#include <boost/preprocessor/array/size.hpp>
#include <boost/preprocessor/array/elem.hpp>


#define HITO_PP_ENUM_MEMBER( z, n, data ) \
BOOST_PP_ARRAY_ELEM(n, data) = 1 << n

#define HITO_PP_SHIFT_ENUM( name, array ) \
enum name { \
BOOST_PP_ENUM( BOOST_PP_ARRAY_SIZE( array ), HITO_PP_ENUM_MEMBER, array ) \
}

HITO_PP_SHIFT_ENUMは、enumの名前と、メンバのarrayを引数に取る。以下のように使う。

#define HITO_ENUM_IDENTIFIERS (10, (ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN) )

HITO_PP_SHIFT_ENUM( foo, HITO_ENUM_IDENTIFIERS ) ;

#undef HITO_ENUM_IDENTIFIERS

プリプロセスの結果、以下のコードが生成される。

enum foo { ONE = 1 << 0 , TWO = 1 << 1 , THREE = 1 << 2 , FOUR = 1 << 3 , FIVE = 1 << 4 , SIX = 1 << 5 , SEVEN = 1 << 6 , EIGHT = 1 << 7 , NINE = 1 << 8 , TEN = 1 << 9 } ;

以上。

以仁王と競の相違

平家物語では、以仁王の謀反の計画がバレて、女装して三井寺に逃げるとき、信連は一人御所に残って、見苦しいものはないかと見まわしていたが、宮の秘蔵していた小枝という笛が忘れてあるのを見つけ、先に行った宮に追いついて笛を渡し、また御所に戻ったとある。

しかし源平盛衰記では、信連も一緒に逃げていたが、ふと宮が笛を忘れたと言い出したので、取りに戻った。追いついて笛を渡し、その後でまた、御所に戻ったとある。

微妙に話が異なっている。

競の話も、実際の言動には差異はないが、記述がだいぶ異なっている。

というのも、平家物語では、競の方から馬を所望したとあるが、源平盛衰記では、宗盛が競が自分に仕えるたいと聞いて喜び、馬に加えて鎧甲まで与えたとある。また、馬の名前が異なっている。平家物語は煖廷(なんれう)という名前だが、源平盛衰記では、単に小糟毛となっている。まあ、どちらも馬の毛並みから取った名前に過ぎない。煖廷というのは、純良の銀という意味である。糟毛は、灰毛に少し白毛が混じったものだ。

また、競が入るかどうかの確認も、平家物語では、かなりそっけないが、源平盛衰記では、不安になって訊ねたとか、「人を遣て」とか、分かりやすく書いてある。平家物語のこの部分の記述は、とても分かりにくいのだ。

さぶらひには、「競はあるか」。「候」。「競はあるか」。「候」とて、あしたより夕に及まで祗候す。

競家に歸ても、さすが覺束なくて早晩人を遣わして、競は有か候と、又人を遣て、競は有か候と隙なくこそ問ひ答えけれ。

源平盛衰記はかなり分かりやすい。

さて、平家物語では、この後、館に火をかけて三井寺に向かったとあるのだが、源平盛衰記では、館に火をかけたことは書いていない。ただし、宗盛の館の前を通るときに、下馬もせずに、やっぱり三井寺に向かうと云い捨てて打ち過ぎたとある。

平家物語では、宗盛は怒って、追っかけて討てというのだが、皆、競の弓の腕を恐れて追いかけなかったとある。源平盛衰記では逆に、侍達は、無礼者を追いかけて討つべしというのだが、宗盛が留めている。というのも、小糟毛は速いから追いつけないし、競は弓が強いから、小勢にて過ちすなよということらしい。

馬の焼印も、平家物語では、「昔は煖廷、今は平の宗盛入道」だが、源平盛衰記では、「平宗盛入道」だけになっている。また、平家物語では、馬は夜のうちに六波羅に引張っていき、門のうちに追い入れたとあるが、源平盛衰記では、京に向かって追い放ったところ、馬は自分で六波羅に帰っていったとある。

2008-09-23

芥川龍之介の地獄変と邪宗門

芥川龍之介の地獄変と邪宗門の元ネタが、前から気になっていたので、ちょっと調べてみることにした。

まずタイトルにもなっている地獄変の絵師、良秀だが、これは宇治拾遺集の説話、「絵仏師良秀」を題材にしているらしい。では、とさっそく読んでみたが、恐ろしく短い。しかもその内容も簡潔である。

隣家に火事が起こり、良秀の家にも燃え移った。良秀は無事に逃げたものの、中には妻子がいる。良秀は我が家の燃え盛る様子を見て、物憑きにあった様にゲラゲラと笑っている。というのも、最近、不動尊の火炎の絵が上手く描けなかったがが、今図らずも本物を見たおかげで、今後は上手く描けるだろうということだった。

たったのこれだけとは思わなかった。堀川の大殿様は一体誰なんだ。邪宗門の方は多分に創作を含むとしても、堀川の大殿様には、誰かモデルがいるのではないかと思うのだが。

そういえば、芋粥も宇治拾遺集の「芋粥」の話を下敷きにしているようで、これは原作通りの話であった。現代語訳といってもいいくらいに原作忠実だ。

reference_wrapperのベースクラス

libstdc++の実装を読んでみると、テンプレート引数がunary_functionとbinary_functionの両方を継承していた場合、reference_wrapperも両方を継承するようになっていた。やはりDinkumwareは間違っている。

いい加減にVC++はDinkumwareを使うのをやめて欲しいところだ。Dinkumwareはいつもバグだらけ。

そういえば、ベースクラスを選ぶ部分のコードは、驚くほど同じだった。まあ、多重継承を避けようとして、できるだけわかりやすく書こうとすると、まずあんな形になるだろうが。違うのは、operator ()だ。こちとらの場合は、C++03で実装しているので、その制限のためだが。ああ、早くVariable Templatesが欲しいところだ。

Conceptがあれば、もうすこし実装も分かりやすくなると思うのだが。

2008-09-21

源平盛衰記の李陵に対する記述が気に食わん

源平盛衰記では、康頼の卒塔婆に書かれた歌に関連して、歌の力を示す例として、漢の武帝の朝の李陵と蘇武の引き合いに出している。ご存知のとおり、蘇部は渡り鳥の足に歌を結わきつけて、漢まで飛ばしたという伝説が残っているからだ。源平盛衰記に曰く。

漢の武帝は胡国の匈奴を攻めるため、李陵を大将軍、蘇部を副将軍として遠征させた。百城のうち九十九を落とし、最後の城に討ち入ってみると、匈奴はみな逃げ出していて、美人だけがいた。李陵が美人にうつつを抜かしているうちに、気がつくと匈奴の兵に囲まれていた。李陵は匈奴に下って、その臣下となったが、蘇武は何と言われようと匈奴に仕える事はなかった。漢王はこの事を伝え聞いて、「蘇部は功臣也、李陵は二心有とて、父が死骸を掘り起こし、老母兄弟罪せらる」

さて、史実はどうかというと、まず李陵が匈奴を攻めるために、一旅団を率いて胡国入りしたのは事実だが、大将軍ではなく、先に攻め込んだ李広利を助けるためだった。また蘇部は、李陵が降伏した後に、和平の使節団の一員として胡国に入ったとされている。そこで、あわよくば単于を暗殺しようと計画していたのがばれて、捕まったのだ。

更に疑問なのが、城だ。遊牧民に城というのもおかしな話だ。源平盛衰記では、「狄城」としているので、あるいはテントの事を指しているのかもしれないが、やはり解せない。

美人にうつつを抜かしている間にやられるというのも、いかにも支那的と言わざるを得ない。中島敦の言葉を借りると、「誠にいかにも古代支那式な苦肉の策」といったところだ。

さて、李陵が二心ある不忠の臣であったかどうかとなると、定かではない。しかし、中島敦的史観が好きな私としては、やはり、支那式のうわべだけ取り繕い常に讒言に脅える世界が嫌になったと思いたい。

参考:中島敦 李陵

芥川龍之介の俊寛

芥川龍之介による俊寛はとても面白いのだが、今まで源平盛衰記を読んでいなかったので、これはほとんど、芥川龍之介による創作であると思っていた。しかし、源平盛衰記を読むと、どうもそうとは思われない。

源平盛衰記でも、俊寛は嘆き悲しみ、有王を善知識として往生の素懐を遂げるのは、やはり変わらないのだが、平判官康頼に、岩殿に参拝しようと誘われたときの断り方として、いかにも小乗仏教らしい答え方をしている。それならば、何で嘆き悲しむことがあろうか。所詮この世は仮の宿であるという思想を持っているのならば、現世がどうあれ気にしないはずだ。

ところで、やはり康頼はカルト宗教にハマりやすい軟弱者である。しかも、康頼の息子も、父親の帰還のためにお参り三昧ときているから、親子そろって情けない。千本の卒塔婆を流すときに、風向きを気にしていたというのは、てっきり芥川龍之介の創作かとおもっていたら、源平盛衰記にしっかりと書いてあった。

千本の卒都婆を造り、頭には阿字の梵字を書、面には二首の歌を書き、下に康頼法師と書て、文字をば彫つゝ誓ける事は、歸命頂禮熊野三所権現、若一王子、分ては、日吉山王王子眷属、惣而上は梵天帝釈、下竪牢地神、殊には内海外海龍神八部憐を垂給、我書流す言葉、必風の便波に傳に、日本の地につけ給、故郷におはする我母に見せしめ給へと祈つゝ、西の風の吹時は、八重の波にぞ浮べける。

阿呆としかいいようがない。

やはり神仏を商人としか見ていないのだ。芥川龍之介の俊寛にもあるように、「ところがこれが難物なのじゃ。康頼は何でも願さえかければ、天神地神諸仏菩薩、ことごとくあの男の云うなり次第に、利益を垂れると思うている。つまり康頼の考えでは、神仏も商人と同じなのじゃ」という言葉もさることかな。

康頼は俊寛にも参詣を進めるのだが、俊寛は小乗仏教の思想を持っているので、ただ仏を信じて後世を願えと言い返される。そこで、大乗的な考え方を全面に押し出して力説するのだ。

末世の我等が為には、後の世を欣はん事も必神明に奉祈べしと見えたり。釈尊入滅の後二千餘年、天竺を去事数万里也、僅に聖教渡るといへ共、正像既過ぬれば、行する人も難く其験も希也。是以て諸仏菩薩の慈悲の余に、我等悪世無仏の境に生て、浮期無らん事を哀て、新道と垂跡して、悪魔を随仏教を守、賞罰を顕し信心を起し給ふ、是則利生方便の懇なるより始れり、是を和尚同塵の利益と名たり。

また、岩殿に十五度の参詣を終えて、読み上げる祝詞にも、現金な思想が現れている。

其後康頼入道は小竹を切てくしとし、浦のはまゆふを御幣に挟み、蒐草と云草を四手に垂、清き砂を散供として、名句祭文を読上て、一時祝を申けり。

謹請再拝々々、維当歳次、治承二年戊戌、月の並十二月、日数三百五十四箇日、八月廿八日、神已来、吉日良辰撰、掛忝日本第一大霊験熊野三所権現、并飛滝大薩埵、交量うつの弘前、信心大施主、羽林藤原成経、沙弥性照、致清浄之誠、抽懇念之志、謹以敬白、夫証誠大菩薩者、済度苦海之教主、三身圓満之覚王也、両所権現者、又或南方補堕落能化之主、入重玄門之大士、或東方 浄瑠璃医王之尊、衆病悉除之如来也、若一王子者、娑婆世界之本主、施無畏者之大士、現頂上之仏面、満衆生之所願給へり。云彼云此、同出法性真如之都、従入和尚同塵之道以来、神通自在而、誘難化之衆生、善巧方便而、成無辺之利益、依之自上一人、至下万民、朝結浄水係肩、洗煩悩之垢、夕向深山、運歩近常楽之地、峨々峯高、准是於信徳之高、分雲登、嶮々谷深、准是於弘誓之深、凌露下、爰不憑利益之地者、誰運歩於嶮難之道、不仰権現之徳者、何盡志於遼遠之境、然則証誠大権現、飛滝大薩埵、慈悲御眼並、牡鹿之御耳振立、知見無二之丹精、納受専一之懇志、現止成経性照遠流之苦、早返付旧城之故郷、当改人間有為妄執之迷、速令証新成之妙理而已、抑又十二所権現者、随類応現之願、本迹済度之誓、為導有縁之衆生救無怙之群情、捨七宝荘厳之栖、卜居於三山十二之籬、和八万四千之光、同形於六道三有之塵、故現定業能転衆病悉除之誓約有憑、当来迎引接必得往生之本願無疑、是以貴賤列礼拝之袖、男女運帰敬之歩、漫々深海、洗罪障之垢、重々高峯、仰懺悔之風、調戒律乗急之心、重柔和忍辱之衣、捧覚道之花、動神殿之床、澄信心之水、湛利生之池、神明垂納受、我等成所願乎、仰願十二所権現、伏乞三所垂跡、早並利生之翅、凌左遷海中之波、速施和光之恵、照帰洛故郷之窓、弟子不堪愁歎、神明知見証明、敬白再拝々々

この祝詞、一部分だけ引用しようとしたが、あまりにも全体に現金な思想が現れているので、全部引用することにした。「爰に利益の地を憑ずば、誰か歩みを嶮難の道に運ばん、権現の徳を仰がずば、何ぞ志を遼遠の境に盡くさん」、(ご利益がなきゃ、わざわざこんな辺鄙な場所にある社を拝みに何て来ねえよ。お前に助けて欲しいからこそ、こんな辺鄙な場所でも拝んでやってんだ)など現金にもほどがある。

2008-09-20

やったー、std::tr1:refが実装できたよ

TR1のrefを実装した。実装上の特徴、読みやすいコードを心がける。unary_functionとbinary_functionの両方を継承していても使える。多重継承を極力避ける。

実装方法は二転三転した。最終的にこのような実装になり、だいぶ満足している。Dinkumwareの実装よりは読みやすいだろう。

pastbinに貼り付けたソースコード

#ifndef HITO_REF
#define HITO_REF

#include <boost/type_traits/is_base_of.hpp>
#include <boost/type_traits/integral_constant.hpp>
#include <boost/mpl/has_xxx.hpp>


namespace hito {

namespace detail {

// this macro generates a metafunction has_result_type<T>.
// it returns true if T has nested type name T::result_type.
// otherwise, it returns false.
BOOST_MPL_HAS_XXX_TRAIT_DEF(result_type)


typedef char yes_type ;
struct no_type { char padding[8] ; } ;


template < typename T >
struct is_base_of_unary_function_impl
{
    template < typename R, typename T1 >
    static yes_type check( const volatile std::unary_function<T1, R> * ) ;
    
    static no_type check( const volatile void * ) ;
    
    static const bool value = sizeof( check( static_cast< T * >(NULL) ) ) == sizeof( yes_type ) ;   
} ;

template < typename T >
struct is_base_of_binary_function_impl
{
    template < typename R, typename T1, typename T2 >
    static yes_type check( const volatile std::binary_function<T1, T2, R> * ) ;
    
    static no_type check( const volatile void * ) ;
    
    static const bool value = sizeof( check( static_cast< T * >(NULL) ) ) == sizeof( yes_type ) ;   
} ;


// this metafunction returns true if T is derived from std::unary_function
// otherwise, it returns false.
template < typename T >
struct is_base_of_unary_function
    : boost::integral_constant< bool, is_base_of_unary_function_impl<T>::value >
{ } ;

// this metafunction returns true if T is derived from std::binary_function
// otherwise, it returns false.
template < typename T >
struct is_base_of_binary_function
    : boost::integral_constant< bool, is_base_of_binary_function_impl<T>::value >
{ } ;


// if T has nested type name result_type.
// because TR1 only mentions about result_type, 
// we couldn't use argument_types, and couldn't know if it is a unary function or binary function or both.
template < typename Derived, typename T >
struct generic_invocation
{
    typedef typename T::result_type result_type ;
    template < typename T1 >
    result_type operator () ( T1 const & arg1 ) const
    {
        Derived const & self = static_cast< Derived const & >( *this ) ;
        return self.get()( arg1 ) ;
    }
    
    template < typename T1, typename T2 >
    result_type operator () ( T1 const & arg1, T2 const & arg2 ) const
    {
        Derived const & self = static_cast< Derived const & >( *this ) ;
        return self.get()( arg1, arg2 ) ;
    }
} ;

// make base class. avoid multiple inheritance if possible.
template < typename Derived, typename T, bool is_unary, bool is_binary, bool has_result >
struct make_invocation_base
{

} ;

// if T is derived from unary_function.
template < typename Derived, typename T, bool val >
struct make_invocation_base< Derived, T, true, false, val >
    : std::unary_function< typename T::argument_type, typename T::result_type >
{
    result_type operator () ( argument_type const & arg1 ) const
    {
        Derived const & self = static_cast< Derived const & >( *this ) ;
        return self.get()( arg1 ) ;
    }

} ;

// if T is derived from binary_fucntion
template < typename Derived, typename T, bool val >
struct make_invocation_base< Derived, T, false, true, val >
    : std::binary_function< typename T::first_argument_type, typename T::second_argument_type, typename T::result_type >
{
    result_type operator () ( first_argument_type const & arg1, second_argument_type const & arg2 ) const
    {
        Derived const & self = static_cast< Derived const & >( *this ) ;
        return self.get()( arg1, arg2 ) ;
    }

} ;

// if T is derived from both unary_function and binary_function.
template < typename Derived, typename T, bool val >
struct make_invocation_base< Derived, T, true, true, val >
    : std::unary_function< typename T::argument_type, typename T::result_type >
    , std::binary_function< typename T::first_argument_type, typename T::second_argument_type, typename T::result_type >
{
    typedef typename T::result_type result_type ;
    
    result_type operator () ( argument_type const & arg1 ) const
    {
        Derived const & self = static_cast< Derived const & >( *this ) ;
        return self.get()( arg1 ) ;
    }
    
    result_type operator () ( first_argument_type const & arg1, second_argument_type const & arg2 ) const
    {
        Derived const & self = static_cast< Derived const & >( *this ) ;
        return self.get()( arg1, arg2 ) ;
    }

} ;

// else if it has nested type name result_type
template < typename Derived, typename T >
struct make_invocation_base< Derived, T, false, false, true >
    : generic_invocation< Derived, T >
{ } ;


// Primary Template for reference_wrapper_invocation.
// this class defines function call operator and inherites unary_function/binary_function or both.
template < typename Derived, typename T >
struct reference_wrapper_invocation
    : make_invocation_base< Derived, T
        , is_base_of_unary_function< T >::value
        , is_base_of_binary_function< T >::value
        , has_result_type< T >::value
     >
{ } ;

// unary function type
template < typename Derived, typename R, typename T1 >
struct reference_wrapper_invocation< Derived, R(T1) >
    : std::unary_function< T1, R >
{    
    result_type operator() ( argument_type const & arg1 ) const
    {
        Derived const & self = static_cast< Derived const & >( *this ) ;
        return self.get()( arg1 ) ;
    }
} ;

// pointer to unary function type
template < typename Derived, typename R, typename T1 >
struct reference_wrapper_invocation< Derived, R(*)(T1) >
    : std::unary_function< T1, R >
{
    result_type operator() ( argument_type const & arg1 ) const
    {
        Derived const & self = static_cast< Derived const & >( *this ) ;
        return self.get()( arg1 ) ;
    }
} ;

// pointer to nullary member function type
template < typename Derived, typename R, typename T1 >
struct reference_wrapper_invocation< Derived, R (T1::*)() >
    : std::unary_function< T1, R >
{
    result_type operator() ( argument_type & arg1 ) const
    {
        Derived const & self = static_cast< Derived const & >( *this ) ;
        // call T1's member function by a pointer.
        return (arg1.*self.get())( ) ;
    }
} ;

// pointer to nullary member function type with const qualifier
template < typename Derived, typename R, typename T1 >
struct reference_wrapper_invocation< Derived, R (T1::*)() const >
    : std::unary_function< T1, R >
{
    result_type operator() ( argument_type & arg1 ) const
    {
        Derived const & self = static_cast< Derived const & >( *this ) ;
        // call T1's member function by a pointer.
        return (arg1.*self.get())( ) ;
    }
} ;

// binary function type
template < typename Derived, typename R, typename T1, typename T2 >
struct reference_wrapper_invocation< Derived, R(T1, T2) >
    : std::binary_function< T1, T2, R >
{    
    result_type operator() ( first_argument_type const & arg1, second_argument_type const & arg2 ) const
    {
        Derived const & self = static_cast< Derived const & >( *this ) ;
        return self.get()( arg1, arg2 ) ;
    }
} ;

// pointer to binary function type
template < typename Derived, typename R, typename T1, typename T2 >
struct reference_wrapper_invocation< Derived, R(*)(T1, T2) >
    : std::binary_function< T1, T2, R >
{    
    result_type operator() ( first_argument_type const & arg1, second_argument_type const & arg2 ) const
    {
        Derived const & self = static_cast< Derived const & >( *this ) ;
        return self.get()( arg1, arg2 ) ;
    }
} ;

// pointer to urnary member function type
template < typename Derived, typename R, typename T1, typename T2 >
struct reference_wrapper_invocation< Derived, R (T1::*)( T2 ) >
    : std::binary_function< T1, T2, R >
{
    result_type operator() ( first_argument_type const & arg1, second_argument_type const & arg2 ) const
    {
        Derived const & self = static_cast< Derived const & >( *this ) ;
        // call T1's member function by a pointer.
        return (arg1.*self.get())( arg2 ) ;
    }
} ;

// pointer to urnary member function type with const qualifier
template < typename Derived, typename R, typename T1, typename T2 >
struct reference_wrapper_invocation< Derived, R (T1::*)( T2 ) const >
    : std::binary_function< T1, T2, R >
{
    result_type operator() ( first_argument_type const & arg1, second_argument_type const & arg2 ) const
    {
        Derived const & self = static_cast< Derived const & >( *this ) ;
        // call T1's member function by a pointer.
        return (arg1.*self.get())( arg2 ) ;
    }
} ;


} // namespace detail

template < typename T >
class reference_wrapper
    : public detail::reference_wrapper_invocation< reference_wrapper< T >, T >
{
public :
    typedef T type ;
    
    reference_wrapper( T & x )
        : object( &x )
    { }
    
    reference_wrapper( const reference_wrapper< T > & x )
        : object( &x.get() )
    { }
    
    reference_wrapper & operator = ( const reference_wrapper< T > & x )
    {
        if ( this != &x )
        {
            object = &x.get() ;
        }
        return *this ;
    }
    
    operator T & () const
    {
        return get() ;
    }
    
    
    T & get() const
    {
        return *object ;
    }

private :
    T * object ;
} ;

// reference_wrapper helper functions
template < typename T >
reference_wrapper< T > ref( T & t )
{
    return reference_wrapper< T >( t ) ;
}

template < typename T >
reference_wrapper< T > ref( reference_wrapper< T > t )
{
    return ref( t.get() ) ;
}

template < typename T >
reference_wrapper< T const > cref( T const & t )
{
    return reference_wrapper< T const >( t ) ;
}

template < typename T >
reference_wrapper< T const > cref( reference_wrapper< T > t )
{
    return cref( t.get() ) ;
}    


} // namespace hito

#endif // #ifndef HITO_REF

追記:
やはりどうも、メンバを参照で持つのは無理みたいだ。ポインタに直した。

2008-09-19

TR1のrefの実装が難しい

ふと、TR1のrefを実装しようと思い立った。それほど面倒になるとは思わなかったのだが、恐ろしく難儀している。一体このライブラリは設計した奴は変態ではなかろうか。誰にせよ、メタプログラムを呼吸している奴に違いない。かなり難しい。

普通に部分的特殊化だけで場合分けして実装していると、同じようなコードの重複が目立ってきたので、CRTPを使うことにした。これなら簡潔に記述できる。

ところで、行き詰ったところがある。ネストされた型名、unary_functionやbinary_functionを継承しているかどうか判別するメタ関数の書き方は分かる。result_typeがあるかどうかを判別するメタ関数の書き方も分かる。しかし、以下のコードはコンパイルが通るべきなのだろうか。

#include <functional>
#include <boost/static_assert.hpp>
#include <boost/type_traits.hpp>
struct Foo
    : std::unary_function<int, void>
    , std::binary_function<int, int, void>
{
    typedef void result_type ;
    void operator () (int x) const
    { }

    void operator () (int x, int y) const
    { }
} ;

template < typename T >
void check( T x )
{
    BOOST_STATIC_ASSERT(( boost::is_base_of< std::unary_function<int, void>, T >::value )) ;
    BOOST_STATIC_ASSERT(( boost::is_base_of< std::binary_function<int, int, void>, T >::value )) ;   
}

int main()
{
    check( std::tr1::cref( Foo() ) ) ;
}

ご存知のとおり、C++には、オーバーロードと多重継承がある。したがって、クラスFooはunary_functionでもあり、binary_functionでもある。ドラフト規格では、このコードがコンパイルエラーになるべきだとは言っていない。するとこのコードはコンパイルできるべきなのだろうか。しかし、もしコンパイル可能であるべきならば、reference_wrapperでも多重継承を使わなければならない。EBCOの観点から見て、あまり好ましくないと思うのだが。

ちなみに、DinkumwareのTR1の実装は、このコードをコンパイルできない。

TR1のrefについて

Boostには、refとcrefがあるが、TR1にもある。しかし、TR1の方が、より進化した実装である。というのも、boostのrefでは、以下のようなことができない。

FuncObj fn ;
std::for_each( v.begin(), v.end(), ref(fn) ) ;

なぜこれができないかというと、Boostの実装では、reference_wrapperが、単に参照を包むだけのクラスだからだ。TR1では、関数オブジェクトの場合、単項か二項として呼ぶことができる。問題は、一体どうやって、関数オブジェクトであるのか判断するのかということだ。

渡された型が、関数や関数ポインタである場合は、簡単なメタプログラムで判断できる。メンバ関数ポインタであっても同様だ。unary_functionやbinary_functionを継承していてもよい。ここまではいいとして、result_typeというネストされた型名があればよいという変態的な仕様となっている。このネストされた型名を判断するメタプログラムというのが、何とも変態的だ。

ネストされた型名を持っているかどうかを判断するメタ関数を生成するマクロの実装例が、Boostにある。<boost/mpl/has_xxx.hpp>というのがそれで、BOOST_MPL_HAS_XXX_TRAIT_DEFを使えばよい。

追記:
ドラフト規格では、Variadic Templatesを使って、任意の引数に対応できるようになっている。

2008-09-18

Expression Templateを解説しようとしたら収拾がつかなくなった

Expression Templateの検索クエリで飛んでくる人が多い。ここはひとつ、ETの簡単な説明をビシッと書いておこうと思い立った。それには、具体的なサンプルコードが必要だ。一番分かりやすいのは、配列同士の各要素への演算を、Lazyに行うことだろう。

えーと、各要素の足し引きができればいいかな。おっと、スカラー倍できるとなおいいな。いやまて、int型を直接使うのは面倒だ。いやなに、"We can solve any problem by introducing an extra level of indirection."という言葉がある。問題ない。さて、最後の仕上げに、遅らせてきた演算を実行、ってちょとまて、要素の数が分からないといけないな。コンパイル時にできるかな。いや、やっぱりいらんな。

なんてことをしていたら、サンプルコードが複雑になりすぎた。どうしてくれようこの長ったらしいコード。

#define USE_EXPRESSION_TEMPLATE


template < size_t N >
class Array
{
public :
    Array()
    {
        ptr = new int[N] ;
    }
    
    Array( Array const & array )
    {
        ptr = new int[N] ;
        memcpy( ptr, array.ptr, sizeof(int) * N ) ;
    }
    
    template < typename EXPR >
    Array( EXPR const & expr )
    {
        ptr = new int[ N ] ;
        for ( size_t i = 0 ; i != N ; ++i )
        ptr[i] = expr[i] ;
    }
    
    
#ifdef COMPILER_SUPPORT_RVALUE_REFERENCE
    Array( Array && array )
    {
        ptr = array.ptr ;
        array.ptr = nullptr ;
    }
#endif // COMPILER_SUPPORT_RVALUE_REFERENCE

    template < typename EXPR >
    Array & operator = ( EXPR const & expr )
    {
        ptr = new int[ N ] ;
        for ( size_t i = 0 ; i != N ; ++i )
        ptr[i] = expr[i] ;
        
        return *this ;
    }
    
    Array & operator = ( Array const & r )
    {
        ptr = new int[N] ;
        memcpy( ptr, r.ptr, sizeof(int) * N ) ;
        return *this ;        
    }
    
    ~Array()
    {
        delete[] ptr ;
    }
    
    int operator [] (size_t i) const
    {
        return ptr[i] ;
    }
    
    int & operator [] (size_t i)
    {
        return ptr[i] ;
    }

public :
    static const size_t size = N ;
    
private :
    int * ptr ;
} ;



#ifndef USE_EXPRESSION_TEMPLATE
// ordinary implementation.
template < size_t N >
Array<N> operator + ( Array<N> const & l, Array<N> const & r )
{
    Array<N> result ;
    
    for ( int i = 0 ; i != N ; ++i )
        result[i] = l[i] + r[i] ;

    return result ;
}

template < size_t N >
Array<N> operator - ( Array<N> const & l, Array<N> const & r )
{
    Array<N> result ;
    
    for ( int i = 0 ; i != N ; ++i )
        result[i] = l[i] - r[i] ;

    return result ;
}

template < size_t N >
Array<N> operator * ( int x , Array<N> const & r)
{
    Array<N> result ;
    
    for ( int i = 0 ; i != N ; ++i )
        result[i] = x * r[i] ;

    return result ;
}

template < size_t N >
Array<N> operator * ( Array<N> const & l, int x)
{
    Array<N> result ;
    
    for ( int i = 0 ; i != N ; ++i )
        result[i] = x * l[i] ;

    return result ;
}

#else USE_EXPRESSION_TEMPLATE
// Expression Template

struct plus
{
    static int apply( int a, int b )
    { return a + b ; }

} ;

struct minus
{
    static int apply( int a, int b )
    { return a - b ; }
} ;

struct mul
{
    
    static int apply( int a, int b )
    { return a * b ; }
} ;


template < typename L, typename Op, typename R >
class Expression
{
public :
    Expression( L const & l, R const & r )
        : l(l), r(r) { }
        
    int operator [] ( size_t i ) const
    {
        return Op::apply( l[i], r[i] ) ;
    }
        

private :
    L const & l ;
    R const & r ;
} ;

template < typename L, typename R >
Expression< L, plus, R > operator + (L const & l, R const & r)
{
    return Expression< L, plus, R >(l, r) ;
}

template < typename L, typename R >
Expression< L, minus, R > operator - (L const & l, R const & r)
{
    return Expression< L, minus, R >(l, r) ;
}


// this class is a wrapper for int.
class IntHolder
{
public :
    IntHolder(int value)
        : value(value) {} ;
    int operator [] ( size_t ) const
    { return value ; }// always returns same value.
private :
    int const & value ;
} ;



template < typename L >
Expression< L, mul, IntHolder > operator * (L const & l, int r)
{
    return Expression< L, mul, IntHolder >(l, IntHolder(r) ) ;
}

template < typename R >
Expression< IntHolder, mul, R > operator * (int l, R const & r)
{
    return Expression< IntHolder, mul, R >(IntHolder(l), r ) ;
}

#endif

int main()
{
    size_t const N = 10000000 ;
    Array<N> a, b, c, result ;
    
    // 適当に初期化
    for ( int i = 0 ; i != N ; ++i )
    {
        a[i] = 1 ;
        b[i] = 10 ;
        c[i] = 100 ;
    }
    

    result = 123 * a + 40 * b - 2 * c * 2 + b + a + 10 * c * 40 ;

    
    std::cout << typeid(123 * a + 40 * b - 2 * c * 2 + b + a + 10 * c * 40).name() << std::endl ;
    std::cout << result[0] << std::endl ;
    
}

結果は次のとおり。

class Expression<class Expression<class Expression<class Expression<class Expression<class Expression<class IntHolder,struct mul,class Array<10000000> >,structplus,class Expression<class IntHolder,struct mul,class Array<10000000> > >,struct minus,class Expression<class Expression<class IntHolder,struct mul,class Array<10000000> >,struct mul,class IntHolder> >,struct plus,class Array<10000000> >,struct plus,class Array<10000000> >,struct plus,class Expression<class Expression<class IntHolder,struct mul,class Array<10000000> >,struct mul,class IntHolder>>
40134

要するにコンパイル時にテンプレートパラメーターを使って、式の構造を捕らえているに過ぎない。

この途中の型を捕らえておくために、autoが必要だ。

それに、Expression Templateは、何もわざわざ名前をつけるほどの技巧でもないような気がする。Andrew KoenigのRuminations on C++で腐るほど例がある。もっとも、あちらは実行時の話で、こちらはコンパイル時の話だが。

Google Chromeの最新版ビルド

Google ChromeのDevチャンネルは、毎週アップデートされる。ただし、十分にテストされていない。

BetaチャンネルからDevチャンネルに移るには、Dev Channel: Early Access to Features and Fixesから、Google Chrome Channel Chooserをダウンロードして実行し、ダイアログで切り替える。そのあと、メニューからAbout Googleを選べば、アップデートできる。

ちなみに、release notesを見ると、今現在、一般ピーポーに興味のありそうな変更点としては、Silverlightのプラグインが正しく動作しなかったのと、YouTubeなどのFlashの変な挙動を直したそうだ。

他には、新しいbackend featureが二つ実装されている。ただし、まだ不安定。これを使うには、上記の方法でDevチャンネルに移ってアップデートした後、コマンドライン引数に"--new-http"や"--magic_browzR"を与えればよい。それぞれの詳しい説明はrelease notesを参考の事。ただし、わざわざオプションで指定するぐらいだから、まだまともに動かない。

参考:Google offers cutting-edge Chrome, first update | Business Tech - CNET News

2008-09-17

C++WG会議に参加できるチャンスのお知らせ

このたび、日本のC++WGで、一般参加可能なアドホック会議を開くことになりました。

内容は、十月に公開されるC++0xのCD(Committee Draft)に対する、アラ探しです。今現在、サンフランシスコでCDを出すべく会議が行われています。公開されたCDを受けて、各国支部では、スペルミス、文法間違い、あるいは規格が矛盾している箇所などを探し出して検証し、会議で話し合います。

CDは以下のWebサイトで十月に公開されます。
JTC1/SC22/WG21 - The C++ Standards Committee

自分が話についていけるかどうか分からないという人のための、己の力量を測る目安としては、最新のState of C++ Evolutionからリンクされている各種ペーパーを読んでいる人ならば、十分話についていけることでしょう。

開催日時は、十二月五日の午前十時から午後五時まで。都合により、最初から参加できなくてもかまいません。場所は東京タワーの隣の機械振興会館。

人数に限りがあります。

参加を希望する人は、以下のブログから申し込んでください。
C++WGアドホック会議開催のお知らせ - Faith and Brave - C++で遊ぼう

また、参加はしないけれど、CDに間違いを発見したという人は、私かfaith and braveブログのアキラさんにでも告げてくれれば、代弁できます。

何か疑問があれば、どうぞ。

ついにプロセッサも3Dの世界に

World's First Stacked 3D Processor Created - Tom's Hardware

As processors continue to head in the direction of miniaturization, with an ever increasing number of cores, some design engineers believe miniaturization will eventually hit a limit and the only direction left to go will be upwards.

これぞ真の3Dプロセッサ。いやしかし、プロセッサの将来は多段構造になるのか。

2008-09-16

日本の政治はいつ変わるのか

Googleは、Google VideoやYoutubeが政治のあり方を変えたと主張しているが、残念ながら、日本の政治はまったく変わっていない。相変わらず、選挙活動といえば、名前の連呼行為を指すのだから。街頭に出て、演説と主張する騒音を撒き散らすより、youtubeに動画を上げるほうがどれほど効果的か。法律? 変更すればいいだけの話だ。

Official Google Blog: The future of online video

嫌いなゲーム

コーエーの出している歴史シミュレーションゲーム。吐き気がするほど嫌いだ。

例えば日本の戦国時代を舞台としているのに、月代剃らぬ頭、おはぐろせぬ歯、縫い取り不可能な衣服、日本には存在しない染料、フランベルジェのような刀、フルプレートのような甲冑、無礼極まりない呼称、六尺を超える身長、デカ過ぎる馬、等々。

ああ、嫌いだ嫌いだ。

平家物語の時代の御所について

前回、頼政が北の門を守るのに、三百人は十分ではないかと書いたが、どうもこれは少ないかもしれない。

というのも、現在の御所は、当時の御所ではないからだ。今の御所は、南北朝時代の御所である。当時の大内裏は、東西1.2km、南北1.4kmほどもある、広大な面積を有していたらしい。これならば、例え平家三万人が守護に当たっても、一人当たりの面積は56平方メートルである。もちろん、実際には建物が多かっただろうが、面積だけで考えれば、三万人と云う人数も、あながちおかしくは無い。無論、三百人は少なすぎである。

御輿振

はたまた平家物語と源平盛衰記の比較を試みんとす。今回は、御輿振の部分を比較する。

まず、問題なのが、御輿振の起きた年だ。日付については、どちらも四月十三日辰の刻になっているのだが、年号が合わない。平家物語は、安元三年となっているが、源平盛衰記は、治承元年となっている。じつは、これはどちらも1177年を表すのだが、どちらが正しいかと言えば、平家物語の、安元三年の方が正しい。というのも、安元三年の八月四日から、治承元年に年号が切り替わっているからだ。したがって、治承元年の四月十三日というのはありえない。もちろん、どちらも1177年を表すのだから、混乱しやすいことではある。だからこの不一致は、些細な問題だろう。どちらも意味するところは同じだ。

次に源氏方の人数だが、平家物語では、「其勢纔に三百余騎(中略)所はひろし勢は少し、まばらにこそみえたりけれ」、となっているが、源平盛衰記では、「三十餘騎にて固めたり」、となっている。平家物語は、ことさらにその勢の少ないことを強調しているが、源平盛衰記の十倍も多い。源平盛衰記は、さらっと三十余騎としているだけである。勢が少ないことに言及する文章は無い。

参考にしている友朋堂文庫は、「餘」という漢字を使っているが、これは平家物語の参考にしている、岩波書店の配慮で新字に直しているだけだろう。

どちらの人数が正しいのかは、ちょっと分からない。ただ、山門の大衆から門を守るのなら、殿下の乗合の場合とは違って、三百人いてもおかしくはないが、勢が少ないかというとちょっと疑問だ。というのも、所詮は京都の御所である。三百人もいれば十分という気がしないでもない。それどころか、三百人は結構多いのではないかと思う。源平盛衰記は、三十人とだけ記していて、勢の少ないことには一切筆を労していないが、三十人が、御所の門を守るのに少ないというのは、言はれなくても自ずから明らかである。

また、長七唱(源平盛衰記では、丁七唱と表記する)の言葉使いにも、違いが見られる。平家物語では、すべて「候 」という言葉を使う。しかし、源平盛衰記では、大部分が「侍り」という言葉になっている。

ところで、平家方の人数は、唱をして言わせているのだが、これがまた面白い。平家物語では、単に大勢と言っているに過ぎないが、源平盛衰記では、三萬餘騎としている。言葉のあやなのだろうが、三万人は多すぎである。たとえ御所を更地にしても、入るかどうか怪しいものだ。

追記:
上の一文、教養不足のため誤りかもしれない。

2008-09-15

清盛は意外と現実的な性格をしていたらしい

源平盛衰記に曰く。承安四年は、春から夏にかけて旱魃が起こり、川が干上がったという。そこで、澄憲という坊主が、五月二十四日と二十五日に、竜神に祈ったところ、見事に雨を降らせたという。勤賞として、大僧都の位に上げられた。

これを聞いて、太政入道、

加様に上一人より下萬民に至るまで、難有事にこそ感嘆しけるに、太政入道はあざ咲いて、人の病の休比に、醫師は験あり、是を醫師の高名と云様に、春の比より旱して、五月雨の降比に説法仕合わせて、澄憲が高名と人の沙汰すらん事、いとをかしき事なりとて興なくぞ被申ける。

と言ったらしい。浄海入道の言、もっともさることに存じ候。ただし、源平盛衰記では、この部分でも、清盛が信心のない悪人として書かれているが。

注記:友朋堂文庫の印刷の、笑うという字がunicodeになければ、辞書にも載っていない。口辺に、つくりは、上部が八で、下部が天。

追記:
コメントにより、咲の異字体であることが分かったので、咲を用いることにした。たしかに、手元の新字源を引くと、咲の異字体として載っており、しかも、読みに「わらう」がある。しかも、意味が、しなを作って笑う意を表すとある。他にも、喜んでわらう。あざけってわらう、という意味も載っており、この文章の意味に合致する。しかし、昔は、同じ読みでも、その微妙な意味の差によって、漢字を使い分けていたのだろうか。なんとコンテキストセンシティブなことか。

デストラクタが必要な場合、コンセプトに記述すべし

以下のコードは、ill-formedで、コンパイルエラーになるべきである。

auto concept Foo< typename T >
{  T::T() ;  }


template < typename T > requires Foo < T >
void f()
{
    T x ;
    // ill-formed. concept Foo does not specify destructor.
}

コンストラクタとデストラクタは、忘れやすい。用心が肝要なり。

2008-09-14

源平盛衰記は、意外と史実に則って書かれているのかもしれない

さて、このたび、幸いにも源平盛衰記を手に入れ、味わいつつ読んでいるのだけれど、その内容の詳細なことに驚いている。

例えば、殿下の乗合の話だが、平家物語では以下の次第になっている。

嘉応二年十月十六日の事、資盛が、狩りの帰りに、御所より御参内途中の基房の車に参り合わせたが、礼儀を知らない若侍ばかりだったので、車より降りて道を譲ることをせず、そのまま無理やり押し通ろうとした。その結果、基房の家来達に、散々に打擲された。資盛はほうほうの体で家に帰り、なぜか親父の重盛ではなく、祖父の清盛に訴えた。重盛の諫めも聞かず、清盛は大いに怒って、田舎侍を召して、主上御元服の会議のときに、資盛の車を待ち受けて襲い、「前驅御随身どもがもとゞりきッて、資盛が恥すゝげ」と命ずる。そして、兵ども、ひた甲三百余騎が、十月二十一日に、基房の車を襲い、もとどりを切ったとある。

しかし、いくつかの旧記によると、史実は違ってくる。まず、乗合が起きたのは、十月ではなく、七月三日であった。しかも資盛は狩りの帰りではなく、女車に乗っていた。基房はその後、狼藉を働いた随身達を、重盛の下へ送って、処分を任せているのだが、重盛は何とも言わずに送り返している。怒っていることは間違いない。基房は自分で処分した。さて、十六日に基房が出かけようとすると、道の途中に武士たちが待ち伏せをしているではないか。そこで基房は、その日に出かけることを取りやめた。そして主上御元服の十月二十一日に襲われた。さらにある書籍によると、直接的な記録は無いけれども、どうも侍をして基房を襲わせたのは、清盛ではなく、実は重盛だったのではないかと推測している。理由は色々述べられているが、だいぶ長いので、引用するのは控える。

さて、源平盛衰記ではどうなっているかと言うと、

同二年七月三日、後白河法王が法勝寺に御行なされるので、基房は参るために、三条京極を過ぎて、三条面に差し掛かった。そこで、女房の車に出会った。車より降りるべきだと言うが聞き入れなかったので、すだれを切り落として、逃ぐるを追い、散々に打擲した。実はこの車に乗っていた人物こそ、資盛で、笛の稽古から帰る途中であった。資盛はまず、父親の重盛に訴えるが、殿下にたいして無礼である。礼儀知らずの報いだと逆に叱られる。後に基房の方でも、清盛の孫であったと知って、随身の者達を重盛の下へ謝りに行かせる。重盛は大いに畏まって、すぐに返したが、基房側で、随身達を処分する。清盛が処分の沙汰を聞いて、理由を尋ねると、初めて資盛は清盛に事の次第を話す。清盛は大いに怒って、重盛の諫めも聞かず、難波妹尾に恥をすゝげと命ずる。そして、日付は書いていないが(二十二日の朝に、重盛宅に皮肉な置物が置いてあったとはあるし、会議は十月二十一日であったのはよく知られていたのかも)、基房は大内の御直蘆(宮中の客室に泊まること、つまり泊まる必要があるほどの、主上御元服の会議)があるので、出かけていくと、「兵具したる者三十騎計走出て」、散々に打ち据えたあげく、随身達のもとどりを切ったとある。この戦いの様子が、かなり詳しく書かれている。

だいぶ史実に近い。まず、乗合の起こったのは、七月三日である。平家物語が十月にしているのは、すばやい展開を演出したかったのだろう。資盛は女車に乗っていて、笛の稽古の帰りであった。つまり、狩りの帰りではなかったのだ。平家物語では、狩りの帰りとすることによって、血気盛んな若者達であることを強調したかったのだろう。家に帰ってまず初めに訴えたのは、父親。当然だ。何しろ、当時資盛は十歳ぐらいなのだ。まず親父に云いつけるに極まっている。基房が随身達を謝りに行かせるのも記述している。そして、襲撃の人数は、三十人ばかり。これも現実的だ。この程度の事で、市内の一所に武士が三百人も集まるのは、非現実的である。京都に住んでいると、これがよく分かる。

しかし、源平盛衰記は漢文が多い。とくに友朋堂文庫なので、最近の軟弱な書籍と違って、訓読に直してはいない。レ点、一二三点、上中下点を読み解かねばならない。就中といった言葉に大しても、書き直さず、レ点を振っているのは、現代の書物ではなかなか見られない。

高DPIの時代はまだか

Engineering Windows 7
The Windows Feedback Program
Follow-up on High DPI resolution

なんでも、HD動画をネイティブ表示できるディスプレイを持っているものは一割しかおらず、Windowsユーザーの半数は、ネイティブな解像度に設定していないという(しかも、1600x1200のディスプレイのユーザは、68%が解像度を低く設定しているとか)

あとは、知っている人なら、Vista発売前から知っていたが、Vistaの高DPI時のスケーリング機能だとか。

まあそれはともかく、高DPIの時代は早く来て欲しい。96DPIは低すぎる。日本語をまともに読むためには、300か400DPIは欲しいのだ。以前、この愚痴をこぼしていたら、外人に、「おいおい、フォントサイズをでかくすりゃ日本語だって読めるだろが。ほれ画像があるぞ。これが読めないってことは、おまえ日本人じゃねーぞ。」などと言われたが、連中はわかっていない。こと漢字は、アルファベットほど単純ではないのだ。所詮奴らは、まともに漢字が読めず、単に記号として認識しているからそんなことが言えるのだ。いくらドットが荒くとも、大きくすればもちろん読めるが、正直言って、そんな字を読むのは苦痛だ。紙に印刷してある字には勝てない。日本の書籍の印刷の質が、海外に比べて格段に良いのは、日本語の文字のおかげなのではないかと思うほどだ。

それに、ディスプレイの物理的なサイズも、もう限界である。今現在、24インチの1920x1200な液晶ディスプレイを使っている。もっと解像度が高ければとは思うが、これ以上のサイズのディスプレイは、さすがに使いたくない。だから、DPIを上げるしかない。ああ、400DPIの時代はまだか。96DPIの約四倍だから、24インチのディスプレイが、7680x4800の解像度になるわけだ。

しかし、DPIという言葉が嫌いなのだがどうにかならないものか。何故この時代に、人間を基準とした長さの単位を使わなければならないのか。英国と合衆国の奴らめ。

2008-09-13

C++0xは使われるようになるのだろうか

C++0xをまともに解説できる日本人はいるのだろうか。理解できる日本人なら腐るほどいるとしても、日本語として解説して、一冊の教科書を書き上げるほどの人間は、しばらくは出てこないだろうと思われる。そうしてみれば、結局規格を直接読んで学ぶしかないのだが、さて。

http://pc11.2ch.net/test/read.cgi/tech/1214407525/449-

449 名前:デフォルトの名無しさん[sage] 投稿日:2008/09/13(土) 03:14:42
まあ、新しい関数宣言は人のソース読むときには知っとかなきゃならんな…
こんなんだよな

[]main(int argc, char *argv[]) -> int{return 0;}

きめえwwwwwwwwww
自分では絶対に書かない

やれやれ、現時点でn2541すらまともに読もうとする人間がいないのだから、C++0xがまともに学ばれることはないだろう。

現在のドラフトでは、正しくは以下のとおり

auto main(int argc, char *argv[]) -> int { return 0; }

十四時間たった後も、いまだに訂正するものが現れない。要するにだれもペーパーを読んでないということだ。C++0xの将来は暗い。ん、俺? いやISPがちょうど2chから規制食らっているし。

ちなみに目的としては、すでにlambdaに似たような構文があるのと、もうひとつ重要なことに、次のコードが通ること

template < typename X, typename Y >
auto f( X x, Y x ) -> decltype(x + y) ;

これを既存の関数宣言の文法でやろうとしたら、次のようになるはず(こんな糞コードまともに書ける自身が無い)。

template < typename X, typename Y >
decltype( *static_cast<X*>(nullptr) + *static_cast<Y*>(nullptr) )
f(X x, Y y) ;

何故かと言うと、まだxやyといった識別子は定義されていないため。そこでNULLポインタをキャストして参照して使う必要がある。decltypeは、式が評価された場合の型であるので、nullptrでもかまわない。識別子の特定を、関数宣言全体をパースするまで遅らす? それはないだろう。

追記:n2582について(やべ、不勉強で知らなかったorz)

n2582は、n2541を置き換える提案で、そのタイトルの通り、Unified Function Syntaxを規格に入れようというものです。その場合は、autoではなく、[]になります。したがって、449のコードは正しい。この規格はさらに、ローカル関数や名前付きlabmda関数を定義できます。

入ったら面白そうなんだけど。時間的に厳しいんじゃないのかなぁ。n2541がすでにドラフト規格に入っている上で、さらにこれを変えるとか、どうなるんだろう。でも面白そうな機能だよね。

追記2:n2705のNew work for Evolutionについて

このへんスルーしてたけど、いま見たら面白そうなものばかり。なんだか、C++0xは一生かかっても決まりそうにない雰囲気。規格が決まっても、五年後に問題噴出なんだろうな。

追記3:
よくみたら、過去に言及してる。忘れていたとは面目ない。

追記4:新しい予約語を導入すること

もうこの段階では、確実に無理。それに、lambda-captureは必要だし。

Chromeに送ったバグリポート

一応言語を英語にしたうえで、英語で送ってみた。送ったバグリポートは二つ。

フォームで、IMEが時々効かなくなる。その場合、アドレスバーにキーボードフォーカスを移し、何か入力し、フォームにフォーカスを戻すと、再びIMEが使えるようになる。

たとえ必要なフォントをすべてインストールしてあっても、いくつかのUnicode文字が表示できない。たとえば、このページの最初に表示できない文字は、
॥ 'DEVANAGARI DOUBLE DANDA' (U+0965)
である。

米騒動は面白いところへ。

風評被害を予想してみる。

酒や、米を直接使う食品は分かりやすいけれど、それ以外はどうなのだろう。

米を間接的に使う食材はどうなのかな。豚など、汚染された米が飼料になっていなければいいが。

関西で肝臓がんが多いのはこの為などという噂も。

うーん、噂って面白いね。どんどん尾ひれがついていく。

21 名前:名無しさん@九周年[] 投稿日:2008/09/13(土) 01:31:06 ID:V9REAeEP0
332 :名無しさん@九周年:2008/09/12(金) 23:51:01 ID:Wngszw7w0
食品安全委員会:平成19年度における食品安全確保総合調査実施状況
ttp://www.fsc.go.jp/senmon/anzenchousa/anzenchousa19keikaku.html
昨日、「中止」だったのに「平成20年度に実施中」に変更されてる・・・


昨日の今日で内容書き換えてやがる
内閣府直轄の食品安全委員会まで捻じ曲げ始めた
自分たちの体制を追認させる気だ
マジにもう駄面じゃんこの国の政府機関は

366 名前:名無しさん@九周年[sage] 投稿日:2008/09/13(土) 02:13:34 ID:H1ejw43E0
>>21
表記上の更新日:更新日:平成20年5月14日
ページの更新日時:2008年9月12日 17:08:54

あぁ、さすがだよ…。

2008-09-12

アメリカってまだマイコトキシンのプロパガンダやってたのかな

毒米で有名になっているが、ふとつぎのようなコピペが気になった。

アフラトキシン が極微量で死に至らしめるコストパフォーマンスに優れる毒物である証拠に、 イラクの生物兵器として製造されていました。
http://tokyo.usembassy.gov/j/p/tpj-j20030320d2.html#%E7%94%9F%E7%89%A9%E5%85%B5%E5%99%A8

2002年の話らしいが、こんな面白いプロパガンダを知らなかったとは。さすがはアメリカだ。敵国をおとしめるためならば、トンデモなプロパガンダをやるものだ。

アフラトキシン、つまりはマイコトキシンなわけだけれど、アメリカは1980年の初めにも、ソ連がマイコトキシンを生物兵器として使ったというプロパガンダに多額の金をかけている。1981年9月13日、国務長官のアレキサンダー・ヘイグは、ソ連がマイコトキシンをラオス、カンボジア、アフガニスタンにばら撒いたと発表した。その証拠も挙げられたのだが、カンボジアの一枚の木の葉と一本の小枝を調べたというもので、科学者達が追って証明しようとしても悉く失敗したという話だ。そもそも、確実に殺すためには、精製したトキシンが、一平方マイルあたりに、三トン必要だという試算から考えても、馬鹿げた話だ。たった数十リットルのアフラトキシンをばら撒いてどうしようと言うのか。すでによく知られた神経ガスのほうが、よほど効率がいい。

参考:
殺人・呪術・医薬―毒とくすりの文化史 ジョン・マン著 山崎幹夫訳  東京化学同人出版
ISBN-10: 4807904280

2008-09-11

なぜ中国語フォントはこんなにも汚いのか

何故中国語のフォントはあんなにも汚いのだろう。中国語のフォントには平仮名なども入っているが、この平仮名もまた汚い。単に日本語を良く知らない者の手によって作られたフォントなのだろうか。あるいは、中国人の筆に合わせた文字なのだろうか。Windowsに標準で入っているフォントがこんなに汚いとはどういう了見だろう。中国語のフォントでは、ビットマップフォントが使われないようだから、小さいサイズでは汚くなるというのは理解できるのだが。

何故中国語のフォントはあんなにも汚いのだろう。中国語のフォントには平仮名なども入っているが、この平仮名もまた汚い。単に日本語を良く知らない者の手によって作られたフォントなのだろうか。あるいは、中国人の筆に合わせた文字なのだろうか。Windowsに標準で入っているフォントがこんなに汚いとはどういう了見だろう。中国語のフォントでは、ビットマップフォントが使われないようだから、小さいサイズでは汚くなるというのは理解できるのだが。

何故中国語のフォントはあんなにも汚いのだろう。中国語のフォントには平仮名なども入っているが、この平仮名もまた汚い。単に日本語を良く知らない者の手によって作られたフォントなのだろうか。あるいは、中国人の筆に合わせた文字なのだろうか。Windowsに標準で入っているフォントがこんなに汚いとはどういう了見だろう。中国語のフォントでは、ビットマップフォントが使われないようだから、小さいサイズでは汚くなるというのは理解できるのだが。

何故中国語のフォントはあんなにも汚いのだろう。中国語のフォントには平仮名なども入っているが、この平仮名もまた汚い。単に日本語を良く知らない者の手によって作られたフォントなのだろうか。あるいは、中国人の筆に合わせた文字なのだろうか。Windowsに標準で入っているフォントがこんなに汚いとはどういう了見だろう。中国語のフォントでは、ビットマップフォントが使われないようだから、小さいサイズでは汚くなるというのは理解できるのだが。

向上心

たまたま、ブログを更新する意欲が沸いているので、今のうちに、前から気になっていた、このoldnewthingの記事を紹介してみようと思う。

The Old New Thing : Tales from the interview: Anticipating your own incompetence is not a good interview strategy

ある日のこと、就職の面接試験で、プログラマとしての地位を訊ねるという問題があった。最初の面接官が、将来のキャリアについて訊ねるというものだ。
「五年後、あなたはどんな役職になっていると思いますか?」

「五年後は、プログラムマネジメントをしていると思います」

これは悪くない答えだ。多くの人が、プログラミングというものを、段階を踏むマネジメントであると思っている。そうである必要はないが、王道のキャリア道とでも言うべきだろう。

私の同僚は、さらに深く追求した。
「何故あなたはプログラムマネジメントをしているのですか?」

「えーとですね。五年もたてばですね。今いる凄い学生達がみんな卒業してですね。就職してくるんですね。みんな僕より頭良くて、しかも最新の技術を知っているんですね。だからもう僕なんかは、プログラマとしてやっていけないんですね。だから管理職になるしかないんです」

キャリアの見通しが、新しいスキルを身につけず、時代についていこうとせず、管理職に成り下がるのは、哀れだ。面接で言うべからず。

「そうである必要はない」というのは、Raymond Chenは管理職の権利を持っていながらにして、第一線で活躍しているということだ。思えばこの人、1992年からマイクロソフトにいて、いまなお現役なのだから、この業界としてはかなりの古株だ。この世界で十六年も現役を続けるには、非凡な才能と向上心が必要だ。まあ凄いといえば、Dave Cutlerに言及しないわけにはいかないが。

自分は、あと何年続けられるだろう。特に職業プログラマではなく、趣味にとどめておこうと思っている身としては、興味が尽きたらそれまでになってしまう。まあむしろ、C++0xのドラフトを読むなんて、趣味でもなければできないことだが。

IE8はJSONをネイティブにサポートする

IEBlog : Native JSON in IE8

JSONというのは、Ajaxに良く用いられるデータのフォーマットだ。便利なことに、合法なJavaScriptのコードでもある。単にJSON文字列をeval()に食わせるだけで、処理できる。

しかし、eval()というのは重い処理であるし、そもそも、セキュリティ上の問題などもある。幸いにして、JavaScriptはJSONパーサーを実装できるほど柔軟性があり、既に有名なライブラリもいくつかあるが、それとて生のeval()よりマシというだけで、根本的な解決にはならない。

というわけで、IE8のJavaScriptには、JSONのパーサーが入るらしい。これなら速度も、セキュリティも、問題ない。

Google Chromeのフォーム内の日本語フォントのおかしい理由が分かった

Google Chromeを使っていて、文字列を入力するフォーム内の日本語がおかしいと、常々思っていた。フォーム内の日本語は、とても異質に感じられるのだ。だいたい、句読点などの描画位置もおかしい。

私は最初、フォントのサイズが小さいためだと思っていたが、どうもそうではないらしい。第一、Google Chrome以外は、例えどんなにフォントが小さくても、それなりの描画をするからだ。Google Chromeの文字列の描画が独自のものか、Windowsに頼っているのかは知らないが、とにかく句読点の描画位置がおかしいなどと言うことはない。

実は、フォーム内の漢字は、日本語ではなかったのだ。そう、繁体字、あるいは、Traditional Chineseと呼ばれる文字だったのだ。

しかし、何故日本語の漢字が、繁体字として描画されているのか。色々と試した結果、実にあほらしいことが判明した。

Google Chrome自体の言語(ブラウザのメニューやダイアログなどの言語)を、English(United States)にしていると、Chromeはフォーム内の漢字を繁体字として描画する。
日本語に設定してあると、日本語の漢字として描画する。
Webサイトに送る"ja-jp"などの文字列ではなく、ブラウザの表示言語が、フォントの描画に影響するとは。

ブラウザ自体の言語の設定が、フォントのレンダリングに影響を与えるとは驚きだ。私のUnicodeに関する理解は薄いが、乏しい知識から考えてみれば、Unicodeでは、漢字と言うのは基本的に、CJK Unified Ideographs(CJK統合漢字)であって、中国と日本の同じ漢字は、例え多少字体が違おうとも、同じコードに割り当てている。すると、繁体字と日本語のどちらで描画するかは、Unicodeの上では区別できないということになる。つまり、日本語フォントを明示的に指定していないフォーム内のCJK統合漢字の描画は、ブラウザがどのフォントを漢字用に使うかにかかっている。Windowsネイティブでは、フォントリンクと呼ばれているこの機能、Google Chromeはブラウザ自体の設定言語が合衆国英語の場合、中国語フォントを選ぶのだ。

しかしどうすればいいのだろう。ブラウザ自体の言語には日本語を使うしかないのか。

追記:ちょっとしたテストをしてみる。

これは日本語フォントを使っているので、日本語で描画されます。Unicodeでは、漢字はCJK統合漢字として、同じ漢字は、中国、日本、台湾と、微妙な差異があったとしても、同じ符号を割り当てます。

これは中国語フォントを使っているので、中国語で描画されます。Unicodeでは、漢字はCJK統合漢字として、同じ漢字は、中国、日本、台湾と、微妙な差異があったとしても、同じ符号を割り当てます。

WebがOSに取って代わられる時代は、まだ来ない

以前から言われていたことだが、Google Chromeの登場の際にも、前衛的な人や理想主義者の言に、「これからは、Webが主流になり、ほとんどのアプリケーションはWebアプリになるので、WindowsだとかMacだとかLinuxだとかのOSの違いは、どうでもよくなる。」というものがある。考え方としては面白いが、どうもまだしばらくは、そんな時代はやって来そうに無い。

Windows にしても Linux にしても,タイムシェアリングの根本的なところで,ハードウェアタイマである Programmable Interval Timer (PIT) に依存している*1.PIT はひとつしかないため,こいつの割り込み間隔を変えるとスレッドスケジューラの動作がまるで変わってしまい,結果的に全プロセスが影響を受ける.timeBeginPeriod(1); が行っていることは,つまりはそういうことだ.消費電力的にこれはどうよ? という声は根強い.

NyaRuRuの日記 (追記2) Chromium (Chrome) のタイマ精度 (2)

HPETは私の使っているマザーボードにもついているのだが、実は何と、BIOS設定のデフォルトでは、無効になっていた。有効にすると、QueryPerformanceCounterの精度が飛躍的に上がったのは、以前の話だ。しかし、恩恵を受けられるのは、Vista以降である。

いまだOSにこういう問題がある以上、OSの差異などどうでもよく、すべてがWebに取って代わられる、などということは、近い将来にはなさそうだ。まだハードの上で向上すべきところが多数あり、OSもハードの進化に合わせて更新されなければならないからだ。

SliverlightがH.264をサポートするらしい

どうも、Silverlightが将来、H.264をサポートするらしい噂が広がっている。たしかに、それは素晴らしいことで、マイクロソフトがやることだから、Flashよりもよい描画のパフォーマンスを期待できそうだ。

しかし、MSはだいぶSilverlightに本気らしい。今まで知らなかったのだが、Mac版も用意し、Linux版のmoonlightの開発を助けたりと、かなりの本気度が感じられる。最初にSilverlightを発表したときは、まさかFlashの牙城を崩せはしないだろうと思っていたが、H.264をサポートするならば、あるいは可能かもしれない。面白くなりそうだ。

2008-09-10

Google Chromeを使うとファンの回転数が上がる理由

この前、CPUクーラーのグリスを塗りなおしたところ、CPU温度は十度以上下がり、もってファンをコントロールする目安となるCPU温度も下げることを得、しかもファンはとても静かになった。ところが、Google Chromeを導入してからというもの、ファンの回転数がわずかに上がったような気がする。2ch.netでは、Google Chromeを起動するとファンが爆音を発するという人もいる始末。これは一人私の環境だけのせいではあるまい。しかし、Google Chromeは、別にCPU時間を大量に消費しているわけではない。Chromeはマルチプロセスであるが、ご存知の如く、プロセスと言う実行単位はない。実行されるのはあくまでスレッドなので、マルチプロセスは関係ない。これは一体どういうことか。

どうも、Google ChromeはtimeBeginPeriod(1)を使用しているらしい。
NyaRuRuの日記 Chromium (Chrome) のソースを読む

timeBeginPeriodは、一種魔法のAPIのように見える。これさえ呼び出せば、タイマーの精度が見違えるほどよくなるのだ。しかし、これには仕掛けがある。MSDNを読めば分かるように、タイマーの精度を上げるということは、それだけスレッドの切り替えを頻繁に行わなければならないということだ。考えてみればその通りで、シングルプロセッサ環境で、1msecの精度を実現するのに、あるスレッドが2msecも走っていたのでは、到底おぼつかない。そんなわけで、スレッドのスケジューラは、指定されたタイマー精度を考慮して、スレッドの切り替え時間を変えなければならない。スレッドの切り替えが頻繁になると、それだけタイマーの精度は上がるが、全体としてのパフォーマンスは落ちる。

それだけではない。最近はコンピュータの省電力性が大いに叫ばれ、ハードもソフトも省電力を実現するための機能を備えているが、timeBeginPeriodを悪用すると、この省電力機能が働かなくなる。すべて、要求されたタイマー精度の実現を最優先するためだ。

当然の如く、これらの設定はグローバルなもので、システム全体に影響を及ぼす。だから、よく言われるおまじないのようなものがある。曰く、「このソフトは、Windows Media Playerと一緒に起動していると、キビキビ動くようになるぜ」といった類のおまじないだ。Windows Media Playerは、音声や動画を再生するソフトウェアなので、当然の如く時間にシビアである。さもなければ、音とびやコマ落ちが発生する。それではメディアプレイヤーの役割を果たさないわけだから、WMPはtimeBeginPeriodを使う理由がある。しかし、別のプログラムは、それほどタイマーの精度が高くなくても、問題なく動作するので、timeBeginPeriodを使う必要は無い。

さて、JavaScriptのタイマーには、本当に1msの精度が必要だろうか。Flashでさえ、Flash Player 10で、timeBeginPeriodの使用をやめるというのに。まあこれは、省電力のほか、Vistaではオーディオスタックが違うという理由もあるのだけれど、MSやIntelから省電力の強い圧力がかかっているのだから、やはり省電力だろう。

2008-09-09

求人誌

週刊の無料求人誌を眺めていたら、春先に面接に行った例の会社が、まだ募集していた。たんなる偶然というわけではなく、毎週のように募集しているのだろう。あんなビルの一階層でしかない会社が、それほど大量のプログラマ(未経験OK)を必要とするわけもなく、大方は、来る人来る人定着しないか、偽装派遣なのだろう。自社開発や委託を宣伝文句にしているにもかかわらず、面接では出向の話を強く持ち出してきたから、まあ怪しいものだ。

さて、仕事を見つけなければならぬ。仕事と趣味は完全に分けようと思っているので、どんな仕事でもいいのだが、ただ……

車を運転する必要がないこと。
昼の仕事であること。
不定期なシフトではなく、しっかりと決まっていること。
労働基準法と健康増進法が守られていること。
賭博に関わりのないこと
法に触れない仕事であること。

2008-09-08

旅日記

八月二十九日

いよいよ旅が始まる。何はともかく、29日の用事は、絶対に遅れてはならないので、朝早く出発することにした。特にやるべきこともなかったという理由もあるのだが。午前七時に、JR京都駅から新幹線で京都へ。名古屋あたりは、田んぼは水で埋まり、川は水でいっぱいで、道路も水はけの悪そうなところは浸水していた。静岡に入り、十年住んだ故郷を、一目確認しておきたいと窓に張り付いたが、すぐに通り過ぎてしまい、さっぱり分からなかった。

さて、とりあえず新幹線の中で、時刻表を広げた。もとより私は、予定を立てるなどということが嫌いな性質なので、今回の旅においても、一切の予定を立てていない。ただ大雑把な目的がいくつかあるだけだ。C++WG会議の出席、森鴎外の墓、高校時代の友人達と再会。C++WG会議は機械振興会館で行われる。これは分かりやすいことに、東京タワーの隣である。もし迷ったとしても、タクシーでも拾って、「東京タワーまで」と言えばよい。あるいは人に道を訊ねるにしても、これほど分かりやすいところは無い。森鴎外の墓は禅林時にある。高校時代の友人達とは、名古屋で会うことになっている。

時刻表を確認したところ、浜松町へは、品川駅の方が近そうだったので、品川で新幹線を降りることにした。まあ、実際は、十分程度の違いでしかないのだろう。浜松町の駅に着いたときは、午前十一時前であった。早すぎる。C++WG会議は午後二時からなのだ。しかたなく、近くのコンビニへ行って、東京の地図を買った。また安そうな飯屋に入って、そばを食べた。なかなかに暇だったが、ようやく一時半となったので、指定の会議室に行くことにした。三十分前ならば問題なかろう。

45分頃に会議室に入ると、奥に一人だけぽつねんと座っていた。他には誰もいない。どうも気まずい。「えーと、あのー、ここはー」と言葉にならない間投詞を連発していると、「ここはC++云々」と答えが返ってきた。ここで間違いあるまい。

レビューは長引いて、六時前まで続いた。その後、数人とC++について話しながら、浜松町の駅まで向かった。問題は、この後予定が無いということである。名古屋で友人とあうのは、九月一日のことだ。それまでどこかで暇を潰さなければならない。所詮は狭い日本なのだから、一度京都まで帰ることもできるが、それは面白くない。行くあてがなく、地図を眺めていたところ、神保町が目にとまった。ご存知のとおりの古書店街である。なぜここが思いつかなかったのだろう。神保町に行かずして、一体東京のどこに行くというのか。さっそく神田駅に行く。

神田で降りると、着ぐるみの小太りとケバい女が数人、客引きをやっていた。
「コスプレスパンキングいかがですか」
コスプレをした奴の鞭を受けるのだろうか。あるいはスパンキングは単なる聞き違いだろうか。まあ、それはどうでもいい。さらに、駅前には悪くなさそうな焼き鳥屋があったが、まずは神保町を目指すことにした。

しばらく行くと、交番があった。地図の通りだ。つまり、道を間違ってはいないということだ。交番には大きな地図がかかっているので、ついでにその地図を見ようと、交番の中に入った。何しろ、手持ちの地図は小さく分割されているからだ。

「どうしました?」とお巡りさん
「いえ、ただ地図を見たいだけです」
「どこか行きたいところでも?」
「いや、ただ地図を見ているんです」
「いやいや、そんなこといわないで、どうしました?」
「地図が見たいんですよ。」
「いやいやいやいや」

話にならないので、交番を出ようとすると、引き止められた。
「そのかばんの中には何が入っているんですか?」
「何って」
「いえね、最近物騒でしょう。秋葉原とか。だからその、ちょっと荷物の検査を」

別に、最近、秋葉原でダガーナイフを持って暴れた奴がいたからといって、治安が悪くなったとは思わない。そういうふうに無差別殺人をする奴は、ある一定の割合でいるわけで、こればかりはどうしようもないのだ。しかし、そういう奴がわざわざ交番に入って地図を確認するだろうか。

「京都からきたんですか。東京へは何をしに? え、旅? あ、そう」
「何も危険物とかは入っていないですよね。えーとパンツとシャツばっかりだな」
当たり前だ。旅をしているんだから、着替えが必要だ。
「えーと、これは何かな。あ、わかった。ピンセットですね」
それは毛抜きだ。ヒゲの手入れをするために持ってきたのだ。だいたい、つまむ先が斜めになっているピンセットなどあるのだろうか。かばんに入っている中で、もっとも危険なものといえば、ヒゲの手入れをする小さいハサミぐらいなものだから、お巡りさんは何も発見できずに終わった。やれやれだ。
帰り際に、「神保町に行きたいだけなんですがね」と皮肉交じりに言ったところ、
「ああ、何だ。それならそうと早く言ってくださいよ。急に入ってきて何も言わないもんだから疑っちゃって」
私は三度も、「地図を見たいだけ」だと言ったではないか。このお巡りさんは聾に違いない。
「神保町なら何番目の信号を右に~」
神保町の道順は訊ねていない。私は「何番目の信号を~」などという言い方がとても嫌いなのだ。
「古本屋ですか」
当たり前だ。わざわざ神保町でコスプレスパンキングを受けたい奴は居るまい。

交番を出て、そのまま西に進み、大きな交差点があるところで右に曲がった。神保町であった。しかし、困ったことに、ほとんどの店が閉まっている。どうやら、七時半という時間は、すでに遅いらしい。仕方がない。どこかその辺で一杯飲むとしよう。

さて、飲み屋を探すわけだが、飲み屋には強いこだわりがある。まず第一に、チェーン店は嫌いだということである。チェーン店は面白くないのだ。確かに、チェーン店は小ぎれいで、安全で、値段もそれほど高くなく、ある程度の品質は保証されている。しかし、そんなところで飲んでも面白くない。個人でやっていて、汚くて、安いところがいいのだ。うまければなおよい。もちろん、大抵の場合は、失敗する。しかしたまに、悪くない店に入れることもあるのだ。

さて、神保町のあたりは、どうもチェーン店しか見当たらない。仕方がない、駅前の焼き鳥屋に行こうかと思っていたところ、いかにも汚い飲み屋を発見した。さっそく入ってみる。しかし、その店は大失敗だった。まずサッポロビールしか置いていない。それはまだいいとして、肴も全部まずい。最悪の店だった。

これはダメだ。早々に出て、もう一軒別のところを探そうかと思っていると、激しい雨が降ってきて、出られなくなってしまった。仕方がないので、不味い肴でチビチビ飲んでいると、二人組みの学生が入ってきて、隣に座った。この大学生達が、またひどい客だった。

飲み屋、しかも安くて汚い飲み屋となると、大抵一人ぐらいは、どうでもいい人生訓を語る奴がいるものだ。もちろん、それは語る奴だけのせいではない。ある酔客が人生訓を熱心に語っている場合、その相方というのが大抵、相槌ぐらいしか打たず、自分はひたすら聞き手に回る人間なのだ。二人組みの学生は、その典型的な例であった。

雨はやまない。学生はどうでもいい人生訓を語り続けている。ただでさえまずい酒が、いよいよまずい。仕方がないので、意を決して店を出ることにした。外は激しい雨で、すぐに服がずぶぬれになった。

これはまずい。このまま雨に打たれるのは、確実に身体によくない。

そこで、軒下でしばらく雨宿りをして、小雨になったときを見計らって、コンビニを探して駆け込んだ。傘を購入する。

さて、傘は手に入れたものの、道に迷ってしまった。とりあえず駅の方に向かって歩いたが、どうも見知らぬ風景ばかり。雨はやまず、仕方なく、ある橋の下に雨宿りをしているうちに、つい眠ってしまった。

八月三十日

目を覚ますと、すでに午前一時を過ぎている。ふと見ると、橋の名前が書いてある。神田橋とあった。やれやれ、これで地図を見れば、現在地が分かるわけだ。しかしおかしい。川が南北に流れている。つまりこれは、自分が南北と東西を間違えているに違いない。

ここで川に沿って歩くのは、大変な決意を必要とした。何しろ、今まで自分が北であると信じて疑わぬ方角が、実は東だったのだから。ともかく北と信じていた方角に進むと、神田駅が見えてきた。しかし、駅は閉まっている。さてどうするか。

どうしようもなく、地図を眺めていると、女が一人、近づいてきた。はて、一体何の用だと思っていると、
「マッサージする? ホテルいく? 朝までやる? オーケー」
中国人、いやフィリピン人だろうか。無視すると去っていったが、また別の奴がやってきては、「マッサージ、マッサージ」ときたものだ。やれやれ、少なくとも、これについていけば、ある種のホテルの場所は分かるわけだ。しかしついでに、標準ライブラリの名前空間までもらいそうだから、それはちと困る。

駅前なのだから、カプセルホテルやネットカフェのひとつぐらいあるだろうと、そのあたりを歩き回ったが、道行くたびに、キャバクラの客引きと、按摩が声をかけてくる。ああ、思えば京都は平和だったのだな。キャバクラの客引きはいても、按摩はいなかった。

雨が酷いので、コンビニに入った。暇なので立ち読みでもすることにしたが、手に取った本がまずかった。ホームレスのルポである。何で橋の下で眠った後であるだけに、やけに気分が悪くなった。そのルポの信憑性はともかく、ストーリーは大抵、バブルの頃はよかったが今は路上生活といった話だ。

コンビニを出て、あてもなくさまよった。見ると橋がある。やれやれ、つくづく橋の下に縁があるらしい。その橋の近くには、万世橋と書いてある。それならどこかにネットカフェのひとつもありそうなものだが、既に午前四時である。一眠りするにも、既に朝だ。そこで暇つぶしに時刻表を眺めた。夜が明けても、神保町の古本屋が開くまでには、だいぶ時間がある。さて、どこに行くべきかと時刻表を眺めていたところ、ふと森鴎外の墓のことを思い出した。寺なら、朝早くから入れるに違いない。さっそく路線を調べると、新宿から三鷹市へ行く電車がある。はて、神田から新宿へは、内回りと外回りのどちらで行った方が早いのかと調べてみると、どちらも同じ時間であった。お、これは楽だと思っていると、そもそもその新宿から出ている電車と言うのは、中央線であることに気がついた。

雨がやまないので、やよい軒に入って飯でも食べながら時間を潰すことにした。野菜炒めを食べ、時刻表を眺めていると、ようやく五時になったので、神田駅へと向かった。神田駅のホームのベンチに座って電車を待っていると、ついウトウトと、六時ごろまで寝てしまった。電車に乗ってからも、ついウトウトと寝てしまい、三鷹駅を乗り過ごして、武蔵小金井についてしまった。武蔵小金井駅は工事中なのか、戻るためには、別の場所にあるホームに行かなければならない。三鷹の駅で降りて、禅林寺へ向かった。

禅林寺には、特に拝観料という類のものはないらしい。そのまま入って、墓地に向かった。

森鴎外の墓があった。森林太郎墓としか書かれていない、堂々たる墓である。雨で地面がぬかるんでいるのもかまわず、ひざまずいて手を合わせた。そして長い間、墓の前に立って、ただ眺めていた。すばらしい墓だ。しかし、彫り付けてある字が気になる。とてもまずい字なのだ。まるで素人がガリガリ掘ったような字だ。森鴎外の墓の字は、誰か友人が掘ったのだろうか。そういえば、字の周りについているキズが気になる。あれはいたずらや長年の風雨でついたようなキズなのだろうか。ひょっとして、下書きなのではなかろうか。(後に調べたところによると、鴎外の墓は中村不折によって掘られたらしい)

森鴎外の墓の偉大さに圧倒されて、長い間立ちすくんでいたところ、娘が一人、こちらへやってきた。眼鏡をかけ、髪を腰のやや上まで伸ばし、いかにも知的な女学生といった様子であった。

あのような若い娘が、この禅林時の墓地へ来るからには、森林太郎の墓を拝みに来たに違いない。そう思って、私は墓の前をどいた。するとどうしたことか、女学生は鴎外の墓を素通りして、太宰治の墓へ行くではないか。

太宰治。確かに奴の文章は独特のリズムと言うか、勢いとでも言うべきものがあって面白い。がしかし、太宰治を面白いと思うのは、小中学生ぐらいまでなものだろう。第一、あの太宰治の墓からは、なんらの畏怖も感じられない。

しかしその女学生は、太宰治の墓の前に行くと、長いあいだ手を合わせ、墓をしげしげと眺めていた。

どうも解せない。太宰治も、たしかに悪くない文章を書いた。しかし森鴎外に比べれば大したことがない。あの女学生が極右か、陸軍の軍人の娘ならば、森鴎外の墓を拝まないというのも理解できる。何しろ奴は、脚気が細菌によって引き起こされると頑なに信じ、陸軍に麦飯を導入することに反対したことによって、ロシアのどの将軍よりも多くの日本兵を殺したと言われたのである。しかしそれならば、墓に唾していくはずである。まあ、婦女子は太宰治が好きなのだろうか。

しばらくあって、女学生は太宰治の墓の前を辞し、こちらへやってきた。今度こそ森鴎外の墓を見るに違いない。私は墓の前を開けた。しかし、娘は墓を通り過ぎ、まさに帰らんとしたところで、思い出したように振り向き、軽く手を合わせて一礼すると、去っていった。ああ、あの娘にとって、森鴎外とは、有名人の一人でしかないのか。

さて、次はどこへ行くべきかと、地図を繰りながら思案していると、多磨霊園が見つかった。多磨霊園には、確か中島敦が眠っているはずだ。地図で見ると、禅林寺から多磨霊園へは、それほど遠くないように思われた。そこで、歩いていくことにした。

歩いていったのは、大間違いであった。いつまでたってもつかない。延々と歩いていると、野川という小さな川があった。見ると、木陰にベンチがある。睡眠不足と疲労から、ベンチに座ってしばらくウトウトと寝た。しばらく休んで、さて行こうかと立ち上がると、そば屋の看板が目に付いた。見ると、地球屋とある。いささか左翼臭い名前だ。ちょうど昼過ぎで腹も減っていたし、考えてみれば、せっかく東京に来たというのに、そばを食べないというのもおかしな話だ。そばは江戸のものなのだ。うどんは京のものである。

地球屋に行くには、だいぶややこしい道をたどる必要があった。看板がいちいち出ているから迷うことはなかったのだが、それにしても変なところにあるそば屋だ。いざ地球屋についてみると、そこには、一軒のあばら屋があった。

あばら屋だと。もちろん私は、チェーン店が嫌いな性質なのだから、店が汚い程度で文句を言う人間ではない。しかしこの不調和はどうだろう。周りの家々は皆、最近立ったと思われる住宅街。そこに一軒だけあばら屋である。全然場所にあっていない。それに、店の前にある看板が気に食わない。曰く、「大声を出さないでください」、「子供(七歳以下)の入店お断り」、「携帯電話の電源を切ってください」と。この時点で、頑固さを演出しているにわか店だろうと、大方の見当はついたが、まあ一度ぐらいは、こんな店に入ってみるのもよかろうと思った。それに、「禁煙」と書いてあったのには好感が持てたからだ。ここまでするからには、十割そばぐらいは出しているだろう。

さて、店の中に入ろうとすると、入り口で止められた。何でも、今は一杯なので、外で待っていて欲しいということであった。しかし、別に並んでいる様子はないし、店の中にも人がいる様子はない。私は並ぶというのが大嫌いなので、ここで帰ろうかと思ったが、まあ物は試し、待ってみることにした。

外でしばらく待っていると、店の中から客が出てくる。しかし、一向に呼ばれない。待っている間に、思案してみた。何か有名なそば屋なのだろうか。いや、こんな風に、如何にもなにわかあばら屋である以上、別段有名でもあるまい。高いのだろうか。もり一杯が二千円を超えていたら、帰るとしよう。いくらなんでも、たかがそばにそこまで金は出せん。と考えていると、ようやく呼ばれた。

中は狭い庵のようなつくりになっていて、小さいちゃぶ台が二つ置かれていた。なるほど、そもそも客がいくらも入らないのだな。奥にはテーブル席もあるようなのだが、この小さな部屋が、この店の売り物なのだろう。周りには、如何にも昔風のものが置かれている。店の者が、和紙で作られた型通りのお品書きを持ってきた。そして能書きが始まる。

まずこの店は石臼で引いた十割そばしか出さないこと。つゆはこの店独自のものであること。野菜は自家栽培したものを用いており、テレビでも紹介されて云々。

ああ、能書き屋か。これは江戸のそばではない。そばと言うのは注文したらサッと出てくるものだ。気の短い江戸っ子が、こんな能書きをたれる店に我慢できるはずがない。わざわざあばら屋に店を構え、雰囲気を出そうとしても、この能書きひとつで丸つぶれというものだ。とくに、テレビで紹介などという言葉を出したのは最悪だった。私にとっては、テレビで紹介されたということなど、ネガティブな要素でしかないというのに。ああそう、所詮、テレビに出て媚売る程度の店なんだなと。

そばが出てくるまでには、だいぶ長い時間がかかった。江戸っ子ならとっくに怒って帰っていることだろう。そもそも、最初の屋台のそばと言うのはあらかじめ茹でておいて、注文に応じてつゆをかけてだしたそうだ。ようやくそばが出てきたと思ったら、また食べ方の能書きを垂れていく。やれやれ、ぶち壊しだ。そばは確かにまずくはなかったが、中途半端なそばだった。十割そばというわりには、やけに滑らかで長い。本当に十割なのだろうか。確かに十割で、変わらない長さと滑らかさを出すのも、腕次第では可能なのだろうが、そういうそばが食いたければ、つなぎを使えばいいだけの話だ。せっかく十割ならば、そば粉も粗挽きにして、太く短く打つものではないのだろうか。

店を出ると雨が降ってきた。天も我が心情を解するものと見える。そのまま歩いていると、近藤勇の生家が見えた。しかし、私は新撰組に心を惹かれることは無い。私に言わせれば、奴らは所詮、大きな時代の流れが読めなかった浪人上がりの賊軍なのだから。

さて、なおも行き、ようやく多磨霊園に着いた。しかし、あまりに広すぎて、どこに何があるのかさっぱり分からない。中島敦の墓は一体どこにあるのか。詳しい区画を調べてから来るべきだったと後悔したが、もう遅い。仕方がない。またの機会に来るとしよう。

さて、三鷹駅から多磨霊園まで歩いてきて、さすがに疲れた。帰りは電車に乗って帰ろうと、多磨駅まで歩いて帰った。どうも、この多磨駅というのは、西武線になるらしい。JRにそのまま乗り入れているのでややこしいが、私鉄だ。いやまて、JRが国鉄であったのは大昔だ。すると、すべての日本の鉄道は私鉄と言うことになるわけか。ともかく電車で帰った。

さて、いよいよ神保町だ。通りはほとんどが古本屋である。まさに天国だ。何軒か回ると、春秋左氏伝を発見した。原文と訓読が乗っている。欲しかったが、値段が二万五千円と高い。なぜ欲しいかと言うと、かの森鴎外が、よい文章をかく秘訣を問われた時には決まって「左伝を読め」と言ったからである。もちろん森鴎外が言うからには、素読なのだろうか。

さて、さらに古本屋を巡っていると、源平盛衰記を発見した。しかし、三弥井書店のものだ。これなら別に古本で買うまでも無い。それに、三弥井書店の源平盛衰記は、注釈がやたらと多くて、研究用にはいいかもしれないが、純粋に物語を楽しむことができない野暮な本だ。更に何軒かまわると、とうとう友朋堂文庫の源平盛衰記を発見した。六千円である。友朋堂文庫にしては高いが、どうも保存状態がいいからこの値段らしい。六千円なら買いだ。

しかし、三鷹から多磨霊園まで歩いたのは、失敗だった。足が痛いと思っていたら、両足にまめができていた。普段あまり歩いていなかったからに仕方がない。コンビニで針と百円ライターを買って潰した。さて、今日はさすがに、横になって眠らなければならない。風呂にも入りたいところだ。カプセルホテルに泊まることにした。カプセルホテルでは、特記するほど面白いことはなかった。ただひとつ、カプセルホテルに住んでいる人がいたということだ。その住人のロッカーは、上から下まで引き出しが詰め込まれ、整然としていた。そのカプセルホテルは、風呂付きで一泊三千五百円する。風呂に入らないとしてもやはり金がかかる。回数券を買えば安くなるようだが、それでもどうしようもなく金はかかる。一月にかかる金額を考えたら、郊外に安アパートのひとつも借りられると思うのだが。

風呂に入ってさっぱりすると、服の臭いが気になった。シャツやパンツはコンビニでも手に入るが、ズボンはそういうわけには行かない。もともとぼろぼろだったジーンズが、更にぼろぼろになって、異臭を発していた。洗濯をしようにも、備え付けの洗濯機は一時間待ちである。だいたい、五百円払って洗濯をしてまで使いたいほどのズボンでもない。新しいのを買えばいいと、ズボンをロッカーに入れて、その日は眠ることにした。名前通りのカプセルの中に入ると、思ったよりも快適な空間であった。テレビが備え付けてあったが、ブラウン管で画質が悪い。脇を見ると、アダルトチャンネルに合わせるためのスイッチがある。五百円払えば見られるようだ。しかし、こんなところで見て何になるのだろう。ここでアレをするのだろうか。世の中は分からない。神保町でついでに買ってきた、中島敦の作品集を読もうとしたが、睡魔に勝てず、寝ることにした。

八月三十一日

午前四時半に、誰かがセットしたアラームのおかげで、起こされてしまった。アラームはかなり長い間、鳴り続けた。アラームをセットした当の本人が眠りこけているのだろうか。そのままもう一眠りしたが、どうも長くは眠れない。結局、六時にカプセルホテルを出ることにした。特にこれ以上、東京で行くあてもなかったので、静岡方面に行くことにした。足はマメだらけなので、こんなこともあろうかと持ってきた雪駄をはいていくことにした。

何しろ、当日の新幹線の中で、初めて時刻表を開いたぐらい、予定を立てるのが嫌いな性分をしているのだが、鈍行を使っての旅は迷わなかった。とりあえず静岡の磐田まで着き、ズボンを一着買った。磐田西高校まで行ってみたが、残念ながら、誰もいなかった。夏休みとはいえ、静岡の公立学校は、九月一日あたりに始まるはず。教師の一人ぐらいいてもよさそうなのだが、誰一人いなかった。

さて、今日中に名古屋に行くべきか、あるいは浜松あたりで一泊すべきかと思案していると、明日名古屋で会う予定のある友人が、今日は静岡の実家に帰ってくるらしい。会うのは一年ぶりだ。これ幸いと泊めてもらうことにした。この友人の名前を、仮に御史としておく。戦国時代の歴史オタクだからだ。その歴史君の家に一泊して分かったのだが、家族がいずれも読書家であった。まあ、家庭の環境が、御史を御史たらしめたのだろう。ところで、明日名古屋で会う予定だった小太りから、眼鏡が壊れたというメールが入った。相変わらずうだつの上がらない奴だ。

九月一日

さて、次の日名古屋に入ると、既に四日前から、買い物に名古屋に来ていたというクイズ王と、四年ぶりに再会した。なかなかのイケメンである。クイズ王という名前は、この友人がクイズ好きであることによる。四年たっても、やはりクイズ好きであった。

さて、午後二時になると、無名君がやってきた。奴を形容する言葉を色々と考えたが、どうもこれはと思う言葉が見つからないのだ。芸術家とかナルシストなどでもいいのかもしれないが、やたらにガタイがよく、正確も見かけどおりの豪傑なところがある。何か突出したものがないとも言える。無名君でいいだろう。無名君はやってくるなり、私の姿を見て爆笑した。失敬な奴だ。ちなみにその日の私のいでたちは、バリカンで頭を刈って、八字ひげを生やしていた。どうみても普通の容貌である。それなのに、無名君は笑うことしきりで、ついには余をして密入国者呼ばわりする始末。本当に失敬な奴だ。

そうこうしているうちに、変人がやってきた。変人という名前は変に思われるかもしれないが、それ以外にこの男を表す言葉が見つからないのだから仕方がない。高校の頃はムーを購読していたし、最近はアウトドアだといいながら、家の中にテントを張って暮らしていたこともあるという変人だ。変人君は無名君と肩を並べて私の身なりを笑った。実に失敬な奴らだ。

さて、変人が言うには、名古屋駅の周辺は、特に遊ぶ場所も少ないから、大須のあたりに行こうということであった。クイズ王が大須まで歩いていこうというので、ぶらぶら歩いているうちに、ガキンチョから名古屋駅に着いたという連絡があった。ガキンチョは童顔で声変わりしておらず、思想も幼い。しかし、会わない四年のうちに、やたらと背が伸びたらしい。五尺七寸はあるという。私が五尺四寸しかないので、一番チビということになってしまう。しかし、顔と声と思想は相変わらずらしい。まだ救いがあるわけだ。このガキンチョがなかなか出会えない。暇つぶしに境内でハトのエサを買ったら、大量のハトに襲われた。これはいい。奴が来たら罰としてハトのエサやりを命じよう。

甘かった。奴はハトが大嫌いだったのだ。ハトに近づこうともしない。エサを持たせようとしても必死で逃げる。残念だ。

その後、喫茶店に入った。私はすでに甘いものが食べられない味覚になっているので、パフェを頼む連中が理解できなかった。しかし、野郎ばかり六人も喫茶店に入ってパフェを頼む図は異常である。酒も入っていないのに、皆やたらにハイテンションである。

ボーリングをすることにした。私は日本で絶滅危惧種に指定されているボーリング未経験の一人だったので、さっぱりだった。御史はボーリングが苦手と見えて、私と似たようなスコアだった。待ち時間の間には、クイズ王がクイズを出していた。四年前となんら変わらない。

ゲーセンに立ち寄った。私はゲーセンには興味がない。クイズのゲームをやってみたが、興味の分野が無い。クイズ王は何かカードのようなものを持っていて、そのカードを入れてゲームをするとより難しいクイズが出されるようになっていた。

さて、そろそろ飲みに行くわけだが、連中はチェーン店を選んだ。やれやれ、私の好まない店だ。確かに安くて失敗は無いが、期待以上と言うことも無い。酒はクイズ王のゲイの話で盛り上がったが、私は残念ながらこんな店では酔えない。飲み屋をでて、やたらにハイテンションな連中の後に続いて、どことなく名古屋をさまよった。カラオケに行くらしい。途中で、福田首相の辞任を伝える号外が配られていた。カラオケのサービスは午前一時からだという。それまで路上で暇つぶしをしていた。クイズ王は相変わらずクイズを出していた。

九月二日

カラオケに入って朝まで歌った。私は寝ていた。

翌日、静岡の磐田に帰った。さて、御史はその日のうちに山梨に帰るという。やれやれ、もう一泊御史の実家に泊まろうというもくろみは、当てが外れてしまった。ともかく、旧浅羽町に行った。私の育った故郷である。四年たっても交通の便の悪さは変わらず、袋井駅からバスに乗る必要があった。新堀はだいぶ変わってしまっていた。我が旧家は、すでに他人の手に渡り、庭木は引っこ抜かれ、生垣は半分以上枯れ、雑草が生い茂り、駐車場にはワゴン車がとまり。見るも無残な姿になっていた。ああ、心ない人の手に渡ったものだ。

その日はすぐに磐田に戻り、親父が良く飲んでいたという秀八という店で飲んだ。安くてあまりうまくない飲み屋だった。さて、行く当てもなく、午後十時半ごろにのんびりと歩いていると、道路を走っていたパトカーが止まって、中からお巡りさんが出てきた。周りには歩いている人もなし、私に用があるのだろう。

何と、職質だという。さすがにこれには驚いた。何しろ。まだ十時半なのである。十時半に男が一人歩いていたぐらいで職質をするというのか。磐田は何と平和なのだろう。何でも、あまりに大きい荷物をもって、夜中に歩いているので気になったらしい。それほど大きな荷物ではないし、タイヤ付きのバッグを引きずっているならば、旅をしているとすぐに分かりそうなものである。しかしお巡りさんに言わせると、「いやいや、そんなの言ってくれないと分かりませんよ」なんだとか。夜中に歩いているといっても、まだ十時半だし、酒に弱くもないので、千鳥足で歩いているわけでもない。この程度で怪しまれるとは、磐田は何て平和なんだ。どこへ旅をしていたのかとしつこく聞くから、東京とか神保町とか答えたら、そのお巡りさん、親近感を演出したいのか、「実は僕も神保町の交番で働いていたことがあるんです」などと言い出した。嘘か本当か知らないが、本当ではないかと信じさせるほど、あの神保町のお巡りさんを彷彿とさせた。片や三度も言ったことを聞き取れず、片や旅人を区別できないとは。

実は、そのまま浜松に行ってカプセルホテルに泊まるつもりだったのだが、職質を受けたものだから、是非とも磐田で野宿をしてみたくなった。そこで公園に行ってベンチに横になったが、どうも眠れない。雪駄が壊れたので捨てることにした。コンビニを転々として歩いているうちに、夜が明けた。

九月三日

さて、スーパーが開くまで待ち、お土産に黒はんぺんを買って帰った。思うに、黒はんぺんとは静岡が誇る素晴らしい食品ではないか。安い、うまいと申し分ない。何故これを全国で売らないのか。

帰りに思ったことはひとつだけ。東海道本線の大垣駅の連絡の悪さはどうにかならないものか。平日は三十分に一本ほどしか電車がなく、しかも乗り継ぎが悪く、二十分以上待つ必要がある。

いやしかし、自分がこんなにも貧乏旅が好きだとは知らなかった。また今度出かけよう。

2008-09-07

コンセプトどうしようかな

何度か説明を書こうとしては挫折している。どうせ皆、つかったらそのあまりの厳格さに絶望するだろうし。

2008-09-06

戦国時代ヲタきめぇ

89 名前:名無しさん@九周年[] 投稿日:2008/09/06(土) 14:04:00 ID:hWsQ7wIf0
うちの厨房アホ息子が直江兼続の「愛」の字の扇子を喜んで使っててきめええ

98 名前:名無しさん@九周年[] 投稿日:2008/09/06(土) 14:10:32 ID:CX/ycxDf0
>>89
ひとそれを中2病と呼ぶ
生暖かく見守ってあげなさい


123 名前:名無しさん@九周年[] 投稿日:2008/09/06(土) 14:22:46 ID:praa08z60
>>89似たもの親子だな

136 名前:名無しさん@九周年[] 投稿日:2008/09/06(土) 14:29:05 ID:/UzBb8zA0
>>89
お前のじいさんもお前をみて「こりゃアカン、歴史オタきもいわ」とかいってたりして。


110 名前:名無しさん@九周年[] 投稿日:2008/09/06(土) 14:17:13 ID:hWsQ7wIf0
>>98
いや、謙信の「毘」と直江の「愛」、どっちがいいか?と聞いて直江を選んだマニアックさがきめえのよ。

192 名前:名無しさん@九周年[sage] 投稿日:2008/09/06(土) 14:48:06 ID:YZ43jZED0
>>110
いいじゃねえかよw

子は親に似る。

源平盛衰記難しすぎ

漢文が容赦なく混じっている。

昔呉王好剣客、百姓多瘢瘡、楚王好細腰、宮中多餓死、城中好廣眉、四方且半額、城中好大袖、四方用疋帛

昔、呉王剣客を好めば、百姓瘢瘡多し、楚王細腰を好めば、宮中餓死多し、城中廣眉を好めば、四方且半額、城中大袖を好めば、四方疋帛を用ゆ

広眉って何だろう。眉が長いことだろうか。広い眉が流行ると皆半額になるとはどういう意味だろう。半額とは、中途半端な冠みたいだけれど。

2008-09-05

Google Chromeの感想

基本的には既存のソフトウェアの寄せ集めとでも言うべきブラウザ。JavaScriptだけは自前でやっている。

ごちゃごちゃした機能が一切無い。minimalist好みのブラウザになっている。

ただ、問題が無いわけではない。

まず、ブックマークを管理する方法が無い。
ブックマークの追加や削除はできるが、別のフォルダに移すことができない。まだ実装されていないだけならいいのだが。

フォントサイズが小さい場合のフォントリンクによる文字の描画が微妙におかしい。
日本語が奇妙に表示される。

JavaScriptでポップアップウインドウが開く。
私はポップアップウインドウと言うのが嫌いである。すべてのウインドウはタブとして表示されているべきである。

すべてのタブを閉じるとブラウザが終了する。
空白のタブを表示すべき。

追記:Nov 12, 2008 6:11 AM付けの0.4.154.18に、ブックマークマネージャの機能が実装された。

無謀だったかねぇ

例の求人の一次試験、いざ日本語を前にすると、全然訳が思いつかん。だいたい、邦訳なら良くやるが、英訳はしたことがなかったというのも恥ずかしい話だ。

Google Chromeが素晴らしい

さっそく乗り換えた。これはいい。

2008-09-04

電源コードを抜くべからず

Windows Confidential: Windows 95 Unplugged

実に面白かったので紹介する。

Windows 95で動く32bitのプログラムは、32bitコンパイラを使うし、16bitのプログラムは、16bitコンパイラを使うものだ。しかし、Windows 95は特別なコンパイラが必要だったのだ。そのコンパイラは32bitと16bitの両方を扱う必要があった。Windows 95はまた、その二つのコードをつなぐためと、WIndows 95のドライバフォーマット、VxDのために、特別なリンカーを必要とした。

Windows 95の開発チームは、言語とツールの開発部門に、この特別なコンパイラとリンカーを作るように言った。コンパイラのチームはさだめし変に思ったことであろう。「たったの二つのDLLをコンパイルおよびリンクするのにしか使われない、特別なコンパイラを作れって?」と。その通りだった。しかしそれは、とても重要なDLLだったのだ。

コンパイラの開発部門は、要求された特別なコンパイラを作った。そして、そのコンパイラはWindows 95のビルドプロセスに組み込まれた。もちろん、コンパイラは、新しい最適化やバグフィックスのたびにアップグレードされた。

ある日、Windows 95のビルドはとても遅くなった。ほんの数秒でリンクできたはずのファイルが、何分もかかるようになったのだ。ファイル自体は問題なく生成されるのだが、ひたすら時間がかかる。しかも、ただ一人のコンピュータに起きた話ではない。開発チーム全員に起きたのだ。我々のコードが何かリンカーにとって難しいものになったのだろうか。あるいは、リンカーのバグに引っかかったのだろうか。

デバッグの結果、我々は原因を突き止めた。最新のリンカーには、コンパイラチームが消し忘れたデバッグコードが含まれていたのだ。そのデバッグコードは、コンパイラチームの部屋のあるコンピュータに、ログを出力するようになっていた。そしてそのコンピュータの電源が、たまたま落とされていたのだ。

デバッグコードのあるバージョンのリンカーは数週間ほど問題なく動き続けた。Windows 95のビルドでVxDをリンクするたびに、コンパイラチームの部屋のコンピュータのあるファイルが更新された。そのコンピュータの電源が入っており、ネットワークにつながっている限りは。しかし、ある日コンピュータの電源が落とされ、ビルドが遅くなってしまったというわけだ。

この問題は、すぐに修正された。

この話のオチはいくつかあるが、語り手によってオチが変わる。私の場合のオチは、「んで、そのコンパイラの開発者は、Windowsチームにやってきて、今では俺の上司さ」となる。今でも、私はこの笑い話をよく言うのだ。

ところで、私の上司にこの話を言わせると、オチが変わる。「そもそも、俺はそんなデバッグコードなんざ書いてなかったんだ。ありゃ俺の同僚のコードだった。奴は自分のコンピュータをデバッグログで一杯にしたくないんで、俺のを出力先にしたんだ」

日本語の英訳は難しい

この英訳は、ある外人に頼まれて訳したものなのだが、不自然な英語だと散々叩かれた。いまは少しまともにしてある。

その外人と色々話していて分かったのだが、どうも私には、英語の文法の知識がまったく無いようだ。そりゃそうだ。学校の英語教育が大嫌いで、ずっと英語の本ばかり読んでいたのだから。とにかくひたすら本を読んだ。

その結果、英語はかなり読めるようになった。最近はだいぶ自信があったのだ。ハリーポッターは全巻読んだし、Monty PythonやSouth Parkで笑えるし、C++0xのドラフトだって読める。

それなのに、あの程度のわずかな英語すらまともに書けないとは。

追記:
英語でチャットをするのはとても楽だ。相手は意味を察してくれるし、最悪単語を並べても通じる。やれやれ、何とかしなければ。

何事も型からというのはいいことだと思う。例えば礼儀作法を知るには、まずふすまの閉め方や座り方を学ぶものだし、昔は漢文というものは、素読をして覚えたものだ。英語も文章を大量に読むのは悪くないと思う。

しかし、どうやらそろそろ、英語の文法を学ばないといけないようだ。

Translations for someone

suppatenko

Marisa : Hey, That was your full power?
Ran : I'll lose if i do nothing.
Ran : In this case, I have to become a suppatenko!

Voice-over : Let me expain it! When Tenko-gauge become to max level, her danmaku becomes a few times stronger and she could transform herself to suppatenko.

Censored


魔理沙「どうした、もう終わりか?」
藍「ぐっ…このままじゃやられる…っ!!!」
藍「こうなったら、スッパテンコーするしかないっ!!!!!」

説明しよう!
式神八雲の、テンコーゲージが頂点に達するときに、通常の数倍の弾幕モードと、スッパテンコーに変身することが可能なのだ!

発禁

C++WG会議の次第

去る8月29日に、C++WG会議にオブザーバーとして出席してきた。これはローカルな会議で、年四回ほど行う。その内容は、公式に入ることが決まったペーパーのレビューなどだ。

以下のペーパーをレビューする予定であった。

2008-06/N2659 "Thread-Local Storage"
2008-06/N2656 "Core issue 654 wording"
2008-06/N2657 "Local and Unnamed Types as Template Arguments"
2008-06/N2658 "Constness of Lambda Functions (Revision 1)"
2008-06/N2634 "Solving the SFINAE problem for expressions"
2008-05/N2664 "C++ Data-Dependency Ordering: Atomics and Memory Model"
2008-06/N2672 "Initializer List proposed wording"
2008-06/N2670 "Minimal Support for Garbage Collection and
   Reachability-Based Leak Detection (revised)"
2008-06/N2660 "Dynamic Initialization and Destruction with Concurrency"
2008-02/N2514 "Implicit Conversion Operators for Atomics"
2008-06/N2667 "Reserved namespaces for POSIX"
2008-06/N2678 "Error Handling Specification for Chapter 30 (Threads) (Revision
1)"
2008-06/N2661 "A Foundation to Sleep On"
2008-06/N2674 "Shared_ptr atomic access, revision 1"
2008-06/N2666 "More STL algorithms (revision 2)"
2008-06/N2669 "Thread-Safety in the Standard Library (Rev 2)"
2007-10/N2435 "Explicit bool for Smart Pointers"
2008-06/N2679 "Initializer Lists for Standard Containers (Revision 1)"
2008-06/N2680 "Proposed Wording for Placement Insert (Revision 1)"

2008-02/N2525 "Allocator-specific Swap and Move Behavior"
2008-03/N2543 "STL singly linked lists (revision 3)"
2008-03/N2554 "The Scoped Allocator Model (Rev 2)"

ただし、N2670だけは時間が足りず、レビューできなかった。まあ、N2670は、それほど影響のあるものではなく、その内容は、「今回GCは規格に入らないけれど、将来のために、最低限のReachabilityについて決めておきましょう」という程度のものだ。例えば、ポインタの値をXORして格納していたら知らんよといった類のこと。

しかし、資料の類はあらかた持っていったが、あまり参照することはなかった。ペーパーは事前に読んでいたし、せいぜい、三項演算子の戻り値の型がどう決まるかということを調べたぐらいなものだ。

さて、次回以降はエキスパートとして参加できるらしい。

2008-09-03

帰還

ようやく京都の家に戻ってきた。返信しなければならないメールがいくつかあるのだが、とりあえず今日は寝る。いずれ旅日記も書こうと思うが、とにかく疲れた。橋の下に寝るはめになっただとか、三鷹駅から多磨霊園まで歩いただとか、高校の友人と朝まで騒いだだとか、黒はんぺんを買い込んできたなど、本当に疲れた。

ところで、たったの六日間だったのに、Google Readerの未読が889件もたまっている。普段これだけの数のフィードから、興味のあるものだけ取捨選択できていたのかと、思えば不思議だ。