<?xml version="1.0" encoding="utf-8" ?>
<rdf:RDF
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
 >

  <channel rdf:about="http://sourceforge.jp/projects/pyhabu/wiki/!feeds/list">
    <title>habu Wiki</title>
    <link>http://sourceforge.jp/projects/pyhabu/wiki/!feeds/list</link>
    <description>
      SourceForge.jp Wiki pages for habu project.    </description>
        <dc:date>2007-12-13T19:29:05+09:00</dc:date>
        <items>
      <rdf:Seq>
                <rdf:li rdf:resource="http://sourceforge.jp/projects/pyhabu/wiki/FrontPage" />
                <rdf:li rdf:resource="http://sourceforge.jp/projects/pyhabu/wiki/MediaArticle" />
                <rdf:li rdf:resource="http://sourceforge.jp/projects/pyhabu/wiki/NextRelease" />
                <rdf:li rdf:resource="http://sourceforge.jp/projects/pyhabu/wiki/PluginList" />
                <rdf:li rdf:resource="http://sourceforge.jp/projects/pyhabu/wiki/ConfigFormat" />
                <rdf:li rdf:resource="http://sourceforge.jp/projects/pyhabu/wiki/SideBar" />
                <rdf:li rdf:resource="http://sourceforge.jp/projects/pyhabu/wiki/CommandUsage" />
                <rdf:li rdf:resource="http://sourceforge.jp/projects/pyhabu/wiki/CronSetting" />
                <rdf:li rdf:resource="http://sourceforge.jp/projects/pyhabu/wiki/PluginDev" />
                <rdf:li rdf:resource="http://sourceforge.jp/projects/pyhabu/wiki/FAQ" />
              </rdf:Seq>
    </items>
  </channel>

      <item rdf:about="http://sourceforge.jp/projects/pyhabu/wiki/FrontPage">
    <title>FrontPage</title>
    <link>http://sourceforge.jp/projects/pyhabu/wiki/FrontPage</link>
    <dc:identifier>FrontPage</dc:identifier>
    <dc:date>2007-12-13T19:29:05+09:00</dc:date>
        <description>
      <![CDATA[= habu - ハブ =

[[PageOutline(start=2)]]

== はじめに ==

habuは、プラグインを組み合わせることでRSSを加工して再配信するためのソフトウェアです。簡単に言っちゃえば，[http://plagger.org/trac Plagger]もどきです。

habuは沖縄の毒蛇の「ハブ」です。沖縄が好きだという以外に、名前の由来にあまり意味]]>
    </description>
    <content:encoded>
      <![CDATA[<h1 id="h1-habu.20-.20.E3.83.8F.E3.83.96">habu - ハブ</h1><div class="pageoutline"><div class="pageoutline-title"><div class="action"><button type="button" onClick="javascript:togglePageOutline(this)"><img src="//static.sourceforge.jp/wiki/images/icons/roll-up.gif" border="0"></button></div>Outline</div><ol><li><a href="#h2-.E3.81.AF.E3.81.98.E3.82.81.E3.81.AB">はじめに</a>
</li><li><a href="#h2-.E5.BF.85.E8.A6.81.E6.9D.A1.E4.BB.B6">必要条件</a>
</li><li><a href="#h2-.E3.82.A4.E3.83.B3.E3.82.B9.E3.83.88.E3.83.BC.E3.83.AB">インストール</a>
</li><li><a href="#h2-subversion.E3.81.8B.E3.82.89.E3.81.AE.E3.82.A4.E3.83.B3.E3.82.B9.E3.83.88.E3.83.BC.E3.83.AB">subversionからのインストール</a>
</li><li><a href="#h2-.E3.82.AF.E3.82.A4.E3.83.83.E3.82.AF.E3.82.B9.E3.82.BF.E3.83.BC.E3.83.88">クイックスタート</a>
</li><li><a href="#h2-.E9.96.A2.E9.80.A3.E3.82.B5.E3.82.A4.E3.83.88">関連サイト</a>
</li><li><a href="#h2-.E7.A7.81.E3.81.AF.E8.AA.B0.3F">私は誰?</a>
</li></ol></div>
<h2 id="h2-.E3.81.AF.E3.81.98.E3.82.81.E3.81.AB">はじめに</h2><p>habuは、プラグインを組み合わせることでRSSを加工して再配信するためのソフトウェアです。簡単に言っちゃえば，<a href="http://plagger.org/trac" class="external" rel="nofollow">Plagger</a>もどきです。
</p><p>habuは沖縄の毒蛇の「ハブ」です。沖縄が好きだという以外に、名前の由来にあまり意味はありません。
</p><h3 id="h3-.E8.A8.98.E4.BA.8B.E3.81.AA.E3.81.A9">記事など</h3><p>* <a href="http://journal.mycom.co.jp/articles/2007/08/29/Python_habu/" class="external" rel="nofollow">「habu」 - Python版PlaggerでRSSを加工する</a>
</p><p>* <a href="http://sourceforge.jp/projects/pyhabu/wiki/MediaArticle/attach/habu-pub.pdf">Python Unconference 01 ライトニングトーク発表資料</a> (2007/12/12)</p>
<h2 id="h2-.E5.BF.85.E8.A6.81.E6.9D.A1.E4.BB.B6">必要条件</h2><ul><li><a href="http://python.org/" class="external" rel="nofollow">Python</a> 2.4かそれ以降
</li><li><a href="http://www.feedparser.org/" class="external" rel="nofollow">Universal Feed Parser</a>
</li><li><a href="http://www.pyyaml.org/wiki/PyYAML" class="external" rel="nofollow">PyYAML</a>
</li><li><a href="http://twistedmatrix.com/" class="external" rel="nofollow">Twisted</a>
</li><li><a href="http://sqlobject.org/" class="external" rel="nofollow">SQLObject</a>
</li><li>pysqlite (データベースを使用して、Python2.4の場合)
</li></ul><p><strong><em>使用するプラグインによっては追加のモジュールが必用です。</em></strong>
</p><h2 id="h2-.E3.82.A4.E3.83.B3.E3.82.B9.E3.83.88.E3.83.BC.E3.83.AB">インストール</h2><p><a href="http://sourceforge.jp/projects/pyhabu/files/">リリースファイル</a>から最新のパッケージをダウンロード後，
</p><pre>
 $ tar zxvf habu-バージョン番号.tgz
</pre><p>を実行して展開します。実行は展開されたディレクトリで行ないます。
</p><h2 id="h2-subversion.E3.81.8B.E3.82.89.E3.81.AE.E3.82.A4.E3.83.B3.E3.82.B9.E3.83.88.E3.83.BC.E3.83.AB">subversionからのインストール</h2><p><strong> パッケージはバグが多いのでsubversionから使うのがよろしいかと・・・ </strong>
</p><pre>
 $ svn checkout http://svn.sourceforge.jp/svnroot/pyhabu/trunk habu
</pre><p>を実行します。グラフィカルなSubversionクライアントはリポジトリのURLを指定すれば大丈夫でしょう。
</p><p><strong><em>現在はまだ開発版のため，setupスクリプトは用意していません。</em></strong>
</p><p><strong> wikiのドキュメントはほとんどがバージョン0.3用です。0.2では使用できない機能があります。 </strong>
</p><h2 id="h2-.E3.82.AF.E3.82.A4.E3.83.83.E3.82.AF.E3.82.B9.E3.82.BF.E3.83.BC.E3.83.88">クイックスタート</h2><p>実行するには，tarボールを展開して作成されたhabuディレクトリに移動して，
</p><pre>
$ python runhabu.py
</pre><p>を実行します。runhabu.pyは
</p><pre>
python runhabu.py [設定ファイル]
</pre><p>という書式です。設定ファイルの指定を省略するとカレントディレクトリのhabu.cfgが使用されます。コマンドラインの詳細は、「<a href="http://sourceforge.jp/projects/pyhabu/wiki/CommandUsage">コマンド使用方法</a>」を参照してください。
配布ファイルに含まれているhabu.cfgは次のようになっています。
</p><pre>global:
  timezone: Asia/Tokyo
  log: stdout

pipeline:
  rss_fetcher:
    - module: subscription.config
      config:
        feed:
          - http://www.liris.org/blog/RSS
          - http://dev.ariel-networks.com/Members/blog_update/RSS
    - module: filter.join
    - module: filter.sort
      config:
        reverse: True
    - module: publisher.rssfeeder
      config:
        file: &quot;out.rss&quot;

</pre><p>設定ファイルはyaml形式です。設定ファイルの詳細は「<a href="http://sourceforge.jp/projects/pyhabu/wiki/ConfigFormat">設定ファイル</a>」を参照してください。python runhabu.pyを実行すると設定ファイルに指定された二つのRSSを取得して，カレントディレクトリにout.rssと言うRSSファイルを出力します。moduleでフィルタすることで，RSSをさらに加工することができます。フィルタについては「<a href="http://sourceforge.jp/projects/pyhabu/wiki/PluginList">プラグイン一覧</a>」を参照してください。
</p><p>プラグインの作成方法は「<a href="http://sourceforge.jp/projects/pyhabu/wiki/PluginDev">プラグインの作成方法</a>」を参照してください。
</p><p>また，設定ファイルにschedulerを指定することで，プラグインをデーモンとして起動できます。詳細は，「<a href="http://sourceforge.jp/projects/pyhabu/wiki/ConfigFormat">設定ファイル</a>」と「<a href="http://sourceforge.jp/projects/pyhabu/wiki/CronSetting">デーモンとして動作</a>」を参照してください。
</p><h2 id="h2-.E9.96.A2.E9.80.A3.E3.82.B5.E3.82.A4.E3.83.88">関連サイト</h2><p><a href="http://code.google.com/p/pyhabu-plugins/" class="external" rel="nofollow">pyhabu-plugins</a> 野良プラグインを集めたサイト。
</p><h2 id="h2-.E7.A7.81.E3.81.AF.E8.AA.B0.3F">私は誰?</h2><p>liris: <a href="http://www.liris.org/blog/" class="external" rel="nofollow">Days of Liris</a>
</p>]]>
    </content:encoded>
      </item>
        <item rdf:about="http://sourceforge.jp/projects/pyhabu/wiki/MediaArticle">
    <title>MediaArticle</title>
    <link>http://sourceforge.jp/projects/pyhabu/wiki/MediaArticle</link>
    <dc:identifier>MediaArticle</dc:identifier>
    <dc:date>2007-12-13T13:02:15+09:00</dc:date>
        <description>
      <![CDATA[=== 記事など ===

* [http://journal.mycom.co.jp/articles/2007/08/29/Python_habu/ 「habu」 - Python版PlaggerでRSSを加工する]

* [http://sourceforge.jp/projects/pyhabu/wiki/MediaArticle/attach/habu-pub.pdf Pytho]]>
    </description>
    <content:encoded>
      <![CDATA[<h3 id="h3-.E8.A8.98.E4.BA.8B.E3.81.AA.E3.81.A9">記事など</h3><p>* <a href="http://journal.mycom.co.jp/articles/2007/08/29/Python_habu/" class="external" rel="nofollow">「habu」 - Python版PlaggerでRSSを加工する</a>
</p><p>* <a href="http://sourceforge.jp/projects/pyhabu/wiki/MediaArticle/attach/habu-pub.pdf">Python Unconference 01 ライトニングトーク発表資料</a> (2007/12/12)</p>]]>
    </content:encoded>
      </item>
        <item rdf:about="http://sourceforge.jp/projects/pyhabu/wiki/NextRelease">
    <title>NextRelease</title>
    <link>http://sourceforge.jp/projects/pyhabu/wiki/NextRelease</link>
    <dc:identifier>NextRelease</dc:identifier>
    <dc:date>2007-10-10T12:20:51+09:00</dc:date>
        <description>
      <![CDATA[= 次期バージョン機能リスト =

次期バージョンは0.4です。

&#039;&#039;&#039; 予定日: 未定 &#039;&#039;&#039;

== Test Code ==

 * subscription filterのテストコード
 * coreのテストコード

== server ==

 * ~~ 管理コンソール manhole ~~

=]]>
    </description>
    <content:encoded>
      <![CDATA[<h1 id="h1-.E6.AC.A1.E6.9C.9F.E3.83.90.E3.83.BC.E3.82.B8.E3.83.A7.E3.83.B3.E6.A9.9F.E8.83.BD.E3.83.AA.E3.82.B9.E3.83.88">次期バージョン機能リスト</h1><p>次期バージョンは0.4です。
</p><p><strong> 予定日: 未定 </strong>
</p><h2 id="h2-Test.20Code">Test Code</h2><ul><li>subscription filterのテストコード
</li><li>coreのテストコード
</li></ul><h2 id="h2-server">server</h2><ul><li><del> 管理コンソール manhole </del>
</li></ul><h3 id="h3-web">web</h3><ul><li>planetでのデータフィルタリング
</li><li>planetでopmlの出力
</li></ul><h3 id="h3-.E3.81.9D.E3.81.AE.E4.BB.96">その他</h3><ul><li>気が向けばimap server
</li><li>さらに気が向けばIRC serverとか
</li></ul><h2 id="h2-.E3.83.97.E3.83.A9.E3.82.B0.E3.82.A4.E3.83.B3">プラグイン</h2><ul><li>subscription 
<ul><li> Google関係
<ul><li>Calendar
</li><li>Search
</li></ul></li></ul></li><li>filter
<ul><li>?
</li></ul></li><li>publisher
<ul><li>Google Calendar
</li></ul></li><li>「はてな」に何かしたいけどよくわかんない
</li></ul><h2 id="h2-.E3.83.86.E3.83.B3.E3.83.97.E3.83.AC.E3.83.BC.E3.83.88.E9.96.A2.E4.BF.82">テンプレート関係</h2><p>* kidまたはgenshi、zptを使いたい
* 現状の文字列生成でもよい？
</p><h2 id="h2-.E3.82.B3.E3.83.9E.E3.83.B3.E3.83.89">コマンド</h2><p>コマンドラインの機能を増やす。
</p><ul><li>プラグインの説明表示
</li><li>プラグイン一覧（出せるのか？）
</li></ul>]]>
    </content:encoded>
      </item>
        <item rdf:about="http://sourceforge.jp/projects/pyhabu/wiki/PluginList">
    <title>PluginList</title>
    <link>http://sourceforge.jp/projects/pyhabu/wiki/PluginList</link>
    <dc:identifier>PluginList</dc:identifier>
    <dc:date>2007-09-25T16:12:40+09:00</dc:date>
        <description>
      <![CDATA[= プラグイン一覧 =

[[PageOutline(start=2)]]

== subcription ==

RSSの取得，生成を行なうプラグインです。基本的にはすべてのpipelineはsubscription内のモジュールから開始されます。

=== config ===

RSSファイルを取得します。

==== 設定項目 ====
 * feed: リストで]]>
    </description>
    <content:encoded>
      <![CDATA[<h1 id="h1-.E3.83.97.E3.83.A9.E3.82.B0.E3.82.A4.E3.83.B3.E4.B8.80.E8.A6.A7">プラグイン一覧</h1><div class="pageoutline"><div class="pageoutline-title"><div class="action"><button type="button" onClick="javascript:togglePageOutline(this)"><img src="//static.sourceforge.jp/wiki/images/icons/roll-up.gif" border="0"></button></div>Outline</div><ol><li><a href="#h2-subcription">subcription</a>
<ol><li><a href="#h3-config">config</a>
<ol><li><a href="#h4-.E8.A8.AD.E5.AE.9A.E9.A0.85.E7.9B.AE">設定項目</a>
</li><li><a href="#h4-.E3.82.B5.E3.83.96.E3.83.A2.E3.82.B8.E3.83.A5.E3.83.BC.E3.83.AB">サブモジュール</a>
</li></ol></li><li><a href="#h3-custom_feed">custom_feed</a>
<ol><li><a href="#h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82">設定関係</a>
</li></ol></li><li><a href="#h3-hesearcher">hesearcher</a>
<ol><li><a href="#h4-.E5.BF.85.E8.A6.81.E6.9D.A1.E4.BB.B6">必要条件</a>
</li><li><a href="#h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-2">設定関係</a>
</li></ol></li><li><a href="#h3-mail">mail</a>
<ol><li><a href="#h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-3">設定関係</a>
</li></ol></li><li><a href="#h3-mixidiary">mixidiary</a>
<ol><li><a href="#h4-.E5.BF.85.E8.A6.81.E6.9D.A1.E4.BB.B6-2">必要条件</a>
</li><li><a href="#h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-4">設定関係</a>
</li></ol></li><li><a href="#h3-nullconfig">nullconfig</a>
</li></ol></li><li><a href="#h2-filter">filter</a>
<ol><li><a href="#h3-adjust_date">adjust_date</a>
<ol><li><a href="#h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-5">設定関係</a>
</li></ol></li><li><a href="#h3-grep">grep</a>
<ol><li><a href="#h4-.E8.A8.AD.E5.AE.9A.E9.A0.85.E7.9B.AE-2">設定項目</a>
</li></ol></li><li><a href="#h3-moblog_formatter">moblog_formatter</a>
<ol><li><a href="#h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-6">設定関係</a>
</li></ol></li><li><a href="#h3-format_title">format_title</a>
<ol><li><a href="#h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-7">設定関係</a>
</li></ol></li><li><a href="#h3-sort">sort</a>
<ol><li><a href="#h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-8">設定関係</a>
</li></ol></li><li><a href="#h3-delete_dup">delete_dup</a>
</li><li><a href="#h3-head">head</a>
<ol><li><a href="#h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-9">設定関係</a>
</li></ol></li><li><a href="#h3-first">first</a>
</li><li><a href="#h3-join">join</a>
</li><li><a href="#h3-reverse">reverse</a>
</li><li><a href="#h3-subs">subs</a>
<ol><li><a href="#h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-10">設定関係</a>
</li></ol></li><li><a href="#h3-rssload">rssload</a>
<ol><li><a href="#h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-11">設定関係</a>
</li></ol></li><li><a href="#h3-unread">unread</a>
<ol><li><a href="#h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-12">設定関係</a>
</li></ol></li><li><a href="#h3-nomod">nomod</a>
</li></ol></li><li><a href="#h2-publisher">publisher</a>
<ol><li><a href="#h3-rssfeeder">rssfeeder</a>
<ol><li><a href="#h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-13">設定関係</a>
</li></ol></li><li><a href="#h3-heupdater">heupdater</a>
<ol><li><a href="#h4-.E5.BF.85.E8.A6.81.E6.9D.A1.E4.BB.B6-3">必要条件</a>
</li><li><a href="#h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-14">設定関係</a>
</li></ol></li><li><a href="#h3-dbstore">dbstore</a>
<ol><li><a href="#h4-.E5.BF.85.E8.A6.81.E6.9D.A1.E4.BB.B6-4">必要条件</a>
</li></ol></li><li><a href="#h3-tmikimoblog">tmikimoblog</a>
</li><li><a href="#h3-counter">counter</a>
</li><li><a href="#h3-stdio">stdio</a>
</li></ol></li></ol></div>
<h2 id="h2-subcription">subcription</h2><p>RSSの取得，生成を行なうプラグインです。基本的にはすべてのpipelineはsubscription内のモジュールから開始されます。
</p><h3 id="h3-config">config</h3><p>RSSファイルを取得します。
</p><h4 id="h4-.E8.A8.AD.E5.AE.9A.E9.A0.85.E7.9B.AE">設定項目</h4><ul><li>feed: リストで取得したいRSSの配布URLを指定します。
</li><li>file: ローカルにあるファイルをRSSファイルとしてパースします。リストです。
</li><li>max-thread: 一度に同時アクセスするサイトの数です。指定しない場合は，一度にすべてのRSSを取得しにいきます。
</li></ul><h4 id="h4-.E3.82.B5.E3.83.96.E3.83.A2.E3.82.B8.E3.83.A5.E3.83.BC.E3.83.AB">サブモジュール</h4><p>サブモジュールを指定できます。サブモジュールを指定すると、RSSファイルだけでなく、ほかのモジュールを使用してRSSに変換できます。例えば、サブモジュールにmixidiaryを指定することで、このモジュールの中でmixidiaryも同時に扱えます。
</p><p>例：
</p><pre>    - module: subscription.config
      config:
        feed:
          - http://www.liris.org/blog/RSS
          - http://dev.ariel-networks.com/Members/blog_update/RSS
      sub-modules:
        - module: subscription.mixidiary
          config:
            userid: mixiuserid
            password: mixipassword
</pre><h3 id="h3-custom_feed">custom_feed</h3><p>HTMLファイルを取得してパースし，RSSに変換するプラグインです。
</p><h4 id="h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82">設定関係</h4><ul><li>url: 取得したいHTMLへのURLです。
</li><li>capture:　オプションです。HTML全体のうち，処理対象の部分を正規表現で抜き出します。省略するとHTML全体が処理対象になります。
</li><li>split: captureしたものを、指定した正規表現で分割してエントリにします。指定しない場合は，captureしたものが一つのエントリになります。
</li><li>title: splitした各エントリからtitleを抽出します。指定しない場合は，最初の40文字がタイトルとして使用されます。
</li><li>link: 各エントリに対して，指定したリンクを埋め込みます。指定しない場合は、「#」がリンクになります。
</li></ul><h3 id="h3-hesearcher">hesearcher</h3><p>HyperEstraierで全文検索して、RSSに変換するプラグインです。
</p><h4 id="h4-.E5.BF.85.E8.A6.81.E6.9D.A1.E4.BB.B6">必要条件</h4><ul><li>hyperestraier pure python implementaion (v0.10.0 or later)
</li></ul><h4 id="h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-2">設定関係</h4><ul><li>node: hyperestarier のノードへのURL
</li><li>userid: hyperestraierのユーザID。省略するとadmin。
</li><li>password: hyperestraierのパスワード。省略するとadmin.
</li><li>phrase: 検索単語。
</li></ul><h3 id="h3-mail">mail</h3><p>メールサーバ(POP3)からメールを取得して，RSSにします。
</p><h4 id="h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-3">設定関係</h4><ul><li>userid: メールサーバへログインするためのユーザID。
</li><li>password: メールサーバのパスワード。
</li><li>server: メールサーバの名前です。FQANでもIPアドレスでも構いません。
</li></ul><p>* author: RSSの各エントリにつけられる作成者の名前です。省略すると「habu」になります。
</p><h3 id="h3-mixidiary">mixidiary</h3><p><a href="http://mixi.jp/" class="external" rel="nofollow">mixi</a>の「マイミクシィ最新日記 」からデータを抜き出してRSSとして処理するためのプラグインです。
</p><h4 id="h4-.E5.BF.85.E8.A6.81.E6.9D.A1.E4.BB.B6-2">必要条件</h4><ul><li><a href="http://sourceforge.jp/projects/pymixi/">pymixi</a>
</li></ul><h4 id="h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-4">設定関係</h4><ul><li>userid: mixiのユーザIDです。
</li><li>password: mixiのパスワードです。
</li></ul><h3 id="h3-nullconfig">nullconfig</h3><p>テスト用です。気にしないでください。
</p><h2 id="h2-filter">filter</h2><p>filterでは主に取得したRSSの加工を行ないます。
</p><h3 id="h3-adjust_date">adjust_date</h3><p>時刻フォーマットの修正，正規化をします。日付がない初めて取得したエントリに現在時間を挿入します。以前取得したことのある日付のないエントリには，以前取得したときの時刻が挿入されます。取得日時の情報はオンメモリー，または，SQLObjectのデータベースに保存します。
</p><h4 id="h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-5">設定関係</h4><ul><li>use_db: True/False。指定されていない、またはFalseの場合は，オンメモリでデータが保持されます。Trueの場合は、データベースを使用します。データベースを使用する場合、フィルタをした後にデータベースへの登録処理が必用になります。
</li></ul><p>* time_offset: タイムゾーンが設定されていない場合の日時表記で、時間のオフセットを数値で指定します。デフォルトでは0で、日本では9のはず。
</p><h3 id="h3-grep">grep</h3><p>エントリの中を検索して，一致するものだけ、または、一致しないものだけを削除します。
</p><h4 id="h4-.E8.A8.AD.E5.AE.9A.E9.A0.85.E7.9B.AE-2">設定項目</h4><ul><li>exclusive: True/Falseで指定します。Trueの場合，一致するものを削除します。Falseの場合は，一致しないものを削除します。
</li><li>辞書のキーで検索フィールドを指定します。値も辞書です。
</li><li>str: 単純な文字列検索をします。
</li><li>re: 正規表現で検索します。
</li><li>eval: 式を指定して評価します。引き数として，各エントリがentryとして渡されます。
</li></ul><h3 id="h3-moblog_formatter">moblog_formatter</h3><p>COREBlog2のmoblogのフォーマットに一致しないものを削除します。フォーマットはsummaryが次のようになっています。プラグインを通すと，blogに掲載する本文だけになります。
</p><pre>更新用パスワード

本文
</pre><h4 id="h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-6">設定関係</h4><ul><li>secretkey: 更新用パスワード
</li></ul><h3 id="h3-format_title">format_title</h3><p>各エントリのタイトルをカスタマイズします。
</p><h4 id="h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-7">設定関係</h4><p>formatでフォーマットを指定します。entriesの各エントリのキーを指定できます。フィードのタイトル、リンクはそれぞれ、feed.title、feed.linkで指定できます。「エントリのタイトル - フィードのタイトル」にフォーマットしたい場合は、次のように記述します。
</p><pre>- module: format_title
  config:
    format: &quot;%(title)s - %(feed.title)s&quot;
</pre><h3 id="h3-sort">sort</h3><p>エントリの順番を並び替えます。
</p><h4 id="h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-8">設定関係</h4><ul><li>key: 並び替えたい項目のキーを指定します。省略すると更新日順にソートされます。
</li><li>reverse: 並び替えの順序を反転します。True、Falseで指定します。省略するとFalseになります。
</li></ul><h3 id="h3-delete_dup">delete_dup</h3><p>重複したエントリを削除します。
</p><h3 id="h3-head">head</h3><p>エントリを範囲指定して抜き出します。
</p><h4 id="h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-9">設定関係</h4><ul><li>start: 抜き出す最初の位置のインデックス番号です。0から始まります。
</li><li>end: 抜き出す最後の位置のインデックス番号です。0から始まります。
</li></ul><p>Pythonの構文の entries[start:end] に対応します。
</p><h3 id="h3-first">first</h3><p>最初のエントリだけを抜き出します。
</p><h3 id="h3-join">join</h3><p>habuでは一つのパイプライン(フィルタチェーン)を並列に処理できます。並列に処理されているものを，一つのスレッドに戻すためのプラグインです。
</p><h3 id="h3-reverse">reverse</h3><p>エントリの並び順を反転します。
</p><h3 id="h3-subs">subs</h3><p>文字列置換します。
</p><h4 id="h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-10">設定関係</h4><p>配列で次のデータを指定します。
</p><ul><li>key: エントリの対象となるフィールドを指定します。title,summaryなどです。詳細は，「プラグインの作成」を参照してください。
</li><li>re: 検索対象の文字列を正規表現で指定します。
</li><li>to: 置換文字列です。
</li></ul><div class="indent">
</div><h3 id="h3-rssload">rssload</h3><p>RSSファイルを開いて，チェーンに流れてきたデータに追加します。
</p><h4 id="h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-11">設定関係</h4><ul><li>path: RSSファイルへのパスを指定します。RSSファイルが取得できない，正しくない場合は何もしません。
</li></ul><h3 id="h3-unread">unread</h3><p>初めて取得したエントリだけにフィルタリングするためのプラグインです。取得したかどうかのデータはメモリ上に保存することもできますが，設定でpathを指定してdbmに保存することをお勧めします。
</p><h4 id="h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-12">設定関係</h4><ul><li>use_db: True/False。指定されていない、またはFalseの場合は，オンメモリでデータが保持されます。Trueの場合は、データベースを使用します。データベースを使用する場合、フィルタをした後にデータベースへの登録処理が必用になります。
</li></ul><h3 id="h3-nomod">nomod</h3><p>テスト用です。気にしないでください。
</p><h2 id="h2-publisher">publisher</h2><p>主にファイルやデータベース、全文検索エンジンへの登録などの外部への出力を目的としたプラグインです。出力を複数組み合わせることもできます。
</p><h3 id="h3-rssfeeder">rssfeeder</h3><p>RSSファイルを指定したディレクトリに作成します。既にファイルが存在する場合は上書きされます。既存のRSSファイルに追加したい場合は，filter.rssloadを行なってから書き込むようにしてください。
</p><h4 id="h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-13">設定関係</h4><ul><li>title: RSSファイルのtitleを指定します。指定しない場合は，「habu rss」になります。
</li><li>link: RSSファイルの配信元になります。指定しない場合は，「<a href="http://localhost/%E3%80%8D%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82" class="external" rel="nofollow">http://localhost/」になります。</a>
</li><li>file: RSSファイルを保存するファイルパスです。指定しない場合は，カレントディレクトリにファイル名rssで出力します。
</li></ul><h3 id="h3-heupdater">heupdater</h3><p>各エントリをHyperEstraierの全文検索インデックスに登録するためのプラグインです。エントリのタイトルとサマリー、エントリへのURLをHyperEstraierに登録します。
</p><h4 id="h4-.E5.BF.85.E8.A6.81.E6.9D.A1.E4.BB.B6-3">必要条件</h4><ul><li>HyperEstraierのノードマスターが動作している必要があります。詳細は、「<a href="http://hyperestraier.sourceforge.net/index.ja.html" class="external" rel="nofollow">HyperEstraier</a>」を参照sてください。
</li><li>HyperEstraierのPure Python版ノードAPI バージョン0.10.0以降が必要です。詳細は、「<a href="http://www.liris.org/tech/program/hyperestraier-purepython/" class="external" rel="nofollow">Pure Python HyperEstraier</a>」を参照してください。
</li></ul><h4 id="h4-.E8.A8.AD.E5.AE.9A.E9.96.A2.E4.BF.82-14">設定関係</h4><ul><li>node: HyperEstraierのノードへのURLです。(例: <a href="http://localhost:1976/node/test)" class="external" rel="nofollow">http://localhost:1976/node/test)</a>
</li><li>userid: HyperEstraierのノードマスターへログインするためのユーザIDです(例: admin)
</li><li>password: HyperEstraierのノードマスターへログインするためのパスワードです(例: admin)
</li></ul><h3 id="h3-dbstore">dbstore</h3><p>habuのデータベースにデータを保存できます。
</p><h4 id="h4-.E5.BF.85.E8.A6.81.E6.9D.A1.E4.BB.B6-4">必要条件</h4><ul><li>SQLObjectとpysqliteが使えること
</li><li>globalセクションにdburiが指定されていること。
</li></ul><div class="indent">
</div><h3 id="h3-tmikimoblog">tmikimoblog</h3><p>自家製blogシステムのエントリ更新用です。気にしないでください。<br />
そのうちCOREBlog2用エントリ更新ツールも作ります。
</p><h3 id="h3-counter">counter</h3><p>テスト用です。気にしないでください。
</p><h3 id="h3-stdio">stdio</h3><p>テスト用です。気にしないでください。
</p>]]>
    </content:encoded>
      </item>
        <item rdf:about="http://sourceforge.jp/projects/pyhabu/wiki/ConfigFormat">
    <title>ConfigFormat</title>
    <link>http://sourceforge.jp/projects/pyhabu/wiki/ConfigFormat</link>
    <dc:identifier>ConfigFormat</dc:identifier>
    <dc:date>2007-09-25T16:11:09+09:00</dc:date>
        <description>
      <![CDATA[= 設定ファイル =

[[PageOutline(start=2)]]
設定ファイルは[http://ja.wikipedia.org/wiki/YAML YAML]形式で記述します。YAMLの詳細は、PyYAMLのサイト、または、WikiPediaを参照してください。[[BR]]
設定ファイルは大きく4つのセクションで構成されています。

 1. globalセクション
 2. ]]>
    </description>
    <content:encoded>
      <![CDATA[<h1 id="h1-.E8.A8.AD.E5.AE.9A.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB">設定ファイル</h1><div class="pageoutline"><div class="pageoutline-title"><div class="action"><button type="button" onClick="javascript:togglePageOutline(this)"><img src="//static.sourceforge.jp/wiki/images/icons/roll-up.gif" border="0"></button></div>Outline</div><ol><li><a href="#h2-global.E3.82.BB.E3.82.AF.E3.82.B7.E3.83.A7.E3.83.B3">globalセクション</a>
<ol><li><a href="#h3-.E3.83.AD.E3.82.B0.E3.81.AE.E8.A8.AD.E5.AE.9A">ログの設定</a>
</li><li><a href="#h3-.E3.83.97.E3.83.A9.E3.82.B0.E3.82.A4.E3.83.B3.E3.81.AE.E3.83.91.E3.82.B9.E3.81.AE.E8.A8.AD.E5.AE.9A">プラグインのパスの設定</a>
</li><li><a href="#h3-.E3.83.97.E3.83.AD.E3.82.AD.E3.82.B7.E8.A8.AD.E5.AE.9A">プロキシ設定</a>
</li><li><a href="#h3-.E3.83.87.E3.83.BC.E3.82.BF.E3.83.99.E3.83.BC.E3.82.B9.E8.A8.AD.E5.AE.9A">データベース設定</a>
</li></ol></li><li><a href="#h2-scheduler.E3.82.BB.E3.82.AF.E3.82.B7.E3.83.A7.E3.83.B3">schedulerセクション</a>
</li><li><a href="#h2-pipeline.E3.82.BB.E3.82.AF.E3.82.B7.E3.83.A7.E3.83.B3">pipelineセクション</a>
</li><li><a href="#h2-server.E3.82.BB.E3.82.AF.E3.82.B7.E3.83.A7.E3.83.B3">serverセクション</a>
<ol><li><a href="#h3-web">web</a>
<ol><li><a href="#h4-module.3A.20static">module: static</a>
</li><li><a href="#h4-module.3A.20hyperestraier">module: hyperestraier</a>
</li><li><a href="#h4-module.3A.20planet">module: planet</a>
</li></ol></li></ol></li></ol></div>
<p>設定ファイルは<a href="http://ja.wikipedia.org/wiki/YAML" class="external" rel="nofollow">YAML</a>形式で記述します。YAMLの詳細は、PyYAMLのサイト、または、<a href="http://sourceforge.jp/projects/pyhabu/wiki/WikiPedia">WikiPedia</a>を参照してください。<br />
設定ファイルは大きく4つのセクションで構成されています。
</p><ol><li>globalセクション
</li><li>schedulerセクション
</li><li>pipelineセクション
</li><li>serverセクション
</li></ol><h2 id="h2-global.E3.82.BB.E3.82.AF.E3.82.B7.E3.83.A7.E3.83.B3">globalセクション</h2><p>globalセクションでは，habu全体の設定をします。ここではログ出力設定や、複数のプラグインでの共通の設定を行ないます。現在利用できる設定は，logの設定とプラグインのパスの設定です。
</p><h3 id="h3-.E3.83.AD.E3.82.B0.E3.81.AE.E8.A8.AD.E5.AE.9A">ログの設定</h3><p>logでログの出力先を指定します。出力先に指定でstdoutで標準出力に，stderrで標準エラーにログを出力します。nullを指定するとログ出力を抑制します。ファイルパスを指定すると，指定したファイルにログを出力します。ログをファイルに出力するように指定した場合，自動的に日付ごとにログローテートします。
</p><p>loglevelを指定することで，ログ出力を制御できます。値は数字，または、次の文字列です。数値の場合は，値が大きいほど、より詳細なログが出力できます。文字列での指定は，DEBUGがもっとも詳細な出力で，NONEは殆ど出力されません。
</p><ul><li>NONE
</li><li>CRITICAL
</li><li>FATAL
</li><li>ERROR
</li><li>WARN
</li><li>INFO
</li><li>DEBUG

</li></ul><pre>global:
  log: stdout
  loglevel: INFO
</pre><h3 id="h3-.E3.83.97.E3.83.A9.E3.82.B0.E3.82.A4.E3.83.B3.E3.81.AE.E3.83.91.E3.82.B9.E3.81.AE.E8.A8.AD.E5.AE.9A">プラグインのパスの設定</h3><p>プラグインのパスは任意の場所（パス）を指定できます。追加のプラグインの場所はplugin_pathで指定します。plugin_pathの値は配列で、複数指定することができます。プラグインのロード順は、
</p><ol><li>コマンドライン引き数のプラグインのパス
</li><li>設定ファイルのplugin_path
</li><li>カレントディレクトリ
</li><li>habuのモジュールディレクトリ
</li></ol><p>です。
</p><pre>global:
  plugin_path:
    - /plugin/path/1
    - /plugin/path/2
</pre><h3 id="h3-.E3.83.97.E3.83.AD.E3.82.AD.E3.82.B7.E8.A8.AD.E5.AE.9A">プロキシ設定</h3><p>プロキシを指定できます。指定しない場合は，直接インターネットに接続します。proxy_hostでプロキシのホスト名、または，IPアドレスを指定します。proxy_portで、プロキシのポート番号を指定します。proxy_portを指定しない場合は，80番が使用されます。
</p><pre>
global:
  proxy_host: myproxy.host.name
  proxy_port: 3128

</pre><h3 id="h3-.E3.83.87.E3.83.BC.E3.82.BF.E3.83.99.E3.83.BC.E3.82.B9.E8.A8.AD.E5.AE.9A">データベース設定</h3><p>オプションでhabuで使用するデータベースをdburiで指定できます。データベースに接続するためにはSQLObjectを使用します。dburiはSQLObjectのデータベースのURIでの指定方法で指定します。%(current_dir_uri)sはカレントディレクトリのパスに置換されます。
</p><p>SQLObjectが使用するデータベースは使用できますが、sqliteを推奨します。
</p><p>データベースを設定すると、publisher.dbstoreプラグインが使用できるようになります。また、Webサーバ機能でplanetモジュールが使用できます。
</p><h2 id="h2-scheduler.E3.82.BB.E3.82.AF.E3.82.B7.E3.83.A7.E3.83.B3">schedulerセクション</h2><p>scheduleセクションを指定すると，habuをデーモンとして常駐させて，指定したスケジューリングに従って，定期実行できます。<strong>この仕様は将来変更するかも知れません。</strong>
</p><pre>scheduler:
  - pipeline: mypipeline
     expression: &quot;* * * * *&quot;
</pre><p>指定方法は，piplelineごとにcronライクなスケジュール指定を行ないます。具体的には，scheduleは配列です。各配列の要素はpipelineとexpressionになります。pipelineは実行したい処理になります。expressionで、実行スケジュールを指定します。expressionでは，空白区切りで，実行する分，時間，日，月，曜日になります。「*」は、毎Xと言う意味になります。「* * * * *」と記述することで，一分ごとに実行できます。また，「*/1- * * * *」と記述すると10分ごとに実行することができます。
</p><p>実行スケジュールにhourly, dairy, weekly, monthlyを指定すると，それぞれ，一時間ごと、毎日，一週間ごと，毎月の意味になります。これは，単純なエイリアスです。
</p><table class="wikitable" border="1"><tbody><tr><td>エイリアス名</td><td>実際の値</td><td>意味</td></tr><tr><td>hourly   </td><td>0 * * * * </td><td> 毎時 </td></tr><tr><td>daily      </td><td>0 2 * * * </td><td> 毎日 </td></tr><tr><td>weekly   </td><td>0 0 0 0 1 </td><td> 一週間ごと</td></tr><tr><td>monthly </td><td>0 0 1 * * </td><td> 毎月</td></tr></tbody></table><h2 id="h2-pipeline.E3.82.BB.E3.82.AF.E3.82.B7.E3.83.A7.E3.83.B3">pipelineセクション</h2><p>RSSの配布サイトごとに別のフィルタを通すことで、RSSの加工方法を変更したい場合があります。その場合、設定ファイルを複数に分割して、複数のプロセスで処理することもできます。PlaggerやPRaggerはこの方式で動作します。habuも同じように動作させることもできますが、一つのプロセス内で複数の加工方法を同時並行で処理できます。一つの一連のフィルタ(フィルタチェーン)の組み合わせをpipelineと呼んでいます。例えば、pipeline Aでは、RSSを取得後、「python」という単語があるエントリだけを抜き出してRSSを再配信し、pipleline BではすべてのRSSのエントリのRSSを取得することができます。最終的にpipeline Aとpipeline BのRSSを一つのRSSにまとめあげることも、別のRSSとして読むこともできます。
</p><pre>pipeline:
  rss_fetcher:
    - module: subscription.config
      config:
        feed:
          - http://www.liris.org/blog/RSS
          - http://dev.ariel-networks.com/Members/blog_update/RSS
      sub-modules:
        - module: subscription.mixidiary
          config:
            userid: mixiuserid
            password: mixipassword
    - module: filter.join
    - module: filter.sort
      config:
        reverse: True
    - module: publisher.rssfeeder
      config:
        file: &quot;out.rss&quot;

</pre><p>pipelineセクションの中は辞書になっています。キーに各pipelineの名前をしていします。上の例ではrss_fetcherです。この名前はpipelineセクションの中でユニークでなければなりません。値としては、プラグインの配列になります。プラグインはインスタンス化された後に上から順次、実行されます。
</p><p>プラグインの設定はmoduleとconfig、sub-modules, urlから構成されます。moduleはプラグインの名前(プラグインのモジュール名)です。moduleはプラグインのモジュール名です。configは各プラグインごとに固有の設定です。configの詳細は、「<a href="http://sourceforge.jp/projects/pyhabu/wiki/PluginList">プラグイン一覧</a>」の各項目を参照してください。urlはもし、プラグインパス上にモジュールが見つからなかった場合、指定したURLから自動でプラグインをダウンロードします。URLを指定せずに、プラグインパス上にモジュールが見つからない場合は、エラーを出力してプログラムを終了します。
</p><p>sub-modulesはプラグインの中にプラグインを入れ子にするための機能です。subscription.configプラグインは、RSSフィードを取得しますが、サブモジュールとしてsubscription.mixidiaryを指定することで、同時にmixiのお友達の日記も同時に取得することができます。sub-modulesは配列で、複数のプラグインを指定できます。指定方法はpipelineの各モジュールの指定方法と同じです。sub-modulesに複数指定してもチェーンになりません。
</p><p>sub-modulesの機能はオプショナルで、現在sub-modulesをサポートしているプラグインは次のものです。
</p><ul><li>subscription.config
</li></ul><p>moduleの名前は「.」で区切られ、標準のプラグインはsubscription.*, filter.* publisher.*です。それぞれはカテゴリ分けされていますが、これはプラグインの機能を把握しやすくするために分けています。機能的な差異はほとんどありません。
</p><h2 id="h2-server.E3.82.BB.E3.82.AF.E3.82.B7.E3.83.A7.E3.83.B3">serverセクション</h2><p>habuのサーバ機能を設定します。serverセクションは辞書で，キーにサーバの種類，値にサーバの設定を記述します。現在利用できるサーバ機能はwebです。
</p><p>サーバ機能を利用するためには，パーソナルファイアウォールなどの設定を見直す必用があるかも知れません。
</p><h3 id="h3-web">web</h3><p>configにwebサーバとしての基本設定，resourceにwebサーバの個別の機能を設定します。
</p><p>configの値は辞書です。portにサーバを起動するときのポート番号、interfaceにサーバを起動するときのアドレスを入力します。interfaceはオプションで，指定しない場合は，localhostになります。0.0.0.0を指定すると，外部PCからアクセスできます。
</p><p>resourceの値は配列です。Webサーバのルートパスの直下に配置されます。各要素は，辞書で最低，次の二つの要素を持つ必用があります。
</p><ul><li>module: サーバの機能名です。<br />staticで静的なファイルをフィードでします。現在は，動的なモジュールのロードはサポートしていません。
</li><li>name: Webサーバのルートパスの配下におくオブジェクトの名前です。<br />hogeとした場合，<a href="http://localhost:port/hoge%E3%81%A7%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82" class="external" rel="nofollow">http://localhost:port/hogeでアクセスできます。</a>
</li></ul><p>上記の二つ以外は、module固有の設定です。
</p><h4 id="h4-module.3A.20static">module: static</h4><p>静的ファイルをフィードします。pathにフィードしたいファイルへのパスを指定します。ディレクトリを指定した場合は，そのディレクトリ以下のファイルがすべてフィードされます。
</p><h4 id="h4-module.3A.20hyperestraier">module: hyperestraier</h4><p>Web UIからHyperEstraierに全文検索し，RSS出力します。nodeで全文検索するHyperEstraierのノードへのURLを指定します。userid,passwordでそれぞれユーザID、パスワードを指定します。省略すると，admin,adminにそれぞれなります。
これを利用するためには，hyperestraier pure python版0.10.0以降が必用です。
</p><h4 id="h4-module.3A.20planet">module: planet</h4><p>データベースから更新上を取得してRSSをフィードするPlanet機能を提供します。現状はRSSを直接フィードするだけです。
</p><p>titleにRSSのタイトルを指定します。urlはこのPlanet機能へのリンクです。省略するとそれぞれ、「Habu Planet」「<a href="http://localhost/%E3%80%8D%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82" class="external" rel="nofollow">http://localhost/」になります。</a>
</p><p>rangeで表示する日数を指定します。sizeで表示する最大サイズを指定します。データベースから取得したデータでrangeとsizeで少ない方の数だけフィードします。rangeは省略すると7日間になります。sizeは省略すると０になります。0は無制限を意味します。</p>]]>
    </content:encoded>
      </item>
        <item rdf:about="http://sourceforge.jp/projects/pyhabu/wiki/SideBar">
    <title>SideBar</title>
    <link>http://sourceforge.jp/projects/pyhabu/wiki/SideBar</link>
    <dc:identifier>SideBar</dc:identifier>
    <dc:date>2007-09-20T00:16:47+09:00</dc:date>
        <description>
      <![CDATA[= コンテンツ

 1. [FrontPage 概要]
 2. [CommandUsage コマンド使用方法]
 3. [ConfigFormat 設定ファイル]
 4. [PluginList プラグイン一覧]
 5. [PluginDev プラグインの作成方法]
 6. [FAQ FAQ]
 7. [NextRelease 次期バージョンなど]

= 最近の更新

[[]]>
    </description>
    <content:encoded>
      <![CDATA[<h1 id="h1-.E3.82.B3.E3.83.B3.E3.83.86.E3.83.B3.E3.83.84">コンテンツ</h1><ol><li><a href="http://sourceforge.jp/projects/pyhabu/wiki/FrontPage">概要</a>
</li><li><a href="http://sourceforge.jp/projects/pyhabu/wiki/CommandUsage">コマンド使用方法</a>
</li><li><a href="http://sourceforge.jp/projects/pyhabu/wiki/ConfigFormat">設定ファイル</a>
</li><li><a href="http://sourceforge.jp/projects/pyhabu/wiki/PluginList">プラグイン一覧</a>
</li><li><a href="http://sourceforge.jp/projects/pyhabu/wiki/PluginDev">プラグインの作成方法</a>
</li><li><a href="http://sourceforge.jp/projects/pyhabu/wiki/FAQ">FAQ</a>
</li><li><a href="http://sourceforge.jp/projects/pyhabu/wiki/NextRelease">次期バージョンなど</a>
</li></ol><h1 id="h1-.E6.9C.80.E8.BF.91.E3.81.AE.E6.9B.B4.E6.96.B0">最近の更新</h1><h4 id="h4-2007-12-13">2007-12-13</h4><ul><li><a href="http://sourceforge.jp/projects/pyhabu/wiki/FrontPage">FrontPage</a>
</li><li><a href="http://sourceforge.jp/projects/pyhabu/wiki/MediaArticle">MediaArticle</a>
</li></ul><h4 id="h4-2007-10-10">2007-10-10</h4><ul><li><a href="http://sourceforge.jp/projects/pyhabu/wiki/NextRelease">NextRelease</a>
</li></ul><h4 id="h4-2007-09-25">2007-09-25</h4><ul><li><a href="http://sourceforge.jp/projects/pyhabu/wiki/PluginList">PluginList</a>
</li><li><a href="http://sourceforge.jp/projects/pyhabu/wiki/ConfigFormat">ConfigFormat</a>
</li></ul><h4 id="h4-2007-09-20">2007-09-20</h4><ul><li><a href="http://sourceforge.jp/projects/pyhabu/wiki/SideBar">SideBar</a>
</li></ul>
]]>
    </content:encoded>
      </item>
        <item rdf:about="http://sourceforge.jp/projects/pyhabu/wiki/CommandUsage">
    <title>CommandUsage</title>
    <link>http://sourceforge.jp/projects/pyhabu/wiki/CommandUsage</link>
    <dc:identifier>CommandUsage</dc:identifier>
    <dc:date>2007-09-12T12:43:21+09:00</dc:date>
        <description>
      <![CDATA[= コマンド使用方法 =

コマンドの使用法は、

{{{ code sh
$ python runhabu.py [オプション] [設定ファイル]
}}}

です。

設定ファイルは、使用する設定ファイル(YAML形式)を指定します。設定ファイルは省略可能で、省略すると可憐度ディレクトリのhabu.cfgを使用します。設定ファイルが見つからない場合は、エラーが出力してプログラ]]>
    </description>
    <content:encoded>
      <![CDATA[<h1 id="h1-.E3.82.B3.E3.83.9E.E3.83.B3.E3.83.89.E4.BD.BF.E7.94.A8.E6.96.B9.E6.B3.95">コマンド使用方法</h1><p>コマンドの使用法は、
</p><pre>
$ python runhabu.py [オプション] [設定ファイル]
</pre><p>です。
</p><p>設定ファイルは、使用する設定ファイル(YAML形式)を指定します。設定ファイルは省略可能で、省略すると可憐度ディレクトリのhabu.cfgを使用します。設定ファイルが見つからない場合は、エラーが出力してプログラムを終了します。
</p><p>設定ファイルにschedulerが指定されている場合は、スケジューラモード(デーモンモード)で動作します。指定がない場合は、タスクモードで動作します。
</p><h2 id="h2-.E3.82.AA.E3.83.97.E3.82.B7.E3.83.A7.E3.83.B3">オプション</h2><h3 id="h3--h.2C.20--help">-h, --help</h3><p>ヘルプ(コマンドの使用方法)を出力してプログラムを終了します。
</p><h3 id="h3--V.2C.20--version">-V, --version</h3><p>バージョン情報を表示して、プログラムを終了します。
</p><h3 id="h3--t.2C.20--target.3DTARGET_PIPELINE">-t, --target=TARGET_PIPELINE</h3><p>設定ファイルに複数のpipelineを記述している場合、指定したパイプライン(TARGET_PIPELINE)だけを実行します。指定したパイプラインが見つからない場合はエラーを出力して終了します。
</p><p>設定ファイルにschedulerが指定されている場合(スケジューラモード)は、プログラムは常駐しますが、ターゲットが指定されている場合はプログラムは常駐しません(タスクモードで動作します)。
</p><h3 id="h3--a.2C.20--plugin-path.3DPLUGIN_PATH">-a, --plugin-path=PLUGIN_PATH</h3><p>追加のプラグインのディレクトリを指定します。プラグインのロード順は、
</p><ol><li>コマンドライン引き数のプラグインのパス
</li><li>設定ファイルのplugin_path
</li><li>カレントディレクトリ
</li><li>habuのモジュールディレクトリ
</li></ol><p>です。
</p><h3 id="h3--e.2C.20--enable-netinstall">-e, --enable-netinstall</h3><p>設定ファイルにモジュールのURLが指定されいて，プラグインパス上にモジュールが見つからない場合，Webからモジュールを自動ダウンロードできるようになります。これを指定しない時は，ネットワーク上を検索セスにエラーがで終了します。
</p><h3 id="h3--d.2C.20--disable-server">-d, --disable-server</h3><p>設定ファイルにserverセクションがある場合でもサーバ機能を強制的に無効にします。
</p><h3 id="h3---download-url.3DDOWNLOAD_URL">--download-url=DOWNLOAD_URL</h3><p>モジュールをインターネットからダウンロードするときのベースURLです。--download-moduleとあわせて使用します。ダウンロードしたモジュールは--plugin-pathで一番最初に指定したディレクトリに保存されます。--plugin-pathが指定されていない場合は、カレントディレクトリに保存します。
</p><h3 id="h3---download-module.3DDOWNLOAD_MODULE_NAME">--download-module=DOWNLOAD_MODULE_NAME</h3><p>モジュールをインターネットからダウンロードするときのモジュール名です。--download-urlとあわせて使用します。--downlaod-urlが指定されていない場合は、「<a href="http://svn.sourceforge.jp/svnroot/pyhabu/trunk/habu%E3%80%8D%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%97%E3%81%9F%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%AF--plugin-path%E3%81%A7%E4%B8%80%E7%95%AA%E6%9C%80%E5%88%9D%E3%81%AB%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9F%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AB%E4%BF%9D%E5%AD%98%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82--plugin-path%E3%81%8C%E6%8C%87%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AF%E3%80%81%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%88%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AB%E4%BF%9D%E5%AD%98%E3%81%97%E3%81%BE%E3%81%99%E3%80%82" class="external" rel="nofollow">http://svn.sourceforge.jp/svnroot/pyhabu/trunk/habu」を使用します。ダウンロードしたモジュールは--plugin-pathで一番最初に指定したディレクトリに保存されます。--plugin-pathが指定されていない場合は、カレントディレクトリに保存します。</a>
</p><h3 id="h3--l.2C.20--log-level.3DLOG_LEVEL">-l, --log-level=LOG_LEVEL</h3><p>ログレベルを指定します。ログレベルの詳細は，「<a href="http://sourceforge.jp/projects/pyhabu/wiki/ConfigFormat">設定ファイル</a>」を参照してください。
</p><p>このオプションは設定ファイルの指定を上書きします。
</p><h3 id="h3---log-file.3DLOG_FILE">--log-file=LOG_FILE</h3><p>ログを出力するファイルを指定します。stdoutで標準出力，stderrで標準エラーに出力します。
</p><p>このオプションは設定ファイルの指定を上書きします。
</p><h3 id="h3---proxy-host.3DPROXY_HOST_NAME">--proxy-host=PROXY_HOST_NAME</h3><p>プロキシの配下でhabuを動かす場合は，proxy-hostを指定します。IPまたは，FQANで指定します。
</p><p>このオプションは設定ファイルの指定を上書きします。
</p><h3 id="h3---proxy-proxy.3DPROXY_HOST_PORT">--proxy-proxy=PROXY_HOST_PORT</h3><p>プロキシの配下でhabuを動かす場合は，proxy-hostに加えてproxy-portを指定します。指定しない場合は，80になります。
</p><p>このオプションは設定ファイルの指定を上書きします。
</p><h3 id="h3---pid-file.3DPID_FILE_PATH">--pid-file=PID_FILE_PATH</h3><p>pidファイルを指定したパスに出力します。この機能は，デーモンモードで動作している場合に有効です。
</p><h2 id="h2-.E7.94.A8.E8.AA.9E.E8.AA.AC.E6.98.8E">用語説明</h2><ul><li>タスクモード: パイプラインを一度だけ実行してプログラムを終了します。
</li><li>スケジューラモード(デーモンモード): プログラムが常駐して、パイプラインを定期実行します。</li></ul>]]>
    </content:encoded>
      </item>
        <item rdf:about="http://sourceforge.jp/projects/pyhabu/wiki/CronSetting">
    <title>CronSetting</title>
    <link>http://sourceforge.jp/projects/pyhabu/wiki/CronSetting</link>
    <dc:identifier>CronSetting</dc:identifier>
    <dc:date>2007-09-05T23:41:35+09:00</dc:date>
        <description>
      <![CDATA[= デーモンとして動作 =

「[ConfigFormat 設定ファル]」を参照してください。
]]>
    </description>
    <content:encoded>
      <![CDATA[<h1 id="h1-.E3.83.87.E3.83.BC.E3.83.A2.E3.83.B3.E3.81.A8.E3.81.97.E3.81.A6.E5.8B.95.E4.BD.9C">デーモンとして動作</h1><p>「<a href="http://sourceforge.jp/projects/pyhabu/wiki/ConfigFormat">設定ファル</a>」を参照してください。
</p>]]>
    </content:encoded>
      </item>
        <item rdf:about="http://sourceforge.jp/projects/pyhabu/wiki/PluginDev">
    <title>PluginDev</title>
    <link>http://sourceforge.jp/projects/pyhabu/wiki/PluginDev</link>
    <dc:identifier>PluginDev</dc:identifier>
    <dc:date>2007-09-05T23:39:32+09:00</dc:date>
        <description>
      <![CDATA[= プラグインの作成方法 =

&#039;&#039;&#039; 将来、プラグインの作成方法が変更するかもしれません &#039;&#039;&#039;

== 知っておくべきこと ==

 * Pythonの基本的な書き方

== 知っておくとうれしいかもしれないこと ==

 * Twistedの使い方。特にtwisted.internet.defer.Deferre]]>
    </description>
    <content:encoded>
      <![CDATA[<h1 id="h1-.E3.83.97.E3.83.A9.E3.82.B0.E3.82.A4.E3.83.B3.E3.81.AE.E4.BD.9C.E6.88.90.E6.96.B9.E6.B3.95">プラグインの作成方法</h1><p><strong> 将来、プラグインの作成方法が変更するかもしれません </strong>
</p><h2 id="h2-.E7.9F.A5.E3.81.A3.E3.81.A6.E3.81.8A.E3.81.8F.E3.81.B9.E3.81.8D.E3.81.93.E3.81.A8">知っておくべきこと</h2><ul><li>Pythonの基本的な書き方
</li></ul><h2 id="h2-.E7.9F.A5.E3.81.A3.E3.81.A6.E3.81.8A.E3.81.8F.E3.81.A8.E3.81.86.E3.82.8C.E3.81.97.E3.81.84.E3.81.8B.E3.82.82.E3.81.97.E3.82.8C.E3.81.AA.E3.81.84.E3.81.93.E3.81.A8">知っておくとうれしいかもしれないこと</h2><ul><li>Twistedの使い方。特にtwisted.internet.defer.Deferred。
</li><li>デコレータ、ジェネレータ、クロージャ
</li></ul><h2 id="h2-.E7.9F.A5.E3.82.89.E3.81.AA.E3.81.8F.E3.81.A6.E3.82.82.E3.81.84.E3.81.84.E3.81.93.E3.81.A8">知らなくてもいいこと</h2><ul><li>日本でのPython人口
</li><li>その他たくさん
</li></ul><h2 id="h2-.E3.82.AF.E3.82.A4.E3.83.83.E3.82.AF.E3.82.B9.E3.82.BF.E3.83.BC.E3.83.88">クイックスタート</h2><p>プラグインはPythonプログラムです。特殊な機能を使わない限りhabuに依存しないので単体テストが簡単にできます(ただし、Twistedに深く依存すると単体テストはかんばってね)。また、habuとは関係なく動作させることもできます。
</p><p>habuの配布物に含まれているhabu/filter/head.pyを例に説明します。次のコードは、head.pyの全文です。
</p><pre>

<B><FONT COLOR="#A020F0">class</FONT></B> Head(object):
    <B><FONT COLOR="#A020F0">def</FONT></B> <B><FONT COLOR="#0000FF">__init__</FONT></B>(self, config, environ):
        self.start = config.get(<B><FONT COLOR="#BC8F8F">&quot;start&quot;</FONT></B>, None)
        self.end = config.get(<B><FONT COLOR="#BC8F8F">&quot;end&quot;</FONT></B>, None)

    <B><FONT COLOR="#A020F0">def</FONT></B> <B><FONT COLOR="#0000FF">execute</FONT></B>(self, content):
        content[<B><FONT COLOR="#BC8F8F">&quot;entries&quot;</FONT></B>] = content[<B><FONT COLOR="#BC8F8F">&quot;entries&quot;</FONT></B>][self.start:self.end]

        <B><FONT COLOR="#A020F0">return</FONT></B> content


<B><FONT COLOR="#A020F0">def</FONT></B> <B><FONT COLOR="#0000FF">create</FONT></B>(config, environ):
    <B><FONT COLOR="#A020F0">return</FONT></B> Head(config, environ)

</pre><p>各プラグインモジュールは必ずcreate(config, environ)関数を実装する必要があります。habuがモジュールをロードした後にcreate関数を実行して、インスタンス化します。configはプラグイン固有の設定の辞書です。environはhabuの環境全体にわたる設定情報の辞書です。environは設定ファイルのglobalセクションに対応します。create関数はexecute(content)メソッドを実装したオブジェクトを返します。executeメソッドが定義されたオブジェクトであれば、モジュールでもクラスインスタンスでも構いません。
</p><pre>create関数の名前は変えるかもしれません。
いや、多分もうちょっとかっこいい名前に変えるはず。
</pre><p>Headクラスは通常、コンストラクタにconfig, environを引数に指定した形で実装します。必要に応じてクラスメンバーとして保存します。ここでは、設定のstartとendを保持しています。
</p><p>プラグインが実行されるときにはexecute(context)メソッドがコールされます。contextは入力データです。contextの詳細は後述します。ここでは、context[&quot;entries&quot;]のリストの要素をstartからendまで抽出してcontextのオブジェクトに設定し直しています。返り値は、次のモジュールのexecuteメソッドの引数になります。
</p><p>executeメソッドの返り値は、contextの辞書かtwisted.internet.defer.Deferredオブジェクト、または、それらのリストです。Deferredオブジェクトを返す場合は、非同期処理でデータを加工してからプラグインのチェーンを再開する場合に使用します。
</p><p>基本的にはexecuteでcontextのデータを加工して、context自体を返すだけです。
</p><h2 id="h2-context.E3.81.AE.E3.83.87.E3.83.BC.E3.82.BF.E6.A7.8B.E9.80.A0">contextのデータ構造</h2><p>executeメソッドの引き数に渡されるcontextはfeedparserがパースしたオブジェクトです。subscriptionではcontextは通常，Noneです。
</p><p>contextは辞書です。contextはentriesをキーとしてリストを辞書の要素として持ちます。それ以外の情報は現在のhabuでは無視されます。
</p><p>context[&quot;entries&quot;]にRSSの各エントリが保存されます。各エントリは辞書です。エントリには次のキーと値が設定されています。
</p><table class="wikitable" border="1"><tbody><tr><td>キー</td><td>タイプ</td><td>意味</td></tr><tr><td>author</td><td>文字列</td><td>作成者(オプション)</td></tr><tr><td>author_detail</td><td>辞書</td><td>作成者の詳細。<br />nameにauthorと同じ値。emailとかにメールアドレスが設定されるかも</td></tr><tr><td>link</td><td>文字列</td><td>エントリへのアクセスするユニークな文字列(URL)</td></tr><tr><td>update</td><td>文字列</td><td>最終更新日の文字列表記</td></tr><tr><td>updated_parsed</td><td>タプル</td><td>最終更新日の日時のタプル表記</td></tr><tr><td>title</td><td>文字列</td><td>エントリのタイトル</td></tr><tr><td>summary</td><td>文字列</td><td>エントリの本文(description)</td></tr><tr><td>summary_detail</td><td>辞書</td><td>summaryの詳細の辞書<br />typeにmimeタイプ，valueにhtmlやtextでの本文など</td></tr></tbody></table><p>上記以外のフィールドもありますが，未使用です。上記のフィールド以外にもプラグインが独自にデータを追加できます。
</p><h2 id="h2-.E8.A9.B3.E7.B4.B0">詳細</h2><p>モジュールの名前とモジュールへのパスは，一意であり、かつ、Python的にvalidでなければなりません。モジュールへのパスに上記以外の制約はありません。識別用にパイプラインの開始はsubscription、RSSの加工はfilter、出力はpublisherを推奨します。
</p><p>モジュールはhabuが各パイプラインを実行する直前にロードします。モジュールは，habuのプロセス全体でユニークなります。ロード後にモジュールはリロードされることはありません。モジュールは，設定ファイルのmoduleに指定した名前で区別されます。その後，モジュールのcreate関数がコールされて，インスタンス化されます。同一のパイプラインで同じモジュールを複数指定している場合は，指定した数だけインスタンス化されます。インスタンス化されたオブジェクトは，パイプラインの実行期間中生きています。そのあとは，いつ死ぬかはPythonインタープリタに聞いてください。
</p><p>パイプラインのモジュール（オブジェクト)のチェーンです。通常、一つのパイプラインは一つのチェーンです。executeがリストを返すと、チェーンは複数に分岐して同時並行でその後のそのあとのフィルタ処理を順次実行します。複数に分岐したチェーンはfilter.joinによってまた、一つのチェーンに集約できます。ネットワーク上のデータを取得する場合など、複数のチェーンに分割して、その後のフィルタ処理の実行タイミングをずらすことで、CPUの負荷をおさえることができます。また、データをふるい落とす処理をする場合など、若干メモリ使用量をおさえられます(ほとんど誤差の範囲なので気にしなくてもいいかもしれません)。
</p><p>Twistedの使い方は、「<a href="http://www.amazon.co.jp/gp/product/4774130427%3ftag=daysofliris-22%26link_code=xm2%26camp=2025%26dev-t=00PMHDV7AN7ESZTCWA82" class="external" rel="nofollow">最新Pythonエクスプローラ </a>」をご覧ください。</p>]]>
    </content:encoded>
      </item>
        <item rdf:about="http://sourceforge.jp/projects/pyhabu/wiki/FAQ">
    <title>FAQ</title>
    <link>http://sourceforge.jp/projects/pyhabu/wiki/FAQ</link>
    <dc:identifier>FAQ</dc:identifier>
    <dc:date>2007-09-03T23:35:16+09:00</dc:date>
        <description>
      <![CDATA[
Q: バージョン番号の付け方は?

A: 僕の気分次第です。マイナーバージョンは、ベースモジュールに機能を追加したらあげることが多いです。マイナーバージョンの下は、プラグインの変更とバグフィックスです。
]]>
    </description>
    <content:encoded>
      <![CDATA[<p>Q: バージョン番号の付け方は?
</p><p>A: 僕の気分次第です。マイナーバージョンは、ベースモジュールに機能を追加したらあげることが多いです。マイナーバージョンの下は、プラグインの変更とバグフィックスです。
</p>]]>
    </content:encoded>
      </item>
    </rdf:RDF>

