
デスクトップ上に写真を表示するガジェット (フォトフレーム) は、 Windows なんかだとずいぶんさまざま公開されているけど、 GNOME デスクトップ向けだとちょっと高機能なものなど見あたらなかったので、 PyGTK で作ってみた。
GNOME 写真フレームは以下のパッケージに依存している。
また以下のパッケージが推奨されている。
基本的には GUI で設定が出来るようになっているが、 写真フレームのサイズについてはまだ GUI を実装していないので、 以下のコマンドで設定する。
gconftool-2 --type int --set /apps/gphotoframe/max_width 400
gconftool-2 --type int --set /apps/gphotoframe/max_height 300
2009/05/16 (Sat) 23:21 | タグ: computer | 固定リンク
GUI アプリ動作時にウェブにアクセスすると、その間 GUI が固まってしまう。 これを回避するにはウェブへのアクセスをバッググラウンドで行なう必要がある。 Gtk2-Perl の場合については以前書いたけど、 PyGTK なら Twisted を使えばとっても簡単。 これくらいなら、フォークとかスレッドとか細かな面倒を見なくて済む。
まずは必要なモジュールをインポート。 他のモジュールに先行してインポートした方がいいらしい。
from twisted.internet import gtk2reactor gtk2reactor.install() from twisted.internet import defer, reactor from twisted.web import clientウェブへのアクセスには getPage を使う。addCallback でアクセス終了後に呼び出す関数を指定する。 downloadPage では、ファイルへのダウンロードを行う。
d = client.getPage(url)
d.addCallback(func_cb)
def func_cb(data):
print data
メイン・ループについては、gtk.main() の代わりに reactor.run() で開始、 また終了についても、gtk.main_quit() の代わりに、reactor.stop() を使う。
reactor.run()
なお、プロキシーを利用する場合はちょっと面倒みたい。 簡単な方法はないのかな。
追記: 結局プロキシーを利用する適当なモジュールを自分で用意した。(2009/05/19)
2009/04/18 (Sat) 15:14 | タグ: computer | 固定リンク
gnome-terminal のというか libvte の East Asian Ambiguous 問題は、最新の libvte 0.17.4 では解決されている。 libvte 0.16.x ではうまく効かなかった環境変数 VTE_CJK_WIDTH だが、 libvte 0.17.4 では wide なり auto (locale で自動判定) なりを指定すればちゃんと効く。
一方、この libvte 0.17.4 では文字の間隔 (フォントの幅?) が妙に広くなってしまうという問題がある。 ただ、理由はよく分からないが、これは環境変数 VTE_BACKEND に pango を指定すれば、従来通りの幅で表示してくれる。
環境変数をどこで設定したらよいか分からなかったので、 ランチャに以下のように指定した。
env VTE_CJK_WIDTH=auto VTE_BACKEND=pango gnome-terminal --disable-factory
gnome-terminal もこれで快適。
2009/02/03 (Tue) 03:35 | タグ: computer | 固定リンク
F-Spot の日本語メッセージカタログを更新した。本家リポジトリの翻訳と、 Launchpad および Novell の翻訳をまとめ、未翻訳のところを訳した。 また、po ファイルではひとまずコメントアウトしてあるが、オリジナルの POT ファイルに含まれていない「設定」画面のメッセージも翻訳した。
その際、訳語や表記は基本的に相花さんの翻訳 (F-Spot や他の GNOME アプリ) に合わせ、その上で画像処理関係は GIMP の翻訳に、EXIF 関連や (写真用語) は EXIF の仕様書に合わた。
なお、ちょっと悩んだ翻訳に "Reparented" があった。 あまり使われる機能ではないが(コンパイルオプションの指定が必要)、 F-Spot のバージョン管理で使われるバージョンの一つで、 オリジナルの写真だったものを他の写真のバージョンの一つに変更させたものだ。 こちらはちょっと苦しく「再関連付け版」と訳した。
f-spot.mo を /usr/share/locale/ja/LC_MESSAGES/ なんかにコピーすれば、この翻訳が利用できる。
追記 1: 相花さんにエラーを修正の上コミットしていただいた。(2009/3/16 23:40)
追記 2: 0.6.x リリースにあわせて翻訳を更新した。 (2009/10/20 22:05)
2009/01/24 (Sat) 18:49 | タグ: computer | 固定リンク
Gtk2-Perl で Twitter クライアント Twitim を作った折りのメモ。 アプリ動作時にウェブにアクセスすると、その間 GUI が固まってしまう。 これを回避するにはウェブへのアクセスをバッググラウンドで行なう必要がある。 ちなみに、ちょっと哀しいけど結論だけなら 最後の「もっと簡単な方法」だけ読めば十分みたい。
バックグラウンド動作のための分岐には、 スレッドやフォークがある。このような目的で スレッドを簡単に使うには POE があるようだがちょっとおおげさすぎる。 スレッドは UNIX 環境以外でも使えるのだろうが面倒だし、 Gtk2-Perl の FAQ でもお勧めしないとある。 なお、ruby なら間違いなくスレッドなのだろう。 Gtk2-Perl のアプリではバックグラウンド動作の例があまり 見つからなかったが、gnview はスレッドを使っている。
今回は AnyEvent を使っていることもあり、なるべく単純にと伝統的なフォークを使う。 AnyEvent は Gtk のイベントとなら協調して動作するが、 スレッドとか POE とかとはどうなのか不安だったこともある。 ただフォークでも注意が必要。 子プロセスの終了には use POSIX; の上、POSIX::_exit(1) する必要あり。 そうしないと X のエラーが起こる。 FAQ に情報 あり。 またその返り値は必ず指定する。 指定しないと X のエラーが起こる。はまった。返り値はまぁ 1 でしょう。
今回はパイプを使う。 サンプル あり。pipe() をつかって、親と子を繋ぐ pipe ハンドラを指定する。 use IO::Handle; の上バッファに貯めないよう autoflush させた方がいい。 (なお、Net::XMPP2::Client; は IO::Handle;に依存)
また、同時に複数のパイプが開かれる場合があるので、 ファイルハンドルには未定義の変数をあて、Perl (5.6.0 以降) に自動的に生成してもらう。 ファイルハンドルに変数を使うことはできない。
子プロセスから読込んだデータを親プロセスで使うには、 子プロセスの終了を検知しなければならない。
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; を呼ぶという方法だ。 とても賢い。ちゃんと試してないが大抵のところこれで十分だろう。 気づくのが遅かった。
追記: いろいろ書いたけど、結局のところモジュール依存を気にしなければ、 AnyEvent-HTTP を使えば超簡単。お勧め。 (2009/4/18)
2008/05/21 (Wed) 01:28 | タグ: computer | 固定リンク
最新の開発情報については twitim - Google Code をどうぞ。
Twitim は Perl + GTK で実装された Twitter 専用の XMPP クライアントである。
汎用の IM (想定しているのは Pidgin) に似ているが、Twitter の利用の際に便利なように機能が追加されている。 追加されている機能は以下の通り。
Ubuntu では universe コンポーネントも追加しておく必要がある。
Debian (lenny) or Ubuntu (8.10)
deb http://www.tsurukawa.org/debian/lenny/ ./以下のコマンドで必要なモジュールを含めインストールできる。 サウンドやポップアップ機能を使うなら、 推奨パッケージもインストールが必要。
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 twitim | 固定リンク
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 | 固定リンク