/ 最近 .rdf 追記 設定 本棚

脳log[2009-06]



2009年06月01日 (月) CPUFANは 4-pin。SYSFANは 3-pin。

[COSMOS] SpeedFan 4.39β7。Fintek F71889Fに対応。

スクリーンショット SpeedFan 4.39 beta 7

Win9x:NO  64Bit:YES  GiveIO:NO  SpeedFan:YES
Scanning ISA BUS at $0290...
SuperIO Chip=FINTEK F71889F
Scanning AtiIgp SMBus at $0B00...
F75387 found on SMBus at $2E
F75133S found on SMBus at $36
Scanning ISA BUS at $0600...
F71882F found on ISA at $600
Found Hitachi HDT725050VLA360 on AdvSMART
Found ST3250410AS on AdvSMART
Loaded 6 events

めでたく Windows上で全てのファンの回転数の取得といくつかのファンの制御が可能になりました(以前の状況>20090501p01)。電圧も取得できるようになりました(+5Vと +12Vと VCC1.5Vの値が全然ラベル通りではないけど)。

MSI 790FX-GD70の SuperIOチップが Fintek F71889F。(F71889Fに対応しているという) AMD Over Driveは起動すらできないし、MSI謹製のツールでもできないし、不便だけど BIOSで調整できるからいいか、と半ばあきらめていたので嬉しい。ちょこちょこ暑い日があって、でも毎日暑いわけでもなくて、騒音と冷却のバランスとりが必要なんだよね。

 SpeedFanでの表記と M/Bの対応

CPUFAN(4-pin)×1。SYSFAN(3-pin)×4

ChipSensorM/Bラベル回転数制御可否
F71882FFan1/Pwm1CPUFAN1(PWM 1 modeを Manual set PWMにすることで)可
Fan2/Pwm2SYSFAN4
Fan3/Pwm3SYSFAN2
Fan4/Pwm4存在せず
F75387Fan1/Pwm1SYSFAN1不可
Fan2/Pwm2SYSFAN3不可

F75387というのが間違いの気がするんだよね。きちんと認識したら残る SYSFAN1/3の回転数制御もできるようにならないかな。


 スタートアップ起動と UAC

管理者権限がないと動かないと思ってショートカットの「管理者としてこのプログラムを実行する」にチェックを入れていた。それで再起動のたびにパスワードの入力を求められていた。

ためしにチェックを外して起動してみたらパスワードなしで起動するの。ファンの制御もできる。そういえば SpeedFanをインストールしたフォルダの speedfan*.cfgに Usersグループの書き込み権限を付け加えていたのだが、それが効いているのだろうか。HDD関連が検出からできていなくて全滅なこと以外これまで通り。


 HWMonitorも 2009-05-16の version 1.14で F71889Fに対応。

version 1.13からアップデートしたらツリーに Fintek F71882Fというノードが増えていた。


2009年06月02日 (火) なんと 1st。そんな気が全然しないし、CDである必要も全然ない。(買うけど)


2009年06月03日 (水) [SakuraEditor] (要望) 新しく開いたファイルを現在のタブのすぐ右側に追加する機能。

最終更新: 2009-08-26T17:01+0900

[SakuraEditor] 新しく開いたファイルを現在のタブのすぐ右側に追加する機能。(2009-06-04)

要望を書いて次の日になんとかするセルフサービス > open_tab_right.diff

便利なメソッド( CTabWnd::ReorderTab )が既に用意されていたので楽でした。

結果はわりと希望通りの動作。

  • エディタに対して Ctrl+Oで、すぐ右のタブにファイルを開く。
  • エディタに対して Ctrl+Nで、すぐ右のタブに新しいファイルを作成。
  • エディタに対して Ctrl+Gで、すぐ右のタブに GREP結果。
  • エディタに対してファイルドロップで、すぐ右のタブにファイルを開く。
  • トレイアイコンから新規作成では、右端にタブを追加。
  • トレイアイコンから最近使ったファイルでは、右端にタブを追加。

バックグラウンドでタブを開く機能はないから、連続してファイルを開いたときに新しいタブが右に延びるか左に延びるかということは考えていない。(01234...となるか 0...4321となるか。特別に考慮しなければ後者になる)

タブを閉じたときに次にアクティブになるタブは、多分直前にアクティブだったタブ。理想とする Firefox + TabsOpenRelativeだと、基本的に閉じたタブの右側のタブがアクティブになるものの、ある条件で元のタブ(閉じたタブの左側のタブ)がアクティブになる。タブを閉じたとき次にアクティブになるタブにこだわりはないので変更していない。


知らなかったけど svk diffの出力をリダイレクトしたファイルが CR/CRLF混合。diff自身のメッセージが CR区切りになってるからみたい。いったいどこの diffを使ってるんだ。

よくみると CRの部分は改行がダブってる。CRCRLFが CR+CRLFと解釈されてるみたい。CRLFの LFに誤って CRを補ってしまったのかも。(だれが?)


あとは、常に「前回開いていたファイルを復元する」機能が欲しいところ。タブの順序、カーソル位置、スクロール位置、検索文字列、アンドゥ記録(は無理か)などなどの復元も込みで。


2009年06月05日 (金)

最終更新: 2010-01-15T21:53+0900

おれは吸わないし、(結局は)嫌いなんです。特に窓から腕を出して吸う人間が。

『上流社会の習慣』の指針より

喫煙

「タバコは女性がいるときには吸ってもいけないし、吸って良いかと訊いてもいけない。葉巻を取りに行ったことに気づいた場合、女性はその人に席をはずして外で喫煙してもいいですよと声をかけるのが良い。ただし、街頭での喫煙は御法度で、ことに日中は論外。強盗をはじめとする恥ずべき行為は暗くなってからすることはあっても、明るいうちはしないものだからだ。また、女性がときどき来るような部屋では喫煙してはならない。だから、妻や姉妹のいる卑しからぬ男性は食後にそのまま食堂で喫煙することはない。さらに、花屋や遊歩道に女性のいる場所、あるいは女性の来る可能性のある公の場所では喫煙してはならない。列車の客室内は規則では禁煙だが、同じ客室に乗り合わせた全員の許可があれば喫煙してもよい。ただし、女性がいる場合には、たとえ許可してくれたとしても、吸ってはならない。街なかでパイプを吸うのもいけない。ホテルの喫茶室は一切喫煙は認められない。牧師がいるところでは、許可がなければ吸ってはいけないし、副牧師よりも上の聖職者には葉巻をすすめてはならない」

これは規則ではないし、一般人向けではないし、時間も場所も異なるところのことだし、口やかましい年寄りの小言にしか聞こえないけど、異なる価値観から自分の行為を見直してみる役には立つだろう。喫煙者が「禁煙ではない」というだけを根拠にして節度を守れないのであれば条例による規制も大いに結構。(実際に嫌な思いをさせられた経験があるわけではないが)

次のは単なるお気に入り。脱力しました。

ここは禁煙です。

JavaScriptのクロージャに関する記述が検索に引っかかって見つけたサイトだったと思う。定型の Webページ素材以外のことを書いていたのが 2000年以前にはすごく珍しかった。


2009年06月06日 (土) どうして at をつかうのに管理者権限が必要なんだ。

[Vista] リマインダ

>at HH:MM msg USERNAME "時間です!"

2009年06月09日 (火) eo開通(予定日)

[Vista] エクスプローラがバカなのか ListViewがアホなのか。

サイドバーを左側に出していてもデスクトップアイコンが左上から左下に向かって追加・整列されるのは知っていた。サイドバーをどかさないとアイコンを動かせないですね。

サイドバーのことはおいといて、アイコンが左上から左下に向かって追加されるということで、関係のある一連のアイコンを選択するために Shiftを押しながら↓を押したらどうなったか。選択範囲が「Z」の字を書くように広がっていった。どこまでもやってくれるやつだ。エクスプローラはブラウザと並ぶ最重要アプリケーションだと思うんだけどな。

考えたら ListViewは悪くない。普通のフォルダでアイコンを並べたら「Z」を書くようにアイコンが配列されるもの。デスクトップアイコンを縦に配列してるのは誰でしょうね。

plalaから eoとか書いてると

アクセスログから閲覧履歴を REMOTE_HOSTと REMOTE_ADDRと User-Agentで絞り込めそうだ。


2009年06月10日 (水) [DR250R] 「生産終了いたしました」<http://www1.suzuki.co.jp/motor/Djebel250xc/><http://www1.suzuki.co.jp/motor/dr-z400s/> なんてこったい。いつの間に。BEAT、MR-S、DR。代替不在のままなくなっていって、どんどんつまらなくなるよ。


2009年06月14日 (日)

最終更新: 2009-09-06T20:33+0900

[Ruby] ruby-mp3info (version 0.6.13, 2009-05-26) を使ってみて。

 入手先とドキュメント

チキンなので日記に書きますよ。

 Mp3Info#renameがまるで使えない。

mp3info.rbの中でこのように File.writable? でチェックしているから、renameで @filenameを書きかえていてファイルが存在しないとエラーになる。

      raise(Mp3InfoError, "file is not writable") unless File.writable?(@filename)

ここを乗り越えても

          file.seek(-TAG1_SIZE, File::SEEK_END)

ファイル末尾から TAG1_SIZEバイト戻ることができなくてエラー。だってそれは新しく作ったサイズ 0 のファイルだから。

 yearと tracknumを 0 にされる。

I氏のつぼでタグを書き込んでいると、この二つのタグも他と同じく BOM付き UTF-16LE文字列になっているので、mp3info.rbのこの部分で BOMを数字にしようとして 0 になる。

            if %w{year tracknum}.include?(key)
              @tag[key] = tag_value.to_i
            end

 タイトルなど文字列の最後の一文字が消える。

おそらく mp3info/id3v2.rbのこの部分

        # remove padding zeros for textual tags
        out.sub!(/\0*$/, '')

この処理で outのサイズが奇数バイトになることがあって、さらに NKFが末尾の半端な 1バイトを無視するからではないかと。

あと、/\0*$/ というパターンは /\0+$/ でいいんじゃないかな(空文字列を空文字列に置換することもないし)。あとあと、$ でなく \z を使うとか。


(途中なので)メッセージだけ表示してタグの書き込みはしないでおこうと思っていたら、unless と書くべきところが if になっていて広範囲に mp3ファイルを書きかえてしまった。そしたらエクスプローラでジャンルやアルバム、アーティストなどの読み込みと書き込みができなくなってしまった。むむう。


2009年06月15日 (月) 新はてブ。やっとヘッダの fixed/scroll状態を覚えるようになってスクロールが快適だけど。ピンの表示が間違ってる。

[Ruby] Dir.globと Dir.entries

globできない。どういうこと?

irb> Dir.glob("\\\\LS-WSGL420\\MediaLibrary\\*")
=> []
irb> Dir.entries("\\\\LS-WSGL420\\MediaLibrary")
=> [".", "..", "anime", "music"]

こういうことだった。

irb> Dir.entries("//LS-WSGL420/MediaLibrary/*")
=> ["//LS-WSGL420/MediaLibrary/anime", "//LS-WSGL420/MediaLibrary/music"]

DropHandlerから渡されたファイルパスは置換しなければいけない、と。


2009年06月16日 (火) PuTTY(パティ)。え、プッティじゃないのと Wikipediaをひらけば「※プッティと読む場合もある」すこし安心。例えばこれが PuTY だったら俺はピューティって読んでたよ(パティはない)。COALESCE(コウァレス?, SQLにでてくる)。書けることが大事なのでコアレスケで妥協した。

最終更新: 2010-02-05T02:00+0900

[Vista] > ウィンドウを左右に並べて表示

デスクトップを、並べたいウィンドウだけが開いた状態にし、タスクバーを右クリックしたショートカットメニューから「ウィンドウを左右に並べて表示」を実行すればいい。

レイモンド チェンの『Windowsプログラミングの極意』だっただろうか。そんなの知らねーしわかんねーよ、と読んで思ったのは。だいたいこんな内容。

Ctrlを押しながらタスクバーアイコンをいくつかクリックして選択状態にする。そのうちの一つを右クリックして「重ねて表示」「ウィンドウを上下に並べて表示」「ウィンドウを左右に並べて表示」を選ぶと選択したウィンドウだけを並べて表示できる。

最初の引用の通りにデスクトップを並べたいウィンドウだけにするのは実際は不可能に近いし、不必要なウィンドウまで並べると、ウィンドウサイズが細くなりすぎる。かといってタスクバーアイコンを複数選択して並べるなんて操作はなんて隠しコマンド。ちなみにこの文章はこのあと「必要なウィンドウだけを並べることができたとしてもその並び順をコントロールすることは依然不可能だ」というように続いていた。使えねー。

Aero Snapのおかげでウィンドウを並べる操作はもはや隠れ機能ではなく使いやすくなりました。


2009年06月17日 (水) >http://www.watch.impress.co.jp/eizodirect/fx2431tv/ 「優性遺伝」は「優れた性質が遺伝すること」ではないよ。むしろ世の趨勢がフルHD(1920×1080)パネルな今、WUXGA(1900×1200)は劣性遺伝子ではなくて? それが受け継がれたのを評価するところは同意するが。

> AmazonのAPI認証導入はOSSに対する挑戦だよなぁ(3) - ただのにっき(2009-06-17)

OSSに関しましては、当初御理解の通り、ソースコードが公開されてしまうことから、秘密キーを含む開発者様のキーを埋め込んだまま公開されることは、ライセンス上の問題が発生します。

よって、OSSのユーザ様それぞれにAPIのAccessKeyIDおよび秘密キーを利用開始時に入力いただくという方法を強くお勧めいたします。

だーよーねー。賢い迂回路が用意されてるのかと期待してたのに……。これで特定のサーバーに代理でリクエストしてもらう方法まで禁止されたら Amazonボイコットだべ(個人的に)。チャンスだ。bk1!


コンパイル型言語を使っていても stringsみたいなの、あるいはサクラエディタのようにヌル文字を扱えて正規表現が使えるエディタで「\b[\w\d+/]{40}\b」(文字種は適当です)を検索してみるとかで簡単に秘密キーを抽出できるのでは、という心配は不要なのだろうか。こちらにはパスワードを保護するのと同等の策を講じるような動機がないもんね(アカウントの停止はあるかも)。秘密キーの「秘密」なんてのはとっとと有名無実化すればいいよ。


PROXY設置は構わないんだって。

>Amazon API認証のPROXYを書いたよ(AmazonのAPI認証導入はOSSに対する挑戦だよなぁ(4)) - ただのにっき(2009-06-19)

なんだかなあ。何がしたいんだろう。AccessKeyIdとオプションパラメータの AssociateTagで何が不足だったんだ。他のサービスと統一したかったのか?


もちろん上で挙げた方法は文字列を分割するだとかシーザー暗号を使うだとかで対抗できるけれど、単にバイナリファイルであるというだけで秘密キーを秘密にしていたと言い訳できるんじゃないかと。そして自発的に強固な保護策を講じる動機はないよ。

Amazon Web Services Developer Community : Docs: Product Advertising API (Version 2009-03-31)から引用。

It is important to keep it(Your Secret Access Key) confidential to protect your account.

To provide proof that you truly are the sender of the request, you must also include a digital signature.

AccessKeyID(AWSAccessKeyId/SubscriptionId/DeveloperToken)より確かな識別情報が欲しいだけなの? Proxyの設置が許されてることから、より広範な、例えばブログの書き手個々に SecretAccessKeyを取得してもらって識別する意図はないんだろうし。(だったら Proxyを設置する以外には、そういう対応を利用者にとってもらわなければならないスクリプトはとんだとばっちりだ)

あるいは暗号化? SecretAccessKeyが適切に保護されなければそれも無意味だよ。"YOUR SECRET ACCESS KEY GOES HERE" なサンプルコードばっかりなんだけど。これはない。他に方法がある。

どちらにしろ、手間ひまかけて AccessKeyIDに毛を生やす結果になるだけの気がするから、悪態のひとつもつきたくなるわけ。

うろついてるうちに見つけた(順序が間違ってる!) > Amazon.com Product Advertising API License Agreement

  • 他人の IDでアクセスしたらダメだって。まあ、当たり前。
  • 画像のキャッシュはだめ。画像の URLは 24時間を限度にキャッシュ可。画像以外のキャッシュも 24時間まで。
  • 値段と在庫の情報は鮮度に厳しいようで、いろいろと取り扱い上の注意が……。
  • インストールされたクライアントごとに 1 call per second を超えないこと。などなど

(読んでるうちに) SecretAccessKeyが使い捨て可能なことを思い出した。にょきにょき再生してくるしぶとい毛なのかも。手間をかける価値は……あるかなあ?

期限が来て画像が表示できなくなったら isbn* なメソッドを Amazon以外に置き換えてやろうかしら(手間は一緒だし)。


よくみかける G-Toolsは http://g-tools.com/ でリンクを作成してるのね。つまり今回の変更は利用者には影響がない。はてなダイアリーでも影響がない。tDiary.Netもたぶんない。自前のサーバーでサービスを提供しているところはみんなそう。自分でツールをインストールするような人間は自分で SecretAccessKeyを取得してソースに埋め込むこともできるでしょ、とでも思われているのか数が少なくて無視されているのか。たしかにできるとは思う。やりたくないけど。リンクを作成するのにアマゾンのアカウントをとらないといけないなんて、先に挙げたサービスを利用するのと比べて一段ハードルが高い。代替案の Amazonの手前に(Proxy)サーバーを一台はさむ方は無駄と脆弱性を理由に却下したい。

Amazon自身がリクエストの代行を行うサーバーを設置したらいいんじゃないの。リクエストの Identificationなんてなくなるけど、つきつめればそういう結果になる道を容認したのは自分なんだし。

なんで自分の首を絞めるようなこと(代理リクエストを許可したことを責めているように読めること)まで書いているのか自分でも不思議だったんだけど要は「無駄無駄無駄無駄ッ!」ということなんだろう。Authenticationの導入自体が既に疑問だけど、どうせ導入するなら無駄にならないように手を尽くせ、とこう言いたいらしい。


2009年06月19日 (金) 50音配列は右端があ行だとおもうんだ > QMA DS

[Songbird] Keyboard Ratings 0.3.3.1のこまったちゃん

 日本語キーボードの配列を知らない。

2を Shiftするとダブルクォーテーションになることを知らないから、説明通りのCtrl+Shift+2 では★2つを付けることができない。(代わりに Ctrl+@で★2つを付けられる)

 自動更新スマートプレイリストの曲を評価できなくなる。

  1. スマートプレイリストのフィルタリング条件にレートを含める。
  2. スマートプレイリストの自動更新を有効にする。
  3. スマートプレイリストの再生中に曲を評価する。
  4. その結果その曲がプレイリストから追い出される。
  5. 評価できない (´・ω・`)

2009年06月22日 (月) 関数の外の const intと static const intは同じ?

[SakuraEditor] メニューバー右端のメッセージ表示改善

縦書き編集機能とか実装できるほどのスキルがあればいいんだけどねえ。


2chに化けるという書き込みがあって試してみたら表示が消しゴムで消すように欠ける。描画漏れだと思ったんだけど、後で調べたらそもそもメッセージを保存していなくて再描画するつもりがない。だったら改善す"べき"とまでは思えないんだよね。(タイポのようなものの指摘はできても、自分の考えを押しつけることまではできないし)


ステータスバーが非表示のときにメニューバー右端に表示されるメッセージの、再描画に対応。一時メッセージだとしてもメッセージが半欠けの状態で表示されてたらバグととられても仕方ないから。> fix_menubarmessage.diff

この修正中にこんな処理が行われていたことを知ったのだけど……

 // 編集ウィンドウ切替中(タブまとめ時)はタイトルバーのアクティブ/非アクティブ状態をできるだけ変更しないように(1)	// 2007.04.03 ryoji
 // 前面にいるのが編集ウィンドウならアクティブ状態を保持する

タブ切り替え時に二つのサクラエディタウィンドウが重なる瞬間があって、Aero Glass効果が有効だとこの時にタイトルバーの透明度が下がる(色が濃くなる)。結果、対策もむなしくちらついて見える。これに対応した対処法はあるかな?


 ツッコミを受けての追記。

行・列番号の表示よりも右の部分にゴミが表示されます。

Vistaしかないので制御文字が半角空白に置き換えられたときに区別できるように、メッセージの余白を「 」ではなく「*」で埋めて表示してみたけれど表示は変わらない。この、メッセージの余白を埋める文字がすべてゴミになっているのだろうか。2chの

ステータスバーを消すとメニューバーの右端が化けちゃうんだけどどうすれば

というのを読んで俺は表示が欠けることを指して化けると言っているのかと思ったんだけど(繰り返すけど Vistaだとゴミは見えないので)、この書き込み主は Windows2000でも使っていて半角の「・」のことを指して化けると言っている可能性もあるかも(俺がバグを仕込んだのではないと思いたい)。

タブ切り替え時のちらつき防止はノーアイディア(あったら書いてる)。せっかく見映えの細かいところにまで気が配られているのに自分の環境で働いていないってのは悲しいから、Aero Glassにも対応できたらいいよね。


_tcsncpyが、コピー元が短いときにコピー先の末尾に埋める '\0' が「・」に変換されるんだ。Cの林立する文字列操作関数が大嫌いでいつも(といって片手で数えられるほど)は std::stringに逃げるんだよね。元々のソースはちゃんとやってたのに、俺がテケトーなことをしたわけだ。確保した領域の一つ先に書き込むとか言い訳できないミスもしてるし……。

今度は右端に埋め文字(「 」の代わりの「*」)が見えた > fix_menubarmessage(rev2).diff


さらなるチョンボ(泥沼の様相を呈してきました)。さっきの改訂でメッセージが空になることがなくなったので、表示したメッセージのクリアが行われないはずだ。

もう最後にしたい > fix_menubarmessage(rev3).diff

本日のツッコミ(全1件) ツッコミを入れる

ryojiパッチ(fix_menubarmessage.diff)を適用したものだと、 行・列番号の表示よりも右の部分にゴミが..


2009年06月23日 (火) [正規表現] \rと \nはプラットフォームによってマッチする文字コードが入れ替わる可能性があるから \x0d、\x0aって書いとけって読んだことがある。意図は想像できる。\nを Macでも UNIXでも改行の意味にしたかったんだろう。けど、そんな実装は(あるなら)消えればいいよ。


2009年06月25日 (木) [SakuraEditor] Mery(テキストエディタ)。タブと多ウィンドウ形式を選べるんだけどどちらもプロセスは一つ。やはりというか、既に Meryを開いていると「svn commit --editor-cmd Mery」でコミットメッセージを編集できない。svnが起動したプロセスはおそらくコマンドラインを既存プロセスに渡してすぐに終了するからだろう。(※これはメモリを食おうとも多プロセスのタブ方式を選んだサクラエディタの提灯カキコです)


2009年06月26日 (金)

[Amazon] Product Advertising API

事実と一致するかはおいておいて、Amazonが「デジモノに埋もれる日々」の記事レベルの見解を示していてくれれば抵抗もすくなかったのに。すごく納得できる内容。

既に書かれているけど OpenProxyの注意点は利用規約にも書かれている 1 call per secondの制限を守れるかどうかと、アカウントの停止の危険性だね。Proxy利用者で秘密キーを持ってる人がキーを持ち寄って上限を N call per secondに引き上 げたら……とか考えたけど、それじゃ全然「秘密」キーじゃないわな。

<追記@2009-07-08> DNSラウンドロビンってなんだ、って調べたんじゃなかったか。個人個人がサーバーを立てる、それらを同じ名前で利用する。これで秘密キーとサーバーリソースの両方を持ち寄れる。 </追記>

バイナリファイルでの扱いに関する Amazonの見解。

  • コンパイル型言語で秘密キーを暗号化した上で実行用バイナリ内に埋め込んで、実行用バイナリを公開する。ユーザーは自身のPCで実行用バイナリを実行する。
  • 実行用バイナリをバイナリエディタで覗いた位では秘密キーは解読できないが、実行用バイナリコードをリバースエンジニアリングされれば秘密キーを得ることも可能な状態。

のいずれのケースについても、理想的な方法とは言えませんが、条件付きで利用可能であるという見解となります。

単純な埋め込みは NG。リバースエンジニアリングにより秘密キーが知られうる場合は、理想的ではないが可。

Amazonは PAAPIのどういう利用を想定しているんだろ。サーバー型のサービスとして? 個人が個人の責任で呼び出すものとして? 俺はもう APIを利用してくれるなという Amazonからのメッセージだと受け取っている。(情報が少ないから曲解するんだよ)


2009年06月27日 (土) 打ち水ってあるね。ひしゃくで前の道に水をまくような。見たことはないけど。自分でやってみるところを想像したらバケツの水をひっくり返していた。ダメかな。


2009年06月28日 (日)

最終更新: 2009-10-28T01:40+0900

[正規表現][Firefox] .NETの正規表現の再帰について(20080111p01の補足)。

再帰っていっていいのかな?鬼車は明らかに再帰だったけど。

.NETの正規表現を利用した経験はありません(念のため)。想像です。

.NETの再帰に関係した部分のドキュメントがあまりにわかりにくかったので整理。(実はわかりにくさの半分は日本語のせいだった。英語の方のドキュメントを読みましょう)

 1.スタックされる名前付きキャプチャグループ: (?<name1>……), (?'name1'……)

キャプチャ内容を読み出す従来の記法が \1, \2。名前付きキャプチャの場合は \k<name1>, \k'name1'など(実装ごとに異なる)。キャプチャグループに量指定子がくっついている場合、これらで読み出せるのは最後のキャプチャ内容だけ。だけどキャプチャの記憶領域はキャプチャグループごとに一つではなくスタックになっていて、その一番上の内容を読み出していると考える(.NETだか Javaだかではプログラムからこのスタックにアクセスできたはず)。

 2.名前付きキャプチャ name1のスタックを POPする: (?<name2-name1>……)

まず、これは name2という名前付きキャプチャグループ。と同時に、name1のキャプチャスタックを POPする。name2を省略して name1を POPするだけも可能。MSDNの日本語ドキュメントを名前の部分だけこちらに合うように書きかえたのが次。

既に定義されていたグループ name1 の定義を削除し、既に定義されていた name1 グループと現在のグループの間隔をグループ name2 に格納します。

実際に name2のキャプチャ内容がどういうものになるのか(直前の name1のキャプチャ内容、name2の……にマッチした部分、その間、がそれぞれ含まれるのかどうか)は読み取れないけど、直前の name1キャプチャをなかったことにし、name1のキャプチャ部分から ……までを name2に保存するという。(覚え方: name2は直前の name1から……まで)

当然のこと、name1のキャプチャスタックが空のとき name2のキャプチャは ……のマッチ正否に関わらず失敗する。

 3.名前付きキャプチャ name1のスタックが空であることをテストするイディオム: (?(name1)(?!))

name1のキャプチャに成功しているかどうかで適用するパターンを変化させる条件分岐 (?(name1)truepattern|falsepattern) と、必ず失敗するパターン (?!) の組み合わせにより、name1のキャプチャスタックが空でないと必ず失敗する。逆に name1のキャプチャスタックが空のときは(省略された空の falsepatternが何にでもマッチして)必ず成功する(はず)。

(?(name1)(?!)) が成功する(=name1のキャプチャスタックが空である)とは、name1に含まれるパターンが開きかっこ、name2のパターンが閉じかっこにマッチし、その間のパターンが開き閉じどちらのかっこにもマッチしないとき、開きかっこと閉じかっこがバランスしている、ということ(MSDNの例がこれ)。

なんてこったい

// Firefox 3.0.11と 3.5RC3のロケーションバーでの実行結果。
javascript:alert(/(?!)/.test("")) //=> true (falseであってほしい)
javascript:alert(/(?=)/.test("")) //=> false (trueであってほしい)
javascript:alert(/(?:)/.test("")) //=>
// Windows Vistaでの JScript(WSH)実行結果。
WScript.Echo(""+ /(?!)/.test("")) //=> false (期待通り)
WScript.Echo(""+ /(?=)/.test("")) //=> true (期待通り)
WScript.Echo(""+ /(?:)/.test("")) //=> true (期待通り)

必ず失敗するパターンを試してみたら Firefoxで真逆の結果が出てしまった。Firefoxが間違っててくれないと困るよ。(ブラウザにより逆の結果がでていることがもう困るけど)

(参考)間違いなく失敗する* > 詳説正規表現第3版 - Google ブック検索, 詳説正規表現第3版 - Google ブック検索

Internet Explorer 8.0.6001.18783 64-bit Edition、Safari 4.0.530.17、Opera 9.64、Google Chrome 2.0.172.33 でもみんな Firefoxとは逆の結果になる。Firefoxだけが 3.0から 3.5RC3になっても違っているのは悪夢だ。

Firefoxに理がないことは次の例からも判断できないか。空のパターンを空と空の選択パターンにするだけで結果がひっくり返ってる。

// Firefox 3.0.11のロケーションバーでの実行結果。
javascript:alert(/(?!)/.test("")) //=> true (下と同じであるべき)
javascript:alert(/(?!|)/.test("")) //=> false (期待通り)

javascript:alert(/(?=)/.test("")) //=> false (下と同じであるべき)
javascript:alert(/(?=|)/.test("")) //=> true (期待通り)

javascript:alert(/(?:)/.test("")) //=> true (期待通り)
javascript:alert(/(?:|)/.test("")) //=> true (期待通り)

* 念のため断っておくと、書籍の文脈では、この断定は Perlと .NETの正規表現に(ちゃんと)限られている。