<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:admin="http://webns.net/mvcb/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  xmlns:image="http://purl.org/rss/1.0/modules/image/"
  xml:lang="ja">
  <channel rdf:about="http://www.tsurukawa.org/~yendo/blog/index.rdf">
    <title>yendo weblog</title>
    <link>http://www.tsurukawa.org/~yendo/blog</link>
    <dc:language>ja</dc:language>
    <description>Yet another yendo's weblog.</description>
    <dc:creator>yendo</dc:creator>
    <sy:updatePeriod>daily</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <admin:generatorAgent rdf:resource="http://www.raelity.org/apps/blosxom/?v=2.0"/>
    <admin:errorReportsTo rdf:resource="mailto:yendo@tsurukawa.org"/>
    <image rdf:resource="http://www.tsurukawa.org/~yendo/blog/images/yendoweblog2.png" />
        <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://www.tsurukawa.org/~yendo/blog/computer/110717-netwalker.html" />
        <rdf:li rdf:resource="http://www.tsurukawa.org/~yendo/blog/computer/110330-facebook.html" />
        <rdf:li rdf:resource="http://www.tsurukawa.org/~yendo/blog/computer/101026-gnome-help.html" />
        <rdf:li rdf:resource="http://www.tsurukawa.org/~yendo/blog/computer/100406-gtkbuilder.html" />
        <rdf:li rdf:resource="http://www.tsurukawa.org/~yendo/blog/computer/090517-gphotoframe.html" />
        <rdf:li rdf:resource="http://www.tsurukawa.org/~yendo/blog/computer/090418-pygtk-twisted.html" />
        <rdf:li rdf:resource="http://www.tsurukawa.org/~yendo/blog/computer/090203-gnome-terminal.html" />
        <rdf:li rdf:resource="http://www.tsurukawa.org/~yendo/blog/computer/090124-f-spot.html" />
        <rdf:li rdf:resource="http://www.tsurukawa.org/~yendo/blog/misc/081127-camera.html" />
        <rdf:li rdf:resource="http://www.tsurukawa.org/~yendo/blog/computer/080521-gtk-perl-fork.html" />

      </rdf:Seq>
    </items>

  </channel>
  <image rdf:about="http://www.tsurukawa.org/~yendo/blog/images/yendoweblog2.png">
    <title>yendo weblog</title>
    <url>http://www.tsurukawa.org/~yendo/blog/images/yendoweblog2.png</url>
    <link>http://www.tsurukawa.org/~yendo/blog</link>
  </image>
<item rdf:about="http://www.tsurukawa.org/~yendo/blog/computer/110717-netwalker.html">
  <title>NetWalker 向けパッケージ （Twitim および GNOME Photo Frame）</title>
  <link>http://www.tsurukawa.org/~yendo/blog/computer/110717-netwalker.html</link>
  <description>
いまさらなのだけど、SHARP
NetWalker
を使う機会ができたので、自作アプリの NetWalker
向けのパッケージを作成した…</description>
  <dc:subject>computer</dc:subject>
  <dc:creator>yendo</dc:creator>
  <dc:date>2011-07-17T20:24:00+09:00</dc:date>
  <content:encoded><![CDATA[
<p>いまさらなのだけど、SHARP
<a href="http://www.sharp.co.jp/netwalker/">NetWalker</a>
を使う機会ができたので、自作アプリの NetWalker
向けのパッケージを作成した。

<p><a href="http://code.google.com/p/twitim/">Twitim</a>
はチャットクライアント風の Twitter クライアント。
ちょっと古いものだけど、複数のタブやポップアップ通知をサポートしている。
チャット風ということで、一覧できるメッセージは比較的多い。
NetWalker 標準の Ubuntu Jaunty では日本語入力ができない問題に対処した。

<p><a href="http://code.google.com/p/gphotoframe/">GNOME Photo Frame</a>
は、Gnome デスクトップ向けの写真フレームガジェット。
ローカルや大手ネットサービスから写真を取得して表示する。
スクリーンセーバーとしても利用可能。
NetWalker で動くように、いくつかのバグを修正した。
ただ、NetWalker 標準の Ubuntu Jaunty
の古さゆえ、最新のバージョンは動かないので、少し古いバージョンになる。

<p>いずれも APT ラインに以下の行を加えて、

<pre>
deb http://www.tsurukawa.org/debian/netwalker/ ./ 
</pre>

<p>Twitim なら

<pre>
apt-get install twitim 
</pre>

<p>Gnome Photo Frame なら

<pre>
apt-get install gphotoframe
</pre>

で、インストールできる。問題があれば 
<a href="http://twitter.com/#!/yendo0206">Twitter: yendo0206</a>
までどうぞ。
]]></content:encoded>
</item>
<item rdf:about="http://www.tsurukawa.org/~yendo/blog/computer/110330-facebook.html">
  <title>デスクトップアプリケーションで Facebook Graph API を使うときのポイント</title>
  <link>http://www.tsurukawa.org/~yendo/blog/computer/110330-facebook.html</link>
  <description>
基本的にドキュメント通り…</description>
  <dc:subject>computer</dc:subject>
  <dc:creator>yendo</dc:creator>
  <dc:date>2011-03-30T16:24:00+09:00</dc:date>
  <content:encoded><![CDATA[
<p>基本的に<a href="http://developers.facebook.com/docs/coreconcepts/">ドキュメント</a>通り。認証の手続きも簡単。
ただ、大したものではないけど、
デスクトップアプリケーションにおける利用で分かりにくいポイントを二つ。

<p>■認証

<p>デスクトップアプリケーションでは、
<a href="http://developers.facebook.com/docs/authentication/permissions/">パーミッション</a>
の設定 (scope) で 'offline_access' も指定しておくこと。

これはブラウザで Facebook にログインしていなくても (すなわちオフラインでも)、
自分の情報に (デスクトップアプリなどが) アクセスできるという権限みたい。
この権限がないと、アクセストークンは一定時間でエクスパイアされるのかな。

<p>■ログイン画面

<p><a href="http://developers.facebook.com/docs/authentication/">認証に関するドキュメント</a>ではコンパクトなログイン画面が例としてあげられているが、ログインプロセスを説明通りに行うと、通常の大きなウェブのログインページが表示される。

コンパクトなログイン画面を利用したい場合は、
ログインのアクセスには display というオプションが利用できるのだけど、これに 
popup を指定する。
<a href="http://developers.facebook.com/docs/reference/dialogs/oauth/">OAuth
  ダイアログのドキュメント</a>には記載がないが、
<a href="http://developers.facebook.com/docs/reference/dialogs/">
ダイアログのドキュメント</a>だと記載がある。
]]></content:encoded>
</item>
<item rdf:about="http://www.tsurukawa.org/~yendo/blog/computer/101026-gnome-help.html">
  <title>GNOME ドキュメントの作成と利用</title>
  <link>http://www.tsurukawa.org/~yendo/blog/computer/101026-gnome-help.html</link>
  <description>
GNOME でドキュメントを作成し、利用してみる…</description>
  <dc:subject>computer</dc:subject>
  <dc:creator>yendo</dc:creator>
  <dc:date>2010-10-26T00:53:00+09:00</dc:date>
  <content:encoded><![CDATA[
<p>GNOME でドキュメントを作成し、利用してみる。
ドキュメントを作成し、翻訳を行い、インストールを行って、
最終的に yelp で閲覧するところまで。
今回は <a href="http://code.google.com/p/gphotoframe/">GNOME Photo Frame</a> 
のヘルプを例とする。
通常の GNOME アプリケーションとは異なり、Python を使う。
以下のツールが必要となる。

<ul>
  <li>gnome-doc-utils
  <li>pkg-config 
  <li>rarian-compat
</ul>


<p>■1. 作成するデータ

<p>作成するデータは以下の通り。

<ul>
  <li>ヘルプ本体の XML ファイル
  <li>ヘルプを登録するための OMF ファイルの雛形
  <li>翻訳のための PO ファイル
</ul>

<p>基本的なファイルは以下のように help ディレクトリに配置する。

<pre>
help/
    gphotoframe.omf.in
    C/gphotoframe.xml
    C/figure/gphotoframe.png
    ja/ja.po
    ja/figure/gphotoframe.png
</pre>

<p>インストールする前には
PO ファイルから、ヘルプの XML ファイルと、OMF ファイルを
各言語ごとに生成する必要がある。

<p>・ヘルプ本体の XML ファイル

<p>適当に他の GNOME ドキュメンテーションの XML ファイルを参考に書けると思う。
基本的には 1 ファイルで、1 ドキュメントを記述する。
ちゃんとしたことは以下を参照。

<ul>
  <li><a href="http://library.gnome.org/devel/gdp-handbook/stable/">GNOME Handbook of Writing Software Documentation V1.0.2</a>
  <li><a href="http://library.gnome.org/devel/gdp-style-guide/stable/">GNOME Documentation Style Guide V1.6</a>
</ul>

<p>ちなみに GNOME アプリケーションのドキュメントのライセンスは、だいたい
GNU Free Documentation License (GFDL) になっているみたい。

<p>・OMF ファイルの雛形

<p>ドキュメントをシステムに登録するには、
OMF (Open Metadata Framework) ファイルが必要になる。
GNOME Photo Frame だと以下の通り。これを gphotoframe.omf.in として
help ディレクトリに配置する。

<pre>
&lt;?xml version="1.0" standalone="no"?&gt;
&lt;omf&gt;
  &lt;resource&gt;
    &lt;subject category="GNOME|Applications|Graphics"/&gt;
    &lt;type&gt;user's guide&lt;/type&gt;
    &lt;relation seriesid="01bfe79a-d094-c319-a063-ca3c4b5eb74d30"/&gt;
    &lt;rights type="GNU FDL" license.version="1.1" holder="Cristian Marchi"/&gt;
  &lt;/resource&gt;
&lt;/omf&gt;
</pre>

<p>このうち seriesid はコマンド scrollkeeper-gen-seriesid で生成する。

<!-- あれ、Debian Lenny だと categories.xsl がないな
いや Squeeze だとないのか -->

<p>・PO ファイル

<p>XML ファイルの翻訳には xml2po を使う。ドキュメントの
po は、メッセージカタログの po とは別途管理する。
help ディレクトリに移動してから、以下のコマンドを実行する。

<p>POT ファイルを作成する。後で説明するが、最終的には OMF 
ファイルを生成しておき、以下のようにこれも翻訳対象ファイルとして指定しておいた方がよい。

<pre>
% xml2po -o help.pot C/gphotoframe.xml C/gphotoframe-C.omf
% cp help.pot ja/ja.po
</pre>

<p>PO ファイルを更新する

<pre>
% xml2po -u ja/ja.po C/gphotoframe.xml C/gphotoframe-C.omf 
</pre>


<p>詳しい使用法は man を参照。



<p>■2. ビルド

<p>通常の GNOME アプリケーションなら gnome-doc-utils.make を使う。
<a href="http://library.gnome.org/devel/gnome-doc-make/unstable/migrating.html.en">Migrating to GNOME Documentation Build Utilities</a> の 
2.2 を参考にすればよい。ただ、Python など、make 
を使わないシステムで、ビルドを自前でやろうとすると結構面倒。

<p>・各言語用に OMF ファイルを生成

<p>gphotoframe.omf.in から OMF を生成するには、xsltproc で行う。
これは各言語ごとに行うが、後で翻訳を行うためにも、まずは C 向けの OMF 
を作成する。なお、対象となる XML 
ファイルが翻訳されていると、それに応じて各要素も翻訳が行われる。OMF 
ファイル用に別途 PO ファイルが必要になることはない。

<pre>
% xsltproc \
-o ./C/gphotoframe-$lang.omf \
--stringparam db2omf.basename gphotoframe \
--stringparam db2omf.format 'docbook' \
--stringparam db2omf.dtd "-//OASIS//DTD DocBook XML V4.1.2//EN" \
--stringparam db2omf.lang C \
--stringparam db2omf.omf_dir "/usr/share/omf" \
--stringparam db2omf.help_dir "/usr/share/gnome/help" \
--stringparam db2omf.omf_in ./gphotoframe.omf.in \
`pkg-config --variable db2omf gnome-doc-utils` \
./C/gphotoframe.xml
</pre>

<p>OMF ファイルの生成は面倒なので、スクリプトを用意した方がよいだろう。
gphotoframe では、
<a href="http://code.google.com/p/gphotoframe/source/browse/help/makedoc.py?r=3dfc560d95e2e25ed29a57a6d7bf023958033745">makedoc.py
  - gphotoframe</a> のようなスクリプトを用意した。

<p>・各言語用に XML ヘルプファイルを生成

<p>xml2po を利用する。

<pre>
% xml2po -p ja/ja.po -o ja/gphotoframe.xml C/gphotoframe.xml
</pre>

<p>・Python でのインストール


<!--
各言語ごとの OMF ファイルや XML ファイルの生成は、
簡単なスクリプトで行う。
実際は、スクリプトで http://bit.ly/bH4J1o
各言語ごとに、本文である XML ファイルと、メタファイルの OMF ファイルが必要。
-->

<p>
C なら標準のビルドシステムを使うだけなのだが、python の場合は
<a href="http://www.glatzor.de/projects/active/python-distutils-extra">DistUtilsExtra</a>
を使うのが今のところ一番楽みたい。
setup.py と setup.cfg の記述については上記のリンクを参照。

<p>OMF ファイル、XML ファイルなどを各言語ごとに全部生成しておく必要はあるが、
決められたフォルダ (デフォルトでは help) 
にそれらを置いておけば、setup.py でインストールで可能となる。

<p>■3. 閲覧

<p>・yelp の利用

<p>閲覧に GNOME の標準システムでは yelp を使う。
インストール済みならば、URI で開くことができる。

<pre>
% yelp ghelp:gphotoframe
</pre>

<p>ゆえにプログラムから呼び出すには、show_uri をコールすればよい。
Python なら以下の通り。

<pre>
gtk.show_uri(None, 'ghelp:gphotoframe', gtk.gdk.CURRENT_TIME)
</pre>  

インストール前に試し読みするならば、ファイルを直接指定してもよい。
ただ、いずれにせよ OMF ファイルは必要になる。

<pre>
% yelp ja/gphotoframe.xml
</pre>  

<p>・HTML の生成

<p>ブラウザで閲覧できるように、HTML を生成することもできる。

<pre>
% xsltproc -o /tmp/index.html /usr/share/xml/gnome/xslt/docbook/html/db2html.xsl ja/gphotoframe.xml
</pre>

<!--GNOME ドキュメンテーションのビルドには、gnome-doc-utils と pkg-config が必
要。xml2po なんかは前者に収録されている。-->
]]></content:encoded>
</item>
<item rdf:about="http://www.tsurukawa.org/~yendo/blog/computer/100406-gtkbuilder.html">
  <title>LibGlade から GtkBuilder への移行 (PyGTK 編)</title>
  <link>http://www.tsurukawa.org/~yendo/blog/computer/100406-gtkbuilder.html</link>
  <description>
GNOME 3 では、LibGlade から GtkBuilder への移行が必須になる…</description>
  <dc:subject>computer</dc:subject>
  <dc:creator>yendo</dc:creator>
  <dc:date>2010-04-06T20:48:00+09:00</dc:date>
  <content:encoded><![CDATA[
<p>GNOME 3 では、LibGlade から GtkBuilder への移行が必須になる。
この移行でなにがどうメリットなのかよく分からない割りに、
細かいところで面倒だったので、ちょっとまとめておく。
以下 PyGTK を事例としているが、他の言語でもまぁ似たようなものだろう。

<p>■Glade ファイル UI ファイルへの変換

<p>Glade で変換する。LibGlade 形式のファイルを読み込んで、GtkBuider 
形式で保存するだけ。バージョン 3.6.7 で問題なく変換できた。

<ul>
  <li>重複する ID があると利用時にエラーになるので、あらかじめ修正しておく。
  <li>シグナルの接続や adjustment 
のようなオブジェクトの参照に問題が起こるので、
シグナルの接続を行うウィジェット単位で UI ファイルを分割しておく必要がある。
  <li>LibGlade 相当の機能を利用するには、実質 Gtk+ 2.16 以上のバージョンが必要。
</ul>

<p>■コードの修正

<p>ほぼ機械的に変更できるが、シグナルの接続など場合によってはちょっとした手作業も必要になる。

<p>・インポートとオブジェクトの取得

<ul>
  <li>削除: import gtk.glade 
  <li>置換: get_widget → get_object
</ul>

<p>・プロジェクトファイルの読み込み

<p>これも基本的には機械的に置き換えできる。

<p>旧:
<pre>
gui = gtk.glade.XML(GLADE_FILE)
</pre>

<p>新:
<pre>
gui = gtk.Builder()
gui.add_from_file(UI_FILE)
</pre>

<p>しかし、単一の Glade ファイルに複数のトップレベルが含まれ、それぞれでシグナ
ルが設定されている場合は、シグナルの接続に問題が起こる。(すべてのシグナルに
ついて接続されていないとか警告をしてくれる。) それを回避するためには、以下
のようにあるトップレベル以下のみを読み込むことも可能である。

<pre>
gui.add_objects_from_file(UI_FILE, ["window1"])
</pre>

<p>ただ、この場合別のツリー以下にあるオブジェクトの呼び出しに問題が起こる。
例えば adjustment のようなウィジェットツリーとは別のオブジェクトツリー以下
にあるオブジェクトの場合である。

<p>いろいろ面倒なことを考えるよりも、シグナルを扱うウィジェットは、別の ui
  ファイルにまとめた方がいい。

<p>・シグナルの接続

<p>基本的には signal_autoconnect → connect_signals である。

<p>ただ、LibGlade で
は複数回にわたって多重にシグナル接続を重ねることができたが、GtkBuider 
では、最初に接続したシグナル以外は無視される。
クラスの継承などでシグナルを多段設定している場合などは注意が必要。

<p>よく質問されているようだが、
とにかくシグナルの接続は一回で済ますように変更するしかないようだ。
例えば以下のようにする。

<p>旧:
<pre>
dic = { "on_checkbutton_changed" : self._changed_checkbutton_cb }
gui.connect_signals(dic)

dic = { "on_combobox_changed" : self._changed_combobox_cb }
gui.connect_signals(dic)
</pre>

<p>新:
<pre>
dic = { "on_checkbutton_changed" : self._changed_checkbutton_cb }

dic2 = { "on_combobox_changed" : self._changed_combobox_cb }
dic.update(dic2)
gui.connect_signals(dic)
</pre>

<p>■i18n関連

<p>プログラムを国際化している場合は、さらに変更が必要である。

<p>・POTFILE.in

<p>メッセージを含むファイルを羅列すればよいのだが、
現在の intltool バージョン 0.41.0 だと GtkBuider ファイルに対応していない。
ui ファイルが bonobo の ui ファイルと見なされ、処理されない。
そのため glade ファイル同様に扱われるように、ファイル名の先頭に
[type: gettext/glade] を付与しておく。
main.ui と sub.ui のようなファイル名の場合は以下のようになる。

<pre>
[type: gettext/glade]main.ui
[type: gettext/glade]sub.ui
</pre>

<p>・bindtextdomain

<p>gtk.glade の代わりに locale モジュールを使う。

<pre>
import gettext
import locale

for module in (gettext, locale):
    module.bindtextdomain(APP_NAME, LOCALE_DIR)
    module.textdomain(APP_NAME)
</pre>

<p>■参照サイト

<p><script type="text/javascript" src="http://feeds.delicious.com/v2/js/yendo0206/gtkbuilder?title=&icon=s&count=5&bullet=%C2%BB&sort=date&name"></script>
]]></content:encoded>
</item>
<item rdf:about="http://www.tsurukawa.org/~yendo/blog/computer/090517-gphotoframe.html">
  <title>GNOME 写真フレーム</title>
  <link>http://www.tsurukawa.org/~yendo/blog/computer/090517-gphotoframe.html</link>
  <description>


最新の開発情報については
gphotoframe - Google Code
をどうぞ…</description>
  <dc:subject>computer</dc:subject>
  <dc:creator>yendo</dc:creator>
  <dc:date>2009-05-16T23:21:00+09:00</dc:date>
  <content:encoded><![CDATA[

<p style="font-size: small; font-style: italic;">
最新の開発情報については
<a href="http://code.google.com/p/gphotoframe/">gphotoframe - Google Code</a>
をどうぞ。

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

<center>
<p><a href="http://www.flickr.com/photos/yendo0206/3360660976/"><img src="http://www.tsurukawa.org/~yendo/blog/images/090422-gphotoframe.png"></a>
</center>

<p>■特徴

<ul>
<li>写真のソースを複数サポート
<ul>
  <li>フォルダ
  <li>F-Spot データベース
  <li>Shotwell データベース
  <li>Flickr API
  <li>Picasa Web Album API
  <li>Tumblr API
  <li>RSS
</ul>
<li>写真をランダムに表示するが、その表示確率の重みをソース別に設定可能
</ul>

<p>■インストール

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

<ul>
  <li><a href="http://www.pygtk.org/">PyGTK</a>
  <li><a href="http://twistedmatrix.com/trac/">Twisted</a> 
    (twisted.internet, twisted.web)
  <li><a href="http://www.freedesktop.org/wiki/Software/pyxdg">pyxdg</a>
  <li><a href="http://www.glatzor.de/projects/python-distutils-extra/">Python-Distutils-Extra</a> (インストールにのみ必要)
</ul>

<p>また以下のパッケージが推奨されている。
<ul>
  <li><del><a href="http://pypi.python.org/pypi/simplejson/">simplejson</a>:
  for flickr, Tumblr</del>
  <li><a href="http://www.feedparser.org/">Feed Parser</a>: for RSS
 <li><del><a href="http://code.google.com/p/gdata-python-client/">gdata-python-client</a>:
  for Picasa Web</del>
  <li><a href="http://ftp.acc.umu.se/pub/GNOME/sources/gnome-python-desktop/">gnome-python-desktop
  (gnome-keyring)</a>: for Picasa Web 
  
</ul>


<a href="http://code.google.com/p/gphotoframe/downloads/list">ダウンロード</a>して、展開後に ./setup.py install でインストールする。
あるいは一部機能が制限されるが、インストールせずに直接 gphotoframe 
を実行することも可能。


<!-- 
<p>■設定

<p>基本的には GUI で設定が出来るようになっているが、
写真フレームのサイズについてはまだ GUI を実装していないので、
以下のコマンドで設定する。

<pre>
    gconftool-2 --type int --set /apps/gphotoframe/max_width 400 
    gconftool-2 --type int --set /apps/gphotoframe/max_height 300 
</pre>
-->
]]></content:encoded>
</item>
<item rdf:about="http://www.tsurukawa.org/~yendo/blog/computer/090418-pygtk-twisted.html">
  <title>PyGTK でのバックグラウンド動作</title>
  <link>http://www.tsurukawa.org/~yendo/blog/computer/090418-pygtk-twisted.html</link>
  <description>
GUI アプリ動作時にウェブにアクセスすると、その間 GUI が固まってしまう…</description>
  <dc:subject>computer</dc:subject>
  <dc:creator>yendo</dc:creator>
  <dc:date>2009-04-18T15:14:00+09:00</dc:date>
  <content:encoded><![CDATA[
<p>GUI アプリ動作時にウェブにアクセスすると、その間 GUI が固まってしまう。
これを回避するにはウェブへのアクセスをバッググラウンドで行なう必要がある。

<a href="http://gtk2-perl.sourceforge.net/">Gtk2-Perl</a> の場合については<a href="http://www.tsurukawa.org/~yendo/blog/computer/080521-gtk-perl-fork.html" title="Gtk2-Perl でバックグラウンド動作 - yendo weblog">以前書いた</a>けど、
<a href="http://www.pygtk.org/">PyGTK</a> なら 
<a href="http://twistedmatrix.com/">Twisted</a> を使えばとっても簡単。
これくらいなら、フォークとかスレッドとか細かな面倒を見なくて済む。


<p>まずは必要なモジュールをインポート。
他のモジュールに先行してインポートした方がいいらしい。

<pre>
from twisted.internet import gtk2reactor
gtk2reactor.install()
from twisted.internet import defer, reactor
from twisted.web import client
</pre>

ウェブへのアクセスには <a href="http://twistedmatrix.com/documents/current/api/twisted.web.client.html">getPage</a> を使う。addCallback 
でアクセス終了後に呼び出す関数を指定する。
<a href="http://twistedmatrix.com/documents/current/api/twisted.web.client.html">downloadPage</a> では、ファイルへのダウンロードを行う。

<pre>
d = client.getPage(url)
d.addCallback(func_cb)

def func_cb(data):
    print data
</pre>

<p>メイン・ループについては、gtk.main() の代わりに reactor.run() で開始、
また終了についても、gtk.main_quit() の代わりに、reactor.stop() を使う。

<pre>
reactor.run()
</pre>

<p>なお、<a href="http://www.twistedmatrix.com/pipermail/twisted-python/2008-June/017935.html" title="[Twisted-Python] web client and proxy">プロキシーを利用する場合</a>はちょっと面倒みたい。
簡単な方法はないのかな。

<p class="ps">追記: 
結局プロキシーを利用する適当な<a href="http://code.google.com/p/gphotoframe/source/browse/lib/utils/urlget.py">モジュール</a>を自分で用意した。(2009/05/19)
</div>
]]></content:encoded>
</item>
<item rdf:about="http://www.tsurukawa.org/~yendo/blog/computer/090203-gnome-terminal.html">
  <title>gnome-terminal の文字幅問題</title>
  <link>http://www.tsurukawa.org/~yendo/blog/computer/090203-gnome-terminal.html</link>
  <description>
gnome-terminal のというか libvte の East Asian Ambiguous 
問題は、最新の libvte 0.17.4 では解決されている…</description>
  <dc:subject>computer</dc:subject>
  <dc:creator>yendo</dc:creator>
  <dc:date>2009-02-03T03:35:00+09:00</dc:date>
  <content:encoded><![CDATA[
<p>gnome-terminal のというか libvte の East Asian Ambiguous 
問題は、最新の libvte 0.17.4 では解決されている。
libvte 0.16.x ではうまく効かなかった環境変数 VTE_CJK_WIDTH だが、 
libvte 0.17.4 では wide なり auto (locale で自動判定) 
なりを指定すればちゃんと効く。
  

<p>一方、この libvte 0.17.4 では文字の間隔 (フォントの幅?) 
が妙に広くなってしまうという問題がある。
ただ、理由はよく分からないが、これは環境変数 VTE_BACKEND に 
pango を指定すれば、従来通りの幅で表示してくれる。

<p>環境変数をどこで設定したらよいか分からなかったので、
ランチャに以下のように指定した。

<pre>
env VTE_CJK_WIDTH=auto VTE_BACKEND=pango gnome-terminal --disable-factory
</pre>

<p>gnome-terminal もこれで快適。
]]></content:encoded>
</item>
<item rdf:about="http://www.tsurukawa.org/~yendo/blog/computer/090124-f-spot.html">
  <title>F-Spot の日本語メッセージカタログ</title>
  <link>http://www.tsurukawa.org/~yendo/blog/computer/090124-f-spot.html</link>
  <description>
F-Spot 
の日本語メッセージカタログを更新した…</description>
  <dc:subject>computer</dc:subject>
  <dc:creator>yendo</dc:creator>
  <dc:date>2009-01-24T18:49:00+09:00</dc:date>
  <content:encoded><![CDATA[
<p><a href="http://f-spot.org/">F-Spot</a> 
の日本語メッセージカタログを更新した。本家リポジトリの翻訳と、
Launchpad および Novell の翻訳をまとめ、未翻訳のところを訳した。
また、po ファイルではひとまずコメントアウトしてあるが、オリジナルの 
POT ファイルに含まれていない「設定」画面のメッセージも翻訳した。

<p>その際、訳語や表記は基本的に相花さんの翻訳 (F-Spot や他の GNOME アプリ) 
に合わせ、その上で画像処理関係は GIMP の翻訳に、EXIF 関連や (写真用語) は
EXIF の仕様書に合わた。

<p>なお、ちょっと悩んだ翻訳に "Reparented" があった。
あまり使われる機能ではないが(コンパイルオプションの指定が必要)、
F-Spot のバージョン管理で使われるバージョンの一つで、
オリジナルの写真だったものを他の写真のバージョンの一つに変更させたものだ。
こちらはちょっと苦しく「再関連付け版」と訳した。

<ul>
  <li><a href="http://www.tsurukawa.org/~yendo/blog/archives/f-spot/f-spot.HEAD.ja.po">f-spot.HEAD.ja.po</a>
  <li><a href="http://www.tsurukawa.org/~yendo/blog/archives/f-spot/f-spot.HEAD.ja.po.diff">f-spot.HEAD.ja.po.diff</a> 
  <li><a href="http://www.tsurukawa.org/~yendo/blog/archives/f-spot/f-spot.mo">f-spot.mo</a>
</ul>

<p>f-spot.mo を /usr/share/locale/ja/LC_MESSAGES/ 
なんかにコピーすれば、この翻訳が利用できる。

<p class="ps">追記 1: 
<a href="http://mikeforce.net/">相花さん</a>にエラーを修正の上コミットしていただいた。(2009/3/16 23:40)

<p class="ps">追記 2: 
0.6.x リリースにあわせて翻訳を更新した。
(2009/10/20 22:05)

</div>
]]></content:encoded>
</item>
<item rdf:about="http://www.tsurukawa.org/~yendo/blog/misc/081127-camera.html">
  <title>デジタル一眼レフカメラを買った</title>
  <link>http://www.tsurukawa.org/~yendo/blog/misc/081127-camera.html</link>
  <description>



-->

ダカフェ日記を見てしまい
デジタル一眼カメラが欲しくなってしまった、というスイーツ（笑）ぶり…</description>
  <dc:subject>misc</dc:subject>
  <dc:creator>yendo</dc:creator>
  <dc:date>2008-11-27T22:20:00+09:00</dc:date>
  <content:encoded><![CDATA[
<p><a href="http://www.amazon.co.jp/gp/redirect.html?ie=UTF8&location=http%3A%2F%2Fwww.amazon.co.jp%2Fgp%2Fproduct%2FB00130RRNE&tag=yendo-22&linkCode=ur2&camp=247&creative=1211">
<img src="http://ecx.images-amazon.com/images/I/51NoPzQ7cML._SL500_AA280_.jpg"
     align=right border=0></a>
<!-- 
<img src="http://www.assoc-amazon.jp/e/ir?t=yendo-22&l=ur2&o=9" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
-->

<p><a href="http://dacafe.petit.cc/">ダカフェ日記</a>を見てしまい
デジタル一眼カメラが欲しくなってしまった、というスイーツ（笑）ぶり。
なので、なるべく安く単焦点の明るいレンズを使うという観点でカメラを選ぶ。

<p>一眼レフだとレンズキットで 4、5 万円くらいからあるのか、
安くなったものだなぁと調べてみるが、レンズってやっぱり高いのね。
いわゆる標準レンズに相当する単焦点レンズが欲しかったけど、
レンズ単体に 3 万円とか払えないですよ。
安い単焦点レンズというと Canon で 
<a href="http://cweb.canon.jp/ef/lineup/standard/ef50_f18ii/">EF50mm F1.8 II</a>
(約 9,000 円)、Nikon で 
<a href="http://www.nikon-image.com/jpn/products/lens/af/singlefocal/normal/ai_af_50mmf18d.htm">Ai AF Nikkor 50mm F1.8D</a>
(約17,000円) ぐらい。
ただ、この Nikon のレンズなんかは普及機では AF が使えない。
ということで、メーカーは Canon に決定。

<p>Canon で入門機というと Kiss シリーズ。旧機種の 
<a href="http://cweb.canon.jp/camera/eosd/kissdx/">Digital X</a>、現行機種の
<a href="http://cweb.canon.jp/camera/eosd/kissf/">F</a> と
<a href="http://cweb.canon.jp/camera/eosd/kissx2/">X2</a> がある。
レンズキットがお得なので、
レンズ込みで考えると手ぶれ補正機構は欲しいかなということで Digita X 
は止めた。デジタルカメラは新しいものが基本的に良いだろうし、
物持ちが良い方なのでメーカーの補修用性能部品の保管期間が
ちょっとでも長い方がいいかもしれないぐらいを考えた。
あと、SD カードの方が少し安いかな。

<p>で、F と X2 で悩んだ。調べてみると<a href="http://plusd.itmedia.co.jp/lifestyle/articles/0807/08/news005.html"
   title="抜群コストパフォーマンスのローエンド機 —キヤノン「EOS Kiss F」-
  ITmedia +D LifeStyle">結構細々違う</a>ようになっているが、
そのほとんどが私のような素人にはどっちでもいい感じ。

<!--
<ul>
<li>撮像素子の画素数
<li>液晶ディスプレイのサイズ
<li>連写機能
<li>AF 測距点
<li>ファインダー倍率
<li>ワイヤレスリモコン機能
<li>スポット測光、高輝度・階調優先機能
<li>ディスプレイオフセンサー
<li>シボ革状のグリップと滑り止め
</ul>
--> 

ただ、気になるのが連写撮影速度。JPG なら 3 枚/秒か、3.5 
枚/秒の違いでどうでも良いのだけど、RAW の場合 F だと 1.5 
枚/秒になってしまう。せっかくのデジタル一眼レフなので
RAW で連写したいかなということで、これで X2 に決めた。
1 万円程度しか違わないし……、
とかなると他の相違も結構大きいかなとか思えるという不思議。

<p>Kiss X2 でちょっと残念なのはボディの安っぽさぐらい。
これに関しては、F の方がボディ塗装がマットな感じで私には好ましい。
見た目については Nikon の 
<a href="http://www.nikon-image.com/jpn/products/camera/slr/digital/d60/">D60</a>
なんかは、値段の割によくできてると思う。

<p>ということで Kiss X2 レンズキットと EF 50mm F1.8 II を購入した。
総計 66,000 円ぐらい。X2 には延長保証もつけたので、安く買えたと思う。
ほんの少しだけど撮った写真を
<a href="http://www.flickr.com/photos/yendo0206/">Flickr</a>
にアップロードしたりする。
自分としては、思ったよりはまともに撮れて安心した。
一眼レフ楽しい。

<!--
特に、単焦点で適当にボケのある写真を撮ると、
確かにそれだけで上手っぽく見えたりする。
-->
]]></content:encoded>
</item>
<item rdf:about="http://www.tsurukawa.org/~yendo/blog/computer/080521-gtk-perl-fork.html">
  <title>Gtk2-Perl でのバックグラウンド動作</title>
  <link>http://www.tsurukawa.org/~yendo/blog/computer/080521-gtk-perl-fork.html</link>
  <description>
Gtk2-Perl で Twitter クライアント Twitim を作った折りのメモ…</description>
  <dc:subject>computer</dc:subject>
  <dc:creator>yendo</dc:creator>
  <dc:date>2008-05-21T01:28:00+09:00</dc:date>
  <content:encoded><![CDATA[
<p>Gtk2-Perl で Twitter クライアント <a href="http://www.tsurukawa.org/~yendo/blog/computer/080503-twitim.html">Twitim</a> を作った折りのメモ。
アプリ動作時にウェブにアクセスすると、その間 GUI が固まってしまう。
これを回避するにはウェブへのアクセスをバッググラウンドで行なう必要がある。
ちなみに、ちょっと哀しいけど結論だけなら
最後の「<a href="#lwp+gtk">もっと簡単な方法</a>」だけ読めば十分みたい。

<p>■分岐 fork

<p>バックグラウンド動作のための分岐には、
スレッドやフォークがある。このような目的で
スレッドを簡単に使うには
<a href="http://poe.perl.org/" title="Perl Object Environment">POE</a>
があるようだがちょっとおおげさすぎる。
スレッドは UNIX 環境以外でも使えるのだろうが面倒だし、
Gtk2-Perl の 
<a href="http://live.gnome.org/GTK2-Perl/FrequentlyAskedQuestions#head-4d5ea9310685f66fc167cf8497357e341f73128b">FAQ</a>
でもお勧めしないとある。

なお、ruby なら間違いなくスレッドなのだろう。
Gtk2-Perl のアプリではバックグラウンド動作の例があまり
見つからなかったが、<a href="http://gnview.sourceforge.jp/">gnview</a> 
はスレッドを使っている。

<p>今回は 
<a href="http://search.cpan.org/~mlehmann/AnyEvent-3.12/">AnyEvent</a>
を使っていることもあり、なるべく単純にと伝統的なフォークを使う。
AnyEvent は Gtk のイベントとなら協調して動作するが、
スレッドとか POE とかとはどうなのか不安だったこともある。

ただフォークでも注意が必要。
子プロセスの終了には use POSIX; の上、POSIX::_exit(1) する必要あり。
そうしないと X のエラーが起こる。
FAQ 
に<a href="http://www.gnome.gr.jp/docs/gtk+faq.20040114.html#AEN506">情報</a>
あり。
またその返り値は必ず指定する。
指定しないと  X のエラーが起こる。はまった。返り値はまぁ 1 でしょう。

<p>■通信 pipe

子プロセスから親プロセスに、通信結果を渡すプロセス間通信だと、
パイプや共有メモリが一般的。
変数で渡すなら共有メモリもいいが、基本スカラー変数しか渡せない。
(共有メモリについてもサンプルがある。
<a href="http://search.cpan.org/~maurice/IPC-ShareLite-0.09/ShareLite.pm">IPC-ShareLite</a> は簡単。)

<p>今回はパイプを使う。
<a href="http://www.unix.org.ua/orelly/perl/cookbook/ch16_11.htm">サンプル</a>
あり。pipe() をつかって、親と子を繋ぐ pipe ハンドラを指定する。
use IO::Handle; の上バッファに貯めないよう autoflush させた方がいい。
(なお、Net::XMPP2::Client; は IO::Handle;に依存)

<p>また、同時に複数のパイプが開かれる場合があるので、
ファイルハンドルには未定義の変数をあて、Perl 
(<a href="http://adiary.blog.abk.nu/074">5.6.0 以降</a>)
に自動的に生成してもらう。
ファイルハンドルに変数を使うことはできない。

<p>■コールバック Helper->add_watch

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

<p>AnyEvent で子プロセスの終了を検知したり、
ファイルハンドラの読み込みからコールバックしたりすることもできるが、
今回は Gtk の Helper->add_watch で
ファイルハンドラの読み込みからのコールバックを使った。
<a href="http://live.gnome.org/GTK2-Perl/FrequentlyAskedQuestions#head-20b1c1d3a92f0c61515cb88d15e06b686eba6cbc">サンプル</a>あり。

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

<p>■<a name="lwp+gtk">もっと簡単な方法</a>

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

<p class="ps">追記: 
いろいろ書いたけど、結局のところモジュール依存を気にしなければ、
<a href="http://search.cpan.org/dist/AnyEvent-HTTP/HTTP.pm" 
title="AnyEvent::HTTP - simple but non-blocking HTTP/HTTPS client">AnyEvent-HTTP</a> を使えば超簡単。お勧め。
(2009/4/18)
</p>
]]></content:encoded>
</item>
</rdf:RDF>

