« 2007年12月 | トップページ | 2008年2月 »

2008年1月

ディスコグラフィ作成:いよいよ検索用CGIスクリプトの作成

ディスコグラフィ作成も、PC上でのデータ入力や辞書作成のツールは完成の域に達し、CDデータの入力も辞書作成も一段落し、いよいよ検索用CGIスクリプトの作成に取り掛かることになった。

が、Perlを使うのは数年ぶり、PerlでUnicodeを使えるのかも良く知らない・・・。ということで、まずはPerlでUnicodeを使えるか、使えるならば何に気をつけるべきか、といったことをWebで検索してみて、どうやらそれほど難しくはなさそうであることだけは「なんとなく」分かった。

それではと、ごちょごちょコードを書いていくうちに、どうにか検索CGIができてしまった。予想通り、Perlの細々としたテクニックはかなり忘れてしまっていたが、昔書いた掲示板のCGIスクリプトを読み返して思い出したりした。

PerlでUnicode(厳密にはUTF8エンコード文字列)を扱う方法として、とりあえず分かったこと。

  1. (当然といえば当然だが)スクリプトをUTF8で記述しておく。
  2. スクリプトの先頭にuse utf8; と use Encode; を記述しておく。
    →どうやら、これでスクリプトでUTF8文字列を使うよう設定され、文字コード変換のサブルーチンが使用できる、らしい・・・。
  3. binmode STDIN, ':bytes'; で、標準入力からのデータに文字コードを仮定させない。また、標準入力から読み込んだCGIパラメータは、入力がUTF8文字列の場合、
    $data = decode('utf8', $data);
    のようにして、Perlに認識させる。
  4. open File, '<:encoding(utf8)', 'sample.txt';
    とすると、読み込み元のファイルの文字コードを指定できる。
  5. binmode STDOUT, ":encoding(shiftjis)";
    または
    binmode STDOUT, ":encoding(utf-8)";
    のようにすると、標準出力への出力データは自動的に文字コード変換される。

ざっと、こんなところだろうか。PerlでUTF8を使う方法の詳細については、以下のサイトを参考にしていただきたい。
Perl 5.8.x Unicode関連
perl 5.8における日本語コード変換のメモ
perl5.8のUnicodeサポート

1ヶ月ちょっと続いたディスコグラフィ作成は、これで一通り終わり、後はCDデータの追記と、定期的に同義語辞書の拡充を行い、CGIスクリプトの出力の体裁を整えるだけとなった。

| | コメント (0) | トラックバック (0)

ディスコグラフィ作成:同義語辞書の作成

ディスコグラフィ作成に取り組み始めて1ヶ月を経過。もはやちょっとしたプロジェクトと化してきた感があるが、ようやく同義語辞書の作成にかかることができるようになった。

辞書のファイル構造は、

ルードヴィヒ・ヴァン・ベートーヴェン  Ludwig van Beethoven
弦楽四重奏曲  String Quartet Streichquartett Quatuor à cordes
Martha Argerich マルタ・アルゲリッチ
....

といった具合に、1行に同じ意味の単語を羅列している。C++で記述するオブジェクト構造も基本的には、

CSynonymEntryクラス  ファイルの1行を表現し、単語の羅列を保持する。
CSynonymDicクラス  辞書全体を表現し、複数個のCSynonymEntryオブジェクトを保持する。

という構造であるが、CSynonymEntryクラスは、単語の保持以外にいくつか機能を追加したいので、
class CSynonymEntry : std::vector<CString>{...};
と実装した。

また、CSynonymDicクラスは、ある単語が辞書に登録されているか調べる必要があることと、ファイルに記述したイメージ通りデータを保持しておく必要があることから、

typedef boost::shared_ptr<CSynonymEntry> CSynonymEntryPtr;

class CSynonymDic
{
private:
    class CDictionaryOrder{
    public:
        bool operator()( const CString& lhs, const CString& rhs ){...}
    };
   typedef std::map<CString,CSynonymEntryPtr,CDictionaryOrder> CSynonymMap;

    CSynonymMap                            mxDictionary;
    std::vector<CSynonymEntryPtr>    mxEntries;
public:
    CSynonymDic();
    ~CSynonymDic();
    //その他メンバ関数
};

と記述した。つまり、単語が辞書に登録されているか調べる目的に、map<CString,CSynonymEntry*>を用意し、ファイルに記述したイメージ通りデータを保持しておく目的から、vector<CSynonymEntry*>を用意した。

が、実際にはCSynonymEntry*の替わりにboost::shared_ptr<CSynonymEntry>を使っている。これはBoostというクラスライブラリで提供されている、参照カウントつきポインタを定義するshared_ptrクラステンプレートを用いているためである。
また、mapのテンプレート引数の3番目にCDictionaryOrderを指定しているが、これは独自のソート順序を定義するためである。

このようにして辞書のデータ構造を実装し、GUIを作ってひたすらデータ入力。結果、登録単語数として1600、辞書ファイルの行数として500余りになった。Perlで検索処理を行うことを考えると、単語の平均文字数の大きい行ほど前に来るようにソートしておいたほうが何かと都合が良いと考えられるので、ファイルを保存する時にソートすることにした。

あとは、Perlで検索CGIを書くだけだが、Perlを個人的用途で触るのは4、5年ぶり、業務でも3年前に30行程度のCGIスクリプトを書いたことがあるだけなので、Perl独特のクセはかなり忘れてそう・・・。

| | コメント (0) | トラックバック (0)

ディスコグラフィ作成:CDジャケット画像の縮小とWebサーバへのデータ転送

700枚余りのCDのデータ入力とジャケット写真をスキャナでJPEG画像として取り込む作業は終わり、その後買い足したCDについても、買った当日にデータ入力とジャケット取り込みをするように習慣付けるようになったので、データ入力に関しては問題はクリアできた。

しかし、CDデータを収めたUTF8形式のタブ区切りテキストファイル3つと、CD枚数と同じだけのJPEGファイル700個をFTPクライアントソフトを使ってWebサーバへ転送するのがかなり面倒・・・。
FTPクライアントソフトを使って、転送したいファイルをいちいち選択して転送するという作業自体が面倒だし、転送漏れも起こりうる。これは、データ入力ツールにFTP転送の機能も追加したほうがよさそう。これは、MFCのインターネットクラスなどを使うことで1日でサクッと作れてしまうのだった。

それともう一つ。携帯からも検索できるようにしようと考えているのでジャケットの画像ファイルのサイズを小さくしたものも用意しておきたい、という要求も出てきた。データ入力の際、スキャナからは100dpiで取り込んでいるため、大体480×480ピクセル、80~100kバイト程度のJPEGファイルが700個ある。携帯の画面サイズは(少なくとも私の持っている東芝のau向け機種では)240×320ピクセルなので最大でも200×200ピクセル程度まで画像を縮小する必要があるし、ファイルサイズも小さくないとパケット通信料も馬鹿にならない。とにかくJPEG画像を縮小したい。

最初は、オリジナルの480×480ピクセル、100kバイトのファイルをCGIで動的に縮小することを考えていたので、PerlでJPEGファイルのリサイズできるものはないかと検索してみたが、なかなか見つからない。まあ、JPEGファイルの仕様自体が、離散コサイン変換とか圧縮と言った数学的内容を含んでいて難解なので、簡単にPerlベースのソースコードを見つけようというのも無理があるわけだが・・・。

そんなわけで、CGIで動的に画像を縮小することはあきらめ、PC上で画像を縮小するためのツールやライブラリをVectorで検索してみたが、どうも見つからない。
で、いろいろ検索するうちに、ImageMagickというオープンソースのライブラリがあるらしい、ということを知り、ImageMagickの公式サイトからWindows用のインストールパッケージ(WindowsInstaller形式ファイル)をダウンロードして、インストールし、公式サイトのチュートリアルページを参考に、
「JPEGファイルを読み込み、元の1/4に縮小し、JPEGファイルとして書き出す」
というコードを書いてみたが、ファイルを読み込むところで落ちてしまう。インストールされていたサンプルコードと見比べても何が違うのか良く分からない。

仕方ないのでライブラリの全ソースを圧縮したzipファイルを公式サイトからダウンロードして展開し、ライブラリをビルド・・・してみたが、コンパイルエラーが出まくってどうしようもない。結局、インクルードファイルの中のマクロ定義を2つコメントアウトしたらビルド成功。コメントアウトしたマクロ定義は、XWindowを使うかどうかを決定するマクロと、GNOMEのxmlライブラリを使うかどうかを決定するマクロだった。ソースをダウンロードしてからビルドに成功するまで丸1日・・・。今使っているノートPCはいろんなソフトをインストールしまくっているせいかビルドがやたら遅いので、セーフモードで起動した状態でビルドする、という有様(笑)。それでもデバッグモードでのビルドに要した時間は1時間弱。今のPC、今度の3月で4年になるし、そろそろ新しいPCに乗り換える時期にきたかも。
ライブラリをデバッグモードでビルドするのに1日かかったあと、ようやくデバッグ再開。ライブラリの奥底までステップインしてようやく分かったのは、環境変数MAGICK_CODER_FILTER_PATHとMAGICK_CODER_MODULE_PATHを定義しておかなければいけない、ということだけだった。

まあ、そんなドタバタはあったものの、ImageMagickライブラリ(より厳密には、ImageMagickにアクセスするためのC++インタフェースクラスライブラリ)を使うと、非常に簡単にJPEGファイルの縮小ができた。以下にサンプルコードを示す。

#include <Magick++.h>      //このファイル1つをインクルードすればライブラリの全機能が使用可能
using namespace Magick;

int main( int argc, char **argv )
{
   InitializeMagick(*argv);   //exeファイル名を引数としてライブラリを初期化

   try{
    Image xImage;   //画像データを保持するオブジェクト

    //jpeg画像を読み込む
    xImage.read( "sample.jpg" );

    //元画像の25%に縮小
    unsigned int uWidth = xImage.columns(), uHeight = xImage.rows();  //画像の幅と高さを取得
    Geometry xGeometry( uWidth/4, uHeight/4 );  //サイズを定義するクラス
    xImage.resize( xGeometry );

    //jpeg画像を保存する
    xImage.write( "sample_small.jpg" );
   }
   catch ( Error& rxError ) {
    std::cout << rxError.what() <<std::endl; //エラーの内容を表示
   }
}

このImageMagickライブラリ、画像ファイルの読み書きとサイズ変更だけではなく、さまざまな機能を持っているらしいので、画像を扱うアプリを書く機会があれば勉強してみたいと思う。そんなことはさておき、同義語辞書を作成するためのGUIをまだ全然考えていない。うーん・・・。

| | コメント (2) | トラックバック (0)

演奏会案内:2008年2月分

2008年2月の演奏会のうち、気になるものを紹介していきます。

2008年2月16日(土)14:00 京都コンサートホール 小ホール
コスモポリタン・タイムズ Vol.3<ドイツ>作曲家の系譜~弦楽四重奏

出演
クァルテット Nats

曲目
ベートーヴェン 弦楽四重奏曲 第7番 ヘ長調 op.59-1「ラズモフスキー 第1番」
ヒンデミット   弦楽四重奏曲 第7番(1945)
シューベルト  弦楽四重奏曲 第14番「死と乙女」

ラズモフスキー1番と「死と乙女」というメジャーな作品はともかくとしても、ヒンデミットの作品を聴く機会はそうはなさそうなので、ちょっと楽しみです。

2008年2月23日(土)18:30 ザ・フェニックスホール
平成19年度相愛大学音楽専攻科修了演奏会

出演
ヴァイオリン 山口由美,岡本名那子
ピアノ    花畑沙代子

曲目
フォーレ   ヴァイオリンとピアノのためのソナタ 第1番 イ長調 op.13
デュティユー ピアノソナタ
フランク   ヴァイオリンとピアノのためのソナタ イ長調
ほか

音大の修了演奏会というのもなかなか一般では聴く機会もなさそうだし、意外にもフォーレのソナタを実演で聴いたことがないので行ってみたい演奏会です。

2008年2月24日(日)14:00 いずみホール
待兼交響楽団 第20回記念定期演奏会

指揮 井村誠貴

曲目
モーツァルト 交響曲 第36番 ハ長調 K.425「リンツ」
マーラー   交響曲 第9番 ニ長調

待兼交響楽団はちょっと前にネットで調べたところ、関西一円の大学オケ経験者が結集したアマチュアオケだそうです。
普段は室内楽とピアノ曲以外のものをほとんど聴かないですが、マーラーの9番はクラシックを聴き始めるきっかけになった曲なので思い入れがあり、楽しみです。

| | コメント (0) | トラックバック (0)

演奏会レポート:ベートーヴェン弦楽四重奏曲 中・後期8曲演奏会

10月頃にたまたま東京文化会館のWebサイトで見つけた、ベートーヴェンの中期、後期弦楽四重奏曲をぶっ通しで演奏するという演奏会に出かけてきました。

2007年12月31日 東京文化会館 小ホール

曲目
弦楽四重奏曲 変ホ長調 op.74 「ハープ」
弦楽四重奏曲 ヘ短調 op.95 「セリオーソ」
弦楽四重奏曲 変ホ長調 op.127
弦楽四重奏曲 変ロ長調 op.130
弦楽四重奏曲 変ロ長調 op.133 「大フーガ」
弦楽四重奏曲 変ロ長調 op.131
弦楽四重奏曲 変ロ長調 op.132
弦楽四重奏曲 変ロ長調 op.135

演奏者
クァルテット・エクセルシオ (op.74,op.95)
澤クァルテット(op.127,op.130,op.133)
古典四重奏団(op.131,op.132,op.135)

開演が午後3時、終演予定が午後9時ということで、会場にはタイムテーブルが貼り出されていました。
Ts360011
(携帯で撮ったので手ブレしています・・・)

「ハープ」と「セリオーソ」では、京都からの移動の疲れが出たのか、まだ完全に音楽を聴くモードに入っていなかったようで、あまり集中して聴けず、所々で居眠りしてしまいました。クァルテット・エクセルシオの皆さん、ごめんなさい・・・。

プログラムが進んで、op.127から「大フーガ」までは澤クァルテット。2000年から2001年にかけてのベートーヴェン弦楽四重奏曲全曲演奏チクルスでの充実した演奏が印象に残っていたのですが、op.127とop.130では、テンポが遅く、少しだれ気味?、という印象を持った演奏でした。
「大フーガ」では曲自体の助けもあって、緊張感のある好演でした。

プログラムの最後3曲、op.131,op.132,op.135は古典四重奏団の演奏でした。たしか2000年頃に相次いでベートーヴェン後期四重奏曲のCDをリリースしていて、レパートリーは全て暗譜で演奏する団体、ということで一度は実演を聴いてみたいと思っていた団体でした。
op.131は第1楽章のアダージョの悲壮感あふれる雰囲気で一気に曲の世界に引き込まれました。第5楽章プレストが異常なくらい速い演奏だったのを特筆すべきかもしれません。
op.132で圧巻は第3楽章、「病が癒えた者の神に捧げる感謝の歌」と「新しき力を感じつつ」の音楽。会場全体が崇高な世界に連れて行かれた、と感じさせる瞬間でした。
6時間に及ぶプログラムの最後を飾るop.135は前の2曲に比べれば小粒であっさりした曲ではありますが、この曲の第3楽章もまた、op.132の第3楽章の時の再現のように、崇高な世界を垣間見せるものでした。第4楽章のコーダが終わると、延々と拍手が鳴り止みませんでした。

6時間のプログラムを聴き終えてみると、古典四重奏団が飛び抜けてよかった。古典四重奏団は、1月と3月の2回に亘ってびわ湖ホールでop.131とop.132、そしてラズモフスキーセットも演奏されるので期待が膨らみます。
終演後、「もし今度の大晦日にも開催されるのであれば、ラズモフスキーも演奏して欲しい」と思ってしまったのでした。

| | コメント (0) | トラックバック (0)

« 2007年12月 | トップページ | 2008年2月 »