トップ «前の日記(2009-08-24) 最新 次の日記(2009-08-26)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2009-08-25

_ 今日のバグ

一見すると(と書いたが、実はそうでもない)バグがないように見えるバギーなプログラム。
たとえば、\0を含んだバイト列を文字列として(\0までの)長さを求める処理。
int foobar(unsigned char* ptr, int len)
{
    int i;
    unsigned char* p = ptr;
    for (i = 0; *p != 0 && i < len; i++, p++);
    return p - ptr;
}
大体、正しく動く。
#include 
int foobar(unsigned char* ptr, int len)
{
    int i;
    unsigned char* p = ptr;
    for (i = 0; *p != 0 && i < len; i++, p++);
    return p - ptr;
}
int main(int argc, char* argv[])
{
    unsigned char a[] = "abc\0def";
    printf("len = %d\n", foobar(a, sizeof(a)/sizeof(a[0])));
}
実行すると
c:\test>cl len.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
 
len.c
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
 
/out:len.exe 
len.obj 
 
c:\test>len
len = 3
だが、あるときバグが発現する。しかし、それまで10年以上元気に動いていたという事実から、なかなかバグに気づかない。ということもある。
ではどのあたりでバグが発現するか見てみる。
#include 
#include 
int foobar(unsigned char* ptr, int len)
{
    int i;
    unsigned char* p = ptr;
    for (i = 0; *p != 0 && i < len; i++, p++);
    return p - ptr;
}
int main(int argc, char* argv[])
{
    int i;
    unsigned char* p;
    for (i = 16300;; i++) {
        p = (unsigned char*)malloc(i);
        memset(p, '\xff', i);
        printf("len = %d\n", foobar(p, i));
        free(p);
    }
}
実行すると
...
len = 524251
len = 524252
len = 524253
len = 524254
len = 524255
で終了。思ったよりももったが、つまりは524256バイト与えたところで死んだことになる。
クイズ:524256から、Windows(またはmsvcrt)のメモリーアロケータが管理のために利用する領域のサイズを推測してみよう。
考察:言語仕様を知っているかどうかということではないか?

_ ムオームオーなベルリオーズ

最近、子供が図書館でCDを借りまくるようになって、ベルリオーズの幻想交響曲を借りてきた。

ガーディナーとかいう(おれは初耳の)指揮者のやつだ。

Sym Fantastique(H. Berlioz)

これが、むちゃくちゃに変だ。

ベルリオーズの幻想交響曲はいろいろな意味で変なのだが、それにしてもおかしい。

まず、この指揮者は古楽器野郎だ。でもベルリオーズは前期ロマン派だし、そこに古楽器の出る幕はあるのか?

と思うと、ライナーを読むとあるらしい。

ベルリオーズが変な点は山ほどある。まずこの男は医学生で解剖がおっかなくてドロップアウトして作曲家になったという中途半端な学歴の男で、当然のようにクラシックの英才教育を受けたわけでもなんでもない。それが理由というわけでもないだろうが、当然のように当時の作曲家だったらピアノを弾けるのに、ギターしか弾けない。

そのため、頭の中の妄想管弦楽になる(のだと思う)。しかし、ベートーヴェンマニアだ。ベートーヴェンを研究しまくる。もちろんベートーヴェンはピアノ男だ。しかし、ギター男にはピアノ男の響きは出せない。代わりにピツィカートやらはてはコルレーニョやらを多用した妙な響きで満ち溢れた曲を作ることになる。それにしても絶妙。ベルリオーズがいなければ、おそらくフランス人は交響曲に目覚めず、そうであればフランクやサンサーンスの魅力的な曲もないかも知れず、ベルリオーズがいなければ同じ主題(運命の動機よりもはるかに大きな単位)が出たり引っ込んだりを堂々とやれず当然フランクもいなければリスト(ロ短腸ソナタ)もいなくて、するとへたすればヴァグナーもいないし、というような音楽史的には革命家、作曲家としてはそれほどすごいとも思えない(リストやヴァグネルに比べれば特別な二流というところだろう)、という実におれの好みの作家である。

というような感じで、これまで結構、聴いてきた。最初に聴いたのはオーマンディがCBSで録音したやつで、今考えても立派なスタンダード(中学生のころのはずで、1月に1枚しかレコードを買えないのでそればかり聴くことになるので、ほぼ覚えたはず)、それからバルビローリとハルレのモノラル録音であらゆる弦がポルタメントするという異様なもの(アムステルダムコンセルトヘボウみたいにうまいわけではないのでずっと聴いていると酔ってしまい気持ち悪くなる)、バレンボイムの普通の名演(まったく印象がない)、そんな感じ。死ぬより遅いブーレーズは話でしか聴いたことはないが、4楽章だけはFMで聴いた記憶があってなんかテンポとか覚えているんだけど気のせいかも知れない。

ガーディナーのはそれらのどれとも異なる。異様に遅い。しかし、実際には遅くはない。響きが古楽器のせいだと思うが、途中で途切れてしまうので演奏に間が入るのではないかと思う。それにところどころにムオーンムオーンという妙な低音の笛のたぐいの音が入るのだが、なんだかさっぱりわからない。

しかも、それが結構に魅力的なのだ。古楽器と現代楽器の軋みというようなことを標榜しているらしいが、軋みというよりももっと遥かに肯定的な響きがある。

それにしてもムオーンがなんだかわからなくて気持ち悪い。多分、オフィクレドかセルパンとからしいが、そう書かれていてもさっぱりわからないし、やたらに想像力が刺激される。

で、アマゾンで眺めるとDVDが出ているのだな、これが。

ベルリオーズ:幻想交響曲 [DVD](ガーディナー(ジョン・エリオット)/ベルリオーズ/オルケストル・レヴォリュショネール・エ・ロマンティーク)

きっとこれを手に入れればムオーンムオーンがなんだかわかるに違いないと思う反面、それほどには幻想交響曲という曲は好きじゃないんだよなぁとも思うわけで、これも迷うなぁ。

本日のツッコミ(全2件) [ツッコミを入れる]
_ 清水 (2009-08-25 21:30)

ガーディナー版は実家に置いてきて今聴けないのですが、<br>オフィクレイドは、4,5楽章だけに出てくるはずです。<br>オフィクレイドの音は聴けます。http://www.ophicleide.com/。ロンドンサーペントトリオのCDも存在して好きだったのですが、もう手に入らないのでしょうか。http://www.whitecottagewebsites.co.uk/lst/index.html

_ arton (2009-08-26 01:53)

そうです。4楽章からです。あらためてきちんと聴くとムオーンというよりはブホーという音ですね。残念ながら教えていただいたページの楽器と同じかどうかは僕にはわからなかったですが。<br>ロンドンサーペントトリオも初めて見ましたが、写真を見ると実におもしろい楽器ですねぇ。どうもありがとうございます。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|

ジェズイットを見習え