<?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.0</generator>
    <atom:link href="http://mattn.kaoriya.net/index.rss" rel="self" type="application/rss+xml" />
   <item>
     <title>UserAgentを切り替えられるvimperator plugin、「uaSwitch.js」書いた。</title>
     <pubDate>Thu, 24 Jul 2008 20:03:00 +0900</pubDate>
     <link>http://mattn.kaoriya.net/software/firefox/vimperator/20080724195945.htm</link>
     <category>/software/firefox/vimperator</category>
     <guid isPermaLink="true">http://mattn.kaoriya.net/software/firefox/vimperator/20080724195945</guid>
     <description>
とは言っても&lt;a href=&quot;https://addons.mozilla.org/firefox/addon/59&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;User Agent Switcher&lt;/a&gt;が必要なのですが...&lt;br /&gt;
&lt;br /&gt;
使い方は&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&gt;
:ua MyUserAgent&lt;br /&gt;
&lt;/blockquote&gt;
でUser Agent Switcherに&quot;MyUserAgent&quot;という名前で登録されたUser Agentに変更します。&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&gt;
:ua Default&lt;br /&gt;
&lt;/blockquote&gt;
でリセット
&lt;blockquote class=&quot;code&quot;&gt;
:ua!&lt;br /&gt;
&lt;/blockquote&gt;
で設定ダイアログ表示となります。&lt;br /&gt;
急遽モバイルページに行きたいけどメニューに手を伸ばすの面倒臭いって方には使えるかも。&lt;br /&gt;
ちなみに私はデフォルトで登録されていた物の他に、DoCoMo、Vodafone、SoftBank、Hatenaクローラ等のUserAgentを登録してます。&lt;br /&gt;
&lt;blockquote&gt;
&lt;a href=&quot;http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/uaSwitch.js&quot;&gt;uaSwitch.js&lt;/a&gt;
&lt;/blockquote&gt;
よろしければどーぞ。&lt;br /&gt;
</description>
     <author>mattn.jp@gmail.com (mattn)</author>
   </item>
   <item>
     <title>GoogleのProtocol Buffersをpython,cpp,java、一気に遊んでみる</title>
     <pubDate>Wed, 23 Jul 2008 20:46:00 +0900</pubDate>
     <link>http://mattn.kaoriya.net/software/20080723203931.htm</link>
     <category>/software</category>
     <guid isPermaLink="true">http://mattn.kaoriya.net/software/20080723203931</guid>
     <description>
遅ればせながらGoogle Protocol Buffersで遊んでみました。
&lt;blockquote class=&quot;quote&quot;&gt;
&lt;a href=&quot;http://code.google.com/p/protobuf/&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;protobuf - Google Code&lt;/a&gt;&lt;br /&gt;
Protocol Buffers are a way of encoding structured data in an efficient yet extensible format. Google uses Protocol Buffers for almost all of its internal RPC protocols and file formats. 
&lt;/blockquote&gt;
まず、インストールは以下の様に行いました。なおprotobufを展開したフォルダは以下のフォルダ。
&lt;blockquote class=&quot;code&quot;&gt;
C:&amp;yen;temp&amp;yen;protobuf-2.0.0beta&amp;yen;&lt;br /&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;h4&gt;cpp版のインストール&lt;/h4&gt;
展開したフォルダのvsprojectsフォルダにある&quot;protobuf.sln&quot;をVisual Studioで開きReleaseビルド。&lt;br /&gt;
必要であれば環境変数PATHの通る場所へ&quot;protoc.exe&quot;、&quot;libprotobuf.dll&quot;、&quot;libprotoc.dll&quot;を置く。また&quot;libprotobuf.lib&quot;と&quot;libprotoc.lib&quot;はコンパイル時に必要になるので分かりやすい位置に置いておく。&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;java版のインストール&lt;/h4&gt;
まず&lt;a href=&quot;http://maven.apache.org/&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;Apache Maven&lt;/a&gt;をインストールしPATHを通す。&lt;br /&gt;
次にjavaフォルダへ移動し
&lt;blockquote class=&quot;code&quot;&gt;
C:&amp;yen;temp&amp;yen;protobuf-2.0.0beta&amp;yen;java&amp;gt; mvn test install&lt;br /&gt;
&lt;/blockquote&gt;
とすれば必要なライブラリがダウンロードされ、テスト後インストールされる。&lt;br /&gt;
targetフォルダに&quot;protobuf-java-2.0.0beta.jar&quot;が出来るのでこれまた分かりやすい位置に置く。&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;python版のインストール&lt;/h4&gt;
pythonフォルダに移動し、cpp版をビルドした際に出来上がった&quot;protoc.exe&quot;にパスが通っている事を確認して
&lt;blockquote class=&quot;code&quot;&gt;
C:&amp;yen;temp&amp;yen;protobuf-2.0.0beta&amp;yen;python&amp;gt; python setup.py bdist_wininst&lt;br /&gt;
...&lt;br /&gt;
C:&amp;yen;temp&amp;yen;protobuf-2.0.0beta&amp;yen;python&amp;gt; cd dist&lt;br /&gt;
C:&amp;yen;temp&amp;yen;protobuf-2.0.0beta&amp;yen;python&amp;yen;dist&amp;gt; protobuf-2.0.0beta.win32.exe&lt;br /&gt;
&lt;/blockquote&gt;
&lt;em&gt;※Windowsじゃない人は&quot;bdist_wininst&quot;の代わりに&quot;bdist_rpm&quot;とか&quot;install&quot;とか...&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;テストコードによる検証&lt;/h4&gt;
まずデータ定義となるprotoファイルを作る。詳しい説明は省略するが知りたい人は&lt;a href=&quot;http://code.google.com/apis/protocolbuffers/docs/overview.html&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;ココ&lt;/a&gt;とか&lt;a href=&quot;http://journal.mycom.co.jp/articles/2008/07/18/protocolbuffer/001.html&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;ココ&lt;/a&gt;とか。今回は名前と年齢を格納出来るPersonクラスを扱う。&lt;br /&gt;
&lt;b&gt;person.proto&lt;/b&gt;&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&gt;
package protocol;&lt;br /&gt;
&lt;br /&gt;
message Person {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;required string name = 1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;required int32&amp;nbsp;&amp;nbsp;age&amp;nbsp;&amp;nbsp;= 2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;
このファイルを指定して、スタブクラスを生成する。&lt;br /&gt;
まずcpp版。
&lt;blockquote class=&quot;code&quot;&gt;
C:&amp;yen;temp&amp;yen;protobuf-2.0.0beta&amp;yen;tmp&amp;gt; protoc --cpp_out=. person.proto&lt;br /&gt;
&lt;/blockquote&gt;
これで&quot;person.pb.cc&quot;と&quot;person.pb.h&quot;が生成される。以下テストコード。&lt;br /&gt;
&lt;b&gt;test.cpp&lt;/b&gt;&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;iostream&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;lt;fstream&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;lt;person.pb.h&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Type&quot;&gt;void&lt;/span&gt;&amp;nbsp;save(&lt;span class=&quot;Type&quot;&gt;const&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;char&lt;/span&gt;* fn) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protocol::Person person;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;person.set_name(&lt;span class=&quot;Constant&quot;&gt;&amp;quot;mattn&amp;quot;&lt;/span&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;person.set_age(&lt;span class=&quot;Constant&quot;&gt;18&lt;/span&gt;);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;std::ofstream ofs(fn);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;person.SerializeToOstream(&amp;amp;ofs);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ofs.close();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Type&quot;&gt;void&lt;/span&gt;&amp;nbsp;load(&lt;span class=&quot;Type&quot;&gt;const&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;char&lt;/span&gt;* fn) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protocol::Person person;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;std::ifstream ifs(fn);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;person.ParseFromIstream(&amp;amp;ifs);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;std::cout &amp;lt;&amp;lt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;name:&amp;quot;&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt; person.name() &amp;lt;&amp;lt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;,age:&amp;quot;&lt;/span&gt;&amp;nbsp;&amp;lt;&amp;lt; person.age() &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Type&quot;&gt;int&lt;/span&gt;&amp;nbsp;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;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;(argc != &lt;span class=&quot;Constant&quot;&gt;2&lt;/span&gt;) &lt;span class=&quot;Statement&quot;&gt;return&lt;/span&gt;&amp;nbsp;-&lt;span class=&quot;Constant&quot;&gt;1&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;save(argv[&lt;span class=&quot;Constant&quot;&gt;1&lt;/span&gt;]);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;load(argv[&lt;span class=&quot;Constant&quot;&gt;1&lt;/span&gt;]);&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;blockquote class=&quot;code&quot;&gt;
C:&amp;yen;temp&amp;yen;protobuf-2.0.0beta&amp;yen;tmp&amp;gt; cl -I../src -I. /EHsc test.cpp person.pb.cc libprotoc.lib libprotobuf.lib&lt;br /&gt;
&lt;/blockquote&gt;
実行すると
&lt;blockquote class=&quot;code&quot;&gt;
C:&amp;yen;temp&amp;yen;protobuf-2.0.0beta&amp;yen;tmp&amp;gt; test person_cpp.txt&lt;br /&gt;
name:mattn,age:18&lt;br /&gt;
&lt;/blockquote&gt;
と表示される。そう...18歳です。ウソです。&lt;br /&gt;
生成される&quot;person_cpp.txt&quot;は以下の様なファイルとなる。&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&gt;
&lt;br /&gt;
&lt;span class=&quot;Constant&quot;&gt;^E&lt;/span&gt;mattn&lt;span class=&quot;Constant&quot;&gt;^P&lt;/span&gt;#&lt;br /&gt;
&lt;/blockquote&gt;
次にjava版。&quot;person.proto&quot;というファイル名からPersonクラスを生成する際にファイル名がバッティングしてしまうので&quot;persons.proto&quot;という別名にコピーしておく。&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&gt;
C:&amp;yen;temp&amp;yen;protobuf-2.0.0beta&amp;yen;tmp&amp;gt; protoc --java_out=. persons.proto&lt;br /&gt;
&lt;/blockquote&gt;
&quot;protocol/Persons.java&quot;が生成される。&lt;br /&gt;
テストコードは以下の通り。&lt;br /&gt;
&lt;b&gt;test.java&lt;/b&gt;&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&gt;
&lt;span class=&quot;PreProc&quot;&gt;import&lt;/span&gt;&amp;nbsp;protocol.Persons;&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;import&lt;/span&gt;&amp;nbsp;java.io.FileInputStream;&lt;br /&gt;
&lt;span class=&quot;PreProc&quot;&gt;import&lt;/span&gt;&amp;nbsp;java.io.FileOutputStream;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Type&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;class&lt;/span&gt;&amp;nbsp;test {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;void&lt;/span&gt;&amp;nbsp;main(String[]&amp;nbsp;args)&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;throws&lt;/span&gt;&amp;nbsp;Exception {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Persons.Person.Builder personBuilder = Persons.Person.newBuilder();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Persons.Person mattn = personBuilder.setName(&lt;span class=&quot;Constant&quot;&gt;&amp;quot;mattn&amp;quot;&lt;/span&gt;).setAge(&lt;span class=&quot;Constant&quot;&gt;18&lt;/span&gt;).build();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FileOutputStream fos = &lt;span class=&quot;Statement&quot;&gt;new&lt;/span&gt;&amp;nbsp;FileOutputStream(args[&lt;span class=&quot;Constant&quot;&gt;0&lt;/span&gt;]);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mattn.writeTo(fos);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fos.close();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FileInputStream fin = &lt;span class=&quot;Statement&quot;&gt;new&lt;/span&gt;&amp;nbsp;FileInputStream(args[&lt;span class=&quot;Constant&quot;&gt;0&lt;/span&gt;]);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mattn = Persons.Person.parseFrom(fin);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fin.close();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.printf(&lt;span class=&quot;Constant&quot;&gt;&amp;quot;name:%s,age:%d&amp;quot;&lt;/span&gt;, mattn.getName(), mattn.getAge());&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}&lt;br /&gt;
&lt;/blockquote&gt;
ビルドは以下の手順で行う。
&lt;blockquote class=&quot;code&quot;&gt;
C:&amp;yen;temp&amp;yen;protobuf-2.0.0beta&amp;yen;tmp&amp;gt; javac -classpath protobuf-java-2.0.0beta.jar; test.java&lt;br /&gt;
&lt;/blockquote&gt;
実行結果はcpp版と同様。&lt;br /&gt;
&lt;br /&gt;
最後にpython版。&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&gt;
C:&amp;yen;temp&amp;yen;protobuf-2.0.0beta&amp;yen;tmp&amp;gt; protoc --python_out=. person.proto&lt;br /&gt;
&lt;/blockquote&gt;
&quot;person_pb2.py&quot;が生成される。以下テストコード&lt;br /&gt;
&lt;b&gt;test.py&lt;/b&gt;&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&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;from&lt;/span&gt;&amp;nbsp;person_pb2 &lt;span class=&quot;PreProc&quot;&gt;import&lt;/span&gt;&amp;nbsp;Person&lt;br /&gt;
&lt;br /&gt;
fn = sys.argv[1]&lt;br /&gt;
&lt;br /&gt;
person = Person()&lt;br /&gt;
person.name = &lt;span class=&quot;Normal&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;mattn&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;
person.age = 18&lt;br /&gt;
open(fn, &lt;span class=&quot;Normal&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;&amp;quot;&lt;/span&gt;).write(person.SerializeToString())&lt;br /&gt;
&lt;br /&gt;
person = Person()&lt;br /&gt;
person.ParseFromString(open(fn).read())&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;print&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Normal&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;name:%s,age:%d&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;&amp;quot;&lt;/span&gt;&amp;nbsp;% (person.name, person.age)&lt;br /&gt;
&lt;/blockquote&gt;
実行結果はcpp版、java版と同様。&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;所感&lt;/h4&gt;
結局の所、&quot;protocol buffers&quot;とは、&quot;Serialize Format&quot;生成ツールおよびライブラリと、&quot;Serializable&quot;なクラス郡と言った所だろうか。&lt;br /&gt;
実際にはRPC等で転送してみないと良さは分からないかもしれないけど、XMLの様に自信がValidation可能な物ではなさそうなので転送の際には外側からデータのサイズ送信やチェックサム実施も必要になるかもしれない。&lt;br /&gt;
そういった意味では、「&lt;a href=&quot;http://journal.mycom.co.jp/articles/2008/07/18/protocolbuffer/001.html&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;【ハウツー】XMLはもう不要!? Google製シリアライズツール「Protocol Buffer」 (2) ダウンロードとインストール | エンタープライズ | マイコミジャーナル&lt;/a&gt;」の&quot;XMLはもう不要!?&quot;には少し疑問を感じる。&lt;br /&gt;
&lt;br /&gt;
時間があれば、ネットワーク上にシリアライズしたデータを転送してみたいと思う。&lt;br /&gt;
</description>
     <author>mattn.jp@gmail.com (mattn)</author>
   </item>
   <item>
     <title>blosxom 2.1.0がリリースされました</title>
     <pubDate>Wed, 23 Jul 2008 10:13:00 +0900</pubDate>
     <link>http://mattn.kaoriya.net/software/blosxom/20080723101252.htm</link>
     <category>/software/blosxom</category>
     <guid isPermaLink="true">http://mattn.kaoriya.net/software/blosxom/20080723101252</guid>
     <description>
少しずつですがバージョンアップしています。&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;
&lt;a href=&quot;http://blosxom.ookee.com/blog/news/blosxom-2.1.0-released.html&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;The Unofficial Blosxom User Group :: Blosxom 2.1.0 released&lt;/a&gt;&lt;br /&gt;
&lt;h4&gt;New features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Support for external config files and multi-instance installations via environment variables. (Inspired and loosely based on the Debian patches for Blosxom 2.0.2.)&lt;/li&gt;
&lt;li&gt;Support for multiple plugin directories using $plugin_path and @INC.&lt;/li&gt;
&lt;li&gt;Support for configuring the plugins to use in a config file.&lt;/li&gt;
&lt;li&gt;The default feed templates are now in RSS 2.0 format and prevent duplicated stories in feed readers or aggregators if posts are changed after publishing using a GUID element in each feed item.&lt;/li&gt;
&lt;li&gt;There&apos;s now an encoding setting which controls what charset your blog and feeds should be marked as.&lt;/li&gt;
&lt;/ul&gt;
&lt;cite&gt;http://blosxom.ookee.com/blog/news/blosxom-2.1.0-released.html&lt;/cite&gt;
&lt;/blockquote&gt;
バージョンアップの内容としては以下の通り。
&lt;ul&gt;
&lt;li&gt;環境変数によるconfigファイルの読み込み&lt;/li&gt;
&lt;li&gt;複数のプラグインディレクトリをサポート&lt;/li&gt;
&lt;li&gt;configファイルによるpluginの設定が可能に&lt;/li&gt;
&lt;li&gt;デフォルトのRSSフィードがRSS2.0に&lt;/li&gt;
&lt;li&gt;encodingの設定が可能に&lt;/li&gt;
&lt;/ul&gt;
また幾らかのバグフィックスも含んでいます。さっそくこのサイトでも導入しました。大きな修正点はありませんでしたがRSS1.0からRSS2.0に修正した事でフィードリーダに更新が配信されてしまったかと思います。&lt;br /&gt;
configファイルはmod_envを使って
&lt;blockquote class=&quot;code&quot;&gt;
&lt;span class=&quot;Identifier&quot;&gt;SetEnv&lt;/span&gt;&amp;nbsp;BLOSXOM_CONFIG_FILE /path/to/my/blosxom/config/file/bloxsom.conf&lt;br /&gt;
&lt;/blockquote&gt;
とすることでblosxom.cgiを全く弄らずに動かす事が出来る様になりました。&lt;br /&gt;
&lt;br /&gt;
しばらくは様子見です。&lt;br /&gt;
</description>
     <author>mattn.jp@gmail.com (mattn)</author>
   </item>
   <item>
     <title>意外と知られていないvimのtips(ゆの in vimscript)</title>
     <pubDate>Fri, 11 Jul 2008 20:30:00 +0900</pubDate>
     <link>http://mattn.kaoriya.net/software/vim/20080711202757.htm</link>
     <category>/software/vim</category>
     <guid isPermaLink="true">http://mattn.kaoriya.net/software/vim/20080711202757</guid>
     <description>
卑怯と言われようが構いません。&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&gt;
&lt;span class=&quot;Statement&quot;&gt;let&lt;/span&gt;&amp;nbsp;X&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;ひだまり&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;let&lt;/span&gt;&amp;nbsp;_&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;スケッチ&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;try&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;X&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;/ _ /&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;X&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;&amp;lt;&lt;/span&gt;&amp;nbsp;また見て下さいね&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;catch&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;/^Vim&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;\%(&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;(\a\+)&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;\)&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;\=:E488/&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;echo&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;eval&lt;/span&gt;(&lt;br /&gt;
&lt;span class=&quot;Special&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;\&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;substitute&lt;/span&gt;(&lt;br /&gt;
&lt;span class=&quot;Special&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;\&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;substitute&lt;/span&gt;(&lt;br /&gt;
&lt;span class=&quot;Special&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;\&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v:exception,&lt;br /&gt;
&lt;span class=&quot;Special&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;\&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;&apos;^.*E\(\d\+\).*:\s*\(\(.\) / \(.\).*\). &amp;lt;\(.*\)$&apos;&lt;/span&gt;,&lt;br /&gt;
&lt;span class=&quot;Special&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;\&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;&apos;\2&amp;quot;\3&amp;quot;.(\1-123).&amp;quot;\5&amp;quot;&apos;&lt;/span&gt;, &lt;span class=&quot;Constant&quot;&gt;&apos;&apos;&lt;/span&gt;), &lt;span class=&quot;Constant&quot;&gt;&apos;/&apos;&lt;/span&gt;, &lt;span class=&quot;Constant&quot;&gt;&apos;.&apos;&lt;/span&gt;, &lt;span class=&quot;Constant&quot;&gt;&apos;g&apos;&lt;/span&gt;))&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;endtry&lt;/span&gt;&lt;br /&gt;
&lt;/blockquote&gt;
</description>
     <author>mattn.jp@gmail.com (mattn)</author>
   </item>
   <item>
     <title>ゆの in Python</title>
     <pubDate>Tue, 08 Jul 2008 10:15:00 +0900</pubDate>
     <link>http://mattn.kaoriya.net/software/lang/python/20080708101311.htm</link>
     <category>/software/lang/python</category>
     <guid isPermaLink="true">http://mattn.kaoriya.net/software/lang/python/20080708101311</guid>
     <description>&lt;a href=&quot;http://subtech.g.hatena.ne.jp/cho45/20080708/1215450151&quot;&gt;http://subtech.g.hatena.ne.jp/cho45/20080708/1215450151&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://subtech.g.hatena.ne.jp/miyagawa/20080708/1215473551&quot;&gt;http://subtech.g.hatena.ne.jp/miyagawa/20080708/1215473551&lt;/a&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;span class=&quot;Comment&quot;&gt;# -*- coding: utf-8 -*-&lt;/span&gt;&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;X&lt;/span&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):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.s = &lt;span class=&quot;Normal&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;ひだまり&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;&amp;quot;&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;__lt__&lt;/span&gt;(self, v):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;print&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Normal&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;%s %s&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;&amp;quot;&lt;/span&gt;&amp;nbsp;% (self.s, v)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;return&lt;/span&gt;&amp;nbsp;self&lt;br /&gt;
&amp;nbsp;&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;__div__&lt;/span&gt;(self, v):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;isinstance(v, int):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.s += &lt;span class=&quot;Normal&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;スケッチ&lt;/span&gt;&lt;span class=&quot;Normal&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;else&lt;/span&gt;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.s += &lt;span class=&quot;Normal&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;365&lt;/span&gt;&lt;span class=&quot;Normal&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;return&lt;/span&gt;&amp;nbsp;self&lt;br /&gt;
&lt;br /&gt;
X = X()&lt;br /&gt;
_ = 1&lt;br /&gt;
&lt;br /&gt;
X / _ / X &amp;lt; &lt;span class=&quot;Normal&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;来週も見てくださいね!&lt;/span&gt;&lt;span class=&quot;Normal&quot;&gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;/blockquote&gt;
ごめんなさい。それが何かしらない...orz&lt;br /&gt;
</description>
     <author>mattn.jp@gmail.com (mattn)</author>
   </item>
   <item>
     <title>wassrpod.pl使ってgtktwitterでもwassrにポスト出来た </title>
     <pubDate>Mon, 07 Jul 2008 21:06:00 +0900</pubDate>
     <link>http://mattn.kaoriya.net/software/twitter/20080707205757.htm</link>
     <category>/software/twitter</category>
     <guid isPermaLink="true">http://mattn.kaoriya.net/software/twitter/20080707205757</guid>
     <description>
twitter APIはXMLにリクエスト投げてもBUSY画面でtext/htmlなヘッダを返す時があるので、gtktwitterでは応答ヘッダがapplication/xmlじゃ無いときは処理しない様にしてあったんですが、wassrpod.plはAPI応答にtext/htmlを返していたので少し手を入れさせて頂き、見事gtktwitterでwassrにポストする事が出来ました。あとプロフアイコンもPROXY経由で取れる様に修正しました。おかしかったら直して下さい(id:yappo)&lt;br /&gt;
&lt;blockquote&gt;
&lt;a href=&quot;http://mattn.kaoriya.net/images/wassrpod-gtktwitter.png&quot; rel=&quot;lightbox&quot; title=&quot;wassrpod経由でgtktwitter&quot;&gt;&lt;img src=&quot;http://mattn.kaoriya.net/images/wassrpod-gtktwitter-thumb.png&quot; alt=&quot;wassrpod経由でgtktwitter&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/blockquote&gt;
動かすには、環境変数「HTTP_PROXY」に「localhost:9277」を設定してgtktwitterを起動すればok。ただtwitterの設定が残ってるだろうから、UN*Xならば「~/.config/gtktwitter/config」を、Windowsならば「~/Application Data/gtktwitter/config」を修正して起動して下さい。同じアカウント名使ってるならばそのままでも動くかも。&lt;br /&gt;
&lt;br /&gt;
ま、gtkwassrもあるんですけどね...&lt;br /&gt;
&lt;br /&gt;
関連URL:&lt;a href=&quot;http://blog.yappo.jp/yappo/archives/000596.html&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;YappoLogs: WassrPodというMacからwassrを快適に使うツールを作ったよ &lt;/a&gt;
</description>
     <author>mattn.jp@gmail.com (mattn)</author>
   </item>
   <item>
     <title>Net::DBusで作業をあとにまわす</title>
     <pubDate>Fri, 27 Jun 2008 20:21:00 +0900</pubDate>
     <link>http://mattn.kaoriya.net/software/lang/perl/20080627201117.htm</link>
     <category>/software/lang/perl</category>
     <guid isPermaLink="true">http://mattn.kaoriya.net/software/lang/perl/20080627201117</guid>
     <description>
TheSchwartzも良いのですが、MySQLが必要だったりポーリングのタイムラグがあったりと、要件に合わない場合というのも出て来たりします。こんな時はどうするか、解決策の一つにメッセージバスがあります。&lt;br /&gt;
メッセージバスとして一般的に有名なのが、&lt;a href=&quot;http://www.freedesktop.org/wiki/Software/dbus&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;DBus&lt;/a&gt;です。Linux等では数多くのアプリケーションが採用しており、&lt;a href=&quot;http://www.gnome.org/&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;GNOME&lt;/a&gt;もBonoboからの移行を表明、KDE4でも採用される様です。ちなみに私が愛用している軽量デスクトップ&lt;a href=&quot;http://roscidus.com/desktop/&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;ROX&lt;/a&gt;は当初に採用しており、ちょっとしたpythonのコードでリッチなアプリケーション間通信が実現出来ています。他にも既に&lt;a href=&quot;http://www.freedesktop.org/wiki/Software/DbusProjects&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;色々なプロジェクト&lt;/a&gt;でDBusが使われています。&lt;br /&gt;
さて今日はNet::DBusを使い、TheSchwartzと似たような事が出来ないかをWindows上でやってみようかと思います。&lt;br /&gt;
まず、DBusのWindows実装であるwinDBusをインストールします。winDBusは&lt;a href=&quot;http://sourceforge.net/projects/windbus&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;こちら&lt;/a&gt;で配布されておりバイナリもダウンロード出来ます。&lt;br /&gt;
ここでまず、DBusの動作を確認します。winDBusを展開したディレクトリの中のbinフォルダに移動し以下の様にしてデーモンを起動します。
&lt;blockquote class=&quot;code&quot;&gt;
C:&amp;yen;winDBus&amp;yen;&amp;gt; dbus-daemon.exe --config-file=C:/winDBus/dbus/bin/session.conf
&lt;/blockquote&gt;
winDBusを&quot;C:&amp;yen;Programme&quot;に展開された場合には
&lt;blockquote class=&quot;code&quot;&gt;
C:&amp;yen;Programme&amp;yen;&amp;gt; dbus-daemon.exe --session
&lt;/blockquote&gt;
とするだけでも動作します。winDBusの場合、unixドメインソケットをサポートしていませんので、上記session.confに書かれている
&lt;blockquote class=&quot;code&quot;&gt;
&lt;span class=&quot;Identifier&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;listen&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;&amp;gt;&lt;/span&gt;tcp:host=localhost,port=12434&lt;span class=&quot;Identifier&quot;&gt;&amp;lt;/listen&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;/blockquote&gt;
の値を環境変数「DBUS_SESSION_BUS_ADDRESS」に設定します。
&lt;blockquote class=&quot;code&quot;&gt;
set DBUS_SESSION_BUS_ADDRESS=tcp:host=localhost,port=12434
&lt;/blockquote&gt;
その上でdbus-daemon.exeと同じ位置にあるtest_names.exeを実行し
&lt;blockquote class=&quot;code&quot;&gt;
Successfully acquired name &apos;org.freedesktop.DBus.Test&apos;&lt;br /&gt;
Successfully acquired name &apos;org.freedesktop.DBus.Test-2&apos;&lt;br /&gt;
Successfully acquired name &apos;org.freedesktop.DBus.Test_2&apos;&lt;br /&gt;
&lt;/blockquote&gt;
と表示されれば動作確認は終了です。&lt;br /&gt;
次にNet::DBusをインストールします。まずNet::DBusはビルドにpkg-configを使うので`pkg-config --cflags dbus-1`が扱えないVCではビルドに難があります。私の場合は&lt;a href=&quot;http://www.mingw.org/&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;MinGW&lt;/a&gt;を使用しました。&lt;br /&gt;
まず、winDBusに同梱されていなかったdbus-1.pcを作成します。winDBusをインストールしたディレクトリを指定して
&lt;blockquote class=&quot;code&quot;&gt;
prefix=C:/winDBus/dbus&lt;br /&gt;
exec_prefix=${prefix}&lt;br /&gt;
libdir=${exec_prefix}/lib&lt;br /&gt;
includedir=${prefix}/include&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;Name&lt;/span&gt;:&amp;nbsp;D-Bus&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;Description&lt;/span&gt;:&amp;nbsp;D-Bus Protocol Library&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;Version&lt;/span&gt;:&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;0.90&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;Libs&lt;/span&gt;:&amp;nbsp;-LC:/winDBus/dbus/lib -ldbus-&lt;span class=&quot;Constant&quot;&gt;1&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;Cflags&lt;/span&gt;:&amp;nbsp;-IC:/winDBus/dbus/include&lt;br /&gt;
&lt;/blockquote&gt;
という内容でdbus-1.pcを保存します。次に環境変数PKG_CONFIG_PATHにこのdbus-1.pcを保存したディレクトリを設定し、cpanからインストールします。おそらくこれでインストール出来るかと思いますが、出来なかった方はVCのコンパイラのパスを外し、MinGWのパスを設定して確認して見て下さい。&lt;br /&gt;
これでようやくperlからDBusを使える準備が揃いました。&lt;br /&gt;
さて、サーバのソース。DBusのセッションからバスを取得し、サービスをエクスポート、ワーカーの役目をするオブジェクトを作成します。ワーカーオブジェクトにはJobStartというメソッドを定義します。&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&gt;
&lt;span class=&quot;PreProc&quot;&gt;#!/usr/bin/perl&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use strict&lt;/span&gt;;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use warnings&lt;/span&gt;;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use &lt;/span&gt;threads;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use &lt;/span&gt;YAML;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use &lt;/span&gt;Net::DBus;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use &lt;/span&gt;Net::DBus::Service;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use &lt;/span&gt;Net::DBus::Reactor;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;package&lt;/span&gt;&lt;span class=&quot;Type&quot;&gt;&amp;nbsp;MyWorker;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use base&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;qw(&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;Net::DBus::Object&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;)&lt;/span&gt;;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use &lt;/span&gt;Net::DBus::Exporter &lt;span class=&quot;Constant&quot;&gt;qw(&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;net.kaoriya.mattn.DBusWorker&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;)&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;sub&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;&amp;nbsp;&lt;/span&gt;{&lt;br /&gt;
&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;$class&lt;/span&gt;&amp;nbsp;= &lt;span class=&quot;Statement&quot;&gt;shift&lt;/span&gt;;&lt;br /&gt;
&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;$service&lt;/span&gt;&amp;nbsp;= &lt;span class=&quot;Statement&quot;&gt;shift&lt;/span&gt;;&lt;br /&gt;
&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;$self&lt;/span&gt;&amp;nbsp;= &lt;span class=&quot;Identifier&quot;&gt;$class&lt;/span&gt;-&amp;gt;SUPER::new(&lt;span class=&quot;Identifier&quot;&gt;$service&lt;/span&gt;, &lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;/MyWorker&lt;/span&gt;&lt;span class=&quot;Constant&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;bless&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;$self&lt;/span&gt;, &lt;span class=&quot;Identifier&quot;&gt;$class&lt;/span&gt;;&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;&lt;span class=&quot;Identifier&quot;&gt;$self&lt;/span&gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
dbus_method(&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;JobStart&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;, [[&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;, &lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;, &lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;]], [[&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;, &lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;, &lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;int32&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;]]);&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;sub&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;JobStart&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;&amp;nbsp;&lt;/span&gt;{&lt;br /&gt;
&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;$self&lt;/span&gt;&amp;nbsp;= &lt;span class=&quot;Statement&quot;&gt;shift&lt;/span&gt;;&lt;br /&gt;
&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;$job&lt;/span&gt;&amp;nbsp;= &lt;span class=&quot;Statement&quot;&gt;shift&lt;/span&gt;;&lt;br /&gt;
&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;$thread&lt;/span&gt;&amp;nbsp;= threads-&amp;gt;&lt;span class=&quot;Statement&quot;&gt;new&lt;/span&gt;(&lt;span class=&quot;Statement&quot;&gt;sub&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;&amp;nbsp;&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;$job&lt;/span&gt;&amp;nbsp;= &lt;span class=&quot;Statement&quot;&gt;shift&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;printf&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;processing job%03d : %s&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;, threads-&amp;gt;tid, &lt;span class=&quot;Identifier&quot;&gt;$job&lt;/span&gt;-&amp;gt;{request};&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;sleep&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;10&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;printf&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;done job%03d&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;, threads-&amp;gt;tid;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}, &lt;span class=&quot;Identifier&quot;&gt;$job&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;{ &lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&amp;nbsp;=&amp;gt; &lt;span class=&quot;Identifier&quot;&gt;$thread&lt;/span&gt;-&amp;gt;tid };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;package&lt;/span&gt;&lt;span class=&quot;Type&quot;&gt;&amp;nbsp;main;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;my&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;$bus&lt;/span&gt;&amp;nbsp;= Net::DBus-&amp;gt;session();&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;my&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;$service&lt;/span&gt;&amp;nbsp;= &lt;span class=&quot;Identifier&quot;&gt;$bus&lt;/span&gt;-&amp;gt;export_service(&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;net.kaoriya.mattn.DBusWorker&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;my&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;$object&lt;/span&gt;&amp;nbsp;= MyWorker-&amp;gt;&lt;span class=&quot;Statement&quot;&gt;new&lt;/span&gt;(&lt;span class=&quot;Identifier&quot;&gt;$service&lt;/span&gt;);&lt;br /&gt;
Net::DBus::Reactor-&amp;gt;main-&amp;gt;run();&lt;br /&gt;
&lt;/blockquote&gt;
DBusは非同期通信も提供していますが、リクエストを連続で送った際サーバがビジー状態だとクライアントが側が応答を待ってロックします。&lt;br /&gt;
そこで上記ソースではスレッドを起こし、重たい処理をさせる様になっています。スレッド内では&quot;threads-&gt;tid&quot;で言わばジョブ番号の役割をするスレッドIDを使ってユニークな処理が出来るかと思います。&lt;br /&gt;
さらにクライアントのコード。
&lt;blockquote class=&quot;code&quot;&gt;
&lt;span class=&quot;Comment&quot;&gt;#/usr/bin/perl&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use strict&lt;/span&gt;;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use warnings&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use &lt;/span&gt;Net::DBus;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use &lt;/span&gt;Net::DBus::Reactor;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use &lt;/span&gt;Net::DBus::Callback;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use &lt;/span&gt;Net::DBus::Annotation &lt;span class=&quot;Constant&quot;&gt;qw(&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;:call&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;)&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;my&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;$request&lt;/span&gt;&amp;nbsp;= &lt;span class=&quot;Statement&quot;&gt;shift&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;@ARGV&lt;/span&gt;&amp;nbsp;|| &lt;span class=&quot;Constant&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;request at &lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&apos;&lt;/span&gt;.&lt;span class=&quot;Statement&quot;&gt;time&lt;/span&gt;();&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;my&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;$bus&lt;/span&gt;&amp;nbsp;= Net::DBus-&amp;gt;session();&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;my&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;$service&lt;/span&gt;&amp;nbsp;= &lt;span class=&quot;Identifier&quot;&gt;$bus&lt;/span&gt;-&amp;gt;get_service(&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;net.kaoriya.mattn.DBusWorker&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;my&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;$object&lt;/span&gt;&amp;nbsp;= &lt;span class=&quot;Identifier&quot;&gt;$service&lt;/span&gt;-&amp;gt;get_object(&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;/MyWorker&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;my&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;$res&lt;/span&gt;&amp;nbsp;= &lt;span class=&quot;Identifier&quot;&gt;$object&lt;/span&gt;-&amp;gt;JobStart({ &lt;span class=&quot;Constant&quot;&gt;request &lt;/span&gt;=&amp;gt; &lt;span class=&quot;Identifier&quot;&gt;$request&lt;/span&gt;&amp;nbsp;});&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;printf&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;job was accepted as job%03d&lt;/span&gt;&lt;span class=&quot;Special&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;$res&lt;/span&gt;-&amp;gt;{id};&lt;br /&gt;
&lt;/blockquote&gt;
DBusセッションからもらったMyWorkerオブジェクトのJobStartメソッドにリクエスト文字列を指定して送信します。&lt;br /&gt;
まずクライアントの実行結果は
&lt;blockquote class=&quot;code&quot;&gt;
C:&amp;yen;winDBus&amp;yen;test&amp;yen;&amp;gt; perl client.pl&lt;br /&gt;
job was accepted as job001&lt;br /&gt;
C:&amp;yen;winDBus&amp;yen;test&amp;yen;&amp;gt; perl client.pl&lt;br /&gt;
job was accepted as job002&lt;br /&gt;
C:&amp;yen;winDBus&amp;yen;test&amp;yen;&amp;gt; perl client.pl&lt;br /&gt;
job was accepted as job003&lt;br /&gt;
&lt;/blockquote&gt;
クライアントではjob001を実行した後、10秒待ってjob002、job003を投入しました。そしてサーバの実行結果
&lt;blockquote class=&quot;code&quot;&gt;
processing job001 : request at 1214560175&lt;br /&gt;
done job001&lt;br /&gt;
processing job002 : request at 1214560192&lt;br /&gt;
processing job003 : request at 1214560195&lt;br /&gt;
done job002&lt;br /&gt;
done job003&lt;br /&gt;
&lt;/blockquote&gt;
おぉ！非同期ですね！&lt;br /&gt;
DBusでは、引数の構成および戻り値の構成をdbus_methodにて指定でき、文字列(string)や数値(int32等)、配列(array)、タプル(tuple)、構造体(struct)を引き渡したり、戻り値として返したり出来ます。&lt;br /&gt;
さらに、Net::DBusに同梱されている&quot;example-client-async.pl&quot;の様に非同期送信結果を受け取り、完了イベントで結果を受け取るという事も出来ます。
&lt;blockquote class=&quot;code&quot;&gt;
&lt;span class=&quot;Comment&quot;&gt;#/usr/bin/perl&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use warnings&lt;/span&gt;;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use strict&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use &lt;/span&gt;Net::DBus;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use &lt;/span&gt;Net::DBus::Reactor;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use &lt;/span&gt;Net::DBus::Callback;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use &lt;/span&gt;Net::DBus::Annotation &lt;span class=&quot;Constant&quot;&gt;qw(&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;:call&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;)&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;my&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;$bus&lt;/span&gt;&amp;nbsp;= Net::DBus-&amp;gt;session();&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;my&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;$service&lt;/span&gt;&amp;nbsp;= &lt;span class=&quot;Identifier&quot;&gt;$bus&lt;/span&gt;-&amp;gt;get_service(&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;org.designfu.SampleService&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;my&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;$object&lt;/span&gt;&amp;nbsp;= &lt;span class=&quot;Identifier&quot;&gt;$service&lt;/span&gt;-&amp;gt;get_object(&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;/SomeObject&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;print&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;Doing async call&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;my&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;$reply&lt;/span&gt;&amp;nbsp;= &lt;span class=&quot;Identifier&quot;&gt;$object&lt;/span&gt;-&amp;gt;HelloWorld(dbus_call_async, &lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;Hello from example-client.pl!&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;my&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;$r&lt;/span&gt;&amp;nbsp;= Net::DBus::Reactor-&amp;gt;main;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;sub&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;all_done&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;&amp;nbsp;&lt;/span&gt;{&lt;br /&gt;
&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;$reply&lt;/span&gt;&amp;nbsp;= &lt;span class=&quot;Statement&quot;&gt;shift&lt;/span&gt;;&lt;br /&gt;
&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;$list&lt;/span&gt;&amp;nbsp;= &lt;span class=&quot;Identifier&quot;&gt;$reply&lt;/span&gt;-&amp;gt;get_result;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;print&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;, &lt;span class=&quot;Statement&quot;&gt;join&lt;/span&gt;(&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;, &lt;span class=&quot;Statement&quot;&gt;map&lt;/span&gt;&amp;nbsp;{ &lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&amp;nbsp;} @{&lt;span class=&quot;Identifier&quot;&gt;$list&lt;/span&gt;}), &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;Special&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;$r&lt;/span&gt;-&amp;gt;&lt;span class=&quot;Statement&quot;&gt;shutdown&lt;/span&gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;print&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;Setting notify&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&lt;span class=&quot;Identifier&quot;&gt;$reply&lt;/span&gt;-&amp;gt;set_notify(&lt;span class=&quot;Identifier&quot;&gt;\&amp;amp;all_done&lt;/span&gt;);&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;sub&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;tick&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;&amp;nbsp;&lt;/span&gt;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;print&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;Tick-tock&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;print&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;Adding timer&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&lt;span class=&quot;Identifier&quot;&gt;$r&lt;/span&gt;-&amp;gt;add_timeout(&lt;span class=&quot;Constant&quot;&gt;500&lt;/span&gt;, Net::DBus::Callback-&amp;gt;&lt;span class=&quot;Statement&quot;&gt;new&lt;/span&gt;(&lt;span class=&quot;Constant&quot;&gt;method &lt;/span&gt;=&amp;gt; &lt;span class=&quot;Identifier&quot;&gt;\&amp;amp;tick&lt;/span&gt;));&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;print&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;Entering main loop&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&lt;span class=&quot;Identifier&quot;&gt;$r&lt;/span&gt;-&amp;gt;run;&lt;br /&gt;
&lt;/blockquote&gt;
今回はWebで扱いやすい様に、非同期で結果を待機する処理ではなくサーバ側でスレッドを実行していますが、デスクトップクライアントを作る際にはdbus_call_asyncを使う事になるかと思います。&lt;br /&gt;
&lt;br /&gt;
TheSchwartzも面白いですが、DBusも面白いですね。&lt;br /&gt;
perlの他にも、C(GLib)はもちろんpythonやJava等でも実装されています(&lt;a href=&quot;http://www.freedesktop.org/wiki/IntroductionToDBus&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;参照&lt;/a&gt;)。&lt;br /&gt;
皆さんも試してみては如何でしょうか。&lt;br /&gt;
</description>
     <author>mattn.jp@gmail.com (mattn)</author>
   </item>
   <item>
     <title>意外と知られていないvimのtips(vimからperlを使ってYAMLを読み込む)</title>
     <pubDate>Thu, 26 Jun 2008 19:18:00 +0900</pubDate>
     <link>http://mattn.kaoriya.net/software/vim/20080626191403.htm</link>
     <category>/software/vim</category>
     <guid isPermaLink="true">http://mattn.kaoriya.net/software/vim/20080626191403</guid>
     <description>
vimで自前でYAML読み込むとか面倒くさすぎる。&lt;br /&gt;
こう言う時はif_pythonとかif_perlとかを使わせてもらう。運良くvimスクリプトはjsonと相性が良いのでYAMLを読み込み、JSONに変換してvimに戻してあげる。&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&gt;
&lt;span class=&quot;Statement&quot;&gt;function&lt;/span&gt;! LoadYAML&lt;span class=&quot;Statement&quot;&gt;(&lt;/span&gt;file&lt;span class=&quot;Statement&quot;&gt;)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;perl&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&amp;nbsp;EOF&lt;br /&gt;
use&amp;nbsp;YAML::Syck;&lt;br /&gt;
use&amp;nbsp;JSON::Syck&amp;nbsp;&lt;span class=&quot;Normal&quot;&gt;qw&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;(&lt;/span&gt;Dump&lt;span class=&quot;Statement&quot;&gt;)&lt;/span&gt;;&lt;br /&gt;
eval&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;VIM::&lt;span class=&quot;Normal&quot;&gt;DoCommand&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;let ret = &amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;.&lt;/span&gt;&amp;nbsp;Dump&lt;span class=&quot;Statement&quot;&gt;(&lt;/span&gt;LoadFile&lt;span class=&quot;Statement&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;.&lt;/span&gt;VIM::Eval&lt;span class=&quot;Statement&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&apos;a:file&apos;&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;))))&lt;/span&gt;;&lt;br /&gt;
};&lt;br /&gt;
VIM::&lt;span class=&quot;Normal&quot;&gt;DoCommand&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;let v:errmsg = substitute(&apos;$@&apos;, \&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;n\&amp;quot;, &apos;&apos;, &apos;g&apos;)&amp;quot;&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;$@;&lt;br /&gt;
EOF&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;!&lt;span class=&quot;Identifier&quot;&gt;exists&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&apos;ret&apos;&lt;/span&gt;&lt;span class=&quot;Statement&quot;&gt;)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;throw&lt;/span&gt;&amp;nbsp;v:errmsg&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&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;&lt;span class=&quot;Statement&quot;&gt;ret&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;endfunction&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;echo&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Normal&quot;&gt;LoadYAML&lt;/span&gt;(&lt;span class=&quot;Constant&quot;&gt;&amp;quot;config.yaml&amp;quot;&lt;/span&gt;)&lt;br /&gt;
&lt;/blockquote&gt;
戻り値はDictionary形式になります。&lt;br /&gt;
読み込めなかった場合はthrowしているのでvim7限定になりますがcatchしてやって下さい。&lt;br /&gt;
&lt;br /&gt;
さて、if_perlですがperl510で動かなくなってました。今日パッチを作成してvim-devに送ったのですが、如何せん自信がありません(Shibuya.xsでvimmerな皆様、どうか私にお力をお貸し下さい)。&lt;br /&gt;
パッチは
&lt;blockquote&gt;
&lt;a href=&quot;http://mattn.kaoriya.net/tmp/vim72-perl510-fix.diff&quot;&gt;vim72-perl510-fix.diff&lt;/a&gt;
&lt;/blockquote&gt;
にあります。不具合報告等あればご連絡下さい。&lt;br /&gt;
</description>
     <author>mattn.jp@gmail.com (mattn)</author>
   </item>
   <item>
     <title>SQLiteを使ってTheSchwart</title>
     <pubDate>Thu, 26 Jun 2008 10:25:00 +0900</pubDate>
     <link>http://mattn.kaoriya.net/software/lang/perl/20080626102319.htm</link>
     <category>/software/lang/perl</category>
     <guid isPermaLink="true">http://mattn.kaoriya.net/software/lang/perl/20080626102319</guid>
     <description>
最近TheSchwartが賑わってる様ですね。
&lt;blockquote class=&quot;quote&quot;&gt;
&lt;a href=&quot;http://labs.gmo.jp/blog/ku/2008/06/theschwartz.html&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;TheSchwartzで仕事をあとにまわす - bits and bytes&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;なければ勝手に作ってくれるのかなと思ってSYNOPSISのコードを実行してみたけどやっぱり自動でできたりはしなそうだったので調べたら&lt;a href=&quot;http://jshirley.vox.com/library/post/catalyst-and-theschwartz-reliable-jobqueue-in-a-great-framework.html&quot;&gt;Catalyst and TheSchwartz: Reliable JobQueue in a great framework - Vox&lt;/a&gt;に&lt;a href=&quot;http://search.cpan.org/src/BRADFITZ/TheSchwartz-1.04/doc/schema.sql&quot;&gt;schema.sql&lt;/a&gt;を使うといいと書いてありました。このスキーマをmysqlで実行すればTheSchwartzのキューを管理するためのテーブルが出来上がります。&lt;/p&gt;
&lt;cite&gt;http://labs.gmo.jp/blog/ku/2008/06/theschwartz.html&lt;/cite&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;
&lt;a href=&quot;http://twitter.com/ku/statuses/843135311&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;Twitter / ku: TheSchwartzおもしろかった sqliteで動...&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;TheSchwartzおもしろかった sqliteで動くようにしたいけどsqliteようのschemeかきかたわかんない&lt;/p&gt;
&lt;cite&gt;http://twitter.com/ku/statuses/843135311&lt;/cite&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
って事でSQLiteでも動く様に出来ないか調べてみました。&lt;br /&gt;
&lt;a href=&quot;http://search.cpan.org/src/BRADFITZ/TheSchwartz-1.04/doc/schema.sql&quot;&gt;schema.sql&lt;/a&gt;は、MySQL用のスキーマで
&lt;blockquote class=&quot;code&quot;&gt;
&lt;span class=&quot;Statement&quot;&gt;CREATE&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;TABLE&lt;/span&gt;&amp;nbsp;funcmap (&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;funcid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INT UNSIGNED PRIMARY KEY &lt;span class=&quot;Statement&quot;&gt;NOT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;NULL&lt;/span&gt;&amp;nbsp;AUTO_INCREMENT,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;funcname&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class=&quot;Type&quot;&gt;VARCHAR&lt;/span&gt;(&lt;span class=&quot;Constant&quot;&gt;255&lt;/span&gt;) &lt;span class=&quot;Statement&quot;&gt;NOT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;NULL&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;Special&quot;&gt;UNIQUE&lt;/span&gt;(funcname)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;CREATE&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;TABLE&lt;/span&gt;&amp;nbsp;job (&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jobid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BIGINT UNSIGNED PRIMARY KEY &lt;span class=&quot;Statement&quot;&gt;NOT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;NULL&lt;/span&gt;&amp;nbsp;AUTO_INCREMENT,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;funcid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INT UNSIGNED &lt;span class=&quot;Statement&quot;&gt;NOT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;NULL&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arg&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MEDIUMBLOB,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uniqkey&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class=&quot;Type&quot;&gt;VARCHAR&lt;/span&gt;(&lt;span class=&quot;Constant&quot;&gt;255&lt;/span&gt;) &lt;span class=&quot;Special&quot;&gt;NULL&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;insert_time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class=&quot;Type&quot;&gt;INTEGER&lt;/span&gt;&amp;nbsp;UNSIGNED,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;run_after&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class=&quot;Type&quot;&gt;INTEGER&lt;/span&gt;&amp;nbsp;UNSIGNED &lt;span class=&quot;Statement&quot;&gt;NOT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;NULL&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;grabbed_until&amp;nbsp;&amp;nbsp; &lt;span class=&quot;Type&quot;&gt;INTEGER&lt;/span&gt;&amp;nbsp;UNSIGNED &lt;span class=&quot;Statement&quot;&gt;NOT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;NULL&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;priority&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;SMALLINT&lt;/span&gt;&amp;nbsp;UNSIGNED,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;coalesce&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;VARCHAR&lt;/span&gt;(&lt;span class=&quot;Constant&quot;&gt;255&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;Special&quot;&gt;INDEX&lt;/span&gt;&amp;nbsp;(funcid, run_after),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;UNIQUE&lt;/span&gt;(funcid, uniqkey),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;INDEX&lt;/span&gt;&amp;nbsp;(funcid, coalesce)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;CREATE&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;TABLE&lt;/span&gt;&amp;nbsp;note (&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jobid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BIGINT UNSIGNED &lt;span class=&quot;Statement&quot;&gt;NOT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;NULL&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;notekey&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class=&quot;Type&quot;&gt;VARCHAR&lt;/span&gt;(&lt;span class=&quot;Constant&quot;&gt;255&lt;/span&gt;),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PRIMARY KEY (jobid, notekey),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MEDIUMBLOB&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;CREATE&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;TABLE&lt;/span&gt;&amp;nbsp;error (&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;error_time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;INTEGER&lt;/span&gt;&amp;nbsp;UNSIGNED &lt;span class=&quot;Statement&quot;&gt;NOT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;NULL&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jobid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BIGINT UNSIGNED &lt;span class=&quot;Statement&quot;&gt;NOT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;NULL&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;message&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class=&quot;Type&quot;&gt;VARCHAR&lt;/span&gt;(&lt;span class=&quot;Constant&quot;&gt;255&lt;/span&gt;) &lt;span class=&quot;Statement&quot;&gt;NOT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;NULL&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;funcid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INT UNSIGNED &lt;span class=&quot;Statement&quot;&gt;NOT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;NULL&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;DEFAULT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;0&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;Special&quot;&gt;INDEX&lt;/span&gt;&amp;nbsp;(funcid, error_time),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;INDEX&lt;/span&gt;&amp;nbsp;(error_time),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;INDEX&lt;/span&gt;&amp;nbsp;(jobid)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;CREATE&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;TABLE&lt;/span&gt;&amp;nbsp;exitstatus (&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jobid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BIGINT UNSIGNED PRIMARY KEY &lt;span class=&quot;Statement&quot;&gt;NOT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;NULL&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;funcid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INT UNSIGNED &lt;span class=&quot;Statement&quot;&gt;NOT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;NULL&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;DEFAULT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;0&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;status&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;SMALLINT&lt;/span&gt;&amp;nbsp;UNSIGNED,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;completion_time &lt;span class=&quot;Type&quot;&gt;INTEGER&lt;/span&gt;&amp;nbsp;UNSIGNED,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delete_after&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;INTEGER&lt;/span&gt;&amp;nbsp;UNSIGNED,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;INDEX&lt;/span&gt;&amp;nbsp;(funcid),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;INDEX&lt;/span&gt;&amp;nbsp;(delete_after)&lt;br /&gt;
);&lt;br /&gt;
&lt;/blockquote&gt;
というSQLなので、これをSQLite用に書き換えます。&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;
&lt;a href=&quot;http://cl.pocari.org/2006-02-12-1.html&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;cl.pocari.org - SQLite で auto-increment なフィールドを作成する方法&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;つまり，SQLite で auto-increment なフィールドを作りたければ，INTEGER PRIMARY KEY を指定してあげればいいらしい．&lt;/p&gt;
&lt;cite&gt;http://cl.pocari.org/2006-02-12-1.html&lt;/cite&gt;
&lt;/blockquote&gt;
こちらの記事でも書かれている通り、SQLiteではINTEGER PRIMARY KEYを指定すればok。&lt;br /&gt;
※ちなみにUNSIGNEDとかNOT NULLとか付けると動かないです。&lt;br /&gt;
&lt;br /&gt;
で書き換えたSQLは以下の通り&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&gt;
&lt;span class=&quot;Statement&quot;&gt;CREATE&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;TABLE&lt;/span&gt;&amp;nbsp;funcmap (&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;funcid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class=&quot;Type&quot;&gt;INTEGER&lt;/span&gt;&amp;nbsp;PRIMARY KEY,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;funcname&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class=&quot;Type&quot;&gt;VARCHAR&lt;/span&gt;(&lt;span class=&quot;Constant&quot;&gt;255&lt;/span&gt;) &lt;span class=&quot;Statement&quot;&gt;NOT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;NULL&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;Special&quot;&gt;UNIQUE&lt;/span&gt;(funcname)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;CREATE&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;TABLE&lt;/span&gt;&amp;nbsp;job (&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jobid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class=&quot;Type&quot;&gt;INTEGER&lt;/span&gt;&amp;nbsp;PRIMARY KEY,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;funcid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;INTEGER&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;NOT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;NULL&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arg&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MEDIUMBLOB,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uniqkey&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class=&quot;Type&quot;&gt;VARCHAR&lt;/span&gt;(&lt;span class=&quot;Constant&quot;&gt;255&lt;/span&gt;) &lt;span class=&quot;Special&quot;&gt;NULL&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;insert_time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class=&quot;Type&quot;&gt;INTEGER&lt;/span&gt;&amp;nbsp;UNSIGNED,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;run_after&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class=&quot;Type&quot;&gt;INTEGER&lt;/span&gt;&amp;nbsp;UNSIGNED &lt;span class=&quot;Statement&quot;&gt;NOT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;NULL&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;grabbed_until&amp;nbsp;&amp;nbsp; &lt;span class=&quot;Type&quot;&gt;INTEGER&lt;/span&gt;&amp;nbsp;UNSIGNED &lt;span class=&quot;Statement&quot;&gt;NOT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;NULL&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;priority&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;SMALLINT&lt;/span&gt;&amp;nbsp;UNSIGNED,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;coalesce&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;VARCHAR&lt;/span&gt;(&lt;span class=&quot;Constant&quot;&gt;255&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;Special&quot;&gt;UNIQUE&lt;/span&gt;(funcid, uniqkey)&lt;br /&gt;
);&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;CREATE&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;INDEX&lt;/span&gt;&amp;nbsp;job_idx_1 &lt;span class=&quot;Special&quot;&gt;ON&lt;/span&gt;&amp;nbsp;job (funcid, run_after);&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;CREATE&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;INDEX&lt;/span&gt;&amp;nbsp;job_idx_2 &lt;span class=&quot;Special&quot;&gt;ON&lt;/span&gt;&amp;nbsp;job (funcid, coalesce);&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;CREATE&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;TABLE&lt;/span&gt;&amp;nbsp;note (&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jobid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class=&quot;Type&quot;&gt;INTEGER&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;NOT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;NULL&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;notekey&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class=&quot;Type&quot;&gt;VARCHAR&lt;/span&gt;(&lt;span class=&quot;Constant&quot;&gt;255&lt;/span&gt;),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BLOB&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;CREATE&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;TABLE&lt;/span&gt;&amp;nbsp;error (&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;error_time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;INTEGER&lt;/span&gt;&amp;nbsp;UNSIGNED &lt;span class=&quot;Statement&quot;&gt;NOT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;NULL&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jobid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class=&quot;Type&quot;&gt;INTEGER&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;NOT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;NULL&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;message&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class=&quot;Type&quot;&gt;VARCHAR&lt;/span&gt;(&lt;span class=&quot;Constant&quot;&gt;255&lt;/span&gt;) &lt;span class=&quot;Statement&quot;&gt;NOT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;NULL&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;funcid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;INTEGER&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;NOT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;NULL&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;DEFAULT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;0&lt;/span&gt;&lt;br /&gt;
);&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;CREATE&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;INDEX&lt;/span&gt;&amp;nbsp;error_idx_1 &lt;span class=&quot;Special&quot;&gt;ON&lt;/span&gt;&amp;nbsp;error (funcid, error_time);&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;CREATE&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;INDEX&lt;/span&gt;&amp;nbsp;error_idx_2 &lt;span class=&quot;Special&quot;&gt;ON&lt;/span&gt;&amp;nbsp;error (error_time);&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;CREATE&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;INDEX&lt;/span&gt;&amp;nbsp;error_idx_3 &lt;span class=&quot;Special&quot;&gt;ON&lt;/span&gt;&amp;nbsp;error (jobid);&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;CREATE&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;TABLE&lt;/span&gt;&amp;nbsp;exitstatus (&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jobid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class=&quot;Type&quot;&gt;INTEGER&lt;/span&gt;&amp;nbsp;PRIMARY KEY,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;funcid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;INTEGER&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;NOT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;NULL&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;DEFAULT&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;0&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;status&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;SMALLINT&lt;/span&gt;&amp;nbsp;UNSIGNED,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;completion_time &lt;span class=&quot;Type&quot;&gt;INTEGER&lt;/span&gt;&amp;nbsp;UNSIGNED,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delete_after&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Type&quot;&gt;INTEGER&lt;/span&gt;&amp;nbsp;UNSIGNED&lt;br /&gt;
);&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;CREATE&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;INDEX&lt;/span&gt;&amp;nbsp;exitstatus_idx_1 &lt;span class=&quot;Special&quot;&gt;ON&lt;/span&gt;&amp;nbsp;exitstatus (funcid);&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;CREATE&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Special&quot;&gt;INDEX&lt;/span&gt;&amp;nbsp;exitstatus_idx_2 &lt;span class=&quot;Special&quot;&gt;ON&lt;/span&gt;&amp;nbsp;exitstatus (delete_after);&lt;br /&gt;
&lt;/blockquote&gt;
あとはコレを
&lt;blockquote class=&quot;code&quot;&gt;
# sqlite3 the_schwartz &amp;lt; theschwartz_schema.sql
&lt;/blockquote&gt;
としてDBファイルを作る。&lt;br /&gt;
さてサーバのコードはDSNを&quot;dbi:SQLite:the_schwartz&quot;にするだけ。&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&gt;
&lt;span class=&quot;PreProc&quot;&gt;#!/usr/bin/env perl&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;package&lt;/span&gt;&lt;span class=&quot;Type&quot;&gt;&amp;nbsp;MyWorker;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use strict&lt;/span&gt;;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use utf8&lt;/span&gt;;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use warnings&lt;/span&gt;;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use base&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;qw(&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;nbsp;TheSchwartz::Worker &lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;)&lt;/span&gt;;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use &lt;/span&gt;Data::Dumper;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;binmode&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;STDERR&lt;/span&gt;, &lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;:encoding(cp932)&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;$^O&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;eq&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;MSWin32&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;sub&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;work&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;&amp;nbsp;&lt;/span&gt;{&lt;br /&gt;
&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;$class&lt;/span&gt;, &lt;span class=&quot;Identifier&quot;&gt;$job&lt;/span&gt;) = &lt;span class=&quot;Identifier&quot;&gt;@_&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Statement&quot;&gt;warn&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;お仕事ですよ！ @{[ Dumper(&lt;/span&gt;&lt;span class=&quot;Identifier&quot;&gt;$job&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;-&amp;gt;arg) ]}&lt;/span&gt;&lt;span class=&quot;Special&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;$job&lt;/span&gt;-&amp;gt;completed();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;package&lt;/span&gt;&lt;span class=&quot;Type&quot;&gt;&amp;nbsp;main;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use strict&lt;/span&gt;;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use warnings&lt;/span&gt;;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use &lt;/span&gt;TheSchwartz;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;my&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;$client&lt;/span&gt;&amp;nbsp;= TheSchwartz-&amp;gt;&lt;span class=&quot;Statement&quot;&gt;new&lt;/span&gt;(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;databases &lt;/span&gt;=&amp;gt; [ +{ &lt;span class=&quot;Constant&quot;&gt;dsn &lt;/span&gt;=&amp;gt; &lt;span class=&quot;Constant&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;dbi:SQLite:the_schwartz&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&apos;&lt;/span&gt;&amp;nbsp;} ]&lt;br /&gt;
);&lt;br /&gt;
&lt;span class=&quot;Identifier&quot;&gt;$client&lt;/span&gt;-&amp;gt;can_do(&lt;span class=&quot;Constant&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;MyWorker&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&apos;&lt;/span&gt;);&lt;br /&gt;
&lt;span class=&quot;Identifier&quot;&gt;$client&lt;/span&gt;-&amp;gt;work();&lt;br /&gt;
&lt;/blockquote&gt;
さらにクライアントのコード&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&gt;
&lt;span class=&quot;PreProc&quot;&gt;#!/usr/bin/env perl&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use strict&lt;/span&gt;;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use warnings&lt;/span&gt;;&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;use &lt;/span&gt;TheSchwartz;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Statement&quot;&gt;my&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;Identifier&quot;&gt;$client&lt;/span&gt;&amp;nbsp;= TheSchwartz-&amp;gt;&lt;span class=&quot;Statement&quot;&gt;new&lt;/span&gt;(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;Constant&quot;&gt;databases &lt;/span&gt;=&amp;gt; [ +{ &lt;span class=&quot;Constant&quot;&gt;dsn &lt;/span&gt;=&amp;gt; &lt;span class=&quot;Constant&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;dbi:SQLite:the_schwartz&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&apos;&lt;/span&gt;&amp;nbsp;} ]&lt;br /&gt;
);&lt;br /&gt;
&lt;span class=&quot;Identifier&quot;&gt;$client&lt;/span&gt;-&amp;gt;insert(&lt;span class=&quot;Constant&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;MyWorker&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&apos;&lt;/span&gt;&amp;nbsp;=&amp;gt; +{ &lt;span class=&quot;Constant&quot;&gt;hoge &lt;/span&gt;=&amp;gt; &lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;fuga&lt;/span&gt;&lt;span class=&quot;Constant&quot;&gt;&amp;quot;&lt;/span&gt;&amp;nbsp;});&lt;br /&gt;
&lt;/blockquote&gt;
実行すると&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&gt;
お仕事ですよ！ $VAR1 = {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&apos;hoge&apos; =&amp;gt; &apos;fuga&apos;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;
&lt;/blockquote&gt;
という風にサーバ側で表示されます。
ちなみに、DBD::SQLiteのバグで&lt;br /&gt;
&lt;blockquote class=&quot;code&quot;&gt;
closing dbh with active statement handles at .../Data/ObjectDriver/Driver/DBI.pm line 566.&lt;br /&gt;
&lt;/blockquote&gt;
という表示が出る様ならば&lt;a href=&quot;http://rt.cpan.org/Public/Bug/Display.html?id=17603&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;ココ&lt;/a&gt;にある&quot;issue-17603.tar.gz&quot;のパッチを当てるといいです。どうやらこのバグ、デグレっぽいですね。&lt;br /&gt;
&lt;br /&gt;
ま、結局SQLiteでやっちゃったら同一マシンだし負荷分散にはならない(UIロックを避けるという意味では有用)んですけどね。&lt;br /&gt;
</description>
     <author>mattn.jp@gmail.com (mattn)</author>
   </item>
   <item>
     <title>BXR(blosxom-xmlrpc)とTomblooでreblosxom</title>
     <pubDate>Tue, 24 Jun 2008 22:55:00 +0900</pubDate>
     <link>http://mattn.kaoriya.net/software/firefox/tombloo/20080624224534.htm</link>
     <category>/software/firefox/tombloo</category>
     <guid isPermaLink="true">http://mattn.kaoriya.net/software/firefox/tombloo/20080624224534</guid>
     <description>
ようやくblosxomで動く用になりました。&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;
&lt;a href=&quot;http://ido.nu/kuma/2008/06/07/werwer/&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;tomblooハックス - share on WordPressにポストするためのMetaWeblog API &amp;laquo; ku&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;アップデート 2008.6.24&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;mattnさんにいただいたBig Sky :: tomblooハックス90_MetaWeblog.jsのパスワードをパスワードマネージャに保存するパッチを文字化けしないようにしてtombloo - Google Codeにコミットしました。ページのView raw fileのところからダウンロードしてください。&lt;/p&gt;
&lt;cite&gt;http://ido.nu/kuma/2008/06/07/werwer/&lt;/cite&gt;
&lt;/blockquote&gt;
google codeのtomblooから90_MetaWeblog.jsを取得し、&quot;extensions/tombloo@brasil.to/chrome/content/library/&quot;に入れると動きます。詳しい説明はkuさんのページを確認して下さい。&lt;br /&gt;
kuさんのスクリプトから、若干手を入れさせて頂いていてXMLRPCのエントリポイントである&quot;extensions.tombloo.posters.MetaWeblog.endpoint&quot;の他に&quot;extensions.tombloo.posters.MetaWeblog.mediapath&quot;という設定が出来る様になっています。&lt;br /&gt;
ブログツールの中には画像をアップロードするパスが設定出来る物もあり、環境に合わせて
&lt;blockquote&gt;
&lt;a href=&quot;http://mattn.kaoriya.net/images/tombloo-metaweblog-mediapath.png&quot; rel=&quot;lightbox&quot; title=&quot;mediapathの設定&quot;&gt;&lt;img src=&quot;http://mattn.kaoriya.net/images/tombloo-metaweblog-mediapath-thumb.png&quot; alt=&quot;mediapathの設定&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/blockquote&gt;
の様に設定します。これで90_MetaWeblog.jsが使えるブログツールが増えたかと思います。恐らくMTでもendpointを
&lt;blockquote class=&quot;code&quot;&gt;
http://www.example.com/cgi-bin/mt/mt-xmlrpc.cgi
&lt;/blockquote&gt;
の様に設定すれば動きます。確認してませんが。&lt;br /&gt;
今回blosxomでは&quot;&lt;a href=&quot;http://sourceforge.net/projects/bxr/&quot; class=&quot;external&quot; target=&quot;_blank&quot;&gt;SourceForge.net: BXR: Blosxom XML-RPC Interface&lt;/a&gt;&quot;を使い、特定のカテゴリ(90_MetaWeblog.jsは「reblog」というカテゴリ)のみ
&lt;ul&gt;
&lt;li&gt;インデックスやRSSから隠す&lt;/li&gt;
&lt;li&gt;dynamic_cacheしない&lt;/li&gt;
&lt;li&gt;アクセスランキングに載せない&lt;/li&gt;
&lt;/ul&gt;
処理を入れ、reblogサイトっぽく動く様になりました。名づけてreblosxomとします！&lt;br /&gt;
&lt;a href=&quot;http://mattn.kaoriya.net/software/blosxom/20071030115907.htm&quot;&gt;blosxom-xmlrpc.cgiを色々なブログツールに対応させる為のパッチ&lt;/a&gt;を当てれば、日本語周りや動的なカテゴリ変更などにも対応出来るblosxom-xmlrpc.cgiが出来上がります。オリジナルのBXRで上手く行かない人は試してみて下さい。&lt;br /&gt;
実際に以下の様にして
&lt;blockquote&gt;
&lt;a href=&quot;http://mattn.kaoriya.net/images/tombloo-metaweblog-post.png&quot; rel=&quot;lightbox&quot; title=&quot;reblosxomでポスト&quot;&gt;&lt;img src=&quot;http://mattn.kaoriya.net/images/tombloo-metaweblog-post-thumb.png&quot; alt=&quot;reblosxomでポスト&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/blockquote&gt;
ポストした結果が「&lt;a href=&quot;http://mattn.kaoriya.net/reblog/&quot;&gt;reblogカテゴリ&lt;/a&gt;」となります。&lt;br /&gt;
自分の写真しかreblogしてないので、全くreblogじゃないんですが家族や友人の写真からreblogなんて事ならokですかね...&lt;br /&gt;
わずか3クリック程でreblog出来てしまうtombloo &amp;amp; 90_MetaWeblog.js すばらしいです。&lt;br /&gt;
&lt;br /&gt;
今回blosxomプラグイン等に行った修正は後日公開したいと思います。&lt;br /&gt;
&lt;br /&gt;
ku++ brazil++ tombloo++ blosxom++
</description>
     <author>mattn.jp@gmail.com (mattn)</author>
   </item>
  </channel>
</rss>
