某日記

(後期)

平成19年10月21日(日曜日)

今日

ドトールでマターリ。

VOCALOID MIDI 口パク実験 その1 - 自作 VSTi で MIDI データを横取りしてパイプでマスコットプログラムに転送しとります。SMF を再生するプログラムを作れば VSTi じゃなくてもいいんだけど、VSTi のほうが作るの簡単だし、時間の精度まで考えると、まともなシーケンサーを使った方が良い。

しかし、マスコットプログラムの方はともかく、MascotVST は公開しようと思うとちょっとメンドイ。

平成19年10月22日(月曜日)

今日

KB929605 - 4 GB の RAM が搭載されている場合、Windows Vista の [システム情報] ダイアログ ボックスで報告されるシステム メモリが予想より小さい - XP でも同様。平たく言えば、 MMIO のために物理アドレス空間を予約する必要があるから 4G のメモリを積んでも 3.12G までしか使えない。

この書きぶりだと、たぶん 32bit Windows を使っている限り、 PAE を有効にしても low 4G 部分は 3.12G までしか使えないように見える。 64bit Windows では、BIOS がリマップをサポートしていると残りも(おそらく 4G 超にリマップして)使える模様。

Windows のコマンドラインで使える ssh クライアントがないかと探したら、Putty の plink.exe というのを見付けた。cvs の通信に使うにはこれで十分だ。ただし pageant を起動しておかないとダメ(あるいはパスフレーズ無しの鍵を使うか)。

平成19年10月23日(火曜日)

査収物

TBD

今日

FPU を FreeBSD カーネルで使う話 - マルチメディア系を扱いたい場合に SIMD とかを使いたくなることはあるので、何か仕組みが欲しいよね、という話はたまにする。一番卑近な例だとインカーネルバーチャルオーディオミキサーとかサンプルレート変換とか。モノリシックカーネルでそういうことをしようとするなという話もあるが。

ルール違反を正当化するためにルールを改正するというのは、実は少しも悪いことではないのだが、どうも世の中にはそれが無条件に悪いことだと思う風潮がある。

もちろん、殺人なんかみたいに、明らかに倫理的にも許されないようなものを正当化するために刑法を改正するなんてのは言うまでもなく間違いなのだが、倫理という観点からすると、多くのルールには倫理的な裏付けなんてのはなくて、こういうものに対して倫理の側から言えることは、十把一絡げに「ルールを守らないのは良くない」ということしかない。そして、世の中には、理由はよくわかんないけどルールになっていて、ルールになっている以上は守らなきゃいけない、というようなものがたくさんある。こういうものは、コンセンサスさえ得られれば無くすことに躊躇する必要はない。また、その動議はそのルールに利害関係をもっている誰もが起こせてしかるべきだろう。

私が仮に、どこかに設置されている特定の交通標識を常習的に無視していて何度も捕まっているとしますわな。もちろんその罰はちゃんと受けるのは当然のこととして、私がその交通標識の非合理性を訴えてその改正を行政に求めたとしたら、私はこれは正当な行為だと思うのだが、たぶん世間はそう思わないだろう。「まずは違法行為を止めてから言え」と言われる。論理的に考えれば、これは実にナンセンスなことだと思う。「その主張は別に承るとして、とりあえず違法行為はやめなさい」と言うのならば筋が通っているのだが。

ルールというのは所詮、人と人との間の利益を調停するためのものでしかないなのだから、たとえ犯罪者が自分の罪を正当化するためであってもルール改正を主張して良いはずで、それを認めるかどうかはその内容だけで判断すべきなのだが、どうもえてして、犯罪者が自分に利するような主張をすると無条件に悪と決めつけるような風潮がありますな。これはよろしくないことだと思う。自戒自戒。まあ、多くの犯罪者はそういう場合にとても傾聴に値するような内容のことは言わないもんだけど、それはそれ。

もうちょっと考えてみたら、「その動議はそのルールに利害関係をもっている誰もが起こせてしかるべきだろう」というのは必ずしも正しくないということに気づいた。つまりソクラテスの理屈だな。その点はとりあえず撤回するとしても、しかしながら、おおざっぱに言ってしまえば、犯罪者の言うことでも、それが傾聴に値する内容を持っていれば聞いた方がよかろう。

横に逸れると、たぶんこのへんが理系と文系を分けている壁なんじゃないかという気もする。自然科学の世界では、誰が主張しようが正しきゃ正しいというのが基本的な約束ごとの一つだけれど、人間社会は自然科学の約束には必ずしも従っていないから、これはこれで詮なきことと悟ることもそれはそれで一つの見識ではある。

あたしゃ気づいちゃったんだが、口パク動画作るだけなら、SMF 読ませてモーション JPEG でも吐いた方がええんでないか。これならリアルタイムじゃない分同期も楽だしコマ落ちも気にしないで済む。あるいはいっそ AVI を直接吐くか。

そう考えると、miku-mascot はやっぱり VOCALOID VSTi のラッパとして作りなおして、ディレイラマみたいな生き方をしてもらうのが一番よい余生かもしれない。

平成19年10月24日(水曜日)

今日

「……届いた」 - 初音ミクエンド

というネタを、未だ品薄だった時にやれば面白かったかもしれないし、もう誰にも分からないネタかもしれない。

混と交 - 広辞苑の電子版第四版をみると、このへん全く区別していなくて使えない。紙の広辞苑をひいても役に立った記憶がないから、たぶんこれは電子版に限らないと思う。この点、MS-IME のほうがよっぽど有益だ。

平成19年10月25日(木曜日)

今日

rrユーティリティによる長いパスの記憶と再生 -

rrは単純ながら有用なツールである。同じファイル名で終わる2つのファイルパスを再生できないことが問題になる場合は、シンボリックリンクを使用するとよいかもしれない。そうすれば自由に名前を付けることができるので、rrで実際のファイル名の代わりにシンボリックリンク使用することで名前の衝突を避けられる。
……最初っから rr 使わずにホームあたりにシンボリックリンク作りゃあいいんじゃないの?

面倒臭い時は / にシンボリックリンク作ることすらあるけど教条主義的観点からお薦めしない。

平成19年10月26日(金曜日)

リセットスイッチはつなぐな

どうもいろいろ話をきくと、最近のマザーボードはリセットスイッチまわりが駄目なんじゃないかという気がするので、あれは結線しない方がよさそうです。実際俺も嵌められたしな。

今どきリセットスイッチは付いてないケースの方が多いし、まあ「誰も使わないものは自分も使うな」という教訓であります。

平成19年10月27日(土曜日)

今日

.

平成19年10月28日(日曜日)

今日

1文字分のミスで大トラブルに 首都圏改札機トラブル - 技術文書に明るくない僕には何を言ってるんだかさっぱり分かんないけど、興味深いのは、プログラムミスうんぬんという話よりも、「ブラックリストへの登録件数がこの 10 月で 5452 件を超えた」ということが、この記事から分かるというところだな。

もう 10 年近く前から言っていることだけど、wcwidth っておかしいよな。これは locale じゃなくて terminfo の機能であるべきだ。そろそろ Internationalized terminfo が必要かもしれないし、今さら不要かもしれない。

C++: 自動ロック

C++ でスレッドを意識したプログラムを組んでるときに、ScopedLocker みたいなありがちなクラスを作ってみて、しかしふと考えてみると、どうもこれはよっぽど単純なケース以外には役に立たない気がしてくる。

ロックがなんで難しいかというと、効率を考え出すと粒度が一定にできないというところなんだな。特にカプセル化とは相容れない。つまり、オブジェクトのカプセル化とは完全にズレた(下手をすると入れ子にすらなっていないような)範囲のロックが必要になる。

たとえば、リンクリストで任意のノードを削除するには、そのノードを指定するためにいわゆるイテレータが必要になるけど、イテレータを取得したら、削除操作に適用するまでの間はそれが有効であることを保証しなければいけないから、マルチスレッド環境では「イテレータの取得と実際の削除」全体を括弧で括ってロックしなきゃなんない。こういう時のロックは自動化がやりにくい。手動で ScopedLocker を括弧全体に適用する必要があるか、無理に自動でやろうとすればイテレータが化け物みたいなクラスになる(そして使い勝手と効率のトレードオフを強いられる)。別のアプローチとしては、操作全体をアトミックにするために、外部イテレータの使用を止めて全部クロージャにしちまうという手もあるけど、あまり柔軟性はない。だいいち C++ ではやりにくい。

もっと簡単な操作、たとえばリストの先頭要素の削除なんてのは外にイテレータを取り出さなくてもできるから、基本的にそのメソッドの中だけでロックすれば済むんだけど、こういう操作も時としてもっとグローバルなロックの中でやりたいことがあって、結局 pop_front() と pop_front_nolock() という二つのメソッドが必要になったりする。あるいは pop_front(bool nolock=false) とかな。こんなバリエーションは覚えたくないし、その時点でほとんどカプセル化が壊れている。もっとも、この問題は再入可能ミューテックス(pthread の用語で言えば再帰的ミューテックス)でほとんど回避できるけど。ヒント: とりあえず C++ で自動的なロックを部分的にでも使おうと思ったら再入可能ミューテックスを使うのは必須なんじゃないかという気がする。

もっと難しいのは複数のロックが絡むときにデッドロックをどうやって避けるかというところだけど、これはカプセル化とは関係なしに難しい。しかしながら、自動化の障害になるのも確か。踏み込むのはやめておこう。

あたくし思うに、ロックというのは本来はエラー処理なんかと同様に、プログラムの本質とは何にも関係ない部分なんだから、たとえば C++ の例外のように、プログラミング言語のレベルでもっと裏に隠せるような良い仕組みを用意できねえもんかなぁと、そんな気がしますな。なんとなく、静的処理ではどうしようもないような気がするので(あるいはコンパイル/リンクに時間をいっぱいかければ可能かもしれない --- そんなのは御免こうむりたいが)、実行時の動的なメカニズムが必要な気がする(再入可能ミューテックスというのは部分的にこれを実現してるわけだな)。

C++: 派生クラスをテンプレート引数に渡す

ついでにもうひとつ C++ ネタで、テンプレート引数に派生クラスを渡すという小技。

C++ のテンプレート引数には、多少制限はあるものの、宣言だけされていて定義がされていないようなクラスも渡せる。だから、次のようなコードは正しい:


これが何の役に立つかというと、たとえば従来次のようにしていたものを:


次のように書ける: 

まあどれだけうれしいのかはわからないけど。 

ポイントとして、これは public 継承を使っているような場面では基本的には使えない。どうみても is-a 関係ではなくて has-a 関係なので。結局ある種の Mix-in を実現するための一手段ですわね。

こういう Mix-in をやるための別の方法として、基本クラスと派生クラスをひっくり返すという方法もある:


まあ、「極力派生すんな」という原則からすると、こういうのはあまり褒められたもんでもないのかもしれないけど、でも C++ って、こうでもしないとたくさん glue コード書かなきゃいけなくなってやってらんないよ、ってのも事実。特に、private 継承はうまく使うとすんごく便利で、これは using キーワードが付いてからやっと実用的になったと思う(付く前は、has-a 関係にもかかわらず無理矢理 public 継承を使って実現するという手があったが、教条主義的観点からは以下略)。惜しむらくは mutable にできないことだ。ごく稀に困る。

平成19年10月30日(火曜日)

今日

模型千円札事件――芸術は裁かれうるのか - 赤瀬川原平のアレ。

ところで、体裁が本物そっくりだけど中身が全くでたらめな法律を作って、でたらめな法律であると明示せずにそいつをネットかなんかで公開したりすると、何か罪に問われるの? そういう行為を違法とするそのものズバリな法律があるのかどうか。あるいは、こういう行為を間接的に違法とできるような法律があるのかどうか。

STM - なるほど。おおざっぱに言ってしまえば、世の中「(少なくともロックプリミティブを明示しなければならないような)ロックはしない」方向に進みつつあって、あとは「それを実現する手段」と「プログラマへの見せかた」の問題なのかもしれない。

C++: 楽しい C++ プログラミング

C++ は楽しい言語だ。

なんといっても、本質とは全然関係ない部分をいじくり回し続けるだけで 10 年は遊べる。何物かを生産しようとすると、ついついそういうオモチャの方に目が行って集中力を乱されるようなところがあるけど。

gcc 2.6.3 なんてころから C++ を使っているが、バージョンが上がるにつれていろんなオモチャがくっついてくるので、そのたんびに一ヶ月くらいは遊べる。

「趣味はプログラミングです」なんて言う人はいるが、大部分これは認識が間違っている。これっぽっちも役に立たない C++ のテンプレートクラスを作っては壊し、作っては壊し、スクラップアンドスクラップ、それでゴハン三杯食べられるようになって初めて「趣味はプログラミングです」と言ってよろしい。本気にするなよ。

最近不満なのはテンプレートクラスを typedef できないことと、typedef した型名を friend に使えないことだ。テンプレート引数にテンプレートクラスを渡すことはできるのに:

template <template <class> class T> class X { }; // OK
typedef (あるいはそれに類する何か)はない:
template <class> class X;
typedef X Y; // NG
似たようなもんなのに。

friend は、こんなコードとか:


friend の後には typename キーワードは使えないので注意。まあこんなのが必要になるのは、大抵は設計が良くないんだけど。 

同様に、typedef でパーシャルスペシャライゼーションができないのも不満:

template <class, class> class X;
template <class T> typedef X<int, T> Y; // NG
クラスを使って似たことはできるけど:
template <class T>
class PartialSpecializer
{
  typedef X<int, T> Y;
};
これは割と便利なイディオムなので覚えておくといい。つーか「テンプレート引数が長いんじゃボケ」問題の回避は C++ では切実でしてな。typedef は便利なツール。

この観点からすると、C++ の継承の文法ってのも困ってしまって、時としてベースクラスにすんごい複雑なテンプレート引数を持つクラスを指定しなければならないことがあるんだが、typedef で整理するのもままならない。前方参照と事前 typedef を駆使するのも業腹だ。継承関係はクラス定義のブレースの内側にかけるようにした方が良かったのかもしれないが、まあこれは詮なきことだ。

ちなみに、次のイディオムも便利なので覚えておこう:

class A : public Foo::Bar::Hoge::Fuga::Motteke::Salor::Fuku
{
  typedef Foo::Bar::Hoge::Fuga::Motteke::Salor::Fuku Super_;
public:
  A(int arg) : Super_(arg) { }
};
ここには typedef 名を使える。

平成19年10月31日(水曜日)

今日

合掌

.

なんとなくパラメータの意味が分かってきた:

  • BRE: ブレスノイズの量 - ただし喉付近に付加するモデルらしく、増やしてもダミ声になるのが関の山
  • BRI: 喉付近の LPF の強さ
  • CLE: 軟口蓋付近の LPF の強さ
  • OPE: 唇付近の LPF の強さ
  • GEN: フォルマントシフト

今回は、素材の切り出しと flv コンバート、VOCALOID 以外は全部 SONAR6 の中で完結。