日曜日, 1月 14, 2007

 

Perl MP3::Info + iTunes compilation

mp3にはタグの規格があって、その中にトラック情報が入っている。

例えば曲名だとか”アーティスト”だとかアルバム情報だとかだ。

この規格はid3といってタグのことをid3tagという。
http://www.id3.org/

perlでid3tag情報を読むにはcpanのMP3::Infoが便利だ。
m4aのタグ情報を読むMP4::Infoとの表記の互換性もある。

だけど、実はiTunesで編集したタグに付く、コンピレーションフレームについてはid3の規格から外れている。(m4aについてはコンピレーションフレームについて規格がある。と、考えれば確かに有用なフレームだと思うのだが。)

だからだと思うのだが、MP3::Infoではcompilationフレームを読む方法がないように思われる。

でも読みたいときはどうするか?

コンピレーションフレームのキーは次のふたつ
TCMP
TCP

使う関数はこれ
MP3::Info::get_mp3tag (FILE [, VERSION, RAW_V2, APE2])

VERSIONはID3v1とID3v2のどちらを読むかを指定する。
指定をしなければ、まずID3v1を読み、(もしあれば)ID3v2の情報を次に読み、最初に読んだ情報を上書きする。

RAW_V2は
1:生データを取り出す。
2:データを取り出した上で加工する。
のいずれかを選択する。

例えば下の例のようにタグを読めば

my $tag = get_mp3tag('mysong.mp3', 2, 1);
for (keys %$tag) {
printf "%s => %s\n", {$_}, $tag->{$_};
}

タグの生のデータが取り出され、
キー => 値 のフォーマットで出力される。
(値には画像など文字列以外が格納されている場合もあるので注意)

キーがTCMPかTCPであればcompilation frameがついているということ。
if (defined $tag->{"TCMP"}){
printf "TCMP => %s\n", $tag->{"TCMP"};
}

参考:
http://search.cpan.org/~daniel/MP3-Info-1.21/Info.pm
http://backpan.cpan.org/authors/Chris_Nandor/MP3-Info-0.90.readme

日曜日, 1月 07, 2007

 

Gnome + Gmail = CheckGmail

最近Debian で Gnome を立ち上げている時間が多くなった。
何台かのコンピュータの前に座っているわけだけど、
困るのはメーラ。PopしてどこかのPCに落としてしまうと
他のPCから見にくい。

そんでGmailを使っているわけだが、
CheckGmailというPerlプログラムを見付けた。
gnomeのtrayにnotifierアイコンが格納される。
メールが着くとGmailマークが赤くなっておしらせしてくれる。

aptitude install checkgmail
だけで簡単に入ってしまった。

よい。

Gmail notifierというfirefox拡張機能でも似たようなことができるのだけど、
firefoxを常時立ち上げているわけでもないのでこちらを重宝しそうだ。

 

Debian + Rhythmbox = Who's bad?

Debian で Rhythmbox 0.9.6を使っていたのだけど(m4a)AACが聴けない。
Message: don't know how to handle audio/x-m4a

プロテクトされているdvdの再生で御世話になってる
http://www.debian-multimedia.org
から
gstreamer0.10-plugins-bad
というのをいれてみた。
再生できないんだよなぁ

もっと悪そうなブツを入れてみる。
gstreamer0.10-plugins-really-bad

再生できました。
gstreamer0.10-plugins-base
はともかく
gstreamer0.10-plugins-good
gstreamer0.10-plugins-ugly
のふたつも入ってます。すげぇ名前付けてるね。

 

Debian + Cups + hp photosmart 2600

HPのPhotosmart2600(プリンタ)がLANネットワーク上にある。
Debian etchではCupsを使って楽に繋げられるようだ。

apt-get install hplip

HP用のプログラムをインストール。
普通にDebianのリポジトリに置いてある。
どういうライセンス形態になっているのかわからないけどHPのご謹製なのでしょうね。
そして

hp-setup

でHP device managerなるプログラムが立ち上がる。
そこから先は指示に従えばテストページの印刷までいける。

ちなみにHPLIP toolboxなるプログラムがgnomeメニューに追加された。
faxとかscannerは試してないけどtoolboxにエントリがある。

すごいぞ Debian

 

Debian on FMV Deskpower L22D/M

FMV Deskpower L22D/Mを友達からもらってきた。
いままで扱ってきたパソコンと違ってどことなく雰囲気が家電みたいだ。高級感はあるがいじりにくそう。
とりあえず256Mのメモリに512Mを加えておく。

Debian etchのネットインストールを試みる。
画面が横長なので初回ブート時には下が切れた。気をとりなおして
install vga=1280*768
のオプションをつけてブートする。

taskselでDesktop環境を選んでいたため、
初回起動と同時にx-windowシステムが立ち上がる。

楽々だなぁと思っていたら画面が極色彩な感じ。色が潰れている。
字はおろか、アイコンさえも判別不能。

F1+Alt+Ctrでtty1のコンソール画面に移動する。
/etc/X11/xorg.confの編集
Section "Screen"のDefaultDeptを24色から16色に変更してからreboot。
治った。

コンソールの発色はしっかりしているのだが、Xの輝度が足りない。モニタが暗い。目が悪くなりそう。
DisplayDriverはSiS651
http://www.winischhofer.eu/linuxsisvga.shtmlを参考に
Section "Device"に
Option "LVDSHL" "1"
を追記。

ついでにwinischhoferさんのホームページから最新のx-windowのSiS用ドライバをとってきてとっかえてみる。
治った。

ここまでで丸二日くらい。
明るさを解決するのに時間がかかりました。
ちゃんと嫁です。

ちなみにSiSのLinuxへの対応についての公式見解

Some versions of Linux have provided default driver for SiS products. Besides, we also provide the linux driver download for some version users
一方のwinischhoferさんの見解

SiS is unfortunately one of those companies that do not support Linux or X.org/XFree86. They don't (and will not) release any documentation on their products (with a few exceptions) and write drivers only for Microsoft's DOS-extensions (called "Windows" by many people; and yes, "Windows" is a trademark). Although they have released XFree86 drivers previously and have released a (binary) driver for the SiS650 in the past, these are and were heavily buggy and not developed any further from a certain point. In other words: Their XFree86 drivers are useless.


そして
I have developed this driver since 2000 and spent a lot of my spare time for doing so and prividing support by e-mail and the forum. We are taking about approx 4000-5000 hours here; I stopped counting a long time ago. Since none of the involved hardware manufacturers ever supported me in this process and I - opposed to nearly all other X.org developers - am not paid by anyone for my efforts, I for now decided to stop wasting my precious and rare spare time by supporting these companies by selflessly providing them with the means to sell more of their hardware.
彼のとった手段は有料のプレミアム版の配布!でした。

このお話が正しいかどうかは検証しませんけど、そういうことらしいです。
free softwereの建前と本音といった感じでしょうか?
SiSは理念の建前で公式ページに載せ、winischhoferさんは現状の本音を吐露してます。

デバイスドライバーの開発に5000時間使ったら本当だったらいくらのペイメントが発生することでしょうね。

 

Landisk distcc on debian sh4

distccは分散コンパイラ。

複数の協力コンピュータにコンパイルを手伝ってもらう。
パッケージをソースからビルドする前提のgentooではお馴染み?のようだ。

いくつかのパッケージをbackportsから持ってくることを計画したのだけれど
archに対応した出来合いのバイナリがない。
ソースからコンパイルしようとしてもsh4 landiskはあまりに非力だ。
だからi686のマシンでコンパイルのお手伝いをさせていただく。

要件は
1.landisk(debian)とi686(debian)のdistccによる連携。
2.i686マシンではarch sh4用のクロスコンパイル。

"distcc"はdistccdとdistccとに大きくわけることができるようだ。

distccd:デーモン、他マシンなどから要求があった場合に分散コンパイルを行う。
distcc :他マシンなどに分散コンパイルの要求を行う。

早速両方のマシンにaptして作業開始。

i686の設定ファイルを書き換える。
/etc/default/distcc

STARTDISTCC="true"
ALLOWEDNETS="127.0.0.1 192.168.11.22" ←localhostとlandisk のip
LISTENER=""

でデーモンを再起動

/etc/init.d/distcc restart

次はlandisk側の設定

ディレクトリの作成。
mkdir /usr/lib/distcc/bin

当該ディレクトリにdistccへのリンクを作成
sh4-linux-g++ -> /usr/bin/distcc
sh4-linux-gcc -> /usr/bin/distcc
c++ -> /usr/bin/distcc
cc -> /usr/bin/distcc
g++ -> /usr/bin/distcc
gcc -> /usr/bin/distcc

bashrcに環境変数を設定する。
DISTCC_HOSTS=i686-machine
PATH=/usr/lib/distcc/bin:$PATH


こうしておくと、ccが呼ばれたときにはサーチパス上にある/usr/lib/distcc/bin/ccが実行される。
その実態は/usr/bin/distccなわけで、distccが実行される。
その際には、distccはリンク元コマンド(cc)が何であったかも見ているようだ。

distccは分散コンパイル可能か判断する。
可能だと判断した場合は分散コンパイル先コンピュータ(今回はi686-machine)に依頼する。
不可能だと判断した場合は自分でコンパイルする。

で、コンパイルを敢行。見事失敗した。

問題となるのはi686マシンにccというコマンドを依頼した場合、archを気にせずccを行おうとすることだ。
当然i686マシンでccを行った場合はi686用のバイナリが作成される。

で、この問題を回避するためのヒントがgentooのdistccのマニュアルにあった。
ラッパーを作成する。

cd /usr/lib/distcc/bin/
touch wrapper
chmod a+x wrapper

中身はこんな感じ
#!/bin/bash
case ${0##*/} in
'cc') exec /usr/lib/distcc/bin/sh4-linux-gcc "$@"
;;
'c++') exec /usr/lib/distcc/bin/sh4-linux-g++ "$@"
;;
*) exec /usr/lib/distcc/bin/sh4-linux-${0##*/} "$@"
;;
esac


そんでg++、gcc、c++、cc のリンクを消してこんどはwrapperに対してリンクを作成する。
cd /usr/lib/distcc/bin/
ln -s wrapper c++
ln -s wrapper cc
ln -s wrapper g++
ln -s wrapper gcc

合計 12
drwxr-xr-x 2 root root 4096 2007-01-06 04:30 .
drwxr-xr-x 3 root root 4096 2007-01-03 21:57 ..
lrwxrwxrwx 1 root root 7 2007-01-06 04:30 c++ -> wrapper
lrwxrwxrwx 1 root root 7 2007-01-06 04:30 cc -> wrapper
lrwxrwxrwx 1 root root 7 2007-01-06 04:30 g++ -> wrapper
lrwxrwxrwx 1 root root 7 2007-01-06 04:30 gcc -> wrapper
lrwxrwxrwx 1 root root 15 2007-01-04 08:22 sh4-linux-g++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 2007-01-04 08:23 sh4-linux-gcc -> /usr/bin/distcc
-rwxr-xr-x 1 root root 211 2007-01-06 04:32 wrapper


そうすると
c++、g++が呼ばれると
/usr/lib/distcc/bin/sh4-linux-g++が実行され、
cc、gccが呼ばれると
/usr/lib/distcc/bin/sh4-linux-gccが実行される。

そんでもう一度コンパイルを敢行しました。

OK!

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
i686に突っ込んだsh4のクロスコンパイラにはkogiidenaさんの
sh4-cross-20050910.tgz
を利用させていただいた。
libstdc++6-sh4-crossインストール時にgcc-3.4-baseのバージョンがあわないと
怒られたが、controlファイルをいじって無理にいれた。

今回は設定に二日。
sh4-cross-20051023.tgz
を始めに利用していた。コンパイルエラーになる。
gcc-3.4-sh4-linuxとかのマイナーバージョンがlandiskよりも
新しくなっていたようだ。

ここも参考に
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

 

apache2 mod-perl2のdebian sarge版とApache-MP3

mt-daapdでNat越えはできないので外からも音楽が聴けるような何かはないかと探したところapache-mp3というおいしそうなプログラムをCPANで見つけた。perlで書かれていて、ディレクトリの音楽ファイルを聞きやすそうにしてくれるらしい。

飛びついた。

で失敗した。

libapache2-mod-perl2の 1.999.21のバージョンの後に大きな改変が あったらしい。debian sargeではサポートする気はないんだろうな。
だもんでapache-mp3のバージョンをひとつ前のやつにして再度挑 戦。で失敗。
debian sargeはそのバージョンの時よりも新しいlibapache2-mod-perl2を使っている。

要は過渡期のバージョン のlibapache2-mod-perl2がdebianではsargeとして固定されているということだ。
debianの不幸だね。これは。。。

CPANのapache関連のモジュールは使えないということになるか。

 

Landisk + updatedd = DDNS

プロバイダとの契約は変動IPです。 固定IPで変な人に追っかけられるよりもいいや。

だのでダイナミックDNSを利用してます。dyndnsを使っているのでipが変わったときにレコードを書き換えられるutilityが必要でした。今回はupdateddを利用します。

ソースファイルを解凍すると見慣れたdebianのフォルダが用意されています。おりょ?っと思い
dpkg-buildpackage -uc -us -rfakeroot
で、一発でdebファイルができました。めでたし。

/etc/updatedd-wrapperを適当に編集してupdatedd-wrapperを実行するだけのスクリプトを/etc/cron.d/に突っ込みました。おしまい。

一時間毎ね
10 * * * * root updatedd-wrapper

 

Landisk apache2 起動します!

Webサーバを立てたい誘惑はセキュリティ意識を食らうくらいに大きい。

apache2を導入した。
このapache2の プロジェクトチームの某氏は大のパーティ好きらしい。
バーニングマンのテックグールーらしい。グルという名称は日本では麻原御大が名乗っていたね。
メンタルのどこかのレベルでは共通する部分はあるのだろうな。スピリチュアルマインドってやつは。

そんな話はどうでもいいけど、これもリポジトリにsh4でコンパイルされたぶつがあるので一挙に入れてしまう。

pukiwikiを 立てようかとphpを導入しようと思いましたが、入れるとmpmをthreadモードで動かせなくなるっぽい。(debianのパッケージはそうなってい る。)なのでphp4-cgiというやつを導入しました。pukiwikiのページにも書いてありますが、php4-cgiで動かすときは pukiwiki.ini.phpファイルにそれなりの設定をしなければならないとのことを読み落として一時間ほど悩みました。消えていった時間に合掌。

ついでにmod_perlを使ってperlも動かしたかったのでlibapache2-mod-perl2をコンパイルしました。
リポジトリにはなかったです。

 

Landisk + mt-daapd = 王道

Landiskとか小型のNasといえばmt-daapdですなぁ。
iTunes互換の音楽ファイルサーバです。
これもaptitudeします。

と思ったらeggplantリポジトリサーバが死んでます。
しょうがないのでミラーサイトを探しましたがありました。
/etc/apt/sources.list
を編集してミラーサイトを見るように変更しました。

適当に/etc/mt-daapd.confを編集してiTunesから接続しました。OKです。
リブートしたらdaemonが起動していなかったので
update-rc.dをdefaultで実行しておきました。

追記:
itunes7から接続できなくなりまして、
mt-daapdの本家の最新版をdpkg-buildpackageしました。

 

Landisk samba3.0の導入とutf8

samba3.0導入でkogiidenaさんのページを眺めていたらLandisk側ではutf-8で ファイル名を管理しているほうが何かと都合がいいとの指摘。そのとおりに従う。
常時リソースを食っているのもなんだから、daemonモードではなくinetdから呼び出すようにconfigureする。
だけどtelnet経由でファイル名をのぞいてみると日本語はことごとく化ける。気持ち悪い。

nkfをインストールして
ls | nkf -e 
とかしてlsでutf8で出力されたコードをeucに変えている人たちもいるがdebianではもっと根本から対処できる。
だので対処する。

telnetをいつまでも使っているのもどうかと思い、とりあえずsshを導入。
aptitude install ssh 
これだけ。クライアントはWindowsXPなのでputtyを使う。

localesもaptitudeする。
dpkg-reconfigure locales
でutf-8な日本語のlocalesを作成する。

文字コードってのは長い変遷と歴史があるのだろうが、どうもあまり賢くない人たちとかコミュニケーションに弱い人たちが作成したのだと思う。何せその変遷がわかりにくい。日本の北東アジア外交を見せられているようで歯に衣が着せてある気がする。

文句を言ってもしょうがない。

もう少し作業する。
環境変数LANGの設定
LANG=ja_JP.UTF-8
puttyの文字セット変換をUTF-8(CJK)に設定。
これでファイル名はしっかりみれました。

 

Landisk ベースのインストール

コンセプト:
kogiidenaさんがkernel2.6のベースパッケージを作成しているのでそいつを利用させてもらう。

・一番最初のパーティションをメンテナンス用のベースとして確保、いぢらないことにして、実際に運用するルートをhda2とすることにした。
 →mizoreさんのところで公開していたSH用セレクタ付ブートローダをkogiidenaさんが改良してベースファイルの中にいれてくれていた。
  これがあれば起動したときにLandiskのスイッチをぱちっとするとカーネルを切り替えられる。

作業:
・HDDドライブをUSBで母艦に接続。fdiskしてパーティションを切り、mkfs.ext3とかmkswapとかしてフォーマットしておく。

Disk /dev/hda: 120.0 GB, 120060444672 bytes
255 heads, 63 sectors/track, 14596 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/hda1 1 244 1959898+ 83 Linux
/dev/hda2 245 1024 6265350 83 Linux
/dev/hda3 1025 1087 506047+ 82 Linux swap / Solaris
/dev/hda4 1088 14596 108511042+ 83 Linux

としてフォーマットする。
母艦にはdebianが入っていたが別にknoppixでもかまわんのだろうね。

・baseファイルの展開
 落としたbase26-sh4-20051112.tgzをhda1、hda2に展開。(usb経由だからsdaとして認識されていたけど。)
 適当に/etcのファイルを修正。(mizoreさんのサイトを見ながらの作業。)
※起動時に大事なfstabの様子
hda1の方
/dev/hda1 / ext3 defaults 0 0
proc /proc proc defaults 0 0
/dev/hda3 swap swap defaults 0 0

hda2の方
/dev/hda2 / ext3 defaults 0 1
proc /proc proc defaults 0 0
/dev/hda3 swap swap defaults 0 0
/dev/hda4 /mnt/hda4 ext3 defaults 0 2

・クロスでliloを実行。
linear
boot=/dev/sda
disk=/dev/sda
bios=0x80
timeout=50
install=/boot/boot.b-selk
default=debian26
image=/boot/vmlinuz-2.6.14-sh
label=debian26
root=/dev/hda1
read-only
append="mem=64M console=ttySC1,9600"

image=/boot/vmlinuz-2.6.14-sh
label=debian26-hda2
root=/dev/hda2
read-only
append="mem=64M console=ttySC1,9600"

・HDDをlandiskに戻して起動。

・起動失敗。大いに落胆する。
 →ブート画面をシリアルケーブルをつないで見ていたがLILOのLの字も出てこない。

mizoreさんのページをねめまわすように読む。
 →二日経過する。→興味を失いかける。
 
・liloのバージョン以外に違いはないという薄々感づいていたことに重い腰を上げる。
 →ネットを検索しても21.3のバージョンのdebもソースもない。
 →rpmを見つけてきて分解してliloを取り出す。
  @itの記事より「rpm2cpio ../smartmontools-5.23-1.i386.rpm | cpio -id」
 →クロスでlilo21.3実行→母艦に戻す。→無事起動する。→うれしい。

・シリアルでログイン。rootユーザのパスワードはオーナーなら推して知るべし。
 rootユーザのpasswdを変えておく
 一般ユーザlandiskをdeluserして殺し、新しくユーザをadduserしておく。

・一般ユーザでtelnetでつなげることを確認。→うれしい。スイッチぱちんでカーネルが切り替わるかも実験。→うれしい悲鳴。
 (シリアルコンソールがつないでなくてもデフォでrootログインは無理でもlandiskってユーザだったらtelnetでもログインできるんだろうな。)

 

Landisk おもちろいね

一年以上ほっておいたLandisk。
HDDがついにおかしくなったので再構築しました。
顛末記をしばらくだらだらと書きます。

Landisk 型番:HDL-120U

I-Oエラーが頻発したためにHDDを再購入。
バックアップは無しの素の状態からの構築。

This page is powered by Blogger. Isn't yours?