最終更新: 2009-10-28T01:40+0900
再帰っていっていいのかな?鬼車は明らかに再帰だったけど。
.NETの正規表現を利用した経験はありません(念のため)。想像です。
.NETの再帰に関係した部分のドキュメントがあまりにわかりにくかったので整理。(実はわかりにくさの半分は日本語のせいだった。英語の方のドキュメントを読みましょう)
キャプチャ内容を読み出す従来の記法が \1, \2。名前付きキャプチャの場合は \k<name1>, \k'name1'など(実装ごとに異なる)。キャプチャグループに量指定子がくっついている場合、これらで読み出せるのは最後のキャプチャ内容だけ。だけどキャプチャの記憶領域はキャプチャグループごとに一つではなくスタックになっていて、その一番上の内容を読み出していると考える(.NETだか Javaだかではプログラムからこのスタックにアクセスできたはず)。
まず、これは name2という名前付きキャプチャグループ。と同時に、name1のキャプチャスタックを POPする。name2を省略して name1を POPするだけも可能。MSDNの日本語ドキュメントを名前の部分だけこちらに合うように書きかえたのが次。
既に定義されていたグループ name1 の定義を削除し、既に定義されていた name1 グループと現在のグループの間隔をグループ name2 に格納します。
実際に name2のキャプチャ内容がどういうものになるのか(直前の name1のキャプチャ内容、name2の……にマッチした部分、その間、がそれぞれ含まれるのかどうか)は読み取れないけど、直前の name1キャプチャをなかったことにし、name1のキャプチャ部分から ……までを name2に保存するという。(覚え方: name2は直前の name1から……まで)
当然のこと、name1のキャプチャスタックが空のとき name2のキャプチャは ……のマッチ正否に関わらず失敗する。
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の正規表現に(ちゃんと)限られている。
事実と一致するかはおいておいて、Amazonが「デジモノに埋もれる日々」の記事レベルの見解を示していてくれれば抵抗もすくなかったのに。すごく納得できる内容。
既に書かれているけど OpenProxyの注意点は利用規約にも書かれている 1 call per secondの制限を守れるかどうかと、アカウントの停止の危険性だね。Proxy利用者で秘密キーを持ってる人がキーを持ち寄って上限を N call per secondに引き上 げたら……とか考えたけど、それじゃ全然「秘密」キーじゃないわな。
<追記@2009-07-08> DNSラウンドロビンってなんだ、って調べたんじゃなかったか。個人個人がサーバーを立てる、それらを同じ名前で利用する。これで秘密キーとサーバーリソースの両方を持ち寄れる。 </追記>
バイナリファイルでの扱いに関する Amazonの見解。
- コンパイル型言語で秘密キーを暗号化した上で実行用バイナリ内に埋め込んで、実行用バイナリを公開する。ユーザーは自身のPCで実行用バイナリを実行する。
- 実行用バイナリをバイナリエディタで覗いた位では秘密キーは解読できないが、実行用バイナリコードをリバースエンジニアリングされれば秘密キーを得ることも可能な状態。
のいずれのケースについても、理想的な方法とは言えませんが、条件付きで利用可能であるという見解となります。
単純な埋め込みは NG。リバースエンジニアリングにより秘密キーが知られうる場合は、理想的ではないが可。
Amazonは PAAPIのどういう利用を想定しているんだろ。サーバー型のサービスとして? 個人が個人の責任で呼び出すものとして? 俺はもう APIを利用してくれるなという Amazonからのメッセージだと受け取っている。(情報が少ないから曲解するんだよ)
縦書き編集機能とか実装できるほどのスキルがあればいいんだけどねえ。
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
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
(読んでるうちに) SecretAccessKeyが使い捨て可能なことを思い出した。にょきにょき再生してくるしぶとい毛なのかも。手間をかける価値は……あるかなあ?
期限が来て画像が表示できなくなったら isbn* なメソッドを Amazon以外に置き換えてやろうかしら(手間は一緒だし)。
よくみかける G-Toolsは http://g-tools.com/ でリンクを作成してるのね。つまり今回の変更は利用者には影響がない。はてなダイアリーでも影響がない。tDiary.Netもたぶんない。自前のサーバーでサービスを提供しているところはみんなそう。自分でツールをインストールするような人間は自分で SecretAccessKeyを取得してソースに埋め込むこともできるでしょ、とでも思われているのか数が少なくて無視されているのか。たしかにできるとは思う。やりたくないけど。リンクを作成するのにアマゾンのアカウントをとらないといけないなんて、先に挙げたサービスを利用するのと比べて一段ハードルが高い。代替案の Amazonの手前に(Proxy)サーバーを一台はさむ方は無駄と脆弱性を理由に却下したい。
Amazon自身がリクエストの代行を行うサーバーを設置したらいいんじゃないの。リクエストの Identificationなんてなくなるけど、つきつめればそういう結果になる道を容認したのは自分なんだし。
なんで自分の首を絞めるようなこと(代理リクエストを許可したことを責めているように読めること)まで書いているのか自分でも不思議だったんだけど要は「無駄無駄無駄無駄ッ!」ということなんだろう。Authenticationの導入自体が既に疑問だけど、どうせ導入するなら無駄にならないように手を尽くせ、とこう言いたいらしい。
最終更新: 2010-02-05T02:00+0900
デスクトップを、並べたいウィンドウだけが開いた状態にし、タスクバーを右クリックしたショートカットメニューから「ウィンドウを左右に並べて表示」を実行すればいい。
レイモンド チェンの『Windowsプログラミングの極意』だっただろうか。そんなの知らねーしわかんねーよ、と読んで思ったのは。だいたいこんな内容。
Ctrlを押しながらタスクバーアイコンをいくつかクリックして選択状態にする。そのうちの一つを右クリックして「重ねて表示」「ウィンドウを上下に並べて表示」「ウィンドウを左右に並べて表示」を選ぶと選択したウィンドウだけを並べて表示できる。
最初の引用の通りにデスクトップを並べたいウィンドウだけにするのは実際は不可能に近いし、不必要なウィンドウまで並べると、ウィンドウサイズが細くなりすぎる。かといってタスクバーアイコンを複数選択して並べるなんて操作はなんて隠しコマンド。ちなみにこの文章はこのあと「必要なウィンドウだけを並べることができたとしてもその並び順をコントロールすることは依然不可能だ」というように続いていた。使えねー。
Aero Snapのおかげでウィンドウを並べる操作はもはや隠れ機能ではなく使いやすくなりました。
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-09-06T20:33+0900
チキンなので日記に書きますよ。
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 のファイルだから。
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ファイルを書きかえてしまった。そしたらエクスプローラでジャンルやアルバム、アーティストなどの読み込みと書き込みができなくなってしまった。むむう。
サイドバーを左側に出していてもデスクトップアイコンが左上から左下に向かって追加・整列されるのは知っていた。サイドバーをどかさないとアイコンを動かせないですね。
サイドバーのことはおいといて、アイコンが左上から左下に向かって追加されるということで、関係のある一連のアイコンを選択するために Shiftを押しながら↓を押したらどうなったか。選択範囲が「Z」の字を書くように広がっていった。どこまでもやってくれるやつだ。エクスプローラはブラウザと並ぶ最重要アプリケーションだと思うんだけどな。
考えたら ListViewは悪くない。普通のフォルダでアイコンを並べたら「Z」を書くようにアイコンが配列されるもの。デスクトップアイコンを縦に配列してるのは誰でしょうね。
アクセスログから閲覧履歴を REMOTE_HOSTと REMOTE_ADDRと User-Agentで絞り込めそうだ。
♭ ryojiパッチ(fix_menubarmessage.diff)を適用したものだと、 行・列番号の表示よりも右の部分にゴミが..