<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Big Sky</title>
    <link>http://mattn.kaoriya.net/</link>
    <description>システム開発屋がひっそり語るぼやき</description>
    <language>ja</language>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>blosxom/2.1.2</generator>
    <atom:link href="http://mattn.kaoriya.net/index.rss" rel="self" type="application/rss+xml" />
   <item>
     <title>ヘッダファイルだけでC++から使えるJSONパーサ「picojson」が凄い！</title>
     <pubDate>Thu, 02 Jul 2009 15:49:00 +0900</pubDate>
     <link>http://mattn.kaoriya.net/software/lang/c/20090702153947.htm</link>
     <category>cpp</category><category>c++</category><category>json</category>
     <guid isPermaLink="true">http://mattn.kaoriya.net/software/lang/c/20090702153947.htm</guid>
     <description>
&lt;a href=&quot;http://d.hatena.ne.jp/kazuhooku&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;kazuhoさん&lt;/a&gt;がやってくれました。&lt;br /&gt;
ずいぶん前からjsonをC++でパース(SAXじゃなくてDOM)するのに小さいライブラリないかなーと思ってました。個人的には&lt;a href=&quot;http://oss.metaparadigm.com/json-c/&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;json-c&lt;/a&gt;というのを使ってたのですが、幾らか気に入らない所があったりビルドが少し手間だったりしていました。STLしか使わなくてvectorとかmapで表現されるツリー構造な物が欲しいなぁって思ってたんです。&lt;br /&gt;
とあるIRCで昨日、kazuhoさんと「ほしいですよねー」という話から始まって、githubにある&lt;a href=&quot;http://github.com/hjiang/jsonxx/tree/master&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;jsonxx&lt;/a&gt;とかも物色しながら「いいのないねー」とか言ってたらkazuhoさんが「もすこし綺麗に書けそう」って言い出して朝から本格的に書き始めてついさっき出来上がりました。速いw&lt;br /&gt;
名前はpicojson&lt;br /&gt;
とても小さく、実装コードだと300数十ステップ程です。しかもヘッダファイルだけなので管理が楽です。&lt;br /&gt;
&lt;br /&gt;
試しに&lt;a href=&quot;http://wassr.jp/&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;wassr&lt;/a&gt;のpublicタイムラインをパースしてみました。&lt;br /&gt;
コードはこんな感じ。&lt;br /&gt;
curlのコードではなく、jsonのパース部分を見てください。&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&gt;
&lt;span class=&quot;PreProc&quot;&gt;#include &lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;lt;curl/curl.h&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;#include &lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;picojson.h&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Type&quot;&gt;typedef&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;struct&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;char&lt;/span&gt;* data;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class=&quot;Comment&quot;&gt;// response data from server&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;size_t&lt;/span&gt;&amp;nbsp;size;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Comment&quot;&gt;// response size of data&lt;/span&gt;&lt;br /&gt;
} MEMFILE;&lt;br /&gt;
&lt;br /&gt;
MEMFILE*&lt;br /&gt;
memfopen() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MEMFILE* mf = (MEMFILE*) malloc(&lt;span class=&quot;Statement&quot;&gt;sizeof&lt;/span&gt;(MEMFILE));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mf-&amp;gt;data = &lt;span class=&quot;Constant&quot;&gt;NULL&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mf-&amp;gt;size = &lt;span class=&quot;Constant&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;return&lt;/span&gt;&amp;nbsp;mf;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Type&quot;&gt;void&lt;/span&gt;&lt;br /&gt;
memfclose(MEMFILE* mf) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;(mf-&amp;gt;data) free(mf-&amp;gt;data);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;free(mf);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Type&quot;&gt;size_t&lt;/span&gt;&lt;br /&gt;
memfwrite(&lt;span class=&quot;Type&quot;&gt;char&lt;/span&gt;* ptr, &lt;span class=&quot;Type&quot;&gt;size_t&lt;/span&gt;&amp;nbsp;size, &lt;span class=&quot;Type&quot;&gt;size_t&lt;/span&gt;&amp;nbsp;nmemb, &lt;span class=&quot;Type&quot;&gt;void&lt;/span&gt;* stream) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MEMFILE* mf = (MEMFILE*) stream;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;int&lt;/span&gt;&amp;nbsp;block = size * nmemb;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;(!mf-&amp;gt;data)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mf-&amp;gt;data = (&lt;span class=&quot;Type&quot;&gt;char&lt;/span&gt;*) malloc(block);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;else&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mf-&amp;gt;data = (&lt;span class=&quot;Type&quot;&gt;char&lt;/span&gt;*) realloc(mf-&amp;gt;data, mf-&amp;gt;size + block);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;(mf-&amp;gt;data) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memcpy(mf-&amp;gt;data + mf-&amp;gt;size, ptr, block);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mf-&amp;gt;size += block;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;return&lt;/span&gt;&amp;nbsp;block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Type&quot;&gt;char&lt;/span&gt;*&lt;br /&gt;
memfstrdup(MEMFILE* mf) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;char&lt;/span&gt;* buf = (&lt;span class=&quot;Type&quot;&gt;char&lt;/span&gt;*)malloc(mf-&amp;gt;size + &lt;span class=&quot;Constant&quot;&gt;1&lt;/span&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memcpy(buf, mf-&amp;gt;data, mf-&amp;gt;size);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[mf-&amp;gt;size] = &lt;span class=&quot;Constant&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;return&lt;/span&gt;&amp;nbsp;buf;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;using&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;namespace&lt;/span&gt;&amp;nbsp;std;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;using&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;namespace&lt;/span&gt;&amp;nbsp;picojson;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Type&quot;&gt;int&lt;/span&gt;&lt;br /&gt;
main(&lt;span class=&quot;Type&quot;&gt;int&lt;/span&gt;&amp;nbsp;argc, &lt;span class=&quot;Type&quot;&gt;char&lt;/span&gt;* argv[]) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;char&lt;/span&gt;&amp;nbsp;error[&lt;span class=&quot;Constant&quot;&gt;256&lt;/span&gt;];&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MEMFILE* mf = memfopen();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CURL* curl = curl_easy_init();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curl_easy_setopt(curl, CURLOPT_URL, &lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;a href=&quot;http://api.wassr.jp/statuses/public_timeline.json&quot;&gt;http://api.wassr.jp/statuses/public_timeline.json&lt;/a&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, &amp;amp;error);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, memfwrite);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curl_easy_setopt(curl, CURLOPT_WRITEDATA, mf);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;(curl_easy_perform(curl) != CURLE_OK) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout &amp;lt;&amp;lt; error &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;span class=&quot;Statement&quot;&gt;else&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value v;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;char&lt;/span&gt;* ptr = mf-&amp;gt;data;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string err = parse(v, ptr, ptr + mf-&amp;gt;size);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;(err.empty()) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;array arr = v.get&amp;lt;array&amp;gt;();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;array::iterator it;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;for&lt;/span&gt;&amp;nbsp;(it = arr.begin(); it != arr.end(); it++) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;object obj = it-&amp;gt;get&amp;lt;object&amp;gt;();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout &amp;lt;&amp;lt; obj[&lt;span class=&quot;Constant&quot;&gt;&amp;quot;user_login_id&amp;quot;&lt;/span&gt;].to_str() &amp;lt;&amp;lt; &lt;span class=&quot;Constant&quot;&gt;&amp;quot;: &amp;quot;&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt; obj[&lt;span class=&quot;Constant&quot;&gt;&amp;quot;text&amp;quot;&lt;/span&gt;].to_str() &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;span class=&quot;Statement&quot;&gt;else&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cerr &amp;lt;&amp;lt; err &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curl_easy_cleanup(curl);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;/blockquote&gt;
こんなに短いコードでアプリが作れる！&lt;br /&gt;
STLに慣れた人ならイメージ沸くかと思います。すばらしい！&lt;br /&gt;
こういうのが欲しかったんです。&lt;br /&gt;
ただまだ出来上がったばっかりですしバグはあるかもしれません。また高機能にするつもりもないでしょうから使用目的を選ぶのが先決かと思います。&lt;br /&gt;
&lt;a href=&quot;http://ja.wikipedia.org/wiki/BSD%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;ライセンスはBSD&lt;/a&gt;との事なので、バイナリ配布も可能です。&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;
&lt;a href=&quot;http://svn.coderepos.org/share/lang/cplusplus/picojson/trunk/&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;share - Revision 34226: /lang/cplusplus/picojson/trunk&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;picojson&lt;/p&gt;
&lt;cite&gt;http://svn.coderepos.org/share/lang/cplusplus/picojson/trunk/&lt;/cite&gt;
&lt;/blockquote&gt;
ありがたや、ありがたや。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;追記&lt;/b&gt;&lt;br /&gt;
kazuhoさんも記事を書いてますんでそちらも...&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;
&lt;a href=&quot;http://developer.cybozu.co.jp/kazuho/2009/07/c-json-picojson.html&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;Kazuho@Cybozu Labs: 今更 C++ で JSON パーサ「picojson」を書いたわけ&lt;/a&gt;&lt;br /&gt;
&lt;cite&gt;http://developer.cybozu.co.jp/kazuho/2009/07/c-json-picojson.html&lt;/cite&gt;
&lt;/blockquote&gt;
</description>
     <author>mattn.jp@gmail.com (mattn)</author>
   </item>
   <item>
     <title>SSH/Gitの設定を修正しなくてもファイアウォール内からgithub.comにpushする方法</title>
     <pubDate>Wed, 24 Jun 2009 10:33:00 +0900</pubDate>
     <link>http://mattn.kaoriya.net/software/20090624103050.htm</link>
     <category>ssh</category><category>github</category>
     <guid isPermaLink="true">http://mattn.kaoriya.net/software/20090624103050.htm</guid>
     <description>
これはgithubじゃなくても使えるかも&lt;br /&gt;

Gitはトランスポート層が選択出来るのは知っていたけど、まさかこんな書き方出来るとは思ってなかった。&lt;br /&gt;
以前、こんな記事書きましたが
&lt;blockquote class=&quot;quote&quot;&gt;
&lt;a href=&quot;http://mattn.kaoriya.net/software/20081029172540.htm&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;github.comへのSSH接続にはホスト名&quot;ssh.github.com&quot;、ポート&quot;443&quot;に接続する様に設定します。※このssh.github.comが味噌です。&lt;/a&gt;
&lt;p&gt;github.comへのSSH接続にはホスト名&quot;ssh.github.com&quot;、ポート&quot;443&quot;に接続する様に設定します。 
※このssh.github.comが味噌です。&lt;/p&gt;
&lt;cite&gt;http://mattn.kaoriya.net/software/20081029172540.htm&lt;cite&gt;
&lt;/blockquote&gt;
これ以下の1行で出来る事が分かりました。&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&gt;
# git clone ssh://git@ssh.github.com:443/my-name/my-repo.git&lt;br /&gt;
&lt;/blockquote&gt;
ssh.github.comに443ポートでSSHプロトコルを喋るよ！っていう指定になります。これでcloneしたワーキングツリーでは、以前書いた記事の様にpullはpublic clone、pushはowner cloneというやり方ではなくowner cloneといてpullしている為 .ssh/config ファイルを修正したり
&lt;blockquote class=&quot;code&quot;&gt;
# git remote add origin git@github.com:my-name/my-repo.git&lt;br /&gt;
&lt;/blockquote&gt;
する事もなくいきなりpush出来るになります。&lt;br /&gt;
こりゃいいわ。&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;awsxom&quot;&gt;
&lt;a href=&quot;http://www.amazon.co.jp/exec/obidos/ASIN/0596520123/ref=nosim/bigsky-22&quot;&gt;
&lt;img src=&quot;http://ecx.images-amazon.com/images/I/511yOg5nRyL._SL160_.jpg&quot; align=&quot;left&quot; hspace=&quot;5&quot; border=&quot;0&quot; alt=&quot;Version Control With Git&quot; class=&quot;image&quot; /&gt;
&lt;strong&gt;Version Control With Git&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
J Loeliger&lt;br /&gt;
Pragma / ￥ 3,142 (2009-06-05)&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
発送可能時間：在庫あり。&lt;br /&gt;
&lt;br clear=&quot;all&quot; /&gt;
&lt;/div&gt;

</description>
     <author>mattn.jp@gmail.com (mattn)</author>
   </item>
   <item>
     <title>携帯電話からIRCが出来る！Freenode専用モバイルゲートウェイ書いた</title>
     <pubDate>Wed, 24 Jun 2009 02:26:00 +0900</pubDate>
     <link>http://mattn.kaoriya.net/software/lang/perl/20090624020732.htm</link>
     <category>perl</category><category>freenode</category><category>irc</category><category>携帯</category>
     <guid isPermaLink="true">http://mattn.kaoriya.net/software/lang/perl/20090624020732.htm</guid>
     <description>
Freenodeのwebchatインタフェースを叩いて通信し、携帯電話からでもIRC出来るCGI書いた。&lt;br /&gt;
欲しい人なんかいるんかなーとか思いながら、作ったのでメッセージの送受信しか出来ません。
nick登録もなし、nickの自動割り当てもなしです。&lt;br /&gt;
私はこんだけあったら十分なので...。コードはこの辺にあります。&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;
&lt;a href=&quot;http://github.com/mattn/freenode-mobile-gateway/tree/master&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;mattn&apos;s freenode-mobile-gateway at master - GitHub&lt;/a&gt;
&lt;p&gt;IRC gateway for freenode writen in perl.&lt;/p&gt;
&lt;cite&gt;http://github.com/mattn/freenode-mobile-gateway/tree/master&lt;/cite&gt;
&lt;/blockquote&gt;
SoftBank携帯ですが、一応動いてます。欲しい機能があればgithubでforkして下さい。&lt;br /&gt;
</description>
     <author>mattn.jp@gmail.com (mattn)</author>
   </item>
   <item>
     <title>(再)ブラウザを全く使わずにustream.tvを楽しむ方法</title>
     <pubDate>Mon, 22 Jun 2009 22:32:00 +0900</pubDate>
     <link>http://mattn.kaoriya.net/web/ustream/20090622220622.htm</link>
     <category>ustream</category><category>bash</category><category>ustream.tv</category><category>flashplayer</category><category>flash</category>
     <guid isPermaLink="true">http://mattn.kaoriya.net/web/ustream/20090622220622.htm</guid>
     <description>
以前こんな記事を書いた事がありました。&lt;br /&gt;
&lt;blockquote class=&quot;mention&quot;&gt;
&lt;a href=&quot;http://mattn.kaoriya.net/web/ustream/20071018005843.htm&quot;&gt;Big Sky :: ブラウザを全く使わずにustream.tvを楽しむ方法&lt;/a&gt;
&lt;p&gt;映像/音声ですが、Linux版に用意されているスタンドアローン版flashplayerを使っています。ネット上にあるFLVもコマンドラインから起動して閲覧出来ます。&lt;/p&gt;
&lt;cite&gt;http://mattn.kaoriya.net/web/ustream/20071018005843.htm&lt;/cite&gt;
&lt;/blockquote&gt;
その後、ustream.tvで何か変更があり、そのままでは使えなくなってしまったのですが、もういっかいチャレンジしたら見れる事が分かりました。&lt;br /&gt;
答えは簡単でobjectタグのパラメータ値を全て足せば再生出来るURLになるという事。&lt;br /&gt;
たとえばさっきまで見ていたVimMの動画。&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&gt;
&lt;span class=&quot;Identifier&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;object&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Identifier&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Type&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;viewer&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Identifier&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Type&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;viewer&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Identifier&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Type&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;480&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Identifier&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Type&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;386&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Identifier&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;allowfullscreen=&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Identifier&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Type&quot;&gt;codebase&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;a href=&quot;http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab&quot;&gt;http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab&lt;/a&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;
ここから&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Type&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;movie&amp;quot;&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Type&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;a href=&quot;http://cdn1.ustream.tv/swf/4/viewer.137.swf?varnish=true&quot;&gt;http://cdn1.ustream.tv/swf/4/viewer.137.swf?varnish=true&lt;/a&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Type&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;flashvars&amp;quot;&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Type&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;loc=/&amp;amp;cid=19118&amp;amp;channelid=19118&amp;amp;share=false&amp;amp;group=channel19118&amp;amp;imu=medrect&amp;amp;autoResize=false&amp;amp;localid=4398457344a3f82bac4140&amp;amp;varnish=true&amp;amp;vrsl=c.4.158&amp;amp;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt;&lt;br /&gt;
ここまで&lt;br /&gt;
&lt;span class=&quot;Identifier&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;/blockquote&gt;
これを結合して出来上がったURLにflashplayerスタンドアローン版でアクセスすれば良いのです。&lt;br /&gt;
これをshellスクリプトにすると以下の様になりました。&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&gt;
&lt;span class=&quot;Comment&quot;&gt;#!/bin/bash&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Identifier&quot;&gt;GFLASHPLAYER&lt;/span&gt;=/usr/bin/flashplayer&lt;br /&gt;
&lt;span class=&quot;Comment&quot;&gt;#GFLASHPLAYER=mplayer&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;[&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;PreProc&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;==&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;x&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;usage: &lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;`basename &lt;/span&gt;&lt;span class=&quot;PreProc&quot;&gt;$0&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;nbsp;[channel]&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;exit&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;fi&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Identifier&quot;&gt;TMP&lt;/span&gt;=&lt;span class=&quot;Special&quot;&gt;`mktemp /tmp/XXXXXX`&lt;/span&gt;&lt;br /&gt;
curl &lt;span class=&quot;Special&quot;&gt;-s&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&lt;a href=&quot;http://www.ustream.tv/channel/&quot;&gt;http://www.ustream.tv/channel/&lt;/a&gt;&lt;/span&gt;&lt;span class=&quot;PreProc&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;&amp;quot;&lt;/span&gt;&amp;nbsp;| &lt;span class=&quot;Statement&quot;&gt;grep&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;lt;param&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;PreProc&quot;&gt;$TMP&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Identifier&quot;&gt;URL&lt;/span&gt;=&lt;span class=&quot;Statement&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;-r&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;&amp;nbsp;line&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;do&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;[&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;!&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;-z&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;PreProc&quot;&gt;$URL&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;URL&lt;/span&gt;=&lt;span class=&quot;Statement&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;PreProc&quot;&gt;$URL&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;fi&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;URL&lt;/span&gt;=&lt;span class=&quot;Statement&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;PreProc&quot;&gt;$URL&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;`echo &lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&quot;PreProc&quot;&gt;$line&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;sed&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;s/^.* value=&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;\&amp;quot;\(&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;[^&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;]\+&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;\)\&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;.*$/\1/&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;done&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;&amp;lt;&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;PreProc&quot;&gt;$TMP&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;rm&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;PreProc&quot;&gt;$TMP&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;[&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;PreProc&quot;&gt;$URL&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;==&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;x&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;then&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;currently offline?&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;exit&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;fi&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;nbsp;playing &lt;/span&gt;&lt;span class=&quot;PreProc&quot;&gt;$URL&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;$GFLASHPLAYER&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;PreProc&quot;&gt;$URL&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;/blockquote&gt;
これでまたブラウザが楽になりました。&lt;br /&gt;
</description>
     <author>mattn.jp@gmail.com (mattn)</author>
   </item>
   <item>
     <title>WindowsのPerl(mingw32)でもCoroを動かすパッチ。</title>
     <pubDate>Mon, 22 Jun 2009 18:03:00 +0900</pubDate>
     <link>http://mattn.kaoriya.net/software/lang/perl/20090622180243.htm</link>
     <category>win32</category><category>perl</category><category>coro</category><category>windows</category><category>mingw32</category>
     <guid isPermaLink="true">http://mattn.kaoriya.net/software/lang/perl/20090622180243.htm</guid>
     <description>
VCだとビルド出来るらしいけど、strawberry perlとかだとコンパイル出来ない。&lt;br /&gt;
まずCoro側のpatch。&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&gt;
&lt;span class=&quot;Type&quot;&gt;diff -ur Coro-5.132.orig/Coro/libcoro/coro.c Coro-5.132/Coro/libcoro/coro.c&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Type&quot;&gt;--- Coro-5.132.orig/Coro/libcoro/coro.c 2008-11-19 11:50:13.000000000 +0900&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Type&quot;&gt;+++ Coro-5.132/Coro/libcoro/coro.c&amp;nbsp;&amp;nbsp;2009-06-19 15:01:16.140625000 +0900&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;@@ -228,6 +228,9 @@&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; #if __CYGWIN__&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx-&amp;gt;env[7] = (long)((char *)sptr + ssize) - sizeof (long);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx-&amp;gt;env[8] = (long)coro_init;&lt;br /&gt;
&lt;span class=&quot;Identifier&quot;&gt;+&amp;nbsp;&amp;nbsp;#elif defined(__MINGW32__)&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Identifier&quot;&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx-&amp;gt;env[4] = (int)((unsigned char *)sptr + ssize);&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Identifier&quot;&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx-&amp;gt;env[5] = (long)coro_init;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; #elif defined(_M_IX86)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((_JUMP_BUFFER *)&amp;amp;ctx-&amp;gt;env)-&amp;gt;Eip&amp;nbsp;&amp;nbsp; = (long)coro_init;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((_JUMP_BUFFER *)&amp;amp;ctx-&amp;gt;env)-&amp;gt;Esp&amp;nbsp;&amp;nbsp; = (long)STACK_ADJUST_PTR (sptr, ssize) - sizeof (long);&lt;br /&gt;
&lt;/blockquote&gt;
mingw32のjumpbufは4番目がEipで5番目がEspだったはず。&lt;br /&gt;
一応手元で動いてます。&lt;br /&gt;
あとこのままでも駄目で、ExtUtils::MakeMakerがgccの時に付けてしまう--image-baseオプションがまずい。&lt;br /&gt;
アドレスの作り方が Coro::Event であれば Event という文字列に対して上位4バイト、下位4バイトで分けてunpackとかやってござる。&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span class=&quot;Identifier&quot;&gt;$GCC&lt;/span&gt;) { &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;my&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;$dllname&lt;/span&gt;&amp;nbsp;= &lt;span class=&quot;Identifier&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;-&amp;gt;{&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;BASEEXT&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;}&lt;/span&gt;&amp;nbsp;. &lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&amp;nbsp;. &lt;span class=&quot;Identifier&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;-&amp;gt;{&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;DLEXT&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;}&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;$dllname&lt;/span&gt;&amp;nbsp;=~ &lt;span class=&quot;Statement&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;(....)(.{0,4})&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;/&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;my&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;$baseaddr&lt;/span&gt;&amp;nbsp;= &lt;span class=&quot;Statement&quot;&gt;unpack&lt;/span&gt;(&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;, &lt;span class=&quot;Identifier&quot;&gt;$1&lt;/span&gt;&amp;nbsp;^ &lt;span class=&quot;Identifier&quot;&gt;$2&lt;/span&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;$otherldflags&lt;/span&gt;&amp;nbsp;.= &lt;span class=&quot;Statement&quot;&gt;sprintf&lt;/span&gt;(&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;-Wl,--image-base,0x%x0000 &lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;, &lt;span class=&quot;Identifier&quot;&gt;$baseaddr&lt;/span&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;/blockquote&gt;
なので、Coro::Event が使っている Event というモジュールと --image-base がバッティングして起動時にメモリロケーション不正参照のエラーが起きる。&lt;br /&gt;
こちらについては、ExtUtils::MakeMakerに含まれる MM_Win32.pm を修正する。最近の gcc は勝手に --image-base 作ってくれるので、そちらに任せる。&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&gt;
&lt;span class=&quot;Type&quot;&gt;--- MM_Win32.pm.orig&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2009-06-22 17:48:43.906250000 +0900&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Type&quot;&gt;+++ MM_Win32.pm 2009-06-22 17:49:05.703125000 +0900&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;@@ -307,12 +307,12 @@&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;# we try to overcome non-relocateable-DLL problems by generating&lt;br /&gt;
&amp;nbsp;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a (hopefully unique) image-base from the dll&apos;s name&lt;br /&gt;
&amp;nbsp;# -- BKS, 10-19-1999&lt;br /&gt;
&lt;span class=&quot;Special&quot;&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ($GCC) { &lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Special&quot;&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my $dllname = $self-&amp;gt;{BASEEXT} . &amp;quot;.&amp;quot; . $self-&amp;gt;{DLEXT};&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Special&quot;&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $dllname =~ /(....)(.{0,4})/;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Special&quot;&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my $baseaddr = unpack(&amp;quot;n&amp;quot;, $1 ^ $2);&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Special&quot;&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $otherldflags .= sprintf(&amp;quot;-Wl,--image-base,0x%x0000 &amp;quot;, $baseaddr);&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Special&quot;&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Identifier&quot;&gt;+#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ($GCC) { &lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Identifier&quot;&gt;+#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;my $dllname = $self-&amp;gt;{BASEEXT} . &amp;quot;.&amp;quot; . $self-&amp;gt;{DLEXT};&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Identifier&quot;&gt;+#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$dllname =~ /(....)(.{0,4})/;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Identifier&quot;&gt;+#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;my $baseaddr = unpack(&amp;quot;n&amp;quot;, $1 ^ $2);&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Identifier&quot;&gt;+#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$otherldflags .= sprintf(&amp;quot;-Wl,--image-base,0x%x0000 &amp;quot;, $baseaddr);&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Identifier&quot;&gt;+#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; push(@m,&apos;&lt;br /&gt;
&amp;nbsp;# This section creates the dynamically loadable $(INST_DYNAMIC)&lt;br /&gt;
&lt;/blockquote&gt;
SYNOPSISの例でもちゃんと動きます。&lt;br /&gt;
&lt;br /&gt;
あとはバグ報告から上手く修正されれば...&lt;br /&gt;
</description>
     <author>mattn.jp@gmail.com (mattn)</author>
   </item>
   <item>
     <title>FastLadder.vimをLivedoorReader対応した。</title>
     <pubDate>Mon, 22 Jun 2009 17:16:00 +0900</pubDate>
     <link>http://mattn.kaoriya.net/software/vim/20090622171527.htm</link>
     <category>vim</category><category>livedoor reader</category><category>vimscript</category><category>livedoor</category><category>ldr</category><category>livedoorreader</category>
     <guid isPermaLink="true">http://mattn.kaoriya.net/software/vim/20090622171527.htm</guid>
     <description>
アナウンスしてなかったですが、先日書いた「&lt;a href=&quot;http://mattn.kaoriya.net/software/vim/20090617124323.htm&quot;&gt;VimからFastLadderを扱えるスクリプトFastLadder.vim書いた。&lt;/a&gt;」ですが、&lt;a href=&quot;http://reader.livedoor.com/&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;LivedoorReader&lt;/a&gt;に対応させています。
&lt;blockquote class=&quot;code&quot;&gt;
&lt;span class=&quot;Statement&quot;&gt;let&lt;/span&gt;&amp;nbsp;g:fastladder_server&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;&apos;&lt;a href=&quot;http://reader.livedoor.com&quot;&gt;http://reader.livedoor.com&lt;/a&gt;&apos;&lt;/span&gt;&lt;br /&gt;
&lt;/blockquote&gt;
とvimrcに書いておくと
&lt;blockquote class=&quot;code&quot;&gt;
:FastLadder&lt;br /&gt;
&lt;/blockquote&gt;
でLivedoorReaderのフィードが見れます。&lt;br /&gt;
今後はFastLadderやLivedoorReaderの様にフォルダ単位の閲覧が出来る様に改良して行く予定です。&lt;br /&gt;
</description>
     <author>mattn.jp@gmail.com (mattn)</author>
   </item>
   <item>
     <title>いつの間にかFreenodeにWebChat機能が付いていた。</title>
     <pubDate>Mon, 22 Jun 2009 16:23:00 +0900</pubDate>
     <link>http://mattn.kaoriya.net/web/20090622161417.htm</link>
     <category>freenode</category><category>irc</category>
     <guid isPermaLink="true">http://mattn.kaoriya.net/web/20090622161417.htm</guid>
     <description>
IRCのWebChatと言えば、&lt;a href=&quot;http://www.mibbit.com/&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;Mibbit.com&lt;/a&gt;が有名ですが、Freenode自身が&lt;a href=&quot;http://www.qwebirc.org/&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;qwebirc&lt;/a&gt;という、&lt;a href=&quot;http://twistedmatrix.com/&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;Twisted&lt;/a&gt;と&lt;a href=&quot;http://mootools.net/&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;Mootools&lt;/a&gt;を使ったIRCチャットサーバアプリを持っている事に気づきました。&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;
&lt;a href=&quot;http://webchat.freenode.net/&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;freenode Web IRC (qwebirc)&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;Connect to freenode IRC&lt;/p&gt;
&lt;cite&gt;http://webchat.freenode.net/&lt;/cite&gt;
&lt;/blockquote&gt;
Webページへの埋め込みもウィザード付きで簡単です。チャネル#Vim-users.jpであればこんな感じの埋め込みでいけます。&lt;br /&gt;
&lt;p&gt;&lt;a href=&quot;http://mattn.kaoriya.net/web/20090622161417.htm&quot; class=&quot;seemore&quot;&gt;続きを読む...&lt;/a&gt;&lt;/p&gt;

</description>
     <author>mattn.jp@gmail.com (mattn)</author>
   </item>
   <item>
     <title>Mumblesを使ったGitHubのGrowl通知アプリケーションを作った。</title>
     <pubDate>Thu, 18 Jun 2009 22:12:00 +0900</pubDate>
     <link>http://mattn.kaoriya.net/software/lang/python/20090618220425.htm</link>
     <category>growl</category><category>mumbles</category><category>github</category>
     <guid isPermaLink="true">http://mattn.kaoriya.net/software/lang/python/20090618220425.htm</guid>
     <description>
Windowsでは&lt;a href=&quot;http://www.growlforwindows.com/gfw/&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;Growl For Windows&lt;/a&gt;とそれが使っているプロトコル&lt;a href=&quot;http://www.growlforwindows.com/gfw/help/gntp.aspx&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;GNTP&lt;/a&gt;により、Windowsでもアイコンを使ったGrowlアプリケーションの開発が可能になりました。その一つにmiyagawaさんが作った&lt;a href=&quot;http://github.com/miyagawa/github-growler/tree/master&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;github growler&lt;/a&gt;のGNTP版でもある&lt;a href=&quot;http://github.com/mattn/yet-another-github-growler/tree/master&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;yet another github growler&lt;/a&gt;というのも作りました。&lt;br /&gt;
これでMac, Windowsでのgithub growlerがある事になるのですが、Linuxにありません。Linuxにはアイコンが表示できてGNTPプロトコルを喋るGrowlシステムがありません。&lt;br /&gt;
そこで以前から使っていた、Growlネットワークプロトコル(Growlネットワークプロトコルはアイコンが出せません)をサポートしているmumblesというGrowlシステムを調べて見たところ、内部ではpythonでDBusによるプロセス間通信を行っている事が分かりました。
&lt;blockquote class=&quot;quote&quot;&gt;
&lt;a href=&quot;http://www.mumbles-project.org/&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;mumbles-project.org&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;a plugin driven, modern notification system for Gnome&lt;/p&gt;
&lt;cite&gt;http://www.mumbles-project.org/&lt;/cite&gt;
&lt;/blockquote&gt;
さらにそのDBusインタフェース上ではアイコン表示をサポートしていた為、これは！と思いGitHubのGrowlアプリケーションを作ってみました。&lt;br /&gt;
まず、DBusで通信する為のプラグインを作成します。&lt;br /&gt;
DBusでメソッドが呼ばれると、MumblesPluginクラスに渡されるMumblesNotifyオブジェクトのalertメソッドを呼び出します。&lt;br /&gt;
全体のソースは以下の様になります。&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&gt;
&lt;span class=&quot;PreProc&quot;&gt;from&lt;/span&gt;&amp;nbsp;MumblesPlugin &lt;span class=&quot;PreProc&quot;&gt;import&lt;/span&gt;&amp;nbsp;*&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;import&lt;/span&gt;&amp;nbsp;dbus&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;import&lt;/span&gt;&amp;nbsp;gnomevfs&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;import&lt;/span&gt;&amp;nbsp;os&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;import&lt;/span&gt;&amp;nbsp;urllib&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;GithubMumbles&lt;/span&gt;(MumblesPlugin):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;plugin_name = &apos;&lt;span class=&quot;Constant&quot;&gt;GithubMumbles&lt;/span&gt;&apos;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;dbus_interface = &apos;&lt;span class=&quot;Constant&quot;&gt;com.github.DBus&lt;/span&gt;&apos;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;dbus_path = &apos;&lt;span class=&quot;Constant&quot;&gt;/com/github/DBus&lt;/span&gt;&apos;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;icons = {&apos;&lt;span class=&quot;Constant&quot;&gt;github&lt;/span&gt;&apos;&amp;nbsp;: &apos;&lt;span class=&quot;Constant&quot;&gt;github.png&lt;/span&gt;&apos;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;__url = None&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;def&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;__init__&lt;/span&gt;(self, mumbles_notify, session_bus):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.signal_config = {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&apos;&lt;span class=&quot;Constant&quot;&gt;Notify&lt;/span&gt;&apos;: self.Notify,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&apos;&lt;span class=&quot;Constant&quot;&gt;NotifyNum&lt;/span&gt;&apos;: self.NotifyNum&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MumblesPlugin.__init__(self, mumbles_notify, session_bus)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.add_click_handler(self.onClick)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;def&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;NotifyNum&lt;/span&gt;(self, num):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.__url = &apos;&lt;span class=&quot;Constant&quot;&gt;&lt;a href=&quot;http://github.com/&quot;&gt;http://github.com/&lt;/a&gt;&lt;/span&gt;&apos;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;icon = self.get_icon(&apos;&lt;span class=&quot;Constant&quot;&gt;github&lt;/span&gt;&apos;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;title = &apos;&lt;span class=&quot;Constant&quot;&gt;Github&lt;/span&gt;&apos;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;msg = str(num)+&apos;&lt;span class=&quot;Constant&quot;&gt;&amp;nbsp;new messages!&lt;/span&gt;&apos;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.mumbles_notify.alert(self.plugin_name, title, msg, icon)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;def&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;Notify&lt;/span&gt;(self, link, author, text):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.__url = link&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;path = os.path.join(PLUGIN_DIR_USER, &apos;&lt;span class=&quot;Constant&quot;&gt;icons&lt;/span&gt;&apos;, &apos;&lt;span class=&quot;Constant&quot;&gt;github-%s&lt;/span&gt;&apos;&amp;nbsp;% author)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;os.path.exists(path):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.icons[author] = &apos;&lt;span class=&quot;Constant&quot;&gt;github-%s&lt;/span&gt;&apos;&amp;nbsp;% author&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;icon = self.get_icon(author)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;else&lt;/span&gt;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;icon = self.get_icon(&apos;&lt;span class=&quot;Constant&quot;&gt;github&lt;/span&gt;&apos;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.mumbles_notify.alert(self.plugin_name, author, text, icon)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;def&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;onClick&lt;/span&gt;(self, widget, event, plugin_name):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;event.button == 3:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.mumbles_notify.close(widget.window)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;else&lt;/span&gt;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.open_url(self.__url)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;def&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;open_url&lt;/span&gt;(self, url):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mime_type = gnomevfs.get_mime_type(url)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;application = gnomevfs.mime_get_default_application(mime_type)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;os.system(application[2] + &apos;&lt;span class=&quot;Constant&quot;&gt;&amp;nbsp;&amp;quot;&lt;/span&gt;&apos;&amp;nbsp;+ url + &apos;&lt;span class=&quot;Constant&quot;&gt;&amp;quot; &amp;amp;&lt;/span&gt;&apos;)&lt;br /&gt;
&lt;/blockquote&gt;
インタフェースはリンク、作者、本文のみとしました。これをegg形式にビルドしてmumblesのpluginフォルダに置くと、上記のインタフェース呼び出しによりGrowlが表示されます。&lt;br /&gt;
MumblesPluginにはget_iconメソッドが用意されており、これにはアイコン名称を渡す事になります。実際にはplugin/iconsというフォルダにある名称のファイルが使用されるので、今回の仕組としてはgithubフィードのチェッカースクリプトでアイコンをplugin/iconsフォルダに格納させ、それを使用してプラグイン側が使用するという形になっています。プラグイン側でアイコンを取って来ても良いのですがアイコンをダウンロードしている最中はGrowlが固まってしまう為、今回の様な作りとなっています。&lt;br /&gt;
次にチェッカースクリプトですが以下の様なコードになります。
&lt;blockquote class=&quot;code&quot;&gt;
&lt;span class=&quot;Comment&quot;&gt;#!/usr/bin/env python&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
UPDATE_INTERVAL=1000 &lt;span class=&quot;Comment&quot;&gt;# 10 minutes&lt;/span&gt;&lt;br /&gt;
MAX_NOTIFICATIONS = 40&lt;br /&gt;
DEBUG = True&lt;br /&gt;
&lt;span class=&quot;Comment&quot;&gt;##################################################&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;import&lt;/span&gt;&amp;nbsp;os&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;import&lt;/span&gt;&amp;nbsp;sys&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;import&lt;/span&gt;&amp;nbsp;time&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;import&lt;/span&gt;&amp;nbsp;getopt&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;import&lt;/span&gt;&amp;nbsp;rfc822&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;import&lt;/span&gt;&amp;nbsp;calendar&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;import&lt;/span&gt;&amp;nbsp;urllib&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;import&lt;/span&gt;&amp;nbsp;feedparser&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;import&lt;/span&gt;&amp;nbsp;dbus&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;import&lt;/span&gt;&amp;nbsp;dbus.service&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;from&lt;/span&gt;&amp;nbsp;dbus.mainloop.glib &lt;span class=&quot;PreProc&quot;&gt;import&lt;/span&gt;&amp;nbsp;DBusGMainLoop&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;import&lt;/span&gt;&amp;nbsp;gobject&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;from&lt;/span&gt;&amp;nbsp;BeautifulSoup &lt;span class=&quot;PreProc&quot;&gt;import&lt;/span&gt;&amp;nbsp;BeautifulSoup&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;from&lt;/span&gt;&amp;nbsp;pit &lt;span class=&quot;PreProc&quot;&gt;import&lt;/span&gt;&amp;nbsp;Pit&lt;br /&gt;
&lt;br /&gt;
GITHUB_DBUS_INTERFACE = &apos;&lt;span class=&quot;Constant&quot;&gt;com.github.DBus&lt;/span&gt;&apos;&lt;br /&gt;
GITHUB_DBUS_PATH = &apos;&lt;span class=&quot;Constant&quot;&gt;/com/github/DBus&lt;/span&gt;&apos;&lt;br /&gt;
&lt;br /&gt;
config = Pit.get(&apos;&lt;span class=&quot;Constant&quot;&gt;github.com&lt;/span&gt;&apos;, {&apos;&lt;span class=&quot;Constant&quot;&gt;require&lt;/span&gt;&apos;: {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&apos;&lt;span class=&quot;Constant&quot;&gt;user&lt;/span&gt;&apos;&amp;nbsp;&amp;nbsp;: &apos;&lt;span class=&quot;Constant&quot;&gt;user id on github.com&lt;/span&gt;&apos;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&apos;&lt;span class=&quot;Constant&quot;&gt;token&lt;/span&gt;&apos;&amp;nbsp;: &apos;&lt;span class=&quot;Constant&quot;&gt;user token on github.com&lt;/span&gt;&apos;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}})&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;Usage&lt;/span&gt;(Exception):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;def&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;__init__&lt;/span&gt;(self, msg=None):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app = sys.argv[0]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;msg != &apos;&lt;span class=&quot;Constant&quot;&gt;help&lt;/span&gt;&apos;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.msg = app+&apos;&lt;span class=&quot;Constant&quot;&gt;: Invalid options. Try --help for usage details.&lt;/span&gt;&apos;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;else&lt;/span&gt;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.msg = app+&amp;quot;&lt;span class=&quot;Constant&quot;&gt;: DBus notifications on new github messages.&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;GithubCheck&lt;/span&gt;(dbus.service.Object):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;def&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;__init__&lt;/span&gt;(self):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;session_bus = dbus.SessionBus()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bus_name = dbus.service.BusName(GITHUB_DBUS_INTERFACE, bus=session_bus)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbus.service.Object.__init__(self, bus_name, GITHUB_DBUS_PATH)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.interval = UPDATE_INTERVAL&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.notifyLimit = MAX_NOTIFICATIONS&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.debug = DEBUG&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.lastCheck = None&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.minInterval = 60000 &lt;span class=&quot;Comment&quot;&gt;# 1 minute min refresh interval&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;self.interval &amp;lt; self.minInterval:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;print&lt;/span&gt;&amp;nbsp;&amp;quot;&lt;span class=&quot;Constant&quot;&gt;Warning: Cannot check github more often than once a minute! Using default of 1 minute.&lt;/span&gt;&amp;quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.interval = self.minInterval&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._check()&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;PreProc&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;dbus&lt;/span&gt;.service.signal(dbus_interface=GITHUB_DBUS_INTERFACE, signature=&apos;&lt;span class=&quot;Constant&quot;&gt;sss&lt;/span&gt;&apos;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;def&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;Notify&lt;/span&gt;(self, link, author, text):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;pass&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;PreProc&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;dbus&lt;/span&gt;.service.signal(dbus_interface=GITHUB_DBUS_INTERFACE, signature=&apos;&lt;span class=&quot;Constant&quot;&gt;i&lt;/span&gt;&apos;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;def&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;NotifyNum&lt;/span&gt;(self, num):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;pass&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;def&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;_check&lt;/span&gt;(self):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;self.debug:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;self.lastCheck:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;print&lt;/span&gt;&amp;nbsp;&amp;quot;&lt;span class=&quot;Constant&quot;&gt;checking feed (newer than %s):&lt;/span&gt;&amp;quot;&amp;nbsp;%(self.lastCheck)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;else&lt;/span&gt;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;print&lt;/span&gt;&amp;nbsp;&amp;quot;&lt;span class=&quot;Constant&quot;&gt;checking feed:&lt;/span&gt;&amp;quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;try&lt;/span&gt;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;items = feedparser.parse(&amp;quot;&lt;span class=&quot;Constant&quot;&gt;&lt;a href=&quot;http://github.com/%s.private.atom/?token=%s&quot;&gt;http://github.com/%s.private.atom/?token=%s&lt;/a&gt;&lt;/span&gt;&amp;quot;&amp;nbsp;% (config[&apos;&lt;span class=&quot;Constant&quot;&gt;user&lt;/span&gt;&apos;], config[&apos;&lt;span class=&quot;Constant&quot;&gt;token&lt;/span&gt;&apos;]))[&apos;&lt;span class=&quot;Constant&quot;&gt;entries&lt;/span&gt;&apos;]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;except&lt;/span&gt;&amp;nbsp;Exception, e:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;items = []&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;self.lastCheck:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lastCheck = calendar.timegm(time.localtime(calendar.timegm(rfc822.parsedate(self.lastCheck))))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;for&lt;/span&gt;&amp;nbsp;item &lt;span class=&quot;Statement&quot;&gt;in&lt;/span&gt;&amp;nbsp;items:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;calendar.timegm(item.published_parsed) &amp;lt; lastCheck:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;items.remove(item)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.lastCheck = rfc822.formatdate()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num_notifications = len(items)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;num_notifications &amp;gt; MAX_NOTIFICATIONS:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;self.debug:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;print&lt;/span&gt;&amp;nbsp;&amp;quot;&lt;span class=&quot;Constant&quot;&gt;%s new entries&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;\n&lt;/span&gt;&amp;quot;&amp;nbsp;%(num_notifications)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.NotifyNum(num_notifications)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;elif&lt;/span&gt;&amp;nbsp;num_notifications &amp;lt; 0:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;self.debug:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;print&lt;/span&gt;&amp;nbsp;&amp;quot;&lt;span class=&quot;Constant&quot;&gt;no new entries&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;else&lt;/span&gt;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;for&lt;/span&gt;&amp;nbsp;item &lt;span class=&quot;Statement&quot;&gt;in&lt;/span&gt;&amp;nbsp;items:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;path = os.path.join(os.path.expanduser(&apos;&lt;span class=&quot;Constant&quot;&gt;~&lt;/span&gt;&apos;), &apos;&lt;span class=&quot;Constant&quot;&gt;.mumbles&lt;/span&gt;&apos;, &apos;&lt;span class=&quot;Constant&quot;&gt;plugins&lt;/span&gt;&apos;, &apos;&lt;span class=&quot;Constant&quot;&gt;icons&lt;/span&gt;&apos;, &apos;&lt;span class=&quot;Constant&quot;&gt;github-%s&lt;/span&gt;&apos;&amp;nbsp;% item[&apos;&lt;span class=&quot;Constant&quot;&gt;author&lt;/span&gt;&apos;])&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;not&lt;/span&gt;&amp;nbsp;os.path.exists(path):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;html = urllib.urlopen(&apos;&lt;span class=&quot;Constant&quot;&gt;&lt;a href=&quot;http://github.com/%s&quot;&gt;http://github.com/%s&lt;/a&gt;&lt;/span&gt;&apos;&amp;nbsp;% item[&apos;&lt;span class=&quot;Constant&quot;&gt;author&lt;/span&gt;&apos;]).read()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;soup = BeautifulSoup(html)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;img = soup.findAll(&apos;&lt;span class=&quot;Constant&quot;&gt;div&lt;/span&gt;&apos;, {&apos;&lt;span class=&quot;Constant&quot;&gt;class&lt;/span&gt;&apos;:&apos;&lt;span class=&quot;Constant&quot;&gt;identity&lt;/span&gt;&apos;})[0].find(&apos;&lt;span class=&quot;Constant&quot;&gt;img&lt;/span&gt;&apos;)[&apos;&lt;span class=&quot;Constant&quot;&gt;src&lt;/span&gt;&apos;]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;img = img.replace(&amp;quot;&lt;span class=&quot;Constant&quot;&gt;?s=50&amp;amp;&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span class=&quot;Constant&quot;&gt;?s=30&amp;amp;&lt;/span&gt;&amp;quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;urllib.urlretrieve(img, path)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.Notify(item[&apos;&lt;span class=&quot;Constant&quot;&gt;link&lt;/span&gt;&apos;], item[&apos;&lt;span class=&quot;Constant&quot;&gt;author&lt;/span&gt;&apos;], item[&apos;&lt;span class=&quot;Constant&quot;&gt;title&lt;/span&gt;&apos;])&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(6)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gobject.timeout_add(self.interval,self._check)&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;__name__ == &apos;&lt;span class=&quot;Constant&quot;&gt;__main__&lt;/span&gt;&apos;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;DBusGMainLoop(set_as_default=True)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;try&lt;/span&gt;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;try&lt;/span&gt;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;opts, args = getopt.getopt(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sys.argv[1:], &amp;quot;&lt;span class=&quot;Constant&quot;&gt;hp&lt;/span&gt;&amp;quot;, [&amp;quot;&lt;span class=&quot;Constant&quot;&gt;help&lt;/span&gt;&amp;quot;])&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;except&lt;/span&gt;&amp;nbsp;getopt.GetoptError:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;raise&lt;/span&gt;&amp;nbsp;Usage()&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;for&lt;/span&gt;&amp;nbsp;o, a &lt;span class=&quot;Statement&quot;&gt;in&lt;/span&gt;&amp;nbsp;opts:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;o &lt;span class=&quot;Statement&quot;&gt;in&lt;/span&gt;&amp;nbsp;(&amp;quot;&lt;span class=&quot;Constant&quot;&gt;-h&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span class=&quot;Constant&quot;&gt;--help&lt;/span&gt;&amp;quot;):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;raise&lt;/span&gt;&amp;nbsp;Usage(&apos;&lt;span class=&quot;Constant&quot;&gt;help&lt;/span&gt;&apos;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;else&lt;/span&gt;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;raise&lt;/span&gt;&amp;nbsp;Usage()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;except&lt;/span&gt;&amp;nbsp;Usage, err:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;print&lt;/span&gt;&amp;nbsp;&amp;gt;&amp;gt; sys.stderr, err.msg&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sys.exit(2)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;t = GithubCheck()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;try&lt;/span&gt;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;loop = gobject.MainLoop()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;loop.run()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;except&lt;/span&gt;&amp;nbsp;KeyboardInterrupt:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;print&lt;/span&gt;&amp;nbsp;&amp;quot;&lt;span class=&quot;Constant&quot;&gt;githubcheck shut down...&lt;/span&gt;&amp;quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;except&lt;/span&gt;&amp;nbsp;Exception, ex:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;print&lt;/span&gt;&amp;nbsp;&amp;quot;&lt;span class=&quot;Constant&quot;&gt;Exception in githubcheck: %s&lt;/span&gt;&amp;quot;&amp;nbsp;%(ex)&lt;br /&gt;
&lt;/blockquote&gt;
だらだらとしたコードですが、大体分かってもらえるかと思います。pitを使っているので初回起動のみユーザとトークンをエディタで入力する必要があります。トークンはGitHubのダッシュボードにあるRSSアイコンのリンク先URLに含まれています。&lt;br /&gt;
&lt;br /&gt;
実行してしばらくすると以下の様な画面が表示されます。&lt;br /&gt;
&lt;blockquote&gt;
&lt;a href=&quot;http://mattn.kaoriya.net/images/mumbles-github-growler.png&quot; rel=&quot;lightbox&quot; title=&quot;mumbles-github-growler&quot;&gt;&lt;img src=&quot;http://mattn.kaoriya.net/images/mumbles-github-growler-thumb.png&quot; alt=&quot;mumbles-github-growler&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/blockquote&gt;
これで快適になりました。&lt;br /&gt;
github上で全てのソースを公開しています。
&lt;blockquote class=&quot;quote&quot;&gt;
&lt;a href=&quot;http://github.com/mattn/mumbles-github-growler/tree/master&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;mattn&apos;s mumbles-github-growler at master - GitHub&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;github growler using mumbles plugin and checker script.&lt;/p&gt;
&lt;cite&gt;http://github.com/mattn/mumbles-github-growler/tree/master&lt;/cite&gt;
&lt;/blockquote&gt;
よろしければどうぞ。&lt;br /&gt;
</description>
     <author>mattn.jp@gmail.com (mattn)</author>
   </item>
   <item>
     <title>わざわざrubyからsetlocale()呼び出すのにライブラリ作らなくても呼べた。</title>
     <pubDate>Thu, 18 Jun 2009 15:08:00 +0900</pubDate>
     <link>http://mattn.kaoriya.net/software/lang/ruby/20090618150728.htm</link>
     <category>ruby</category>
     <guid isPermaLink="true">http://mattn.kaoriya.net/software/lang/ruby/20090618150728.htm</guid>
     <description>
&lt;blockquote class=&quot;code&quot;&gt;
&lt;span class=&quot;PreProc&quot;&gt;require&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;rubygems&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;require&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;dl/import&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;module&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;Lib_MSVCRT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;PreProc&quot;&gt;extend&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;DL&lt;/span&gt;::&lt;span class=&quot;Type&quot;&gt;Importable&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;LC_CTYPE&lt;/span&gt;&amp;nbsp;= &lt;span class=&quot;Constant&quot;&gt;2&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;dlload &lt;span class=&quot;Special&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;msvcrt.dll&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;extern &lt;span class=&quot;Special&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;char* setlocale(int, char*)&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;end&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Type&quot;&gt;Lib_MSVCRT&lt;/span&gt;::setlocale(&lt;span class=&quot;Type&quot;&gt;Lib_MSVCRT&lt;/span&gt;::&lt;span class=&quot;Type&quot;&gt;LC_CTYPE&lt;/span&gt;, &lt;span class=&quot;Special&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;)&lt;br /&gt;
&lt;/blockquote&gt;
</description>
     <author>mattn.jp@gmail.com (mattn)</author>
   </item>
   <item>
     <title>Windows版のruby-irbでも正しくマルチバイトを扱いたい。</title>
     <pubDate>Wed, 17 Jun 2009 17:20:00 +0900</pubDate>
     <link>http://mattn.kaoriya.net/software/lang/ruby/20090617171539.htm</link>
     <category>windows</category><category>ruby</category>
     <guid isPermaLink="true">http://mattn.kaoriya.net/software/lang/ruby/20090617171539.htm</guid>
     <description>
使っているreadline.dllは&lt;a href=&quot;http://jarp.does.notwork.org/win32/&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;ここ&lt;/a&gt;から持って来ているんだけど、まずこれがマルチバイトありでビルドされていない。なのでマルチバイト文字を入力した後、バックスペース押すと1バイト単位でしか戻らない。&lt;br /&gt;
今日はそれを解決してみる。&lt;a href=&quot;http://jarp.does.notwork.org/win32/readline-4.3-2-src.zip&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;readline-4.3-2-src.zip&lt;/a&gt;を持ってきて
&lt;blockquote class=&quot;code&quot;&gt;
# unzip readline-4.3-2-src.zip&lt;br /&gt;
# cd readline-4.3-2&amp;yen;win32&amp;yen;shlib&lt;br /&gt;
# copy config.h config.h.orig&lt;br /&gt;
# vim config.h&lt;br /&gt;
diff -u config.h.orig config.h&lt;br /&gt;
--- config.h.orig&amp;nbsp;&amp;nbsp; 2003-04-14 16:04:46.000000000 +0900&lt;br /&gt;
+++ config.h&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2009-06-17 17:04:07.234375000 +0900&lt;br /&gt;
@@ -128,11 +128,9 @@&lt;br /&gt;
&amp;nbsp;/* Define if you have the &amp;lt;varargs.h&amp;gt; header file.&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;
&amp;nbsp;//#define HAVE_VARARGS_H 1&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
-/*&lt;br /&gt;
&amp;nbsp;#define HAVE_WCTYPE_H 1&lt;br /&gt;
&amp;nbsp;#define HAVE_WCHAR_H 1&lt;br /&gt;
&amp;nbsp;#define HAVE_MBSRTOWCS 1&lt;br /&gt;
-*/&lt;br /&gt;
&amp;nbsp;/* config.h.bot */&lt;br /&gt;
&amp;nbsp;/* modify settings or make new ones based on what autoconf tells us. */&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
# copy config.h ..&lt;br /&gt;
# mingw32-make -f GNUmakefile&lt;br /&gt;
&lt;/blockquote&gt;
とするとreadline.dllが出来上がるのでそれをパスの通った場所に置く。古いreadline.dllをバックアップしておいて入れ替えるのもOK。&lt;br /&gt;
次に、&lt;a href=&quot;http://d.hatena.ne.jp/Constellation/20090222/1235318056&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;id:Constellationさんの記事&lt;/a&gt;にある以下のソースをlocale.cとして保存する。&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&gt;
&lt;span class=&quot;PreProc&quot;&gt;#include &lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;lt;locale.h&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;#include &lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;ruby.h&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Type&quot;&gt;static&lt;/span&gt;&amp;nbsp;VALUE mLocale;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Type&quot;&gt;static&lt;/span&gt;&amp;nbsp;VALUE&lt;br /&gt;
locale_setlocale(obj)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;setlocale(&lt;span class=&quot;Constant&quot;&gt;LC_CTYPE&lt;/span&gt;, &lt;span class=&quot;Constant&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;);&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;#ifdef LC_MESSAGES&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;setlocale(LC_MESSAGES, &lt;span class=&quot;Constant&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;);&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;#endif&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;return&lt;/span&gt;&amp;nbsp;Qnil;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Type&quot;&gt;void&lt;/span&gt;&lt;br /&gt;
Init_locale()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;mLocale = rb_define_module(&lt;span class=&quot;Constant&quot;&gt;&amp;quot;Locale&amp;quot;&lt;/span&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;rb_define_module_function(mLocale, &lt;span class=&quot;Constant&quot;&gt;&amp;quot;setlocale&amp;quot;&lt;/span&gt;, locale_setlocale, &lt;span class=&quot;Constant&quot;&gt;0&lt;/span&gt;);&lt;br /&gt;
}&lt;br /&gt;
&lt;/blockquote&gt;
そしてコンパイル
&lt;blockquote class=&quot;code&quot;&gt;
# gcc -Ic:/ruby/lib/ruby/1.8/i386-mswin32 -shared -o locale.so locale.c libreadline.a c:/ruby/lib/msvcrt-ruby18.lib 
&lt;/blockquote&gt;
&lt;em&gt;ワーニングが出るけど気にしない&lt;/em&gt;&lt;br /&gt;
出来上がったlocale.soを
&lt;blockquote class=&quot;code&quot;&gt;
C:&amp;yen;ruby&amp;yen;lib&amp;yen;ruby&amp;yen;1.8&amp;yen;locale.so
&lt;/blockquote&gt;
として配置し、ホームディレクトリ(HOME環境変数を設定していないならばUSERPROFILE変数の位置)に&quot;.irbrc&quot;というファイルを作って以下の様に書く。&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&gt;
&lt;span class=&quot;Statement&quot;&gt;begin&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;PreProc&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;locale&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;Locale&lt;/span&gt;.setlocale&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;rescue&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;end&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;require&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;rubygems&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;&apos;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;require&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;utility_belt&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;&apos;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;require&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;win32console&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;&apos;&lt;/span&gt;&lt;br /&gt;
&lt;/blockquote&gt;
&quot;utility_belt&quot;は&lt;a href=&quot;http://doruby.kbmj.com/Kuromatu_logs/20090227/utility_belt_wirble_irb_&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;この記事&lt;/a&gt;を、win32consoleはエスケープシーケンスを色付けして表示して貰うために...&lt;br /&gt;
後はirbを起動すれば、マルチバイト文字でバックスペースしても正しく1文字消えてくれます。&lt;br /&gt;
&lt;br /&gt;
Constellation++&lt;br /&gt;
&lt;br /&gt;
これでようやく、&lt;a href=&quot;http://github.com/jugyo/termtter/tree/master&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;termtter&lt;/a&gt;でも正しく日本語が打てる。&lt;br /&gt;
なお、Constellationさんの記事にも書かれていますがtime.rb周りで弊害が出る可能性があるので、気を付けて。termtterの場合なら&quot;~/termtter/config&quot;にLocale.setlocaleを書いた方が良いかもしれない。&lt;br /&gt;
</description>
     <author>mattn.jp@gmail.com (mattn)</author>
   </item>
  </channel>
</rss>
