hoge diary - カテゴリ - Linux

[Linux] Wine + dmix

Wine のオーディオ出力先を変更できないものかと調べていると,やはりありました~/.wine/user.reg に以下の通り書き加えます.DevicePCM1 の行が出力先デバイスです.私の場合は plug:output です.

[Software\\Wine\\Alsa Driver]
"AutoScanCards"="no"
"DeviceCount"="1"
"DeviceCTL1"="hw:0"
"DevicePCM1"="plug:output"

これでサウンドデバイスを占有させることなく Wine 上で音が鳴らせます.

[Linux] dmix 復旧

dmix が使えなくなっていた原因が判明し,解決しました.

どうやら,各種オーディオソフトウェアの出力先を plug:dmix と設定していたのが原因のようです.実は私,~/.asoundrc に次のように書いていました.

pcm.output {
    type dmix
    ipc_key 1024
    ipc_perm 0600
    (中略)
}

つまり,本来は出力先を plug:output と設定していないとダメなはずなんですが,何故か今まで再生できていました.

自分の設定ミスが原因と判明したので,まずは Amarok の出力先を以下の通り変更.

Amarok xine エンジン設定: 出力先を ALSA, plug:output に変更

続いて,~/.mplayer/config も以下の通り変更して無事解決.

ao = alsa:device=plug=output

[Linux] iPod と Amarok と Last.fm の連携

iPod で曲を再生すると,再生に関する情報として,再生回数と再生時刻が iPod 本体に記憶されます.Amarok-1.4_beta1 以降には,これらを読み出して,Amarok が管理する統計情報と同期し,さらにはそれらの情報を Last.fm 側に通知する機能が備わっています.1.4_beta1 以降,ということは,かなり昔から使用可能だったようですが,不覚にも私は今日まで気が付きませんでした.もちろん,Amarok 側のデザインがそれに気づきにくくなっているわけではありません.単純に私が見落としていただけのことです.

気づいたからには,試しに使ってみるしかありません.まずは再生回数がカウントされるかどうかを確認します.私は手元にある iPod nano (以降では nano と表記) で試しました.nano で曲を再生し,再生が終わったら,その nanoAmarok に接続します.すると,確かに Amarok 側に表示されている再生回数が増えると共に,Last.fm にその情報が送信された旨のメッセージも Amarok のステータスバーに表示されました.

同様にして,nano で曲の評価 (5段階) を変更した後に Amarok と同期すると,Amarok 側の評価も合わせて変更されました.

今度は,逆に Amarok 側で曲の評価を変更し,nano を接続すると... nano 側の評価も変更されました.素晴らしいです.Amarok がどんどん進化してゆきます.

[Linux] Kopete の Keep-Alive と Regnessem

私は Kopete を使用していますが,そのうち MSN Messenger 上の友人から「空のメッセージが送られる」という指摘を受けました.Kopete にパッチを当てれば何とかなるんだろうなぁ,と思ってはいたのですが,詳しい原因が分からぬまま時は過ぎ...

今になってようやく,空のメッセージが送られるのは Regnessem 使用者であることがわかりました (私自身も Regnessem を使用したところ,Kopete を使用している他のユーザから 50 秒おきに空のメッセージが送信されることを確認しました).

「50 秒」というのが Kopete のソースを追いかける手がかりになりそうです.あとは kopete-3.5.4 のソースを展開し,「50」や「50000」などのキーワードで検索すると... ありました.msnswitchboardsocket.cpp の 812 行目,862 〜 868 行目に,Keep-alive メッセージを送信するコードが記述されています.以下に該当個所を引用しておきます.

812: if(!m_keepAlive)
813:  {
814:    m_keepAliveNb=20;
815:    m_keepAlive=new QTimer(this);
816:    QObject::connect(m_keepAlive, SIGNAL(timeout()) , this , SLOT(slotKeepAliveTimer()));
817:    m_keepAlive->start(50*1000);
818:  }
862:     if(!m_keepAlive)
863:     {
864:         m_keepAliveNb=20;
865:         m_keepAlive=new QTimer(this);
866:         QObject::connect(m_keepAlive, SIGNAL(timeout()) , this , SLOT(slotKeepAliveTimer()));
867:         m_keepAlive->start(50*1000);
868:     }

タイマーを使って 50 秒おきに Keep-alive メッセージを送っているようです.実際に送る関数 (slotKeepAliveTimer()) を見てみると... 次のようにコードが書かれています.

1100:    if ( onlineStatus() != Connected || m_chatMembers.empty())
1101:    {
1102:        //we are not yet in a chat.
1103:        //if we send that command now, we may get disconnected.
1104:        return;
1105:    }
1106:
1107:
1108:    QCString message = QString( "MIME-Version: 1.0\r\n"
1109:            "Content-Type: text/x-keepalive\r\n"
1110:            "\r\n" ).utf8();
1111:
1112:    // Length is appended by sendCommand()
1113:    QString args = "U";
1114:    sendCommand( "MSG", args, true, message );

どうやらチャットウィンドウが開いている状態でないと,Keep-alive メッセージは送信されないようにはなっていますが,1114 行目に sendCommand( "MSG", args, true, message ); と書いてあるので,おそらく普通のメッセージとして Keep-alive を送信しているのでしょう.試しに Regnessem 上で,Kopete ユーザのチャットウィンドウを閉じてみると... 確かにその人からの Keep-alive は来なくなります.

Content-Type: text/x-keepalive という MIME タイプを指定してはいますが,Regnessem からはこれが通常のメッセージであると見做してしまうようです.本家 MSN Messenger や Windows Live Messenger では Regnessem 相手にこのような現象が起こらないようなので,少なくとも Kopete のような Keep-alive メッセージは送っていないと判断し,ここは Kopete にパッチを当てて,この Keep-alive を抑制してみます.

パッチの当て方は至って簡単で,msnswitchboardsocket.cpp の 812 〜 818 行と,862 〜 868 行目をコメントアウトするだけです.

パッチを当てた Kopete を起動してみると,チャットウィンドウを開いたままの状態でも 50 秒おきに空メッセージが来ることはなくなりました.

次は,Regnessem を使用しているユーザがサインインしてオンラインになったとき,もしくは不可視状態からオンラインになったときに,Regnessem 側の会話ウィンドウ (もちろん相手は Kopete ユーザです) が開いてしまう,という点についても解決したいと思います.

動作から推測すると,Kopete 側において,コンタクトリストに登録されているユーザがオンラインになったときに,空の会話メッセージを送信しているような気がします.というわけで,Kopete のソースを追いかけて,コンタクトリスト上の相手のステータスが変化したときのイベントハンドラを探してみたのですが,途中で面倒になったので,もっと検索範囲を一気に絞りこみます.

おもむろに Wireshark (旧 ethereal) を起動して,MSN サーバとの通信をログに記録します.Regnessem 側にポップアップが表示されるところから考えて,MSG コマンドを送信しているはずです.ログ中に MSG がないかどうかを探すと... ありました.

MSG 2 D 595
MIME-Version: 1.0
Content-Type: application/x-msnmsgrp2p
P2P-Dest: (相手側のメールアドレス)

(この部分にも情報が書かれているが,ASCII 文字でないので省略)
To: <msnmsgr:(相手側のメールアドレス)>
From: <msnmsgr:(自分側のメールアドレス)>
Via: MSNSLP/1.0/TLP ;branch={A0B93F34-746D-3161-122D-AD856249368A}
CSeq: 0
Call-ID: {63F62291-626B-814E-35D2-6F2E98446455}
Max-Forwards: 0
Content-Type: application/x-msnmsgr-sessionreqbody
Content-Length: 99

EUF-GUID: {A4268EEC-FEC5-49E5-95C3-F126696BDBF6}
SessionID: 144262341
AppID: 1
Context: MA

(NULL)(NULL)(NULL)(NULL)(NULL)

以上のデータが送信されていました.あとはデータの断片を手がかりに Kopete のソースコードを検索すると... dispatcher.cpp の 79 〜 106 行目にそれらしきコードが見つかりました.

79: void Dispatcher::requestDisplayIcon(const QString& from, const QString& msnObject)
 80: {
 81:   Q_UINT32 sessionId = rand()%0xFFFFFF00 + 4;
 82:   TransferContext* current =
 83:     new IncomingTransfer(from, this, sessionId);
 84:
 85:   current->m_branch = P2P::Uid::createUid();
 86:   current->m_callId = P2P::Uid::createUid();
 87:   current->setType(P2P::UserDisplayIcon);
 88:   current->m_object = msnObject;
 89:   // Add the transfer to the list.
 90:   m_sessions.insert(sessionId, current);
 91:
 92:   kdDebug(14140) << k_funcinfo << "Requesting, " << msnObject << endl;
 93:
 94:   QString context = QString::fromUtf8(KCodecs::base64Encode(msnObject.utf8()));
 95:   // NOTE remove the \0 character automatically
 96:   // appended to a QCString.
 97:   context.replace("=", QString::null);
 98:   QString content =
 99:     "EUF-GUID: {A4268EEC-FEC5-49E5-95C3-F126696BDBF6}\r\n"
100:     "SessionID: " + QString::number(sessionId) + "\r\n"
101:     "AppID: 1\r\n"
102:     "Context: " + context + "\r\n"
103:     "\r\n";
104:   // Send the sending client an invitation message.
105:   current->sendMessage(INVITE, content);
106: }

強調部分が見付かったコードです.この関数の名前が requestDisplayIcon() であることから,おそらくはコンタクトリストの画像を要求しているコードと思います.

つまり,Kopete は,相手ユーザがオンラインになったときに,自動的に相手のコンタクトリスト画像を要求するメッセージを送信し,それを Regnessem が受け取って会話ウィンドウをオープンする,ということのようです.

Kopete の設定を変更してコンタクトリスト画像を要求しないようにすればいいのでしょうが,それは嫌なので,別な方法で解決する必要があります.

今日は力尽きたので,続きは次の機会にします.

[Linux] Amarok + Lyrics ID3 + libgpod を使って iPod に歌詞を転送

iPod とのやりとりを行うフリーなライブラリに libgpod があります.私が使用しているフリーの音楽プレイヤー Amarok はこれを使用して iPod にデータを転送しています.

さて,Apple の説明にもある通り,第 5 世代の iPod と iPod nano には歌詞を表示する機能があります.これは,ID3v2.3 タグに記録された歌詞データ用のフレーム (USLT) に記録された歌詞を表示する,というものです.CVS スナップショット版の libgpod では既に利用可能のようです.

そして,Amarok を使って ID3 タグに歌詞データを埋め込むための Amarok スクリプトもあります.このスクリプトは,Amarok の歌詞スクリプトで取り込んだ歌詞 (もしくは手入力した歌詞) を MP3 ファイルの ID3v2.3 タグに直接書き込んでいく,というものです.

これで土台は整いました.というわけで,iPod で歌詞を表示するために以下のような手順を試してみました.

  1. libgpod をインストールする.
  2. libgpod サポートを有効にした Amarok をインストールする.
  3. Lyrics ID3 スクリプトをインストールし,歌詞スクリプトを使用して別途取り込んだ歌詞を MP3 ファイルに書き込む.
  4. Amarok の「メディアデバイス」機能を使用して,Amarok から iPod に MP3 データを転送する.
  5. (上に書いた歌詞表示要件を満たす) iPod で転送した曲を再生し,歌詞が表示できるかを確認する.

Amarok-1.4.2_beta1 と 2006 年 8 月 29 日 17 時 18 分現在のスナップショットによる libgpod で試したところ... 歌詞が表示されませんでした.あれ?

libgpod 側は問題ないと仮定して,Amarok のソースコードを眺めてみると... 歌詞の有無を iPod 側に通知するためのフラグ変数 (lyrics_flag) には触れていなかったので,これが原因とみて,試しに簡易パッチを作成しました.以下に,Amarok-1.4.2_beta1 に対するパッチを載せておきます.ライセンスは GPL とします (従って無保証です).

diff -urN amarok-1.4.2-beta1-orig/amarok/src/mediadevice/ipod/ipodmediadevice.cpp amarok-1.4.2-beta1-modified/amarok/src/mediadevice/ipod/ipodmediadevice.cpp
--- amarok-1.4.2-beta1-orig/amarok/src/mediadevice/ipod/ipodmediadevice.cpp     2006-08-20 17:15:33.000000000 +0900
+++ amarok-1.4.2-beta1-modified/amarok/src/mediadevice/ipod/ipodmediadevice.cpp 2006-08-20 17:35:42.000000000 +0900
@@ -47,6 +47,9 @@
 #include <cstdlib>
 #include <unistd.h>

+#include <mpegfile.h>
+#include <id3v2tag.h>
+#include <id3v2frame.h>

 // disable if it takes too long for you
 #define CHECK_FOR_INTEGRITY 1
@@ -198,6 +201,7 @@
     m_playlistItem = 0;
     m_supportsArtwork = false;
     m_supportsVideo = false;
+    m_supportsLyrics = false;
     m_isShuffle = true;

     m_requireMount = true;
@@ -433,6 +437,23 @@
         }
     }

+    if( m_supportsLyrics && type == "mp3" )
+    {
+        // set lyrics_flag to non-zero when 'USLT' ID3v2 tag field is available.
+        TagLib::MPEG::File f( QFile::encodeName( bundle.url().path() ) );
+        TagLib::ID3v2::Tag *id3v2tag = f.ID3v2Tag( false );
+        if ( id3v2tag != 0 )
+        {
+            const TagLib::ID3v2::FrameList frameList =
+                id3v2tag->frameListMap()["USLT"];
+            if ( !frameList.isEmpty() )
+            {
+                // found USLT tag field
+                track->lyrics_flag = 1;
+            }
+        }
+    }
+
     return addTrackToView( track, item );
 }

@@ -878,6 +899,7 @@
     m_isShuffle = true;
     m_supportsArtwork = false;
     m_supportsVideo = false;
+    m_supportsLyrics = false;
     m_dbChanged = false;
     m_files.clear();

@@ -1014,6 +1036,14 @@
             default:
                 break;
             }
+
+            if( ipodInfo->ipod_generation
+                || ipodInfo->ipod_model == ITDB_IPOD_MODEL_NANO_WHITE
+                || ipodInfo->ipod_model == ITDB_IPOD_MODEL_NANO_BLACK )
+            {
+                m_supportsLyrics = true;
+                debug() << "detected lyrics-displayable iPod" << endl;
+            }
         }

         if( modelString )
diff -urN amarok-1.4.2-beta1-orig/amarok/src/mediadevice/ipod/ipodmediadevice.h amarok-1.4.2-beta1-modified/amarok/src/mediadevice/ipod/ipodmediadevice.h
--- amarok-1.4.2-beta1-orig/amarok/src/mediadevice/ipod/ipodmediadevice.h       2006-08-20 17:15:33.000000000 +0900
+++ amarok-1.4.2-beta1-modified/amarok/src/mediadevice/ipod/ipodmediadevice.h   2006-08-20 17:15:42.000000000 +0900
@@ -115,6 +115,7 @@
         bool              m_isShuffle;
         bool              m_supportsArtwork;
         bool              m_supportsVideo;
+        bool              m_supportsLyrics;

         IpodMediaItem    *getArtist( const QString &artist );
         IpodMediaItem    *getAlbum( const QString &artist, const QString &album );

パッチの中身は概ね次の通りです.

  • 接続された iPod の種類を確認し,歌詞表示機能を持ったものかどうかをチェックする.
  • 歌詞表示機能を有する iPod であった場合,転送する MP3 ファイルの ID3v2.3 タグに USLT フレームの有無を調べ,あればフラグ変数 (lyrics_flag) をセットする.

このパッチを適用した Amarok を使用し,曲データの転送を行ったところ,無事に歌詞を転送することができました.というわけで,めでたしめでたし.

本家 Amarok 側でもっとより良い修正が加えられるまでのつなぎとして使ってみます.

[Linux] Linux + fontconfig でのフォントのベースライン間隔の指定方法

Fontforge チュートリアルフォントのベースラインとベースラインの間隔の設定方法の記述によると,TrueType または OpenType フォントにおいてベースラインの間隔を設定する方法はプラットフォームに依存するとあり,Mac と Windows の場合について書かれています.リンク先の 1 文(以下に引用しています)が示す通り,Linux/Unix に関しては標準的な設定方法はないようです.

Linux/Unix では標準的な振舞いが存在するのか疑問に思います.Unix のアプリケーションはおそらくこれらのどれか 1 つを選ぶでしょう.

もちろん,これらとは Mac と Windows の場合のことを指します.

今回は Linux + fontconfig 環境でこの部分がどのように振る舞うかを試しました.まずは,適当に作成した sfd ファイルの以下の項目を適当に変化させた後に TrueType フォントを生成しました.

OS2TypoAscent:
OS2TypoDescent:

同様に,元ファイルに対して以下の項目を変化させたフォントも生成しました.

HheadAscent:
HheadDescent:

生成した 2 つのフォントのベースライン間隔を Linux + fontconfig 環境でチェックすると... 間隔が変わっていたのは後者でした.つまり,この環境では Mac と同様の振舞いをするということを意味します.

この結果を自分に対する覚え書きとしてここに残しておきます.

[Linux] dmix

複数のアプリケーションから同時に音を鳴らすために,今まで私は aRtsEsounD を用いていました.

Linux のサウンド出力に alsa を使っている場合は dmix がサウンドのミキシングを行ってくれると聞き,試してみました.

HOWTO ALSA sound mixer aka dmix - Gentoo Linux Wiki によると,This device can be dmix, which doesn't need to be configured as it exists by default. とあるので,とりあえず何もせずにそのまま試してみることにします.

サウンドデーモンを一通り kill した後,alsaplayer を 2 個起動して両方から音を鳴らすテストをしてみました.

$ alsaplayer -o alsa -d default hoge.mp3 &
(hoge.mp3 が鳴り始めるまで待つ)
$ alsaplayer -o alsa -d default hoge.mp3 &

ちゃんと 2 個同時に再生されました.出力先が default でも問題ないようです.

次に alsaplayer を停止し,MPlayer から音を鳴らしてみます.

$ mplayer -ao alsa hoge.avi
MPlayer 1.0pre7try2-3.3.6 (C) 2000-2005 MPlayer Team
(中略)
alsa-init: 1 soundcard found, using: default
alsa: 44100 Hz/2 channels/4 bpf/60208 bytes buffer/Signed 16 bit Little Endian
AO: [alsa] 44100Hz 2ch s16le (2 bps)
Building audio filter chain for 44100Hz/2ch/s16le -> 44100Hz/2ch/s16le...
(中略)
[mpeg4 @ 0x863b0e0]frame skip 8t:  0.000   1/  1 ??% ??% ??,?% 0 0 78%
[mpeg4 @ 0x863b0e0]frame skip 8t: -0.003   2/  2 ??% ??% ??,?% 0 0 78%
alsa-space: xrun of at least 0.106 msecs. resetting stream?,?% 0 0 99%
alsa-space: xrun of at least 0.068 msecs. resetting stream?,?% 2 0 99%
alsa-space: xrun of at least 0.106 msecs. resetting stream0.5% 3 0 99%
alsa-space: xrun of at least 0.062 msecs. resetting stream0.5% 5 0 99%
alsa-space: xrun of at least 0.058 msecs. resetting stream0.5% 6 0 99%
...

フレームレートがもの凄く低下して再生されます.何故でしょう.とりあえず出力先を default から dmix に切り替えてみます.

$ mplayer -ao alsa:device=dmix hoge.avi
MPlayer 1.0pre7try2-3.3.6 (C) 2000-2005 MPlayer Team
(中略)
AUDIO: 22050 Hz, 1 ch, s16le, 352.8 kbit/100.00% (ratio: 44100->44100)
(中略)
Checking audio filter chain for 22050Hz/1ch/s16le -> 22050Hz/2ch/s16le...
AF_pre: 22050Hz/1ch/s16le
alsa-init: 1 soundcard found, using: dmix
alsa: 48000 Hz/2 channels/4 bpf/65536 bytes buffer/Signed 16 bit Little Endian
AO: [alsa] 48000Hz 2ch s16le (2 bps)
Building audio filter chain for 22050Hz/1ch/s16le -> 48000Hz/2ch/s16le...
(中略)
A:  21.4 V:  42.4 A-V:-21.014 ct: -4.129 1272/1272  6%  0%  0.1% 34 0 48%

一番下の強調箇所を観ると明らかですが,音声と映像がズレています.映像の方が速く再生されています.

これを解決するべく,HOWTO ALSA sound mixer aka dmix - Gentoo Linux Wikiにあるように 44,100kHz にリサンプリングしてから再生してみました.ここではコマンドラインからリサンプラの使用を指示しました.

$ mplayer -ao alsa:device=dmix -af resample=44100 hoge.avi
MPlayer 1.0pre7try2-3.3.6 (C) 2000-2005 MPlayer Team
(中略)
AUDIO: 22050 Hz, 1 ch, s16le, 352.8 kbit/100.00% (ratio: 44100->44100)
(中略)
Checking audio filter chain for 22050Hz/1ch/s16le -> 22050Hz/2ch/s16le...
AF_pre: 44100Hz/1ch/s16le
alsa-init: 1 soundcard found, using: dmix
alsa: 48000 Hz/2 channels/4 bpf/65536 bytes buffer/Signed 16 bit Little Endian
AO: [alsa] 48000Hz 2ch s16le (2 bps)
Building audio filter chain for 22050Hz/1ch/s16le -> 48000Hz/2ch/s16le...
(中略)
A: 363.7 V: 363.7 A-V: -0.027 ct: -9.155 10912/10912  7%  0%  0.6% 8 0 45%

音と映像のズレがなくなりました.めでたしめでたし.

とりあえず全てのアプリケーションの音声出力を dmix に切り替えるように設定しました.これでサウンドデーモンが不要になりました.

なお,~/.asoundrc は作っていません.しばらく dmix を使ってみます.

[Linux] Macromedia Flash Player 7 for Mozilla and Mozilla compatible on Linux で文字が出ない場合

Macromedia Flash Player 7 for Mozilla and Mozilla compatible on Linux で文字が出ない場合があります.

Fedora Core 4 上の Firefox + libflashplayer.so では (kochi-substitute ではありますが)一応表示されていますので,なぜ出ないのかを検討してみました.

まずはダイナミックリンクライブラリの調査から.

% ldd libflashplayer.so
        linux-gate.so.1 =>  (0xffffe000)
        libpthread.so.0 => /lib/libpthread.so.0 (0xb7c8d000)
        libdl.so.2 => /lib/libdl.so.2 (0xb7c89000)
        libz.so.1 => /lib/libz.so.1 (0xb7c78000)
        libX11.so.6 => /usr/lib/libX11.so.6 (0xb7bac000)
        libXext.so.6 => /usr/lib/libXext.so.6 (0xb7b9d000)
        libXt.so.6 => /usr/lib/libXt.so.6 (0xb7b47000)
        libXmu.so.6 => /usr/lib/libXmu.so.6 (0xb7b31000)
        libm.so.6 => /lib/libm.so.6 (0xb7b0f000)
        libc.so.6 => /lib/libc.so.6 (0xb79fc000)
        /lib/ld-linux.so.2 (0x80000000)
        libSM.so.6 => /usr/lib/libSM.so.6 (0xb79f3000)
        libICE.so.6 => /usr/lib/libICE.so.6 (0xb79dc000)
%

libflashplayer.so は,Xft を使っていません.Fedora Core 4 上でアンチエイリアスのかかった文字が表示されているので,何か別な方法(自前?)でレンダリングしているようです.

次に strings(1) で文字列を調べてみます.と調べたのが次の結果.

% strings libflashplayer.so | grep -i kochi
Kochi Gothic
Kochi Mincho
%

何ということでしょう.フォント名がバイナリに埋め込まれています.

嘆き悲しみつつ実行した fc-list の出力結果は次の通りです.

% fc-list | grep -i Kochi
Kochi Mincho:style=Regular
Kochi Gothic:style=Regular
%

私の環境には media-fonts/kochi-substitute-20030809-r3 がインストールされていますので,fc-list を実行すると当然,このように出力されます.ただ... フォントが入っていても,libflashplayer.so は文字を表示してくれません.

ldd の実行結果から libflashplayer.so が Xft を使ってなさそうということはいえるので,fontconfig からフォントが使えても意味がないのは当然かも知れません.

そして,xlsfonts の出力結果も出しておきます.

% xlsfonts | grep -i Kochi
%

後者は何も表示されませんでした.つまり私の環境では,X コアフォントシステム経由で Kochi Gothic が使えないということです.

念のため,fonts.dir を編集し,コアフォントシステム経由で Kochi Gothic を使用可能にしてみました.

% sudo vim /usr/share/fonts/kochi-substitute/fonts.dir
(fonts.dir を編集)
% xset fp rehash
% xlsfonts | grep -i Kochi
-misc-kochi gothic-medium-r-normal--0-0-0-0-c-0-adobe-standard
(snip)
-misc-kochi gothic-medium-r-normal--0-0-0-0-c-0-microsoft-cp1250
%

以上の手順を実行してから Firefox を起動すると... 何ということでしょう.今まで見られなかった Flash コンテンツ上の文字列が見事に出現しました.

表示されている文字にはアンチエイリアスがかかっていますので,X コアフォントシステム経由でグリフを取得しているわけではなさそうです.

もしかすると,コアフォントシステム経由で TrueType Font のパスを取得して,自前でラスタライズをしているのかも知れません.こう考えればつじつまが合います.

とりあえず,ある TrueType フォントがコアフォントシステム経由で "Kochi Gothic" として使えるようになっていれば,libflashplayer.so はそのフォントで日本語の文字列を表示してくれる,ということだけは分かりました.

名前が "Kochi Gothic" でありさえすればよいので,例えば ipagui.ttf と同じディレクトリにある fonts.dir に以下のように記述しておけば,IPA ゴシックで表示してくれます.

[Linux] シンボリックリンクの指す先へ cd するには

cd に "-P" オプションを指定します.

ただし,man P cd によると,このオプションはシェルの実装に依存するそうです.

[Linux] fstab-sync

hal の設定ファイルを探してみると,/usr/share/hal/fdi 以下にありました.このディレクトリ以下のファイルをいろいろいじることで,設定を変更できそうです.

手始めにマウントポイントの変更から./usr/share/hal/fdi/90defaultpolicy/storage-policy.fdi を編集します.

<merge key="storage.policy.default.mount_root" type="string">/media</merge>

強調箇所を変更すれば OK のようです.

さらに,CD ドライブの場合に iocharset=euc-jp を自動的に付加するには,CF-R3にFedora Core 3をインストールした事例 を参考にして,

<merge key="storage.policy.mount_option.iocharset=euc-jp" type="bool">true</merge>

を <match key="storage.drive_type" string="cdrom"> 〜 </match> の間に付けます.

設定ファイルを変更したら,hald を再起動します.

[Linux] X.Org 6.8.99.14 on i945G Chipset

X.Org の開発版(Release 6.8.99.x)では,i810_drv.o が Intel i945G をサポートしています.

というわけで試してみました.まずは i945G であることを確認.

$ lspci
0000:00:02.0 VGA compatible controller: Intel Corporation 945G Integrated Graphics Controller (rev 02)

さて,xorg.conf の編集です.

Section "Device"
    Identifier      "i945G"
    Driver          "i810"
EndSection

Section "Monitor"
    Identifier      "LCD-A171GS"
    Option          "DPMS"
EndSection

Section "Screen"
    Identifier      "Screen0"
    Device          "i945G"
    Monitor         "LCD-A171GS"
    DefaultDepth    24
    SubSection "Display"
        Depth       24
        Modes       "1280x1024"
    EndSubsection
EndSection

まずはドライバに何もオプションを与えず,デフォルトで試します.

... 結果は惨敗.

This is a pre-release version of the The X.Org Foundation X11.
It is not supported in any way.
(snipped)
X Window System Version 6.8.99.14
Release Date: 03 July 2005 + cvs
X Protocol Version 11, Revision 0, Release 6.8.99.14
(snipped)
(EE) end of block range 0x20cf < begin 0x20d0
(EE) end of block range 0x20cf < begin 0x20d0
(1600x1200,LCD-A171GS) mode clock 234MHz exceeds DDC maximum 140MHz
*** glibc detected *** double free or corruption (fasttop): 0x08215e70 ***
XIO:  fatal IO error 104 (Connection reset by peer) on X server ":0.0"
      after 0 requests (0 known processed) with 0 events remaining.

気になる glibc detected のエラーがありますが,開発版の X.Org なので無視します.

LCD-A171GS は 1280x1024 が最高なのですが,1600x1200 で起動しようとしています.DDC が報告するピクセルクロックを越えているのでエラーになっています.

DDC が報告する最高解像度を越える理由がわかりませんが,とりあえず以下のようにして DDC を無効にします.

Section "Device"
    Identifier      "i945G"
    Driver          "i810"
    Option          "DDC"       "false"
EndSection

そうすると,今度は自前で Modeline を書くなりして Mode "1280x1024" を定義しないといけません.しかし,これがまた面倒です.何かいい方法はないものでしょうか.

Section "Monitor"
    Identifier      "LCD-A171GS"
    HorizSync       30-100
    VertRefresh     60-75
    Option          "DPMS"
EndSection

HorizSync と VertRefresh の範囲を勘で設定して,起動することができました.きっとモニタは大丈夫でしょう.しかし,フォントが小さくなっています.察するに,DPI の設定が変なようです.というわけでさらに修正.

Section "Monitor"
    Identifier      "LCD-A171GS"
    HorizSync       30-100
    VertRefresh     60-75
    Option          "DPMS"
    DisplaySize     340 270
EndSection

これでめでたく i945G の上で X.Org が動作しました.ただし... DRI が今のところ動いていません.

$ glxinfo
name of display: :0.0
display: :0  screen: 0
direct rendering: No
(snipped)

[Linux] HL-DT-ST DVDRAM GSA-4163B + growisofs

HL-DT-ST DVDRAM GSA-4163B + growisofs v5.21 on gentoo-sources-2.6.11-r11 で DVD+R を焼く時にいつも失敗して DVD+R をコースターにしていました.

メディアはリコーの 8 倍速対応 DVD+R なのですが,いつも growisofs が 12 倍速で書き込もうとして,次のエラーが出るのです.

$ growisofs -Z /dev/hda=hogehoge.iso -speed=8

/dev/hda: "Current Write Speed" is 12.3x1385KBps.
 :-[ WRITE@LBA=220h failed with SK=5h/ASC=21h/ACQ=02h]: Input/output error

ドライブは 8 倍速でしか書けないはずなのに,何故 12 倍速で書き込もうとするのか分かりません.何気なく dvd+rw-mediainfo を実行してみると...

$ dvd+rw-mediainfo /dev/hda
INQUIRY:                [HL-DT-ST][DVDRAM GSA-4163B][A104]
GET [CURRENT] CONFIGURATION:
 Mounted Media:         1Bh, DVD+R
 Current Write Speed:   12.0x1385=16620KB/s
 Write Speed #0:        12.0x1385=16620KB/s
 Write Speed #1:        8.0x1385=11081KB/s
 Write Speed #2:        8.0x1385=11080KB/s
 Write Speed #3:        4.0x1385=5540KB/s
 Speed Descriptor#0:    02/2295103 R@4.1x1385=5730KB/s W@12.0x1385=16620KB/s
 Speed Descriptor#1:    02/2295103 R@4.1x1385=5730KB/s W@8.0x1385=11081KB/s
 Speed Descriptor#2:    02/2295103 R@4.1x1385=5730KB/s W@8.0x1385=11080KB/s
 Speed Descriptor#3:    02/2295103 R@4.1x1385=5730KB/s W@4.0x1385=5540KB/s
READ DVD STRUCTURE[#0h]:
 Media Book Type:       A1h, DVD+R book [revision 1]
 Media ID:              RICOHJPN/R02
 Legacy lead-out at:    2252864*2KB=4613865472

メディアに 12 倍速と書いてあるようです... growisofs はこれを信じて 12 倍速で書き込みを行ったようですが,当然,ドライブ側が追い付かないのでエラーになる,というわけです.

ここで不思議なのは,growisofs に -speed=8 を渡しているにも関わらず,12 倍速で書き込みを行っていることです.そこで -speed=1 としてみることに... するとどうでしょう.

$ growisofs -dvd-compat -Z /dev/hda=hogehoge.iso -speed=1
Executing 'builtin_dd if=hogehoge.iso of=/dev/hda obs=32k seek=0'
/dev/hda: "Current Write Speed" is 4.1x1385KBps.
   1114112/4603723776 ( 0.0%) @0.0x, remaining 481:58
   1114112/4603723776 ( 0.0%) @0.0x, remaining 688:31
   1114112/4603723776 ( 0.0%) @0.0x, remaining 963:56
  17694720/4603723776 ( 0.4%) @3.5x, remaining 73:25
  36143104/4603723776 ( 0.8%) @3.9x, remaining 42:07
  54624256/4603723776 ( 1.2%) @3.9x, remaining 33:18
(snip)
 405471232/4603723776 ( 8.8%) @3.9x, remaining 15:00
(snip)
4600070144/4603723776 (99.9%) @3.9x, remaining 0:00
builtin_dd: 2247920*2KB out @ average 3.8x1385KBps
/dev/hda: flushing cache
/dev/hda: closing track
/dev/hda: closing disc

あれぇ,-speed=1 で 4.1x1385KBps ですか.さらに驚くべきことに,この書き込みは 15 分で完了しています.DVD 1 枚は 120 分ですから,4 倍速で書き込んだ場合,30 分かかるはずです.15 分で完了しているということは... 実際には 8 倍速で書き込んでおり,growisofs に渡すオプションと,growisofs の出力が実際とは異なっていることになります.

ちなみに -speed=2 としても 4.1x1385KBps となり,当然 15 分で書き込みが完了します.-speed=3 以上は試してません.

今まで 6 枚の DVD+R をコースターにしてきたので,書き込み方が分かっただけでも喜びは大きいです...

[Linux] Linux の I/O スケジューリング

確かにうちの Gentoo Linux マシンでも,ディスク高負荷時に重くなりました.mkisofs 実行中のサウンド出力が途切れます.

今使っている sys-kernel/gentoo-sources-2.6.11-r11 カーネルのパラメータに次のようなものがあります.

Device Drivers  --->
  Block devices  --->
    IO Schedulers  --->
      <*> Anticipatory I/O scheduler
      < > Deadline I/O scheduler
      < > CFQ I/O scheduler

Anticipatory I/O scheduler が選択されていたので,試しに CFQ I/O scheduler に変えてカーネルをコンパイルしてみました.

すると,同じように mkisofs で巨大なディスクイメージをごりごり作っている間でもサウンドが途切れませんでした.

[Linux] chkrootkit ディスクを作ってみました

chkrootkit と必要なコマンド(awk cut egrep find head id ls netstat ps strings sed test uname echo)のスタティックバイナリをひとまとめにしてみました.これでいつでもどこでも chkrootkit!

さすがに全てのコマンドがスタティックリンクになると,フロッピー 1 枚には収まりません.busybox の偉大さを感じました.

[Linux] DVD-ROM ドライブを使用する場合の /etc/fstab

UDF は ISO-9660 互換のファイルシステムであるため,例えば,/etc/fstab に次のように記述した状態で UDF のディスクをマウントすることができてしまいます.

/dev/cdroms/cdrom0       /mnt/cdrom       iso9660     ro,owner,nosuid,noauto,iocharset=euc-jp      1 0

こうすると,UDF のディスクへのアクセスは,ISO-9660 ファイル名を用いるので使いづらいです.かといって,/etc/fstab に次のように書くと,当然ながら今度は ISO-9660 のディスクがマウントできなくなってしまいます.

/dev/cdroms/cdrom0       /mnt/cdrom       udf         ro,owner,nosuid,noauto,iocharset=euc-jp      1 0

そこで,こういう場合は /etc/fstab を次のように書き換えます.

/dev/cdroms/cdrom0       /mnt/cdrom       udf,iso9660 ro,owner,nosuid,noauto,iocharset=euc-jp      1 0

この部分に関する記述はしっかり mount(8) に載っていました.私はこういう書き方が許されることをたった今知りました...

あれ,そういえば昔 Fedora Core 2 をインストールしたときにこんな記述に見覚えが...

[Linux] Acrobat Reader 7.0 for Linux

をををっ,Acrobat Reader 7.0 for Linux があるじゃありませんか.まさに待望の品,自ずと期待が高まります.

app-text/acroread-7.0 は masked package でしたが,構わずインストールします.

そして起動... ををを,Acrobat Reader 7.0 は GTK+2 アプリケーションになってます.

Uho! Acrobat Reader 5.01 では表示できなかった PDF もあっさり表示してくれました.

[Linux] screen + ssh-agent(or ssh -A)

私はずっと screen を使い続けています.そうすると,ssh-agent を併用するときに問題に出くわします.

最初にログインするとき,sshd がエージェントフォワーディング用のソケットファイルを作成します(/tmp/ssh-xxxxxxx/agent.x とします).

sshd はこのファイルを値にもつ環境変数 SSH_AUTH_SOCK を設定し,ログインシェルを起動します.

私のログインシェルは exec screen するので,ここで screen が起動します.

起動した screen はシェルを起動して,ログインセッションが完了します.

このとき,下の図のように,全てのプロセスが持つ環境変数 SSH_AUTH_SOCK は,ログイン時に sshd が設定した値と等しくなっています.

次に screen をデタッチします.2 つある screen のプロセスが切り離され,デタッチが行われます.

そして再びログインします.同じように sshd はソケットファイルを作成し,それを環境変数 SSH_AUTH_SOCK に設定し screen を起動します.が,しかし...!

上の図のような状態になります.つまり,アタッチしても起動していたプロセスの環境変数が勝手に書き換わるわけがないので,私はアタッチ後,新しいエージェントフォワーディング用ソケットファイルを探す必要があります.

と,こういうわけです.keychain を起動してから /usr/bin/ssh を起動する,ラッパーシェルスクリプトを書いてみますか.

おっと... cclub サーバには keychain がないんじゃないかな?

え? コピーすればいい? /usr/bin/keychain は sh スクリプトですもの.

[Linux] CentOS4, WhiteBox Enterprise Linux

CentOS, White Box Enterprise Linux というディストリビューションがあるんですね.

[Linux] X.org on RADEON X800 (2)

修行が足りませんでした.X.org のメンバーは既に RADEON X800 (PCIE) をサポートするドライバを作っていました.X のログによると,このドライバがサポートしているグラフィックチップは次の通りです.

(II) RADEON: Driver for ATI Radeon chipsets: ATI Radeon QD (AGP),
    ATI Radeon QE (AGP), ATI Radeon QF (AGP), ATI Radeon QG (AGP),
    ATI Radeon VE/7000 QY (AGP/PCI), ATI Radeon VE/7000 QZ (AGP/PCI),
    ATI Radeon Mobility M7 LW (AGP),
    ATI Mobility FireGL 7800 M7 LX (AGP),
    ATI Radeon Mobility M6 LY (AGP), ATI Radeon Mobility M6 LZ (AGP),
    ATI Radeon IGP320 (A3) 4136, ATI Radeon IGP320M (U1) 4336,
    ATI Radeon IGP330/340/350 (A4) 4137,
    ATI Radeon IGP330M/340M/350M (U2) 4337,
    ATI Radeon 7000 IGP (A4+) 4237, ATI Radeon Mobility 7000 IGP 4437,
    ATI FireGL 8700/8800 QH (AGP), ATI Radeon 8500 QL (AGP),
    ATI Radeon 9100 QM (AGP), ATI Radeon 8500 AIW BB (AGP),
    ATI Radeon 8500 AIW BC (AGP), ATI Radeon 7500 QW (AGP/PCI),
    ATI Radeon 7500 QX (AGP/PCI), ATI Radeon 9000/PRO If (AGP/PCI),
    ATI Radeon 9000 Ig (AGP/PCI), ATI FireGL Mobility 9000 (M9) Ld (AGP),
    ATI Radeon Mobility 9000 (M9) Lf (AGP),
    ATI Radeon Mobility 9000 (M9) Lg (AGP),
    ATI Radeon 9100 IGP (A5) 5834,
    ATI Radeon Mobility 9100 IGP (U3) 5835, ATI Radeon 9100 PRO IGP 7834,
    ATI Radeon Mobility 9200 IGP 7835, ATI Radeon 9200PRO 5960 (AGP),
    ATI Radeon 9200 5961 (AGP), ATI Radeon 9200 5962 (AGP),
    ATI Radeon 9200SE 5964 (AGP),
    ATI Radeon Mobility 9200 (M9+) 5C61 (AGP),
    ATI Radeon Mobility 9200 (M9+) 5C63 (AGP), ATI Radeon 9500 AD (AGP),
    ATI Radeon 9500 AE (AGP), ATI Radeon 9600TX AF (AGP),
    ATI FireGL Z1 AG (AGP), ATI Radeon 9700 Pro ND (AGP),
    ATI Radeon 9700/9500Pro NE (AGP), ATI Radeon 9700 NF (AGP),
    ATI FireGL X1 NG (AGP), ATI Radeon 9600 AP (AGP),
    ATI Radeon 9600SE AQ (AGP), ATI Radeon 9600XT AR (AGP),
    ATI Radeon 9600 AS (AGP), ATI FireGL T2 AT (AGP),
    ATI FireGL RV360 AV (AGP),
    ATI Radeon Mobility 9600/9700 (M10/M11) NP (AGP),
    ATI Radeon Mobility 9600 (M10) NQ (AGP),
    ATI Radeon Mobility 9600 (M11) NR (AGP),
    ATI Radeon Mobility 9600 (M10) NS (AGP),
    ATI FireGL Mobility T2 (M10) NT (AGP),
    ATI FireGL Mobility T2e (M11) NV (AGP), ATI Radeon 9800SE AH (AGP),
    ATI Radeon 9800 AI (AGP), ATI Radeon 9800 AJ (AGP),
    ATI FireGL X2 AK (AGP), ATI Radeon 9800PRO NH (AGP),
    ATI Radeon 9800 NI (AGP), ATI FireGL X2 NK (AGP),
    ATI Radeon 9800XT NJ (AGP), ATI Radeon X600 (RV380) 3E50 (PCIE),
    ATI FireGL V3200 (RV380) 3E54 (PCIE),
    ATI Radeon Mobility X600 (M24) 3150 (PCIE),
    ATI FireGL M24 GL 3154 (PCIE), ATI Radeon X300 (RV370) 5B60 (PCIE),
    ATI Radeon X600 (RV370) 5B62 (PCIE),
    ATI FireGL V3100 (RV370) 5B64 (PCIE),
    ATI FireGL D1100 (RV370) 5B65 (PCIE),
    ATI Radeon Mobility M300 (M22) 5460 (PCIE),
    ATI FireGL M22 GL 5464 (PCIE), ATI Radeon X800 (R420) JH (AGP),
    ATI Radeon X800PRO (R420) JI (AGP),
    ATI Radeon X800SE (R420) JJ (AGP), ATI Radeon X800 (R420) JK (AGP),
    ATI Radeon X800 (R420) JL (AGP), ATI FireGL X3 (R420) JM (AGP),
    ATI Radeon Mobility 9800 (M18) JN (AGP),
    ATI Radeon X800XT (R420) JP (AGP), ATI Radeon X800 (R423) UH (PCIE),
    ATI Radeon X800PRO (R423) UI (PCIE),
    ATI Radeon X800LE (R423) UJ (PCIE),
    ATI Radeon X800SE (R423) UK (PCIE),
    ATI FireGL V7200 (R423) UQ (PCIE), ATI FireGL V5100 (R423) UR (PCIE),
    ATI FireGL V7100 (R423) UT (PCIE),
    ATI Radeon X800XT (R423) 5D57 (PCIE)

ATI Radeon X800 (R423) UH (PCIE) がありますね.というわけで /etc/X11/xorg.conf を次のように修正します.

Section "Device"
    Identifier  "ATI RADEON X800"
    Driver      "radeon"
    BusID       "PCI:4:0:0"
    ChipID      0x5548
    Screen      0
EndSection

相変わらず ChipID の変更は必要でしたが,これで startx すると,X のログには次のように記録されました.

(WW) RADEON: No matching Device section for instance (BusID PCI:4:0:1) found
(**) ChipID override: 0x5548
(**) Chipset ATI Radeon X800 (R423) UH (PCIE) found

OK! いい感じです.

今は DRI が無効の状態で起動しています.ログを見ると...

(WW) RADEON(0): Direct rendering not yet supported on Radeon 9500 and newer cards

がーん... マジですか.

[Linux] X.org on RADEON X800

X.org の ATi Radeon X800 ドライバは ATi から提供されています.

手順通りにインストールしたはいいものの,なぜか起動しません.

/var/log/Xorg.0.log の最後には次のように書いてありました.

(II) ATI Radeon/FireGL: The following chipsets are supported:
        RADEON 9000/9000 PRO (RV250 4966), RADEON 9000 LE (RV250 4967),
        MOBILITY FireGL 9000 (M9 4C64), MOBILITY RADEON 9000 (M9 4C66),
        RADEON 9000 PRO (D9 4C67), RADEON 9250 (RV280 5960),
        RADEON 9200 (RV280 5961), RADEON 9200 SE (RV280 5964),
        MOBILITY RADEON 9200 (M9+ 5C61), MOBILITY RADEON 9200 (M9+ 5C63),
        FireGL 8800 (R200 5148), RADEON 8500 (R200 514C),
        RADEON 9100 (R200 514D), RADEON 8500 AIW (R200 4242),
        RADEON 9600 (RV350 4150), RADEON 9600 SE (RV350 4151),
        RADEON 9600 PRO (RV360 4152),
        MOBILITY RADEON 9600/9700 (M10/M11 4E50), RADEON 9500 (R300 4144),
        RADEON 9600 TX (R300 4146), FireGL Z1 (R300 4147),
        RADEON 9700 PRO (R300 4E44), RADEON 9500 PRO/9700 (R300 4E45),
        RADEON 9600 TX (R300 4E46), FireGL X1 (R300 4E47),
        RADEON 9800 SE (R350 4148), RADEON 9550 (RV350 4153),
        FireGL T2 (RV350 4154), RADEON 9800 PRO (R350 4E48),
        RADEON 9800 (R350 4E49), RADEON 9800 XT (R360 4E4A),
        FireGL X2-256/X2-256t (R350 4E4B),
        MOBILITY FireGL T2/T2e (M10/M11 4E54), RADEON X300 (RV370 5B60),
        RADEON X600 (RV380 5B62), FireGL V3100 (RV370 5B64),
        MOBILITY RADEON X300 (M22 5460), MOBILITY FireGL V3100 (M22 5464),
        RADEON X600 (RV380 3E50), FireGL V3200* (RV380 3E54),
        MOBILITY RADEON X600 (M24 3150), MOBILITY RADEON X300 (M22 3152),
        MOBILITY FireGL V3200 (M24 3154), RADEON X800 (R420 4A48),
        RADEON X800 PRO (R420 4A49), RADEON X800 SE (R420 4A4A),
        RADEON X800 XT (R420 4A4B), RADEON X800 (R420 4A4C),
        FireGL X3-256 (R420 4A4D), MOBILITY RADEON 9800 (M18 4A4E),
        RADEON X800 XT Platinum Edition (R420 4A50), RADEON X800 (R423 5548),
        RADEON X800 PRO (R423 5549),
        RADEON X800 XT Platinum Edition (R423 554A),
        RADEON X800 SE (R423 554B), RADEON X800 XT (R423 5D57),
        FireGL V7100 (R423 5550), FireGL V5100 (R423 5551),
        MOBILITY RADEON X800 XT (M28 5D48),
        MOBILITY FireGL V5100* (M28 5D49), FireGL V5000 (RV410 5E48),
        RADEON X700 XT (RV410 5E4A), RADEON X700 PRO (RV410 5E4B),
        RADEON X700 SE (RV410 5E4C), RADEON X700 (RV410 5E4D),
        RADEON X700 (RV410 5E4F), RADEON 9100 IGP (RS300 5834),
        RADEON 9000 PRO/9100 PRO IGP (RS350 7834),
        MOBILITY RADEON 9000/9100 IGP (RS300M 5835)
(WW) fglrx: No matching Device section for instance (BusID PCI:4:0:1) found
(EE) No devices detected.

ありゃー,ちゃんと RADEON X800 (R423 5548) があるじゃないの,と思いつつ.lspci を実行すると...

0000:04:00.0 VGA compatible controller: ATI Technologies Inc: Unknown device 554f
0000:04:00.1 Display controller: ATI Technologies Inc: Unknown device 556f

あれ,デバイス ID が違う? ああ,そういえば AGP 版と PCI Express 版のチップって別物でしたっけ.

さて,どうしましょう... 最終的には vesa になるんでしょうか.

デバイス ID を誤魔化す方法を考えてみますか.

ありました.というわけで xorg.conf を編集します.

Section "Device"
    Identifier  "ATI RADEON X800"
    Driver      "fglrx"
    ChipID      0x5548
    Screen      0
EndSection

Section "Device"
    Identifier  "ATI RADEON X800 - Secondary"
    Driver      "fglrx"
    ChipID      0x5568
    Screen      1
EndSection

強調箇所が追加箇所です.こうやってデバイス ID を誤魔化して X を起動してみます.

... 残念.起動しません.しかし X のログには以下の内容が残ってました.

(WW) fglrx: No matching Device section for instance (BusID PCI:4:0:1) found
(**) ChipID override: 0x5548
(**) Chipset RADEON X800 (R423 5548) found

ちゃんと誤魔化せてます.ということは他の部分で死んでいるのでしょう.X のログをもう少し先まで読んでみます.

Symbol drmUnmap from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol drmMap from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol firegl_CheckMagic from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol firegl_QueryHwCaps from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol DRIGetDeviceInfo from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol firegl_AllocMemBufferFromTop from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol firegl_AllocMemBufferFromTop from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol firegl_GetMemInfo from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol drmMap from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol firegl_AllocCache from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol firegl_AllocCache from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol firegl_InitPCIe from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol firegl_FreePCIe from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol drmUnmap from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol drmUnmap from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol drmMap from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol drmUnmap from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol drmUnmap from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol drmMap from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol drmUnmap from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol firegl_AGPAcquire from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol drmAgpGetMode from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol drmAgpVendorId from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol drmAgpDeviceId from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol drmAgpRelease from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol drmAgpEnable from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol drmAgpSize from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol drmAgpBase from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol DRIGetDrawableInfo from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol XAAGetScreenIndex from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol XAAGetScreenIndex from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol XAAGetScreenIndex from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol XAAGetScreenIndex from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol XAAGetScreenIndex from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol XAAGetPixmapIndex from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol XAAGetPixmapIndex from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!
Symbol XAACheckTileReducibility from module /usr/X11R6/lib/modules/drivers/fglrx_drv.o is unresolved!

ぎゃぁ,なんだこれは!

見当はついてます.おそらく X.org のドライバに同梱されていたカーネルの dri ドライバ(fglrx.ko)が必要なんでしょう.

modprobe fglrx でロードしようとすると,X.org 側のドライバ同様,"No such device" エラーが出てロードされないので放置してましたが... こちらもデバイス ID を誤魔化してロードする必要があるようです.

[Linux] 見えない改行

実行可能スクリプトの改行コードにハマりました.

zsh で実行しようとすると,次のようなエラーが出力されてスクリプトが起動しません.

zsh: そのようなファイルやディレクトリはありません: ./make.sh

次は bash から実行しようとした場合の結果です.

: bad interpreter: そのようなファイルやディレクトリはありません

bad interpreter ということなので,当該スクリプトを vim で開いて確認すると,#!/bin/bash と正しく書かれているように見えます.

エラーメッセージの行頭にコロンが来ているのは何故... ということを考えたとき,原因が判明しました.スクリプトの改行コードが CR+LF だったためでした.

vim ./make.sh
:set ff=unix
:wq

として改行コードを LF に変換して万事解決です.

[Linux] samba

coLinux 側と Windows 側でデータを受け渡しするべくインストールした samba.

ところが,昨日からいくら頑張っても接続できませんでした.

つい先程原因が判明したのですが,それがあまりにもしょーもないものでした.

私の smb.conf には次のように書いてあります.

invalid users = root @wheel

そうです.接続しようとしたユーザは,wheel グループに入っているのを完全に忘れていたのでした.これで 1 日悩むなんて... しくしく.

[Linux] coLinux,再び(3)

/dev/cobd0/dev/sda1 として使用する方法がありました.coLinux-20041024 開発版スナップショットに実装されていました.

このスナップショットでは,スペシャルデバイスのエイリアスが使用可能です.設定ファイルを次のように書き換えます.このとき,カーネルパラメータも変更する必要があります.

<block_device index="0" path="\Device\Harddisk0\Partition1" enabled="true" alias="sda1" />
<bootparams>root=/dev/sda1</bootparams>

強調箇所が変更点です.この状態で coLinux を起動すると... dmesg には次のように記録されました.

alias for cobd0 is sda1
cobd alias cobd0 -> sda1 created
alias for cobd1 is sda3
cobd alias cobd1 -> sda3 created

デバイススペシャルファイル問題は解決しました.

お次はカーネルの再構築です.なお,coLinux-20041024 に含まれているカーネルは kernel-2.6.8.1-co-0.6.2-pre6 でした.

[Linux] coLinux,再び

よく考えてみると,今の私の PC には,ext3 パーティションに Gentoo Linux が入ってるんですよね... と,まっさらの Windows 環境を目の前にしてふと考えてみました.

Cygwin を入れようとしたのですが,せっかく構築した Cygwin 環境は既に消えてしまっています.一から設定ファイルを書くのが煩わしいです.

さらにさらに,私は Gentoo Linux に慣れてしまいました.Windows 上で Gentoo Linux を使うには... そうだ,coLinux!

coLinux から Gentoo Linux の入った ext3 パーティションを直接使うことができれば,ちょっと幸せになれるかも知れません.

coLinux のデフォルトのインストール手順に従うと,ディスクイメージを使用することになるのですが,このときのディスクイメージとして,\DosDevices\c:\coLinux\root_fs といった名前を指定します.

ということは,私の PC の ext3 パーティションのデバイス名を指定すれば... ディスクイメージを作る必要がなくなるのでは?

[Linux] K3b のインストール

K3b なる cdrecord のフロントエンドが見つかりました.というわけで app-cdr/k3b をマージ.

依存パッケージが 30 個近くあります.どんどんマージ.かなり時間が掛かりました.

そして一眠りした後に起動... おおー,すばらしい.

K3b はまだ KDE に取り込まれてませんが... "K" のパワーには驚かされるばかりです.

[Linux] The power of KDE

もう,あきまへん.戻れまへん.

自宅マシンのデータディスクを NTFS から ext2 に変換し,Linux を常用 OS にしてみました.

Windows はゲーム用に... これも KDE のお陰です.

[Linux] ハイバネーション

acpid をインストールして,電源ボタンのイベントを捕捉できるようになると,あることをしたくなります.

それはハイバネーションです.Linux では Software Suspend (swsusp) と言われているアレです.

[Linux] I have been Konquerored (3)

研究室の私のコンピュータは激しい(?)戦いの末,Konqueror によって征服されてしまいました.

  • ログインマネージャ(Kdm)
  • ウィンドウマネージャ(Kwin)
  • ファイルマネージャ(Konqueror)
  • 入力メソッド(skim+scim+uim+anthy)
  • PostScript プレビューア(KGhostview)
  • オーディオプレイヤー(amaroK)
  • インスタントメッセンジャー(Kopete)

再び騒ぐ Windozer の血!

時を同じくして,戦火を逃れて生き延びた強者達は次の通りです.

  • ターミナルエミュレータ(mlterm)
  • テキストエディタ(vim)
  • DVI プレビューア(XDvi)
  • Web ブラウザ(Firefox)

実験データが多いとマウスであれこれできる方が使いやすいんですね.

特に,Konqueror の kio-fish プラグインにハマりそうです.Konqueror のアドレス欄に fish://<ユーザ名>@<ホスト名> と入れるだけで WinSCP と全く同じ状態に!

後は膨大な実験結果のリストから欲しいデータを抜き取ってくるだけです.

[Linux] I have been Konquerored (2)

すいません,Konqueror だけのつもりが,KWin 環境になってまして,どうやら完全に征服されてしまいました.さすが KDE.

見た目も Windows XP っぽくしてみたり.

[Linux] 迫り来る Konqueror

自分でインストールした Konqueror ですが,早々とデスクトップを征服されてしまいそうです.

[Linux] captive を試してみました

captive という,ntfs.sys 経由で NTFS のパーティションを Linux でマウントするためのツールがあります.

インストールして使ってみました.結論を言えば,私はこれでパーティションを破壊しました.

% sudo mount -t captive-ntfs /dev/sda2 /mnt/windows

日本語のディレクトリが文字化けするものの,読み出しは成功のようです.オプションがサポートされているか不明でしたが.とりあえず iocharset を指定してみます.

% sudo mount -t captive-ntfs -o iocharset=euc-jp /dev/sda2 /mnt/windows

やっぱりサポートされていないようです.文字化けしたままです.

NTFS はファイル名に UTF-8 を使用しているので,試しに screen で "kanji utf8" を指定したところ,一応表示してくれました.UTF-8 のファイル名をそのまま出力しているようです.

ファイル名はさておき,肝心の書き込み動作がどうなっているかを試してみます.

まず,書き込みを有効にしてマウントします.マニュアルによれば,"--rw" と "--sandbox-server" を指定すればいい,とのこと.

% sudo mount -t captive-ntfs -o --rw,--sandbox-server=/usr/sbin/captive-sandbox-server /dev/sda2 /mnt/windows

マウントは成功しました.次に適当なファイルを編集してみます.

% sudo vim /mnt/windows/boot.ini

書き込みに成功したようです.

それではマウントを解除して再起動.

% sudo umount /mnt/windows
% sudo reboot

boot.ini が壊れている,旨のエラーが...! Oh! No!

CD からブートして回復コンソール直行!

C:\WINDOWS>chkdsk

壊れたファイルは found.000 に化けてくれましたが... boot.ini がないのでは起動できません.回復コンソールから boot.ini の再生成を試みます.

C:\WINDOWS>bootcfg /rebuild

ディスクが壊れているので... 云々と言われて愕然.chkdsk を何度実行してもダメなので,止む無く再インストールへ...

ホームディレクトリが丸ごと別パーティションになっているので(かつこのパーティションは captive で触っていないのです),Windows 再インストール後の復旧は楽チンでした.

ディレクトリに記録された所有者の SID と ACL の SID,および NTUSER.DAT に記録された SID を書き換えるだけでいいのです.

もとい,最初は NTUSER.DAT の方に気づかずに NTFS の SID だけを更新して「復旧できん! 何故だ!」と悩んでいましたが... やり方さえ分かってしまえば,復旧は楽でした.

しばらく captive を使うのはやめておきます.

[Linux] coLinux + Gentoo

技科文館で pushretf が言っていた Cooperative Linux (coLinux) をインストールしてみます.

このコンピュータに接続されたデバイスを不自由なく使用できるなら,Cygwin の代わりにしてもいいかなーと思っています.

まずは試してみます.coLinux 0.6.1 のインストールは管理者で行います.

ディスクイメージは Debian と Gentoo Deluxe の 2 択のようです.そのうち増えることでしょう.Debian の何かは書いてませんが,容量が小さいので,woody でしょうか.私は Gentoo Deluxe を選択.

現在 Gentoo Deluxe の入った root filesystem のディスクイメージをダウンロード中です.

え? バイナリは邪道? すいません.落ち着いたらソースで入れてみます.

[Linux] yum upgrade

rpm がベースのパッケージ管理ソフトに yum があります.yum でシステムを最新に更新する場合,yum upgrade と yum update の 2 つのコマンドが使えます.

yum update はインストール済みのパッケージの更新だけを行い,yum upgrade はこれに加えて古いパッケージの削除も行います.

研究室のマシンに Fedora Core 3 test 1 をインストールして,yum が使用するリポジトリに development を指定.そして yum upgrade を実行しまくっていると,知らん間にシステムがどんどん不安定になってしまいました.

今まで超 unstable な場所をリポジトリに設定した報いなわけですが,私は心を入れ換えました.これからは stable に生きます.

というわけで,/etc/yum.conf を編集し,リポジトリを stable な場所に戻し,さらにインストール済みパッケージのバージョンを戻したいわけですが,yum のコマンドでは戻せません.なんということでしょう.

とりあえず,stable なリポジトリの RPM ファイルを全てローカルにダウンロードした後,インストール済みパッケージを rpm -Ivh --oldpackage でダウングレードする予定です.

cvs tag + update のように,簡単にダウングレードができれば,Windows が得意としている「自動バックアップ」も真っ青のシステムができること間違い無し(笑)

[Linux] さようなら /dev

研究室のマシンで sudo yum update を実行し,アップデート完了の後再起動すると... Linux が起動途中で固まります.

どうやら /dev のファイルがふっ飛んでしまったようです.

MAKEDEV コマンドでデバイススペシャルファイルを作成できるということで,急遽 KNOPPIX を起動し,mount -t ext3 /dev/hda1 /mnt/hda1 としてから MAKEDEV を実行しました.

実行しようとした MAKEDEV は,KNOPPIX に含まれていたものではなく,/dev/hda1 内の Fedora Core 3 test 1 に含まれているバージョンです.

それが災いして,libselinux.so.1 がリンクできない,と ld-linux.so.2 がお怒りに.

ライブラリの参照を解決し,MAKEDEV を実行するも,デバイススペシャルファイルが作成されません.あれぇ.

それから数時間が経過し... mknod で /dev/console, /dev/hda, /dev/hda1, /dev/fd0, /dev/fb0, /dev/ram0 等,一部のデバイススペシャルファイルを手動で作成してみました.

なんとか Fedora Core 3 test 1 はシングルユーザモードで起動するようになりました.しかし,これでは使いものになりません.

ダメもとで KNOPPIX に付属する MAKEDEV を使ってみようと思い,KNOPPIX を起動後,/dev/hda1 をマウントし,cp /dev/MAKEDEV /mnt/hda1/dev/MAKEDEV として再起動.すると...

なんと,Fedora Core 3 test 1 の起動時,自動的にデバイススペシャルファイルが作成されているではありませんか!

どうやら起動スクリプトで /dev/MAKEDEV を自動実行するようになっていたようです.知りませんでした.自分で実行する必要はない,ということですね... 一つ勉強になりました.

[Linux] seq コマンドの存在を知る

卒研でシミュレーションをやってると,パラメータの変更をして再度実験,という作業を何度も行います.こんなとき私はシェルスクリプトを書くわけです.

例えば,「パラメータを 0 から 10 まで 1 ずつ増やしてコマンド hoge を実行」という場合に,私が今までに書くスクリプトは次のようなものです.

#!/bin/bash
p=0
while [ $p -le 10 ]; do
    hoge $p;
    p=`expr $p + 1`;
done

さて,これだけでも十分面倒でしたが,これが浮動小数点(例えば,0.0 から 1.0 まで 0.1 ずつ増加)になると... 私は次のように書いていました.

#!/bin/bash
p=0.0
c=0
while [ $c -le 10 ]; do
    hoge $p;
    p=`echo "$p + 0.1" | bc -l | sed 's/^\./0\./'`
    c=`expr $c + 1`;
done

expr コマンドと [ (test) コマンドは整数の比較しかできないので,整数のループカウンタ c を別途用意しています.そして,浮動小数点の加算は bc コマンドに行わせます.さらに,bc コマンドは計算結果の整数部が 0 の場合に ".3" といった出力をするので,sed コマンドを用いて "0.3" になるよう,頭に 0 を追加しています.

私が悲惨なシェルスクリプトを書いていたのは分かりましたね? それでは本題です.

こんな努力をしなくてすむコマンドを見つけてしまいました.seq コマンドです.

次のように入力するだけで,簡単に数列が生成できます.

% seq 0 1 10
0
1
2
3
4
5
6
7
8
9
10
%

嬉しいことに,浮動小数点数にも対応しています.

% seq 0 0.1 1.0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
%

あとはこれを for 文に食わせるだけです! これで私は変なシェルスクリプトを書かずに済みます.

[Linux] Wine で Steam (挫折編)

やはりダメでした.SteamWine の上で動いてくれそうにありません.この世はやっぱり Windows だそうです.

私はどうやらペンギン一族の仲間にはなれないようです.

[Linux] Wine で Steam を動かそうと試みる

Wine の Redhat/Fedora Core 1 用パッケージを放り込み,Steamのインストーラを起動すると... コケました.

この世は Windows なのかっ...!

いや待てよ... インストーラがコケるだけなのか?

ということは,インストーラだけ Windows で動かして,インストールされたファイルを Wine で動かすというのは... 明日やってみることにしよう.


Valid XHTML 1.1! Valid CSS!
© 2004-2009 ぱくちゃん.
Last modified: Sun Jan 18 14:09:47 JST 2009