2008-07-30

キラークイーンの雑学

キラークイーンといっても、ジョジョ第四部の吉良吉影のスタンドではなく、QUEENのKILLER QUEENの方だ。

Moet et Chandon
モエ・エ・シャンドンはフランスにある同名の会社が製造するシャンパンのブランド名である。
Marie Antoinette
マリー・アントワネット・ジョゼファ・ジャンヌ・ド・ロレーヌ・ドートリッシュ(Marie Antoinette Josepha Jeanne de Lorraine d'Autriche)はルイ十六世の王妃である。
Khrushchev
ニキータ・セルゲーエヴィチ・フルシチョフ(Никита Сергеевич Хрущёв)はソ連の政治化。色々あったけれど、まあ結果的にはいい奴だったんじゃないかな。冷戦を多少溶かしたし。
Kennedy
ジョン・フィッツジェラルド・ケネディ(John Fitzgerald Kennedy)は第35代アメリカ合衆国大統領。
Geisha Minah
Geishaは、ステレオタイプの花魁も含むゲイシャだろう。まあ、昔は花魁の真似事をやる芸者も結構いたらしいが。Minahだが、これがよく分からない。何でもある芸者の源氏名だったという説もあるらしいが、ここはググってトップに来た説にしておく。曰く、minorを音訳して取り入れたアジア人の発音のことらしい。つまりマイナーのこと。すると年が若いという意味になるが、これが単に若い芸者なのか、あるいは技量的にも未熟な半玉なのかよく分からない。

それにしてもよく分からない歌詞だ。まあ、意味はある程度謎の方が、また魅力があっていいのかもしれないが。"a man from China"とは単に中国人全般を指すのだろうか。

それにしても、フレディの声域って広すぎないか。

2008-07-29

日本語訳しがたい英文、n of m

英語では、"n of m" という表現がある。これは、「m個中のうちn個」という意味なのだが、これはどう考えても日本語として不自然だ。それに、日本語には数助詞というものがあるので、個ではなく、人、件、などと、物によって数助詞が変わる。不便だ。

Windows VistaのWindows Updateでも、この手の表現が出てくるが、何件中何件などと訳していた。やはりしっくりこない。

イマジネーションランド無規制ワイド版

http://www.southparkstudios.com/episodes/imaginationland_movie/

自主規制なし、ワイド版のイマジネーションランド三部作が無料で見れる。Fucking sweet! I almost pooped my pants!

2008-07-24

白波五人男の雑学

分かりにくいものをまとめてみた。

緋鹿の子(ひがのこ)
赤い鹿の子絞り染めの事。
損料(そんりょう)
衣服・道具などを借りたとき、使用料として支払う金銭。大辞林より。何故賃貸料のことを損というのだろう。
秋田の部屋ですっぱり取られ
五代目菊五郎の妾で、六代目の実母の苗字は秋田であったことにかけている。
百味講(ひゃくみ)
神仏に食べ物をお供えする信者の集まりのこと。賽銭もある。
蒔銭(まきせん)
賽銭
岩本院(いわもといん)
今でいう一流ホテル
枕捜し(まくらさがし)
寝ている隙に枕元をあさる事。
お手長講(おてながこう)
手長とは盗み癖のことで、その講(参詣をする人達)なので泥棒仲間の事。
寺島(てらじま)
菊五郎の本名の苗字にかけている。
小耳に聞いたじいさんの
五代目菊五郎の祖父、三代目菊五郎にかけている。人気の役者だった。七代目の場合はとっつぁんになるし、菊五郎の家系でない者が演じる場合は、屋号の音羽屋になる。
名せえ由縁の(なせえゆかりの)
菊五郎の息子の菊之助にかけている。
立ち前(たちめえ)
たちまえ、が江戸弁の発音になったもの。立て代(たちしろ)と同じ。賃金、稼ぎの事。
たてんぼ
大雑把にふたつに分け、好きな方を取らせること。江戸っ子は、きっちりと数えることを好まなかった。
大小(でえしょう)
だいしょう、が江戸弁になまったもの。
坊主持ち(ぼうずもち)
坊主がやって来たら荷物の持ち手を変えること。当時流行したらしい。
忌えましい(いめえましい)
いまいましい、が江戸弁の発音になったもの。例「いめえましい按摩だなぁ」
新内で川流れ
新内とは、この場面で弁天小僧が歌っている流しの事を指し(ある台本では、ここで南郷が口三味線をするとある)それで川流れ(お流れ)という意味らしい。まさか普通の辞書に載っているとは思わなかった。
万引き
じつは江戸時代からある言葉。白波五人男で使われていたので、そんなに昔からあった言葉なのかと疑問だったが、どうもあったらしい。

むかしむかし宮古路豊後掾(みやこじぶんごのじょう)という人がおりました。 彼は始め、京都で一中節(いっちゅうぶし)を語っておりました。静かな一中節では自分の感情を表現しきれなくなり、もっと感情を吐き出すことの出来るような、抑揚の激しいフシで語りたいと、悩みに悩み自分独自の芸風を作り、彼の芸風豊後節が出来ました。豊後節は江戸で大いに受け、よそものの豊後節が江戸の人気をさらったのですから風当たりも強く、その風吹き荒れてとうとう「豊後節禁止」のおふれが出て詮方なく豊後掾は京都へ帰る。しかし多くの弟子たちは江戸に執着を持ち、何とか江戸で芸渡世を続けたいと努力する。結局、看板を変え独立して新しい流派を名乗りました。「常盤津」 「富本」その富本から別れて「清元」が出来た。その他に「富士松」というのもできました。 新内の元祖です。富士松の一門で敦賀太夫というのが間もなく独立して鶴賀若狭掾(つるがわかさのじょう)を名乗る。すなわち鶴賀派の元祖です。するとその一門に新内という人がいて、これが無類の美音です。伝説によれば「鼻に抜ける声」にたまらない味があって誰も彼もこの新内の芸風をまねたというのです。新内は初期には歌舞伎に用いられていたが、後に歌舞伎から離れ、主として吉原を根城に行われ、いわゆる「流し」という街頭芸になっていった。始めは各流派が流していたが、鶴賀新内が流しに参加し始めたころから「富士松」とも「鶴賀」とも言わないで新内流しが出来た。新内は貧しい階級の中で守り育てられてきたことも他にない特徴ではないか。

同成社 定本 新内集

2008-07-23

最悪のWebデザイン

悪いデザインのサイトというのはいくつかある。例えばFlash一個で構成されているサイトであるとか、解像度やフォントサイズが、ピクセル数でガチガチに固定されているサイトなどだ。しかしこのたび、予想だにしなかった方法で、今まで見た中で最悪のWebデザインを実現しているサイトを発見した。

Sporeというゲームがある。そのゲームの、日本の公式サイトの、壁紙を配布しているページなのだが。

http://www.japan.ea.com/spore/amusement/gift.html

さて、実際にファンサイトキットか壁紙を落とそうとしてみて欲しい。

落とせただろうか。例えば壁紙を落とす場合のJavaScriptは、次のようになっている。

function confirmLegalNewWindow( url, windowName, width, height) {

var P1 = "素材のダウンロードに関する諸条件\n\nエレクトロニック・アーツ・インクおよびその下請会社、関連会社並びに使用許諾者(以下、一括して「EA」という)は、EA製品に関連して、お客様の個人的で非営利的な用途の目的に限り、下記の条項に従って、ソフトウェア・ツール(以下「本ツール」という)および・または資料(以下「本資料」という)(以下、一括して「本ツール・資料」という)のコピー1部をダウンロードおよび・またはインストールして使用するための譲渡不可能で非独占的な使用権をお客様に付与します。\nEAは、本ツール・資料に関する権利、権限および権益のすべてを所有します。お客様は、本ツール・資料またはEA製品に含まれるかまたはそれらに付けられたEAの商標またはロゴを変更することはできず、また、EAの商標または著作権表示を変更または除去することはできません。お客様が本ツール・資料を使用する権利は、上記で認められた使用権のみに限定され、お客様は、上記以外の点で、本ツール・資料をコピー、表示、配布、実行、出版、変更または使用したり、それらから制作物を作成したりすることはできません。前文を制限することなく、お客様は、本ツールを修正、リバース・エンジニアリング、逆アセンブル、使用許可、譲渡、配布または販売したり、それから制作物を作成したりすることはできず、また、本ツール・資料を使用して営利的または非合法な目的を推進することはできません。前記内容を制限することなく、お客様は、他の製品もしくは事業の販売を促進するために、または、サーバー・エミュレータを運用もしくは販売促進するサイトにおいて、本ツール・資料を使用することはできません。\nお客様は、EA製品ファン・コミュニティーの非営利的な利益のために、お客様の個人的で非営利的なウェブサイトに、本ツール・資料を用いて作成した資料を含めることができます。ただし、これは、EAがかかる製品のためになると判断した場合に限られ、かつ、お客様がかかる行為を行った場合にはまた、かかる資料が置かれたのと同じ、お客様のサイトのウェブページ上に、次のような掲示も行わなければなりません。「本サイトは、エレクトロニック・アーツ株式会社またはその使用許諾者によって承認されておらず、また、それらとは無関係です。商標は、それら各所有者の専有物です。ゲーム・コンテンツおよび資料の著作権は、エレクトロニック・アーツ株式会社およびその使用許諾者が所有します。無断転載禁止。」お客様は、お客様のサイトがエレクトロニック・アーツ株式会社または当社の使用許諾者によって承認もしくは認可されるか、または、それらと関係がある旨の表明を行わず、また、お客様のサイトのその他のコンテンツがEAまたは当社の使用許諾者によって承認もしくは認可されるか、または、それらと関係がある旨の表明を行わないものとします。\n本ツール・資料は、明示的または黙示的ないかなる種類の保証もなく、「現状のまま」提供されます。EAは、特に、特定目的への適合性、商品性および権利侵害の不在に関する保証を致しません。\nお客様が本ツール・資料を用いてなすことを選んだ一切の使用は、全面的にお客様の責任において、お客様によって引き受けられます。EAは、本ツール・資料がお客様のコンピュータ・システム、ネットワーク、ソフトウェアまたはその他の技術に損害を生じさせない旨の保証は行いません。\nEAは、本ツール・資料に対してサポートを行いません。本ツール・資料についてEAの顧客サポート窓口に電話したり、Eメールを送付したりしないで下さい。なぜなら、EAは、これらの問い合わせに答えることができないからです。\nEAがかかる損害の可能性について警告を受けていた場合であっても、EAは、本使用許諾から生じるかまたはそれに関連する直接的、間接的、付随的、特別、懲罰的またはその他いかなる損害についてであろうと、一切、それらの損害について責任を負わないものとします。\nEAは、何人に対しても義務を負うことなく、いつでも、本ツール・資料の可用性を中断するか、または本ツール・資料を変更する権利を留保します。\nEAの要請により、お客様は、お客様による本使用許諾の違反および・またはお客様による本ツール・資料の使用または誤用から生じるすべての債務、請求額および費用からEAを防御して免責することに同意します。かかる債務、請求額および費用には、弁護士料金も含まれます。\nEAは、米国および・またはカナダおよび・または欧州連合に位置するEAのサイトにおいて、本ツール・資料を利用に供することができます。お客様は、お客様自身の場所においてお客様の本ツール・資料の使用に適用されるすべての連邦、州および現地の法律を了解して遵守することに単独で責任を負います。本ツール・資料をダウンロードすることによって、お客様は、米国および・またはカナダおよび・または欧州連合またはその加盟国が商品の通商を禁じている国に自身が位置しておらず、また、かかる禁輸人物または場所に本ツール・資料を輸出しようとしていないことを保証します。\nEAは、その単独の裁量により、いずれの理由によろうと、または理由がなくても、いつでも、本使用許諾を取り消すかまたは解除することができます。解除され次第、お客様は、すべての本ツール・資料を破棄するかまたはEAに返却しなければなりません。本使用許諾は、米国著作権およびカリフォルニア州法に(法律の抵触にかかわらず)支配され、本ツール・資料に関するEAとお客様との間の完全なる合意となります。\n上記の条項に同意する場合には、「OK」を、中断する場合には、「キャンセル」をクリックして下さい。キャンセルした場合には、本ツール・資料を使用することはできません。";

if (confirm(P1)) {
window.open(url, windowName, "width="+width+", height="+height);
}
}

誰だこんなアホなJavaScript書きやがった奴は。このスクリプトの実行の結果表示される、confirmダイアログのサイズだが、Windows環境で、Operaは507x1512、Firefoxは607x1231、IE7は、デスクトップの解像度が1920x1200の場合は1208x681で、1200x1920の場合は497x1419になる。ただし、IE7の場合は、すべてのテキストを表示しないので、正しく動作しているとは言いがたい。

つまり、WUXGA(1920x1200)のディスプレイを持ってしても、この確認ダイアログはまともに機能しない。WUXGAの回転させることができるディスプレイを持っている者か、WQXGA(2560x1600)の、はっきり言ってまだ一般的ではない高価な業務用ディスプレイを持っている奇特な者しか、確認ダイアログを動作させることは出来ないわけだ。Safariでは確認していないから、ひょっとしたらSafariはまた違った挙動をするかもしれない。しかしまあ、仮にSafariでは問題がなかったとしても、IE、Opera、Firefoxで機能しないのだから、ネットユーザーの実に95%の環境では、動かないということになる。Mac版Firefoxを使っている者はもっと悲惨で、確認ダイアログの上部に閉じるボタンが表示されないために、ブラウザが操作不能になってしまうらしい。

さて、悪いのは誰だろう。水平方向にサイズが小さい確認ダイアログを出す各ブラウザだろうか。あるいは、糞長い文字列をつかうSpore公式サイトだろうか。

2008-07-22

見ておきたい歌舞伎

三人吉三廓初買は、少し前に南座で見たのだが、何せ三等席だったので、あまり楽しめなかった。やはり花道の近くで見たいものだ。

月も朧に白魚の、篝も霞む春の空、つめてぇ風もほろ酔いに、心持ちよくうかうかと浮かれ烏のただ一羽、寝ぐらへ帰ぇる川端で、棹の雫か濡れ手で粟、思いがけなく手に入る百両、ほんに今夜は節分か、西の海より川のなか、落ちた夜鷹は厄落とし、豆沢山で一文の、銭と違って金包み、こいつぁ春から縁起がいいわい

白浪五人男は、正確には、青砥稿花紅彩画(あおとぞうしはなのにしきえ:読めるかこんなもん)と言うそうだが、これは是非とも見ておきたい。

玉島逸当(実は日本駄右衛門)「ゆすりかたりのそのなかでも、さだめて名のある者であろうな」
弁天小僧菊之助「エー、それじゃあまだお前方、わっちらの名前を知らねぇのか」
番頭達「どこの馬の骨か、知るものかい」
弁天小僧菊之助「知らざあ言って聞かせやしょう。浜の真砂と五右衛門が、歌に残せし盗人の、種ぁ尽きねえ七里ヶ浜、その白浪の夜働き、以前を言やあ江ノ島で、年季勤めの稚児ヶ淵、百味講で散らす蒔銭を、当てに小皿の一文字、百が二百と賽銭の、くすね銭せえだんだんに、悪事はのぼる上の宮、岩本院で講中、枕捜しもたび重なり、お手長講と札付きに、とうとう島ぁ追い出され、それから若衆の美人局、ここやかしこの寺島で、小耳に聞いたじいさんの、似ぬ声色で小ゆすりかたり、名せえ由縁の弁天小僧菊之助たあ、俺がことだ」

また、今年の前半、平家物語を読んでいたこともあって、勧進帳は一度ぐらい見ておきたい。義経は嫌いだけれど。

勧進帳といえば市川團十郎だが、外郎売も聞いてみたいが。

七月大歌舞伎

二週間続けて、昼夜の松竹座の七月大歌舞伎を見てきたが、なかなか面白い。

まず、おととい見た昼の部、春調娘七種は曽我兄弟の話なのだが、踊りで、あまり面白くない。父親の話では、若いときは舞踏は面白くないものだということであった。何がなんだかさっぱり分からない。おそらくは、曽我兄弟の劇も見ずばなるまい。

木村長門守は、豊臣家と徳川家の講和の話で、家康の血判を取りに良く場面だ。面白かったのは、左團次の演ずる家康で。なんだか人のよい爺さんになっている。

伽羅先代萩は、伊達騒動の話なのだが、この辺の時代背景には明るくないので、いまいちよく分からない。まあ、「お腹がすいてもひもじゅうない」というセリフなど、有名ではあるが。

夜の部は、二週間前に見た。熊谷陣屋は、その名の通り、熊谷の陣屋の話だ。平家物語は、今年の前半に読破していたため、これはとても楽しめた。熊谷の登場の仕方が、花道をノシノシと歩くので、なかなか格好がよい。しかし、梶原はよっぽど嫌われていると見える。この話でも、顔の色が変な、分かりやすい悪役の梶原が出てきて、「見いちゃった。見いちゃった。頼朝に告げてやろ。」という具合にしょうもない人間を演じる。私は判官贔屓というのはどうも嫌いな性なのだ。だいたい義経というのは私の印象では、夜間の行軍が暗すぎるというので、民家に火をつけて、「おう、明るくなったわい」などとげひた笑いをする人間なのだが。まあ、歌舞伎ではやたらと持ち上げるキャラなのだけれど。

さて、黒手組曲輪達引だが、これは助六の同人である。ドコにオリジナリティがあるんだというぐらいパクっている作品だ。権九郎の阿呆の演技があるのだが、この所作がいちいち面白い。元々パロディなので、ネタも取り入れやすいのか、川に落ちた権九郎が、鴨に食われて命だけは助かったといいながら、鴨の着ぐるみで登場したり、カーネル・サンダースがでてきたり、阪神タイガース教の信者まで出てくる始末。最後の格闘は、傘や土台を使って、やたらと派手だった。

羽衣、これは舞踏で、実に眠たかった。ここだけ唯一、うつらうつらとしながら見ていた。やはり舞踏の面白さはわからない。団子売の方は、まだいくらかマシだったが。

2008-07-20

万人がWebブラウジングのためにOperaを使う理由

プログラマが生産性を上げるためにFirefoxを使う理由 - wiseler : WAR IS PEACE

1. カスタマイズする必要が無い
君はわざわざカスタマイズしないと使い物にならないテキストエディタを使うというのかね? 一般人にとっては、そのソフトウェア独自のカスタマイズ方法を学ぶのは面倒で、デフォルトは多くの人に使いやすくなっているべきだ。
2. 高セキュリティ
ソフトウェアを過信するべからず。警告は出せるが、結局使うのは人間である。
3. DragonFly相当の機能が追加できる
OperaにはDragonFlyがある。何も追加する必要は無い
4. 開発者向けツールが日々開発されている
そんなに暇じゃない。
5. 使える履歴検索
アドレスバーからの履歴全文検索の機能は、Operaにもある。
6. 標準のインターフェース
標準じゃないインターフェースのブラウザ? はて。
7. 携帯やWiiブラウザでの表示確認がいりません。
Operaは最も広く使われている組み込み向けブラウザであり、WiiとはOperaである。また、表示確認が要らないとはいえ、多くのモバイル機器は、画面がとても小さく、PC用のブラウザと同じというわけにはいかない。Operaには小さい画面をエミュレートする機能もある、DragonFlyを使えば、モバイル機器で動作するOperaのWebのデバッグも可能だ。Firefox? ああ、今ごろ組み込み向けを始めようとしているんだっけ? だいたいAcid2に対応したのはFirefox3からである。CSSのサポートも、Firefox2ではOperaに負けていた。
8. 充実したホームページ
そもそも、君はホームページなど活用しているのかね? プログラマならブラウザは常時立ち上げているのが当然である。ホームページ機能などいつ使うというのか。そんなことよりブックマーク機能を何とかしたまえ。大多数の人間は、マウスを使って操作するのだ。わざわざ手をキーボードに持っていってキーワードを入力などしたりしない。
9. RSSリーダーの自由
Google Readerが素晴らしすぎるのでクライアント側で動くRSSリーダーなどいまさら時代遅れである。もっとも、あなたがはてなRSSリーダーで満足できるならば、大抵のRSSリーダーでも満足できるだろう。
10. デフォルトでUser.jsがOFFである
User.jsを設定するのはユーザの仕事ではなかろうか。有効であろうが無効であろうが何の問題があるのか。
11. Gmailをそのままで高速に使える
OperaがXMLHttpRequestをサポートしていなかったのは大昔の話で、今は普通に使える。
12. Javascriptが世界標準
独自機能も多し
13. 高いシェア
IEの牙城を崩すには、もうしばらく時間がかかる

2008-07-18

もし100ドルあるならWSDKをどのように改善するか

Microsoft Windows SDK Blog : How would you spend $100 to improve Windows SDK components?

IMAO、「GDI+のヘッダからminとmaxマクロの使用を取り除く」

GDI+のヘッダから、minとmaxマクロの使用を取り除くには、100ドルで十分なはずだ。もちろんテストなどを考えると100ドルではとても足りないが、それを言い出すと、どんな修正であっても、100ドルでは足りないということになってしまう。

つーかなんでGDI+のヘッダでmin/maxマクロを使っているんだよ。XP時代に書かれたものだろ。

2008-07-17

プリプロセッサメタプログラミング ファイルイテレーション

さて、インデントを保つにはどうすれば良いのか。それには、ファイルイテレーションと呼ばれている方法を用いるのだが、いやはや、なんとも解説しがたいコードではある。

#if !BOOST_PP_IS_ITERATING

#ifndef HITO_FUNCTION_TRAITS
#define HITO_FUNCTION_TRAITS

#ifndef FUNCTION_MAX_ARITY
#define FUNCTION_MAX_ARITY   15
#endif // #ifndef FUNCTION_MAX_ARITY

#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/iteration/iterate.hpp>
#include <boost/preprocessor/iteration/local.hpp>
#include <boost/preprocessor/repetition/enum_params.hpp>
#include <boost/preprocessor/repetition/enum_trailing_params.hpp>

// Primary Template class
template < typename Signature >
struct function_traits ;

#define BOOST_PP_ITERATION_PARAMS_1   (3, (0, FUNCTION_MAX_ARITY, "function_traits.hpp"))
#include BOOST_PP_ITERATE()




#endif //#ifndef HITO_FUNCTION_TRAITS

#elif BOOST_PP_ITERATION_DEPTH() == 1 // #if !BOOST_PP_IS_ITERATING

#define n BOOST_PP_ITERATION()

template < typename R BOOST_PP_ENUM_TRAILING_PARAMS(n, typename T) >
struct function_traits< R( BOOST_PP_ENUM_PARAMS(n, T) ) >
{
    typedef R return_type ;
    static int const number_of_aritys = n ;
#if n != 0
#define BOOST_PP_ITERATION_PARAMS_2   (3, (0, n-1, "function_traits.hpp"))
#include BOOST_PP_ITERATE()
#endif
    
} ;

#undef n

#elif BOOST_PP_ITERATION_DEPTH() == 2 // #if !BOOST_PP_IS_ITERATING

#define n BOOST_PP_ITERATION()
typedef BOOST_PP_CAT(T, n) BOOST_PP_CAT(Arg, n) ;
#undef n

#endif // #if !BOOST_PP_IS_ITERATING

しかし、ためしにVCのコンパイラにプリプロセスさせてみると、恐ろしく大量の改行を吐く。これでは意味がない。試みに、前回のコードを多少手直ししてみると。

#ifndef HITO_FUNCTION_TRAITS
#define HITO_FUNCTION_TRAITS

#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/repetition/enum_params.hpp>
#include <boost/preprocessor/repetition/enum_trailing_params.hpp>

#ifndef FUNCTION_MAX_ARITY
#define FUNCTION_MAX_ARITY 15
#endif // #ifndef FUNCTION_MAX_ARITY

template < typename Signature >
struct function_traits ;

#define HITO_arg_typedef(z, n, unused)                 \
typedef BOOST_PP_CAT(T, n) BOOST_PP_CAT(Arg, n) ;

#define HITO_function_traits(z, n, unused)               \
template < typename R BOOST_PP_ENUM_TRAILING_PARAMS(n, typename T) >  \
struct function_traits< R ( BOOST_PP_ENUM_PARAMS(n, T) ) >       \
{                                    \
    typedef R return_type ;                     \
    static int const number_of_aritys = n ;             \
    BOOST_PP_REPEAT(n, HITO_function_typedef, ~)          \
} ;

BOOST_PP_REPEAT(FUNCTION_MAX_ARITY, HITO_function_traits, ~)

#undef HITO_function_traits
#undef HITO_arg_typedef

#endif //#ifndef HITO_FUNCTION_TRAITS

こちらの方が分かりやすい。何しろ、Boostの素晴らしいプリプロセッサライブラリのおかげで、リピートのネストというものを意識しないでいい。コンパイル速度向上の点から言えば、実はマクロのz引数を利用したほうがいいのだが、最近のハードウェアはだいぶ早いし、特に意識する必要も無い。

2008-07-16

Boost.Preprocessor Meta Programmingについて

いままで、C++の中で、どうしても避けていたものがある。それはプリプロセッサメタプログラミングだ。理屈としてはこうだ。ご存知のとおり、テンプレートメタプログラミングは、コンパイル時にプログラミングをする、すなわちメタプログラムだ。しかし、ふと気づいてみれば、C++にはプリプロセッサと言うものがある。これはコンパイルの前段階に、単純なテキストとしての置換などを行う機能を提供する。うん、置換? それはひょっとして、利用できないだろうか。いやそんなはずはない。出来る。

とはいえ、プリプロセッサを使って単なる置換以上の意味のあるメタプログラミングをするのは、とても難しい。そこで、簡単にメタプログラミングを行うため、ライブラリを作る必要性が生じる。それがBoostのプリプロセッサライブラリだ。

テンプレートは、我々をして同じようなコードを何度も書かせるという、非人間的な作業から解放してくれる。我々は、vector<char>やvector<int>、と書けばよく、ほとんど記述が同じようなクラス、vector_intやvector_charを書かずにすむ。しかし、ある種のコードは、いまだにこの手のコピペを必要とする。例えば、型としての関数を取るテンプレートクラスを実装したいとする。典型的な例は、Boost.Function や、Boost.FunctionTypes などだ。ここでは、問題を分かりやすくするため、function_traitsなるものを実装したいとする。function_traitsはblobで汚いメタ関数で、型として関数を渡すと、戻り値の型、引数の数、各引数の型(Arg0~ArgN-1まで)を返す。次のように使う。

function_traits< int(char, short, int) >::return_type ; //int
function_traits< int(char, short, int) >::number_of_aritys ; //3
function_traits< int(char, short, int) >::Arg1 ; // short

早速実装しよう。このメタ関数は、普通のメタプログラマならば誰でも書ける、とても簡単で初歩的なものだ。

template < typename Signature >
struct function_traits ;

template < typename R >
struct function_traits< R() >
{
    typedef R return_type ;
    static int const number_of_aritys = 0 ;
} ;

template < typename R, typename T0 >
struct function_traits< R(T0) >
{
    typedef R return_type ;
    static int const number_of_aritys = 1 ;
    typedef T0 Arg0 ;
} ;

template < typename R, typename T0, typename T1 >
struct function_traits< R(T0, T1) >
{
    typedef R return_type ;
    static int const number_of_aritys = 2 ;
    typedef T0 Arg0 ;
    typedef T1 Arg1 ;
} ;

template < typename R, typename T0, typename T1, typename T2 >
struct function_traits< R(T0, T1, T2) >
{
    typedef R return_type ;
    static int const number_of_aritys = 3 ;
    typedef T0 Arg0 ;
    typedef T1 Arg1 ;
    typedef T2 Arg2 ;
} ;

うむ、このコードは非人間的である。まるで機械生成したようなコードだ。何故機械にやらせないのか。

機械的にこのコードを生成するためには、いくつか方法がある。まずは賢いエディタを使って生成する方法がある。あるいは、このコードを生成するためのコードを書く方法もある。しかしこれらは、C++の範囲外の話であり、例えばあらかじめ生成されたコードが、引数を30個までサポートしていたとしても、誰かが引数を31個取る関数を書かない保証は無い。引数の数を設定可能なコードを生成するツールを書いたとしても、ユーザはそのツールを使いこなさなければならない。とても面倒だ。

よろしい、ではプリプロセッサだ。すべてのC++コンパイラはプリプロセッサを持っており、コンパイラ間のプリプロセッサの互換性は、テンプレートに比べればかなり高い。それに、プリプロセッサは、C++コードの中に、直接埋め込める。実に理想的だ。プリプロセッサを使えば、上記のコードは次のように書ける。

#ifndef HITO_FUNCTION_TRAITS
#define HITO_FUNCTION_TRAITS

#include <boost/mpl/int.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/repetition/enum_params.hpp>
#include <boost/preprocessor/repetition/enum_trailing_params.hpp>

#ifndef FUNCTION_MAX_ARITY
#define FUNCTION_MAX_ARITY 15
#endif // #ifndef FUNCTION_MAX_ARITY

template < typename Signature >
struct function_traits ;

#define HITO_function_typedef(z, n, unused) \
typedef BOOST_PP_CAT(T, n) BOOST_PP_CAT(Arg, n) ;

#define HITO_function_traits(z, n, unused) \
template < typename R BOOST_PP_ENUM_TRAILING_PARAMS(n, typename T) > \
struct function_traits< R ( BOOST_PP_ENUM_PARAMS(n, T) ) > \
{ \
    typedef R return_type ; \
    static int const number_of_aritys = n ; \
    BOOST_PP_REPEAT(n, HITO_function_typedef, ~) \
} ;

BOOST_PP_REPEAT(FUNCTION_MAX_ARITY, HITO_function_traits, ~)

#undef HITO_function_traits
#undef HITO_function_typedef

#endif //#ifndef HITO_FUNCTION_TRAITS

素晴らしい。こんなに短いコードで、引数を15個もサポートしている。もし引数がもっと必要なのであれば、FUNCTION_MAX_ARITYを定義するだけで、引数をいくらでも増やせる。

実際のプリプロセッサの実装はとても面倒なのだが、このように、Boostのプリプロセッサライブラリを使えば、実装を気にする必要がなく、意味に集中してメタプログラミングができる。

とは言ったものの、このコードはとても読みにくい。というより、このまま人間が読むのは不可能である。であるからして、どのコンパイラにもついているであろう、プリプロセスの結果を吐く機能を使えば、どんなコードなのかが分かる。がしかし、このままではわかりづらい。というのも、このプリプロセッサメタコードは、あくまでプリプロセッサであるので、吐くコードは、こんな感じだからだ。VC9の場合。

template < typename R > struct function_traits< R ( ) > { typedef R return_type ; static int const number_of_aritys = 0 ; } ; template < typename R , typename T0 > struct function_traits< R ( T0 ) > { typedef R return_type ; static int const number_of_aritys = 1 ; typedef T0 Arg0 ; } ; template < typename R , typename T0 , typename T1 > struct function_traits< R ( T0 , T1 ) > { typedef R return_type ; static int const number_of_aritys = 2 ; typedef T0 Arg0 ; typedef T1 Arg1 ; } ; template < typename R , typename T0 , typename T1 , typename T2 > struct function_traits< R ( T0 , T1 , T2 ) > { typedef R return_type ; static int const number_of_aritys = 3 ; typedef T0 Arg0 ; typedef T1 Arg1 ; typedef T2 Arg2 ; } ;

これではなにがなんだか分からない。手動でインデントするか、あるいはインデントしてくれるツールに頼らなければならない。これを解決するには、何とかインデントや改行を保つ方法が欲しい。それはまた気が向いたら解説する。どうしても続きが読みたい人はコメントで催促してくれればやる気が出るかもしれない。

追記:
実は、number_of_aritysは後から付け足したもので、まったくテストしていなかった。そのため、プリプロセッサメタプログラミングを使ったコードは正しい結果を出力するが、手動のコピペコードは間違えたままであった。また、プリプロセスされたコードも、実はズルをして、手動で書いたコードの空白と改行を消しただけだったので、そのミスがそのまま残ってしまった。プリプロセス済みのコードも、実際にコンパイラに吐かせた。

2008-07-15

芥川賞が世間の注目を集めるために必死

ついこの間、世間知らずのお嬢様と、恥知らずなビッチを受賞させたことで有名な芥川賞が、今度は中国人を受賞させることで、一段と注目を集めようと必死だ。太宰治の才能を見抜けなかった時点で、いまさら誰を受賞させようとどうでもいいのだが。だいたい障子をチンポで破る話だとか、親指の爪が剥がれた学生が胸チラに見入る話だとか、今になって思えばくだらない話ばっかり受賞しているのだから。最近では、ヒキオタの背中にケリいれる話だとか、ビッチのビッチによるビッチのための話が、話題集めのために、受賞しているが。

一体どのようにしてモヒカンを維持しているのだろう

例のiPhoneのモヒカン男が人気を呼んでいるが、一体どうやって、あそこまで見事なモヒカンを維持しているのだろう。というのも、頭髪というのは、バリカンで剃っても、三日もすれば目立ってくるし、剃刀でもってツルツルに剃り上げたとしても、一週間たてばフサフサである。だから、坊主頭を維持しようとすれば、ほぼ毎日剃る必要がある。それだけでもめんどくさいのに、モヒカンである。縦一筋は、髪を残さなければならない。一体どうやって維持しているのだろう。

ここで永久脱毛という言葉をあげる人がいるかもしれないが、あれはそうおいそれとできるものではない。なにしろ、すべての毛根から毛が生えているわけではないので、頭髪を脱毛しようとすると、何十回となく脱毛処理を行わなければならない。何年もかかる、根気の要る作業である。しかも、髪が生えなくて困っている人には気の毒だが、それでも生えてくるのだ。処置した毛根からも、何年も過ぎるうちに、結局毛が生えるようになってしまうらしい。

そんなわけで、毎朝目が覚めたら、洗眼歯磨髭剃と共に、頭を剃らなければならない。面倒なこと限りなし。というわけで、あなたがもし、毎日スキンヘッドやモヒカンを維持している人間を見かけたとしても、必ずしもその人が凶悪な性格をしているとは限らない。むしろ、恐ろしくマメな人である可能性が高い。

2008-07-11

携帯電話各社が固有IDをすべてのサイトに送るようになった

高木浩光@自宅の日記 - 日本のインターネットが終了する日

問題は、頭ごなしに否定することもできないし、かといって、諸手を上げて歓迎することもできないということだ。問題はとても難しく、多くの事を知っていなければならない。本当に難しい。この人もこれだけの文章を書くのに一ヶ月かかったらしい。IPv6にはこの手の脆弱性はないし、cookieとも違うものだ。それらをすべて約めて、ひとつの文章にまとめ上げるというのは、容易ではない。よくやれるものだ。

ともかく私にはとても論ぜられない難解な問題であるので、是非ともこれを読んで欲しい。

まあともかく、私の出した結論としては、「携帯はWebではない」ということだ。携帯のような貧弱な機器でネットを使うことは今まで無かったし、今後も無いだろう。PCの世界がこの貧弱な携帯の世界に汚染されないよう願うばかりだ。

それにしても、Googleがあの手の広告などで成功した理由に、サードパーティcookieを使わなかったというのがあったとは。

ディスクのフラグメント防止に関する興味深いペーパー

The Storage Team at Microsoft - File Cabinet Blog : New File Systems and Storage white papers, by Dilip Naik - MVP
ここの、Best Practices To Avoid Fragmentation While Writing To A Fileというペーパーが興味深い。
Sysinternals Contig

ソースコードが示されていないが、大方はこんな感じだろう。

BOOL SetPrivilege(
  LPCTSTR lpszPrivilege, // name of privilege to enable/disable
  BOOL bEnablePrivilege  // to enable or disable privilege
)
{
    LUID luid ;
    // lookup privilege on local
    if ( !LookupPrivilegeValue( NULL, lpszPrivilege, &luid ) )
    {
        return FALSE; 
    }
    
    TOKEN_PRIVILEGES tp;
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    if (bEnablePrivilege)
      tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    else
      tp.Privileges[0].Attributes = 0;
      
    // Get Current Process Token
    HANDLE hToken ;
    OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) ;

    // Enable the privilege or disable all privileges.
    if ( !AdjustTokenPrivileges( hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES) NULL, (PDWORD) NULL) )
    {
       return FALSE;
    }
    CloseHandle( hToken ) ;

    if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
    {
       return FALSE;
    }

    return TRUE;
}


int main()
{
    // CreateFile
    HANDLE file = CreateFile( L"test.dat", GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL ) ;
    if ( file == INVALID_HANDLE_VALUE )
    {
        return 1 ;
    }
    
    // SetFilePointer to desired file size
    LARGE_INTEGER pointer ;
    pointer.QuadPart = 400 * 1024 ;
    SetFilePointerEx( file, pointer, NULL, FILE_BEGIN ) ;
    
    // SetEndOfFile
    SetEndOfFile( file ) ;
    
    // SetFileValidData
    SetPrivilege( SE_MANAGE_VOLUME_NAME, TRUE ) ;
    SetFileValidData( file, 400 * 1024 ) ;
    
    // SetFilePointer to beginning of file
    pointer.QuadPart = 0 ;
    SetFilePointerEx( file, pointer, NULL, FILE_BEGIN ) ;
    
    // WriteFile in a loop to fill the file with desired data
    // – the loop is executed 400 times and each pass through the loop issues a single 1024 byte WriteFile request.
    char buf[1024] ;
    memset( buf, 0, sizeof(buf) ) ;
    for ( int i = 0 ; i < 400 ; ++i )
    {
        DWORD unused ;
        WriteFile( file, buf, sizeof(buf), &unused, NULL ) ;
    }
    
    // CloseFile
    CloseHandle( file ) ;

    return 0;
}

なぜか管理者権限で実行しても、SetFileValidDataを呼び出した後のGetLastErrorに1314が帰ってきてしまう。しかし、SetFileValidData自体はエラーを返していないので、処理が失敗しているわけでもないのだろうか。ローカルポリシーで確認したが、たしかに、「ボリュームの保守タスクを実行」の権限に、Administratorsが入っている。それにしてもOSの説明が日本語になっているのは面倒だ。こういう部分は敢えて訳さなくてもいいと思うのだが。あるいは、Vistaの言語パックをいれて、英語にしてしまうべきか。

しかし不思議なことに、私の環境では、SetFileValidDataを呼び出さずとも、SetFilePointerとSetEndOfFileだけで、フラグメントは起こらなかった。

インターネットを暗号化するということ

The Pirate Bay Wants to Encrypt the Entire Internet « NewTeeVee

しかし理想を言えば、すべての通信は暗号化されているべきである。もちろん暗号化というのは、単に傍受されないという意味だけではなく、改変を防ぐ意味もある。改変を防ぐのはとても重要だ。例えば、最近ネット上での犯行予告が大々的になって久しいが、もし、犯行予告をでっち上げられたら、困ったことになる。

例えば、アリスが掲示板に書き込む場合、ISP側にマロリーという悪い奴がいて、書き込み内容を改変して、犯行予告に変えたとすると、外側からみれば、どう見ても犯行予告をしたのはアリスである。したがってアリスの自宅は、警察のガサ入れを受ける。あるいは、閲覧する画像を幼児ポルノと差し替えられ、児童ポルノを所持したかどで捕まるかもしれない。何しろ覚えが無いのに、スパムリンクか何かで、恐ろしく小さい画像が、ブラウザのキャッシュフォルダの中に一時期あって、それがWindowsのサムネイル機能によってキャッシュされていたのでさえ、有罪となっているのだから、弁護しても勝ち目は無い。一番恐ろしいのは、「革命の犯行予告」である。ご存知のとおり、我が日本国では、内乱罪の首謀者は死刑である。

ある人は、そんなに簡単にリアルタイムで改変できるはずがないと反論するかも知れぬ。しかし例えば、HalfLifeやUnreal Tournament、Crysisなどといった文字列を、「秋葉原」に変えられたら、どうだろう。「俺は今から某FPSゲームで、戦車で突っ込んで、30人ぐらいヘッドショットしてくるぜ。たとえammoがなくなっても、ナイフがあるし」という発言が、とても危険な犯罪予告になってしまう。しかも恐ろしいことに、Bloggerは書き込みにSSLを用いていない。この文章が改変されないことを祈るばかりだ。恐ろしや恐ろしや。

通信の傍受よりも、もっと恐ろしい改変問題があるのに、大半のインターネットの通信は、暗号化されていない。例えば日本で一番巨大な掲示板、2ch.netは、書き込みはおろか、閲覧に対しても改変されないように暗号化されているということはない。のみならず、一般的なWebサイトは、クレジットカード番号や住所などといった、個人情報を入力するときに限り、SSLを用いている。なんと脆弱なことだろう。皆、途中の中継を信じきっているとは。

DirectX 11があと二週間ぐらいで発表されるらしい

DirectX 11 announcement coming in less than two weeks
NVISION2008 Introduction to DirectX 11

VistaにもDirectX 11は来るんじゃないかな。ドライバモデルとか同じだし。たぶん。まあ、実際にDirectX 11のゲームを動かす頃には、Windows 7に移行しているだろうけれど(今度こそ64bitに移行しているはず)

2008-07-10

宗教じみた二酸化炭素削減

ウシにタンク背負わせ「げっぷ」回収、温暖化研究で

牛のゲップがアルゼンチンのCO2排出量の三割を占めるだと? おいおい、牛なんて有史以前からいたじゃないか。何万年も問題を起こさなかったゲップが、ここ数十年で問題になるとでも言うのか。それ真に牛が問題になるとするならば、適切な問題解決の方法は、牛を絶滅させることである。牛がいなければ、ゲップは起こらない。ゲップが起こらないということは、アルゼンチンのCO2排出が三割減る。

ところで、牛のゲップすら問題にしているこの化学者達に、コーラやビールに含まれる二酸化炭素について意見を聞きたいところだが。

2008-07-07

バチカンのサンピエトロ大聖堂で聖職者のフリをして信者の懺悔を聞こうとした男捕まる

懺悔を聞こうとした偽聖職者が捕まる、サンピエトロ大聖堂 写真2枚 国際ニュース : AFPBB News

【7月6日 AFP】バチカンのサンピエトロ大聖堂(Saint Peter's Basilica)で聖職者を装って信者の懺悔(さんげ)を聞こうとした男性が捕まった。バチカンの日刊紙オッセルバトーレ・ロマーノ(Osservatore Romano)が5日、ジャンルイジ・マッローネ(Gianluigi Marrone)判事の話として伝えた。

 同判事は「しばらく前」の出来事として、「男は聖職者の衣服を着用していたが、警備員は男の行動が不自然なことにすぐに気づいた」と述べた。

 警備員は、男に身分証明書の提示を求めたところ一見問題なさそうだったものの、念のためイタリア警察に身元照会を依頼すると、男が別の教会でも同様の企てをしていたことが発覚したという。(c)AFP

なんだ、岸辺露伴のことか。

2008-07-05

Another One Bites The Dustが頭から離れない

こんな風に聞こえる。

一丁上がり
一丁上がり
また一匹、もう一匹
一丁上がり
おい、お前も殺ってやるよ
一丁上がりっと

C++0xの完全なドラフトが9月に出ること、および、Iotaについて

yey! : Trip Report: June 2008 ISO C++ Standards Meeting « Sutter’s Mill

しかし、iotaはどういう語源なんだろうと思って調べてみた。何しろ、ノンネイティブな私に乗っては、意味がさっぱり分からない。iota(v.begin(), v.end(), 1)などと書かれていても、さっぱり意味が分からない。

アルゴリズム、iotaはとても簡単である。意味も簡単であれば、実装も簡単。

template < typename Iter, typename Value >
void iota( Iter first, Iter last, Value value)
{
    for ( ; first != last ; ++value, ++first )
    {
        *first = value ;
    }
}

であるから、先ほどの例、iota(v.begin(), v.end(), 1)は、1, 2, 3, 4, 5...という値を、順に代入する。この第参引数の関数オブジェクトを変えることによって、どんな型でも、連番を代入することができる。もちろん、連番である必要は無いが、関数の意味から考えると、連番を入れるためのものだ。連番の配列と言うのは、結構必要になったりする。そのたびに自前でループを書くのは、人間のすることではない。STLを食べて呼吸するプログラマならば、当然そういうよくあるアルゴリズムは欲しいはずだ。

しかし、名前がよく分からない。コレは一体いかなる意味を持てるにや。

まず、意味からだ。イオタとは、ギリシャ語で、[Ι]、[ι]、という文字である。これはローマ字では、IやJになっている。英語圏でイオタというと、"not one iota of difference"(イオタほどの差も無い)という慣用句があり、これは「ほとんど違いが無い」という意味である。つまりイオタは、とても小さい差を意味する。インクリメントは最小の差であるので、意味としてのiota関数は正しい。

プログラミングの話になると、たとえばAPLでは、イオタという文字は、連番の整数値の配列を生成する文字である。実は我々C++プログラマも、知らずにイオタを使っているのである。例えば次のfor文だが、

for ( int i = 0 ; i < 100 ; ++i )
{
// 何か百回行われる処理
    for ( int j = 0 ; j < 100 ; ++j )
        //何か一万回行われる処理
}

参考書などを見ると、大抵は慣習的に、iやjが使われている。この文字の使用は、ことC++にとどまらない。BASICですらIを使ったものだ。何故か。それはiやjが、それぞれ大文字小文字のイオタに相当するからだ。だから使われているのだ。

こうしてみると、意味的にも、プログラミングの慣習的にも、イオタという名称を使うのは正しいということになる。だからもし、iotaを使って、心ない同僚が、「おいおい、その関数名、何やってるか分かりづらいから使うなよな。手でループを書け、手で」などと言おうものなら、こう反論するがいい。「んじゃお前、ループのカウンタとしてiやjも使うなよ。いまから、iやjを使っている参考書の著者全員に抗議してこいよ」と。

Iota - Wikipedia, the free encyclopedia

追記:
でも、ひょっとしたらそんな深い意味はなくて、たんにindexのiかもしれないなぁ。

追記:
変数名の間違いを修正。
変数名iに関しては、Fortranの名残だという説が一般的なようです。
そういえばあれは、変数名によって型が決定される言語でしたっけね。

2008-07-04

HOW CAN I GET RID OF THAT SILLY WARNING

In my Blogger Dashboard, there is a warning like this.

"Your AdSense account needs verification. Please check your email for the Google AdSense Verification message."

What? I've never use silly AdSense and I've never won't to use. Why did you ask? And why this f***ing warning remain for a months? How can i get the f*** rid of it?

I googled it and found the solution like "you can login to your Google AdSense Control Panel and then grant blogger access so you can use your Ads and warning will be removed soon."

grant? what for? I don't want any Ads on my blog. Why this silly warning is apeared?

Another one bites the dustのパロディ、Another One Rides The Bus

ジョジョの奇妙な冒険の第四部、吉良の使うスタンド、キラークイーン第三の爆弾に、bites the dust(負けて死ね)というものがある。スタンドの元ネタは、ほとんど歌から来ているので、元ネタを聞いてみようと思ってググったところ、聞き覚えのある歌であった。

どこかで聞いたことがある。そう、Al Yankovicの歌、Another One Rides The Busだ。

何だかこっちの方がいい歌だ。というのも、この歌が実感できるからだ。三十三間堂あたりから、バスに乗って京都駅に向かう人間のどれほど多いことか。京都駅なんて近いじゃないか、あんなギュウギュウ詰めのバスに乗るぐらいだったら、歩いていったほうがどれほどマシか。

Viacom曰く「素人の作った動画より俺らの動画の方が人気だ」

Judge Orders YouTube to Give All User Histories to Viacom | Threat Level from Wired.com

viacom曰く、「素人の作った動画より、俺らが著作権を持っている動画の方が人気なはずだ。だから全ユーザのIPアドレスとユーザ名のリストをよこせ」と。
どうも、裁判でGoogleはviacomに、情報を提供すべしと決まったそうなのだ。

しかしねぇ、YouTubeでトップなのは、Evolution of Danceで、これには他人の著作権のある音楽が大量に使われているとはいえ、fair useの範囲内であると思うのだけれど。

2008-07-03

日本人はブラックユーモアを解しない、例外はある

東国原知事を殴りに行ってもいいですかと書いたところ、反論が多い。私は至極当然の事を言っているだけなのだ。県知事は、教育に暴力を用いるべきだという。私は、県知事が言うところの「教育」を行いたいだけなのだ。あるいはこの条例が、小中学校の教師にのみ適用されるのであって、お前が県知事を殴ることにまで適用されないと反論する人がいるやも知れぬ。それは不思議なことだ。なぜならば、法と言うものは、多くの人が正しいと信じている事を明文化するだけの事だからだ。例えば、我が日本国では、尊属殺や姦通罪というものが、かつて存在した。これは多くの人が、当時の価値観で、正しいと信じていたからこそ、成り立った法なわけだ。教員免許を持った教師が児童に対する時にのみ合法化される暴力と言うのは、とても不思議だ。

あるいは、日本人というのは、この手の回りくどいブラックユーモアを解しない人種なのかもしれない。イギリスでは、今でもモンティパイソンといえば王道だが、日本ではいまいち知名度が高くない。ここはひとつ、かつて存在した、ブラックユーモアを解する日本人の名文を引くとしよう。芥川龍之介の邪宗門である。

現に内裡の梅見の宴からの御帰りに、大殿様の御車の牛がそれて、往来の老人に怪我させた時、その老人が反って手を合せて、権者のような大殿様の御牛にかけられた冥加のほどを、難有がった事がございましたが、その時も若殿様は、大殿様のいらっしゃる前で、牛飼いの童子に御向いなさりながら、「その方はうつけものじゃな。所詮牛をそらすくらいならば、なぜ車の輪にかけて、あの下司を轢き殺さぬ。怪我をしてさえ、手を合せて、随喜するほどの老爺じゃ。轍の下に往生を遂げたら、聖衆の来迎を受けたにも増して、難有く心得たに相違ない。されば父上の御名誉も、一段と挙がろうものを。さりとは心がけの悪い奴じゃ。」と、仰有ったものでございます。その時の大殿様の御機嫌の悪さと申しましたら、今にも御手の扇が上って、御折檻くらいは御加えになろうかと、私ども一同が胆を冷すほどでございましたが、それでも若殿様は晴々と、美しい歯を見せて御笑いになりながら、

「父上、父上、そう御腹立ち遊ばすな。牛飼めもあの通り、恐れ入って居るようでございます。この後とも精々心にかけましたら、今度こそは立派に人一人轢き殺して、父上の御名誉を震旦までも伝える事でございましょう。」と、素知らぬ顔で仰有ったものでございますから、大殿様もとうとう我を御折りになったと見えて、苦い顔をなすったまま、何事もなく御立ちになってしまいました。

権利者による申し出? そんな馬鹿な

恐ろしく久しぶりにニコニコ動画を見ようとしたら、次のようなメールが来ていた。

hito様
いつもSMILEVIDEOをご利用いただきありがとうございます。
さて、お客様がアップロードされた以下の動画につきましては、権利者様より権利侵害との申し出がございましたので、当該動画の削除とアップロード一時停止(24時間、現在一時停止期間中の場合は停止期間の24時間延長)の措置をとらせていただきました。
http://www.nicovideo.jp/watch/sm477617 
お心当たりの場合は、今後ご注意いただけますようお願い申し上げます。
なお、本件についてご質問等がございましたら以下のフォームよりお問合せをお願い致します。
http://www.nicovideo.jp/support_form
※このメールアドレスは送信専用ですのでご返信いただけません。

「権利者様より権利侵害との申し出がございました」だって? おいおい、その削除された動画って、これだぜ。

http://www.youtube.com/watch?v=8oGWOV59vQg

コレはどういう動画かというと、まず、ディスカバリーチャンネルにMythBusters(邦題:怪しい伝説)という、人気のテレビ番組がある。そのマネをした動画だ。私はだいぶ前に、この動画をニコニコ動画にも上げておいた。ご存知のように、米国の著作権法では、fair useにより、パロディに許可を必要としない。だからこのパロディも完璧に米国内では合法であり、その著作権はパロディを行った者に属する。また、日本と米国との間の著作権は、万国著作権条約によって相互に認められているはずである。したがってこの動画がニコニコ動画から、「権利者からの申し出」によって削除されるには、このパロディを作った本人、または正当な代理人が申し出なければならないはずである。本当にそうなのか? 疑問だ。

FizzBuzzを解くにあたって、他のシーケンスはどうなのか

FizzBuzzを他のシーケンスでも試してみた。まずは、boost::mpl::list だ。結局、要素を端に追加していくだけなのだから、listの方が早いのではないか。そもそも、Loki のシークエンスといえば、list だし。

まず、boost::mpl::list は、コンパイル時の、前方向のみのリンクリストである。push_frontとpop_frontをサポートしている。前回のコードは、push_backを用いていたために、100から1まで減少していくループだったが、今度は逆に、1から100まで増加させるループになる。

単純な変更なので、コードは貼らない。結果は、とても遅かった。vectorとは比べ物にならないほど遅かった。どうやら、C++ Template Metaprogrammingの記述は正しいらしい。vectorに対する利点としては、サイズが限定されていないということだけだ。vectorの実に倍以上のコンパイル時間がかかる。Lokiが書かれた時代のCPUとコンパイラでは、とても遅かったに違いない。Lokiが流行らなかった理由も分かるというものだ。

vectorの固定サイズ限定というのも、typeof拡張のあるコンパイラで消失し、要素の追加もとても高速になるらしい。つまり、C++0xのdecltypeが楽しみだということだ。

では、dequeはどうか。実は、MPLの実装では、dequeとはvectorそのものである。現行のドキュメントを見ると、どうやらvectorもpush_frontなどをサポートしているようだ。ならば話は早い。push_frontを使ったほうが、1から100までインクリメントさせていくループなので、人間的に分かりやすい。

電子書籍が日本で売れない理由

電子書籍端末売れず──ソニーと松下が事実上撤退 - ITmedia News

海外では結構売れているらしいのに、日本では売れていない。この理由として、高価であるとか、出版社が協力しないために、書籍の数が少ないであるなどの理由がつけられている。高いといっても、たったの四万だ。PC用のディスプレイだってそれぐらいする。それに書籍数でいえば、現在、青空文庫には7290冊のパブリックドメインな過去の作品がある。ほとんどが、国語教科書に登場するような有名なものがばかりだ

あるいは、やはり日本人は紙を好むであるとか、重量であるとか、色々理由が挙げられるかもしれない。

しかし、俺様の尊大な意見では、単にDPIが低くて漢字が読みにくかったんじゃないのかと。

神はいずこ

Digg - Where is your god now?

コメントがモンティパイソンだ。やはり王道なんだろうな。

2008-07-02

メモリ使用量の多さに、Fワードを連発するビルゲイツ

Larry Osterman's WebLog : BillG Memories, Part 2

私はヒラなので、ビルゲイツとは、そう、おいそれと話し合ったりしていない。だからビルゲイツとのやり取りはとても記憶に残っているものだ。

この話は、前にも話したが、ビルゲイツが退職する特別な日にあっては、もう一度取り上げても良いだろう。

1980年代の中頃、我々はLANマネージャ1.0プロジェクトのレビューを、ゲイツと共にしていた。

その会議で、私のコンポーネント、DOS LANマネージャについて取り上げた。基本的には、MS-NETリダイレクタの拡張版であって、そこそこのLANマネージャAPIをサポートしていた。上司と私は、このコンポーネントについてのプレゼンをした。

その中のあるスライドで、DOS LANマネージャ リダイレクタのメモリ使用量について言及していた。因云、スライドとはパワーポイントの事ではない。OHPである。

スライド曰く「DOS LANマネージャ 1.0は、64Kのメモリを使用する」と

そしてビルがキレた。

「64Kだと。俺がBASICを書いたときは、8Kしかメモリを使わなかったぞ。バカかお前らは。いっぺん死んで来い。コレがBASIC 8個分の価値があるとでも思っているのか。ふざけるな」

我々はかろうじて、「イエス」と答えるしかなかった。

省みるに、私はふいに、ビルがWindows XPについて、「コレがBASIC 16000個分か。ふざけるな。」とこぼしているのではないかと思ったりする。

我々はビル様のお言葉を重くおしいただいた。第一、ビルの言葉を無視するのは不可能だ。我々はDOS リダイレクタのメモリ使用量削減のため、まずデータをEMS メモリに移し、次に、コードもEMS メモリに移した。LAM マネージャ 2.1では、我々はついに、下位640K領域におけるDOS リダイレクタのメモリ使用量を、128バイトにした。作業量は膨大で、とても難しいプログラミングが必要だったが、とにかく動いた。

この話は使いまわしなので、もうひとつおまけ話をつける。確かこの話は、C9動画で言及したはずだが、このブログから見つけられない。

私がマイクロソフトでの継続勤務15年に達したとき、ビルゲイツ宅で、15年以上働いている社員全員を招待するディナーに参加した。私はちょっとだけエリート組にもぐりこめた。大体百人ぐらいは参加していたので、当然、ビルは大勢に囲まれていた。古参達に囲まれている様は、さながら結界のようであった。ディナーの中頃、ビルの娘と母親が出てきて、寝る前にブランコで遊んでいた。

ビルはただちに会話をやめてブランコの元へ行った。そして娘のブランコを漕ぐのに、実に20分も費やした。古参社員達を置き捨てて。

父親となったことが、ビルの人格向上に繋がったのかもしれない。

ビルの人格が良くなったのかどうかはしらないが、ビルは最後の最後まで、Fから始まる四文字言葉で罵倒することをやめなかったらしいが。
古川 享 ブログ: Windows Vista RC1 ドッグフードを食す、その3

Windowsのフォントチームは開発予算の中から、メイリオ・フォント(その当時は「明瞭」と呼んでいましたが…)のライセンスをするコストを捻出できない…ついては、ビルゲイツとの御前会議が予定されているので…古川からビルゲイツを説得して欲しい….との依頼があり…ビルゲイツの罵倒の嵐の中、私はバトルを展開!!!なんとか勝ち取った予算でVistaに組み込んだものなのです。

その際、ビルゲイツは「10年前にアップルはモリサワを採用して…それに対抗できるフォントはシャケーンしかないって言っていたのにまた違うフォントに投資するのか?」
私、「それは、シャケーンじゃなくて、写研なんだけどね…最近PCやMac用にアフターマーケットで出たもののやはり一書体あたりのコストは全てのOSやアプリに実装できるような条件ではないみたいだよ」
ビルゲイツ「そういうお前は、前回ヘイセイフォントが必要だと言ってそれにxxxx万円も投資しているじゃないか? 何でそれを使わないのだ?」
古川:「ビル、平成フォントは官庁の基本台帳や指定伝票に必須のフォントであり、それ以外に今回は横組みでの視認性が高いフォントで、グレースケールにも対応し、卓越したヒンティング情報を持っているためにアウトラインフォント縮小していっても、フォントが崩れない、なおかつ各ポイント数で生成されたフォントのバランスが良い…そしてさらに、フォント当たりのデータ量は他のフォントに比べてコンパクトに仕上がっている。何よりも、英文・和文を同一書体で混植してもすぐれたデザインの初めてのフォントなんだぞぉ...これに投資しなくて、なにが次世代のWindowsだぁ、チャラチャラした画面ではなく、毎日読むホームページの画面の文字こそ、品質を向上させるべきだ!!」

と戦ったのでありました。こういう、言葉を交わしている時は、ビルゲイツはドンドン眼を吊り上げて、時にはFから始まる4文字言葉で罵倒されるのだけど..途中でひるまずに押し切らないと..一生後悔する、という気持ちで最後のご奉公をしたのであります。

2008-07-01

Windows 7のGDI/GDI+にGPUによるサポートがある?

PDC2008 | Agenda | Sessions

Windows 7: Graphics Advances
Windows 7 enables you to advance the graphics capabilities of your applications while carrying forward existing investments in your Win32 codebase, including GDI and GDI+. New enhancements to DirectX let Win32 applications harness the latest innovations in GPUs and LCD displays, including support for scalable, high-performance, 2D and 3D graphics, text, and images. Also learn how to leverage the GPU's parallelism for general-purpose computation such as image processing.

気になる文章ではある。Windows 7では、XP以前がそうであったように、GDIやGDI+にGPUによる支援があるのだろうか。もちろん、XPの時代には、既にGDIのアクセラレーションは廃れていたが、今やるとなると、DirectXで汎用的に実装するのだろうか。

さらに気になるのは、既存のコード、バイナリがそのまま恩恵を受けられるのか、あるいは修正が必要なのか。

個人的には、GDI+がGPUによって支援されるなら、結構面白くなりそうだ。確かにシェーダーは魅力的だけれど、すべてのプログラムがシェーダーを使わなければならないとなると、面倒だ。

CO2削減のためにコカコーラとローソンをボイコットしよう

飲んでエコ.jp
J-CASTニュース : コンビニで「飲みもの」を買って CO2削減に貢献する

連中の宣伝文句はこうだ。

我が社の製品の販売数に応じて、我々は君に代行して「二酸化炭素排出権」を購入する。すなわち、我が社の製品を買うことは環境保護に繋がるのだ。さあ我が社の製品を買って、環境を保護し給え。

しかし、本当に二酸化炭素を削減したいだけならば、なにも発展途上国に木を植える必要はない。製品を製造しなければいいのだ。したがって、本当に二酸化炭素を減らしたいと思っているならば、コカコーラとローソンをボイコットすればいい。そうすれば、ローソンの既存店が潰れたり、新規出店が減る。それはコカコーラ社への発注が減ることを意味し、製品の製造も減る。ここに二酸化炭素は削減されたり。めでたしめでたし。

これは環境保護を謳った宣伝に過ぎない。ご存知のとおり、コカコーラやローソンは、多額の金を宣伝に費やしている。その宣伝費が、こういう形で現れているに過ぎないのだ。馬鹿馬鹿しい。

私は数百年後に尊敬されるつもりでこの文章を書いている。この憂うべき現代では、環境保護が宗教になっている。嘆かわしいことだ。もし地球が温暖化したなら、それは素晴らしいことだ。凍死者が減るし、耕作可能な土地が増える。第一、CO2が温暖化の原因のわけがない。連中は太陽が目に入らないらしいのだ。