月別アーカイブ: 2011年6月

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/mail/p5-Mail-IMAPClient

pkgsrc でインストールした imapsync (pkgsrc/mail/imapsync) を動かしていたら、下のようなエラーが出ていた。

Use of uninitialized value $_ in uc at /usr/pkg/lib/perl5/vendor_perl/5.12.0/Mail/IMAPClient.pm line 2630.

調べてみると、imapsync が依存する Perl module である Mail-IMAPClient-3.23 (pkgsrc/mail/p5-Mail-ImapCleint) のバグで、3.24 では修正済みの問題らしい。

pkgsrc-2011Q1、pkgsrc-HEAD のどちらもこの問題に対する対応はされていないようだ。

いずれ pkgsrc/mail/p5-Mail-ImapCleint でインストールされるバージョンが上がれば解決する問題なので、手元にインストールされているファイルを修正して対応することにした。

--- IMAPClient.pm.orig
+++ IMAPClient.pm
@@ -2627,7 +2627,7 @@
if ( ref($v) eq "SCALAR" ) {
push( @ret, $$v );
}
-        elsif ( exists $SEARCH_KEYS{ uc($_) } ) {
+        elsif ( exists $SEARCH_KEYS{ uc($v) } ) {
push( @ret, $v );
}
elsif ( @args == 1 ) {

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 によるものである。

サーバの引越し(6) MX

前回のエントリの最後で、uconst.org の MX が記述できないことを書いた。誤解がないように、もう少し詳しく説明する。

まず、さくらのレンタルサーバでは、バーチャルドメインの指定をすることで、指定したドメインのメールを自分宛のメールとして受け取ることが出来るようになる。

つまり、バーチャルドメインとして example.org を指定すれば、example.org 宛のメールが受信可能となる。

しかし、バーチャルドメインとして www.example.org を指定するなら、受信可能なメールは www.example.com 宛であって、 example.com 宛ではない。

であるので、uconst.org 宛のメールを受信したければ、バーチャルドメインには uconst.org を指定して、ドメイン全体を管理すべきである。さくら的には。

ドメインには他のホストもあるので、ドメイン全体をさくらで管理するわけにはいかない。

メールを受け付けるドメインを、DNSの設定とは別に追加できるようになっているとよかったのだけれど。

やむを得ないので、MX はフリーのメール転送サービスに向けて、そちらから www.uconst.org に転送することにした。

サーバの引越し(5) DNS

このサイトの今のレジストラは お名前.com にしている。以前は海外のレジストラで登録していたのだけれども、お名前.com の方が料金が安いので、1年程前にレジストラ移管の手続きを行った。

切り替えたときは、自前のサーバを運用していたので、プライマリDNSも当然のように同じサーバで運用していた。そもそも切り替え以前のレジストラでは、DNSサーバを自前で用意するシステムだったので、他の選択肢はなかった。
このとき、セカンダリDNSはフリーのサービスを利用していた。

今回の引越しでは、公開サービスとしての自前のサーバはなくなってしまうので、プライマリDNSをどうするかを決めなくてはならない。

選択の際に重視したのは、コストと安定性。

まず、フリーのサービスをいくつか試してみたが、安定性に欠けるものや、登録内容が反映されないようなものしかなく、候補に残るものはなかった。原因が自分のオペレーションにあるかもしれないので、試して駄目だったサービスをここに記述することはやめておく。確認したのは当該サービスの質の良し悪しではなく、単に、オペレータである私との相性が悪かったというだけのことである。

お名前.com にもプライマリDNSのサービスがあり、レジストラをして利用しているので無料で利用出来る。操作は簡単だが、登録できる内容には制限があるようだ。

一番問題だったのは CNAME に異なるドメインのホストを指定できないことかな。何のための CNAME なんだか。

さくらのレンタルサーバで、バーチャルドメインの設定をすると、登録したバーチャルドメイン名の NS レコードと A レコード、そしてそのサブドメイン (www, mail など) の CNAME が登録される。

さくらのバーチャルドメイン名として www.uconst.org を設定して、お名前.com には www.uconst.org の NS に該当するさくらのネームサーバを指定すると、DNSで www.uconst.org の A レコードを検索することができる。

DNSレコードのイメージでいうと、以下のような感じ。

お名前.com
uconst.org.      IN  NS  01.dnsv.jp.     ; お名前.com のDNSサーバ
IN  NS  02.dnsv.jp.     ; お名前.com のDNSサーバ
www.uconst.org.  IN  NS  ns1.dns.ne.jp.  ; さくらのDNSサーバ
IN  NS  ns2.dns.ne.jp.  ; さくらのDNSサーバ
さくら
www.uconst.org.  IN  NS  ns1.dns.ne.jp.  ; さくらのDNSサーバ
IN  NS  ns2.dns.ne.jp.  ; さくらのDNSサーバ
IN  A   xxx.xxx.xxx.xxx ; レンタルサーバのIPアドレス
IN  MX  10 www.uconst.org.
www.www.uconst.org.   IN  CNAME  www.uconst.org.
mail.www.uconst.org.  IN  CNAME  www.uconst.org.

お名前.com でさくらのレンタルサーバを直接 CNAME 指定できないので、こんな構成になる。

何が問題かというと、www.www.uconst.org だの、 mail.www.uconst.org とかいうホスト名が生じてしまう (さくらの方のシステムで自動的に作成される) ことかな。まあ、気にしなければよいだけのことか。

書き忘れる所だった。これだと uconst.org の MX を記述してさくらのレンタルサーバで受けることができない。

この問題と、とった回避策は後ほど。

pkgsrc/audio/squeezeboxserver

pkgsrc/audio/squeezeboxserver は Logitech (日本では Logicool) のミュージックサーバである Squeezebox Server をインストールする pkgsrc である。

Squeezebox Server は Logitech のネットワークオーディオである Squeezebox 製品群と組み合わせて使うもので、これをサーバで走らせると、サーバに置いた音楽データをクライアントの Squeezebox で再生できるというわけ。

ファイルサーバをさせている NetBSD にインストールして実行 (/etc/rc.d/squeezeboxserver start) してみると、error やら warning がたくさん出て、動かない。

動作確認は、ブラウザで http://(実行したサーバ):9000/ にアクセスすれば良いはずだが、
繋がらないし、ps で確認しても該当しそうなプロセスは残ってない。
(バックエンドと思われる mysql だけが動いている状態)

正常に動いている状態を見たことがなかったので、調べるのが困難であったが、
/var/log/sqeezeboxserver に作成されるログファイルのユーザ:グループが root:slimuser となっていて、モードが 644 になっていたのが原因(ログファイルに書き込めなくて落ちていた)だった。

squeezeboxserver はログを開くときには既に slimuser 権限に移行しているようだ。

chown -R slimuser /var/log/squeezeboxserver としたら無事起動。
テスト用に Windows で実行した Softsqueeze とも連携しているようだ。

これで、Squeezebox Touch を購入すれば、リビングに CD を置かなくてすむようになるかな。
(置き場所がなく、大半の CD はしまいこんでるので、いちいち取り出して聴くのが面倒という問題があった)