2007-12-30

ダウンロード違法化がザルな件について

http://www.itmedia.co.jp/news/articles/0712/18/news125.html

要点をまとめると。
・ダウンロードも違法であると、法によって明言される。
・ただし、ストリーミング配信は、除外される。
・ストリーミング配信の結果、Webブラウザに残るキャッシュも、除外される。

オーケー、話は簡単だ。次のようにすれば、P2Pなどの共有ソフトウェアでも、合法的にダウンロードできる。

あらゆるファイルを、ストリーミング方式で送信するようにする。ファイルが何であれ、ビット列で表されているのだから、たとえば、ビット列に従って、画面に0か1を表示し続けるソフトウェアでも問題ない。そして、保存されるファイルを、キャッシュと呼ぶ。

このようなソフトウェアを作ればよい。もし、Webブラウザ限定というのであれば、HTTPプロトコル上に作ればいいだろう。ザルじゃん。

2007-12-26

え、台湾にパソコンがあるの from oldnewthing

 どうも、外国というのは、意外と知られていないようだ。 You mean, you have computers in Taiwan?  ある親戚のワイフは台湾育ちで、合衆国の大学に留学していた。長期休暇で帰省するとき、友達にこういったそうだ。 「何か連絡したいことがあったら、メールを送ってちょうだい」  ある友人が言った、「え、台湾にパソコンがあるの?」 ヒント:台湾には、DellとHPに次ぐ、世界で第三のパソコン製造会社がある。  また、そのワイフのある友人は、日本で育ったのだが、合衆国に引っ越すことになった。新しい地元の学校のクラスメイト達は、日本での生活がどのようなものか知りたがった。ある子が言った。 「日本にはテレビってあるの?」  この話を聞かせた友人が、こんなことを言っていた。 「イングランドからアメリカ合衆国に引っ越したとき、11歳の子に、向こうには電気があるのかどうか訊ねられた」と。

2007-12-24

Zoomeという動画投稿サイト

http://www.zoome.jp/

 この動画サイトはなかなかよい。最新のFlash Playerで対応した、H.264が使える。しかも、ビットレートは1.5Mpbsだ。このビットレートに収まっていれば、再エンコードがされないらしい。しかも、ファイルサイズは200MBだ。なかなかよろしい。

 ただ問題は、サイトのデザインが悪すぎるということだ。使いにくいことこの上ない。しかも悪いことに、SNSベースなのだ。いまどき流行らないにもほどがある。

 ためしに動画をエンコードして上げてみた。コレを見れば、Zoomeのすごさが分かるはずだ。コレは、640x480の1.4Mbpsの動画だ。

 また、動画のエンコードのためのサークルを作ってみた。 http://circle.zoome.jp/h264/

 いやぁ、しかし、とうとう本当のストリーミング時代がやってきた。ADSLが始まった当初、1.5Mbpsあれば動画のストリーミングもサクサクなんて謳い文句を各社宣伝していたが、そもそも1.5Mbpsで動画のストリーミングを提供しているサイトなんて、皆無だった。やっと出てきたのだ。それも今年の12月20日から。Zoome、すばらしい。

政治家というのは世間が分からないらしい

訃報:「国会でがん告白」山本孝史さん死去=民主参院議員 訃報:「国会でがん告白」山本孝史さん死去=民主参院議員 酸素ボンベのチューブを鼻につけ本会議に出席する山本孝史参院議員(奥)=国会内で2007年8月7日、小出洋平撮影  国会で自らががん患者であることを告白し、がん対策基本法の成立などに尽力した民主党参院議員の山本孝史(やまもと・たかし)さん=比例代表=が22日、胸腺がんのため死去した。58歳。  この人が癌であることを告白して、ガン対策のための法律を作ろうとがんばったのが、なんと2006年のことだ。その結果、法律ができた。衣料の発展により、高齢化した日本では、もはや国民病といってもよいガン対策への法律が、去年までできていなかったことになる。  つまり、政治家の中に当事者がいなければ、政治家はやる気を出さないのだ。  そこでだ。年金で困っている政治家はいるだろうか。  やんぬるかな。

生ビールって何だろう

ホテルの洗い場の六階でバイトをしていたところ、生ビールが注文された。生ビールの場合は、ジョッキに入れて運ばれる。ジョッキは洗うのが面倒なのだ。しかし、なぜ生ビールなのだろう。生ビールと、生ではない素のビールでは、何が違うのだろう。私は普段、ビールを飲まないので、あまり詳しくない。そこで調べてみることにした。

どうやら、生ビールというのは、熱処理をしていないビールのことらしい。なるほど、それで皆、生ビールを飲みたがるわけか。

しかし、缶や瓶に入ったビールも、生ビールとして売られているがあれは何だろう。コレも調べてみなくては。

どうやら、生という記載のあるビールは、すべて加熱処理をしていないビールらしい。技術の発展により、缶や瓶でも、生ビールを入れられるようになったらしい。あれまてよ、すると、生ビールじゃないビールの方が珍しいのではないか。現在、かなりの瓶ビールや缶ビールは、生と記載がある。わざわざジョッキに入れて運ばれる生ビールの存在意義はどこへいったのか。

もちろん、ビアサーバを使って注ぐので、違いはある。しかし、運ばれる段階で二酸化炭素も多少抜けるので、そのわずかな違いも分からないのではないだろうか。

だいたい、大抵の飲食店で、ビアサーバはちゃんと洗っているかどうか疑わしい。缶や瓶に入っている方がまだ安心できる。

2007-12-22

グッドウィルも業務停止

 ま、フルキャストのときと同じで、子会社がかわりにやるとかなったら、あまり関係ないのだが。  IT業界にメスが入るのはいつだろうか。もう一度大打撃を受けないと良くならないところまできていると思うけど。  それにしても、ピンハネ率6割とか、ヤクザといい勝負してる。直接雇用のバイトとなんら変わらないのに、なぜ奴隷になりたがるのか。

2007-12-20

みくみく問題について

 みくみくがJASRACに登録されていてひと騒動あったが、これも、既存の著作権が、現実とズレているために起きた問題だろう。  みくみくが着うたやカラオケになるのは、喜ばしいことだろう。そして、作者に対価が支払われるのも、当然のことだ。しかし、その結果、二次使用が制限されるのは、望ましくない。例の作者としても、当然皆が、自分の作品の二番煎じ三番煎じの劣化コピーを作り上げ、もって相対的に、己の評価を高めたいと思っているはずだ。  商用利用はしてもよい、しかし、二次創作、三次創作は無制限に許可されなければならない。著作権の完全なる保持でもなく、完全な放棄でもない。どうしたらいいのだろう。  おそらくは、Creative Commonsのようなライセンスが必要なのだろう。Share Alikeを付加すれば、GNU/FDLの対象を一般物に広げたような感じになる 追記  というより、どうもCC GNU GPLがあるらしい。 追記2 さっそく、このブログをCC GPLにしてみた。しかし思うのだけれど、日本の著作権法では、引用の権利が認められているので、一部引用では、GPLライセンスを継承させることは無理なのではないだろうか。 追記3  結局CCライセンスにした。  

売血をしてはいけない理由

 献血者が減っているなどと、よく言われる。まあ実際は、それほど極端な増減はないのだろうと思う。しかし、常々思っていたのだが、そんなに血が必要なら、血に対して対価を払えばいいのではないかと。  そう思っていた。コレを読むまでは。 売血 若き12人の医学生たちはなぜ闘ったのか  なるほど、売血を許可すべきではない。現在の献血では、ジュースやお菓子などがもらえるが、金は絶対にもらえない。それには理由があったということだ。

2007-12-18

x264でmp4出力対応のコンパイル方法、解決

 libgpac_static.libのプロジェクトファイルと、x264のプロジェクトファイルでは、指定しているCRTが、static libとDLLで違っていた。そのためリンクエラー。  というわけで、現在マルチスレッドにもMP4にも対応した自前VCビルドのx264が使える。

x264をVCでコンパイルする方法

現在、この情報はobsolateになっています。というのも、x264はC99を使っているため、C89しかサポートしていないVC++ではコンパイルできません。

 x264をVCでコンパイルする方法

 0. 大前提
 ・Visual C++ 2008 Express Editionを入手する。
  ・NASMを入手する。
  ・SVNクライアントをインストールする。Windowsならば、シェル拡張として使える、TortoiseSVNがお勧めだ。

 1. x264のSVNからHEAD revisionを取ってくる。面倒な場合はtarballでも可。

 2. Visual Studioのソリューションファイルを開く。

 3. strtok_rをstrtokに置き換える(たぶん将来的には、マクロで適切に置換されると思う)VCのCRTは最初からスレッドセーフなので問題ない(VC9ではデフォルトのCRTはマルチスレッドDLLになっている。)

 4. ビルドする。
 5. 動画をエンコードする(Windowsなら、AviSynthも使えてヒャッハー)

 追加要素

 ・マルチスレッド対応にする
  http://sourceware.org/pthreads-win32/からpthreadをWindows用に移植したライブラリを入手してコンパイルする。
  ヘッダとライブラリのディレクトリを設定し、マクロ、HAVE_PTHREAD を#defineしてコンパイルする(コンパイラオプションで行うのが簡単)

 未解決要素
 ・mp4出力を可能にする
  GPACを入手して、コンパイルする。パスを適切に設定する。
  MP4_OUTPUT を#defineしてコンパイルすればいいはず。

 しかし、どういうわけか、GPACとCRTとで、名前が重複して、リンクエラーになってしまう。
 誰かGPACをVCで使う方法、教えてください。(追記:単にGPACのコンパイルオプションの変更を忘れていた)

 まあ、mp4出力がいまだできないが、それ以外は問題がない。しかし、別にVC9でコンパイルしたからといって、エンコードが早くなるわけではない。重要な部分はすべてアセンブラで書かれているからだ。コンパイルオプションでSSE2を有効にして、--no-asmを試してみたが、まったくエンコード速度に違いはない。

2007-12-17

マイケル・ジャクソンがかっこいい

 うーん、かっこいい。

2007-12-09

インライン展開とか正直どうでもよくね

 なんだか某スレがすっかり、インライン展開の話になってしまってるけど。  別の翻訳単位でも、関数オブジェクトを使う価値はある。リンク時に最適化をするような、モダンなコンパイラの場合、インライン展開してくれる。  (と、コレを書いているうちに、VC8の最適化されたコードが貼られている。アク禁はつらい)  とはいっても、そもそも、いまどきインライン展開する意味はどれだけあるのか疑問なのだが。  第一CPUは早い。しかもモダンなCPUは、関数呼び出しされるたびに、見えないレジスタに呼び出し元をこっそり記録しておくとか、わけの分からないことまでやっている(そして、スタックは常にメモリにあるはずという推定の元に、命令数の削減だけを考えて、pushとpopが一致しないコードを書くと、むしろ速度が遅くなる)  そして関数の中にif文でもあろうものなら、最近のヘビーなパイプラインのCPUは、関数呼び出しなど目じゃないほど無駄な処理をする。  そして、関数がインライン展開されると、それだけコードが太る。キャッシュに乗り切らなくなる。  

2007-12-06

WizpyというPCでもブート可能なデバイスについて

 ニコニコ動画の広告から知った。 http://www.wizpy.jp/wsyslogin.php  結論から先に、箇条書きする。  ・本体としては、USB CD-ROMデバイスとしても動作するUSBフラッシュメモリ  ・Wizpy本体のOSと、PCブート用のTurbo Linuxが入っている。  ・単体では、mp3やoggなどの音楽や、Xvid動画再生、ボイスレコーダー、テキストおよび画像ビューワ、FMラジオとして使用できる。  ・USB CD-ROMからブートできるPCで、Turbo Linuxを使える。  ・CD/DVDブートのLinuxに比べての利点は、本体のフラッシュメモリを、HDD代わりに使えることである。  しかし、Turbo Linuxのマーケティングは、訳が分からない。一般人を狙っているような宣伝文句が結構ある。たとえば、「一人一台のPCはいらないけど、自分だけの環境はほしい」などだ。しかしコレをほしがる客層というのは、絶対に素人ではない。そういう客からこのWebサイトを見ると、実にわかりにくい。  たとえば、まず一番に知りたがるのが、具体的で詳細なスペックだろう。しかし、コレがなかなか見つからない。かろうじて変なPDFファイルが見つかるぐらいだ。このWebサイトは、このデバイスで何ができるかを素人にも分かりやすく解説してはいるものの、いったいどういう仕組みで動いているのか、という、大部分の人間が本当に知りたい情報が、ほとんど見当たらない。  大半の人は、このWebサイトを見ただけで購入意欲をそがれることだろう。  ただ、仕組みとしては面白い。USB CD-ROMだと主張するUSBフラッシュメモリだ。既存のOSを全部消して、自分の好きなOSに載せ変えたいと思うのは、当然だろう。しかし、この宣伝では、売れるはずがない。  ニコニコの広告に曰く、「秋葉原で密かに大人気」  いやはや、実に密かだ。密か過ぎて誰も知らないだろうが。

2007-12-04

2008年1月号のジャンプスクエアを購入

 無論、荒木飛呂彦の特別読み切り、「岸辺露伴は動かない」を読むためだけに買った。やはり荒木のマンガはスバらしい。  とりあえず、岸辺露伴は、セーラームーンのフィギュアと、レッド・ツェッペリンの紙ジャケと、るろうに剣心が好きらしい。  荒木マンガの面白さは筆舌に尽くしがたいので、是非とも、自分で読むべきだ。  しかし、他のマンガが全然面白くない。はっきり言って、まるでツマらない。週刊ジャンプも、実に6年ぶりに買ってきたのだが、まったく楽しめない。私も歳をとったのか。

2007-11-30

マイクロソフト勤務初日:どけよお前ら

シリーズ物になるかもしれないと予告されていた第二段がでた。
from http://blogs.msdn.com/oldnewthing/archive/2007/11/29/6588498.aspx

 マイクロソフト勤務の初日、ある社員Yの場合

初日には、社員証に載せる顔写真を撮らなければならない。私は、インターンの学生たちに混じって、列に並んでいたのだが、行列は部屋を出て、駐車場まで続いていた(社員証の発行は、駐車場の地下にある部屋で行われていたのだ)

列に並んで待っていると、ある車が、行列によってふさがれてる駐車場にやってきた。行列のインターン学生は皆、車を運転しているビル・ゲイツに驚いて立ちすくんでいた。

何十秒もそのままだったので、私は言ってやった。「おい、お前ら、ビルがそこに車を止めたがってるぜ」 この一言で、皆、道をあけた。道はできた。ビルは車を停めた。危機解決。

道をふさいでいたインターン達が、この夏にマイクロソフトに与える利益よりも、この時間の浪費による損失は大きそうである。

なんとも面白い話だ。やっぱりビル・ゲイツには、自分専用の駐車場がないらしい。ちなみに、コメントも面白い。こんな感じだ。

ちょっと待てよ、ビル・ゲイツという奴は、たったの三十秒ほど無駄にしただけで、会社に数万ドルの損害を与えるほどプロダクテイブなのかい? マイクロソフトは奴のトイレ時間を精密に測定すべきだな。

「マイクロソフト勤務初日」の話は全部、ビル・ゲイツの車に関する話なのかい? 二件のサンプルから判断して。

 たぶん、ビルも社員証を失くしたから、新しいのを作りに来たんだよ。

これはまさに2001年の自分に起こった話だ。実際の会話はこんな感じだった。
「おい、誰か車を停めようとしているぞ」
 「お、誰だろね。ビル・ゲイツかな?」
まさにビル・ゲイツだった。警備員が道を開けさせてた。たぶん、毎回起こっている話だと思うよ。不便な場所だしね。

>たぶん、毎回起こっている話だと思うよ。不便な場所だしね。
Vistaではフィクスされてますw

2007-11-28

グリーンピースの夏休みの自由研究について

http://www.greenpeace.org/international/campaigns/toxics/electronics/how-the-companies-line-up  で、これの評価方法なんだけど。  項目に対して、企業がどのように取り組んでいるかを評価したものとなっている。恐ろしく単純。この結果をクールに表示するFlashの方が、まだいくらか手間がかかってる。  評価のためのソースは、評価企業のWebサイトである。つまりこのランキングの本当の意味は、企業がいかに、「自社が環境保全に取り組んでいるか」を宣伝するために金をかけているか、ということだ。  何しろソニーは巨大な企業だ。GEEKな君がなんと言おうと、ソニーというブランド名はかなり価値がある。そのための宣伝費は惜しまないだろう。  任天堂はあまり情報公開していないから、こういう結果になったのだろう。  しかし思う。グリーンピースの評価方法も、まったく当てにならないのではないだろうかと。なにしろ、ソースはすべて評価先企業のWebサイトだ。小学生の夏休みの自由研究ではないのだから、情報が提供されていないならば、企業に取材に行くぐらいはしないのだろうか。あるいは、もっと単純に、電話すらかけなかったのかと。  もしや、グリーンピースの本部は発展途上国にあるので、電話すらないのだろうか。しかし、電話はなくても、Flashでクールなメータ風のランク表示を作るだけのコンピュータと知識と暇、さらに、この自由研究をホストするサーバと回線はあるらしい。なんてやつらだ。

2007-11-06

PCを新調した

 とりあえず、いい加減にAthlonXPの動画エンコードの遅さに嫌気が差したので、PCを新調することにした。自分で組もうかと思ったが、どうもショップブランドの、すでに組みあがっているPCを買っても、値段としてはあまり変わらないので、近所のDOSパラで買うことにした。自分で組むとなると、パーツもあれこれ悩むだろうから、かなり時間がかかるだろう。クロックの高いC2Dか、4コアのC2Qか迷ったが、考えてみれば、高いクロックといっても、性能は劇的に上がるというわけでもないし、ここは4コアを買っておくことにした。  早速家に帰り、Vistaをインストールする。とりあえずどの程度の性能かを試したくなった。しかし、いわゆるベンチマークテストの点数などを見ても、さほど実感がわかない。というわけで、より具体的な実験をすることにした。  まず、1080pのH.264の動画を4つ同時に再生してみることにした。デコーダはffdshow、すなわちffmpegのものだ。あっさりと再生できた。GPU支援など必要には思われない。  つぎに、DVDをx264でエンコードしてみることにした。AthlonXPでは、22分の動画の2パスエンコードに、3時間もかかっていたソースだ。さっそくエンコードを開始すると、16fpsほどの速度であった。この速度では、2時間程度でエンコードが終わることになる。どうも納得がいかない。そこで4つのスレッドを使ってみると、なんと46fpsも出るではないか。これはすばらしい。25fpsの動画なので、実時間程度で2パスエンコードができるということになる。出来上がった動画を比べてみたが、違いはわからなかった。これはすばらしい。思うに、C2Qでも、1コアあたりでは、メモリの速度分ぐらいしか、エンコード速度が上がっていないように思われる。まあ、かなり重いオプションを指定しているので、エンコードの大部分がメモリの読み書きなのかもしれないが。  さて、Vistaの使い心地はどうか。Aeroであるが、なかなかかっこいい。ただし、半透明はどうも気にいらない。もちろん、ただの半透明ではない。それではあまりにも後ろの内容が目立ったしまうので、Vistaでは、スリガラス状の半透明という工夫をしている。しかし、やはり必要ないものは必要がない。半透明を使うのはやめておいた。配色を黒っぽくすると、かなり格好がいい。気に入った。  さて次、HDDの中を見ようとしても、エクスプローラの左側にツリー表示がされないのが気になった。どうしたら表示させられるのかいろいろ探していたが、あることに気がついた。アドレスバーがガラリと変わっている。これは実に便利だ。これに慣れてしまうと、なぜついさっきまで、ディレクトリのツリー表示がなければならないと信じていたのか、つくづく疑問に思う。  コントロールパネルなども、かなりの設定ダイアログが変わっていた。まあ、これも特に問題は無いように思う。ただ、サウンド関連のダイアログは、勝手がかなり違うので戸惑った。それから、XPでは画面のプロパティなどという名称だったと記憶しているが、日本語版のVistaでは、個人設定となっていた。うーん、何か違和感がある。  もっと早く移行しておけばよかった。しかし、その場合は、クワッドコアなCPUなど買えなかったであろうし。まあ、悩みは尽きないものだ。  

国際ニコニコ映画祭に落選した

まあ、落選を狙って作ったのだが。

2007-11-01

Goole OSなるもの

http://www.thinkgos.com/ 何でも、聞くところによると、UbuntuベースのOSらしい。

何が美しい顔を決めるのか理解できなくなってきた

 複数の顔を合成した、平均的な顔は美しくなるらしいが、今度はちょっと違う話。  http://arisahp.fc2web.com/  このコスプレしている人だが、実際はあまり美人ではない。リアルであった場合、年齢不相応の老け顔に見えるだろう。  何故綺麗にみえるかというと、この画像は加工されているからだ。しかも、この加工はあまり洗練されていない。画像全体に対して、コントラストや彩度を変更している。  素材は醜悪、加工技術も未熟なのにもかかわらず、この人物は美人に思える。何故なのだろう。加工の結果は、顔にシワやシミが目立たない程度で、人間性を捨てたいと願う私にとっては、画質劣化に他ならないのだが。  顔を単色で塗ってしまった方が、美人に見えるのだろうか。  ちなみに、これはプレイボーイ誌に誤って載ってしまった、Photoshoppedな画像 http://www.gamesforwii.net/blog/where-is-her-belly-button.html  間違ってヘソを消してしまったらしい。

2007-10-31

人間コンパイラへの道はまだまだ遠い。

問題、下記のC++のコードの意味を答えよ。 char (&test(...))[3] ; ちなみにこれは、可変引数を取り、char[3]への参照を返す関数testの宣言である。 私は、もはやどんな関数ポインタの宣言があろうが理解できる自信を持っていたのだが、いともあっさりと打ち砕かれてしまった。 ああ、人間コンパイラへの道は果てしなく遠い。

指がえぐれた

 バイトで茶碗を洗っていたのだが、米粒がなかなか取れなかった。そこで力を入れてこすってみたところ、茶碗が割れ、左手の中指を切ってしまった。傷口を見ると、軽くえぐれている。そしてまずいことに、血が止まらない。  20分立ってもまったく血が止まる気配がない。深夜だったのだがしかたがない。病院に行って、止血してもらうことにした。  とりあえず血は止まったようだ。やれやれ助かった。しばらくは水につけてはいけないようだ。また、酒も飲まないようにとのこと。

2007-10-28

スーパーサイズ俺

 マクドナルドのマックポークがうまかったので、おととい、昨日と、昼飯に食べた。しかし、三日目の今日になると、さすがに飽きてきた。別にまずくはないのだが、毎日食べられる味ではない。  とりあえず明日は、そばかうどんを食べたい気分だ。  スーパーサイズミーなんて絶対ヤラセだよなぁ。

2007-10-21

靴を買う際の注意

 昨日、新しい靴を買いに行った。靴屋にて、右足の靴だけ見て満足し、購入した。  さて今日、さっそく新しい靴を取り出し、左足の靴を見てみると、シミがついていた。気にせず歩いてみるが、どうも左足の靴の履き心地がおかしい。左右の靴を合わせて見ても、形がおかしい。やれやれ、ちゃんと両足とも確認すべきであった。  店に文句を言いに行ったが、まずいことに、既に外を歩いた後だったので、靴は汚れている。結局、返品はできなかった。実に一日分に相当するバイト代が、無駄に飛んでいった。  教訓、靴を買うときは両足とも確認せよ

このバイク欲しい

http://www.monotracer.com/

MONOTRACERというバイク。最高速度250km/h、100km/hまで5.6秒で加速、エンジンは4サイクルの1171CC、四段階変速とロックできないバックギア、スピーカもついているようだ。CDプレイヤーも付けられるとか。容量200リットルのでかいトランク、燃費は90km/hで、4,15 l/100km、120km/hで、5,05 l/100km

普通のバイクはまったく欲しいとは思わないが、これは欲しい。ただ、これ停車時はどうするんだろう。いちいち脇の車輪を上げ下げするのだろうか。

お値段は、52,500 ユーロ(2007年10月現在、日本円にして864万円) 恐らく個人輸入になるので日本国内ではもっと費用と手間がかかる。日本国内では大型自動二輪車の扱いになると思われる。

2007-10-16

見よ、現代のヤクザの仕事を

http://sankei.jp.msn.com/economy/business/071013/biz0710132040011-n1.htm http://news21.2ch.net/test/read.cgi/bizplus/1192281933/ ■内定辞退を引き留めます 神戸の会社が翻意サービス  新卒採用の増加に伴って増えている大学生の内定辞退に頭を痛める企業が、「内定辞退翻意サービス」を活用 し始めている。昨年からサービスを始めた神戸市のコンサルタント会社「ブレーン・サポート」(木村俊良社長)には、 今年も8月末までに大手43社が依頼。成功率は6割以上と高く、依頼企業はさらに増える見込みという。  同社は4年前から、転職希望者の引き留めサービス事業を成功報酬制でスタート。依頼企業から新卒採用の 内定辞退が多いと聞き、昨年から「内定辞退翻意サービス」も始めた。  企業から依頼を受けると、木村社長自らが学生に連絡を取り、高級ホテルで食事をしながら面談。まず「会社の 依頼で来たが、優先するのはあなたの条件を会社に伝えることだ」などと味方であることを強調したうえで、辞退理由 などをさりげなく聞き出す。学生が翻意するまでは面談や電話でフォロー。依頼された複数の学生を鹿児島県の 沖永良部島や与論島などへキャンプにまとめて連れ出し、じっくり話をすることもある。こうしたサービスを昨年、 46社から依頼された内定辞退者69人に行った結果、55%に当たる38人が内定辞退を取りやめたという。  ある国立大の男子学生は、大手自動車メーカーの内定を得たため、中堅自動車メーカーの内定を辞退。しかし 「大手は同じ能力の人間ばかり集まっている。君の力を生かせるのはそういう会社ではないのでは?」などと諭すと 翻意した。またメガバンクに内定していた別の国立大の男子学生は「メガバンクは転勤も多いし、50代以降は出向 させられる。着実にキャリアを築けるのは中小」と説得すると、内定辞退した中堅企業に戻った。  木村社長によると、内定を辞退する学生に確固たる理由はなく、「『この会社はここまで自分を欲しがっている』と 認識すれば、あっさり翻意する」という。  就職情報会社、毎日コミュニケーションズが実施した平成20年の企業採用予定調査では、採用活動における上場 企業の悩みのトップは「内定辞退の増加」(62.3%)。今年5月末時点での大学生の内々定獲得社数の平均は、 昨年の1.99社から2.24社へと顕著に増えており、内定辞退者が増加している現実が浮き彫りになっている。  これは酷い。このニュースは分かりにくい言語を使っているので、私が日本語に翻訳してみようと思う。  まず、複数の企業を抜けぬけと受けておいて、当社の内定を蹴った無礼者に対して、まずは怒らず、アメを与えることで、関心を向けさせる。これには「高級ホテルで食事」といった古典的な手法が用いられる。まず警戒心を解くために、「味方である」ように見せかける。そして、学生が洗脳されるまで、ひっきりなしに自宅訪問や電話で責めたてる。それでも洗脳されないタフな学生のためには、離島に連れ出して脅迫するという最後の手段に出る。効果は絶大だ。何しろ69人中38人も洗脳しているのだから。  55%も心変わりさせている、この数字は異常だ。まさにヤクザの仕事だ。最初にアメを与えておいて、徐々にムチを与える伝統的な方法だ。まずいことに、この方法は実によく働くのだ。  だいたい何度も言うが、内定を蹴られた時点で、「所詮お前は滑り止め」と言われている様なものなのだ。それを下手に出てなだめすかし、最後は離島に連れて行って心変わりするまで脅迫……もとい説得する。これをヤクザの仕事と言わずに何と言う?  また、内定辞退の引きとめという仕事は、本来企業自身が行うものだ。それを外注しているのだから、労働者をバカにしているとしか思えない。  この手のコンサル会社には、注意すべきだ。第一、「ブレーン・サポート」という名前からしていかがわしい。「ブレーン・ウォッシング」としてはどうか?

2007-10-13

へんなmkvファイル

 mkvmergeで、二つの動画をマージしようとしたら、何故かうまくいかなかったので、調べてみると、FOURCCが "H264" なmkvファイルであった。やれやれ、mkvの自由度の高さは尋常じゃない。とりあえずffmpegで生バイトストリームを吐き出してからmuxした。  まあ、こんなへんてこなファイルも面白かったので、自分で作ってみることにした。とりあえずH.264をAVIに格納(そんな標準規格はどこにもないことぐらい把握している)して、最新版のmkvmergeに食わせてみたところ、普通に(V_MPEG4/ISO/AVC)になった。うーむ、変更されたのかな。しかし、この出所が怪しいmkvファイルは、今年に作成されたはず。  x264のvfw版の功罪なのだろうか。

2007-10-12

これだから健康志向の商売はなくならない

http://www.asahi.com/life/update/1011/TKY200710110446.html  一本で一日分の野菜がとれるとしよう。すると、次の献立で暮らしていけるはずである。 ご飯、肉や魚、野菜ジュース三分の一本、一切の野菜なし。  これが一食分。これを毎日、三食欠かさずに食べれば、健康を維持できるはずだ。さあ、健康職人の信者達よ。このすばらしい献立で生活するが良い。これだから健康志向の商売というのはオイシイんだろう。  そういえばスーパーサイズミーなんて映画もあったけれど、あれも怪しいものだ

2007-10-07

Boost.Program_optionsの問題解決

 どうせソースコードも公開されていて、しかもライセンスも制限なしといっていいほどゆるいのだから、書き換えてみることにした。面倒かもしれないと予想していたが、以外にも簡単だった。   やりたい事 wvalue(std::wstring)->default_value(L"Unicode") が出来ること。 問題点 現行のprogram_optionsの実装はdefault_valueの引数の型の値を、lexical_castでstd::stringにキャストしようとすること。 当然std::wstringからのキャストはできない。 改変方法 utf16のstd::wstringから、utf8のstd::stringへ変換してやればいい。 改変の次第 boost/program_options/value_semantic.hppに #include <boost/program_options/detail/convert.hpp> を付け加えて、 typed_valueのプライマリテンプレートの下に、次のメンバ特殊化を付け加えればいい。 template<>   typed_value<std::wstring, wchar_t> *     typed_value<std::wstring, wchar_t>::default_value(std::wstring const v) {   m_default_value = boost::any(v);   m_default_value_as_text = boost::to_utf8(v);   return this; }  いやはや、C++のテンプレートはすばらしい。とくにMember Specializationは役に立つ。本当に変更すべき部分だけ書き換えればいいのだから。

2007-10-06

Boost.Program_options が酷い件

program_optionsを使ってみることにした。 しかし、Unicodeへの対応がなってない。
namespace po = boost::program_options ; po::options_description desc("options") ; desc.add_options() // std::stringへlexical_castしようとしてコンパイルエラー ("output-file,o", po::wvalue< std::wstring >()->default_value(L"out.txt") , "output file name")
 これは酷い。wchar_tへの相互変換のラッパをかませているだけだ。しかも一部動かない。こんなひどい対応で、何が  >Throughout this document "Unicode support" is a synonym for "wchar_t" support  何だか。  ドキュメントは次のように変更すべきである。  Throughout this document "Unicode support" is a synonym for "char to wchar_t conversion" support  >Neither of these issues appear to be critical in practice  だって? 皆ASCII外の範囲の文字は使ってないのですか。 たいしたUnicodeですな。  ああ、utf16leを使うのは難しい。 追記: Boostスレに助言を求めたら、このブログを引用された。program_optionsって誰が使っているんだろう。

2007-09-27

oldnewthingの本が訳されたらしい

http://www.amazon.co.jp/exec/obidos/ASIN/4756150004

まったく知らなかった。原書を既に持っているので買わないけれど、こういう本の翻訳などはしてみたいものだ。

ついでに小ネタ。
http://blogs.msdn.com/oldnewthing/archive/2007/09/26/5131601.aspx

マイクロソフト勤務初日:接触事故

これがシリーズ物の最初になるかもしれない。マイクロソフト社の初日に何が起きたか。匿名を保つために、多少の改変はあれど、本当に起こった出来事である。まずは、ある社員Xの場合:

初日の仕事の後、駐車場で、後ろに停めてあったレクサスにぶつけてしまった。やれやれ、初日そうそう、誰かの車に傷を付けてしまったか。私は、名前とメアドと電話番号に、修理費を弁償する旨を記した紙を窓ガラスに貼り付けておいた。

次の日、仕事に出ると、新着メールがあった。

 ビル・ゲイツより。

 オーマイゴッド、ビル・ゲイツの車を傷つけてしまったのか。幸いにも、心配ご無用とのことであった。

2007-09-25

もういい加減、テレビのアンテナを窓から投げ捨てないか

http://blog.livedoor.jp/dqnplus/archives/1034299.html  日テレ社員は全員、中学校を卒業していないに違いない。なんで誰も放送する前に止めないんだ。

2007-09-19

ゲーム終了とか発展途上の静岡国とか

http://www.rbbtoday.com/news/20070918/44953.html  これはもはや、ゲームなどやっているほうが少数派ではないだろうか。DSだけは8割だが、ゲームと呼べないソフトが出すぎている。純粋に遊ぶためのゲームは3割程度。  かく言う私も、もはやゲームなどしていない。ニコニコ動画に上げるためだけに、たまに昔のゲームをやったりするだけだ。 http://www.mainichi-msn.co.jp/chihou/shizuoka/news/20070918ddlk22040053000c.html  やれやれ、静岡は相変わらずだ。大部分の静岡は、恐ろしく辺鄙なド田舎だ。近代文明の恩恵を受けていない土人しか住んでいない。まあ、人の住むところではない。

2007-09-15

近況

 最近、まともにブログを書いていないが、これには理由がある。意欲がない。  もちろん、書きたいことはあった。たとえばVistaで音楽を聞いているとネットワークのスループットが低下するだとか。 Vista Multimedia Playback and Network Throughput Windows Vista Sound causes Network Throughput slowdowns.  どうも最近、最新技術への興味が沸かない。昔は知識こそなかったが、意欲に満ち満ちていたのに、どうしたことだろう。そもそも、私は何かをプログラミングしたいのではなく、プログラミングそのものに魅せられていたのかもしれない。昔はC++どころかCの文法すら理解していなかった。MSDNは辞書と首っ引きで読んだ。今はどうだ。テンプレートメタプログラミングはすばらしく面白いし、英語はサウスパークを見て笑えるほどに上達した。しかし、その知識を使って、何かやりたいことというものが存在しない。  そもそも、今の時代にC++など何に使うというのか。 C++が必要なのは本当にごく限られたところだけだ。WindowsのGUIはVistaの登場で、ようやく.netに移るだろうし、WebはXHTMLやJavaScriptやFlashになるだろう。(JAVA? 忘れてくれ。あの思想は吐き気がするほど嫌いだ) C++が必要とされているところには、C++以外にも高度な知識を要求されているが、私には興味のないことばかりだ。  一番最後にプログラミングしたのは、クソなキャプチャデバイス付属のソフトウェアのためのworkaroundだ。このクソなキャプチャデバイス専用のクソなソフトウェアは、キャプチャした動画ひとつにつき、ひとつのディレクトリを作り、その中に、ディレクトリ名と同じ動画ファイルと、キャプチャ時の情報を記録したファイルを作る。このファイルはキャプチャソフトだけが後で、キャプチャ済みの動画一覧を見せるときに使う。こんな感じだ。 +07年08月01日01時01分 S端子  - 07年08月01日01時01分 S端子 +07年08月01日01時12分 S端子  - 07年08月01日01時12分 S端子 +07年08月01日01時15分 S端子 001  - 07年08月01日01時01分 S端子 +07年08月01日01時15分 S端子 002  - 07年08月01日01時12分 S端子  ごらんのように分までかぶった場合は、ディレクトリに001~からなる番号を振る。  何がしたいんだ、このカマ臭いソフトウェアを書いた奴等は。取った動画をそれ専用のディレクトリに格納したままにしておくとでも思っているのか。しかたなく、ディレクトリを列挙し、その中にある動画ファイルを別の場所に移動し、その後でディレクトリを削除するコードをC++で書いた。昔はあんなに苦労したファイルの列挙、中身にファイルのあるディレクトリの削除などが、一瞬で書けた。これをするには、分かりづらいMSDNを読まなければならない、APIと構造体の説明が別々のページにあるので、多数のページを参照しなければならない。まあ、今となっては慣れた。しかし、これは、別段C++でやらなければならないことでもない。  学校も、たぶん今年で辞めるだろう。どこか働き口を見つけるつもりだ。この業界ではない。健康のために、適度に体を動かせるところがいい。あくせくせずに、定時に帰れるかフレックスタイムで、労働基準法に違反していないところ。金は男一人食っていけるだけあればいい。  なんという非生産的で無気力なんだろう。私も歳を取ったのだろうか。

Vistaのインストールが難航

 MSの学生専用のVistaディスクがある。1980円だ。ちょっと前に買っていたのだけれど、インストールするべきPCがなく、放置していた。ところで、昨日になって、プロバイダ契約をしたときに、無料でHDDをもらったことを思い出した。ただし、IDEに空きがなく、そのまま放置していたものだ。そこで、HDDだけ付け替えて入れてみることにした。  まず最初は、何も問題はなかった。インストールは終了したが、問題はドライバである。マザーボード内蔵のNICのドライバがない。仕方がないので、XPのものを入れてみたが、どうやら動いた。nvidiaからさっそく最新のドライバを落としてきて入れる。ここまでは良かったのだが、リブートをかけると、なぜか起動しなくなった。しかもBIOSで、HDDからブートできない旨を示すメッセージと共に止まる。不思議に思い何度かリブートしている間に、どうやら起動した。  よくわからない。疑問に思いながらCreativeからもドライバを落としてきてインストールし、また再起動……しない。  今度は、どうしてもブートしそうにないので、Vistaのディスクからコンソールを起動していろいろ試してみたが、どうもうまくいかない。それならばもう一度インストールしようと思ったが、どうしたことか、今度は、HDDを認識してくれない。XPのインストールしてあるHDDや、もうひとつのHDDは問題なく列挙するのに何故だろう。BIOSもHDDをプライマリマスターと表示している。  もしかしたらBigDrive非対応? いや、ググッったところ、A7V8Xは対応しているようだ。やけになりIDEケーブルの接続場所を変えてみたが効果なし。ジャンパ? いやいや、それは最初のインストールで、HDDをつなぎ変えたときに設定し忘れて、BIOSにプライマリマスタがないと怒られたではないか。すると……壊れた? 一度も通電せずに、そもそも開封すらせずに一年間以上放置していたHDDだったが、保管状態が悪かったのだろうか? 謎だ。そもそもたった5時間程度通電して、HDDの総容量にも満たないほど読み書きしただけで壊れるものなのだろうか。大体壊れたにしても、認識しないというのは解せない。  ほんの少しだけVistaを触った感想を書くと、かなり分かりやすい印象を受けた。第一インストーラが馴染み深いGUIだ。コントロールパネルなども、物凄く使いやすかった。デバイスマネージャなども、直接ショートカットが用意されていた。ただ気になるのが、XPで言うところの画面のプロパティだ。XPと同じ感覚でデスクトップを右クリックすると、メニューの一番下に表示されるのだが、翻訳が、「個人設定」になっていた。何か違和感がある。  まあ、いまのPCでVistaを使う気はないし、Vistaに乗り換えるなら、新しくもう一台組むつもりだったので、どうでもいいのだが。  そういえば最近はPATAという名称になってしまったようだ。私が今使っているPCを組んだときは、SATAの端子は、最新のマザーボードについていたが、肝心のSATAなHDDが発売されていなかった。パラレルなら早いんじゃないの? 時代は変わったものだ。おかしいな、たった4,5年前のはずなのだが。

2007-09-05

ニコニコ動画とか

 最高級ピアノ  ニコニコ動画というのは、面白いところだ。この動画が物凄く面白い動画のように思えてくる。  ところで、Vocaloid2の初音ミクに感動した。

2007-09-01

旅は道連れ、世は情け

広島へ旅行してきたので、旅行記なるものを書いてみんとす。そも、何故余が広島へ旅になど出かけたかというと、我が高校時代の友人が、たまたま広島へ旅に出ると云うので、之に同行したのだ。

さて、一日目は、京都の私の家に泊まり、二日目に、新幹線にて広島へ旅立った。とはいえ、所要時間はたったの二時間である。

広島へ着き、まずは縮景園なる庭を観光した。まあ、それなりに広い庭であった。というと、余の文章力の拙きように見ゆれども、さにあらず。実際、ただ広い庭があるばかりで、極端に感動する景色でもない。第一、原爆で一度吹き飛んでいる。しかし見学料も安いし、手入れされた庭が好きならば、見ておいてもいいだろう。

次に、広島城を観た。これも原爆で一度吹き飛んでいるので、復元したものである。外から見ると、古い城のように見えるが、中に入ると、明らかに観光用の展示ばかりで、いとすさまじ。

さて、ここで休憩をかね、遅い昼飯を食べることにした。もちろん広島に来たからには、お好み焼きを食べなければならない。お好み焼き屋に入り、さっそく広島風のお好み焼きを注文した。友人は無粋にも、普通のお好み焼きを注文した。さて、出てきた広島風のお好み焼きだが、どうもお好み焼きというより、「焼きそばを少量の小麦粉で焼き固めたもの」と云ったほうが正しい代物であった。そもそも、簡単に崩れてしまうので、焼き固めるというのも疑問である。恐らくは、溶かした小麦粉の上に、具材を乗せて焼いたというのが本当のところだろう。しかしネギだけは多量に乗せてあって、なかなか悪くはなかった。

そして、最後に原爆ドームを観に行った。まあ、普通の廃墟だった。そういえばプロ市民が、原爆ドームの周りにビルなどを建て並べるのは、景観を損ねるなどと文句を付けていると聞いたことがあるが、原爆ドームの目的は、周りがどれだけ発展しようとも、原爆ドームだけは、当時のままの状態を留める所にあるのであって、景観などもとより存在しないはずだ。そして広島平和記念資料館を訪れた。何故か50円の入場料が必要であった。一体この中途半端な入場料は何故なのだろう。確かに運営に費用はかかりそうだが、公的な補助も出るであろうし、そもそも50円というのは安すぎる。受付で入場料を徴収する人の人件費ぐらいにはなるのだろうか。あるいは、あまりに見学者が多いので、50円でも十分なのだろうか。そんな疑問を抱きつつ中に入ろうとすると、入り口で、障害者らしき人がパンフレットを配っていた。まあ、一度見る価値はあるだろう。なかなか興味深い展示品がたくさんあった。

さて、さっそく宿を探したが、これがなかなか難しかった。宿は友人が予約し、地図も印刷していたのだが、目安となる道路や橋の名前が書いていなかった。これは難しい。とりあえずなんとか発見し、中に入る。ふと、友人が持っている、予約したメールを印刷した紙を見ると、セミダブルと書いてある。はて……セミダブルってベッドは二つあったっけ? もちろんあるわけがない。友人はあまりに、安かったために、間違えて予約したらしい。仕方なく部屋を変更することにした。しかし、ツインは空いていなかったので、トリプルになってしまった。とりあえず今回の旅で学んだことがある。セミダブルは男二人でも泊まれるらしい。

さて、次の日は、呉に向かった。目的は、大和ミュージアムと海上自衛隊呉史料館だ。大和ミュージアムには、戦艦大和の十分の一模型や、各種戦艦模型、様々な資料などが展示してある。なかなか楽しめた。

さて、海上自衛隊呉史料館はさらに面白かった。こちらは、機雷除去や潜水艦に関する展示が多かった。なかでも目玉は、数年前まで現役だった潜水艦の中に入れることだ。実際入ってみたのだが、恐ろしく狭かった。身長163cmの私でさえぎりぎりで、身長が170cmを越す友人は、とても窮屈そうにしていた。友人の場合、一部天井に頭がつかえるところがあった。潜水艦のクルーは、背が高いとつらそうだ。第一、居住空間がなさ過ぎる。こんなところで数ヶ月も生活したら、発狂するだろう。他にもいろんな説明があったが、食事だけは意外と普通だった。固形保存食などではなく、ちゃんと生のジャガイモなどを積んでいるし、食事のメニューも毎回違っていた。これは意外だった。とにかく、海上自衛隊呉史料館には是非とも行くべきだ。実に見所がある。

2007-08-28

新商品の日清焼チキンについて

 先週のことだが、母親が、「日清焼チキン」、なるものを買ってきた。チキンラーメンの焼きそば板らしい。始めはチキンラーメンだと思ったが、どうもパッケージが違う、聞いてみると、なんでも、新商品で、安かったらしい。チキンラーメンと言えば、日本人なら誰もが知っている、あのお湯をかけるだけで食べられる手軽なラーメンである。ほかの袋入りラーメンならば、たとえばスープをお湯に溶かしたりしなければならないのだが、そういう手間もかからない。  さて、くだんの焼きチキンであるが、お湯をかけるだけではダメのようだ。どうもフライパンで焼かなければならないらしい。まずフライパンに水を入れ熱し、チキンラーメンより少し色の薄い乾麺を投入、そのまま水がなくなるまで、焦げ付かないように注意しつつ加熱し続ければ良い。チキンラーメンと同じく、これはソースをかける必要がない。それは、手軽でいいのだが、結局フライパンで加熱しなければならないことには代わりがない。しかも放置していては焦げ付くので、箸でもって定期的にかき回さねばならぬ。これは全然手軽ではない。  味のほうは、チキンラーメンをそのまま焼きそばにしたような味であった。しかし、これを作るぐらいだったら、普通の焼きそばの麺を買ってきたほうがましだ。そのほうがうまいし、手間もそれほど変わらない。  結論としては、チキンラーメンは、麺をお湯につけるだけでいいという、その手軽さが売りなのだから、こういう手間のかかる焼きそばはどうかと思う。これはあまり売れそうもない。

2007-08-26

mp3死んでくれ。頼むから

 AACのすばらしいごまかし技術に慣れてしまうと、もはやmp3を聞くのが苦痛になってきた。さっさと死滅して欲しい。

2007-08-21

Flash PlayerがH.264とHE AACをサポート

http://www.itmedia.co.jp/news/articles/0708/21/news051.html  これは来たかもしれない。もし、FLVもH.264を格納できるようになれば、VP6は死滅するかもしれない。問題は、低ビットレートでは、どちらが強いのか確かめなければ  追記  H.264の低ビットレートでの画質は、VP6と同等だった。またすばらしいことに。どんなに動きの激しい動画をエンコードさせても、指定したビットレートをきっちり守ってくれる。  また、HE AACだが、これはすばらしすぎる。なんと48kbps程度で、原音と区別がつかないほどの音質を誇っている。耳を疑った。一応CreativeのサウンドカードとSennheiserのヘッドフォンを使っているのに、違いがさっぱり分からない。比較のためのmp3は、128kbpsでも高音がカットされたような印象を受けるのに。  ちなみに調べたところによると、SBRという技術により、高音域にそれっぽいノイズを発生させているらしい。人間の耳は、高音域にはそれほど敏感ではなく、ノイズ程度で十分騙されてしまうんだとか。本当に人間の感覚はいい加減だ。

2007-08-15

美しい顔について

 世の中には様々な顔がある。とはいえ、四十路、五十路に差し掛かると、みな一様に、醜悪な顔になってしまう。電車に乗っていると、様々な人の顔が、否応なく目に入ってくるのだが、中年に差し掛かる人々はみな一様に、むさくるしそうなオッサンか、厚かましそうなオバハンである。特にオバハンは酷い。明治時代の薄化粧よろしく顔を塗りたくり、道化さながらのショッキングピンクの唇の上、どこで売っているのか理解に苦しむ服を着込んでいる。  もちろん、中年老年でありながら、美しい人というのは、たまに存在する。そういう人は大抵、姿勢正しく、目立たない化粧をし、無難な服装をしている。  要するに、大抵の中年の日本人は、醜悪な顔をしているのだ。私とて、二十年ないしは三十年先には、おなじ人相に成り下がる定めだろう。  ところが、私が日本以外の人種を見ると、どうも勝手が違う。みな、それほどまずい顔をしているようには見えないのだ。それどころか、兄弟姉妹でもないはずなのに、同じ人種の外人の顔が、似ているように感じてしまう。これは妙だ。日本人である私が日本人を見るとき、兄弟姉妹でもなければ、似ているとは思わない。しかし、私が日本人以外の人種を見ると、どうしても、どこかが似ているという感覚を覚える。彼らとて普通の人間であるから、別段美しいわけでもないし、ましてや似ているはずがない。これはどうしたことだろう。  普段見慣れていないものは、違いを認識できないのだろうか。  一体何が美しい顔なのか。私が美しい顔と醜い顔を判断できることからして、何かしらの基準は存在するはずである。一体何だろう。  私は卒業アルバムを開いてみた。かつての級友たちは、みな一様に醜悪な面構えをしていた。お世辞にも美しい顔は見当たらなかった。何故だろう。当時は、クラスの誰某がかっこいいとか、可愛いとか、話し合っていたはずである。今改めて顔を確認するに、一人として美しい顔がない。これは一体どうしたことか。  不思議に思っていると、心理学分野に進んだ昔の友人から、次のように言われた。 「知っているか? 一番美しい顔というのは、自分の顔なんだぜ」  考えてみるに、自分の顔は、かなりの頻度で見ている。従って自分の顔に対して嫌悪、拒絶など意識は覚えないはずだ。もし自分の顔を嫌悪あるいは拒絶する人がいたならば、まず紹介すべきは、腕のいいカウンセラーであって、間違っても、腕のいい整形外科医ではない。  美しい顔というものについては、面白い研究対象なので、おそらく先人も研究しているだろうと調べてみたが、どうも良い成果は上がっていないようだ。ある研究者は、顔の黄金比などを作っている。たしかに美しい顔にとされる人に当てはめてみると、結構一致する。しかしそれは、まず始めに結論ありき、といった感じがする。  他にも、複数の顔を合成して、平均的な顔を作っていくと、なぜか美しい顔になってしまうというものがある。これは面白い。たしかに美しい顔なのだが、何故か魅力を感じない。どこか非人間的な印象さえ受ける。  昔、近所に、韓国と日本人の混血の女の子がいて、美人と評判が高かった。思い出してみるに、その顔は日本人とも韓国人ともどこか違う感じを受けた。アジア人なのにアジア人らしくない顔であった。しかし、やはりアジア人であった。普段見慣れぬ顔である。しかも日本人と韓国人の混血であるので、平均された顔である。  普段見慣れていない顔は美しく感じるのだろうか。  平均顔は美しく感じるのだろうか。  はしがき  にほんではよく混血をさして、ハーフと言うが、これはどうも変な印象を与えるらしい。確かに、「お前は半分だな」、などといわれたらいい気はしない。じゃあなんというのかというと、mixed raceとかmixed bloodなどというらしい。一応、half bloodという言い方もあるにはあるが。

2007-08-14

なぜ妹娘が辞書にないのか

 「妹娘」という言葉は、どの国語辞典にも載っていない。  不思議だ。  というのも、兄娘、弟娘、姉娘は大抵の辞書に載っているのだ。なぜ妹娘だけが載っていないのだろう。ちなみに、弟娘だけは読み方が変わっていて、「おとうとむすめ」、あるいは、「おとむすめ」、と読める。このことから考えると、妹娘の読み方は、「いもうとむすめ」、あるいは、「いもむすめ」、であると推測できる。しかし、いもむすめという読みは、イモねーちゃんを連想させるような、なんだか不恰好な印象を受ける。従って、少なくとも現代では、いもむすめとは言わないのではないだろうか。  和英辞典(日本語ネイティブではない人が使う和英辞典)には、妹娘が乗っている。読みは、いもうとむすめになっている。しかし、何故日本人の手による辞書には、妹娘が載っていないのだろうか。用例が少なく、載せるほどの知名度ではなかったのかもしれない。しかし、かなり昔の文章にも、使われているのだ。たとえば、 岡本 綺堂の半七捕物帳であるとか、太宰治の駆け込み訴えなどだ。  何故なんだろう。

2007-08-11

また朝日だよ

http://www.ibuki-bunmei.org/message00.html ジャーナリスト宣言もかくやの悪意ある報道

2007-08-10

Just a note about olympics

1936年8月1日 : ベルリンオリンピック開催 1949年5月23日 : ドイツ帝国はドイツ連邦共和国(西ドイツ)とドイツ民主共和国(東ドイツ)に分裂 ――オリンピック開催から13年 1980年7月19日 : モスクワオリンピック開催 1991年3月17日 : ソビエト社会主義共和国連邦崩壊 ――オリンピック開催から11年 2008年8月8日 : 北京オリンピック開催予定  まあ、単なる年表、それだけの話

2007-08-07

免許取得

 とりあえず車の免許を取った。はっきり言って、私は車が嫌いだ。と、私がこう主張すると、「なぜMTなど取ったのだ、AT限定免許で十分ではないか」と、バイト先の典型的なオバタリアンは言うのだが、別に私にとっては、ATでもMTでも、同じ車であり、別段大きな差異も感じないので、不都合はないわけだ。  さて、それよりも、私は今後、優良ドライバになることが確実なのだが、どうするべきか。

なんだかなぁ

緊急提言! 現場知らずの「耐震偽装対策」が招く危機  なんだか、役人に専門的なことをさせると悲惨なことになる。まあ、何をやらせても悲惨なことになっているけれど。

2007-08-03

I've just bought a hair clippers

新しいバリカンを購入した。今までのバリカンは、切れ味が悪くなっていたからだ。思うに、刃がだめになったのではなく、バッテリーが問題だったのではないかと思う。いくら充電してもあまり剃れないが、充電したまま動かしてみると、それなりに剃れるようになったからだ。そこで、今回はバッテリーを内蔵しないものを買ってきた。実に良く剃れる。

ところで、バリカンとは英語でなんというのか分からなかったので、辞書を引いたところ、hair clippersとあった。なるほど、確かにその通りだ。では、バリカンの語源はなんだろう。調べたところ、フランスのBarriquand et Marre社に由来するそうだ。とはいっても、フランス語では、バリカンとはtondeuseというらしい。どうやら日本では、社名が商品そのものの名称として、定着してしまったようだ。

そして、このバリカンの語源は、長い間謎だったらしい。

語源由来辞典よりバリカン

2007-07-29

Martin Hagwallのマリオの歌

 かつて、Martin Hagwallなる人が、スーパーマリオRPGのハナちゃんの森のBGMに歌詞を付けて公開したところ、ネット上で大反響を得た。今、彼はさらにもう一つ作ったようだ。 http://www.users.se/tvsm/smrpg/ 本人のmp3と歌詞が手に入る。

さて、肝心の歌詞を、訳してみようと思う。

まず、テラマリオとして知られている最初の歌はどんな感じか

スーパーマリオRPG
僕だけの宝物
ゲームをすると すぐ迷う
そうだよ、ジーノの迷路だよ

スーパーマリオRPG
僕だけの宝物
ゲームをすると すぐ迷う
そうだよ、ジーノの迷路だよ

カエルコイン欲しい。
こおりだま欲しい。
びびりだま欲しい。
キノコ欲しい。
さよならはとつぜんに欲しい。
スターのたまご欲しい。
ヨッシーのクッキー欲しい。
ひつじのゆうわく欲しい。

全部欲しい,
もっともっと遊びたい,
カエルコインを集めなきゃ
クレジットカードを支払うために

ゲームには多くの謎がある
謎解きに熱くなる
何でチートなんかするんだい
バカげて飽きるだけさ

森を抜けるのはスーパーシンプル
ただ道を曲がるだけでいい
永遠に永遠に

ジーノの道についていけ……
ジーノの道についていけ……
ジーノの道についていけ……
僕はゲームの天才
Rawest Forest はどうかというと

The SMRPG Song, Rawest Forest - 2006
歌 by Martin Hagwall

クリボー: おい、あのマリオの野郎を知ってるか?
ノコノコ: あいつのことか?
クリボー: ああ、あのキノコ野郎だ。
ノコノコ: あー、あれね。
クリボー: そうそう、あの森の中を飛び回ってるやつだ。
ノコノコ: あー、あー、知ってる知ってる。
クリボー: よし、いいか。見に行こうぜ。

スーパーマリオRPG
僕だけの宝物
ゲームをすると すぐ迷う
そうだよ、ジーノの迷路だよ

マリオ: カエルコインよこせ
クッパ: 来いマリオ
マリオ: カエルコインよこせ
クッパ: 来いマロ
マリオ: 「さよならは突然に」よこせ
クッパ: 来いジーノ
マリオ: クッキーよこせ

カメック: おお、与えようじゃないか マリオよ

クッパ: ワガハイはオマエのバカげた声を聞きたくない。
マリオ: 一文にもならないこぎたないコインが欲しいんだ

ゲームには多くの謎がある
謎解きに熱くなる
何でチートなんかするんだい
バカげて飽きるだけさ

森を抜けるのはスーパーシンプル
ただ道を曲がるだけでいい
永遠に永遠に

声: こんぺいとうよこせ, クッキーよこせ, 「さよならは突然に」よこせ,
クラウンのカジノよこせ 全部よこせ

マリオ: 待て, 待て, 待て, 誰なんだ?

カリバー: ハハハハハ

カリバーの歌:
俺の名はカリバー, ラップの天使
オノレンジャーと共にさすらう刃
バカなマリオとその愉快な仲間たちに
スターロードなど直せるもんか, 直せるわけがない
(ジーノ: ジーノカッター) 瞬き早い (ジーノ: これならどうだ)
なぜなら、いつもいつも、右目ばかり攻撃されるからだ

マリオの歌:
最近は暇で意欲も沸かない
子猫たちも俺をさしてこういうよ。
配管工のイタリア人、大根ごぼうも木っ端微塵
城のお姫様を助け出せ
クッパとクリボー達を笑い飛ばす
Aボタンを押してパワーを上げろ
お金はないけれど, でも見てよ 退屈な子たちが
俺のゲームで楽しんでるよ

ダイアローグ 1:
声: よこせ
クロコ: ミーの名前はクロコデ~ス
声: よこせ よこせ
クロコ: サイフ
声: よこせ
クロコ: サイフ
声: かえせ かえせ
クロコ: ゲームの最後に
声: かえせ
クロコ: アイテム
声: かえせ かえせ
クロコ: レアもの

ダイアローグ 2:
クラウンあに: やあ
マリオ: やあ、なんか気味悪いところだね
クラウンあに: ああ、そうだね
マリオ: ヒットポイントが残り少ないんだ
クラウンあに: なるほど
マリオ: なにかない?
クラウンあに: このキノコをつかうといい
マリオ: 腐ってるじゃないか

ピーチ姫の歌:
私は姫, どうか助けて
ブッキーは怖いわ
私と結婚するつもりだって聞いたけど
私はマリオと結ばれたいの

マリオ: カエルコインよこせ
クッパ: 来いマリオ
マリオ: カエルコインよこせ
クッパ: 来いマロ
マリオ: 「さよならは突然に」よこせ
クッパ: 来いジーノ


ピーチ姫: フライパンとパラソルをちょうだい

ゲームには多くの謎がある
謎解きに熱くなる
何でチートなんかするんだい
バカげて飽きるだけさ

森を抜けるのはスーパーシンプル
ただ道を曲がるだけでいい
永遠に永遠に

 star eyeが、なんなのか分からない。誰か思い当たる人は教えて欲しい。  

 

 Exorはケンゾールじゃなくてカリバーだった。 s/ケンゾール/カリバー  

 

 よく読んだら、クッパとクリボーを笑っているのはマリオのようなので、修正。万里夫が笑われているのだと解釈してしまった。  

 

 ところで、blaster plantsとは、マリオUSAの引っこ抜ける野菜を台無しにすることかと思っていたのだけど、ひょっとしたら、パックンフラワーを倒すことなのかもしれない。英語ではPiranha Plant (ピラニアプラント)と言うのだが。というかこの部分の意味がよく分からない。

 

 

 star eye をこんぺいとう、と訳してみた。  

2007-07-28

空気に課金しろ

http://www.itmedia.co.jp/news/articles/0707/26/news114.html
iPodやPCからも補償金を」と権利者 私的録音録画小委員会 私的録音録画補償金制度の見直しを検討する小委員会の会合が開かれ、iPodや携帯電話、PCなども補償金の課金対象にすべきなどの意見がでた。 2007年07月26日 20時53分 更新  「私的録音録画補償金」制度をめぐり、見直しを検討するために文化庁文化審議会著作権分科会に設けられた「私的録音録画小委員会」の会合が7月26日開かれ、課金対象となる機器の範囲などについて話し合われた。  私的録音録画補償金制度とは、MDやCD-Rなどデジタルメディアを使って音楽CDやテレビ番組などを録音・録画する場合に、一定の補償金を著作権者に支払う制度のこと。補償金はデジタルメディアの販売価格に上乗せして徴収している。  小委員会の会合は今年8回目。権利者団体や消費者の代表、識者らが集まり、補償金の徴収方法や対象機器の範囲などの見直しを検討しており、今年中に結論を出す。 会合の様子  「iPodなどのポータブルオーディオレコーダーや録音機能のついた携帯電話、PCなども補償金の課金対象に加えるべき」――実演家著作隣接権センターの椎名和夫さんや日本レコード協会の生野秀年専務理事など権利者側はこう主張した。  録音・録画が主な用途ではない汎用的な機器まで対象にすれば、その機器を録音や録画以外の用途に使っているユーザーからも補償金を徴収することになってしまう。権利者側はPCやHDDも課金対象とするよう主張を繰り返してきたが、ユーザーやメーカーは反対の声を上げている。  メディアやハードを著作物の複製に使っていないことを証明できれば、ユーザーが補償金の返還を請求できる制度もあるが、返還額が小額なことや、申請経費を請求者が負担するなど、実効性がないとの問題点がある(関連記事参照)。  ユーザーではなく機器メーカーから補償金を徴収すればいいのではないかという意見もあるが、IT・音楽ジャーナリストの津田大介さんは「メーカーから補償金を徴収した場合、コストとして機器の価格に反映される可能性が高く、消費者の負担は変わらない」と反論した。  野原佐和子氏(ITビジネスのコンサルティング事業を手がけるイプシ・マーケティング研究所社長)は、補償金の話からは離れると前置きした上で、ヤフーが動画投稿サイト「Yahoo!ビデオキャスト」で、ユーザーが投稿した動画で使用された楽曲の使用料をJASRACに支払う仮契約を結んだことを、新しい著作権料の支払いのあり方だと評価した。  「どういうものが私的録音録画に当たるかを法制度で決めるのは良いが、どの機器にどれくらい課金するかというようなことは当事者間の契約で決めればいいのではないか。法制度で決めることと、市場に任せるべきことを分けて議論すべき」(野原氏)
 PCや携帯電話やmp3プレイヤーに課金しろというならば、ひとつ思うことがある。私も著作者ではなかろうか。私はPCや携帯電話やmp3プレイヤーを使って、音楽を生成している。私のPCにはマイク端子がついているし、任意の周波数を生成できたり、波形を編集できるアプリケーションも持っている。携帯電話はもちろん、電話をするためにある。音声を生成しているではないか。私の持っているmp3プレイヤーには、マイクがついている。これらのデバイスを使って、自分が著作権を持つ音楽を生成すれば、私は著作者になるのではないか。それが音楽なのか単なる音なのかという絶対的な基準はあるのだろうか。私が作り出した音なのだから、私が著作権を持っているはずだ。JASRACが私の、ひらがなとアルファベットの発声から構成されている音楽を登録しないのは差別だ。私が著作者なんだから。そしてもし私の音楽の一部分でも再生されたなら(日本人なら50音を発声せずに会話することは不可能だ)、著作権料を徴収すべきではないか。その著作権料は、もちろん私のものになるはずだ。  こういうわけで、全員が著作権者になれば、全員が著作権料の分配を受けられてすばらしい世界になるだろう。まてよ、自分で払って自分でもらっているわけだから、特に世話はない。中間で分配のために働いている連中をリストラできるんじゃないのか?

2007-07-26

localeの謎

 もう何度目か分からないが、今分かっていることを書いてみる。  C++のロケール設定だが、まあ、次のような感じだ
// C++のグローバルロケールの設定 std::locale::global( std::locale("") ) ; // Cのロケールの設定 setlocale(LC_ALL, "") ; // すでに作成されているオブジェクトのロケールを変更 std::cin.imbue ( std::locale("") ) ; std::wcin.imbue( std::locale("") ) ; std::cout.imbue( std::locale("") ) ; std::wcout.imbue( std::locale("") ) ; std::cerr.imbue( std::locale("") ) ; std::wcerr.imbue( std::locale("") ) ; // OEMコードページにはない文字の出力 std::wcout << L"ハローワールド" << std::endl ; // OEMコードページにはない文字の入力 std::wstring buf ; std::wcout << "ワイド文字を入力してください:" ; std::wcin >> buf ; std::wcout << buf << std::endl ;
 これでいいはずなのだ。実際、VC7.1では、これはうまくいく。しかし、VC8では、なぜかグローバルのロケールがCロケールでないと、日本語版Windowsにおいて、OEMコードページ以外の文字の、コンソールの入出力がうまくいかない。ファイルの入出力はうまくいく。グローバルのロケール設定をせずにimbueだけ設定しておくと、問題なく出力できる。何故だ。また、VC7.1では、単にグローバルロケールを変えておくだけで、ワイド文字の入出力ができる。不思議だ。  また、Unicodeにしかない文字(たとえば❤など)を出力しようとしたが、コンソールでは表示されななかった。これはいいとして、ファイルにも出力されない。一体どうしたことか。wstringstreamでは、❤を出力することができた。というか、これは単にShift-jisに変換されているだけのようだ。ワイド文字のまま出力するにはどうすればいいのだろう。  P.J. Plauger様、ワイド文字は無視ですか?  

2007-07-24

ハリーポッターの物語が中二病臭くなってきた

HarryとVoldemortは、最強の剣ならぬ、最強の魔法棒を探しています。 ビードルなる詩人に語られし伝説  昔々、あるところに、三人の兄弟がいて、夕暮れ時に、人さびしく風吹き付ける小道を旅していた。ある時、兄弟は、深くして、泳ぎ渡ることも怪しげな川岸にたどり着いた。しかし、彼等は魔法の術を心得ており、魔法棒の一振りで、怪しげな水面の上に、見事な橋をかけ上げた。さて、橋の中ほどに、外套で深く身を包みしものが、道をふさいでいた。  死が彼等に語りかけた。死は三兄弟が、溺れ死ぬべき定めの川を渡った事に、憤慨していた。しかし狡猾な死は怒りを隠し、兄弟の魔法の術を褒め称えた。そして、各々に、己から逃れられた褒美を取らせよう、と云った。  戦いの好きな長男は、この世で最も強い魔法棒を願った。決闘において常に所有者を勝たしめ、まさに死を克服した者にふさわしい魔法棒を。そこで死は、川岸の木の枝から魔法棒をこしらえ、長男に与えた。  うぬぼれた次男は、死をあざけり、死人を呼び戻す力を持った石を願った。そこで死は、川岸の石を与え、人を死から呼び戻す力を持っていると言い含めた。  死は、三男の望みを訊ねた。三男は分別を持っており、三兄弟のうち最も賢明であった。三男は死を信用していなかった。三男は死に付きまとわれずに、ここから安全に立ち去れるものを求めた。そこで死は、渋々、自分の着ていた透明なる外套を与えた。  そして死は道を譲り、三兄弟は再び旅を続けた。彼らの為しえた冒険と、死からの贈り物を話の草に。  その後、兄弟は互いに別れ、各々の道を歩んでいった。  長男は一週間ばかり旅を続け、異郷の村にたどり着いた。古の魔法棒によって、彼は道中の厄介者に負けることはなかった。厄介者の死体をそのままに、彼は宿をとった。そして死より譲り受けし強い魔法棒と、無敵の己を吹聴した。  その夜、別の魔法使が、長男が酔いつぶれて寝ている隙に、魔法棒を奪い取り、喉笛を切り裂いた。  そして、長男は死の所有するところのものとなった。  次男は自分の家に帰り、孤独に暮らした。そこで次男は、死を取り消さしむ力を持った石を手中に持った。興味と羨望により、かつて次男が愛した、今はなき女を、面前に呼び出した。  悲しくも冷たくもあり、ベールにて分かたれてはいたけれど、女は死ぬべき定めの世に帰り来たが、真にこの世のものならず、あたりを漂っていた。次男はより所のなさに発狂し、自殺して、その身の置き所を女と同じくした。  そして、次男は死の所有するところのものとなった。  死は長の年月に渡って三男を探したが、見つけられずにいた。遂に三男は老年に達し、透明なる外套を脱いで、息子に譲った。三男は古き友たる死を迎え入れ、喜んでこの世を去った。  なんというか、次男の部分だけ日本語で表現できない。

2007-07-21

ハリーポッター7巻

今回はだいぶ急展開で面白い話になっている。まあ、5巻あたりが酷すぎたのだが。ところであるニュースでは、

両親と一緒に来た東京都文京区の小学5年、沖重ひかりさん(11)は「幼稚園のころから読み始めたので、日本語はハリポタで学んだようなもの。今度は英語を勉強したい。ハリーが死なないように祈っています」と心配そうに話していた。

日本語はハリポタで学んだ……。なんと不遇な人間だろう。この子の日本語力が心配だ。治療のため、いますぐ中島敦の文章を読むべきだ。

2007-07-20

バカのために最適化する必要はない

Rune Moberg  こんにちは、64bit Windowsのデフォルトのデスクトップヒープサイズは20MBもあるので、かなり余裕があると思いました。  だから僕はシステムの変数を書き換えて、1プロセスに10000ハンドルという制限を越えてみたんです。  不可視のウインドウを20000個作るのは、すぐにできました。でも、そのハンドルを破棄するのが厄介でした。まず、自分でDestroyWindowを呼び出してみると、タスクマネージャからウインドウハンドルが、30000個から、徐々に減っていくのを数えられるほど遅いのです。秒間30個ぐらいしか解放できませんでした。単にリークさせて、OSに解放を任せてみても、やはり遅かったです。ただ、自分で解放するより早いんです。問題は、30秒ぐらい、UIが固まってしまうんです。そのコンピュータのネットワークサービスなどは、問題なく反応するのですが。問題ない数は、10000から18000ぐらいでした。僕の環境はXeonのデュアルです。教えてください。お願いします。 Raymond Chen  いや、そりゃ単に、お前は20000個ものオブジェクトをリークすべきではないというだけさ。なんでバカのために最適化しなければならないんだ? 調子に乗るだけじゃないか。だいたい、デフォルトの制限値は10000個だ。そもそもシステムが想定しているよりも多いんだよ。だいたい、その制限を変えるには変数の値を変えないといけない。もちろん、ウインドウマネージャはちゃんとクリーンアップするよ。その挙動は、あまりいい気分ではないだろうけどね。  悪意のあるプログラムが過負荷によるサービスアタックに利用するだって? おいおい20000個もウインドウを作れるのならば、ウインドウをひとつ作り、そのウインドウで好きなだけユーザをたぶらかし給え。  面白いことを云う。まあ、さすがは、USBドライバのバグをつくUSBデバイスを作成するより、フォークの方がセキュリティ上問題だと考えるだけある。

2007-07-19

ウインドウハンドルの謎

このブログをブックマークしている奇特な人がいるらしい。最近は、ほとんどネタも書いてないというのに。まあこういうときは、例の如く、oldnewthingから話のネタを引っ張ってくるのがいいだろう。幸いにして、いま面白そうなネタを書いている。

How are window manager handles determined in 16-bit Windows and Windows 95?
How are window manager handles determined in Windows NT?
Why is the limit of window handles per process 10,000?

ただし、この話はいわゆるimplementation detailというものなので、絶対に悪用しないように。Raymond Chen様がブログを止めてしまうかもしれない。

今回は、ウインドウハンドルの値についてだ。oldnewthingを知っているようなプログラマなら誰しも、32bitなWindowsにおけるカーネルオブジェクトへのハンドルというのは、単にプロセスのハンドルテーブルのオフセットに過ぎないと言うことを知っているはずだ。しかしウインドウハンドルの値はどうか。16bit時代の頃、ウインドウハンドルの値というのは、ウインドウマネージャのセグメントへのnearポインタだったのだ。そのため、ウインドウハンドルと言うのは、16bitの値であった。

nearポインタとfarポインタ。私はこんな世界に生まれなくて幸いであった。当時は、メモリと言うのは64KBで境されるセグメントだったのだ。16bitなアドレッシングで扱えるメモリの量は64KBである。だから、64KBより大きいメモリを扱いたかったり、別のプロセスのメモリを指定したい場合は、FARポインタを使う必要があった。FARポインタは32bitで、上位16bitは、セグメントへのアドレスであった。当時はこのセグメントを複数使いこなすことが、プログラマに求められていた。必要ならば、DSを自分で書き換えることは普通であった。この頃のポインタは、本当に難しかったに違いない。

やがて時代は移り、32bitの世界がやってきた。Windows 95である。プロセスが複数のでかいヒープを持つことが当たり前になる時代。しかし、世の中はまだ16bitコードであふれかえっていた。そこで、Windowsは16bitコードをサポートする必要があった。そこで、WIN16のウインドウハンドルが問題になる。その頃、ウインドウハンドルの値は16bitである。したがって、Windoes 95でも、ウインドウハンドルの値は16bitでなくてはいけなかった。しかし、Windows 95 のポインタは32bitだ。一体どうすればいいのか。

そこで、ウインドウマネージャは、メモリを古きよきmovableとして確保する。得られるメモリは、実際のアドレスではなくHLOCALというハンドルだ。このとき、ウインドウマネージャは、32bitのヒープマネージャーに、16bitハンドルを返すように要求する。ヒープマネージャは64KBのメモリを確保し、実際のメモリポインタを格納しておき、そのメモリへのオフセットを返す。これで、16bitなウインドウハンドルが作られる。

ポインタひとつにつき4バイト必要なので、この64KBのハンドルでは、最大16384個のハンドルを扱える。CreateWindowExのドキュメントで

Windows 95/98/Me: The system can support a maximum of 16,384 window handles.

と書かれているのはこのためだ。実際には、ゼロはNULLと混同されるために使われなかったりするので、もう少し少ないそうだが。

しかし、ポインタは4バイトなのだから、あらかじめ4で割ることにしておけば、65535個のウインドウハンドルを扱えるはずである。何故しないのかと疑問を呈する人がいるかも知れぬ。しかし、Windows 3.1はたかだか700程度のウインドウしか扱えなかったことを考えると、すでに23倍も多いのである。その頃は、数百のウインドウと言うのは物凄く多いと考えられていた。メモリは現在のように十分ではなく、クールな奴等は8MB積んでいた

しかし、この実装はある問題を引き起こした。同じウインドウハンドルの値が再利用されやすいと言うことである。すでに破棄されたウインドウハンドルを使おうとすれば、当然エラーになる。ところが、そのウインドウハンドルが、再利用されると、別のウインドウを指すようになる。つまりまったく別のウインドウに対して操作を行うようになる。これは、操作する側にとってもされる側にとっても、いい状況ではない。

そこで、Windows NTでは、対策を施した。ウインドウハンドルの上位16bitを活用するのである。Windows 95は上位16bitをゼロにしていたが、NTでは、ユニークな値を入れるようにしている。これは、ウインドウハンドルが再利用されるたびにインクリメントされる値である。こうすることによって、現実的な間、まったく同じ値のウインドウハンドルが使われないようにしている。16bitコードには、例の如く下位16bitだけを渡せば良い。

NTの時代には、だいぶメモリ容量も緩和されたが、ウインドウハンドルの数はどの程度緩和されたのだろうか。NULLなどの特殊な値を除外しても、65000個ほどはウインドウハンドルを扱えるはずである。しかし、NTのウインドウハンドルは32700程度に制限されている。なぜかというと、どうやら世の中には、ウインドウハンドルの値は偶数であると決め付けているプログラムがあるらしい。

また、1プロセスあたり10000個のウインドウハンドルしか開けないが、この制限は何のためにあるかと言うと。そんなに使うべきじゃないということらしい。すでに最大値の三分の一も使っているのだ。そんなプログラムは絶対におかしい。あまりにもウインドウが多すぎると、タスクマネージャが起動できなくなり、ユーザがそんなおかしなプロセスを強制終了できなくなってしまうかもしれない。まあ、この辺は納得できる。

さて、さっそくこの情報を試すことにしよう。ウインドウハンドルの、意味のある値は下位16bitである。しかも、偶数であるというassumptionにより(assumption、なんといういい響き!) 最下位ビットも使われていない。即ち我々は、ウインドウハンドルを0x0000fffeでANDしても問題ないはずである。早速試そう……動いた。どうやら、上位16bitがゼロのときは、ユニークな値にする対策を無視してくれるらしい。今の実装では。

ここに書いてあることを絶対に悪用しないように。

2007-07-16

ffmpegのバグレポートなど

 ffmpegのメーリングリストにバグレポートとパッチを投げて、IRCで会話してたら、flvenc.cを書いた本人から回答が来た。

00:37 (hito) anyone test my patch? i find a bug in ffmpeg and make a patch. but i have no linux platform to test.
00:48 (mru) which patch?
00:48 (merbanan) hito: not tested, but it looks correct
00:49 (hito) http://lists.mplayerhq.hu/pipermail/ffmpeg-user/2007-July/010103.html
00:49 (hito) it is
00:50 (hito) i just make handy program which read FLV file and find mencoder(ffmpeg) output completly broken file
00:51 (merbanan) sorry about that, it's my code :)
00:51 (hito) wow
00:51 (merbanan) well the VP6 code
00:51 (merbanan) not the complete flv muxer
00:52 (merbanan) hito: I'll push for inclusion of the fix, expect it to be committed in a few days
00:53 (hito) thanks
00:53 (merbanan) thanks for the bug report with a patch to fix it

 なるほど、やってみるものだ。

01:10 (hito) but even official Flash Player doesn't complain about Previous tag size... who use it? :)
01:12 (mru) probably nobody
01:12 (mru) what would you use it for? parse a file in reverse?
01:12 (hito) no
01:13 (hito) well yes i read it forward and hey there is Previous tag size maybe it is for reverse access
01:13 (hito) so i try it and find most of flv file broken.
01:13 (hito) allmost all flv file
01:14 (mru) then your best option is probably to simply ignore it

 そんなぁ……。

2007-07-15

There's an awful lot of broken flv file out there

 最近、C++やWindowsに関する書籍を読み漁っていたが、全然実際のプログラミングをしていなかった。これではまずいと思い立ち、さっそく得た知識を使うべく、FLVファイルを扱うプログラムを書いた。  しっかりと考えたC++のコードを書くのは、実に楽しい。さて、とりあえずFLVファイルのタグをひとつずつ読み込むコードを書き、テストしてみることにした。  はたして正常に動作しなかった。  調べてみたところ、私のコードに誤りはないという結論に達した。間違っているのは、FLVファイルのほうだ。  まず、PHOTO蔵のFLVファイルであるが、ヘッダのビットマップには、VideoのフラグもAudioのフラグも立っていない。  次に、YouTubeのFLVファイルであるが、二つ目のタグの、PreviousTagSize、即ちPreviousTagSize1がおかしい。恐らく、YouTubeはFLVファイルにメタデータを付加するツールを使って、自前のサービスに必要な情報を付加しているのだと思うが、このツールに問題があるらしい。メタデータを変更すると言うことは、そのタグのサイズを増減させると言うことになる。サイズに変更があった場合、その次のタグのPreviousTagSizeを適切に変更しなければならない。これが為されていない。  また、最高にひどかったのは、ffmpegの吐くFLVファイルだ。mencoderで吐かせたFLVファイルがとんでもなく間違っていると思ったら、どうもffmpegのコードにバグがあるらしい。VP6の動画の場合、PreviousTagSizeが1バイトずれている。これは、実際にソースコードを読むと、バグが一目瞭然である。コーデックがVP6の場合、2バイトのデータを付加し、そうでない場合、1バイト付加するコードになっているのだが、PreviousTagSizeに加えられる値は、つねに1バイトである。これはひどい。  どうやらこのことから、現行のプレイヤーはPreviousTagSizeなどまったく無視していると判断せざるを得ない。世の中には腐ったファイルが多すぎて、まったく信用ならないからだ。 http://lists.mplayerhq.hu/pipermail/ffmpeg-user/2007-July/010098.html ffmpegのMLに投げてみたが、直してくれるだろうか。というか直してくれないと困るが。

2007-07-11

catan quitter

 Sea3Dで遊んでいると、落ち逃げした者がいた。名前がKamemusiであった。日本人としては少々気になる名前だ。面白そうなので、さっそくこれなる名前のページを見てみることにした。 http://www.s3dconnector.net/connector/s3dPlayer.php?player=Kamemusi  何と、同じIPのユーザに、haruhi loveとかsofmapなどがあるではないか。これは明らかに日本人だ。しかし、何と言うキモい名前。IPは動的割り当てだと思うが、同一人物である可能性は高いと思われる。  IPを調べてみることにした。このユーザのIPは、必ず58.188.235.xxxで始まっている。このIPは、なんとeonetのものだ。やはりジャップだった。実は近所に住んでいるのではなかろうか。私もプロバイダはeonetなのだが、京都ではこのようなIPは割り当てられない。都道府県を調べてみると、どうやら大阪のようだ。  とりあえず、大阪民国には、ハルヒラブでソフマップによく行くカメムシがいるらしい。このようなキモイ名前を付けることからして、相当のキモオタに違いない。しかもあの大阪民国に住んでいるとは救いようがない。

ffmpegのコードを読んだら、自信喪失した

 あqwせdrftgyふじこlp; うわあああああああ あんなに悩んでいたFLVのDataタグの完全なパースが、恐ろしく簡単に実装されている!@#$%^&*? 何週間も綺麗な実装方法について悩んでいたのに……。  もう、この業界あきらめようかな。自分には向いていないし、一生かかっても極められない。何でも世の中には天才という奴がいて、我々凡夫はその後追いをしているだけだ。結局、ただ学んだ知識を使うだけで、何一つとして生み出すことが出来ない。  

FLVのonMetaDataがカオスすぎる

 規格を読んだが、どうも細部がよく分からない。正しい例のひとつもつければいいのに。  まず、Data tagであるが、トップレベルのSCRIPTDATAOBJECTはひとつだけなのか、あるいは複数あって、SCRIPTDATAOBJECTENDで終端されているものなのか。ほとんどのFLVはひとつだけのようだ。  Lists of SCRIPTDATAOBJECT records are terminated by using the SCRIPTDATAOBJECTEND tag.  とあるが、そもそもそんなFLVファイルは見当たらない。巷に転がっているFLVファイルは、みなSCRIPTDATAOBJECTがひとつだけだ。SCRIPTDATAOBJECTENDを使っているFLVファイルも見当たらない。どのFLVファイルも、最初の名前がonMetaDataで、ECMA array typeが格納されている。問題なのはここからだ。これはサイズを指定した配列なので、終端はいらないはずだ。事実、終端はObject typeかStrict array typeのときしか規定されていない。だからいらないはずなのだが、ffmpegは最後にSCRIPTDATAVARIABLEENDを吐く。不思議に思っていたが、どうもOn2のFlix EngineもSCRIPTDATAVARIABLEENDを出力している。一体何が正しいのか。規格を読む限り、必要なさそうに思えるのだが。  しかもさらに問題をややこしくしているのがYouTubeだ。YouTubeのFLVファイルには、それらの終端があるのだろうか。本当にわからない。  結論、こんな奇妙極まりない構造を考え付いたマクロメディアは糞に違いない。  

2007-07-10

シリアルポートを扱うのは簡単だ

 FPGAとVHDLの実習で、シリアルポートを使う練習で、ある値を送り続ける課題があった。果たしてさっぱりうまくいかなかった。ハイパーターミナルでは分かりづらいので、自前でCOMポートをモニタするツールを書くことにした。かねてより簡単にCOMポートに読み書きできるのは知っていたが、本当にあっさりと書くことができて拍子抜けした。それにしても、ボーレートやフロー制御の設定にまぎれて、1バイトが何ビットであるかを設定する項目があるのには、時代を感じた。    とりあえず、概略を書いておく。まず、CreateFileで開く。ファイル名は。"COMx"だ。xの部分に、開きたいCOMポートの数字を入れればいい。そして必要に応じてREADやWRITEのアクセス権を指定する。また、MSDNによれば、排他的アクセスで無ければならないとされている。セキュリティは無し。OPEN_EXISTINGで開く。オーバーラップもサポートされている。テンプレートは設定できない。
HANDLE com = CreateFile( L"COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
 現在の設定は、GetCommStateで設定できる。DCB構造体を適切に設定して、SetCommStateで変更できる。あとは、おなじみのReadFileやWriteFileで読み書きすればいい。  時代と言えば、昔はシリアルだから遅い、パラレルにしたほうが早いと言われていたものだ。  シリアルって早くね? 480Mボーぐらいでるんじゃね?

2007-07-04

iPhoneのrootアカウントのパスワードがクラックされた

2009年11月5日追記:二年前のこの記事が、にわかにPV数を得ている。何故かというと、こういう事があったからだ。間違えてここに飛んできた人の為の便宜を図るために、リンクしておく。
ロック解除のiPhoneを人質に、「身代金」の要求騒ぎ - ITmedia News

http://www.hackint0sh.org/forum/showthread.php?t=1323

rootアカウントのパスワードは、"alpine"
mobileアカウントのパスワードは、"dottie"

パスワードのセンスを褒め称えるべきだろうか? ちなみに、パスワードは古き良きDESでハッシュされているらしい。今となっては懐かしい暗号だ。クラックには、John the Ripperで15秒だったとか。

まあ、iPhoneは携帯である。マルチユーザなどといった使い方は想定していないし、そもそもiPhoneのシェル上から、rootにログインする方法がない。iPhoneにはターミナルなどないし、セキュリティ上の問題になることも無い。rootアカウントへのログインはまだ試みられていないようだが、そもそもUIが動くのかどうか疑問のようだ。

2007-07-01

FLV ファイル

 FLVファイルを処理するツールを作ろうとしたが、なかなか難しい。Dataタグには、完全なパーサを書かなければならない。いい加減に対応すると、泣きを見るだろう。  しかし、OnMetaDataの公式な規格書がないのはどういうことだろう。

2007-06-30

久しぶりにアニメ

ニコニコでこの動画を見たついでに、うたわれるものを4話まで観たら、なかなか面白かった。

2007-06-27

mencoder doesn't support vp7 well

mencoderでVP7のエンコードをしてみようと思ったのだが、どうもうまくいかない。

まず、vfw2mencでエンコードの設定を保存しようとしたのだが、保存したファイルを、mencoderで読み込ませようとすると失敗する。設定ダイアログを開くことはできるので、手動でエンコードしようとしたが、これもうまくいかない。エンコードはできるのだが、再生できない。不思議に思って出力されたAVIファイルを調べてみると、どうもFourCCの値がおかしい。VP70であるべきなのに、変な値になっている。そもそも、可読域ではない値だ。バイナリエディタでVP70に修正してみると、あっさりと再生できた。

問題は、ffourccオプションが働かないとはどういうことだろう。何のためのfourcc強制オプションだ。

肝心のVP7の画質だが、かなりのっぺりとした結果になる。ウェーブレットでもかけたような感じだ。恐らくアニメなどをエンコードするにはいいと思われる。FLVの動画コーデックの指定には4ビットが使われており、現在6種類のコーデックをサポートしている。つまり、まだ10個分空きがあるのだ。もし、FLVでサポートして欲しいとしたら、何を望むだろう。H264、VP7などだろうか。

 なお、今回思わぬ発見をした。mplayerでVP6を再生するとやけにブロックノイズが目立つが、これはffmpegのVP6の独自実装のデコーダのためである。vp6vfw.dllでデコードするためには、-vc vp6 と指定してやれば良い。

2007-06-25

平生の主張

 タバコという合法ドラッグをやる人間は今すぐ死滅せよ。

2007-06-20

危険なセキュリティソフトウェア

 http://blogs.technet.com/markrussinovich/archive/2007/06/19/1256677.aspx  たとえば、あるコンピュータにインストールされているWindowsに、二つのアカウントが設定されているとする。お互いに、相手から読み書きができないようなパーミッションを付けたファイルを持っている。ところで、一方のアカウントは、かなり頻繁に、あるソフトウェアを実行していると分かっている。もし、もう一方のアカウントから、そのソフトウェア(.exeファイル)を差し替えられれば、自分にとって秘密のファイルの読み書きができてしまう。  まあ、Windowsというのは、たいていの場合、ユーザが管理者であり、それほど問題にはならない。いくらVistaでマルチユーザーを歌おうとも、個人的には、これはそれほど問題にはならないかと思う。問題なのは、このようにセキュリティがずさんなことだ。  というのも、何もこれはファイルに限った話ではないからだ。他のカーネルオブジェクトが危険なのだ。たとえばミューテックスオブジェクトだ。あるセキュリティソフトウェアが、名前付きミューテックスオブジェクトを使ってスレッド、あるいはプロセス間の同期を取っていたとする。このセキュリティソフトウェアを無効にしたい、悪意あるプログラムは、単にそのミューテックスを開いて、自分で所有してしまえばいい。セキュリティソフトウェアは、いつまでたっても解放されないミューテックスオブジェクトを永遠に待ち続けることになるだろう。たったそれだけのことで、セキュリティソフトウェアを無効にできてしまうかもしれない。  また、セキュリティソフトウェアはその性質上、Local Systemで動作することもある。あるセキュリティソフトウェアは、Local Systemで動作させているプロセスと、他のプロセス(恐らくはユーザへのUIなどか)と共有メモリを使って通信している。何と皮肉なことに、この共有メモリのセキュリティが設定されていないのだ。つまりどのプロセスからでも、この共有メモリにアクセスすることができるのだ。マルウェアは、この共有メモリをいじってやれば、Local Systemで動作しているプロセスに何らかのメッセージを送ることができる。ひょっとしたら、自分の望み通りの動作をさせることができるかもしれない。これをセキュリティホールと言わずして何という。皮肉にも、セキュリティソフトウェアと名乗るプログラムに、これが非常に多いらしい。もちろん、他のプログラムも、それほど違いはなく、かなりいい加減なのだが。  Mark氏は、これは9x時代には、シングルユーザであることが当たり前だったから、このようになっているのだと推測している。時代は変わったから、そろそろプログラマも頭を切り替えなければいけないようだ。

2007-06-17

How do i encode ローゼンメイデン風アンパンマン

 恐らくは、いくらかの需要があるだろうと思い、ローゼンメイデン風アンパンマンを、高画質にエンコードする方法について書いてみる。  まず、この元ソースは、Flashだ。とりあえずソースを入手する。http://www.omosiro-flash.com/flash/anpanman.html  さて、これを何とかして、動画にしなければならない。Swf2Aviを使い、動画にする。FPSは12だ。さて、動画を得られたら、次は音声である。幸いにして、このFlashは単一のBGMを流しているだけなので、単にFlashを分解して、音声ファイルを取り出せばよろしい。ADPCMなので、mp3にエンコードする必要がある。  さて、動画のエンコードだ。動画を吟味すると、これは一見簡単そうに見える。なにしろ、ベタ塗りであるし、輪郭もはっきりしている。ところが、普通にエンコードすると、なぜか物凄く画質が悪くなってしまう。ビットレートが、指定したよりも大幅に下がってしまうのだ。これは、動画が12FPSだからだ。動画圧縮というのは、物凄く大雑把に言ってしまえば、キーフレームとその差分であるインターフレームで構成されるので、FPSが低いと、逆に不利になる。とくにVP6の場合、顕著である。従って、フレームレートを上げなければならない。ここは単純に、フレームを重複させるだけでいい。  つまり、mencoderでは、 -vf (いろんなフィルタ),harddup -fps 12 -ofps 24  としてやればいい。このharddupというフィルタは、単純かつ非常に役に立つ。フレームを重複させなければならないとき、nullフレームを挿入するのではなく、単純に前のフレームをそのまま使う。こうすれば、十分なFPSを確保でき、きれいにエンコードできる。

2007-06-11

Human's ear is stupid

 人間の耳というのは、本当にいい加減なものだ。この動画は、超高音質と銘打っているものの、実際のところ、それほど音質がいいわけではない。それどころか、恐ろしく劣化している。にもかかわらず、多くの人が、音質がいいと錯覚している。  さて、このFLVファイルを落とし、調べてみると、まず音声部分は、128kbpsのmp3であった。注意深く聞いてみると、低音と高温がやけに強調された音であることが分かる。いわゆるドンシャリだ。  まあ思うに、ドンシャリの方が、音質がよくなったと感じる人間が多いのだから、ドンシャリの方が好いのではないかと思う。あくまで、人間がよい音だと認識することが重要なのだから。  CreativeのX-Fiシリーズは、Crystalizerという名称の、いわばプリセット済みイコライザーがある。これは低音と高音を強調し、注音を抑えるという、まさにドンシャリフィルタだ。使ってみると、確かにいくつかの音に関しては、良くなったと錯覚してしまう。こういう機能があるのも、ひとえに人間の耳がいい加減なものだからだろう。

2007-06-05

how do i get rid of disgusting interlace

追記:自動改行に頼っていた古い記事を整形。内容は結構古いので、今はどうなっているか分からない。

ソー、ディスタイム、ウィーアーゴーイングトゥトークアバウトデインターレース。

さて、インターレス解除の方法であるが、その前にひとつ、どうしても言わなければならないことがある。

曰く、「完璧を求めるならば、アナログなディスプレイで見ればいい」

本当に、これに尽きる。完璧なデインターレス方法などない。最良の方法とは、最初からインターレスなソースを用いないことだ。とは言え、入手可能な最良のソースがインターレスを含んでいることは往々にしてあることだ。なんとかして、インターレスは除かねばならない。

さて、mencoderに詳しくない者は、ひょっとしたら、mencoder以外でインターレスを解除しているかも知れぬ。ところが、mencoderには、最強のインターレス解除方法も備わっているのだ。早速見ていこう。

インターレスを解除するには、vf 引数、つまりビデオフィルタを使う。最も単純なのは、ppから始まる一連のフィルタだ。たとえば、pp=lbはLinear Blendであるし、pp=liはLinear Interpolationだ。基本的にこれらを使う。個人的には、PP系の中では、Cublic Interpolationがお勧めだ。これらは組み合わせて使うことも出来る。たとえば、pp=ci,pp=l5は、キューブリックインターポレーションの後に、ローパスフィルタをかけている。

PP以外のデインターレスフィルタはどうかというと、こちらはより賢い方法を採用している。たとえば、動画が実際より3/2フレーム数の多い、テレシネであった場合、逆テレシネを利用して、実に効果的にインターレスの解除が行える、pullupやfilmdintなどだ。もちろん、このフィルタを利用するには、テレシネ動画で無ければならないのだが。

さて、テレシネ動画でない場合、どうすればいいのか。ここで、かなり汎用的に使えて、性能のいいフィルタがある。yadif(Yet Another DeInterlace Filterの略)というフィルタだ。この性能はすばらしい。たいていの場合で、困ることはない。使い方だが、1フレーム毎に処理したいならば、yadif=0を使う。1フィールド毎に処理したいならば、yadif=1を使う。2や3は、spatial interlacingを行わない、0や1のことだ。yadif=1を使う場合は、framestep等を使い、フレームを脱落させるか、あるいは出力するFPSを倍にしないと、泣きを見ることになる。フレームがフィールド単位に分離されているからだ。単純に2倍になる。

さて、更なる高みを目指したい人は続きを読んで欲しい。最強のフィルタがある。その名はmcdeintだ。これは、動き補正をしつつインターレスを解除を行うという、恐ろしいフィルタだ。何が恐ろしいといって、物凄く遅い。現状のどんなCPUを使っても、エンコードのFPSは一桁を切るだろう。0.1、0.01の世界にまで落ち込む。

使い方は次の通り、

yadif=3,mcdeint=2,framestep=2

mcdeintは、それ自体でフィールド分離機能を持っていないので、フィールドを分離する、tfields=1や、yadif=1, yadif=3などを一緒に使わなければならない。そして、FPSが倍になっているので、単純にフレームを脱落させ、元のFPSに戻すか、FPSを倍にしなければならない。なお、mcdeint=3ならば、さらに遅くなる。これは劇的に遅いが、最強だ。

2007-06-04

ふと思った

 よく、「私らが子供の時分には、皆、外で遊んでいたのに、近頃ときたら、皆で集まってもゲームばかり。まったく、最近の若い者はダメだ」などと言われる。  まあ、そうは言っても、その時分にはゲームなどないし、今は遊べるような所も少ない。もちろんこういうことは、四千年前のエジプトのパピルスにも書いてあるそうだ。因みに、このエジプトのパピルスについて調べたが、どうも一次ソースが見当たらない。わが国では、柳田国男が、「Archibald Henry Sayceがそんなことを言っていた」と、著書「木綿以前の事」に書いている。そして、このArchibald Henry Sayceは、いくつかの本を書いている。この中に、恐らくはあるだろうと思われる。しかし、こんなマイナーな本は、国内では国会図書館か、有名な大学の図書室にでも行かなければ見つからないだろう。  さて、そこでふと思った。もし我々が親の世代になったとき、一体なんと言われているのだろう。既にゲームはある。外で遊べる場所は今より増えることはないだろう。さて何と言う。  思うに、ネット対戦ではないかと思う。最近、ようやくインターネットも普通になってきた。帯域は、現在でもゲームには十分すぎるぐらいだし、遅延も、恐らく将来は、日本国内は最高でも10ms程度の遅延でpingが通るだろう。Google Mapで日本列島の全長を測ると、だいたい1500kmぐらいであった。沖縄を無視すればだが。1500kmを光の速さで進むと、5msかかる。適当に言ったが、結構ありえそうだ。  そんなわけで、どの家にも電話回線を付けているように、どこでもネットに接続可能になると、ネットゲームが物凄く身近な存在になる。  そういう近い将来、我々は次のように言うだろう。 「私らが子供の時分には、皆、集まって誰かの家でゲームをしていたのに、近頃ときたら、皆ネットゲームばかり。まったく、最近の若い者はダメだ」と。  ところで、書名を失念したが、ある物書きの文章読本では、物書きの間では、「ペンで書くのと、キーボードで打つのでは、文章が違う。ペンで書こうとすると、じっくりと考えてから書くので、必然的に良い文章が出来上がる。従って、物書きを生業とする以上、まずペンで書くべきだ」と主張する人が居ると書いてあった。その著者はこれを皮肉って、「まったく馬鹿げた話だ。ひょっとしたら将来、『音声認識による入力と、キーボードからの入力では、出来上がる文章はどちらが優れているか』という論争でも繰り広げられるのだろうか。ペンとキーボードの争いよりは、多少ましな気はするが」と締めくくっていた。

2007-05-26

高部真規子裁判長のおかげで、日本国内においてネットワークストレージが違法と相成りました

http://headlines.yahoo.co.jp/hl?a=20070525-00000119-mai-soci

これはどんなサービスかというと、ユーザが、自分の持っているCDを、MYUTAの提供するサーバにアップロードでき、そのユーザの携帯電話に落とすことができるというものだ。記事やプレスリリースを見る限り、ユーザ個人だけで完結するサービスのようで、他のユーザの音楽を落とせるサービスではないようだ。

東京地裁の「高部真規子」裁判長がだした判決のようだ。こんなもので訴えるJASRACもJASRACだが、判決を出す高部真規子も高部真規子だ。もはやこれはJASRACがどうとかいう問題を通り越してあきれてしまう。なんという裁判長。

これはすばらしい。日本国内では、ネットストレージサービスが違法になってしまった。この解釈で行くと、Webサーバ、POP3サーバなどのレンタルは違法になってしまうだろう。

なんという判決だろう。これはまずい。

 しかし、ぐぐってみたところ、この高部真規子という人間、恐ろしくトンデモ判決を多数出しているようだ。  あの有名な、松下がヘルプの機能で一太郎を訴えた裁判も、この高部真規子が出したらしい。  裁判官ってどうやって罷免させられるのだろう。

2007-05-19

FLV file structure

 最近、ニコニコ動画にハマっているのだが、FLVファイルの構造について知りたくなったので、調べていた。いくつか参考になりそうな情報が見つかった。 まず、ファイルの構造については、大まかにhttp://www.osflash.org/flvで情報がある。  直接のコードで読めて、参考になりそうなソースは、まずFLV Extractだ。これは、C#のコードだ。C#にはなじみがないのだが、かなりC++に似ている、というよりも、そのままだ。FLV Extractについては、単純なGUIとファイルアクセスなので、これをC++に移植することは、優しいことだろう。詳細な構造についてのソースコードが見たければ、ffmpegのコードを参考になりそうだ。  で、何がしたいかというと、どこの馬の骨かもわからないあのツールでマージするのではなく、自前でFLVのマージツールを作ってみようかと。

2007-05-17

how to change console's font?

 old new thingは実に役に立つ。たまたまコンソールについて悩んでいたら、ちょうどいいタイミングで、コンソールのフォントについて解説してくれた。 http://blogs.msdn.com/oldnewthing/archive/2007/05/16/2659903.aspx  なるほど、フォントの仕組みについてはよく知らなかったのだが、はみ出す文字というのがあるのか。  それにしても、ABCなんて名前の構造体を定義しているPSDKもどうかとおもう。もちろん、そんな名前が実際に使われることは、まずないだろうとしても。  一応、スーパーギークのために、フォントを変える方法はある。http://support.microsoft.com/kb/247815 HKLM\Software\Microsoft\WindowsNT\CurrentVersion\Console\TrueTypeFont 下に、00という名前の文字列を付け加えて、値をフォントフェイスにすればよい。複数のフォントを付け加えたい場合は、000, 0000,などというように、レジストリエントリの名前に、0を付け加えていく。

2007-05-13

一度生を受け、滅せぬ物のあるべきか

思へば、此世は常の住処にあらず。草葉に置く白露、水に宿る月より猶あやし。金谷に花を詠じ、栄花は先立て、無常の風に誘はるゝ。南楼の月をもてあそぶ輩も、月に先立つて、有為の雲に隠れり。人間五十年、化天の内を比ぶれば、夢幻のごとくなり。一度生を受け、滅せぬ物のあるべきか。これを菩提の種と思ひ定めざらんは、口惜しかりき次第ぞ

有名なところを超口語訳

つーか、人間ってせいぜい50年しか生きられねーよ。最下層の天使でさえも、八百年ぐらいはいきるっつーのによぅ。生まれたらそりゃ当然死ぬんだよ。これが定めか。なんつーこった

幸若舞『敦盛』(全文)
http://www.ikedakai.com/atsumori.html

2007-05-12

動画サイトの未来

ひろゆき氏、「ニコニコ」ヒットでも「動画は“来て”ない」

http://www.itmedia.co.jp/news/articles/0705/11/news117.html

まあ、PV数だけは無駄に稼いでいるが、大赤字だろう。トラフィックが膨大だからといって、広告料も上げてくれるわけではない。それもあるのだが、日本の動画の特徴が気になるところだ。ほとんどがアニメである。確かに、アニメといえば日本なのだが、それは所詮、作られたコンテンツである。自分で動画を作ってあげようという人が、あまりにも少ない。たとえば、YouTubeで最も人気の高い動画は何かというと。

つまり、個人が作った動画というのがほとんどない。たとえば有名なUnreal Gamer(キーボードクラッシャー)の動画は、狙って作られたものである。この少年が、別の動画でなにやら話しているものも、アップロードされている。こちらは普通に話しているだけなので、あまり人気はないが。

これは、誰でも作れるのだ。しかし、日本人はこういう動画を作ろうとしない。既存のアニメをいかに画質良くエンコードしてニコニコに上げるかにはこだわっても、自前でいかに面白い動画を作るかについては、まったく考慮しない。まあ、かく偉そうなことをいうからには、自分で作って見なければならない。そんなわけで一連の動画をここにリンクしておく。

http://www.nicovideo.jp/search/hito

2007-05-09

how do i use mencoder for two pass encoding

 さて、2パスエンコードを説明する。これまでのmencoderにはバグがあり、VP62の2パスエンコードがうまくいかなかった。.sstファイルが正常に出力されないのが原因である。これが、2chの有志により、直されたので、2パスエンコードができるようになった。ちなみに、CBRだと、バグがあってもできてしまったりする。公式にパッチは上げてくれるのだろうか。  それにしても、やはり、2パスはすばらしい。動き始めのブロックノイズが激減する。いままで2パスを敬遠してきたのは、mencoderだけで完結する方法がなかったからだ。
echo オーディオのビットレートを指定(kbps) 例:64 set Audiobitrate=64 REM ビデオフォーマット設定(出力拡張子で自動的に確定) set FORMAT=-of lavf set FOPT=-lavfopts i_certify_that_my_video_stream_does_not_use_b_frames REM 一応入力側の名前に合わせてみる set OUTPUT=-o "%~n1.flv" set INPUT="%~1" REM ビデオコーデック設定 set VCODEC=-ovc vfw REM 音声コーデック設定 set ACODEC=-oac mp3lame set ACOPT=-lameopts abr:br=%Audiobitrate% -af resample=44100 REM その他フィルタオプション(現状は上下反転+LanczosResize512x384)-ffourcc VP6F set EXTOPT=-vf flip,scale=512:384 -sws 9 REM 2pass用 set VCOPT=-xvfwopts codec=codecs\vp6vfw.dll:compdata=firstpass.mcf mencoder %FORMAT% %FOPT% %VCODEC% %VCOPT% %ACODEC% %ACOPT% %EXTOPT% %OUTPUT% %INPUT% set VCOPT=-xvfwopts codec=codecs\vp6vfw.dll:compdata=secondpass.mcf mencoder %FORMAT% %FOPT% %VCODEC% %VCOPT% %ACODEC% %ACOPT% %EXTOPT% %OUTPUT% %INPUT% あとは各自試行錯誤でもしてくれってことで。
 これが、2パスに必要なバッチファイルである。例の如く、自分好みに変えてある。さて、とりあえず試したい場合は、コーデックの指定を、vp6vfw.dll:compdata=dialogにすれば良い。設定ダイアログが表示されるので、それぞれ、Two Pass - First Pass, Two Pass - Second Passを選べば良い。しかし、それでは人間が応答しなければならない。私の理想は、無人のまま自働エンコードである。そこで、コーデックの設定を、保存しておく必要がある。これには、.mcfというファイルを生成する必要がある。このバッチファイルに添う形では、firstpass.mcfと、secondpass.mcfである。.mcfファイルはどうやって生成するか。それには、vfw2menc.exeを使う。次のように呼び出せば良い。
vfw2menc -f VP62 -d codecs\vp6vfw.dll -s firstpass.mcf vfw2menc -f VP62 -d codecs\vp6vfw.dll -s secondpass.mcf
それぞれ、1パス目、2パス目を設定する。このようにしておけば、人間が応答することなく2パスエンコードができる。

what niconico wiki's mencoder batch file doing?

前回、mplayerとmencoderについての概要を説明した。今回は、ニコニコ動画のまとめWikiにある、mencoderのバッチファイルが何をしているかを説明してみる。なお、今回は、mencoderのドキュメントを参照しつつ、読んで欲しい。 http://www.mplayerhq.hu/DOCS/man/en/mplayer.1.html

echo オーディオのビットレートを指定(kbps) 例:64 set /p ABITRATE=AudioBitrate: set Audiobitrate=%ABITRATE% REM ビデオフォーマット設定(出力拡張子で自動的に確定) set FORMAT=-of lavf set FOPT=-lavfopts i_certify_that_my_video_stream_does_not_use_b_frames REM 一応入力側の名前に合わせてみる set OUTPUT=-o "%~n1.flv" set INPUT="%~1" REM ビデオコーデック設定 set VCODEC=-ovc vfw set VCOPT=-xvfwopts codec=codecs\vp6vfw.dll:compdata=dialog REM 音声コーデック設定 set ACODEC=-oac mp3lame set ACOPT=-lameopts abr:br=%Audiobitrate% -afresample=44100 REM その他フィルタオプション(現状は上下反転+LanczosResize512x384)-ffourcc VP6F set EXTOPT=-vf flip,scale=512:384 -sws 9 mencoder %FORMAT% %FOPT% %VCODEC% %VCOPT% %ACODEC% %ACOPT%%EXTOPT% %OUTPUT% %INPUT% あとは各自試行錯誤でもしてくれってことで。

これが、FLV4enc_D&D.batの中身である。1パスの、重要な部分だけを抜き出してある。基本的に、最後のmencoderが重要なのだ。このバッチファイルは、FLVにエンコードして、ニコニコにうpするための、最小限のことだけをしている。これを理解して、自分で変更できるようになれば、さらに画質や音質を上げられるだろう。

まず最初のFORMAT変数には、-ofオプションを使い、どのフォーマットで出力するかが指定されている。明示的にflvを指定してもいいのだが、このバッチファイルではそれはしていない。次に、-lavfoptsオプションを使い、出力する動画が、Bフレームを使用していないことを明示している。現在、mencoderではBフレームの出力がサポートされていないからである。 VCODEC変数で、コーデックを指定している、これは、vfw(Video For Windows)を使う。つまり、vp6vfw.dllのことだ。次に続く-xvfwoptsオプションで、読み込むDLLファイルを指定している。また、コーデックの設定ダイアログを開くようにしている。コーデックの設定を自動化する方法があるのだが、それは2パスエンコードのときに説明するつもりだ。

余談だが、mencoderで、とうとう2パスエンコードができるようになったのだ。パッチがいつ、公式のMLに投げられるのか、不明ではあるが、diffは確保したので、いざとなればなんとでもなるだろう。私もUNIX環境のプログラミングを勉強すべきだろうか。

次は音声である。このバッチファイルは、いかなる動画ソースからでも、ニコニコに受け付けられるFLVを作成することを目的としているので、音声はエンコードされる。もし、自前でエンコードした音声がある場合、それを単にコピーすれば、再エンコードされずに、音質がよくなるだろう。FLVコンテナでは、無圧縮PCM、ADPCM、mp3をサポートしている。また、マイクで録音する際に、Nellymoser codecを使用しているようだが、このコーデックの仕様はよく分からない。現在のところ、オープンソースのデコーダーも見当たらない。 mp3へのエンコードは、-oacオプションで、mencoderに組み込まれているmp3lameを利用している。また、FLVコンテナは、 44.1kHz 22.05kHz 11.025kHzのいずれかのサンプリングレートでなければならないようなので、トラブルを防ぐために、-afオプションで、44.1kHzにリサンプルしている。ただし、このリサンプルは、次のEXTOPTで設定されている。ここが個人的に好きではないので、私の自前のバッチファイルでは、変更しているが。

さて、いよいよEXTOPT変数だ。ここにはまず、-vfオプションが指定されている。これは、ビデオフィルタという意味で、文字通りフィルタだ。 まず、flip、これは、VP6のデコーダであるVP6Fが上下反転した出力をするので、workaroundとして入れてある。最初から上下反転したフレームにしておけば、さらに上下反転して、意図通りにデコードされるという寸法だ。しかし、なぜこんなあまのじゃくな仕様なのだろう その次に、動画を512x384にスケーリングする。この解像度でなければ、SIMLEは再エンコードをしてしまうからだ。次に、-swsオプションで、スケーリングのアルゴリズムを設定してる。現在のところ11種類のアルゴリズムが実装されている。9というのは、lanczosアルゴリズムである。非常に品質のいいアルゴリズムとして有名だ。ほとんどの場合はこれでいいのだが、たとえばドット絵、ファミコンやスーパーファミコンなどの動画をエンコードするときは、4のnearest neighborがお勧めかもしれない。もちろん、エンコードする過程でかなり劣化するし、元ソースの画質にも影響されるので、どちらがいいかは、好みの問題ではある。また、先に説明したように、ここで音声リサンプルのための-afオプションが指定されている。 そのあとは、出力と入力のファイルを指定しているだけだ。

PS. やはり、バッチファイルを修正した。-afオプションと、%INPUT%にダブルクオーテーションがついているのを修正した。ダブルクオーテーションは、INPUT変数自体に含めるべき。

what is mplayer and mencoder and why i have to use them?

mplayerと、mencoderについて、説明を試みる。なお、これはニコニコ動画に動画をアップロードすることを前提に書いている。

mplayerとは、恐ろしく高機能な動画プレイヤーである。かなりの数の動画を再生できる。何がすごいのかというと、すべて自前でデコードしていることだ。しかし、もともとはLinux用のプログラムであり、Windowsで使う上では、必ずしも使い勝手や画質がいいとは言いがたい。基本はCUIである。ではなぜ、これがニコニコ動画にアップロードする上で、最適なのか。それは、mencoderの存在である。 mencoderは、mplayerとほぼおなじコマンドラインオプションを持っている。mplayerはプレイヤーであるし、mencoderはエンコーダーだ。 ニコニコ動画には、FLV形式の動画を直接アップロードできる。このとき、600kbpsで40MBの範囲に収まっていれば、再エンコードされずに、そのまま使われる。この制限は、かなり厳しい。

FLVというコンテナには、いくつかの動画形式を格納できるが、その中でも極めて、低ビットレートに置いても画質が優れているのが、On2 TecnologyのVP62だ。H263もそれなりにいいのだが、600kbps以下という厳しい制限では、VP62が圧勝してしまう。

さて、VP62にエンコードするには、ffmpegでエンコードするか、On2 Tecnologyのvfw(Video For Windows)コーデックである。vp6vfw.dllを使うしかない。ffmpegに実装されているエンコーダーはあまりよろしくないので、本家のvp6vfw.dllを使うことになる。mencoderは、それ自体で多数の動画形式へエンコードできるのだが、vfwコーデックを使うことも出来る。そのため、非常に使い勝手がいい。ちなみに、x86 Linuxで、Windowsのdllを使うために、非常に興味深いLoadLibraryの自前実装があるのだが、それはまた別の話。 それだけではない。mencoderは、その辺の安っぽい動画編集ソフトウェアよりも、よほど優れた動画編集能力を持っているのだ。まず、デコード、エンコードできる動画形式が多い。mpeg1/2/4はもちろんのこと、VOBなども問題ないし、ASF/WMA/WMV, QT/MOV/MP4, RealMedia, Matroska, NUT, NuppelVideo, FLI, YUV4MPEG, FILM, RoQ, PVAと、有名どころの形式は、余すところなくサポートしている。ffmepgに感謝すべきか。 また、基本的なフィルタも有しており、上下左右反転や回転はもちろんのこと、スケーリング、アスペクト比変更、ブラックバンドの追加、ノイズ除去、フレームレートの変更(単純な脱落から、フレームの合成まで)、テレシネ、逆テレシネ、シャープ、ブラー、インターレス解除ができる。とくにインターレス解除やスケーリングは、かなり多数のアルゴリズムを使うことが出来る。ロゴの削除なる機能もあるが、これをまともに使うのは難しそうだ。

と、ここまで説明すると、「おいおい、なぜCUIな貧弱ツールでフィルタなど使わなければならないんだ。この俺が使っているクールでイージーでGUIなツールでフィルタをかけたほうがいいじゃないか」と言う人がいるかもしれない。CUIであることの利点は、自分でコードを書いて、簡単にバッチ処理ができたりすることもあるのだが、なによりすばやいことだ。複雑なGUIでは、あるフィルタをかけるためには、メニューからフィルタの適用を選択し、ダイアログから目的のフィルタを選んで、パラメータを指定しなければならなかったりする。mencoderでは、-vfオプションを使うだけで、簡単に指定できる。たとえば、512x384にスケーリングしたければ、

mencoder -vf scale=512:384

とすれば良いし、400x300にスケーリングして、黒帯をいれて中央に表示し、512x384にしたい場合は、

mencoder -vf scale=400:300,expand=512:384

とすればよい。また、インターレスをLinear blendで解除しつつ、512x384にスケーリングするには、

mencoder -vf pp=li,scale=512:384

となる。非常に簡単だ。ちなみに、フィルタは並んでいる順番で適用される。インターレス解除は、一番最初に行っておかないと、泣きを見ることになる。

また、「俺のクールでイージーなGUIツールには、フィルタのプレビュー機能があるぜ」という人もいるかもしれない。この点も問題はない。なぜならば、mplayerとmencoderは一心同体、mencoderのフィルタは、mplayerでも同様に使える。だから、mplayerでリアルタイムにフィルタをかけつつ再生して、効果を確かめることもできる。 とはいっても、最高に高画質を目指す人から見れば、mencoderのフィルタは貧弱かもしれない。しかし、私のように、多数の動画にたいして、ある程度の画質を維持しつつ、寝ている間にエンコードしたいという人間には、最適なのだ。

次回は、ニコニコwikiで配布されている、mencoderを使うバッチファイルが何をしているかについて、解説する。タグ、mencoderで、一覧を見ることができる。

2007-05-08

what do we trust in the TBS

 時刻表示は信頼できるだろう。よほどのことがない限り、誤差はかなり低いと考えられる。  しかし、生放送を数分ずらしてリアルタイム編集しつつ放送とかやりそうだけど。

2007-05-04

プロセス終了時にメモリを解放すべからず

http://blogs.msdn.com/oldnewthing/archive/2007/05/03/2383346.aspx  よく、OSが解放してくれるから、プロセス終了時にはリソース解放などをしなくてもいいという意見に対して、「いや、できる限りすべきだ」という人が居るが、場合によりけりということらしい。いや、別にしてもいいのだけれど、DLL_PROCESS_DETACHの中でやるなということで。  プロセスが終了するとき、Windows XPがどのような処理をするか。ExitProcessが呼ばれたとき、ExitProcessを読んだスレッド以外のすべてのスレッドは、終了される。スレッドが何をしていようがお構いなしだ。つまりは、TerminateThreadに等しいということだ。MSDNではTerminateThreadは使うべきではないとしつこく警告されているが、一体何がまずいのか。実は、TerminateThreadとは、スレッドが何をしていようと、強制的に終了させるのだ。もし、強制終了されるスレッドが、クリティカルセクションに入っていた場合、そのクリティカルセクションはロックされたままになる。これの何がまずいのかというと、スレッド間で排他をとるヒープを使っていて、まさにヒープからメモリを確保、解放するときに終了されると、ヒープがロックされたままになる。  さて、ある「賢い」DLLは、DLL_PROCESS_DETACH通知が送られたときに、確保したリソースを解放しようとする。しかし、そのリソースに排他的にアクセス中のスレッドが強制終了された場合、リソースを解放しようとすると、例外を投げてこける。結果的にプロセスは終了するのだが、なんとも汚い終わり方になってしまう。  そこで、プロセス終了時のDLL_PROCESS_DETACHの中では、何もするな。何も「賢い」ことをするな。ただreturnせよ。リソースの解放はOSにまかせろ。  ただし、動的にDLLがアンロードされる場合は、この限りではない。まだプロセスは動き続けるのだから、リソースを解放しなければ、リソースリークになってしまう。なんともやっかいだ。

Time flies when you're enjoying yourself

 光陰矢のごとしとはよく言ったものだ。実際早い、早すぎる。私とて、もう二十歳なのだ。後せいぜい五十年ないしは六十年ぐらいしか生きられない定めなのだ。しかも50年とは、あくまで生存可能な時間であって、有意義に生きられる時間ではない。最新の技術にいつまでついていけるだろうか。あと20年、いや10年もないかも知れぬ。そう短い時間では、何も極めることができないだろう。  何ということだ。人間はたったの百年足らずしか生きられぬのか。いかに富や名声を得ようとも、歴史教科書の片隅に、「かくかくしかじかなる有名な男がいた」程度の扱いしかされぬのだ。今、各の如く、考え、悩み、先人のしたように、文に綴りてみんとするこの瞬間の思想は、決して伝えられないというのだろうか。

2007-05-03

High Quality Dressed Up Car

 車の免許を取るために、二段階技能で外を走っていたとき、ふと、前の車のリアウインドウにでかでかと張ってある、ステッカーが目に付いた。そこには、High Quality Dressed Up Car(超めかした車)と書いてあった。ああ、自画自賛ここにきわまれり。  あるいは、「大安売り」などと書いてあるTシャツを着ている外人と、似たような感覚なのだろうか。

2007-04-27

車の話

 ようやく仮免を取り、何度か外を走ってみた。なかなか難しい。そういえば、車好きの友人が居たので聞いてみることに。  自分「いやぁ~、青信号で発進するとき、なかなかうまくいかないんだよね。ギアをトップまで持っていくのに10秒以上かかるし、すばやく加速もできない」  友人「は、俺なんかもっとかかるで。後ろからクラクション鳴らされるんやで」  自分「何と、そりゃまたどういうわけで。お前なら速攻で切り替えてさっさと行くものとばかり思っていたが」  友人「あのなぁ、ええか、急に加速したら、ガソリンを食う、タイヤが磨り減る、クラッチが痛む、環境にも悪い。まあ環境はともかく、何でそなことせなあかんねや。周りがいくら迷惑しようとも、俺はのんびりいくで。」  自分「ああ、そういえばお前はそういう奴だった……」  この友人は、現実で車をかっ飛ばすより、ゲーム中でかっ飛ばすのが好きなようだ。何しろ、ゲームではガソリン消費もタイヤの磨り減りも気にしなくていい。そういえば、レーシングゲームは数多くあれど、みなアクセルとブレーキ、ステアリングで操作するものになっている。何故だろう。MT車の方がいいと主張する車好きはたくさんいるし、クラッチ操作のあるゲームがあっても不思議はないのだが。  この疑問を友人にぶつけてみると、面白い答えが返ってきた。まず、ゲームパッドで操作しにくい。クラッチ操作というからには、ちゃんと半クラにしなければならないため、アナログ入力が必要である。しかし、Xbox360やPSのコントローラでは、クラッチを操作するのに必要なトリガーが足りない。左右に日本ついているだけだ。もし3本目のトリガーがあったとしても、一体どの指で操作するというのか。  また、かつてアーケードゲームで、クラッチペダルのあるゲームが存在したらしい。アーケードならば、現実に近いコントローラ、つまり本物のステアリングと、本物のペダルを用意できる。かのクラッチ操作を伴うゲームは、クラッチのアナログ入力や、回転数があっていなければエンストを起こすという本格仕様であったらしい。しかし流行らなかった。どうやら、ゲーマーというのは、そこまで極端に操作性の本物志向を求めないものらしい。そういう本物志向にこだわる人間は、本物の車に乗るものらしい。  ふーむ、そんなものなのかね。何はともかく、今のうちに車の免許は取っておかなければならない。どんな職に就くにせよ、働きながら免許を取るのはかなり面倒だからだ。

2007-04-21

酒を飲んだ話

 長い間バイトをしていた人がやめるというので、飲みに行くことのした。かなり人から好かれる性格をしている人だったので、最終的に15人もの人数になった。しかし、酒を飲んだときの、人の変わり様は極端すぎる。私が常々思っていることは、「京都の人は裏表ありすぎ」だ。酒が入ると、如実に現れる。私もだいぶ飲んで足がふらついていたが、宴会が終わる30分前から酒をやめて、酔いを醒ました。宴会が終わったのは、2時ごろであった。  その後、ある人の知り合いのスナックに行って、カラオケをした。皆まだ酔っているようだ。私はだいぶ醒めてしまった。ところで、私には歌える歌がない。あるにはあるが、マニアックすぎるものばかりだ。  酒は冷めていたが、たまたま入っていた歌が歌いたかったので、入れてみた。.hack//SIGNのObsessionである。案の定、誰も知らずに場がしらけた。おそらくは、私の他に歌える歌、真ゲッターのSTORMなども、しらけるのだろう。ところで、誰か創生のアクエリオンのShangri-Laを歌えるのだろうか。  3時半過ぎにスナックから出た。帰宅に際し、周りはタクシーの相乗りを勧めるが、まだ酒が抜けていそうにない二人と同乗するのは面倒だったので、徒歩にて帰ることのした。家に帰り、シャワーを浴びて就寝。  正午に起床する。かるい頭痛がしたが、いつものことだ。酒を飲んだ次の日は、必ず頭が痛くなる。不思議なことに、睡眠をとった後で痛くなるのだ。寝る前にも酒は抜けていたはずなのだが、どういうことなのだろう。まあ、3時間ぐらいで収まるので、問題はない。  昨日、アマゾンで注文したWindows Internalsの代金の支払いと、明日のひぐらしデイブレイク改のために、銀行から金を下ろしに行く。Windows Internalsは、かのMark Russinovich氏も書いている。これは読まねばならない。もっと早く気づくべきだった。  ついでに、コンビニで紙パックのジュースを買うことにした。そこのコンビニでは、一ヶ月ぐらいセールをやっていて、レモンティーは110円であった。ただし、もうセールが終わっていて、126円に戻っていたのだ。私は、頭痛と、Windows Internalsと、ひぐらしデイブレイク改と、ニコニコ動画に上げるゲーム動画の作成について、思いを巡らせていたので、店員の「126円になります」という声を聞き漏らした。つまり、まだ値段は110円であると思っていたのだ。財布の中の小銭を見ると、果たして500円玉がある。しかし100円玉はない。そこで私は、無意識に510円を出した。無論、100円玉4枚のお釣りをもらうためだ。しかし、実際の代金は126円であるため、これは誤りである。店員は一言も発せず、510円を受け取り、384円のお釣りを返してきた。  何かが間違っている気がする。10円玉の意味がない。

2007-04-16

チラシの裏

 South Parkの1106. D-Yikesだが、金の装身具を身につけた浅黒い人々はPersianだ。South Parkのスクリプトは、ここで見ることができる。  かねてから目をつけていた、ハッピーハッキングキーボードを買ってみた。なかなか使いやすい。今回は英語配列を買った。小さくて場所をとらないのがいい。  しかし、英語配列のキーボードはコードが書きやすい。なんといううらやましいことだ。問題は、日本語が入力しにくい。半角全角キーなどなく、IMEを有効にするには、歴史的なAlt+`を押し下げなければならない。しかし、一度に複数のキーボードを使うときは、キーボードごとに違ったレイアウトを使いたいものだ。何とかならないものか。  キャプチャデバイスについて一言、USBのものを買う場合、USBバスパワーだけで動作するものはお勧めしない。とくに、私が買ったものは酷かった。まず、ドライバが署名されていない。これだけでも酷いというのに、付属のソフトウェアも酷い。バッテリーで動作しているときは、キャプチャするときに確認を求めてくるのはいいのだが、何が酷いかといって、PCをスタンバイする際に、「PCがスタンバイされるが、よろしいか?」というダイアログを出す。もちろん、スタンバイを一時停止させてだ。これはひどい。普通のラップトップにとって、スタンバイするというのは、閉じた場合なのだ。すでに閉じているので、ダイアログが出ていることなど分かるわけもない。とうぜん、スタンバイはされず、バッテリーを消費しつくす。本当に腐ったソフトウェアだ。Vistaでは、もはやこのようなくだらないソフトウェアをわざわざ待ったりはしない。プログラムはスタンバイ通知から2秒間の猶予を与えられるのみである。OSは有無を言わさずスタンバイに取り掛かる。

2007-04-12

feed pigeons

 昨日、川辺でクラッカーを食べていたら、鳩がいたので、クラッカーを与えてみた。いったいどこにいたのか、見る間に数十羽も集まってきた。これには驚いた。そして、たまたまそこを通りがかった、散歩中の犬とも触れ合ってきた。なかなか癒された。

2007-04-06

定額定額定額

パケット定額です ただしPCのモデムとして使用した場合を除く  実際のカタログなどでは、もっとひどい記述になっている。モデムと書いてくれれば分かりやすいのに。「PCにケーブル接続して通信モードによってパケット通信をした場合は云々」などと、独自用語をふんだんに使って、実に分かりにくく解説している。しかも読むのにルーペが必要になるほど細かい字で書いてある。これを読んで理解するには、携帯をモデムとして使う際の説明を捜すという意図を持って、エスパー能力を駆使しつつ読み解かなければならない。  3年前から、各社ともこんな感じだ。はっきりいって、携帯は低機能過ぎる。まったく欲しいと思わない。PHSならば、少しは欲しいが。

2007-04-02

niconico video

 カノンをBGMにトレス疑惑の画像がいくつか流れたとおもったら、いきなりロック超になり、さまざまな似ている画像が表示される動画。これは笑わずにはいられない。それにしても、荒木先生と土方が似ていたとは。

2007-03-28

ネオジム磁石のブレスレット

先日紹介した、ネオジム磁石のブレスレットが、やっと届いた。さっそく装備する。

そういえば、昔は防具屋の近くに意味ありげなオヤジがいて、「ぼうぐは そうびしないと いみが ないぞ」などと教えてくれたものだ。近頃、こういう親切な人が耐えて久しい。

さて、今日はクエストがある。トム爺さんを押すのではなく、三流ホテルの皿洗いのクエストだ。さっそくいくと、パーティメンバーの、職業おばはんの人から、次のように言われた。

おばはん曰く、「へぇ~それ強い磁石なんだ。もぅ~すごい波動が出てるんじゃない」
我、答えて曰く、「科学の名において、有神論者に災いあれ」

まあ、つづめて言うと、ネオジム磁石の面白いブレスレットを身に付けてバイトに行くと、磁石が健康にいいと信じているおばはんが、波動がでていると宣ったわけだ。

一体波動とはなんだろうか。確かに間違いではない。電磁波(もちろん可視光も含む)を、一般に波動というのだろうが、このおばはんの口にする波動という言葉は、どこかオカルトじみていた。このおばはんは、本当にこの手の似非科学がすきなのだ。サプリメント愛用者であり、バイト中の水分補給に酸素水を愛飲している。サプリメントなんて、緊急に何かを摂取しないといけないときぐらいしか使う必要がないし、酸素水は愚の骨頂、そもそも酸素は水にほとんど溶けないのだ。ペットボトル一本飲み干しても、一呼吸分の酸素に相当するかどうかも怪しいものだ。第一、水に溶けた酸素をどうやって吸収するというのか? 我々は、何十平方メートルもある肺胞で酸素を取り入れるのだ。この面積はどうしても必要なのだ。皮膚呼吸などというものが、いかに馬鹿げているか分かるだろう。

本当に、「水商売」は昔からなくならない。

そして、磁石の健康への影響も、統計的には、存在しないと結論できる。しかし、何故人はこの手の似非科学に惹かれるのだろうか。

2007-03-27

what's wrong with Trackback

トラックバックという機能を知ったときは、面白いとは思ったが、さほど興味を抱かなかった。なにしろ私には、「どうぞ私にスパムを送りつけてください」と宣言しているように感じられたからだ。

こちらへリンクを自動的に貼ってもらうという仕組みは、当然スパムに利用されるに決まっている。案の定、もはやトラックバックはスパムだらけである。このスパムに対して、各社とも知恵を絞っている。単純な単語やIPなどのフィルタから、トラックバック元に、こちらへのリンクがなければ無効にするという機能、あるいは、同一のリモートホストから、自社のブログサービスへ、一度に大量のトラックバックが送られた場合、スパムとみなすなどである。これらの努力はすばらしいが、しかし、そこまでしてトラックバックを使いたいものかと疑問になる。

ところで、bloggerには、バックリンクという仕組みがある。これは、自分へリンクしている所へ、こちらからリンクをはる機能だ。そもそもトラックバックは、Movable Typeが始めたもので、ある記事にたいするリンクである。自分の記事にリンクしているサイトは、明らかに関連のある事柄を扱っているに違いない。では、こちらからもリンクしてやろうというわけだ。この仕組みは、なかなか面白い。このバックリンクへスパムを使用とするならば、Googleにクロールされる形で、スパム先へのリンクを提供し続けなければならないからだ。

とはいっても、バックリンクを提供できるのは、大手検索サイトぐらいなものだろう。特にGoogleだ。

2007-03-25

リアル砂の女(主人公は女)

http://www.h-keizai.com/article-2007-02/p078-kokuhaku.html 各種募集など http://ninaite.or.jp/osirase/061003_nikkapu.htm http://www.obira.on.arena.ne.jp/nougyou-iinkai/n-taiken/nougyou-taiken.html http://www.koukeisya-niikappu.jp/YOURYOU.htm http://www.ja-enyu.com/sub/sub05/sub05_2.htm http://www.ja-shinshinotsu.jp/taikensha/taikensha_2.htm http://ninaite.or.jp/osirase/060815_syari.htm http://www.ja-shari.or.jp/taisaku/INFO/info.htm  条件として目立つのが、「独身女性」だ。また、男女募集となっていても、選考段階で、「残念ながら」、男がはじかれるようになっている。まさか、阿部公房の砂の女が、この時代においても、リアルに存在するとは思わなかった。真実は小説より奇なりや?

2007-03-24

いい加減にしろ、黄昏フロンティア

http://www.tasofro.net/cgi-bin/cbbsD/cbbs.cgi?mode=al2&namber=1993&rev=0&no=0  >正式に対応を保障しているOSはWindowsXPと2000のみになります。  嘘をつけ嘘を。  対応しているのではなく、たまたま動いているように見えるだけだ。特に、最初は、デバッガでアタッチして起動させただけで例外を投げるという、すばらしいコードだったではないか。いまでも、Vistaの互換性検証ツールで起動させることすらできない。

2007-03-22

I don't like Automatic Transmission.

 AT車をはじめて動かしてみたが、どうも好きになれない。車の免許を取る前は、「もはやAT車全盛の世の中なのだから、MTなど一部の物好きに供されるものだ」と考えていたのだが、どういう風の吹き回しだろう。  アクセルを踏まなくても動き出すのがまず気に食わない。アクセルペダルを緩めても、あまり減速しないのも気に食わない。そういえば、MT車でブレーキペダルは、停止するときぐらいしか踏んでいなかった。  最も気に食わないのは、勝手にギア比が変わることだ。走っていると、ギア比が勝手に変わったことが察せられ、実に気色悪い。  まあ、親父も車やバイクが好きで、そのために転職までしたほどだから、ある意味、親父譲りってところなのだろうか。

2007-03-18

Does VC8 optimize quick sort?

バイナリサーチは末尾再帰で書けるので、最適化できる。では、末尾再帰ではない再帰は、どのようなコードが生成されるのか。たとえば、クイックソートだ。

template < typename Iterator >
void quick_sort(Iterator first, Iterator last)
{
    if ( std::distance(first, last) < 3 )
    { return ; } // 末尾

    Iterator left(first), right(last) ;
    ++left ;
    --right ;

    while ( left < right ) 
    {
        while ( left <= right && *left <= *first )
        { ++left ; }
        while ( left <= right && *right > *first )
        { --right ; }

        if (left < right )
        { std::iter_swap(left, right) ; }
    }

    std::iter_swap(first, right) ;

    quick_sort(first, right) ;
    quick_sort(++right, last) ; //末尾
}

どうもスマートに書くのは難しいが、とりあえず実験の用には足りるだろう。これはどう見ても末尾再帰ではない。これをVC8でコンパイルしてみると、二つ目の再帰呼び出しは、最適化されてループになっていた。なるほど、そういうこともできるのか。

2007-03-16

Does VC8 optimize Tail Recursion?

 末尾再帰というものがある。ある関数が、最後に自分自身を呼び出すように書かれている場合、もし分岐があるならば、それぞれの分岐の最後に、自分自身を呼び出すように書かれている場合、それをTail Recursion(末尾再帰)という。下に例を示す。
void print_hello(int const n) { if ( n == 0 ) { return ; } else { std::cout << "hello" << std::endl ; return print_hello(n - 1) ; } } double power( double const x, int const n ) { if ( n == 0 ) { return 1.0 ; } else { return x * power(x, n - 1) ; } }
 print_hello関数は、引数に与えられた数だけ、helloと出力する関数である。power関数は、xのn乗を計算する関数である。しかし、このように再帰的に記述するのは、C++らしくない。我々C++プログラマは、副作用がたっぷり詰まった、forやwhile文のループを好むものだ。なぜならば、たとえばMS-Windows X86の場合、関数を呼ぶというのは、それだけでスタックを消費するのだ。今の時代にC++を書く、根性のあるプログラマは、皆CPUのサイクル数や、数バイトのメモリ消費を気にするパフォーマンスの信奉者である。再帰のオーバーヘッドなど許されるはずがない。  しかし、ちょっと待って欲しい。次のような単純な変換を施すだけで、この糞みたいなオーバーヘッドを持つ関数は、単なるループに変わる。
void print_hello(int n) { LOOP : if ( n == 0 ) { return ; } else { std::cout << "hello" << std::endl ; --n ; goto LOOP ; } } double power( double x, int n ) { double tmp(x) ; LOOP : if ( n == 0 ) { return tmp ; } else { tmp *= x ; --n ; goto LOOP ; } }
 すばらしい。実に単純な変形だ。コンパイラにできないはずがない。  実際、主要なコンパイラは、末尾再帰を最適化できる。この末尾再帰という考え方は、副作用を忌み嫌う関数型言語の信者にとって、崇拝の対象である。特にLISP教徒は、再帰がなければまともにループを書くことができない。LISPの方言のひとつ、Schemeなどは、 「Thou shalt not waste stack by tail recursion. if thou defy god's will, thy are evil beast, slow belly, and pagan.」 「処理系は末尾再帰にてスタックの消費をしてはならぬ。もし我が意に沿わざれば、汝は悪しき獣、懶惰の腹、異教徒なり」  とまで、規格書の中で明言している。まあ、私にとって、Schemeが異教徒なのだが。  さて、関数型言語は異教徒ではあるかというと、最近のC++の動向を見るにつけ、そうもいえなくなっている。しかし、どの程度できるのだろうか。さっそく確かめてみよう。  確かめるからには、何か実用的なコードにしなければならない。バイナリサーチなどどうだろう。あれは、スタックを消費せずに、ループでも実装できる。あれを再帰で書いて、コンパイラが最適化できるか確かめてみよう。  まず、典型的なC++教徒の書くバイナリサーチを書いてみる。
template < typename Iterator, typename T > bool binary_search( Iterator first, Iterator last, T const & value ) { typename std::iterator_traits<Iterator>::difference_type n = std::distance(first, last) ; Iterator mid ; for ( ; n != 0 ; n = n / 2 ) { mid = first ; std::advance(mid, n / 2) ; if ( *mid < value ) { first = ++mid ; } else { last = ++mid ;} } return bool( *first == value ) ; }
 これはどうみても、典型的なC++のバイナリサーチだ。さて、早速再帰で書いてみよう。特に難しくはない。
namespace detail { template < typename Iterator, typename T > bool binary_search(Iterator first, Iterator last, T const & value , typename std::iterator_traits<Iterator>::difference_type const n) { if ( n == 0 ) { return bool( *first == value ) ; } Iterator mid(first) ; std::advance(mid, n / 2 ) ; if ( *mid < value ) { return binary_search(++mid, last, value, n / 2) ; } else { return binary_search(first, ++mid, value, n / 2) ; } } } // namespace detail template < typename Iterator, typename T > bool binary_search( Iterator first, Iterator last, T const & value ) { return detail::binary_search(first, last, value, std::distance(first, last) ) ; }
 私はまだ、C++への信心と修行が足りないし、ましてや異教徒の操る再帰は得意ではないが、こんなものだろう。さっそくこれを、VC8 SP1でコンパイルしてみる。VC8の最適化のほどを見せてもらおう。五千円だして買っただけの価値はあるのだろうか(学生というのはいい身分だ)  まず、これがC++版のbinary_searchだ。これを次のように呼ぶと。
binary_search<int *, int>(&v[0], &v[1000], 12700) ;
00401120 |> 99 /CDQ 00401121 |. 2BC2 |SUB EAX,EDX 00401123 |. D1F8 |SAR EAX,1 00401125 |. 813C81 9C310000 |CMP DWORD PTR DS:[ECX+EAX*4],319C 0040112C |. 7D 04 |JGE SHORT test.00401132 0040112E |. 8D4C81 04 |LEA ECX,DWORD PTR DS:[ECX+EAX*4+4] 00401132 |> 85C0 |TEST EAX,EAX 00401134 |.^75 EA \JNZ SHORT 00401120
 前後を省略するが、これがループである。binary_search関数は、呼び出したところでインライン展開された。ループ版のbinary_searchはこのようになる。再帰版のbinary_searchも、このようになることが理想だ。さて、どうなるだろう。早速比較しよう。
00401370 /$ 85C0 TEST EAX,EAX 00401372 |. 74 16 JE SHORT 0040138A 00401374 |. 56 PUSH ESI 00401375 |. 8B37 MOV ESI,DWORD PTR DS:[EDI] 00401377 |> 99 /CDQ 00401378 |. 2BC2 |SUB EAX,EDX 0040137A |. D1F8 |SAR EAX,1 0040137C |. 393481 |CMP DWORD PTR DS:[ECX+EAX*4],ESI 0040137F |. 7D 04 |JGE SHORT 00401385 00401381 |. 8D4C81 04 |LEA ECX,DWORD PTR DS:[ECX+EAX*4+4] 00401385 |> 85C0 |TEST EAX,EAX 00401387 |.^75 EE \JNZ SHORT 00401377 00401389 |. 5E POP ESI 0040138A |> 8B01 MOV EAX,DWORD PTR DS:[ECX] 0040138C |. 3B07 CMP EAX,DWORD PTR DS:[EDI] 0040138E |. 0F94C0 SETE AL 00401391 \. C3 RETN
 これが、再帰版のbinary_search関数である。呼び出したところにインライン展開はされなかったものの、再帰ではなくなっている。思うに、binary_search関数自体はインライン展開されているのだろう。detail::binary_search関数は、末尾再帰が最適化されて、ループに直されるものの、そのトップレベルの関数自体がインライン展開されることはないのだろう。これには何か、理由があると思われる。  さて、肝心のインストラクションコードはどうだろうか。00401377番地から始まるループを見て欲しい。すばらしい出来だ。関数自体がインライン展開されないので、0x319C(12700)は即値ではなくなっているものの、なんとレジスタである。そのほかはすべて、ループ版と同じだ。再起によるオーバーヘッドはなくなった。単なるループとまったく同じである。もちろん関数呼び出しにかかるコストはあるが、それは一回だけで、無料同然に安い。5千円の価値はあるといえよう。    しかし、ここまで分かりやすい結果になるとは思わなかった。  因云、VC8のイテレータは、デフォルトで範囲外チェックを行う。コンピュータがネットワークにつながることが当たり前になった今の時代、パフォーマンスよりもセキュリティの方が重要だと叫ばれている。セキュリティの確保にかかるコストは無料ではない。ヘビーなパイプラインを持つCPUにとって、条件分岐は禁忌だ。さて、VC8の、セキュアなイテレータは、どの程度パフォーマンスに影響を及ぼすのか。  先ほどの関数に、セキュアなイテレータを通してみると、恐ろしく長いコードが生成された。範囲外をチェックするコードは、恐ろしく頻出するので、インライン展開しないほうが良いと判断されたのか、関数になっている。山のようなpushとpopがある。汎用レジスタが、全然足りていないのだ。うーむ、セキュリティは無料ではないとはいえ、これはすこし、セキュアなイテレータの使用をためらってしまう。  恐らくは、大半の場合は、セキュアなイテレータを使うべきなのだ。それは分かっている。当然だ。しかし、この生成されるコードは……、いや、これは私が古いからなのだ。まったく。この業界は、どうかしている。経験に裏打ちされた熟練の技というものは存在しない。10年前、いや5年前の常識だって通用しないのだ。むしろ、そういう古い知識は、新しい技術習得の邪魔になる。やんぬるかな

2007-03-15

Why Japanese translation of south park is gay

 最近、South Parkというアニメに、クレイジーになっている。しかし、日本語吹き替えはゲイだ。何故だろう。  まず考えられる説として、声優の演技がケツの穴なのかもしれない。特に、OPの歌はひどい。しかしどうも、私はここに、英語と日本語の違いによるものがあるのではないかと思っている。日本語にはない独特の――うまく表現しがたいが――、リズムのようなものがあると考えている。たとえば、Full Metal Jacketの、冒頭から最初の六分ほどの、先任軍曹の語りだ。  英語が分からなかったとしても、この日本語にはないリズムは感じられるのではないだろうか。ただ、FMJの罵倒は、少々古臭いのだが。  もうひとつ思うことは、罵倒の文句だ。日本語には、文になっている罵倒が少ないのではないだろうか。バカ、アホ、マヌケなどが罵倒に際して、よく用いられるが、suck my bollocks とか、lick my ass あるいは、fuck yourself などといった罵倒が、日本語で使われることは無いように思われる。唯一思いつけた定型文での罵倒は、「お前の母ちゃんデベソ」だが、これはあまりにも幼稚すぎる。そもそも、今使われているのだろうか。他に何かあるだろうか。「チョーシ、コイてんじゃねーぞ」等だろうか。しかし、どうも迫力に欠ける。  あるいは、文化的なものなのだろうか。日本語訳には、英語にあるような毒が抜けている感がする。微妙なニュアンスが、訳せないのだろうか。この投稿にあたって、適当な既存のラベルがなかったので、新たなラベル:IMAOを使うことにした。これはそもそも、IMHO(In My Humble Opinion : 私の愚見では)という略語に対する、ネット上のスラングで、In My Arrogant Opinion(吾輩の思し召しは)である。これだけ長々と説明しないと、IMAOのもつニュアンスですら伝わらないのだから、無理もないのだろうか。   注釈: ゲイ(gay):くだらない、つまらない ケツの穴(asshole):ドアホ  私はgayという単語を注釈の意味で解釈している。実際、このように使われているからだ。しかし、いい加減に書くことはできないので、調べようとしたが、私の持っているジーニアス英和辞典やロングマン等には、こういう意味は載っていない。ホモとか、快活な、などと言う意味でのっている。Urban Dictionaryが、この手のスラングの用法についてくわしいようだ。often used to describe something stupid or unfortunateとある。私の解釈は間違っていなかったようだ。

2007-03-13

how to write Merge sort?

http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-046JFall-2005/CourseHome/index.htm  マージソートを実装した。
namespace hito { namespace detail { template < typename Iterator > void merge_sort( Iterator first, Iterator last , typename std::iterator_traits<Iterator>::difference_type const n , typename std::iterator_traits<Iterator>::value_type * buf ) { if (n < 4) { for ( ; first != last ; ++first) { Iterator iter = std::min_element(first, last) ; if (iter != first) std::iter_swap(first, iter) ; } return ; } Iterator mid(first) ; std::advance(mid, n / 2) ; merge_sort(first, mid, n / 2, buf) ; merge_sort(mid, last, n / 2, buf) ; std::copy(first, mid, buf) ; typename std::iterator_traits<Iterator>::value_type * const end(buf + n / 2) ; while ( buf != end && mid != last ) { if ( *buf < *mid ) { *first = *buf ; ++buf ; } else { *first = *mid ; ++mid ; } ++first ; } std::copy(buf, end, first) ; } } // namespace detail template < typename Iterator > void merge_sort( Iterator first, Iterator last ) { typename std::iterator_traits<Iterator>::difference_type n = std::distance(first, last) ; if ( n == 1 ) return ; // Done typedef typename std::iterator_traits<Iterator>::value_type type ; type * buf = new type[(n + 1) / 2] ; detail::merge_sort(first, last, n, buf) ; delete[] buf ; } } // namespace hito
 結局、どう実装するのが一番最適なのだろう。これはBidirectinalIteratorでもソート可能だ。しかし、RandomAccessIteratorの場合は、引数のnなどいらない。ランダムアクセスイテレータに対して、std::distanceはフリーだからだ。実際どうするべきなんだろう。  そしてふと、Nicolai JosuttisのSTL本を紐解くと、驚くべき事実が載っていた。stable_sortのイテレータはRandomAccessIteratorである。そんな馬鹿な。VC8のDinkumwareはBidirectionalIteratorでもソート可能だ。これは一体どういうことだ。規格を読むと、25.3.1.2に、確かにRandomAccessIteratorとある。しかし、実際にBidirectionalなlistのイテレータを渡しても、ソートできる(listはもっといいメンバ関数があるのだが) ヘルプや、Dinkumwareのソースでは、双方向イテレータになっている。ふーむ。VCの独自仕様なのだろう。実際、マージソートは、双方向イテレータでも、それほど問題はないと思われる。

insertion sort

 http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-046JFall-2005/CourseHome/index.htm  insertion sortを、C++的に実装した。
namespace hito { template < typename BidirectionalIterator > void insertion_sort( BidirectionalIterator first, BidirectionalIterator last ) { BidirectionalIterator pos = first ; for ( ++pos ; pos != last ; ++pos ) { typename std::iterator_traits<BidirectionalIterator>::value_type key(*pos) ; BidirectionalIterator iter = pos, sorted_iter = pos ; for (--iter ; iter != first && key < *iter ; --iter, --sorted_iter) { *sorted_iter = *iter ; } if ( key < *iter ) // check first element { *sorted_iter = *iter ; --sorted_iter ; } *sorted_iter = key ; } } template < typename BidirectionalIterator, typename BinaryPredicate > void insertion_sort( BidirectionalIterator first, BidirectionalIterator last, BinaryPredicate op ) { BidirectionalIterator pos = first ; for ( ++pos ; pos != last ; ++pos ) { typename std::iterator_traits<BidirectionalIterator>::value_type key(*pos) ; BidirectionalIterator iter = pos, sorted_iter = pos ; for (--iter ; iter != first && op(key, *iter) ; --iter, --sorted_iter) { *sorted_iter = *iter ; } if ( op(key, *iter) ) // check first element { *sorted_iter = *iter ; --sorted_iter ; } *sorted_iter = key ; } } } // namespace hito
 しかし、これはちょっと汚い。reverse_iteratorを使ってみると、こうなる。
namespace hito { template < typename BidirectionalIterator > void insertion_sort( BidirectionalIterator first, BidirectionalIterator last ) { BidirectionalIterator pos = first ; std::reverse_iterator<BidirectionalIterator> const rend(first) ; for ( ++pos ; pos != last ; ++pos ) { typename std::iterator_traits<BidirectionalIterator>::value_type key(*pos) ; std::reverse_iterator<BidirectionalIterator> riter(pos), rsorted_iter(pos) ; for ( --rsorted_iter ; riter != rend && key < *riter ; ++riter, ++rsorted_iter) { *rsorted_iter = *riter ; } *rsorted_iter = key ; } } template < typename BidirectionalIterator, typename BinaryPredicate > void insertion_sort( BidirectionalIterator first, BidirectionalIterator last, BinaryPredicate op ) { BidirectionalIterator pos = first ; std::reverse_iterator<BidirectionalIterator> const rend(first) ; for ( ++pos ; pos != last ; ++pos ) { typename std::iterator_traits<BidirectionalIterator>::value_type key(*pos) ; std::reverse_iterator<BidirectionalIterator> riter(pos), rsorted_iter(pos) ; for ( --rsorted_iter ; riter != rend && op(key, *riter) ; ++riter, ++rsorted_iter) { *rsorted_iter = *riter ; } *rsorted_iter = key ; } } } // namespace hito

the best learning site ever and never

MIT's OpenCourseWare  これはすばらしい。MITの講義を、無料で、いつでも見ることができるのだ。しかも、今年中に、すべての講義を見れるようにする予定らしい。何しろ、MITは年間の授業料が4万ドルぐらいするのだ。ありがたやありがたや。しかし、動画は明らかに、教授の動きに合わせて、ズームインアウトなどをしていたりするところからしても、明らかに人の手で撮影されている。馬鹿にならない人件費がかかっていそうだ。  まず手始めに、アルゴリズム入門の講義のストリーミング動画を見てみた。しかし、これが入門だとは信じられない。恐ろしく密度の高い講義だ。しかも分かりやすい。

2007-03-11

glad im japanese

A Little Taste of Editing Holy Gay! タバコがかっこ悪いことは言うまでもないが、なにもロリポップはなかろうて。 そもそも、スーパーマーケットで実弾が売っている世界で、創作のアニメに描かれている銃を規制したところで、何になるというのか。メリケンは実に、理解しがたい人種だ。

2007-03-09

Some funny videos

Make Love, Not Warcraft これは、World of Warcraftをパロディにした、サウスパークのアニメである。Wikipediaにも、詳しい解説が載っている。YouTubeやGoogle Videoも軒並み削除されているので、これもいつまでもつことやら。 これは、ローワン・アトキンソンが演じる、デートガイドハウツーである。必見だ。

Great YouTube video : CAUTION! You probably lose your money.

私は、首飾りや指輪、腕輪などといった装身具に興味を持たない人間である。私はよくいる、外見に一切気を使わない人間の一人であり、服にも一切こだわっていない。にもかかわらず、このすばらしいYouTubeの動画は、この私にブレスレットを売りつけてしまった。これを一回見ただけで、もうどうしようもなくこのブレスレットが欲しくなってしまったのだ。この動画は危険である。あなたから50ドルを奪ってしまう。

この商品は、Bandoleer Braceletだ。購入も、ここから行える。価格40ドルで、海外への送料が10ドルだ。ちなみに、この商品を注文すると、つぎのようなメールが送られてきた。

Your order at Dynomighty has been received. Due to significant response from our YouTube video, we currently have delays in order fulfillment. We are making every effort to ensure your order is shipped ASAP. Estimated delivery is currently 10 days.

Dynomightyへの注文を受け付けました。ただいま、YouTube動画への反響がとても大きいために、商品の発送が遅れております。なるべくはやく商品をお届けするよう、努めています。発想までには10日ほどかかると思われます。

これは大変そうだ。

What THE FUCKING great japan is!

 鹿児島とかいう、日本の隅のほうにあるどうでもいい所の議員に立候補した人民とその関係者等12人が、袖の下を通した疑いで逮捕された。このたび、どうやら司法は無実であるという判断をしたようだ。  正直言って、この老いぼれ12人が無実かどうかなど、社会全体には、どうでもいいのだ。この12人が無罪放免されようと、獄中で野垂れ死のうと、我々の生活にはまったく関係のない話だ。もっとも重要視すべきは、警察、即ち公権力への信頼である。信頼はつまるところ、事件解決をもって得られるのだ。神聖にして畏れるべき大日本に必要なのは全体社会の利益だ。個人など知ったことではない。  だからこそ、警察は取り調べの際の録音録画をしないのだ。一般大衆が見たとしても、革命の危機にこそなれ、公共社会の利益となりはしない。「ウン、ハイ以外声を出すな。一切否定するな!口で糞たれる前と後にサーと言え。」同胞よ、我々は、近年の取り調べの録音録画要求について、断固として跳ね除けねばならない。日本を革命の危機から阻止するためである。人民に栄えあれ。

Expression Template

C++ Templatesに載っているExpression Templateの実装は、嫌いだった。物凄く面倒なのだ。これを実装するぐらいだったら、自前でループを書いたほうが、まだましだろう。

ところで、C++ Template Metaprogrammingを読んでいると、より分かりやすい方法が見つかった。C++ Templatesに載っている方法は、各種演算のための参照でラップするクラスと、演算子をオーバーロードするテンプレート関数があったのだが、C++ Template Metaprogrammingのサンプルでは、この演算方法を、テンプレートパラメータとしていた。

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

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

template < typename L, typename OpTag, typename R >
struct Expression
{
  Expression(L const & l, R const & l)
    : l(l), r(r) { }
  float operator[](unsigned index) const
  { return OpTag::apply(l[index], r[index]) ; }

  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) ;
}

なんて分かりやすいんだろう。C++ Templatesの実装では、Expression_Addとか、Expression_Subなどをそれぞれ用意しなければならないが、こうすると、かなり分かりやすくなる。なぜ今まで思いつかなかったのだろう。分かってしまうと単純なのに、自力で発見することはできない。コロンブスの卵というやつだろうか。

2007-03-07

Concepts Extending C++ Templates For Generic Programming

この情報は恐ろしく昔のもので、現在のドラフト規格とまったくあっておりません。検索で飛んでこられた方は、この情報を信用せず、ご自分で規格をご確認ください。

 これは最高にためになる動画だ。
 コンセプトとは、C++のパラダイムのひとつ、ジェネリックプログラミングを、もっと分かりやすくするための文法だ。

 前半の5分ほどは、ジェネリックプログラミングはなんであるかを解説している。

The reason we think that we can make it simpler is that many of the way people use template now are... tricks! There're complelcated tricks. You can't even read in the book in many faces. You have to dig for newsgroup to see how they work recall look at boost C++ library to see what those guys did.

 今のテンプレートは、複雑なトリックを多用しすぎている。多くのトリックは、本にも載っていない。Boost C++ライブラリを書いている連中が何をやっているのかを知るためには、ニュースグループを調べなければならない。(原文が正しい自信がない)

 conceptには三つの機能がある。
Concept Difinitions
 ある型にたいする要求を定義する。たとえば、ある型TはT:func()というメンバ関数を持っていなければならないとか、T::value_typeという型が定義されていなければならないなどだ。
Where Clauses
 テンプレートパラメータに必要なコンセプトを明示的に指定できる。
Concept Map
 既存の型を、どのようにコンセプトの要求どおりに使うかを指定できる。個人的な感想は、恐ろしく賢いマクロか、恐ろしく便利なシンタックスシュガー。

template < typename T > where LessThanComparable<T> const T & min(const T & x, const T & y) {return x < y ? x : y ;}

 この例では、型Tは、less than演算子を持っていなければならないというコンセプトが示されている。たとえば、比較演算子としてgreater than演算子(>)を使った場合は、コンパイラがエラーを出す。less than演算子で比較できない型を渡した場合も、コンパイラはエラーをだす。しかも、コンパイラが吐くエラーは、「LessThanComparableの要求を満たしていません」等といった、人間に分かりやすいエラーだ。従来の、インスタンシエイトの過程を追っていくような、人間にとって暗号に近いエラーメッセージではない。

それでは、LessThanComparableというconceptはどうやって定義するのか。

concept LessThanComparable< typename T > { // Syntactic requirement bool operator < (T, T) ; // Semantic requirement axiom Irreflexivity(T x) { !(x < x) ; } axiom Asymmetry(T x, T y) { if (x < y) !(y < x) ; } axiom Transitivity(T x, T y, T z) { if (x < y && y < z) x < x ; } } ;

 文法的な要求と、意味的な要求を定義できる。講演では、axiomについては詳しく述べていない。しかし、この機能はどうやって実現するのか疑問だ。本当に、これをコンパイル時にチェックできるのだろうか。ここでの、syntactic requirementは、T型の引数を二つ取り、bool型を返す、less than演算子がなければならないというものだ。もちろん、現在のテンプレートパラメータのように、複数指定できる。Why not?

concept Foo<typename T1, typename T2, typename T3>{ } ;

 他にも、value_typeという型を持っていなければならない要求や、それらの型に対するコンセプトをネストして指定できる機能など。

concept InputIterator < typename Iter > { typename value_type ; // Iter must has typename Iter::value_type typename difference_type ; // Iter must has typename Iter::difference_type where SignedIntegral<difference_type> // Iter::difference_type must meet requirements of SignedIntegral concept Iter & operator++(Iter &) ; // pre-increment Iter & operator++(Iter &, int) ; //post-increment bool operator==(Iter, Iter) ; //equality comparison bool operator!=(Iter, Iter) ; //inequality comparison value_type operator * (Iter) ; // dereference } ;

 where clauseは、次のように指定できる。

template < typename Iter, typename T> where InputIterator<Iter> && EqualityComparable<InputIterator<Iter>::value_type, T > Iter find(Iter first, Iter last, const & value) { while( first != last && !(*first == value) ) { ++first ; } return first ; } ;

 ここで質問がある。InputIterator<Iter>::value_typeには、typenameの指定はいらないのかというものだ。もちろんここは型を指定すると決まっているので、必要がない。コンパイラは適切に判断できる。  たとえば次のようにすれば、conceptをサポートしていないコンパイラに対する、下位互換性も保てるだろう。

template < typename Iter, typename T> #ifdef COMPILER_SUPPORT_CONCEPT where InputIterator<Iter> && EqualityComparable<InputIterator<Iter>::value_type, T > #endif Iter find(Iter first, Iter last, const & value) { while( first != last && !(*first == value) ) { ++first ; } return first ; } ;

 さて、28分あたりから、いよいよ、超強力なconcept_mapの解説に入る。先ほどのfindという関数は、イテレータに対しては問題なく対処できた。でも、int型の配列に対してはどうだろう。int型の配列の先頭要素へのポインタは、十分にイテレータとして通用する。しかし、組み込み型であるので、value_typeやdifference_type等を持っていない。そこで、Concept Mapを使い、どうやってコンセプトに合うようにするか、いわばマップを行う。  Concept Mapとは、How(如何にして)conceptの要求を満たすかを定義する。たとえば、int型のポインタに、value_typeとdifference_typeが必要というのであれば、定義してやるだけだ。

concept_map InputIterator< int * > { typedef int value_type ; typedef ptrdiff_t difference_type ; } ;

 とはいっても、組み込み型だけでも、かなりの数がある。いちいちひとつずつやっていくのは面倒だ。ここは、テンプレートを使うべきだ。Why not?

template < typename T > concept_map InputIterator< T * > { typedef T value_type ; typedef ptrdiff_t dirrefence_type ; } ;

 これで、すべてのポインタは、InputIteratorのコンセプトを満たすようになった。

 コンセプトは、階層構造にすることができる。Concept Refinementという。

concept BidirectinalIterator< typename Iter > : InputIterator<Iter> { Iter & operator -- (Iter &) ; Iter operator -- (Iter &, int) ; } ; concept RandomAccessIterator< typename Iter > : BidirectionalIterator<Iter> { Iter operator + (Iter, difference_type) ; // ... } ;
every random access iterator is a bidirectional iterator is a input iterator

 ランダムアクセスイテレータは、バイディレクショナルイテレータであり、インプットイテレータである。  このヒエラルキーは、Overload Resolutionに絡めることができるらしい。たとえば、イテレータを、指定された個数分進めるadvanceであるが、

template < InputIterator Iter > void advance( Iter & x, Iter::difference_type n ) { while(m > 0) { ++x ; --n ;} } //O(n) template < RandomAccessIterator > void advance( Iter & x, Iter::difference_type n ) { x = x + n ; } // O(n)

 この例では、where clauseがないが、これは簡便なショートカットシンタックスである。意味も分かりやすい。ワーオ!

 まず、最初のadvance関数は、非常にジェネリックで、どんなイテレータでも使うことが出来る。しかし、ランダムアクセスイテレータの場合、これは無駄が多すぎる。そこで、RandomeAccessIteratorのコンセプトを使ってやる。コンパイラは、ベストマッチを探してくれる。ご存知の通り、Bidirectional Iteratorは、Input Iterator 「である」ので、最初の関数にマッチする。それにしても、タダでさえOverload Resolutionはややこしいというのに、さらに複雑になるのだろうか。現状では、テンプレートは、インスタンシエイトされてから、Overload Resolutionにかけられる。これだけでもややこしいというのに……。

 さて、さらにConcept Mapの話は続く。こんどは、あるコンテナの全要素をイテレートするというものだ。いわばfor-each loopだが、これをどうするか。もちろん自分でやってもいいのだが、全要素をループさせるというのは、よくある操作なので、楽をしたい。他の言語はどのようにしているかというと。

 Pythonは、イテレータとコンテナのプロトコルを定義している(ある決まった形でなければならない)
 Perlは、ユーザ定義型を無視する(ハァ? 組み込み型以外は知ったこっちゃないね)
 C#は、IEnumerableインターフェースを使う(既存の俺様コンテナは知ったこっちゃないね)
 C++0xは、concept mapを使う。
 次のForコンセプトを満たす必要がある。

concept For< typename X > { typename iterator ; where InputIterator<iterator> ; iterator begin(X &) ; iterator end(X &) ; } ;

 つまり、次のコードが、

vector<int> v ; for (int i : v) cout << i << ' ' ;
 シンタックスシュガーにより、このように展開される。
for( For<vector<int> >::iterator first = For<vector<int>>::begin(v) , last = For<vector<int>>::end(v) ; first != last ; ++first ) { int i(*first) ; cout << i << ' ' ; }

 何の解説もないが、原文のbracket parentheseの間に空白がないのは、意識してやっているのだろうか。これをできるようにしようという提案がされているのだが。もうひとつ、こんな風にコンセプトを明示的に使うことも出来るのだろうか。解説がないが。

 たとえば、int型の配列に対しては、次のようにする。

template < typename T, size_t N> concept_map For<T[N]> { typedef T * iterator ; T * begin( T array[N] ) { return array ;} T * end( T array[N] ) { return &array[N} ; } } ; int some_primes[6] = {2, 3, 5, 6, 11, 13} ; for ( int prime : some_primes ) std::cout << prime << ' ' ;

 これを使えば、STLとは微妙に違う、俺様コンテナであっても、コンセプトに合わせるようにしてやれば、俺様コンテナ自身を変更することなく、for-each loopに書けることができる。これはいい。既存の、既に問題なく動いているコードや、共通のフレームワークなどを変更せずにすむからだ。  質問があるが、コンセプトはnamespaceの中に入る。これは当然だ。

 ところで、STLのmultisetには、equal_rangeというメンバ関数がある。これは、引数として指定した値の範囲のイテレータを、pairで返す。コンテナではないが、for-each loopに必要な情報は、すべてそろっている。ではどうやってForコンセプトに合わせるのか。

template < InputIterator Iter > concept?map For< pair<Iter, Iter> > { typedef Iter iterator ; Iter begin(pair<Iter, Iter> & p) { return p.first ; } Iter end(pair<Iter, Iter> & p) { return p.second ; } } std::multiset<int> elements ; for ( int i : elements.equal_range(17) ) std::cout << i << ' ' ;

 恐ろしや恐ろしや。
 しかし、ひとつひとつ、これを定義していくのは、面倒である。我々はすでに、Containerというコンセプトを定義した。これを使えばよい。

template < Container C > concept_map For<C> { typedef Container<C>::iterator iterator ; iterator begin(C & c) { return c.begin() ; } iterator end(C & c) {return c.end() ; } } ;

 これで、Containerコンセプトを満たす型は、すべてforループにかけられる。とてもとても汎用的だ。

 テンプレートがらみのエラーメッセージに辟易としない人はいないはずだ。コンパイラは、インスタンシエイトの過程を追っていくので、エラーメッセージは膨大になり、人間が簡単に読めるものではなくなってしまう。しかも、内部の実装の詳細の識別子などがでてくるので、まずわけが分からない。

int main() { std::list<int> l ; std::sort(l.begin(), l.end() ) ; }

 上記のコードの、VC8のエラーメッセージは次の通りである。

D:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm(3112) : error C2784: 'reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : テンプレート 引数を 'const std::reverse_iterator<_RanIt> &' に対して 'std::list<_Ty>::_Iterator<_Secure_validation>' から減少できませんでした
with
[
_Ty=int,
_Secure_validation=true
]
D:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(1856) : 'std::operator -' の宣言を確認してください。
.\test01.cpp(10) : コンパイルされたクラスの テンプレート のインスタンス化 'void std::sort<std::list<_Ty>::_Iterator<_Secure_validation>>(_RanIt,_RanIt)' の参照を確認してください
with
[
_Ty=int,
_Secure_validation=true,
_RanIt=std::list<int>::_Iterator<true>
]
D:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm(3112) : error C2784: 'reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : テンプレート 引数を 'const std::reverse_iterator<_RanIt> &' に対して 'std::list<_Ty>::_Iterator<_Secure_validation>' から減少できませんでした
with
[
_Ty=int,
_Secure_validation=true
]
D:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(1856) : 'std::operator -' の宣言を確認してください。
D:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm(3112) : error C2784: 'reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : テンプレート 引数を 'const std::reverse_iterator<_RanIt> &' に対して 'std::list<_Ty>::_Iterator<_Secure_validation>' から減少できませんでした
with
[
_Ty=int,
_Secure_validation=true
]
D:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(1856) : 'std::operator -' の宣言を確認してください。
D:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm(3112) : error C2784: 'reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : テンプレート 引数を 'const std::reverse_iterator<_RanIt> &' に対して 'std::list<_Ty>::_Iterator<_Secure_validation>' から減少できませんでした
with
[
_Ty=int,
_Secure_validation=true
]
D:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(1856) : 'std::operator -' の宣言を確認してください。
D:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm(3112) : error C2676: 二項演算子 '-' : 'std::list<_Ty>::_Iterator<_Secure_validation>' は、この演算子または定義済の演算子に適切な型への変換の定義を行いません。(新しい動作; ヘルプを参照)
with
[
_Ty=int,
_Secure_validation=true
]
D:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm(3112) : error C2780: 'void std::_Sort(_RanIt,_RanIt,_Diff,_Pr)' : 4 引数が必要です - 3 が設定されます。
D:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm(3231) : 'std::_Sort' の宣言を確認してください。

 これをまともに読める人間は、まずいないだろう。次のようになれば、読みやすいのではないかと思う。
「std::list::iteratorは、RandomAccessIteratorコンセプトを満たしていません。適合するconcept mapも見つかりません。」
 他にも、インスタンシエイトされる前に、テンプレートのコードが、コンセプトにあったものかを、コンパイラがチェックすることができる。たとえば動画の例では、InputIteratorは、less than演算子を使うことが出来ない。
 最後の質問でも出ているのだが、これらの機能にはコストがかかる。Boostのライブラリをふんだんに使ったコードのコンパイルには、かなりの時間がかかるが、コンセプトもテンプレートと同じく、かなり多くの処理を行わなければならない。どうなることやら。
 しかし、仕様が確定するのが2009年で、ISOの認可がおりるのが、2010年、それから主要なコンパイルベンダーが実装するのに、数年はかかるだろうから、案外楽観視していいのかもしれない。ムーアの法則が続いていればの話だが。