yendo weblog


Gtk2-Perl でバックグラウンド動作

Gtk2-Perl で Twitter クライアント Twitim を作った折りのメモ。 アプリ動作時にウェブにアクセスすると、その間 GUI が固まってしまう。 これを回避するにはウェブへのアクセスをバッググラウンドで行なう必要がある。 ちなみに、ちょっと哀しいけど結論だけなら 最後の「もっと簡単な方法」だけ読めば十分みたい。

分岐 fork

バックグラウンド動作のための分岐には、 スレッドやフォークがある。このような目的で スレッドを簡単に使うには POE があるようだがちょっとおおげさすぎる。 スレッドは UNIX 環境以外でも使えるのだろうが面倒だし、 Gtk2-Perl の FAQ でもお勧めしないとある。 なお、ruby なら間違いなくスレッドなのだろう。 Gtk2-Perl のアプリではバックグラウンド動作の例があまり 見つからなかったが、gnview はスレッドを使っている。

今回は AnyEvent を使っていることもあり、なるべく単純にと伝統的なフォークを使う。 AnyEvent は Gtk のイベントとなら協調して動作するが、 スレッドとか POE とかとはどうなのか不安だったこともある。 ただフォークでも注意が必要。 子プロセスの終了には use POSIX; の上、POSIX::_exit(1) する必要あり。 そうしないと X のエラーが起こる。 FAQ に情報 あり。 またその返り値は必ず指定する。 指定しないと X のエラーが起こる。はまった。返り値はまぁ 1 でしょう。

通信 pipe

子プロセスから親プロセスに、通信結果を渡すプロセス間通信だと、 パイプや共有メモリが一般的。 変数で渡すなら共有メモリもいいが、基本スカラー変数しか渡せない。 (共有メモリについてもサンプルがある。 IPC-ShareLite は簡単。)

今回はパイプを使う。 サンプル あり。pipe() をつかって、親と子を繋ぐ pipe ハンドラを指定する。 use IO::Handle; の上バッファに貯めないよう autoflush させた方がいい。 (なお、Net::XMPP2::Client; は IO::Handle;に依存)

また、同時に複数のパイプが開かれる場合があるので、 ファイルハンドルには未定義の変数をあて、Perl (5.6.0 以降) に自動的に生成してもらう。 ファイルハンドルに変数を使うことはできない。

コールバック Helper->add_watch

子プロセスから読込んだデータを親プロセスで使うには、 子プロセスの終了を検知しなければならない。

AnyEvent で子プロセスの終了を検知したり、 ファイルハンドラの読み込みからコールバックしたりすることもできるが、 今回は Gtk の Helper->add_watch で ファイルハンドラの読み込みからのコールバックを使った。 サンプルあり。

親プロセスで、Helper->add_watch のセットをしておけば、 子プロセスの終了を待たず (たぶん)、データがある程度流れて来次第、 親プロセスでそのデータを随時処理できるようだ。 子プロセスでパイプを close されると、そこでデータの読み込みを終了する。

もっと簡単な方法

……と言うように実装してしばらくしてから、 Re: forking an external process: msg#00022 というそのものの記事を見つけた。 LWP::UserAgent でサブルーチンのリファレンスを引数として渡し、 その中で Gtk->main_iteration while Gtk->events_pending; を呼ぶという方法だ。 とても賢い。ちゃんと試してないが大抵のところこれで十分だろう。 気づくのが遅かった。

2008/05/21 (Wed) 01:28 | タグ: computer | 固定リンク


Twitim: Twitter 専用 XMPP クライアント

最新の開発情報については twitim - Google Code をどうぞ。

Twitim とは?

Twitim は Perl + GTK で実装された Twitter 専用の XMPP クライアントである。

汎用の IM (想定しているのは Pidgin) に似ているが、Twitter の利用の際に便利なように機能が追加されている。 追加されている機能は以下の通り。

より適切なアカウント表示
Twitter ユーザの発言ではアカウント名 "twitter@twitter.com" を表示しな い。Twitter のスクリーンネームを jabber アカウントのユーザ名と同等に扱う。 その上でアカウント名は色分けされる。ユーザアイコンも表示可能。
Web API の併用
記事の取得に Web API を併用する。重複する記事は表示しない。 また、Web API を利用して、 返信一覧やフォロワー発言一覧などを取り寄せることも可能。
ウォッチリスト機能
特定のユーザやキーワードを、タブに分類して表示できる。つまり、人や話題 による (いわゆるクラスタ別の) 表示ができる。指定に応じて、サウンドやポップ アップ表示による通知も可能。
ハイパーリンクの追加
Twitter スクリーンネーム (@ 付きを含む) から、Twitter ユーザページへ ジャンプできる。
細かい動作に調整不足があるとか、 メモリをかなり喰う (RES で 45 MB 程度) とか、 依存モジュールが多くて手動のインストールが面倒などといった問題もあるが、 Unix デスクトップ向けの Twitter 専用 XMPP クライアントとしては、 それなりには使えるとは思う。

既知のバグ

インストール

Debian (Ubuntu) の場合

Deb パッケージを用意してある。Debian および Ubuntu ユーザなら /etc/apt/sources.list に以下を追加して
deb http://www.tsurukawa.org/debian/ ./
以下のコマンドで必要なモジュールを含めインストールできる。 サウンドやポップアップ機能を使うなら、 推奨パッケージもインストールが必要。
aptitude install twitim 

手動でインストールする場合

ダウンロード

以下をダウンロードして適当なディレクトリに展開する。

必須モジュール

Perl (v5.8 以降) が動作する環境とともに以下のモジュールが必要となる。

推奨モジュール

以下はなくても動作に問題はないが、あれば音が鳴ったり、 ポップアップを表示できたりなどする。

ライセンス

ライセンスは GPL 2 およびそれ以降。 なお、本アプリ中で利用しているアイコンは Pidgin由来のものである。 作者である Hylke Bons さんに感謝。 また、HyperText.pm というモジュールは、 Gtk2-Perl のサンプルを使い回したものなので、 こちらのライセンスのみオリジナルに従い LGPL 2.1 である。

Copyright © 2008 Yoshizumi Endo
Copyright © 2003-2008 gtk2-perl team (HyperText.pm)
Copyright © 1998-2007 Hylke Bons (Icons)

利用にあたっては完全無保証だが、 バグ報告などあればメールや Twitter (@yendo0206) でどうぞ。 Gnome っぽいシンプルなアイコンとか描いてみようとしたけどめげたので、 どなたか作ってくれたりすると嬉しい。

2008/05/03 (Sat) 22:45 | タグ: computer | 固定リンク


X でのデュアルモニター (ATI 編)

前置き

AMD 690G なマザーボードやら 17 インチ液晶モニタを二台やら購入し、 Debian をインストールした。最初は X での使い勝手がよい NVIDIA のカードを買うつもりだったのだが、 マザーボードがデュアルモニタに対応しているので、 ひとまずマザー内蔵のものを使うことにした。 また、購入したマザーボードのディスプレイ出力、片方がアナログだったりする のは今時どうなのよとか思ったりもしたのだが、DVI 出力が二つあってなおかつファ ンレスなグラフィックボードの入手がちょっと難しそうだったりこともあり、 片方はアナログ接続で我慢することにした。

利用するドライバだが、最初は fglrx ドライバを利用しようとした。 コンポジット表示は試していないが、2D 表示 も 3D 表示もまぁ軽快でいいかなと 思っていたら、ログアウト時に画面がブラックアウトするバグに遭遇した。 この問題に遭遇している人は多いようだが、 ちゃんとした解決方法はちょっとよく分からなかった。

結局、3D はひとまず諦め、オープンな radeonhd ドライバを使うことにした。 Debian の場合は sid に最新版 (1.2.0) が収録されている。 たまにマウスポインタの表示がおかしくなったりするようだが、 2D 表示や、動画程度ならこのドライバでまず問題はないようだ。 デュアルモニターの設定を含めたドライバ情報については X.Org Wiki - radeonhd にまとまっている。

設定

まずは xrandr を端末から実行して、接続名を確認しておく。 AMD 690G だと、DVI-D_1 と VGA_1 だ。 Section "Device" には、"monitor-接続名" と好みの識別子を書く。私は識別子をそれぞれ "DVI"、"VGA" とした。

Option          "monitor-DVI-D_1"       "DVI"
Option          "monitor-VGA_1"         "VGA"
また、Section "Device" にはプライマリ接続となる接続名も書いておく。 "monitor-接続名" でも、自分で付けた識別子でもなく、接続名を書く。 ここで指定した接続モニタに GDM の画面や GNOME のメインパネルなんかが表示される。
Option          "RROutputOrder"         "DVI-D_1"
さらにモニタの設定を二つ用意し、片方にはモニタの位置関係を指定する。 なお、"RightOf" 以外にもいくつか指定方法がある。
Section "Monitor"
        Identifier      "DVI"
EndSection

Section "Monitor"
        Identifier      "VGA"
        Option          "RightOf" "DVI"
EndSection

まとめ

デュアルモニター設定のために、変更する部分をまとめると以下の通り。

Section "Device"
        Identifier      "Generic Video Card"
        Driver          "radeonhd"
        BusID           "PCI:1:5:0"
        Option          "monitor-DVI-D_1"       "DVI"
        Option          "monitor-VGA_1"         "VGA"
        Option          "RROutputOrder"         "DVI-D_1"
EndSection

Section "Monitor"
        Identifier      "DVI"
EndSection

Section "Monitor"
        Identifier      "VGA"
        Option          "RightOf" "DVI"
EndSection

まったくもってデュアル (あるいはマルチ) モニターは便利すぎ。

2008/04/18 (Fri) 14:28 | タグ: computer | 固定リンク


X でのデュアルモニター (NVIDEA 編)

書いていたのを忘れていた古い記事だが、CRT が壊れた記念に公開しておく。

前置き

捨て置いていた CRT モニターがあったので、デュアルモニターを設定してみた。 OS は Debian GNU/Linux。ハードウェアの構成は以下の通り。

ビデオカードASUS N6200 (Geforce 6200)-
液晶モニター (プライマリ)EIZO FlexScan L4611280x1024
CRT モニター (セカンダリ)NEC MultiSync 15 (PC-KM153R)1024x768

このビデオカードには、DVI 接続と VGA 接続が一つづつあるので、 それぞれにモニターを接続することになる。 メインは液晶モニター、その右側にサブとして CRT モニターを設置して使う。 なお、この CRT モニターはもともと PC-9821 シリーズ向けのものなので、 接続のために変換アダプタ (800円ぐらい) を購入した。

Geforce のドライバは、NVIDIA 提供の最新のもの をあらかじめインストールし、設定しておく。

Xinerama vs. TwinView

X でのデュアルモニターには Xinerama を使うのが一般的だが、 NVIDIA の純正ドライバだと TwinView なるものが使える。 TwinView の利点は何かというと、マニュアルによれば以下の通りらしい。

この説明では私は良く意味が分からなかったが、具体的に設定してみて分かっ た範囲で、TwinView の特徴をまとめると以下のような感じだった。 Xinerama の方は十分に試したという訳でもないので、いくつかの項目は もしかしたら Xinerama でも TwinView でもたいして変らないかもしれないけど……。

TwinView の長所

TwinView の短所

せっかくなので、私は TwinView を利用することにした。

設定

ドライバのバグというか仕様なのか、一部面倒なところがある。

TwinView を有効にする

/etc/X11/xorg.conf の "Device" セクションにまずは以下のものを追加する。 これで TwinView が有効になる。

Option    "TwinView" "on"

DVI 接続をプライマリに設定 + 基本設定

私は、DVI 接続の液晶モニターをプライマリとして、 VGA 接続の CRT モニターをセカンダリとして利用したいのだが、 デフォルトでは VGA 接続の CRT モニターがプライマリとして認識されてしまう。 これは、以下のオプションで変更する。

Option    "TwinViewXineramaInfoOrder" "DFP, CRT"

しかし、ややこしいことに、 設定の際、明示しないかぎり暗黙のプライマリ接続は VGA 接続の方だとみなされてしまう。 水平周波数、垂直周波数 は、 それぞれ DFP (DVI 接続)、CRT (VGA 接続) と明示した方が 分かりやすいだろう。 "SecondMonitorHorizSync" と "SecondMonitorVertRefresh" は使わない。 モニタの配置順序は、暗黙のプライマリ接続の「左」に、 暗黙のセカンダリ接続を配置するため、"LeftOf" とする。 明示的に "DFP RightOF CRT" と書いた方が分かりやすいのだが、 これだと SDL なアプリケーションではなぜか 両モニターをまたぐフルスクリーン表示で左右が逆になってしまった。

Option    "HorizSync"   "DFP: 31.5-64; CRT: 24.8-57"
Option    "VertRefresh" "DFP: 50-75;   CRT: 55-90"
Option    "TwinViewOrientation" "LeftOf"

Metamodes の設定

最後に "Metamodes" 画面モードの設定を行なう。"," で区切って、複数のモニター の解像度を設定する。";" で区切ることによって、複数のモードを設定できる。 以下は読みやすいように複数行にわたって書いているが、実際は一行にまとめる 必要があったと思う。
Option    "Metamodes" "DFP: 1280x1024, CRT: 1024x768 +1280+110 @1024x768 ; 
                       DFP: 640x512 @640x512, 1024x768 ; 
                       DFP: 1280x1024, CRT: NULL"

一行目の "+1280+110" というのは、"TwinViewOrientation" による配置順序を無視 して、独自に位置関係を設定する項目である。異なるモニタを使えば、 普通スクリーンの上下の位置は、適切なものとはならないだろう。 ここでは、CRT モニターの方を上に、110 ドット分ずらしている。 この設定ゆえ、右方向に 1280 ドット分ずらす設定も併記しておく。

一行目、二行目にある "@1024x768" という項目で、パンニング・ ドメインなるものを設定する。これを設定すると、いろいろあるけど、 相対的に画素数の少ないモニターで 表示できない範囲を無視してくれるようになるはずなのだが完全ではないようだ。 設定しないとどうなるんだっけ。上下にビューポイントが 動いたりするんだっけか。確か面倒だった。

三行目の "NULL" という設定は、 そのディスプレイを利用しないための設定。 DPMS のオフステートに対応したディスプレイならば、 電源もちゃんと切れて無いものとしてくれる。

この例のように設定すると、 GNOME の場合「画面の解像度の設定」で設定を動的に変更できる。 二つのデバイスをまとめて、三つの解像度が利用できるわけだ。

なお、設定をぜんぶまとめると以下の通り。

Option    "TwinView" "on"
Option    "TwinViewXineramaInfoOrder" "DFP, CRT"
Option    "TwinViewOrientation" "CRT LeftOf DFP"
Option    "HorizSync"   "DFP: 31.5-64; CRT: 24.8-57"
Option    "VertRefresh" "DFP: 50-75;   CRT: 55-90"
Option    "Metamodes" "1024x768 +1280+110 @1024x768, 1280x1024 ; 
          1024x768, 640x512 @640x512 ; NULL, 1280x1024"

まとめ 〜残された問題

古い mplayer のフルスクリーン表示で、映像の一部が表示されないことがある。 また古い mplayer だと異なるモニタのアスペクト比に自動では対応できない。 コマンドラインで、 "-xineramascreen 1" などと表示するモニターを明示したり、 "-monitoraspect 4:3" としてモニタのアスペクト比を明示しなければならない場 合もあろう。 ちなみに、Totem ならどちらも問題ない。

SDL を利用するアプリケーションでは、一方のモニターで SDL アプリケーションをフルスクリーンで表示し、 一方のモニターで通常画面を表示することができない。 SDL アプリケーションをフルスクリーン表示するには、 どちらか一方のモニターを無効にしないと、 二つのモニターにまたがって中央に表示が行なわれてしまう。

他にも、液晶ディスプレイと CRT モニターで 色合いが結構違ったりするのが気になったりもするけれども、 デュアルモニターは思った以上に便利。 私の CRT モニターでは、小さな文字を読むのはしんどいが、 大きな文字で端末エミュレータ専用にしてもいいし、 映像はやはり液晶モニタよりはきれいだったりする。 腐った CRT モニタでも捨てるにはお金がかかるので、 電気代に注意しつつ、有効に使ってもよいだろう。

2008/04/18 (Fri) 13:20 | タグ: computer | 固定リンク


scanbuttond for EPSON GT-S600/GT-F650

最近のスキャナには本体にいくつかのボタン (スキャナビボタン) があり、コピーや PDF 作成などの機能を呼び出せるようになっている。嬉しいことに GNU/Linux でも scanbuttond を利用すれば、スキャナ本体のボタンのプッシュ・リリースを検知し、 好みのアクションを実行できる。

ただ、私が最近購入した EPSON GT-S600 (あるいは GT-F650、Perfection V10/V100 PHOTO) は、この scanbuttond ではサポートされていなかった。 そもそも最近の EPSON スキャナは、以前のものとはプロトコルが違うらしい。 しょうがないので、新しいバックエンドを用意した。 これでちゃんと本体上の四つのボタンを区別して検知できている。 また、GT-S600 以外の最近の EPSON スキャナも、この辺りを見てゴニョゴニョすれば何とかなるかも。

アップストリームにはパッチを投げておいたが、 一応ここでもパッチと Debian パッケージを公開しておく。 完全無保証だがご関心のある方はどうぞ。 パッチの方は当てたら automake をお忘れなく。

ちなみに、この GT-S600 で書類をスキャンする場合、トーンカーブの調整は scanimage そのもので --(red|green|blue)-gamma-table `curve.pl 100 200` のようにして済ますのが楽。 また、スキャンした書類をそれなりに整形するには unpaper が便利。

2007/08/01 (Wed) 15:38 | タグ: computer | 固定リンク


マイナーアップデート ―私家版 BigClock 2.83c #5

もう弄ることはないと思っていた Palm 用時計ソフトウェアの BigClock だが、 バグを見付けてしまったので、その修正ついでに若干の機能追加も行なった。

バグ修正

機能追加

わずかな変更なので、 公開するパッチは前バージョンからの変更点のみを含むものとした。 ライセンスはオリジナルに基づき GPL。完全無保証。 2007 年の日本の休日データも置いておくが、こちらももちろん無保証。

前バージョンからのパッチbigclock_ye5-1.patch
バイナリ (日本語版)bigclock-ja_ye5-1.prc
バイナリ (English)bigclock-en_ye5-1.prc

2007/01/13 (Sat) 04:45 | タグ: computer | 固定リンク


del.icio.us 用 Firefox 拡張の日本語版

ソーシャルブックマーク最大手 del.icio.us の最大の問題点は 日本語での検索ができないことだったが、久しぶりに使ってみたら 自分のブックマークに関してはちゃんと検索できるようになっていた。 まだ日本語では他人のブックマークの検索が出来ないのは残念だが、 ひとまずは常用できそうだ。 また、プライベートなブックマークをつける機能も追加されていたりして、 これも嬉しい。

さらに、del.icio.us 用 Firefox 拡張もシンプルなものFirefox のブックマークを統合する拡張の二つが用意されている。 私はシンプルな前者を利用したが、これでも以下のように十分便利。

この拡張はなかなか便利なので、適当に日本語訳してみた。 ついでに私の好みでメニューの位置を「ヘルプ」の前にしたり、 (Debian の Iceweasel で) ブックマーク登録時のウィンドウに余分なクロールバーが表示されないように、 ウィンドウの幅を若干拡げたりした。

オリジナルのライセンスが不明だったので、 問題がありそうだったりしたら拡張やパッチの公開は期間限定になるかも。 ご利用になりたい方は完全無保証・自己責任でどうぞ。

なお、Firefox 拡張の日本語メッセージ翻訳については、拡張機能の日本語化 - takanory.net を参考にした。 ただ、Firefox 2.0 相当を導入したためなのか良く分かっていないが Chrome Manifest なるものの修正も必要だった。

2006/12/19 (Tue) 21:00 | タグ: computer | 固定リンク