インターネットラジオを FM ラジオで聴く

radiko や NHK のインターネット配信とちょうど逆の話。

仕事中に音楽を聴きたい。しかし目の前にある PC にはスピーカーが付いていない。どうしても必要なときのために簡単なヘッドホンを付けてあるのだが音楽を聴くのには向いていない。1時間に数回は席を立つので紐付きになってしまうのは非常にうっとうしい。

FM トランスミッター

FM ラジオで聴くことにした。と言っても普通の放送局では好みの音楽をやっていない。そこで、音楽サーバーを置いて電波を出すことにした。

目の前の PC のほかに、いわゆる自宅サーバーとして電源を入れっぱなしの PC がある。これに FM トランスミッターを付けた。しばらく前に買ったもののすぐに使わなくなっていた オーディオテクニカの AT-FMT6だ。もともと電池式だが、無理矢理ケーブルを付けて USB から電源をとるようにした。

XMMS2

Debian で動いているこの自宅サーバーには、これまでサウンド関係のソフトは入っていないので、まず alsa-base パッケージをインストールする(必要なものが芋づる式にインストールされる)。音楽プレーヤーは、軽そうな XMMS2 にした。xmms2 パッケージをインストールするとこれも必要なものが芋づる式にインストールされる。そのほかに必要となりそうなプラグイン、xmms2-plugin-curl, xmms2-plugin-pls などもインストールした。

XMMS2 はプレーヤー本体と操作パネルを分離できるので、今回のような場合にはもってこいである。サーバー側には上記のものを入れ、目の前にある PC にクライアントの gxmms2 を入れる。X や libgtk はこちらにだけあればよい。

サーバー側で

xmms2 config core.ipcsocket tcp://192.168.1.101:9667
のように、接続しにくるクライアントを指定しておき、いっぽうのクライアント側では環境変数 XMMS_PATHtcp://192.168.1.2:9667 のようにサーバーを指定する。

そしてサーバー側で xmms2-launcher として、デーモンを動かしておき、目の前の PC で gxmms2 を立ち上げる。

プレイリスト

あとの操作は gxmms2 で……と思ったものの、gxmms2 でのプレイリストの作成手順がよく分からないので、これはサーバー側に付いている CUI の nyxmms2 で行うことにした。

まず適当な名前で playlist を作成する(以下の例では gourd)。リストを切り換えて、聴きたいストリームの pls を加える。

nyxmms2 playlist create gourd
nyxmms2 playlist switch gourd
nyxmms2 addpls http://stream-19.streamsolutions.co.uk:9052/listen.pls

複数の接続先を設定したければこれを繰り返して行う。聴くときにはクライアントの gxmms2 でリストの切り換えができる。


サーバーは家のほぼ真ん中の階段下に置いてあるので、仕事場だけでなく台所や寝室のラジオでも聴けるようになった。トランスミッターのアンテナがもう少しよければ、庭仕事のときにも聴けるのだが。

GNOME の「最近開いたドキュメント」

evince などを起動しようとすると、数分ものあいだ固まったようになってしまうことがごくたまにある。そのときは、GNOME の「最近開いたドキュメント」が記録されている ~/.local/share/recently-used.xbel の内容を消去すると直る。

原因は、そのファイルに NFS の向こうにあるファイル名が記録されているからだった。「ごくたまに」というのは、目の前の PC を使っているときに NFS 先のもうひとつの PC が動いていないことはめったにないから。で、いま evince で見たいのは手元のファイルという場合だと、NFS 先の PC の電源が入っていないことはわかっていても、起動がおかしくなる原因がそれとはすぐに思いつかない。起動時に勝手に(?)「最近開いたドキュメント」を読み込もうとして、そこで引っかかっている。

それで、手っ取り早い解決策がそのファイルの中身を消去すること。

数年前にもこれで首を捻ったことがあるのだけれど、ずいぶん長いこと同じ目に遭わなかったのですっかり忘れていて、またもや首を捻ってしまった。そういう訳で、たぶんほかの人の役には立たないけれど、自分のためにここにメモしておく。

Debian の psql で日本語を入力できない

Debian の PostgreSQL のフロントエンド psql で日本語が入力できなくなっていることに気づいた。いろいろ検索してみてわかったことをざっと記すと、まず、以前の psql では問題なかったのが最近おかしくなったのは

#603599
これまでの psql は libreadline (GPL v2+) と libssl (BSD-like であり GPL とは非互換) の両方にリンクしており、ライセンス的にバイナリの再配布は不可能。そこで、libreadline をやめて BSDライセンスの libedit にする

という事情らしい。

#607109
psql でマルチバイト文字が使えない

で指摘されているように、-n オプションを使えば回避できることから、libedit のバグのようだ。

同じ libedit を使っている gnuplot

#596870
非アスキー文字が使えない

で、実際に試してみたらそのとおりだ。

当の libedit には

#579729
utf8 に対応した新しいバージョンをパッケージしてほしい

という要望が出されているものの、動きはなし。

上流は NetBSD libedit なのだけれど、「libedit I18N化への道」(イントロ)を見ると、utf8 対応といっても問題が多く、ことの成り行きはこの方にかかっているらしい (つづきが(その1)(その2)(その3)(その4)(その5)。そしてこの時点での最新の「めもがき」によると、たいへんお忙しいらしい)。

さし当たりこの問題を回避するには、libreadline / libedit の機能をあきらめて psql -n として使うか、libedit を libreadline に差し替えてパッケージを作り直すか。根本的解決は、能力のない者としてはただじっと待つより為す術がない。

AT5IONT-I で組む PC に Debian をインストール

AT5IONT-I で PC を組む

PC の1台のファンがうるさくてしかたがなくなった。それだけ交換してもいいのだけれど、7年ほども使ってきた Pentium4 の PC で、ほかの箇所にガタがきてもおかしくないので、すっかり新しくすることにした。

この暑い夏、非常にうるさかったので、今回は静穏性を最重視して、CPU が Atom D525 のファンレスのマザーボード AT5IONT-I、ACアダプター電源、2.5インチHDD、光学ドライブはこの際なし(旧機のものを流用したくても ATAPI で、接続できない)とした。

「24pin対応」の電源を注文したのに届いた付属ケーブルが 20pin で[1]、販売店に連絡したら「メーカーが入れ間違えたもの」とのことで、正しいケーブルが届くまで時間がかかったりしたが、ようやく準備は整った。

Debian のインストール

接続できる光学ドライブがなく、しかも手元に USB メモリもなかったので、まずは旧機に新HDDを接続して、Debian lenny ネットワークインストール用 CD で起動してインストール開始。順調に進んで、ネットごしに最低限の Debian ができたところで、HDD を AT5IONT-I に接続する。

ネットワークコントローラチップドライバ

新機を起動すると順調に立ち上がって、いやー簡単簡単……と思ったのも束の間、追加のアプリを apt-get しようと思ったらネットにつながっていないことに気づく。しばらくケーブルやら設定やら見直してもなかなか解決できない。別の PC で検索して調べているうちに、ようやく原因にたどり着いた。

AT5IONT-I に搭載されているネットワークコントローラチップは RealTek 8112L というものらしい。Debian はドライバモジュール r8169.ko を読み込むがこれが動いていないようだ。検索して調べてみると、RealTek のサイトから RTL8111/8168B を持ってきて組み込めばいいらしい (参考: Script to Fix R8168 and R8111 in Debian/Ubuntu GNU/Linux)。

再び HDD を旧 PC に接続し、linux-headers-2.6.x などビルド環境を apt-get。Realtek のサイトから r8168-8.019.00.tar.bz2 をダウンロード。

rmmod r8169

で誤ったモジュールをはずし、持ってきたものを展開して、

make clean
make modules
make install

でインストール。インストールした先で

mv r8169.ko r8169.ko.BAK
echo "blacklist r8169" >> /etc/modprobe.d/blacklist
depmod -a
insmod r8168.ko

でモジュールを組み込む。

update-initramfs -u

initramfs を更新しておく。

ここまでできたら HDD を AT5IONT-I に戻し、起動してネットに正しく接続できた。

あとはネットごしに apt-get で必要なものをインストール。AT5IONT-I 搭載の ION2 のために nvidia-glx などもインストールした。

ATOK X3

上記のドライバの組み込みの作業は、カーネルが変わるたびにやらなければならならず面倒くさいので、この際と思い、その作業の前に lenny から unstable に上げてしまっていた。このときに dpkg も新しいものになった。

日本語変換は ATOK X3 にすることにした。別の PC (こちらも Debian の unstable)でも既に ATOK X3 を導入していたのだが、数ヶ月前から ATOK X3 に含まれる iiimf-* が「不正なバージョン番号」との警告が出るようになっていた。新機では、何と同じ警告のためにインストールそのものができない。これまた検索して調べてみると、「_」が含まれているのが原因。

dpkg -x, dpkg -e で展開して DEBIAN/control のバージョン番号を書き換えて dpkg-deb -b で再パッケージ。付属のインストールのためのスクリプトもそれに合わせて書き換えて、無事インストール完了。

ファン

完全ファンレスにしようかと思ったが、CPU温度が60度くらいになる。それでもいいのかもしれないが、旧機の電源部の大きなファンはそれほどうるさくないので(うるさくなっていたのはCPUファンだった)、これを取り出して、 AT5IONT-I のフィンの上に乗せた。CPU温度は30度程度になった。

  1. 20pin でも当面は困らないが、注文したものと違うままというのも嫌なので。

beep は PC スピーカーで鳴らしたい

あるときから beep が鳴らなくなってしまった。このときはパッケージ alsa-base のバージョンを上げたときで、/etc/modprobe.d/alsa-base-blacklist.confblacklist pcspkr と書かれるようになったからで、これをコメントアウトしてカーネルのモジュール pcspkr をロードするようにして復活した。

別の事情のためにカーネルのバージョンを 2.6.30 にしたら、またまた beep が鳴らなくなってしまった。というか、PC スピーカーからではなく ALSA のほうに行ってしまい、そちらに外部スピーカーを接続して alsamixer の beep コントロールを適切に設定すればそちらから音が出るようになった。

しかし、ここでは外部スピーカー(ヘッドホン)は音楽を聴くときなど限られたときしか使っていない。そのため警告音として役に立たない。

検索の結果、Anyone know what happened with PC speaker in 2.6.30? の中ほどを見ると、カーネルの config で、SND_HDA_INPUT_BEEPoff にすればいいようだ。このためだけに Debian パッケージのカーネルを使えずにカーネルの再構築をしなければならないとはひどく面倒だ。

まとめると、Debian で beep を PC スピーカーで鳴らすには、

  1. SND_HDA_INPUT_BEEPoff にしてカーネルを再構築する
  2. カーネルのモジュール pcspkr はロードする
  3. alsamixer の beep はミュートする (そうしないと ALSA から「も」beep が鳴る)

検索してみても、いかに beep を消すかというばかりが見つかり、逆に beep を PC スピーカーで鳴らしたいというのはほとんど見つからない。時代遅れなのだろうか。

Emacs で subversion のコミットログ

日本語入力システムにWnn7を使うために環境変数 LANG を ja_JP.eucJP にしなければならないのだが、いくつか問題が出てきた。 そのうちのひとつ、emacs で subversion のコミットをする際のログを日本語で書こうとするとエラーを起こす。しばらく放っておいたのだが、やはりログは日本語で書いたほうがささっと書ける[1]。 .emacs に [lisp] (add-hook ‘svn-log-edit-mode-hook ‘(lambda () (set-buffer-file-coding-system ‘euc-jp))) [/lisp] を加えて解決した。
  1. 諸説あるが、何しろここでは自分ひとりで使っているリポジトリのものなので自分流である。

Debian lenny (以降) で Wnn7 を使う

ハードディスクが飛んでしまい、これを機会に Debian の新しいバージョンをすっかりはじめからインストールした。随分楽になったものだ。さてここでシステムの locale を最近の流行りにしたがって ja_JP.UTF-8 にしたのだが、これが後で問題となった。 sid (unstable) に入れ替えつつ、さらに必要なものを少しづつインストールして、クラッシュ直前の使い勝手に近づいてきたのだが、常用していた debian 外の日本語入力システム Wnn7 はライブラリの依存の問題でインストールすることができなかった[1] 。商用ソフトでしかも2001年発表というものなので、しかたないかもしれない。Wnn8 ならインストールできるかもしれないが、これですら2005年発表なので今さら買う気にもなれない。 1ヵ月ほど Anthy を使ってみたものの、20年近くも Wnn を使い続けてきた感覚のためか、どうにもストレスを感じて仕方がない。特に Wnn7 の「異体字変換」機能に相当するものを Anthy に見つけることができなかったところで、とうとう我慢ができなくなった。 というわけで、Wnn7 を2009年1月現在の debian sid にインストールしてみることにした。アップデートセンター から(当時の debian に対応した) deb パッケージが手にはいる。

dpkey7

そのままではインストールはできるが libc6 のバージョンが合わず起動しない。ここでは強引な方法で解決した。上記のアップデートセンターの「ライセンスサーバー」の項を見ると「glibc2.3 対応版」が出ていることがわかる(ただし rpm のみ)。この中から実行ファイルのみ(2つ)を取り出して、これに差し換えた deb を作り直してインストールすることにした。 ネットで検索すると、chroot 環境に古い libc6 (libc6_2.3.2.ds1-22_i386.deb) を飼うという解決法が見つかる。さらに将来を考えるとこのほうがいいのかもしれない。

wnn7-utils、辞書

wnn7-utils, maindic, optiondic は特に問題なくインストールできる。

wnn7-server

# dpkg-deb -x wnn7-server_1.01-1_i386.deb wnn7-server
# dpkg-deb -e wnn7-server_1.01-1_i386.deb wnn7-server/DEBIAN
で開梱し、DEBIAN/control の Depends の行にある古いライブラリを現在のものに書き換える。 libglib1.2 は libglib1.2ldbl に、またxlib6g はなくなってしまったので、個々のライブラリにする。したがって depand の行は
 Depends: libc6 (>= 2.1.2), libglib1.2 (>= 1.2.0)|libglib1.2ldbl, libgtk1.2 (>= 1.2.7-1), libXi6, libxext6, libx11-6, libxau6, libxcb-xlib0, libxcb1, libxdmcp6
とした。libgtk1.2 は辛うじて現在の debian にも残っているのでよかった。 開梱したものを
# dpkg-deb -b  wnn7-server wnn7-server_1.01-1p1_i386.deb
のようにして再びパッケージ化して、インストールした。

wnn7-elisp

Depends に Emacs のバージョンが固定的に書かれているので、新しいEmacs でも大丈夫なように、先ほどと同様に、emacsen と書き加える。 また、usr/lib/emacsen-common/packages/*/wnn7-elisp の中の case 文にもバージョンが固定的に書かれているので、ここに新しいバージョンを加える。 ここまでで、dpkeystat で ライセンスサーバが起動していることを確認でき、wnnstat で変換サーバが起動していることを確認できる。そして Emacs をクライアントとして正しく日本語入力と変換ができることを確認できる。

wnn7-xclients

最後に、xwnmo の含まれるこのパッケージも、同様に Depends の行を書き換える。
 Depends: debhelper, debconf, libc6 (>= 2.2.4-4), libglib1.2 (>= 1.2.0)|libglib1.2ldbl, libgtk1.2 (>= 1.2.10-4), libXi6, libxext6, libx11-6, libxau6, libxcb-xlib0, libxcb1, libxdmcp6, libXmu6, libXt6, libsm6, libice6
とした。

設定

はじめに書いたようにシステムの locale を UTF-8 にしたのだが、これが原因で xwnmo が機能しなかった。ユーザーの .bash_profile で、LANG=ja_JP.eucJP と設定することにした。他のアプリケーションでそのうち困ることが出てくるかもしれないが。 そのほかの環境変数は、Wnn7 をインストールするより前に Anthy を入れた関係で im-switch もインストールしていたので、この際その流儀に合わせることにした。/etc/X11/xinit/xinput.d/ の default-xim を xim-wnn7 という名前でコピーして
XIM=_XWNMO
XIM_PROGRAM="/usr/bin/xwnmo"
XIM_ARGS="-map -g 1x1-0-0"

GTK_IM_MODULE=xim
QT_IM_MODULE=xim
とした(XIM_ARGSはご自由に)。あとは im-switch -s xim-wnn7 で切り替えておく。
  1. ハードディスクが壊れる直前はその時点でほぼ最新の sid だったのだが、ずっと以前にインストールした Wnn7 に依存される形で古いライブラリが残っていて、 Wnn7 は正常に動いていた。