カテゴリー別アーカイブ: Gadget

Squeezebox Touch の日本語表示

Logitech のネットワーク音楽プレーヤーである Squeezebox Touch は、なぜか日本では未発売である。時期にもよるようだが、現在は Amazon.com から購入することができる。6/16に注文して6/20にはもう到着した。

日本で未発売であるせいか購入時点では音楽データの中の日本語を表示することができず、日本語の部分は四角の枠として表示されてしまう。

これは単に、インストールされているフォントの問題であって、日本語の文字を含んだフォントファイルと置き換えれば日本語が表示される、というのはちょっと検索するだけですぐわかるし、手順についても同様である。Squeezebox Touch は Linux ベースのようで、ssh でログインすることができるので、情報さえあればそれほどややこしいことはない。

なので、何が問題かというと、どのフォントを入れるのが良いか、という点だ。

再生する音楽ファイルは、主に、クラシックと JPOP なので、日本語が表示できるというのはもちろんではあるが、ウムラウトなどアクセント記号を含んだラテン文字なども、見栄え良く表示してくれないと困るのである。

また、Squeeze Touch 内で使用されるのは、FreeSans と FreeSansBold というように、レギュラーとボールドの2書体が使用されるので、出来れば日本語のボールドの書体も揃っているフォントが望ましい。この条件をつけると、選択肢がぐっと狭まってしまう。

そんな条件で、色々と探して見つけたのが、MigMix(ミグミックス)フォントである。

日本語のボールド書体も備えており、不足する文字をIPAフォントから持ってきているので、表示可能な文字種に不足はないようだ。また、アクセント記号付きのラテン文字とのバランスも問題なさそう。

フォントの入替は、Squeeze Touch で ssh ログインを有効にし、下のようにフォントを scp でSqueezeTouch に転送してリネームすれば良い。もちろん、実行する際には、ディレクトリの実際の構造やファイル名などを確認してから作業することをすすめる。

$ scp MigMix-1P-regular.ttf  MigMix-1P-bold.ttf root@xxx.xxx.xxx.xxx:/usr/share/jive/fonts/
Password:XXXXXX
$ ssh root@xxx.xxx.xxx.xxx
Password:XXXXXX
# cd /usr/share/jive/fonts
# mv FreeSans.ttf FreeSans.ttf.orig
# mv FreeSansBold.ttf FreeSansBold.ttf.orig
# mv MigMix-1P-regular FreeSans.ttf
# mv MigMix-1P-bold.ttf FreeSansBold.ttf

IP アドレスとパスワードは伏字にしてある。Squeeze Touch のパスワードは、ssh ログインを有効にするときに本体画面に表示される。

最初は、複数のフォントをコピーしておいて、様子を見ながら切り替えて試していこうかと思ったのだが、思ったより本体の記憶容量が小さかったので断念した。MigMix フォントは上記の2ファイルの合計で6.5MB 程度なのであるが、それでもインストールしたらディスクの使用量が 20% 程度だったのが 50% を 超えてしまった。

使用感としては、日本語だけでなくラテン文字も含めて違和感なく、なかなかいい感じである。文字が横スクロールするときに、(おそらく処理が間に合わなくて)日本語の表示がやや乱れるが、ここは仕方のないところだろう

pkgsrc/audio/squeezeboxserver (2)

Amazon.com で注文した Squeezebox Touch が届いたので、早速つなげてみると、動いていたと思っていた squeezebox server が実は全然といってもいいほど動いていなかったので、がっくり。

いろいろ調べたり試したりしてなんとか動くようになったので、そのまとめを記す。

まず、起動時のエラー。ロケールの設定に失敗して、UTF-8 であるべきところが C にフォールバックしている。

Your locale was detected as C, you may have problems with non-Latin filenames. Consider changing your LANG variable to the correct locale, i.e. en_US.utf8

エラーメッセージでは環境変数 LANG に en_US.utf8 を設定すれば良いかのように見えるが、LANG ではなく LC_CTYPE に、そして、NetBSD 上で有効な en_US.UTF-8 を設定する必要がある。

対策は、下のように /etc/rc.conf に squeezeboxserver_env を追加して、squeezeboxserver の実行時に環境変数 LC_CTYPE が en_US.UTF-8 にセットされるようにする。

squeezeboxserver=YES    squeezeboxserver_env="LC_CTYPE=en_US.UTF-8"

次は /var/lib/squeezeboxserver/cache/mysql-error-log.txt 内のエラー。
テーブル mysql.servers がないと言っている。

[ERROR] Can’t open and lock privilege tables: Table ‘mysql.servers’ doesn’t exist

エラーメッセージのとおり、MySQL のテーブル mysql.servers が定義されていない為に生じる。通常は始めから存在するもののようなので、何らかの理由で初期化が不十分だったのだろう。

対策は、テーブル mysql.servers を手動で作成する。squuezeboxserver の MySQL 設定ファイルを明示的に指定して
mysql に接続し…

$ sudo mysql --defaults-file=/var/lib/squeezeboxserver/cache/my.cnf mysql

…下のように、テーブル作成のコマンドを発行する。

CREATE TABLE `servers` (
-> `Server_name` char(64) NOT NULL,
-> `Host` char(64) NOT NULL,
-> `Db` char(64) NOT NULL,
-> `Username` char(64) NOT NULL,
-> `Password` char(64) NOT NULL,
-> `Port` int(4) DEFAULT NULL,
-> `Socket` char(64) DEFAULT NULL,
-> `Wrapper` char(64) NOT NULL,
-> `Owner` char(64) NOT NULL,
-> PRIMARY KEY (`Server_name`)
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='MySQL Foreign Servers table';

最後は、フォルダのスキャン時に、下のようなエラーが出て、スキャンが途中で止まってしまう、というものである。ログは /var/log/squeezeboxserver/scanner.log に記録されている。

DBI Exception: DBD::mysql::db begin_work failed: Already in a transaction at /usr/pkg/lib/squeezeboxserver/Slim/Schema/Storage.pm line 86

これは DBIx::Class の仕様が変更されたために生じるらしく、少なくとも DBIx::Class の 0.08123 で障害が発生する。

ソースと対策は FreeBSD の ports/148318 より、squeezeboxserver のファイルを以下のように修正し、スキャン時の AutoCommit を無効にする。

--- /usr/pkg/lib/squeezeboxserver/Slim/Schema.pm.orig
+++ /usr/pkg/lib/squeezeboxserver/Slim/Schema.pm
@@ -274,11 +274,15 @@
# For custom exceptions
$class->storage_type('Slim::Schema::Storage');
+       # Don't use autocommit mode for the scanner.
+       # Needs to be set here as setting dbh->{'AutoCommit'} = 0 later
+       # confusing the transaction nesting logic.
+       my $AutoCommit = (main::SCANNER ? 0 : 1);
my $on_connect_do = $sqlHelperClass->on_connect_do();
$class->connection( $dsn || $source, $username, $password, {
RaiseError    => 1,
-               AutoCommit    => 1,
+               AutoCommit    => $AutoCommit,
PrintError    => 0,
Taint         => 1,
on_connect_do => [
--- /usr/pkg/lib/squeezeboxserver/scanner.pl.orig
+++ /usr/pkg/lib/squeezeboxserver/scanner.pl
@@ -236,9 +236,6 @@
main::INFOLOG && $log->info("Squeezebox Server Scanner done init...\n");
-       # Take the db out of autocommit mode - this makes for a much faster scan.
-       Slim::Schema->storage->dbh->{'AutoCommit'} = 0;
-
my $scanType = 'SETUP_STANDARDRESCAN';
if ($wipe) {

以上。

(追記) この話は pkgsrc-2011Q1 によるものである。