yendo weblog


GNOME 写真フレーム

デスクトップ上に写真を表示するガジェット (フォトフレーム) は、 Windows なんかだとずいぶんさまざま公開されているけど、 GNOME デスクトップ向けだとちょっと高機能なものなど見あたらなかったので、 PyGTK で作ってみた。

特徴

インストール

GNOME 写真フレームは以下のパッケージに依存している。

また以下のパッケージが推奨されている。

ダウンロードして、展開後に ./setup.py install でインストールする。 あるいは一部機能が制限されるが、インストールせずに直接 gphotoframe を実行することも可能。

設定

基本的には 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 | 固定リンク


PyGTK でのバックグラウンド動作

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 の文字幅問題

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 の日本語メッセージカタログ

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 でのバックグラウンド動作

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; を呼ぶという方法だ。 とても賢い。ちゃんと試してないが大抵のところこれで十分だろう。 気づくのが遅かった。

追記: いろいろ書いたけど、結局のところモジュール依存を気にしなければ、 AnyEvent-HTTP を使えば超簡単。お勧め。 (2009/4/18)

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 に以下を追加する。

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 | 固定リンク


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 | 固定リンク