VistaのシンボリックリンクとVirtualStore

一般には至極どうでもいい話です。

Vistaではmklinkコマンドで従来のハードリンク・ジャンクションに加えてシンボリックリンクが張れるようになりました。シンボリックリンクの動作はジャンクションとほぼ一緒ですが、ところどころ違う部分もあります。
・ネットワークドライブにも張れる
・相対パスでも張れる
・エクスプローラ上のプロパティからリンク元が辿れる
・エクスプローラでフォルダサイズを表示してくれない
・通常は2000/XPからアクセスできない(フリーのドライバがありますが)
・xcopyの/L/Bオプションでシンボリックリンク自体をコピーできる(なぜかrobocopyには相当するオプションがない...)

で、シンボリックリンクが使えるとなるとProgram FilesやUsersを別ドライブに移してリンクを張りたくなるのが人情(自分だけ?)。でもここにひとつ問題点がありました。
Vistaのシステムフォルダ(WindowsやProgram Files)はセキュリティ保護の名目でアクセス権が厳しく設定されています。これによって、今までフリーソフトでよくある「設定ファイルを実行ファイルと同じフォルダ内に作る」ことなどが出来なくなりました。で、この救済策として仮想化と呼ばれるリダイレクトがVistaによって行われることになってます(詳しくは「VirtualStore」などでググれば出ます)。
ところがどうもProgram FilesやUsersをシンボリックリンクにしておくと、このVirtualStoreへのリダイレクトが効かなくなるっぽいのです。より正確に言えばシステムパーティションでないと効かないようで、レジストリ変更でUsersを別パーティションへ移してもリダイレクトされなくなります。システムパーティション内のフォルダに張ったシンボリックリンクは有効ですが、中身を別ドライブへ移せないのだからあまり意味がありません。
解決策はパーティション分けを諦めるか、仮想化に頼らなくても済むようにUACを無効にするか...シンボリックリンクが「本当にそこにファイルがあるように」振舞えばいいと思うんですが、仮想化はハードリンクみたいに同一ドライブじゃないとまずい機能なんですかね?

foobar2000のおはなし 第4話

foobar
今はこんな感じです。
だいぶしっくり来るようになってきました。

foo_input_matroskaの話。
ワイルドカードの扱いについて。
0.9.2.0でAttachmentへの透過アクセスを実装したわけですが、通常版のfoo_uie_albumart等でワイルドカードが使えません。
ワイルドカードのマッチングは、通常のファイルの場合はWin32API(FindFirstFile())がワイルドカードを受け付けてくれるんですが、自前の場合は目的のディレクトリ内のファイル名と1つずつ比較する必要があります。foo_input_matroskaはfoobar2000SDKのfilesystem::list_directory()でAttachmentのリストを返すようにしていますが、foo_uie_albumartを含むほとんどのコンポーネントはFindFirstFile()でディレクトリを走査しているため、ワイルドカードが利かないということになります。
書庫内のワイルドカードが実装されていないのも同じ理由で、さらに書庫の場合はarchive::list_directory()ではファイル名のリストを得られないため、gfngfgf氏もなかなか実装することが出来ないんだと思います。(一応archive::archive_list()ってのもあるんですが、これは引数に渡すarchive_callbackを自前で実装しなきゃいけないのでかなり面倒だったりします。list_directory()はdirectory_callback_implがあらかじめ用意されてるんですけど)
まぁこればっかりはちょっとこちら側ではなんともしがたい問題ですね。
なんとかしようとすればFindFirstFile()をフックとか...いやさすがにそこまでは(;´Д`)

foobar2000のおはなし 第3話

foo_input_matroskaの話。
flacやttaのmkaをfoobarでデコードすると1サンプル短くなってしまうファイルがある問題について。
まずflacのほうですが、これはmkvmergeがSegmentInfo::Durationを正確に入れてくれないのが原因です。Duration計算の段階で四捨五入しなければいけないところを切り捨て(キャスト任せ)ているため、1サンプル足りないDurationが格納されるファイルが出てきます。foo_input_matroskaは最後のChapterの終了時間をこのDurationから持ってくるので、デコード結果が1サンプル短くなります。mkvextractはこのDurationは見ないでBlockを1個ずつ足していくので、削れることはありません(格納段階でBlockに欠損は無し)。foo_input_matroska側での対処はちょっと難しい(いちいちBlock1個ずつ見てるとパースに時間かかってしまう)のでmkvmergeの修正待ちということになりますが、今まで直されていないところを見ると、こちらから報告しないと直らない予感もします...
ttaのほうは、正直よくわかりません。末尾手前のBlockをデコードすると1サンプル足りないPCMが出てくるという謎現象が発生したりしまして、これが恐らく、一般に言われる「mkaからttaを取り出すと1サンプル足りなくなる」問題の正体だと思います(mkvextractはデコードしないけど)。これに加えて上記のDurationが正確でない問題も起こるので、ttaの場合はfoobarでデコードすると2サンプル足りなくなることもあります。格納されているBlockは素のttaのフレームと同じ構造で、比較しても一緒のデータなので、mkaにする段階で欠損しているということはないようです。今のところデコーダ自体が怪しいんじゃないか(ttaファイルのデコーダとは別なので)と思っていますが、欠けるBlockが必ず最終Blockの1つか2つ前だったりして、さっぱり原因不明。foo_input_ttaの性能自体は結構優秀なので、この問題はさっさと解消したいところなんですけど、mkvextractでもダメなので先行きは厳しいです。
ちなみにWavPackはDurationの問題もありませんので、正確にデコードしてくれます。

foobar2000のおはなし 第2話

foo_input_matroskaの話。
というわけで公式のほうで0.9.1.0をリリース。
外部からパーサにアクセスできるようにcontainer_matroskaとしてサービス化できました。使い方はtxtかfoo_utils_matroskaを参考に。Attachされた歌詞ファイルの表示なんかを想定してます。
残り手を入れる部分としてはタグ周りでしょうか。
ID3やAPE Tag、OggやFLACのタグとの違いでやっかいな点は、matroskaはタグも階層構造で保持することです(EBMLですから)。foobar2000のインターフェイスでは平面のタグ付けしかできないので、読み出しはともかく書き込みには一工夫必要です。今のところはALBUMのプリフィックスがあるとアルバムタグ...とかやってるようですが(この辺あんまり手をつけてない)。専用インターフェイスがmatroska的にはベストなんでしょうが、ユーザーからすれば既存のI/Fで管理したいですしね。
あとは再生時のパースをもっと高速化したいところ。Clusterのパースに一番時間食ってるんですが、これ何とかなるんだろうか。Clusterは数が多いので時間かかって当たり前なんですけどね...

foobarのおはなし 第1話

foobar
今使ってるfoobar2000はこんな感じ。
あとサイドバーとしてPlaylist Treeが出るようになってます。
Tabbed Panel Stackが0.9で使えるようになったみたいなので、歌詞表示でもさせようかとも思うんですが、手持ちの歌詞ってないんですよね...

foo_input_matroskaの話。
まだリリースしてませんが、手元のバージョンではAttachmentの取り出しとpregap(INDEX 00)のtechinfo表示に対応してます。
パーサをサービス化して、他のコンポーネントからmatroskaの情報を参照できるようにしたいんですが、ちょっと時間かかりそう。先にリリースしたほうがいいかな...?これが出来ればalbumart_mkaからmatroskaのライブラリを切り離せるんですが。
それと、いくつかのサイトで言及されていたらしい、0.8.3でつけたタグが読み込まれない現象なんですが、Editionについてるタグを読み込まなくなったのが原因みたいですね。わたし該当箇所いつ消したんだっけな...
matroskaのタグ仕様として、SimpleTagの帰属先はTargetValueでのみ判断するみたいなので、この辺の処理も一度手を入れなきゃいけませんね。0.8のタグも読み込みくらいはさせとかないと。

foobar x matroska

最近やっていることは、曲作りでも卒制でも就活(泣 でもなく、foobar2000のコンポーネント(プラグイン)作りだったりします。
foobarのバージョンが0.9になったとき、Matroskaという形式のファイルが再生できなくなったので、再生用コンポーネントを勢い余って自分で0.9対応にしてしまったのが事の発端です。
その作業でコンポーネントの作り方を把握したので、面白がって自分が欲しいものをちょこちょこ弄ったり2chで公開したりしてたんですが、本家(?)Hydrogenaudio(海外のデジタルオーディオ専門フォーラム)にレスしたのがきっかけでMatroska公式の人に目をつけられ(笑、その流れでなぜかMatroska公式のメンテナになってしまったわけです。

わたしプログラマじゃないんですが...

こんな嗜み程度しかこなしてない自分(しかも英語苦手ときた)がデジタルマルチメディアの最前線のプロジェクトに足を突っ込んでいいものかいまだに悩みどころなんですが、かの妖精現実さんにお世話していただいたりしてなんとかなっちゃってます。
ていうか英語のIRCとかマジ緊張します、Haaliとかいう名前もあるし...MMORPG程度ならまだ何とかなるんですが(笑
そんなこんなで4月終わりくらいから結構C++相手にフル稼働という感じだったり。
この辺で弄ったものを置いたりもしてますので興味ある人はどうぞ。
foobar2000に関するネタとかもちょこちょこ書けるかもしれませんが、なんとなく需要はなさそうですか。

曲も書かないといけないんですけどー。

ソフ開

就職の近いこの時期、資格を取れ取れと言われます。
まぁ情報系の1つや2つは持っててもいいかなと思って、とりあえず情報処理技術者でも取ってみようかなと。
んでいまさら初級シスアドもあれだしなと、ソフトウェア開発技術者に行きました。
無茶です。
ついでに勉強らしい勉強もいろいろあれそれで出来ませんでしたので、ほぼ無勉強で突っ込んでみました。
ついカッとなってやった。ソフトウェア系なら何でも良かった。今は反省している。

出来としては意外と(?)書けたような気がしないでもないのですが、合格できるかっていうとまぁ多分㍉でしょう。
午前午後ともに1冊の参考書と気合と第六感で解き進んでいったわけですが、その1冊の参考書で直前に苦手なローレベル(簡単という意味じゃないです)の分野を中心に読んでみたのが割と役に立ちました。
ソフトウェア開発という名前だから、もっとオブジェクト指向とかテストファーストとかXPとかアジャイル開発とか出るもんだと思ってたのに午前に2、3問くらいしか出なかったのはなんとも...
そういうのはやっぱりJava系の検定じゃないとだめですか。
なんかデータベースの問題が多かったですね。今回の午後IIはデータベースとわかってはいたし、午後Iのデータベースで触れられてなかったトランザクションとレプリケーションが午後IIに来ることも予想は出来てたんですが...実際に分散処理のシステムなんて組んだことないですからねー。さっぱりイメージがつかめませんでした。

とりあえず秋は午後IIがアルゴリズムなので、今からそっちに照準を合わせてしまおうか。