3月 12

3月3日にリリースされていたSqueezeCenter 7.0を新しいサーバにインストールしました.SqueezeCenterはSlimServerの名称が変更になったものですが,バージョン7.0ではインタフェースが一新されました.

Vine Linux 4.2へのインストールですが,一筋縄ではいきません. 本当はインストール手順を書きたいところなのですが,インストール自体が試行錯誤だったので,インストールが成功したときの状態しか記述できません. オフィシャルサイトで配布されているRPMパッケージは動作しませんでした. 後で調べてみたら,スタートアップスクリプトにOSのチェックが入っているのが理由だったのですが,それを回避するだけで動作するかどうかは不明です. どうせ,Shift_JISのキューシートを使うためには,ソースコードを変更しなければならないので,RPMではなく,手動でインストールした方がやりやすいと思います.

SqueezeCenterのインストール先は /opt/squeezecenter-7.0 としました. ソースコード squeezecenter-7.0.tgz をダウンロードして,このディレクトリに解凍しました. 本当は,

$ cd /opt/squeezecenter-7.0
$ Bin/build-perl-modules.pl
とするだけで,必要なPerlモジュールをビルドできるはずなのですが,Vine Linux 4.2で配布されているPerlモジュールをできるだけ使いたかったので,以下のパッケージをインストールしました.本当は必要ないものが混ざっているかも知れませんが.

  • perl-ExtUtils-CBuilder-0.18-0vl1
  • perl-Module-Build-0.2806-0vl1
  • perl-HTML-Template-2.7-0vl2
  • perl-CGI-Session-4.14-0vl2
  • perl-FreezeThaw-0.43-5vl1
  • perl-DBD-Pg-1.49-0vl3
  • perl-GD-2.35-0vl1
  • perl-Digest-SHA1-2.11-1vl1
  • perl-DBD-MySQL-4.001-0vl1
  • perl-DBI-1.53-0vl1
  • expat-devel-1.95.8-0vl5
  • MySQL-devel-5.0.27-0vl3

次に,build-perl-modules.pl をテキストエディタで開き,packages配列変数の定義のところで,’Encode::Detect’, ‘JSON::XS’, ‘YAML::Syck’ 以外の部分を # でコメントアウトします. そして,Bin/build-perl-modules.pl を実行し,上記の3つのモジュールのみをビルドします. いったん,

$ ./slimserver.pl
を実行し,http://localhost:9000/ でSqueezeCenterにアクセスできるかどうか確認します. コンソールにエラーが表示されるようであれば,そのエラーメッセージから類推して必要なパッケージのインストールを行います(たぶんここが一番難しい).

/etc/init.dにsqueezecenterというスタートアップスクリプトを作成します.

#!/bin/sh
#
# squeezecenter Startup script for the SqueezeCenter Music Server.
#
# chkconfig: 2345 80 30
#
# description: SqueezeCenter powers the Squeezebox, Transporter and SLIMP3
#              network music players and is the best software to stream
#              your music to any software MP3 player. It supports MP3, AAC,
#              WMA, FLAC, Ogg Vorbis, WAV and more!

#
prog="SqueezeCenter"
SQUEEZECENTER_CONFIG=/opt/squeezecenter-7.0/sysconfig

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

test -r $SQUEEZECENTER_CONFIG || exit 0

. $SQUEEZECENTER_CONFIG

test -x $SQUEEZECENTER_BIN || exit 0

# See how we were called.
case "$1" in
  start)
        # Start daemons.
        echo -n $"Starting $prog: "
        daemon --user $SQUEEZECENTER_USER $SQUEEZECENTER_BIN $SQUEEZECENTER_ARGS
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch $SQUEEZECENTER_LOCKFILE
        ;;
  stop)
        # Stop daemons.
        echo -n $"Shutting down $prog: "
        killproc $SQUEEZECENTER_BIN
        [ $? = 0 ] && success $"$prog stopped" || failure $"$prog stopped"
        echo
        rm -f $SQUEEZECENTER_LOCKFILE
        ;;
  restart)
        $0 stop
        $0 start
        ;;
  status)
        status $SQUEEZECENTER_BIN
        ;;
  *)
        echo "Usage: $0 {start|stop|restart|status}"
        exit 1
esac

exit $RETVAL

このスクリプトは,/opt/squeezecenter-7.0/sysconfig という設定ファイルが必要なので,以下に習って記述します.

# Edit this to suit your setup
SQUEEZECENTER_USER="squeezecenter-user"
SQUEEZECENTER_HOME="/opt/squeezecenter-7.0"
SQUEEZECENTER_BIN="${SQUEEZECENTER_HOME}/slimserver.pl"
SQUEEZECENTER_LOCKFILE="${SQUEEZECENTER_HOME}/lockfile"
SQUEEZECENTER_CFG_DIR="${SQUEEZECENTER_HOME}/prefs"
SQUEEZECENTER_LOG_DIR="${SQUEEZECENTER_HOME}/log"
SQUEEZECENTER_CACHE_DIR="${SQUEEZECENTER_HOME}/cache"
SQUEEZECENTER_ARGS="--daemon --prefsdir=$SQUEEZECENTER_CFG_DIR --logdir=$SQUEEZECENTER_LOG_DIR --cachedir=$SQUEEZECENTER_CACHE_DIR"

"squeezecenter-user"の箇所には,SqueezeCenterを動作させたいユーザー名を入れます.

最後に,

$ /etc/init.d/squeezecenter start
とやれば,SqueezeCenterが起動するはずです.

3月 12

秋葉原のあるショップで,ジャンクのLet’s note CF-T2を19,800円で購入し,自宅サーバー(第3世代目)を構築しました.この機種を選んだポイントは,

  • CPUアイドル時は,10W前後の省電力らしい(自分で測定したわけではないので)
  • Pentium M 1GHzのハイパフォーマンス.CPUのクロックは動的に制御可能
  • ディスプレイが付いているので,インストールやメンテナンス作業が楽
  • PanasonicのACアダプタは,たいていThinkPadのものと互換性がある
  • 値段が安い
です. 購入したノートPCはハードディスクが取り外されており,BIOS画面のみ動作確認ができましたが,お店の人には「保証なし,返品不可」と念を押され,ちょっとした冒険でした.購入してからMemtest86でメモリのエラーがないことを確認し,新たに購入した120GBの内蔵ハードディスクを取り付けたら,すんなりとVine Linux 4.2が動作しました.

Vine Linux 4.2をインストールしたら,デフォルトでSpeedStepが有効になっていて,CPUが600MHzのダウンクロックで動作していました.また,Vine Linuxには,Let’s noteシリーズのホットキー(Fn+[F1]などで液晶の明るさを変更する機能)を動作させる,kernel-module-pcc-acpi が用意されていて,至れり尽くせりでした.SqueezeCenterのインストールはRPMを導入するだけではうまくいかず,結構大変でしたが,日本語の表示などは問題なく行えました.これに関しては,また後で日記を書きます.

こんな高性能のサーバーが総額3万円以下で買えるとは,恐るべし秋葉パワー.

ノートパソコンをサーバーにするときに便利なtips(自分用メモ).

リモートで液晶のバックライトを消灯するコマンド
i810switch lcd off
2月 24

iPodがメインプレイヤーになったこともあって,Nero AAC Encoderを使ってMP4を作成する機会が多くなりました. iTunesを使わずにiPodで聞くコンテンツを準備する際に悩ましいのは,「①プレイヤーへのファイル転送」「②ギャップレス再生問題」「③タグの編集環境の不足」です. iPodはMP4ファイルをプレイヤーにコピーしただけでは,再生可能なコンテンツとして認識しないため,問題①が生じています. しかし,まだリリースしていないあるソフトウェアで,この問題をある程度解決できています. 問題②は,Nero AAC EncoderがiTunes互換のギャップレス情報を生成しないということです.しかしながら,foobar2000ではギャップレス再生ができていること,iPod上でのギャップレス再生の管理がiTunesDBで行われていることから,①の問題を解決するときに,研究次第では何とかなりそうです.

今回のお話は問題③についてです. WindowsのコマンドラインからMP4のタグ編集を行うツールとして,

あたりが選択肢だと思うのですが,Nero AAC付属のツールはcompilationアルバムのフラグ(cpilアトム)が作成できません. MPEG4IPを利用するコマンドラインツールは,ほとんど見かけないのですが,自分でコーディングしてみたところ,MPEG4IPでは読み込めるけど,Nero AAC, foobar2000, AtmicParseleyでは読み込めないMP4が作成されてしまいました. また,MPEG4IPは開発が終了してしまったようで,誰かがプロジェクトを引き継がない限り,今後のアップデートは見込めません. AtmicParseleyは,もともとPOSIX向けに書かれたコードになっていて,Windowsにおける動作に難があります. 自分が試したときは,頻繁にクラッシュが発生して使い物になりませんでした.

CueProcのプラグインとして,MPEG4IPやAtomicParseleyを利用するものを準備してはあるのですが,動作に難があるので無効にしています. libmp4v2のインタフェースは,この前のリリースでかなり豊富になったので,タグ書き出しを誰かデバッグしてくれると有難いのですが….

2月 24

CueProc 1.10をリリースしました. 変更点は以下の通りです.

  • 必要に応じて変数値に含まれる ‘&’, ‘< ', '>‘, ‘|’ をダブルクォーテーションで囲むようにした.
  • キューシートにCATALOGフィールドが存在するときは読み出す.
  • キューシートにCATALOGフィールドが存在するときは読み出す.
  • アートワークのイメージを変数値として解釈するようにした.
  • UTF-8, UCS-16, UCS-32のBOMを自動認識するようにした.
  • FLAC, Nero MP4/AACファイルを生成するときにアートワークを書き出すようにした.
  • キューシートのファイル名が${filename}.cueのとき,${filename}.jpg, ${filename}.jpeg, ${filename}.png, ${filename}.gifをアートワークの画像ファイルの候補として認識するようにした
  • ハハハハ様から提供して頂いたソースコードに基づき,”lame_eyed3″という新しいプラグインを導入した.基本的にlame.exeでMP3ファイルをエンコードしますが,タグの書き出しにeyeD3というPythonライブラリを採用し,ID3v2.3のユニコードタグを作成します.
  • ハハハハ様から提供していただいたコードを参考にして,ソースコードを整理した.

ハハハハ様,いろいろと参考になるコードを提供していただき,ありがとうございました.

2月 20

サイトの構成をblogメインに戻しました.XOOPSの機能をほとんど活用していなかったこと,XOOPSのblogシステムとして使っていたモジュールの開発が,事実上休止状態にあるのが理由です.

古い日記やコンテンツは新しいblogシステムにインポートし,旧アドレスへのアクセスをHTTP 301で転送するようにしました.検索エンジンが各ページの移転をきちんと認識してくれるかどうか,楽しみです.

近日公開予定のCueProc 1.10は新しいサイトで公開したかったので,ちょっと頑張ってみました.

1月 18

Squeezebox Duetが良さげ.リモコンの設置に場所を取るのがちょっとマイナスだけど,買いたい.ITmediaの記事によると,夏くらいまでに国際対応が完了するとのこと.日本では簡単に購入できなくなってしまったSqueezeboxですが,日本国内でも販売という運びになるとよいですね.

さて,個人輸入をするか…,それとも夏にアメリカに行ける(かもしれない)のを待つか….

—–
1月 17

あまりにも遅くなりましたが,今年もよろしくお願いします.昨年の中盤以降から本気で仕事に打ち込んでいるのと,圧縮音楽界隈が冷え込んできている影響で,日記をまったく更新できませんでした.

最近の近況をちょっとだけまとめると,

  • メインで使っている音楽プレイヤーはiPod nano (1st gen)
  • メインで使っているエンコーダはNero AAC
  • 夜はSqueezeBox 3でインターネットラジオを聴きながら仕事をする毎日
  • 買っている音楽CDは洋楽ばかり
  • 日本の音楽はレンタルすらしなくなった

最近の活動(といってもここ3か月は動き無しでしたが)をまとめると,

  • PMPlibはiPod nano 3rd genのデータベース作成に成功している
  • PMPlibでiPod nano 3rd genにアートワークを表示させようと頑張っていたところ,実装上の問題に気付いて悩む
  • おそらくPMPlibからiPodのサポートをはずして,別のアプリを作る道に進んだ方がみんなハッピーになりそうということで,その結論を自分の中で出した後,次の一歩をまだ踏み出しておらず停滞
  • CueProcはここ1か月くらいでみんなの要望を集めて修正版を出すつもり
  • このサイトの再構築も検討中

まぁ今年もぼちぼちやっていきますので,よろしくお願いします.

9月 17

先日日記に書いたiTunesDBのハッシュ値問題ですが,#gtkpodの人たちが早くも解決してしまいました.

#gtkpodのwtbwという人が,ハッシュ値を求めるプログラム (Win32) を公開しています.使い方は,Making New iPods work in Linux!にまとめられています.使うときは,

  1. USBからSerial Stringを取得してソースコードを書き換える(Windows使いの人には至難の業.DDKに含まれているviewusbプログラムで取得できます)
  2. サイズが188バイトの新しい"mhbd"チャンクを書き出せる同期ソフトウェアを使わなければならない
  3. バイナリエディタで自分の手でハッシュ値(オフセット0×58から20バイト)を書き込む

ということに注意してください.

特に2.が,普通の人には大変のような気がします.古い"mhbd"チャンクは,サイズが小さくて0×58から20バイトを書き込むスペースがありません.下手をすると,"mhsd"という子チャンクを上書きしてしまいます.しかし,libgpodのSVNのコードを見ても,古い"mhbd"チャンクしか書き出さないようで,どのソフトウェアを使えばよいのか結局分かりませんでした.

仕方がないので,PMPlibのコードを最新の"mhbd"チャンクに対応させて実験しました.公開されているコードを使ってハッシュ値を求め,バイナリエディタで編集してiPodの接続を解除すると,今まで0曲としか表示しなかったiPodが,ちゃんと動作するようになりました.早速,上で公開されているコードをPMPlibにマージして,Windows上からiPod nano 3rd genのiTunesDBを書き出せるようにしてあります.まだシリアルIDを自動取得できないので,iPod nano以外の機種では動作しないと思います.

このハッシュ値を求めるコードですが,これは私に手に負える代物ではないですね.テーブルを引いたり,LCMを求めたり,XORを取ったり,暗号の専門家はこういうのが簡単に分かるんでしょうか.世界にはすごい人がたくさんいるんだと,改めて差を思い知らされました.

追記: PMPlibで作ったiTunesDBは曲の選択がうまくいかないことがあるようで,もう少し新しいデータベースフォーマットの研究をしなければならないようです.

—–
9月 15

ネタ元は HAのスレッド.私にとっては大問題です.

iPodは,/iPod_Control/iTunes/iTunesDB というファイルに書き込まれている音楽情報データベースを読み込んで,音楽や動画を再生します.他のMSCのプレイヤーと異なり,iPodはこのiTunesDBが正しく作られていないと,動作しません.通常,このiTunesDBファイルはiTunesが自動的に作成してくれるので,たいていのユーザーはこういう技術仕様を意識することなく,iPodを使うことができます.

実は,iTunesDBファイルの仕様はすでに解析されていて,詳細なレイアウトが公開されています.私は,この仕様の内容を参考にして,PMPlibにiTunesDB用のデータベース管理ライブラリをコーディングし,私が持っているiPod nano 1st genではきちんと動作することを確認しています.今回iPod nano 3rd genを購入したのも,(多少の修正は必要かもしれないが)PMPlibを使ってiPodを使えることを目論んでいたからです.

しかし,Apple cuts us offでは,iTunesDBの"mhbd"チャンク(ファイルの先頭にあるチャンク)の0×32と0×58に,160bitのSHAのハッシュらしきものが書き込まれていると報告しています.このハッシュ値を正しく生成して書き込まないと,正しいレイアウトのiTunesDBを生成してもiPodが認識しません.PMPlibが動作しなくなったのも,このAppleの改悪の仕業だったようです.

私も,iTunesが作成したiTunesDBの中身で,曲名など全体の構造を破壊しない部分の1バイトを改変する実験をしてみました.編集したのはアルバム名の1文字を変更しただけなのに,見事にiPodが動作しなくなります.この実験からも,ハッシュ値らしきもので保護されているのは100%間違いないと思います.

幸いなことに,iTunesDB全体が暗号化されているわけではないので,iTunesのコードをダンプしてSHAを生成している部分を探す(OpenSSLのコードを使っているっぽい)か,iTunesのプロセスを監視してメモリを書き出すなどをして,ハッシュ値の生成方法を見つけるのは,不可能でないと思います.スキルやノウハウのある人は,ぜひハッシュ値の生成法を見つけてみてください.

あと,このiTunesDBの仕様変更で,

  • WinampやMedia Monkeyなどのサードパーティのソフトウェアを使ってiPod nano 3rd genを使う
  • LinuxでiPod nano 3rd genを使う

のは,当分無理だと思いますので,注意が必要です.他のiPodも,ファームウェアのバージョンが上がると,新しいiTunesDBに移行してしまう恐れがありますので,注意してください.

—–
9月 13

iTunes Storeに注文してから4日で届きました.早速PMPlibでデータベースの構築を試みましたが,必要な情報を書き出していないためか,うまくいきませんでした.gtkpodのSVNのコードを読んでみても,iPod nano 3rd generationをサポート出来ている形跡はないので,ちょっと自分でいろいろ実験してみる必要がありそうです.

開発を中断していたPMPlibは,とりあえずiPod nano 3rd generationへの対応と,MP3のギャップレス情報のサポートを加えたら,リリースするように目標を設定しようと思います.本当はAlbumArtをなんとかしたかったのですが,それを始めると終わらなそうなので….

新iPod nanoはあんまり使っていないので,レポートはできませんが,「さすがはUIのアップル」といった感じです.MP4のエンコーダの音はかなり良くなってきているし,これでiTunesを介さずに音楽が聴けるようになったら最強だと思います.

—–