<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-us"><title>MiCHiLU Life.</title><link href="http://michilu.com/" rel="alternate" /><id>http://michilu.com/</id><updated>2008-02-15T14:46:13Z</updated><author><name>takanao ENDOH</name></author><link rel="self" href="http://feeds.feedburner.com/michilu" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry><title> 決済システム</title><link href="http://feedproxy.google.com/~r/michilu/~3/wDMx7tm50JM/" rel="alternate" /><updated>2008-02-15T14:46:13Z</updated><id>http://michilu.com/blog/posts/130/</id><summary type="html">
&lt;div class="section" id="memo"&gt;
&lt;h1&gt;[memo]: 決済システム&lt;/h1&gt;
&lt;p&gt;&lt;a class="reference external" href="http://www.amazon.co.jp/dp/4492681086"&gt;決済システムのすべて&lt;/a&gt; 読了につきメモ。&lt;/p&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;決済&lt;/dt&gt;
&lt;dd&gt;債権・債務関係を解消すること。
資金決済、外為決済、証券決済。&lt;/dd&gt;
&lt;dt&gt;決済システムの要件&lt;/dt&gt;
&lt;dd&gt;堅実かつ効率的な運営。
リスク管理。
流動性の供給と配分。&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;決済のプロセス:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;payment&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;支払指図の送付と受取&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;clearing&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;決済尻の算出&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;settlement&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;決済尻の受払&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;ファイナリティ&lt;/dt&gt;
&lt;dd&gt;決済完了性。決済の取り消しがないこと。
現金またはセントラルバンクマネーの受渡が完了し、債権・債務が消滅している状態。&lt;/dd&gt;
&lt;dt&gt;決済リスクとエクスポージャー&lt;/dt&gt;
&lt;dd&gt;決済が実行されないために損失を被るリスク。
金額×期間。外為決済では時差も要因になる。&lt;/dd&gt;
&lt;dt&gt;決済リスクの削減&lt;/dt&gt;
&lt;dd&gt;決済金額の削減には、
当事者間での債権・債務を相殺した差額分のみとするネッティング、
取引枠を設定し未決済残高を監視する。
期間の短縮には、
リコンサイル(決済結果の照合・確認)の早期化、
決済時点の繰上げ(Real-Time Gross Settlement)、
同時決済により価値交換の時差をゼロにする。&lt;/dd&gt;
&lt;dt&gt;ロスシェア・ルール&lt;/dt&gt;
&lt;dd&gt;ネット決済システムでは、支払不能参加者(defaulter)の発生により、
決済が完了しない支払指図が残るが、影響を最小限に抑えるために、
参加者が未決済残高分を負担する。
破綻行支払(defaulters pay)、生存者負担(survivors pay)、第三者負担(third parties pay)。&lt;/dd&gt;
&lt;dt&gt;流動性&lt;/dt&gt;
&lt;dd&gt;RTGSシステムでは、十分な資金源がないと決済が実行されない。
お互いに支払を待つ、すくみ状態になりやすい。&lt;/dd&gt;
&lt;dt&gt;ハイブリッド型決済&lt;/dt&gt;
&lt;dd&gt;ネット決済システムとRTGSシステムとの混合&lt;/dd&gt;
&lt;dt&gt;インテグレイテッド・システム&lt;/dt&gt;
&lt;dd&gt;ネット決済機能とRTGS機能の両方を備えたシステム&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;ランファルシー基準:&lt;/p&gt;
&lt;p&gt;1. ネッティング・システムが法的根拠をもつこと。
4. ネット負債額が最大の参加者が決済不能になった場合にも、タイムリーに決済を完了できること。&lt;/p&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;Lamfalussy-Plus&lt;/dt&gt;
&lt;dd&gt;支払不能となる参加者の数に関わらず、どのような状況下でも
確実に決済を完了できる&lt;/dd&gt;
&lt;dt&gt;S.W.I.F.T.&lt;/dt&gt;
&lt;dd&gt;Society for Worldwide Interbank Financial Telecommunication.
共通ネットワークの構築と通信フォーマットを統一し、
インターバンク取引を効率化するため、1973年にベルギーに設立された協同組合。&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
</summary><feedburner:origLink>http://michilu.com/blog/posts/130/</feedburner:origLink></entry><entry><title> metaclass memo</title><link href="http://feedproxy.google.com/~r/michilu/~3/b4O_-q9pWBk/" rel="alternate" /><updated>2008-01-17T16:12:35Z</updated><id>http://michilu.com/blog/posts/129/</id><summary type="html">
&lt;div class="section" id="python-metaclass-memo"&gt;
&lt;h1&gt;[Python]: metaclass memo&lt;/h1&gt;
&lt;p&gt;全くよく解らないので、ソースを見てみる&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://www-06.ibm.com/jp/developerworks/linux/030425/j_l-pymeta.html"&gt;http://www-06.ibm.com/jp/developerworks/linux/030425/j_l-pymeta.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Versionは2.5.1
&lt;a class="reference external" href="http://svn.python.org/view/python/tags/r251/"&gt;http://svn.python.org/view/python/tags/r251/&lt;/a&gt;
から落としてくる&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;__metaclass__&lt;/cite&gt; でgrepすると&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Modules/_ctypes/_ctypes.c&lt;/li&gt;
&lt;li&gt;Python/ceval.c&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;などが見つかる&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python/ceval.c:4060&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;PyObject&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="nf"&gt;build_class&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PyObject&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PyObject&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;bases&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PyObject&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;cite&gt;build_class&lt;/cite&gt; はPythonバイトコード命令の &lt;cite&gt;BUILD_CLASS&lt;/cite&gt; に対応している
&lt;a class="reference external" href="http://www.python.jp/doc/2.4/lib/bytecodes.html"&gt;http://www.python.jp/doc/2.4/lib/bytecodes.html&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;BUILD_CLASS&lt;/dt&gt;
&lt;dd&gt;新しいクラスオブジェクトを作成します。TOSはメソッド辞書、TOS1は基底クラスの名前のタプル、TOS2はクラス名です。&lt;/dd&gt;
&lt;/dl&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;  &lt;span class="n"&gt;PyObject&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;metaclass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PyDict_Check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;metaclass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PyDict_GetItemString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;__metaclass__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metaclass&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;Py_INCREF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metaclass&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="nf"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PyTuple_Check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bases&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;PyTuple_GET_SIZE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bases&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PyTuple_GET_ITEM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bases&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;metaclass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PyObject_GetAttrString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;__class__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metaclass&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;PyErr_Clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="n"&gt;metaclass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PyObject&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;ob_type&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="n"&gt;Py_INCREF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metaclass&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;PyObject&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PyEval_GetGlobals&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;PyDict_Check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
      &lt;span class="n"&gt;metaclass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PyDict_GetItemString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;__metaclass__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metaclass&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;metaclass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PyObject&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;PyClass_Type&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Py_INCREF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metaclass&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PyObject_CallFunctionObjArgs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metaclass&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bases&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Py_DECREF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metaclass&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;PyErr_ExceptionMatches&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PyExc_TypeError&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;cite&gt;metaclass&lt;/cite&gt; は&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;クラスの &lt;cite&gt;__metaclass__&lt;/cite&gt; を代入&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;スーパークラス( &lt;cite&gt;__bases__&lt;/cite&gt; )がある&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;1つ目のスパークラスの &lt;cite&gt;__class__&lt;/cite&gt; を代入
なければ、1つ目のスパークラスの &lt;cite&gt;ob_type&lt;/cite&gt; を代入&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Global(module)の &lt;cite&gt;__metaclass__&lt;/cite&gt; を代入&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;PyClass_Type を代入&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;が入る。
&lt;cite&gt;__metaclass__&lt;/cite&gt; を記述するということは、このステップを操作すること。&lt;/p&gt;
&lt;p&gt;Py_INCREF, Py_DECREF は参照カウンタのインクリメント/デクリメント。
&lt;a class="reference external" href="http://www.python.jp/doc/2.4/ext/refcountsInPython.html"&gt;http://www.python.jp/doc/2.4/ext/refcountsInPython.html&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="ob-type"&gt;
&lt;h2&gt;ob_type&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="http://www.python.jp/doc/2.4/api/type-structs.html"&gt;http://www.python.jp/doc/2.4/api/type-structs.html&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PyTypeObject* ob_type&lt;/p&gt;
&lt;blockquote&gt;
型自体の型、別の言い方をするとメタタイプです。 PyObject_HEAD_INIT マクロで初期化され、通常は &amp;amp;PyType_Type になります。
Python 2.2.1 およびそれ以降では基底クラスの ob_type フィールドに初期化します。 ob_type が非ゼロの場合、PyType_Ready() は このフィールドを変更しません。
2.2.1 と 2.3 以降では、サブタイプはこのフィールドを継承します。&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="pyclass-type"&gt;
&lt;h2&gt;PyClass_Type&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Objects/classobject.c:423&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;PyTypeObject&lt;/span&gt; &lt;span class="n"&gt;PyClass_Type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;PyObject_HEAD_INIT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;PyType_Type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="pyobject-head-init"&gt;
&lt;h2&gt;PyObject_HEAD_INIT&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="http://www.python.jp/doc/2.4/ext/dnt-basics.html"&gt;http://www.python.jp/doc/2.4/ext/dnt-basics.html&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;PyObject_HEAD_INIT(&amp;amp;PyType_Type)&lt;/dt&gt;
&lt;dd&gt;この場合、タイプオブジェクトの型は「type」という名前になります&lt;/dd&gt;
&lt;/dl&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
</summary><feedburner:origLink>http://michilu.com/blog/posts/129/</feedburner:origLink></entry><entry><title>GnuPG (GNU Privacy Guard)</title><link href="http://feedproxy.google.com/~r/michilu/~3/EdnzItfpY2w/" rel="alternate" /><updated>2007-12-30T07:24:55Z</updated><id>http://michilu.com/blog/posts/128/</id><summary type="html">
&lt;div class="section" id="gnupg-gnu-privacy-guard"&gt;
&lt;h1&gt;GnuPG (GNU Privacy Guard)&lt;/h1&gt;
&lt;p&gt;公開鍵方式の暗号化と著名に使われる PGP (Pretty Good Privacy) のGNU実装。&lt;/p&gt;
&lt;blockquote&gt;
&lt;img alt="http://www.gnupg.org/share/logo-gnupg-light-purple-bg.png" src="http://www.gnupg.org/share/logo-gnupg-light-purple-bg.png" /&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;GnuPG&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;&lt;a class="reference external" href="http://www.gnupg.org/"&gt;http://www.gnupg.org/&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;OpenPGP&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;&lt;a class="reference external" href="http://www.openpgp.org/"&gt;http://www.openpgp.org/&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;暗号に関する歴史は分厚い本が書けるほどの人間物語。
普段なにげに使っている暗号が、その昔にはこんなことになっていたとは。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;ジマーマン氏が語る、PGP誕生から10年の軌跡 2001/06/08&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;&lt;a class="reference external" href="http://wiredvision.jp/archives/200106/2001060806.html"&gt;http://wiredvision.jp/archives/200106/2001060806.html&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;もっと詳しい内容はオライリーのPGPで読むことができる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;PGP―暗号メールと電子署名&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;&lt;a class="reference external" href="http://www.amazon.co.jp/dp/4900900028/"&gt;http://www.amazon.co.jp/dp/4900900028/&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下、PGPがどういう理論の上に成り立っているのかの資料。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;公開鍵暗号&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;&lt;a class="reference external" href="http://ja.wikipedia.org/wiki"&gt;http://ja.wikipedia.org/wiki&lt;/a&gt;/公開鍵暗号&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;Diffie-Hellman&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;&lt;a class="reference external" href="http://ja.wikipedia.org/wiki/Diffie"&gt;http://ja.wikipedia.org/wiki/Diffie&lt;/a&gt;-Hellman鍵共有&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;RSA暗号&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;&lt;a class="reference external" href="http://ja.wikipedia.org/wiki"&gt;http://ja.wikipedia.org/wiki&lt;/a&gt;/RSA暗号&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mac 版の GnuPG をさくっと落として使ってみる&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;Mac GnuPG Downloads&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;&lt;a class="reference external" href="http://macgpg.sourceforge.net/#files"&gt;http://macgpg.sourceforge.net/#files&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;まず Version&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;gpg --version
gpg &lt;span class="o"&gt;(&lt;/span&gt;GnuPG&lt;span class="o"&gt;)&lt;/span&gt; 1.4.8
Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; 2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later &amp;lt;http://gnu.org/licenses/gpl.html&amp;gt;
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: ~/.gnupg
サポートしているアルゴリズム:
公開鍵: RSA, RSA-E, RSA-S, ELG-E, DSA
暗号法: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH
ハッシュ: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
圧縮: 無圧縮, ZIP, ZLIB, BZIP2
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;秘密鍵と公開鍵のセットを作成する&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ls .gnupg
ls: .gnupg: No such file or directory
&lt;span class="nv"&gt;$ &lt;/span&gt;gpg --gen-key
gpg &lt;span class="o"&gt;(&lt;/span&gt;GnuPG&lt;span class="o"&gt;)&lt;/span&gt; 1.4.8; Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; 2007 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

gpg: ディレクトリー「&amp;lt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&amp;gt;/.gnupg」ができました
gpg: 新しい構成ファイル「&amp;lt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&amp;gt;/.gnupg/gpg.conf」ができました
gpg: 警告: 「&amp;lt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&amp;gt;/.gnupg/gpg.conf」のオプションは起動している間、有効になりません
gpg: 鍵輪「&amp;lt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&amp;gt;/.gnupg/secring.gpg」ができました
gpg: 鍵輪「&amp;lt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&amp;gt;/.gnupg/pubring.gpg」ができました
ご希望の鍵の種類を選択してください:
   &lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt; DSAとElgamal &lt;span class="o"&gt;(&lt;/span&gt;既定&lt;span class="o"&gt;)&lt;/span&gt;
   &lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt; DSA &lt;span class="o"&gt;(&lt;/span&gt;署名のみ&lt;span class="o"&gt;)&lt;/span&gt;
   &lt;span class="o"&gt;(&lt;/span&gt;5&lt;span class="o"&gt;)&lt;/span&gt; RSA &lt;span class="o"&gt;(&lt;/span&gt;署名のみ&lt;span class="o"&gt;)&lt;/span&gt;
選択は?
DSA keypair will have 1024 bits.
ELG-E keys may be between 1024 and 4096 bits long.
What keysize &lt;span class="k"&gt;do &lt;/span&gt;you want? &lt;span class="o"&gt;(&lt;/span&gt;2048&lt;span class="o"&gt;)&lt;/span&gt; 4096
要求された鍵長は4096ビット
鍵の有効期限を指定してください。
         &lt;span class="nv"&gt;0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 鍵は無期限
      &amp;lt;n&amp;gt;  &lt;span class="o"&gt;=&lt;/span&gt; 鍵は n 日間で満了
      &amp;lt;n&amp;gt;w &lt;span class="o"&gt;=&lt;/span&gt; 鍵は n 週間で満了
      &amp;lt;n&amp;gt;m &lt;span class="o"&gt;=&lt;/span&gt; 鍵は n か月間で満了
      &amp;lt;n&amp;gt;y &lt;span class="o"&gt;=&lt;/span&gt; 鍵は n 年間で満了
鍵の有効期間は? &lt;span class="o"&gt;(&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt;
Key does not expire at all
これで正しいですか? &lt;span class="o"&gt;(&lt;/span&gt;y/N&lt;span class="o"&gt;)&lt;/span&gt; y

あなたの鍵を同定するためにユーザーIDが必要です。
このソフトは本名、コメント、電子メール・アドレスから
次の書式でユーザーIDを構成します:
    &lt;span class="s2"&gt;&amp;quot;Heinrich Heine (Der Dichter) &amp;lt;heinrichh@duesseldorf.de&amp;gt;&amp;quot;&lt;/span&gt;

本名: Takanao Endoh
電子メール・アドレス: takanao@endoh.tk
コメント:
次のユーザーIDを選択しました:
    “Takanao Endoh &amp;lt;takanao@endoh.tk&amp;gt;”

名前&lt;span class="o"&gt;(&lt;/span&gt;N&lt;span class="o"&gt;)&lt;/span&gt;、コメント&lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt;、電子メール&lt;span class="o"&gt;(&lt;/span&gt;E&lt;span class="o"&gt;)&lt;/span&gt;の変更、またはOK&lt;span class="o"&gt;(&lt;/span&gt;O&lt;span class="o"&gt;)&lt;/span&gt;か終了&lt;span class="o"&gt;(&lt;/span&gt;Q&lt;span class="o"&gt;)&lt;/span&gt;? O

秘密鍵を保護するためにパスフレーズがいります。

パスフレーズを入力:
パスフレーズを再入力:
今から長い乱数を生成します。キーボードを打つとか、マウスを動かす
とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で
乱雑さの大きないい乱数を生成しやすくなるので、お勧めいたします。
.+++++++++++++++.++++++++++++++++++++++++++++++..++++++++++.++++
.+++++++++++++++.++++++++++++++++++++++++++++++..++++++++++.++++

gpg: &amp;lt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&amp;gt;/.gnupg/trustdb.gpg: 信用データベースができました
gpg: 鍵238BFAE5を絶対的に信用するよう記録しました
公開鍵と秘密鍵を作成し、署名しました。

gpg: 信用データベースの検査
gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル
gpg: 深さ: 0  有効性:   1  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 1u
pub   1024D/238BFAE5 2007-12-23
                 指紋 &lt;span class="o"&gt;=&lt;/span&gt; 057E 2DEC AF85 95A4 41BA  6BC1 B537 0A4A 238B FAE5
uid                  Takanao Endoh &amp;lt;takanao@endoh.tk&amp;gt;
sub   4096g/******** 2007-12-23
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;でき上がった鍵の情報を見る。
fingerprint は公開鍵の digest hash&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;gpg --fingerprint
&amp;lt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&amp;gt;/.gnupg/pubring.gpg
-------------------------------
pub   1024D/238BFAE5 2007-12-23
                 指紋 &lt;span class="o"&gt;=&lt;/span&gt; 057E 2DEC AF85 95A4 41BA  6BC1 B537 0A4A 238B FAE5
uid                  Takanao Endoh &amp;lt;takanao@endoh.tk&amp;gt;
sub   4096g/******** 2007-12-23
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;公開鍵にIDを追加する。
最後に追加したIDが primary になるので、変更して保存しておく&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;gpg --edit-key 238bfae5
gpg &lt;span class="o"&gt;(&lt;/span&gt;GnuPG&lt;span class="o"&gt;)&lt;/span&gt; 1.4.8; Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; 2007 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

秘密鍵が使用できます。

pub  1024D/238BFAE5  作成: 2007-12-23  満了: 無期限      利用法: SC
                     信用: 絶対的     有効性: 絶対的
sub  4096g/********  作成: 2007-12-23  満了: 無期限      利用法: E
&lt;span class="o"&gt;[&lt;/span&gt;ultimate&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;. Takanao Endoh &amp;lt;takanao@endoh.tk&amp;gt;

コマンド&amp;gt; &lt;span class="nb"&gt;help&lt;/span&gt;
...
コマンド&amp;gt; adduid
本名: MiCHiLU
電子メール・アドレス: dj@michilu.com
コメント:
次のユーザーIDを選択しました:
    “MiCHiLU &amp;lt;dj@michilu.com&amp;gt;”

名前&lt;span class="o"&gt;(&lt;/span&gt;N&lt;span class="o"&gt;)&lt;/span&gt;、コメント&lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt;、電子メール&lt;span class="o"&gt;(&lt;/span&gt;E&lt;span class="o"&gt;)&lt;/span&gt;の変更、またはOK&lt;span class="o"&gt;(&lt;/span&gt;O&lt;span class="o"&gt;)&lt;/span&gt;か終了&lt;span class="o"&gt;(&lt;/span&gt;Q&lt;span class="o"&gt;)&lt;/span&gt;? O

次のユーザーの秘密鍵のロックを解除するには
パスフレーズがいります:“Takanao Endoh &amp;lt;takanao@endoh.tk&amp;gt;”
1024ビットDSA鍵, ID 238BFAE5作成日付は2007-12-23

pub  1024D/238BFAE5  作成: 2007-12-23  満了: 無期限      利用法: SC
                     信用: 絶対的     有効性: 絶対的
sub  4096g/********  作成: 2007-12-23  満了: 無期限      利用法: E
&lt;span class="o"&gt;[&lt;/span&gt;ultimate&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;. Takanao Endoh &amp;lt;takanao@endoh.tk&amp;gt;
&lt;span class="o"&gt;[&lt;/span&gt; unknown&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;  MiCHiLU &amp;lt;dj@michilu.com&amp;gt;

コマンド&amp;gt; uid 1

pub  1024D/238BFAE5  作成: 2007-12-23  満了: 無期限      利用法: SC
                     信用: 絶対的     有効性: 絶対的
sub  4096g/********  作成: 2007-12-23  満了: 無期限      利用法: E
&lt;span class="o"&gt;[&lt;/span&gt;ultimate&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;* Takanao Endoh &amp;lt;takanao@endoh.tk&amp;gt;
&lt;span class="o"&gt;[&lt;/span&gt; unknown&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;  MiCHiLU &amp;lt;dj@michilu.com&amp;gt;

コマンド&amp;gt; primary
コマンド&amp;gt; save
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;鍵のIDリストを表示して確認する&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;gpg --list-sigs
&amp;lt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&amp;gt;/.gnupg/pubring.gpg
-------------------------------
pub   1024D/238BFAE5 2007-12-23
uid                  Takanao Endoh &amp;lt;takanao@endoh.tk&amp;gt;
sig 3        238BFAE5 2007-12-23  Takanao Endoh &amp;lt;takanao@endoh.tk&amp;gt;
uid                  MiCHiLU &amp;lt;dj@michilu.com&amp;gt;
sig 3        238BFAE5 2007-12-23  Takanao Endoh &amp;lt;takanao@endoh.tk&amp;gt;
sub   4096g/******** 2007-12-23
sig          238BFAE5 2007-12-23  Takanao Endoh &amp;lt;takanao@endoh.tk&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;鍵は binary なのでTEXT形式で貼付けたい場合は、exportして ASCII形式に変換する&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;gpg -a --export
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.8 &lt;span class="o"&gt;(&lt;/span&gt;Darwin&lt;span class="o"&gt;)&lt;/span&gt;

mQGiBEduPoERBACTFOxoGDSsF7LDcMW48rOVEdl151aNj/bG+nl5ZSOfyKfp3U2e
cXJk4Y5JSwsatbnlkFZSyntjXmBfeDYmu5lcgU4y8v+NWyW7laF60Dj4+HzulyAR
...
BQJHbj6BAhsMAAoJELU3Ckoji/rlJ88Aniy2UH6dtxxgxdB6zlGx4/K8amEIAJ0Z
xkQCthPdsUV6TNEPLx+xuVRZOg&lt;span class="o"&gt;==&lt;/span&gt;
&lt;span class="o"&gt;=&lt;/span&gt;cuST
-----END PGP PUBLIC KEY BLOCK-----
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;さて、公開鍵はどのようにして配布するのか。&lt;/p&gt;
&lt;p&gt;公開鍵は公に晒されても無問題なので、どのようにして配布してもよい。
しかし、その公開鍵が意図する人物によって作成されたという保証はない。
fingerprint を当人から直接聞いて確認するのが、もっとも確か。
これを補助する仕組みとして、「信用の和」 (Web of trust) がある。&lt;/p&gt;
&lt;p&gt;公開鍵を登録できるサーバが公開されている&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;NIC-SE PGP Keyserver&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;&lt;a class="reference external" href="http://subkeys.pgp.net/"&gt;http://subkeys.pgp.net/&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;公開鍵を鍵サーバに送信する&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;gpg --send-keys 238BFAE5
gpg: 鍵238BFAE5をhkpサーバーsubkeys.pgp.netへ送信
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;登録した公開鍵を鍵サーバから検索する&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;gpg --search-keys 238BFAE5
gpg: “238BFAE5”をhkpサーバーsubkeys.pgp.netから検索
&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;     MiCHiLU &amp;lt;dj@michilu.com&amp;gt;
        Takanao Endoh &amp;lt;takanao@endoh.tk&amp;gt;
          1024 bit DSA key 238BFAE5, 作成: 2007-12-23
Keys 1-1 of 1 &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;238BFAE5&amp;quot;&lt;/span&gt;.  番号&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt;、N&lt;span class="o"&gt;)&lt;/span&gt;次、またはQ&lt;span class="o"&gt;)&lt;/span&gt;中止を入力してください &amp;gt;1
gpg: 鍵238BFAE5をhkpからサーバーsubkeys.pgp.netに要求
gpg: 鍵238BFAE5:“Takanao Endoh &amp;lt;takanao@endoh.tk&amp;gt;”変更なし
gpg:     処理数の合計: 1
gpg:         変更なし: 1
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;PGPの作者 Philip R. Zimmermann の鍵ももちろんある&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;gpg --search-keys c7a966dd
gpg: “c7a966dd”をhkpサーバーsubkeys.pgp.netから検索
&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;     Philip R. Zimmermann &amp;lt;prz@acm.org&amp;gt;
          1024 bit RSA key C7A966DD, 作成: 1993-05-21
Keys 1-1 of 1 &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;c7a966dd&amp;quot;&lt;/span&gt;.  番号&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt;、N&lt;span class="o"&gt;)&lt;/span&gt;次、またはQ&lt;span class="o"&gt;)&lt;/span&gt;中止を入力してください &amp;gt;Q
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
</summary><feedburner:origLink>http://michilu.com/blog/posts/128/</feedburner:origLink></entry><entry><title> Google Gears</title><link href="http://feedproxy.google.com/~r/michilu/~3/a3u6Y9BflDo/" rel="alternate" /><updated>2007-12-15T13:20:46Z</updated><id>http://michilu.com/blog/posts/127/</id><summary type="html">
&lt;div class="section" id="django-s6-google-gears"&gt;
&lt;h1&gt;[Django][s6]: Google Gears&lt;/h1&gt;
&lt;p&gt;2007/12/12 翔泳社さんにて開催の &lt;a class="reference external" href="http://www.python.jp/Zope/workshop/200712"&gt;Python Workshop the Edge 2007&lt;/a&gt; でLTを発表させていただきました。資料を掲載します。当日は持ち時間ちょうどでしたので触れませんでしたがDjangoついての情報も載せています。&lt;/p&gt;
&lt;div class="section" id="id1"&gt;
&lt;h2&gt;自己紹介&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;id:MiCHiLU&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://michilu.com"&gt;http://michilu.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="mailto:takanao&amp;#64;endoh.tk"&gt;takanao&amp;#64;endoh.tk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="django"&gt;
&lt;h2&gt;Django オンラインドキュメント和訳&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="http://michilu.com/django/doc-ja/index/"&gt;http://michilu.com/django/doc-ja/index/&lt;/a&gt;&lt;/p&gt;
&lt;div align="center" class="align-center"&gt;&lt;img alt="/static/media/20071212/djangoproject120x25.gif" class="align-center" src="/static/media/20071212/djangoproject120x25.gif" style="width: 20%;" /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="google-code"&gt;
&lt;h2&gt;Google Code&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="http://code.google.com/u/Takanao.Endoh/"&gt;http://code.google.com/u/Takanao.Endoh/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="google-gears"&gt;
&lt;h2&gt;Google Gears&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="http://gears.google.com/"&gt;http://gears.google.com/&lt;/a&gt;
&lt;a class="reference external" href="http://code.google.com/p/google-gears/"&gt;http://code.google.com/p/google-gears/&lt;/a&gt;&lt;/p&gt;
&lt;div align="center" class="align-center"&gt;&lt;img alt="/static/media/20071212/icon.png" class="align-center" src="/static/media/20071212/icon.png" style="width: 20%;" /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="google-gears-is"&gt;
&lt;h2&gt;Google Gears is&lt;/h2&gt;
&lt;p&gt;an open source browser extension that lets developers create web applications that can run offline.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Google Reader (en)&lt;/li&gt;
&lt;li&gt;Django オンラインドキュメント和訳&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="require"&gt;
&lt;h2&gt;Require&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Firefox 1.5+, IE 6+ (Safari)&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="features"&gt;
&lt;h2&gt;Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;LocalServer&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Databese&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;WorkerPool&lt;/p&gt;
&lt;img alt="/static/media/20071212/icon.png" src="/static/media/20071212/icon.png" style="width: 15%;" /&gt;
&lt;img alt="/static/media/20071212/localserver.gif" src="/static/media/20071212/localserver.gif" style="width: 20%;" /&gt;
&lt;img alt="/static/media/20071212/database.gif" src="/static/media/20071212/database.gif" style="width: 20%;" /&gt;
&lt;img alt="/static/media/20071212/workerpool.gif" src="/static/media/20071212/workerpool.gif" style="width: 20%;" /&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="localserver"&gt;
&lt;h2&gt;LocalServer&lt;/h2&gt;
&lt;div align="center" class="align-center"&gt;&lt;img alt="/static/media/20071212/localserver.gif" class="align-center" src="/static/media/20071212/localserver.gif" style="width: 20%;" /&gt;&lt;/div&gt;
&lt;p&gt;Cache and serve application resources locally
(HTML, JavaScript, images, etc.)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="database"&gt;
&lt;h2&gt;Database&lt;/h2&gt;
&lt;div align="center" class="align-center"&gt;&lt;img alt="/static/media/20071212/database.gif" class="align-center" src="/static/media/20071212/database.gif" style="width: 20%;" /&gt;&lt;/div&gt;
&lt;p&gt;Store data locally in a fully-searchable relational database
(SQLite)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="workerpool"&gt;
&lt;h2&gt;WorkerPool&lt;/h2&gt;
&lt;div align="center" class="align-center"&gt;&lt;img alt="/static/media/20071212/workerpool.gif" class="align-center" src="/static/media/20071212/workerpool.gif" style="width: 20%;" /&gt;&lt;/div&gt;
&lt;p&gt;Run asynchronous Javascript to improve application responsiveness
(threading)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="demo"&gt;
&lt;h2&gt;DEMO&lt;/h2&gt;
&lt;p&gt;Django オンラインドキュメント和訳
&lt;a class="reference external" href="http://michilu.com/django/doc-ja/index/"&gt;http://michilu.com/django/doc-ja/index/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="sample-code"&gt;
&lt;h2&gt;Sample Code&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="section" id="django-views"&gt;
&lt;h2&gt;Django Views&lt;/h2&gt;
&lt;pre class="literal-block"&gt;
def doc_index_json(request, target_dir, base_url, callback=None):
    result = dict()
    timestamp_dict = util.get_timestamp(target_dir, extension=&amp;quot;.txt&amp;quot;)
    for key, value in timestamp_dict.items():
        key = base_url % key[:key.rindex(&amp;quot;.&amp;quot;)]
        result[key] = dateformat.DateFormat(value).format(&amp;quot;r&amp;quot;)
    result = &amp;quot;[%s]&amp;quot; % simplejson.dumps(result)
    if callback:
        result = to_jsonp(callback, result)
    return HttpResponse(result, mimetype=mimetype(&amp;quot;json&amp;quot;))
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="id2"&gt;
&lt;h2&gt;Django Views&lt;/h2&gt;
&lt;p&gt;詳しくは&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://michilu.googlecode.com/svn/trunk/doc/views.py"&gt;http://michilu.googlecode.com
/svn/trunk/doc/views.py&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="javascript"&gt;
&lt;h2&gt;JavaScript&lt;/h2&gt;
&lt;pre class="literal-block"&gt;
function updating (JSON) { count.reset();
    for (var key in JSON){
        if ( localServer.isCaptured(url) &amp;amp;&amp;amp;
            Date.parse(JSON[key]) &amp;lt;= Date.parse(
                localServer.getHeader(url, &amp;quot;Last-Modified&amp;quot;))) {
        } else { count.up();
            localServer.capture(url, function(){count.down();});
        };
    };
};
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="id3"&gt;
&lt;h2&gt;JavaScript&lt;/h2&gt;
&lt;p&gt;詳しくは&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://michilu.com/static/doc-ja/js/site.js"&gt;http://michilu.com/static/doc-ja/js/site.js&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="google-gears-databese"&gt;
&lt;h2&gt;Google Gears Databese&lt;/h2&gt;
&lt;p&gt;SQL on JavaScript&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="google-gears-orm"&gt;
&lt;h2&gt;Google Gears ORM&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="http://www.urielkatz.com/archive/tag/GearsORM/"&gt;http://www.urielkatz.com/archive/tag/GearsORM/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="with-django"&gt;
&lt;h2&gt;with Django&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="section" id="django-offline"&gt;
&lt;h2&gt;Django Offline&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="http://code.google.com/p/django-offline/"&gt;http://code.google.com/p/django-offline/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id4"&gt;
&lt;h2&gt;＞＜&lt;/h2&gt;
&lt;p&gt;ソースは まだ ないよ (はぁと)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="architecture"&gt;
&lt;h2&gt;Architecture&lt;/h2&gt;
&lt;pre class="literal-block"&gt;
UI
 |
jQuery
 |
Switcher  &amp;lt;-- (Online) --&amp;gt;  Django  &amp;lt;--&amp;gt;  Database
 ^
 |
 +- (Online? Offline?) --&amp;gt;  Google Gears (Database)
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="id5"&gt;
&lt;h2&gt;Architecture&lt;/h2&gt;
&lt;p&gt;&lt;img align="middle" alt="Architecture" class="align-middle" src="/static/media/20071212/Ggarch.jpg" style="width: 100%;" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;via &lt;a class="reference external" href="http://wiki.apexdevnet.com/index.php/Building_Offline_Salesforce_Applications_with_Google_Gears_and_Google_Web_Toolkit"&gt;apexdevnet.com&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id6"&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Google Gears は便利&lt;/p&gt;
&lt;p&gt;Django なら&lt;/p&gt;
&lt;p&gt;「 &lt;strong&gt;オフ&lt;/strong&gt; ラインドキュメント和訳 」&lt;/p&gt;
&lt;p&gt;があるよ！&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="by"&gt;
&lt;h2&gt;&lt;img align="middle" alt="by" class="align-middle" src="/static/media/20071212/sleepy.jpg" style="width: 100%;" /&gt;&lt;/h2&gt;
&lt;p&gt;ご清聴ありがとうございました&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;!-- s6.page.tmp({
    separator: 'fade',
    styleBase: 'custom',
    styles: [
        { left: '0%', top: '-15%', width: '100%' },
        { display: 'none', width: '100%', textAlign: 'center', top: '90%', background: 'black' }
    ],
    actions: [
        [
            [1, 'fade in', 0.4]
        ]
    ]
}); --&gt;
&lt;/div&gt;
&lt;div class="section" id="extras"&gt;
&lt;h2&gt;Extras&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="section" id="django-ja"&gt;
&lt;h2&gt;Django-ja 絶賛募集中!!!&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="section" id="id7"&gt;
&lt;h2&gt;和訳してくれる人も募集中!!!&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="section" id="django-ja-at-lingr"&gt;
&lt;h2&gt;Django-ja at lingr&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="http://www.lingr.com/room/django-ja"&gt;http://www.lingr.com/room/django-ja&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id8"&gt;
&lt;h2&gt;Django 紹介&lt;/h2&gt;
&lt;p&gt;MVC vs MVT,
TESTツール付属,
バッテリ付属,
スケーラビリティ,
SQLArchemy,
Cache,
クールなAdmin画面,
Middleware,
Generic Views&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="and-more-google-code"&gt;
&lt;h2&gt;and more Google Code&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://code.google.com/p/django-rest-interface/"&gt;Django REST Interface&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://code.google.com/p/django-openid-auth/"&gt;Django OpenID Auth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://code.google.com/p/django-mobilejp/"&gt;Django Mobile JP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="documents"&gt;
&lt;h2&gt;Documents&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://code.djangoproject.com/wiki/TitleIndex"&gt;本家Wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://www.ueblog.org/mediawiki/index.php?title=Django"&gt;日本語Wiki&lt;/a&gt; hosted by &lt;a class="reference external" href="http://www.ueblog.org/blog/"&gt;ueblog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="the-end"&gt;
&lt;h2&gt;The END&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
</summary><feedburner:origLink>http://michilu.com/blog/posts/127/</feedburner:origLink></entry><entry><title> hatena.api.auth</title><link href="http://feedproxy.google.com/~r/michilu/~3/O4G4Hvhm_A0/" rel="alternate" /><updated>2007-11-08T18:35:22Z</updated><id>http://michilu.com/blog/posts/126/</id><summary type="html">
&lt;div class="section" id="python-hatena-api-auth"&gt;
&lt;h1&gt;[Python]: hatena.api.auth&lt;/h1&gt;
&lt;p&gt;見つからなかったので書きました。 Google code に python-hatena-api を登録。
&lt;a class="reference external" href="http://python-hatena-api.googlecode.com/svn/trunk/hatena/api/auth.py"&gt;http://python-hatena-api.googlecode.com/svn/trunk/hatena/api/auth.py&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://search.cpan.org/src/NAOYA/Hatena-API-Auth-0.05/t/01-methods.t"&gt;http://search.cpan.org/src/NAOYA/Hatena-API-Auth-0.05/t/01-methods.t&lt;/a&gt;
を参考に、 api_sig と uri_to_login まで。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;md5&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Auth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;auth.hatena.ne.jp&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;auth&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;http&amp;quot;&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;secret&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;api_sig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargv&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;

        &lt;span class="n"&gt;sig_dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;sig_dict&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;sig_keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sig_dict&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;sig_keys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="n"&gt;sig_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sig_keys&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;sig_list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;
                &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;sig_dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;sig_string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sig_list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;md5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%s%s&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;sig_string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;uri_to_login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargv&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;api_sig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api_sig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargv&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;query_string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;amp;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()])&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;://&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;?&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; \
            &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query_string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
</summary><feedburner:origLink>http://michilu.com/blog/posts/126/</feedburner:origLink></entry><entry><title> Python チュートリアル メモ2</title><link href="http://feedproxy.google.com/~r/michilu/~3/X6Q6r-y_s2A/" rel="alternate" /><updated>2007-11-01T18:01:11Z</updated><id>http://michilu.com/blog/posts/125/</id><summary type="html">
&lt;div class="section" id="python-python-2"&gt;
&lt;h1&gt;[Python]: Python チュートリアル メモ2&lt;/h1&gt;
&lt;p&gt;Guidoのメモ書きのメモ書き。(6章〜最終章まで。ほか)&lt;/p&gt;
&lt;p&gt;format strings は vars() を使うと楽。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;spam&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;SPAM!&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;egg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;EGG!!&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;bacon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;BACON!!!&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%(spam)s&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="si"&gt;%(egg)s&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="si"&gt;%(bacon)s&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nb"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="s"&gt;&amp;#39;SPAM!, EGG!!, BACON!!!&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ファイルライクオブジェクトは、そのままループにかけられる。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&amp;gt;&amp;gt;&amp;gt; from StringIO import StringIO
&amp;gt;&amp;gt;&amp;gt; s
&amp;#39;SPAM!\nEGG!!\nBACON!!!&amp;#39;
&amp;gt;&amp;gt;&amp;gt; s = StringIO(s)
&amp;gt;&amp;gt;&amp;gt; for i in s:
...     print i
...
SPAM!

EGG!!

BACON!!!
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;例外はインスタンス化して送出する(されている)。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;import os&lt;/cite&gt; と書くのは、os.open が built-in の open を上書きしないようにするため。&lt;/p&gt;
&lt;p&gt;対話モードのインタプリタを起動するときに PYTHONSTARTUP に指定されたファイルが実行される。&lt;/p&gt;
&lt;p&gt;module を生成する。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;exec&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;x = 1&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;imp&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;imp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new_module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;foo&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;built&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__dict__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;
&lt;span class="mf"&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Via nishio.&lt;/p&gt;
&lt;p&gt;リストの範囲外を取得する。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;nothing&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="s"&gt;&amp;#39;nothing&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Via &lt;a class="reference external" href="http://d.hatena.ne.jp/morchin/20070914#p1"&gt;http://d.hatena.ne.jp/morchin/20070914#p1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;generator をコピーしたら元の generator を操作してはいけない。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;itertools&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;     &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;     &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;itertools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tee&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="mf"&gt;1&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="mf"&gt;2&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="mf"&gt;2&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;------------------------------------------------------------&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;lt;ipython console&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="err"&gt;?&lt;/span&gt;
&lt;span class="ne"&gt;StopIteration&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Via [Python] ジェネレータのコピー &lt;a class="reference external" href="http://d.hatena.ne.jp/morchin/20070829#p1"&gt;http://d.hatena.ne.jp/morchin/20070829#p1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;逆ポーランド記法&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nb"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;

&lt;span class="nd"&gt;@_calc&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;()):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;=&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;  result &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s"&gt;&amp;quot;+&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;&amp;quot;-&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;&amp;quot;*&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;__main__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;53+2*4-3/=&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;12+34+*=&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;0 53 + 2 * 4 - 3 / =&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;0 12 + 3 4 + * =&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
</summary><feedburner:origLink>http://michilu.com/blog/posts/125/</feedburner:origLink></entry><entry><title> pyhabu global.cfgをオプションで渡すpatch</title><link href="http://feedproxy.google.com/~r/michilu/~3/qXgiQ93FnTU/" rel="alternate" /><updated>2007-10-25T07:10:58Z</updated><id>http://michilu.com/blog/posts/124/</id><summary type="html">
&lt;div class="section" id="python-pyhabu-global-cfg-patch"&gt;
&lt;h1&gt;[Python]: pyhabu global.cfgをオプションで渡すpatch&lt;/h1&gt;
&lt;p&gt;開発用とプロダクション用とで、globalセクションを簡単に分けられるので便利。
includeに渡されたYAMLでupdateします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;#プロダクション用&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;runhabu.py config/spam.cfg
...
&lt;span class="c"&gt;#debug用&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;runhabu.py config/spam.cfg --include&lt;span class="o"&gt;=&lt;/span&gt;config/debug.cfg
...
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;config/spam.cfg&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="l-Scalar-Plain"&gt;global&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
  &lt;span class="l-Scalar-Plain"&gt;timezone&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;Asia/Tokyo&lt;/span&gt;
  &lt;span class="l-Scalar-Plain"&gt;log&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;log/pyhabu_log&lt;/span&gt;
  &lt;span class="l-Scalar-Plain"&gt;loglevel&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;CRITICAL&lt;/span&gt;

&lt;span class="l-Scalar-Plain"&gt;pipeline&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
  &lt;span class="l-Scalar-Plain"&gt;rss_fetcher&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
    &lt;span class="p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;module&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;subscription.config&lt;/span&gt;
      &lt;span class="l-Scalar-Plain"&gt;config&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
        &lt;span class="l-Scalar-Plain"&gt;feed&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
          &lt;span class="p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;http://d.hatena.ne.jp/johzan/rss2&lt;/span&gt;
        &lt;span class="l-Scalar-Plain"&gt;file&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
    &lt;span class="p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;module&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;filter.grep&lt;/span&gt;
      &lt;span class="l-Scalar-Plain"&gt;config&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
        &lt;span class="l-Scalar-Plain"&gt;str&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
          &lt;span class="l-Scalar-Plain"&gt;title&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;巡回&lt;/span&gt;
    &lt;span class="p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;module&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;filter.select_anchor&lt;/span&gt;
    &lt;span class="p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;module&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;publisher.rssfeeder&lt;/span&gt;
      &lt;span class="l-Scalar-Plain"&gt;config&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
        &lt;span class="l-Scalar-Plain"&gt;title&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;常山日記 - 巡回&lt;/span&gt;
        &lt;span class="l-Scalar-Plain"&gt;link&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;http://d.hatena.ne.jp/johzan/searchdiary?word=%BD%E4%B2%F3&lt;/span&gt;
        &lt;span class="l-Scalar-Plain"&gt;file&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;published/feeds/johzan_junkai.xml&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;config/debug.cfg&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="l-Scalar-Plain"&gt;global&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
  &lt;span class="l-Scalar-Plain"&gt;timezone&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;Asia/Tokyo&lt;/span&gt;
  &lt;span class="l-Scalar-Plain"&gt;log&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;stdout&lt;/span&gt;
  &lt;span class="l-Scalar-Plain"&gt;loglevel&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;DEBUG&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;include_option.diff&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="gh"&gt;Index: habu/__init__.py&lt;/span&gt;
&lt;span class="gh"&gt;===================================================================&lt;/span&gt;
&lt;span class="gd"&gt;--- habu/__init__.py        (revision 87)&lt;/span&gt;
&lt;span class="gi"&gt;+++ habu/__init__.py        (working copy)&lt;/span&gt;
&lt;span class="gu"&gt;@@ -166,8 +166,10 @@&lt;/span&gt;
         self.scheduler = None
         self.servers = []

&lt;span class="gd"&gt;-    def load(self, yamlStream):&lt;/span&gt;
&lt;span class="gi"&gt;+    def load(self, yamlStream, includeStream=None):&lt;/span&gt;
         config = yaml.load(yamlStream)
&lt;span class="gi"&gt;+        if includeStream:&lt;/span&gt;
&lt;span class="gi"&gt;+            config.update(yaml.load(includeStream))&lt;/span&gt;
         self.environ = config.setdefault(&amp;quot;global&amp;quot;, None)
         self.lineConfigs = config.setdefault(&amp;quot;pipeline&amp;quot;, [])
         self._loadAfter(config)
&lt;span class="gh"&gt;Index: runhabu.py&lt;/span&gt;
&lt;span class="gh"&gt;===================================================================&lt;/span&gt;
&lt;span class="gd"&gt;--- runhabu.py      (revision 87)&lt;/span&gt;
&lt;span class="gi"&gt;+++ runhabu.py      (working copy)&lt;/span&gt;
&lt;span class="gu"&gt;@@ -1,3 +1,5 @@&lt;/span&gt;
&lt;span class="gi"&gt;+#! /usr/bin/env python&lt;/span&gt;
&lt;span class="gi"&gt;+&lt;/span&gt;
 from twisted.internet import reactor, defer
 import habu
 import habu.log as log
&lt;span class="gu"&gt;@@ -42,7 +44,7 @@&lt;/span&gt;
                                          &amp;quot;download-module=&amp;quot;, &amp;quot;download-url=&amp;quot;,
                                          &amp;quot;log-level=&amp;quot;, &amp;quot;log-file=&amp;quot;,
                                          &amp;quot;proxy-host=&amp;quot;, &amp;quot;proxy-port=&amp;quot;,
&lt;span class="gd"&gt;-                                         &amp;quot;pid-file=&amp;quot;])&lt;/span&gt;
&lt;span class="gi"&gt;+                                         &amp;quot;pid-file=&amp;quot;, &amp;quot;include=&amp;quot;])&lt;/span&gt;
     except:
         printUsage(args[0])

&lt;span class="gu"&gt;@@ -88,12 +90,19 @@&lt;/span&gt;
             bag[&amp;quot;url&amp;quot;] = arg
         elif opt == &amp;quot;--pid-file&amp;quot;:
             bag[&amp;quot;pid-file&amp;quot;] = arg
&lt;span class="gi"&gt;+        elif opt == &amp;quot;--include&amp;quot;:&lt;/span&gt;
&lt;span class="gi"&gt;+            bag[&amp;quot;include&amp;quot;] = arg&lt;/span&gt;
&lt;span class="gi"&gt;+            if not os.path.exists(bag[&amp;quot;include&amp;quot;]):&lt;/span&gt;
&lt;span class="gi"&gt;+                printUsage(args[0])&lt;/span&gt;

     return cfgFile, bag

 def prepare(cfgFile, bag):
     mgr = habu.Habu()
&lt;span class="gd"&gt;-    mgr.load(open(cfgFile).read())&lt;/span&gt;
&lt;span class="gi"&gt;+    cfg = (open(cfgFile).read(),)&lt;/span&gt;
&lt;span class="gi"&gt;+    if bag.get(&amp;quot;include&amp;quot;):&lt;/span&gt;
&lt;span class="gi"&gt;+        cfg = cfg + (open(bag.get(&amp;quot;include&amp;quot;)).read(),)&lt;/span&gt;
&lt;span class="gi"&gt;+    mgr.load(*cfg)&lt;/span&gt;
     mgr.addPluginPath(bag.get(&amp;quot;plugin-path&amp;quot;, None))
     mgr.setProxy(bag.get(&amp;quot;proxy-host&amp;quot;, None), bag.get(&amp;quot;proxy-port&amp;quot;, 0))
     if not mgr.getPipelines():
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
</summary><feedburner:origLink>http://michilu.com/blog/posts/124/</feedburner:origLink></entry><entry><title> LDRに はてスタ をつけるGreasemonkey</title><link href="http://feedproxy.google.com/~r/michilu/~3/u_9utJcf7J8/" rel="alternate" /><updated>2007-10-25T07:07:23Z</updated><id>http://michilu.com/blog/posts/123/</id><summary type="html">
&lt;div class="section" id="ecmascript-ldr-greasemonkey"&gt;
&lt;h1&gt;[ECMAScript]: LDRに はてスタ をつけるGreasemonkey&lt;/h1&gt;
&lt;p&gt;livedoor readerに &lt;cite&gt;はてなスター&lt;/cite&gt; をつける。Safariで動くのが見つからなかったので。
何を監視すればいいのかわからず、てけとうに3秒待って表示。
便利だね、Greasemonkeyって。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ldr_with_hatenaster.user.js&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;// ==UserScript==&lt;/span&gt;
&lt;span class="c"&gt;// @name        LDR with Hatena Star&lt;/span&gt;
&lt;span class="c"&gt;// @namespace   http://michilu.com/&lt;/span&gt;
&lt;span class="c"&gt;// @include     http://reader.livedoor.com/reader/*&lt;/span&gt;
&lt;span class="c"&gt;// @version     0.1&lt;/span&gt;
&lt;span class="c"&gt;// ==/UserScript==&lt;/span&gt;

&lt;span class="c"&gt;// based on http://la.ma.la/blog/diary_200707121316.htm&lt;/span&gt;
&lt;span class="c"&gt;// based on http://d.hatena.ne.jp/KGA/20070929/1190993663&lt;/span&gt;
&lt;span class="c"&gt;// based on http://michilu.com/blog/posts/123/&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;script&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;http://s.hatena.ne.jp/js/HatenaStar.js&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;charset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;unsafeWindow&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;undefined&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;unsafeWindow&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Hatena&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="nx"&gt;clearInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Hatena&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Star&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
                            &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SiteConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                                    &lt;span class="nx"&gt;entryNodes&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                                            &lt;span class="s1"&gt;&amp;#39;div.item&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                                                    &lt;span class="nx"&gt;uri&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;h2.item_title a&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                                                    &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;h2.item_title&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                                                    &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;h2.item_title&amp;#39;&lt;/span&gt;
                                            &lt;span class="p"&gt;}&lt;/span&gt;
                                    &lt;span class="p"&gt;}&lt;/span&gt;
                            &lt;span class="p"&gt;};&lt;/span&gt;
                            &lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;channel_widgets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;hatena_star&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
                                    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
                                            &lt;span class="nx"&gt;clearTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                                            &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EntryLoader&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                                            &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;entries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                                            &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;entries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                                            &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                                            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                                                    &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;entries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                                            &lt;span class="p"&gt;};&lt;/span&gt;
                                    &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                            &lt;span class="p"&gt;});&lt;/span&gt;
                    &lt;span class="p"&gt;})();&lt;/span&gt;
            &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;})();&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;livedoor readerにいろいろつける
&lt;a class="reference external" href="http://la.ma.la/blog/diary_200703221812.htm"&gt;http://la.ma.la/blog/diary_200703221812.htm&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</summary><feedburner:origLink>http://michilu.com/blog/posts/123/</feedburner:origLink></entry><entry><title> Python版Plagger pyhabuのpluginを作ってみる</title><link href="http://feedproxy.google.com/~r/michilu/~3/2HjgjBkgq3g/" rel="alternate" /><updated>2007-10-15T18:00:01Z</updated><id>http://michilu.com/blog/posts/122/</id><summary type="html">
&lt;div class="section" id="python-python-plagger-pyhabu-plugin"&gt;
&lt;h1&gt;[Python]: Python版Plagger pyhabuのpluginを作ってみる&lt;/h1&gt;
&lt;p&gt;&lt;a class="reference external" href="http://sourceforge.jp/projects/pyhabu"&gt;pyhabu&lt;/a&gt; のpluginsを作ってみる。 &lt;a class="reference external" href="http://d.hatena.ne.jp/johzan/searchdiary?word=%BD%E4%B2%F3"&gt;常山フィード&lt;/a&gt; を1リンクにつき1エントリへ分解する。&lt;/p&gt;
&lt;p&gt;まず、XML parserを用意します。
処理速度重視の &lt;a class="reference external" href="http://pypi.python.org/pypi/lxml"&gt;lxml&lt;/a&gt; と、インストールがらくちんな &lt;a class="reference external" href="http://www.crummy.com/software/BeautifulSoup/"&gt;BeautifulSoup&lt;/a&gt; を。&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://michilu.com/blog/posts/73/"&gt;lxmlのインストール&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://www.crummy.com/software/BeautifulSoup/download/BeautifulSoup.py"&gt;http://www.crummy.com/software/BeautifulSoup/download/BeautifulSoup.py&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;lxmlを使ってみる&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;lxml&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;StringIO&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StringIO&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HTMLParser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;test&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;page title&amp;lt;a href=&amp;quot;url&amp;quot;&amp;gt;TEST&amp;lt;/a&amp;gt;&amp;lt;/h3&amp;gt;&amp;#39;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;StringIO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;anchor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xpath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;//*[@href]&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attrib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;href&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="s"&gt;&amp;#39;url&amp;#39;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
&lt;span class="s"&gt;&amp;#39;TEST&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;HTMLParser&lt;/strong&gt; を使うと多少いい加減なHTMLでもそれなりに解釈します。
&lt;strong&gt;tree.xpath(&amp;quot;//*[&amp;#64;href]&amp;quot;)&lt;/strong&gt; ではXPath指定で &lt;strong&gt;href&lt;/strong&gt; 属性を持つ要素を抜き出しています。&lt;/p&gt;
&lt;p&gt;BeautifulSoupを使ってみる&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;BeautifulSoup&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BeautifulSoup&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;test&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;page title&amp;lt;a href=&amp;quot;url&amp;quot;&amp;gt;TEST&amp;lt;/a&amp;gt;&amp;lt;/h3&amp;gt;&amp;#39;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;anchor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BeautifulSoup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;findAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;href&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="s"&gt;u&amp;#39;url&amp;#39;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;
&lt;span class="s"&gt;u&amp;#39;TEST&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;BeautifulSoupは素でいい加減なHTMLを解釈できます。
いまのところXPathが使えないので &lt;strong&gt;findAll&lt;/strong&gt; で&amp;lt;a&amp;gt;タグを検索します。&lt;/p&gt;
&lt;p&gt;ここまででXMLの調理方法はOK :-)
次にpyhabuのレシピを考えます。
付属の &lt;strong&gt;habu.cfg&lt;/strong&gt; をカスタマイズしてベースを作ってみます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;johzan_feed.cfg&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="l-Scalar-Plain"&gt;global&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
  &lt;span class="l-Scalar-Plain"&gt;timezone&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;Asia/Tokyo&lt;/span&gt;
  &lt;span class="l-Scalar-Plain"&gt;log&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;stdout&lt;/span&gt;

&lt;span class="l-Scalar-Plain"&gt;pipeline&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
  &lt;span class="l-Scalar-Plain"&gt;rss_fetcher&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
    &lt;span class="p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;module&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;subscription.config&lt;/span&gt;
      &lt;span class="l-Scalar-Plain"&gt;config&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
        &lt;span class="l-Scalar-Plain"&gt;feed&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
          &lt;span class="p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;http://d.hatena.ne.jp/johzan/rss2&lt;/span&gt;
    &lt;span class="p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;module&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;publisher.rssfeeder&lt;/span&gt;
      &lt;span class="l-Scalar-Plain"&gt;config&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
        &lt;span class="l-Scalar-Plain"&gt;file&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;johzan_feed.rss&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;余分なものをそぎ落とし &lt;strong&gt;subscription.config&lt;/strong&gt; のソースに &lt;strong&gt;http://d.hatena.ne.jp/johzan/rss2&lt;/strong&gt; を、
出力のファイル名を &lt;strong&gt;johzan_feed.rss&lt;/strong&gt; にしました。
これで &lt;strong&gt;http://d.hatena.ne.jp/johzan/rss2&lt;/strong&gt; をダウンロードして &lt;strong&gt;johzan_feed.rss&lt;/strong&gt; というファイル名で保存するレシピの完成です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;http://d.hatena.ne.jp/johzan/rss2&lt;/strong&gt; には、いわゆる常山フィードだけでなく、すばらしいエントリも含まれています。
タイトルに「巡回」が含まれているいわゆる常山フィードだけを抜き出すには &lt;strong&gt;filter.grep&lt;/strong&gt; を使います。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;johzan_feed.cfg&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="l-Scalar-Plain"&gt;global&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
  &lt;span class="l-Scalar-Plain"&gt;timezone&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;Asia/Tokyo&lt;/span&gt;
  &lt;span class="l-Scalar-Plain"&gt;log&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;stdout&lt;/span&gt;

&lt;span class="l-Scalar-Plain"&gt;pipeline&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
  &lt;span class="l-Scalar-Plain"&gt;rss_fetcher&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
    &lt;span class="p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;module&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;subscription.config&lt;/span&gt;
      &lt;span class="l-Scalar-Plain"&gt;config&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
        &lt;span class="l-Scalar-Plain"&gt;feed&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
          &lt;span class="p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;http://d.hatena.ne.jp/johzan/rss2&lt;/span&gt;
    &lt;span class="p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;module&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;filter.grep&lt;/span&gt;
      &lt;span class="l-Scalar-Plain"&gt;config&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
        &lt;span class="l-Scalar-Plain"&gt;str&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
          &lt;span class="l-Scalar-Plain"&gt;title&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;巡回&lt;/span&gt;
    &lt;span class="p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;module&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;publisher.rssfeeder&lt;/span&gt;
      &lt;span class="l-Scalar-Plain"&gt;config&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
        &lt;span class="l-Scalar-Plain"&gt;file&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;johzan_feed.rss&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;さて、ここからが本番。
いわゆる常山フィードからアンカーを抜き出して個別のエントリに仕立てます。
この処理ができるpluginは、pyhabuパッケージに含まれていないので自分で作ります。
エントリからアンカーを抜き出す処理なので &lt;strong&gt;filter.select_anchor&lt;/strong&gt; と命名します。&lt;/p&gt;
&lt;p&gt;pluginの要件は現在(pyhabu 0.3)のところ、&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;実際の処理を行うクラス&lt;ul&gt;
&lt;li&gt;config(プラグイン固有の設定の辞書), environ(habuの環境全体にわたる設定情報の辞書) を引数に取るコンストラクタ&lt;/li&gt;
&lt;li&gt;context(feedparserがパースしたオブジェクト) を引数に取り、何らかの処理を施した context を返す execute メソッド&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;実際の処理を行うクラスのインスタンスを返す create 関数&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;を1つのモジュールに納めます。
何もしない最小のpluginは↓になります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargv&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ということで &lt;strong&gt;filter.select_anchor&lt;/strong&gt; は &lt;a class="reference external" href="http://pyhabu-plugins.googlecode.com/svn/trunk/filter/select_anchor.py"&gt;こんな感じ&lt;/a&gt; になりました。
ファイル名を &lt;strong&gt;select_anchor.py&lt;/strong&gt; として filter ディレクトリに入れます。&lt;/p&gt;
&lt;p&gt;レシピのYAMLは &lt;strong&gt;module: filter.select_anchor&lt;/strong&gt; を差し込んで、
仕上げにtitleとlinkを追加したfeedを出力するように設定して完成です。
結果は
&lt;a class="reference external" href="http://michilu.com/feeds/others/johzan_junkai.xml"&gt;http://michilu.com/feeds/others/johzan_junkai.xml&lt;/a&gt;
で取得できます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;johzan_feed.cfg&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="l-Scalar-Plain"&gt;global&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
  &lt;span class="l-Scalar-Plain"&gt;timezone&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;Asia/Tokyo&lt;/span&gt;
  &lt;span class="l-Scalar-Plain"&gt;log&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;stdout&lt;/span&gt;

&lt;span class="l-Scalar-Plain"&gt;pipeline&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
  &lt;span class="l-Scalar-Plain"&gt;rss_fetcher&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
    &lt;span class="p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;module&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;subscription.config&lt;/span&gt;
      &lt;span class="l-Scalar-Plain"&gt;config&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
        &lt;span class="l-Scalar-Plain"&gt;feed&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
          &lt;span class="p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;http://d.hatena.ne.jp/johzan/rss2&lt;/span&gt;
    &lt;span class="p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;module&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;filter.grep&lt;/span&gt;
      &lt;span class="l-Scalar-Plain"&gt;config&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
        &lt;span class="l-Scalar-Plain"&gt;str&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
          &lt;span class="l-Scalar-Plain"&gt;title&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;巡回&lt;/span&gt;
    &lt;span class="p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;module&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;filter.select_anchor&lt;/span&gt;
    &lt;span class="p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;module&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;publisher.rssfeeder&lt;/span&gt;
      &lt;span class="l-Scalar-Plain"&gt;config&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
        &lt;span class="l-Scalar-Plain"&gt;title&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;常山日記 - 巡回&lt;/span&gt;
        &lt;span class="l-Scalar-Plain"&gt;link&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;http://d.hatena.ne.jp/johzan/searchdiary?word=%BD%E4%B2%F3&lt;/span&gt;
        &lt;span class="l-Scalar-Plain"&gt;file&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;johzan_feed.rss&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;こんな感じでpluginが増えていくとバリエーションも増えていきます。
夢が広がりんぐってやつですね。&lt;/p&gt;
&lt;p&gt;plugin共有プロジェクト( &lt;a class="reference external" href="http://code.google.com/p/pyhabu-plugins/"&gt;pyhabu-plugins&lt;/a&gt; )を作ったので、ジョインしてがんがんコミットしてくださいまし :-)&lt;/p&gt;
&lt;/div&gt;
</summary><feedburner:origLink>http://michilu.com/blog/posts/122/</feedburner:origLink></entry><entry><title> Python版Plagger pyhabuを使ってみる</title><link href="http://feedproxy.google.com/~r/michilu/~3/MB85frb970s/" rel="alternate" /><updated>2007-10-15T17:59:42Z</updated><id>http://michilu.com/blog/posts/121/</id><summary type="html">
&lt;div class="section" id="python-python-plagger-pyhabu"&gt;
&lt;h1&gt;[Python]: Python版Plagger pyhabuを使ってみる&lt;/h1&gt;
&lt;p&gt;Python版の &lt;a class="reference external" href="http://plagger.org"&gt;Plagger&lt;/a&gt; ともいえる &lt;a class="reference external" href="http://sourceforge.jp/projects/pyhabu"&gt;pyhabu&lt;/a&gt; を使ってみます。 レシピに沿って小さなplugin scriptをUNIX pipeのように連結させ、多様な仕事をさせるものです。 例えば、いろんなものをダウンロードしたりとか。
&lt;a class="reference external" href="http://twistedmatrix.com/trac/"&gt;Twisted&lt;/a&gt; , &lt;a class="reference external" href="http://feedparser.org/"&gt;feedparser&lt;/a&gt; , &lt;a class="reference external" href="http://pyyaml.org/wiki/PyYAML"&gt;PyYAML&lt;/a&gt; が必要です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Twisted&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://twistedmatrix.com/trac/wiki/Downloads"&gt;http://twistedmatrix.com/trac/wiki/Downloads&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;詳細を忘れたので割愛。
詳しくは他の文献を参照してください。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;feedparser&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;svn co http://feedparser.googlecode.com/svn/trunk feedparser
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;PyYAML&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;svn co http://svn.pyyaml.org/pyyaml/trunk pyyaml
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;feedparser, PyYAML は PYTHONPATH を通せばOKです。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;pyhabu&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;svn co http://svn.sourceforge.jp/svnroot/pyhabu/trunk pyhabu
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;pyhabu

&lt;span class="nv"&gt;$ &lt;/span&gt;python runhabu.py -h
Usage : runhabu.py &lt;span class="o"&gt;[&lt;/span&gt;options&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;config_file_path&lt;span class="o"&gt;]&lt;/span&gt;
Valid Options:
  -h, --help: Show this message.
  -v, --version: Show Version
  -t, --target&lt;span class="o"&gt;=&lt;/span&gt;TARGET_PIPELINE: Run specific pipeline.
  -a, --plugin-path&lt;span class="o"&gt;=&lt;/span&gt;PLUGIN_PATH: Append plugin paht.
  --download-module&lt;span class="o"&gt;=&lt;/span&gt;PLUGIN_NAME: download specified plugin.
  --download-url&lt;span class="o"&gt;=&lt;/span&gt;DOWNLOAD_URL: download from specified urln.
  -e, --enable-netinstall: &lt;span class="nb"&gt;enable &lt;/span&gt;to install module from net.
  -d, --disable-server: disable server functions
  -l, --log-level&lt;span class="o"&gt;=&lt;/span&gt;LOG_LEVEL: &lt;span class="nb"&gt;set &lt;/span&gt;log level.
  --log-file&lt;span class="o"&gt;=&lt;/span&gt;LOG_FILE: &lt;span class="nb"&gt;set &lt;/span&gt;log files. &lt;span class="k"&gt;if &lt;/span&gt;stdout, ouput to stdout.
  --proxy-host&lt;span class="o"&gt;=&lt;/span&gt;PROXY_HOST_NAME: Proxy Host Name.
  --proxy-port&lt;span class="o"&gt;=&lt;/span&gt;PROXY_HOST_NUMBER: Proxy Host Port Number.
  --pid-file&lt;span class="o"&gt;=&lt;/span&gt;PID_FILE_PATH
&lt;span class="nv"&gt;$ &lt;/span&gt;python runhabu.py -V
habu 0.3.0
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;オプションなしで実行すると、付属のレシピ(habu.cfg)が実行されます。
レシピは &lt;a class="reference external" href="http://ja.wikipedia.org/wiki/YAML"&gt;YAML&lt;/a&gt; 形式で書きます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;habu.cfg&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="l-Scalar-Plain"&gt;global&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
  &lt;span class="l-Scalar-Plain"&gt;timezone&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;Asia/Tokyo&lt;/span&gt;
  &lt;span class="l-Scalar-Plain"&gt;log&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;stdout&lt;/span&gt;

&lt;span class="l-Scalar-Plain"&gt;pipeline&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
  &lt;span class="l-Scalar-Plain"&gt;rss_fetcher&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
    &lt;span class="p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;module&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;subscription.config&lt;/span&gt;
      &lt;span class="l-Scalar-Plain"&gt;config&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
        &lt;span class="l-Scalar-Plain"&gt;feed&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
          &lt;span class="p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;http://www.liris.org/blog/RSS&lt;/span&gt;
          &lt;span class="p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;http://dev.ariel-networks.com/Members/blog_update/RSS&lt;/span&gt;
    &lt;span class="p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;module&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;filter.join&lt;/span&gt;
    &lt;span class="p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;module&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;filter.sort&lt;/span&gt;
      &lt;span class="l-Scalar-Plain"&gt;config&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
        &lt;span class="l-Scalar-Plain"&gt;reverse&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;True&lt;/span&gt;
    &lt;span class="p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;module&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;publisher.rssfeeder&lt;/span&gt;
      &lt;span class="l-Scalar-Plain"&gt;config&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;
        &lt;span class="l-Scalar-Plain"&gt;file&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;out.rss&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;このレシピでは、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;global&lt;/strong&gt; セクションで、 timezoneをAsia/Tokyoに、logの出力を標準出力に設定しています。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;pipeline&lt;/strong&gt; セクションでは、実際の処理の流れを記述しています。&lt;/p&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;&lt;strong&gt;modules: subscription.config&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;&lt;a class="reference external" href="http://www.liris.org/blog/RSS"&gt;http://www.liris.org/blog/RSS&lt;/a&gt; と &lt;a class="reference external" href="http://dev.ariel-networks.com/Members/blog_update/RSS"&gt;http://dev.ariel-networks.com/Members/blog_update/RSS&lt;/a&gt; のfeedを取得する&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;modules: filter.join&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;前項のfeed取得は並列に実行されています
feed取得後の動作を1本にまとめるプラグイン&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;modules: filter.sort&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;取得した2つのfeedに含まれるentryを、更新日時順に並べ替える
&lt;strong&gt;reverse: True&lt;/strong&gt; オプションは逆順(降順)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;modules: publisher.rssfeeder&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;Atom feedとしてファイル(out.rss)に書き出します&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;というように動作します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;python runhabu.py
2007/10/11 23:59 +0900 &lt;span class="o"&gt;[&lt;/span&gt;-&lt;span class="o"&gt;]&lt;/span&gt; Log opened.
2007/10/11 23:59 +0900 &lt;span class="o"&gt;[&lt;/span&gt;-&lt;span class="o"&gt;]&lt;/span&gt; Started habu with Task Mode
2007/10/11 23:59 +0900 &lt;span class="o"&gt;[&lt;/span&gt;-&lt;span class="o"&gt;]&lt;/span&gt; habu.webutils.getPage : http://dev.ariel-networks.com/Members/blog_update/RSS
2007/10/11 23:59 +0900 &lt;span class="o"&gt;[&lt;/span&gt;-&lt;span class="o"&gt;]&lt;/span&gt; Starting factory &amp;lt;HTTPClientFactory: http://dev.ariel-networks.com/Members/blog_update/RSS&amp;gt;
2007/10/11 23:59 +0900 &lt;span class="o"&gt;[&lt;/span&gt;-&lt;span class="o"&gt;]&lt;/span&gt; habu.webutils.getPage : http://www.liris.org/blog/RSS
2007/10/11 23:59 +0900 &lt;span class="o"&gt;[&lt;/span&gt;-&lt;span class="o"&gt;]&lt;/span&gt; Starting factory &amp;lt;HTTPClientFactory: http://www.liris.org/blog/RSS&amp;gt;
2007/10/11 23:59 +0900 &lt;span class="o"&gt;[&lt;/span&gt;HTTPPageGetter,client&lt;span class="o"&gt;]&lt;/span&gt; Stopping factory &amp;lt;HTTPClientFactory: http://dev.ariel-networks.com/Members/blog_update/RSS&amp;gt;
2007/10/11 23:59 +0900 &lt;span class="o"&gt;[&lt;/span&gt;HTTPPageGetter,client&lt;span class="o"&gt;]&lt;/span&gt; Thread Joined
2007/10/11 23:59 +0900 &lt;span class="o"&gt;[&lt;/span&gt;-&lt;span class="o"&gt;]&lt;/span&gt; Stopping reactor
2007/10/11 23:59 +0900 &lt;span class="o"&gt;[&lt;/span&gt;HTTPPageGetter,client&lt;span class="o"&gt;]&lt;/span&gt; Stopping factory &amp;lt;HTTPClientFactory: http://www.liris.org/blog/RSS&amp;gt;
2007/10/11 23:59 +0900 &lt;span class="o"&gt;[&lt;/span&gt;-&lt;span class="o"&gt;]&lt;/span&gt; Main loop terminated.
&lt;span class="nv"&gt;$ &lt;/span&gt;ls out.rss
out.rss
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;どのpathからでも実行できるように &lt;cite&gt;runhabu.py&lt;/cite&gt; にpathを通しておきます。&lt;/p&gt;
&lt;/div&gt;
</summary><feedburner:origLink>http://michilu.com/blog/posts/121/</feedburner:origLink></entry><entry><title> Python チュートリアル メモ1</title><link href="http://feedproxy.google.com/~r/michilu/~3/gXrjdmxgPXg/" rel="alternate" /><updated>2007-10-07T18:40:17Z</updated><id>http://michilu.com/blog/posts/120/</id><summary type="html">
&lt;div class="section" id="python-python-1"&gt;
&lt;h1&gt;[Python]: Python チュートリアル メモ1&lt;/h1&gt;
&lt;p&gt;Guidoのメモ書きのメモ書き。(5章まで)&lt;/p&gt;
&lt;p&gt;演算子はなくても、文字列リテラルは連結する&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;spam&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;bacon&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;&amp;#39;spambacon&amp;#39;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;spam&amp;quot;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;bacon&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;&amp;#39;spambacon&amp;#39;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;spam&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bacon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;spam&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;bacon&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;spam&lt;/span&gt; &lt;span class="n"&gt;bacon&lt;/span&gt;
&lt;span class="o"&gt;------------------------------------------------------------&lt;/span&gt;
   &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;lt;ipython console&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;
     &lt;span class="n"&gt;spam&lt;/span&gt; &lt;span class="n"&gt;bacon&lt;/span&gt;
              &lt;span class="o"&gt;^&lt;/span&gt;
&lt;span class="ne"&gt;SyntaxError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;invalid&lt;/span&gt; &lt;span class="n"&gt;syntax&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;スライスに代入できる&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;[:]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt;
&lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;削除され、その位置に追加される&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;デフォルトの引数に可変オブジェクトを使う&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;()):&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;     &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;関係ないけど、instanceに属性ができるのではなく継承。
namespaceは別。
コンストラクタで生成する。
というのを再認識。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;F&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;     &lt;span class="n"&gt;class_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;     &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;         &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class_value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class_value&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class_value&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class_value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class_value&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class_value&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance_value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance_value&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance_value&lt;/span&gt;
&lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mf"&gt;18434808&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mf"&gt;18434808&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mf"&gt;18434808&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mf"&gt;18434808&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mf"&gt;19339984&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mf"&gt;19341144&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mf"&gt;19358464&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;f&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class_value&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;F&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class_value&lt;/span&gt;
&lt;span class="s"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;


&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class_value&lt;/span&gt;
&lt;span class="o"&gt;------------------------------------------------------------&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;lt;ipython console&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="err"&gt;?&lt;/span&gt;
&lt;span class="ne"&gt;AttributeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;class_value&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class_value&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class_value&lt;/span&gt;
&lt;span class="o"&gt;------------------------------------------------------------&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;lt;ipython console&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="err"&gt;?&lt;/span&gt;
&lt;span class="ne"&gt;AttributeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;F&amp;#39;&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;class_value&amp;#39;&lt;/span&gt;


&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance_value&lt;/span&gt;
&lt;span class="o"&gt;------------------------------------------------------------&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;lt;ipython console&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="err"&gt;?&lt;/span&gt;
&lt;span class="ne"&gt;AttributeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;F&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;instance_value&amp;#39;&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance_value&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance_value&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance_value&lt;/span&gt;
&lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;weakref なんてあるんだなぁ
Python ライブラリリファレンス リリース 2.4 より&lt;/p&gt;
&lt;blockquote&gt;
あるリファレントに対する参照が弱参照しか残っていない場合、ガベレージコレクション機構は自由にリファレントを破壊し、そのメモリを別の用途に再利用できます。&lt;/blockquote&gt;
&lt;p&gt;&lt;cite&gt;.keys&lt;/cite&gt; は呼ばなくてもいい&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;a&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;b&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;c&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="bp"&gt;False&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
</summary><feedburner:origLink>http://michilu.com/blog/posts/120/</feedburner:origLink></entry><entry><title>Subversion repositoryの一部をGoogle codeにsyncする</title><link href="http://feedproxy.google.com/~r/michilu/~3/e4AkDOD34GM/" rel="alternate" /><updated>2007-09-30T13:47:08Z</updated><id>http://michilu.com/blog/posts/119/</id><summary type="html">
&lt;div class="section" id="subversion-repository-google-code-sync"&gt;
&lt;h1&gt;Subversion repositoryの一部をGoogle codeにsyncする&lt;/h1&gt;
&lt;p&gt;プライベートなリポジトリの公開したくないコードを除いて、公開したいツリーだけコミットログごとコピーするメモ。
(要svk)&lt;/p&gt;
&lt;p&gt;1.まっさらなsvkローカルミラーを作る:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ svk depotmap --init
&lt;/pre&gt;
&lt;p&gt;2.ベースのディレクトリを作って、svkローカルミラーにimportする:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ mkdir project
$ cd project
$ mkdir trunk tags branches
$ svk import . //
&lt;/pre&gt;
&lt;p&gt;3.コピー元のリポジトリの公開したいツリーを、svkローカルミラーにsyncする:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ svk mirror http://myrepository/project //trunk/project
$ svk sync //trunk/project
&lt;/pre&gt;
&lt;p&gt;4.svnsyncでコピー先リポジトリを所期化して、syncする:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ svnsync init https://helpdoc.googlecode.com/svn file:///path/to/.svk/local
Copied properties for revision 0.
$ svnsync sync https://helpdoc.googlecode.com/svn
Committed revision 1.
Copied properties for revision 1.
Committed revision 2.
Copied properties for revision 2.
Committed revision 3.
Copied properties for revision 3.
...


Repository has not been enabled to accept revision propchanges;
ask the administrator to create a pre-revprop-change hook
&lt;/pre&gt;
&lt;p&gt;というようなメッセージが表示される時は pre-revprop-change を有効にする:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ cd ~/.svk/local/hooks
$ cp pre-revprop-change.tmpl pre-revprop-change
$ chmod 755 pre-revprop-change
&lt;/pre&gt;
&lt;/div&gt;
</summary><feedburner:origLink>http://michilu.com/blog/posts/119/</feedburner:origLink></entry><entry><title> JavaScriptパフォーマンス改善の定石</title><link href="http://feedproxy.google.com/~r/michilu/~3/K0pRBY99c9I/" rel="alternate" /><updated>2007-09-30T07:33:42Z</updated><id>http://michilu.com/blog/posts/118/</id><summary type="html">
&lt;div class="section" id="ecmascript-javascript"&gt;
&lt;h1&gt;[ECMAScript]: JavaScriptパフォーマンス改善の定石&lt;/h1&gt;
&lt;p&gt;いつも思い出せないのでメモ。
&lt;a class="reference external" href="http://www.amazon.co.jp/dp/4774129313/"&gt;WEB+DB PRESS Vol.35&lt;/a&gt;
&lt;a class="reference external" href="http://d.hatena.ne.jp/amachang/"&gt;amachang&lt;/a&gt; の記事より。&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;DOM propaty, attributeへのアクセスを減らす、キャッシュする&lt;/li&gt;
&lt;li&gt;length の参照を減らす&lt;/li&gt;
&lt;li&gt;innerHTMLは注意&lt;/li&gt;
&lt;li&gt;タイマ、イベント(特にmouse)は解除する&lt;/li&gt;
&lt;li&gt;タイマ、イベントをまとめる&lt;/li&gt;
&lt;li&gt;タイマ値はなるべく長く(50ms以上)&lt;/li&gt;
&lt;li&gt;withは使わない&lt;/li&gt;
&lt;li&gt;スコープを越えない、ローカルにコピーする&lt;/li&gt;
&lt;li&gt;関数はグローバルに定義する、スコープを深くしない&lt;/li&gt;
&lt;li&gt;ドット演算を減らす&lt;/li&gt;
&lt;li&gt;文字列リテラル生成、関数呼び出しは重い(DOMアクセスの方が圧倒的に重いけど)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</summary><feedburner:origLink>http://michilu.com/blog/posts/118/</feedburner:origLink></entry><entry><title> PyObjC版Cocoaセミナー初級編1</title><link href="http://feedproxy.google.com/~r/michilu/~3/xOJ5RK-8pIg/" rel="alternate" /><updated>2007-09-26T15:42:31Z</updated><id>http://michilu.com/blog/posts/117/</id><summary type="html">
&lt;div class="section" id="python-pyobjc-cocoa-1"&gt;
&lt;h1&gt;[Python]: PyObjC版Cocoaセミナー初級編1&lt;/h1&gt;
&lt;p&gt;&lt;a class="reference external" href="http://hmdt.jp/"&gt;HMDT&lt;/a&gt; 木下さんの &lt;a class="reference external" href="http://developer.apple.com/jp/briefing/cocoa.html"&gt;Cocoaセミナー&lt;/a&gt; 初級編をPyObjCでやってみる。&lt;/p&gt;
&lt;div class="section" id="id1"&gt;
&lt;h2&gt;準備するもの&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Xcode &lt;a class="reference external" href="http://connect.apple.com/"&gt;http://connect.apple.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PyObjC &lt;a class="reference external" href="http://pyobjc.sourceforge.net/software/"&gt;http://pyobjc.sourceforge.net/software/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;パッケージで配布されているので、ダウンロードしてインストールしておきます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id2"&gt;
&lt;h2&gt;資料&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;テキスト &lt;a class="reference external" href="http://hmdt-web.net/Cocoa/CocoaPrimary.pdf"&gt;http://hmdt-web.net/Cocoa/CocoaPrimary.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;スライド &lt;a class="reference external" href="http://hmdt-web.net/Cocoa/CocoaPrimary.key.zip"&gt;http://hmdt-web.net/Cocoa/CocoaPrimary.key.zip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;もろもろ一式 &lt;a class="reference external" href="http://hmdt-web.net/Cocoa/CocoaPrimary.zip"&gt;http://hmdt-web.net/Cocoa/CocoaPrimary.zip&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="hello-world"&gt;
&lt;h2&gt;Hello World&lt;/h2&gt;
&lt;p&gt;ボタンを押すとボックスにテキストが表示されるアプリケーションを作ります。
「Cocoaセミナー初級編」のテキストに沿って作業を進めます。
通常のCocoa Applicationと異なる点は、&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Projectの雛形には、「PyObjC Application」を選択する。&lt;/li&gt;
&lt;li&gt;Controllerは、Objective-CではなくPythonで記述する&lt;/li&gt;
&lt;li&gt;ビルドは、XcodeではなくコマンドラインからPythonでbuildする&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;といったところです。&lt;/p&gt;
&lt;p&gt;では作業開始。
まず、テキストでいうところの「4.1 新規プロジェクトの作成」で
「PyObjC Application」を選択して作業を進めます。
その後はテキスト通りにInterface BuilderでViewを作ります。&lt;/p&gt;
&lt;p&gt;次に、テキストでいうところの「4.7 Controllerクラスの実装]では、
さきほどInterface Builderで作成した &lt;cite&gt;MainMenu.nib&lt;/cite&gt; を元に
Controllerクラス (Python) の雛形を生成してcontrollerを実装していきます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;python -c &lt;span class="s2"&gt;&amp;quot;import PyObjCScripts.nibclassbuilder&amp;quot;&lt;/span&gt; English.lproj/MainMenu.nib &amp;gt; HelloWorld.py
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pythonのファイル名は、buildされるApplication ディレクトリ(.app)名になるので、
適当な名前にしておきます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HelloWorld.py&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;objc&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;Foundation&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;AppKit&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PyObjCTools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;NibClassBuilder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AppHelper&lt;/span&gt;


&lt;span class="n"&gt;NibClassBuilder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extractClasses&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;MainMenu&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="c"&gt;# class defined in MainMenu.nib&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Controller&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NibClassBuilder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AutoBaseClass&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c"&gt;# the actual base class is NSObject&lt;/span&gt;
    &lt;span class="c"&gt;# The following outlets are added to the class:&lt;/span&gt;
    &lt;span class="c"&gt;# textField&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;Say_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;


&lt;span class="c"&gt;# class defined in MainMenu.nib&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Hello_WorldAppDelegate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NibClassBuilder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AutoBaseClass&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c"&gt;# the actual base class is NSObject&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;



&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;__main__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;AppHelper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;runEventLoop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Interface Builderで作成した &lt;cite&gt;Controller&lt;/cite&gt; クラスとそのアトリビュート
&lt;cite&gt;textField&lt;/cite&gt; (Outlets) , &lt;cite&gt;Say_&lt;/cite&gt; (Actions) が組み込まれています。
&lt;cite&gt;Controller.Say_&lt;/cite&gt; を実装します。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HelloWorld.py&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Controller&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NibClassBuilder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AutoBaseClass&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;Say_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;textField&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setStringValue_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;u&amp;quot;Hello World!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;「4.8 ビルドと実行」
さてbuildの準備です。
defaultの &lt;cite&gt;setup&lt;/cite&gt; を書き換えます。
&lt;cite&gt;app&lt;/cite&gt; にControllerを記述したPythonファイル名を、
&lt;cite&gt;DateTimeField&lt;/cite&gt; にnibディレクトリ名をセットします。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;setup.py&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;HelloWorld.py&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;data_files&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;English.lproj/MainMenu.nib&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;buildします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;python setup.py py2app -A
running py2app
creating /Hello World/build
creating /Hello World/build/bdist.macosx-10.3-fat
creating /Hello World/build/bdist.macosx-10.3-fat/python2.4-standalone
creating /Hello World/build/bdist.macosx-10.3-fat/python2.4-standalone/app
creating /Hello World/build/bdist.macosx-10.3-fat/python2.4-standalone/app/collect
creating /Hello World/build/bdist.macosx-10.3-fat/python2.4-standalone/app/temp
creating /Hello World/dist
creating build/bdist.macosx-10.3-fat/python2.4-standalone/app/lib-dynload
creating build/bdist.macosx-10.3-fat/python2.4-standalone/app/Frameworks
*** creating application bundle: HelloWorld ***

&lt;span class="nv"&gt;$ &lt;/span&gt;open dist/HelloWorld.app
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;cite&gt;dist&lt;/cite&gt; ディレクトリの下に &lt;strong&gt;app&lt;/strong&gt; ができているので起動してみます。
これで Objective-C で実装した場合と同じ動作になると思います。&lt;/p&gt;
&lt;p&gt;Interface Builderで定義した class は &lt;cite&gt;English.lproj/MainMenu.nib/classes.nib&lt;/cite&gt; に書いてあります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;English.lproj/MainMenu.nib/classes.nib&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;IBClasses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;ACTIONS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Say&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
            &lt;span class="n"&gt;CLASS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Controller&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;LANGUAGE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ObjC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;OUTLETS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;textField&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
            &lt;span class="n"&gt;SUPERCLASS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NSObject&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;CLASS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FirstResponder&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;LANGUAGE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ObjC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;SUPERCLASS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NSObject&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;CLASS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Hello_WorldAppDelegate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;LANGUAGE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ObjC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;SUPERCLASS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NSObject&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;IBVersion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;PyObjCTools.NibClassBuilder は PyObjCTools.NibInfo のsubclassです。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;NibClassBuilder.extractClasses(&amp;quot;MainMenu&amp;quot;)&lt;/cite&gt; で
&lt;cite&gt;MainMenu.nib/classes.nib&lt;/cite&gt; を解析して &lt;cite&gt;NibClassBuilder.classes&lt;/cite&gt; をセットしています。&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;textField&lt;/cite&gt; の型を見てみます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HelloWorld.py&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Controller&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NibClassBuilder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AutoBaseClass&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;Say_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;textField&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setStringValue_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;textField&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;cite&gt;NSTextField&lt;/cite&gt; と表示されます。&lt;/p&gt;
&lt;p&gt;Xcode の Developer Documentation で検索してみると &lt;cite&gt;NSTextField Class Reference&lt;/cite&gt; がヒットします。
Companion guide のリンクを辿ると &lt;cite&gt;Text Fields&lt;/cite&gt; についてのドキュメントが見れます。&lt;/p&gt;
&lt;p&gt;さらに Text Fields の Inherits from から NSControl のリンクを辿り &lt;cite&gt;NSControl Class Reference&lt;/cite&gt; を参照すると
Setting the control’s value に &lt;cite&gt;setStringValue:&lt;/cite&gt; がリストされています&lt;/p&gt;
&lt;p&gt;PyObjC における &lt;cite&gt;setStringValue_&lt;/cite&gt; は、Objectiv-Cの &lt;cite&gt;setStringValue:&lt;/cite&gt; に対応するようです。&lt;/p&gt;
&lt;p&gt;他にも、&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;cite&gt;setDoubleValue:&lt;/cite&gt;&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;setFloatValue:&lt;/cite&gt;&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;setIntValue:&lt;/cite&gt;&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;setObjectValue:&lt;/cite&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;がリストされています。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</summary><feedburner:origLink>http://michilu.com/blog/posts/117/</feedburner:origLink></entry><entry><title>Project.vimのfilterでexcludeできないの？</title><link href="http://feedproxy.google.com/~r/michilu/~3/I33TgO7Jr_E/" rel="alternate" /><updated>2007-09-22T05:22:19Z</updated><id>http://michilu.com/blog/posts/116/</id><summary type="html">
&lt;div class="section" id="project-vim-filter-exclude"&gt;
&lt;h1&gt;Project.vimのfilterでexcludeできないの？&lt;/h1&gt;
&lt;p&gt;できなかったので、なんとかしてみるメモ。&lt;/p&gt;
&lt;p&gt;filterの値はglobに渡っていて、ワイルドカードが展開されるだけみたい。
globは &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;`comannds`&lt;/span&gt;&lt;/tt&gt; というように「`」で括るとsystemコマンドの結果に置き換える。
でもMac OSXのlsはexcludeできない。
--ignore オプションが使えない。
grepしたりsedしたりいろいろやったけど、globが扱える出力に加工できなかった。どうやるんだろう。なに&amp;lt;NL&amp;gt;って。&lt;/p&gt;
&lt;p&gt;vimの &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;system()&lt;/span&gt;&lt;/tt&gt; はshellの出力を扱う。改行文字は&amp;lt;NL&amp;gt;に自動変換される。
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;glob()&lt;/span&gt;&lt;/tt&gt; を &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;system()&lt;/span&gt;&lt;/tt&gt; に書き換える。
filterに空白文字を含めたまま、systemに渡す方法がわからない。
script書いてコマンドにしてあげるとうまくいった。&lt;/p&gt;
&lt;p&gt;via&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;回転と脱線 - ソースの読み方 &lt;a class="reference external" href="http://d.hatena.ne.jp/mopemope/20070921/p1"&gt;http://d.hatena.ne.jp/mopemope/20070921/p1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;VIMリファレンスマニュアル &lt;a class="reference external" href="http://www.kaoriya.net/vimdoc_j/eval.txt"&gt;http://www.kaoriya.net/vimdoc_j/eval.txt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;~/.vim/plugin/project.vim&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;$ diff project.vim.org project.vim
428c428
&amp;lt;             let single=glob(strpart(filter, 0, end))
&lt;span class="gd"&gt;---&lt;/span&gt;
&amp;gt;             let single=system(strpart(filter, 0, end))
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;~/bin/filter4project_vim.sh&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/usr/bin/env sh&lt;/span&gt;

ls |grep -v pyc&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;~/.vimprojects&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;michilu&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="sr"&gt;/path/&lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="sr"&gt;/dj/&lt;/span&gt;michilu CD&lt;span class="p"&gt;=&lt;/span&gt;. filter&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;~/bin/filter4project_vim.sh&amp;quot;&lt;/span&gt; {
 __init__.&lt;span class="k"&gt;py&lt;/span&gt;
 doc&lt;span class="p"&gt;-&lt;/span&gt;ja_revision.txt
 dump.json
 initial_data_.json
 manage.&lt;span class="k"&gt;py&lt;/span&gt;
 settings.&lt;span class="k"&gt;py&lt;/span&gt;
 sitemaps.&lt;span class="k"&gt;py&lt;/span&gt;
 test.sql
 urls.&lt;span class="k"&gt;py&lt;/span&gt;

 &lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt; {
  cron.&lt;span class="k"&gt;sh&lt;/span&gt;
  doc&lt;span class="p"&gt;-&lt;/span&gt;ja_update.&lt;span class="k"&gt;py&lt;/span&gt;

  wsgi&lt;span class="p"&gt;=&lt;/span&gt;wsgi {
   michilu.wsgi

  }
 }
 blog&lt;span class="p"&gt;=&lt;/span&gt;blog {
  __init__.&lt;span class="k"&gt;py&lt;/span&gt;
  feeds.&lt;span class="k"&gt;py&lt;/span&gt;
  models.&lt;span class="k"&gt;py&lt;/span&gt;
  sitemaps.&lt;span class="k"&gt;py&lt;/span&gt;
  tests.&lt;span class="k"&gt;py&lt;/span&gt;
  urls.&lt;span class="k"&gt;py&lt;/span&gt;
  views.&lt;span class="k"&gt;py&lt;/span&gt;

 }
 &lt;span class="k"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="k"&gt;conf&lt;/span&gt; {
  fixtures&lt;span class="p"&gt;=&lt;/span&gt;fixtures {
   site_develop.json
   site_production.json

  }
  servers&lt;span class="p"&gt;=&lt;/span&gt;servers {
   django.&lt;span class="k"&gt;conf&lt;/span&gt;
   httpd.&lt;span class="k"&gt;conf&lt;/span&gt;
   lighttpd.&lt;span class="k"&gt;conf&lt;/span&gt;
   mime.types

  }
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;そうそう、pycがリストされなければいいのです。
1行空いてるけど気にしない。
変な出力を渡すと変なことになるので注意。&lt;/p&gt;
&lt;/div&gt;
</summary><feedburner:origLink>http://michilu.com/blog/posts/116/</feedburner:origLink></entry><entry><title> manage.py shellでclassic promptのIPythonを使えるようにする</title><link href="http://feedproxy.google.com/~r/michilu/~3/bSOWxUlgBN8/" rel="alternate" /><updated>2007-09-21T07:44:41Z</updated><id>http://michilu.com/blog/posts/115/</id><summary type="html">
&lt;div class="section" id="django-manage-py-shell-classic-prompt-ipython"&gt;
&lt;h1&gt;[Django]: manage.py shellでclassic promptのIPythonを使えるようにする&lt;/h1&gt;
&lt;p&gt;パッチはあまり好きじゃないのだけれど、便利そうだからいいや。 via &lt;a class="reference external" href="http://www.ueblog.org/blog/entry/ipython_1/"&gt;IPythonを使おう1&lt;/a&gt; &amp;#64;ueblog&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;$ svn diff
&lt;span class="gh"&gt;Index: django/core/management/commands/shell.py&lt;/span&gt;
&lt;span class="gh"&gt;===================================================================&lt;/span&gt;
&lt;span class="gd"&gt;--- django/core/management/commands/shell.py    (revision 6285)&lt;/span&gt;
&lt;span class="gi"&gt;+++ django/core/management/commands/shell.py    (working copy)&lt;/span&gt;
&lt;span class="gu"&gt;@@ -6,6 +6,8 @@&lt;/span&gt;
     option_list = NoArgsCommand.option_list + (
         make_option(&amp;#39;--plain&amp;#39;, action=&amp;#39;store_true&amp;#39;, dest=&amp;#39;plain&amp;#39;,
             help=&amp;#39;Tells Django to use plain Python, not IPython.&amp;#39;),
&lt;span class="gi"&gt;+        make_option(&amp;#39;--cl&amp;#39;, action=&amp;#39;store_true&amp;#39;, dest=&amp;#39;cl&amp;#39;,&lt;/span&gt;
&lt;span class="gi"&gt;+            help=&amp;#39;Tells Django to use IPython with the classic Python prompt.&amp;#39;),&lt;/span&gt;
     )
     help = &amp;quot;Runs a Python interactive interpreter. Tries to use IPython, if it&amp;#39;s available.&amp;quot;

&lt;span class="gu"&gt;@@ -18,6 +20,9 @@&lt;/span&gt;
         loaded_models = get_models()

         use_plain = options.get(&amp;#39;plain&amp;#39;, False)
&lt;span class="gi"&gt;+        argv = []&lt;/span&gt;
&lt;span class="gi"&gt;+        if options.get(&amp;#39;cl&amp;#39;, False):&lt;/span&gt;
&lt;span class="gi"&gt;+            argv.append(&amp;quot;-cl&amp;quot;)&lt;/span&gt;

         try:
             if use_plain:
&lt;span class="gu"&gt;@@ -26,7 +31,7 @@&lt;/span&gt;
             import IPython
             # Explicitly pass an empty list as arguments, because otherwise IPython
             # would use sys.argv from this script.
&lt;span class="gd"&gt;-            shell = IPython.Shell.IPShell(argv=[])&lt;/span&gt;
&lt;span class="gi"&gt;+            shell = IPython.Shell.IPShell(argv)&lt;/span&gt;
             shell.mainloop()
         except ImportError:
             import code
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="n"&gt;manage&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;cl&lt;/span&gt;
&lt;span class="n"&gt;Python&lt;/span&gt; &lt;span class="mf"&gt;2.4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;4&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="c"&gt;#1, Oct 18 2006, 10:34:39)&lt;/span&gt;
&lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;copyright&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;credits&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;license&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;more&lt;/span&gt; &lt;span class="n"&gt;information&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;IPython&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt; &lt;span class="n"&gt;An&lt;/span&gt; &lt;span class="n"&gt;enhanced&lt;/span&gt; &lt;span class="n"&gt;Interactive&lt;/span&gt; &lt;span class="n"&gt;Python&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="err"&gt;?&lt;/span&gt;       &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Introduction&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;IPython&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;s features.&lt;/span&gt;
&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;magic&lt;/span&gt;  &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Information&lt;/span&gt; &lt;span class="n"&gt;about&lt;/span&gt; &lt;span class="n"&gt;IPython&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;s &amp;#39;&lt;/span&gt;&lt;span class="n"&gt;magic&lt;/span&gt;&lt;span class="s"&gt;&amp;#39; &lt;/span&gt;&lt;span class="si"&gt;% f&lt;/span&gt;&lt;span class="s"&gt;unctions.&lt;/span&gt;
&lt;span class="n"&gt;help&lt;/span&gt;    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Python&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;s own help system.&lt;/span&gt;
&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Details&lt;/span&gt; &lt;span class="n"&gt;about&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;object&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;also&lt;/span&gt; &lt;span class="n"&gt;works&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;??&lt;/span&gt; &lt;span class="n"&gt;prints&lt;/span&gt; &lt;span class="n"&gt;more&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;django&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VERSION&lt;/span&gt;&lt;span class="err"&gt;??&lt;/span&gt;
&lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;           &lt;span class="nb"&gt;tuple&lt;/span&gt;
&lt;span class="n"&gt;Base&lt;/span&gt; &lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;tuple&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;Form&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;pre&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;      &lt;span class="n"&gt;Interactive&lt;/span&gt;
&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;         &lt;span class="mf"&gt;3&lt;/span&gt;
&lt;span class="n"&gt;Docstring&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;empty&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;
    &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sequence&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt; &lt;span class="n"&gt;initialized&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;sequence&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nn"&gt;s&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nn"&gt;items&lt;/span&gt;

    &lt;span class="n"&gt;If&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;argument&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;same&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
</summary><feedburner:origLink>http://michilu.com/blog/posts/115/</feedburner:origLink></entry><entry><title> newforms Modelに紐付かないformデータをバリデートする</title><link href="http://feedproxy.google.com/~r/michilu/~3/8vDtEU7xDiI/" rel="alternate" /><updated>2007-09-13T01:52:34Z</updated><id>http://michilu.com/blog/posts/114/</id><summary type="html">
&lt;div class="section" id="django-newforms-model-form"&gt;
&lt;h1&gt;[Django]: newforms Modelに紐付かないformデータをバリデートする&lt;/h1&gt;
&lt;p&gt;models.Fieldの設定がなくModelに格納できないようなforms.Fieldもひとまとめにバリデートする。&lt;/p&gt;
&lt;p&gt;models.Modelに列挙されていないFieldが含まれているとsaveできない。
Form.clean_&amp;lt;field&amp;gt;の返り値は再び代入されてNoneが入るので、このメソッドでは削除できない。
Form.cleanでpopする。&lt;/p&gt;
&lt;p&gt;(Django 0.96)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;# -*- coding: utf-8 -*-&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;newforms&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;forms&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.newforms.util&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ValidationError&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.utils.translation&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;gettext&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Tag&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BaconForm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forms&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Form&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;forms&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;widget&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;forms&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Textarea&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;max_length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;tags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;forms&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ModelMultipleChoiceField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;queryset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Tag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;check&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;forms&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BooleanField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;clean_check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clean_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;check&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;ValidationError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gettext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;u&amp;quot;チェックしてね。はぁと&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clean_data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;check&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaconForm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
</summary><feedburner:origLink>http://michilu.com/blog/posts/114/</feedburner:origLink></entry><entry><title> Django ドキュメント周り更新のお知らせ</title><link href="http://feedproxy.google.com/~r/michilu/~3/_qQuz7VU_o0/" rel="alternate" /><updated>2007-09-09T13:54:40Z</updated><id>http://michilu.com/blog/posts/113/</id><summary type="html">
&lt;div class="section" id="django-django"&gt;
&lt;h1&gt;[Django]: Django ドキュメント周り更新のお知らせ&lt;/h1&gt;
&lt;p&gt;michilu.comをupdateしました。Django &lt;em&gt;オフ&lt;/em&gt; ラインドキュメント和訳と、 &lt;a class="reference external" href="http://djangoproject.jp/"&gt;djangoproject.jp&lt;/a&gt; のリソースについて。&lt;/p&gt;
&lt;div class="section" id="django"&gt;
&lt;h2&gt;Django オフラインドキュメント和訳&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://michilu.com/offline/"&gt;http://michilu.com/offline/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a class="reference external" href="http://gears.google.com/"&gt;Google Gears&lt;/a&gt; で &lt;strong&gt;オフ&lt;/strong&gt; ラインにしました。
Google Gearsをインストールした状態でアクセスすると、
問答無用でデータを取りにいきますので注意してください。
もしcacheの更新がうまく動いていないような時は、
直接メソッドを操作するか、下記を参考にcacheを削除してみてください。&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://code.google.com/apis/gears/api_database.html#directories"&gt;http://code.google.com/apis/gears/api_database.html#directories&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="django-trunk-json"&gt;
&lt;h2&gt;Django オンラインドキュメント和訳 trunk版の更新時刻JSON&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://michilu.com/django/doc-ja.json"&gt;http://michilu.com/django/doc-ja.json&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;URLと更新時刻をセットにしたJSONです。
changesetを見たい方は、こちらをご参考に。&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://djangoproject.jp/trac/timeline"&gt;http://djangoproject.jp/trac/timeline&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="id1"&gt;
&lt;h2&gt;和訳ドキュメントソース&lt;/h2&gt;
&lt;p&gt;ここから最新版がダウンロードできます&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;trunk版(utf-8)&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;&lt;a class="reference external" href="http://djangoproject.jp/trac/changeset//root/doc-jp/trunk?old_path=%2F&amp;amp;format=zip"&gt;http://djangoproject.jp/trac/changeset//root/doc-jp/trunk?old_path=%2F&amp;amp;format=zip&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;0.96版(euc-jp)&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;&lt;a class="reference external" href="http://djangoproject.jp/trac/changeset//root/doc-jp/branches/docs_0.96?old_path=%2F&amp;amp;format=zip"&gt;http://djangoproject.jp/trac/changeset//root/doc-jp/branches/docs_0.96?old_path=%2F&amp;amp;format=zip&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;0.95版(euc-jp)&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;&lt;a class="reference external" href="http://djangoproject.jp/trac/changeset//root/doc-jp/branches/docs_0.95?old_path=%2F&amp;amp;format=zip"&gt;http://djangoproject.jp/trac/changeset//root/doc-jp/branches/docs_0.95?old_path=%2F&amp;amp;format=zip&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下まとめとして再掲します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;Django オンラインドキュメント和訳 (trunk)&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;&lt;a class="reference external" href="http://michilu.com/django/doc-ja/index/"&gt;http://michilu.com/django/doc-ja/index/&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;Django 0.96 オンラインドキュメント和訳 (0.96)&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;&lt;a class="reference external" href="http://michilu.com/django/doc-ja-0.96/index/"&gt;http://michilu.com/django/doc-ja-0.96/index/&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
</summary><feedburner:origLink>http://michilu.com/blog/posts/113/</feedburner:origLink></entry><entry><title> tests.pyを分割する</title><link href="http://feedproxy.google.com/~r/michilu/~3/2Df1WEcbE8c/" rel="alternate" /><updated>2007-09-09T13:53:17Z</updated><id>http://michilu.com/blog/posts/112/</id><summary type="html">
&lt;div class="section" id="django-tests-py"&gt;
&lt;h1&gt;[Django]: tests.pyを分割する&lt;/h1&gt;
&lt;p&gt;Djangoは &lt;cite&gt;&amp;lt;app&amp;gt;/tests.py(models.py)&lt;/cite&gt; しか実行してくれないので、任意のモジュールのTestCaseをglobalにimportして実行させる。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;imp&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;unittest&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_tests&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;imp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;tests&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__path__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;_module&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;imp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load_module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;tests&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_module&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__dict__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nb"&gt;issubclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;contrib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;webdesign&lt;/span&gt;
&lt;span class="nb"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get_tests&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;webdesign&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;とかすると、 &lt;cite&gt;somewhere/contrib/webdesign/tests.py&lt;/cite&gt; のTestCaseをimportした&amp;lt;app&amp;gt;で実行できる。
utils系のモジュールを階層化して管理したい時などに便利。&lt;/p&gt;
&lt;/div&gt;
</summary><feedburner:origLink>http://michilu.com/blog/posts/112/</feedburner:origLink></entry><entry><title> サロゲートペア文字を検出するカスタムフィールド</title><link href="http://feedproxy.google.com/~r/michilu/~3/I406G_lCIX0/" rel="alternate" /><updated>2007-09-07T08:25:53Z</updated><id>http://michilu.com/blog/posts/111/</id><summary type="html">
&lt;div class="section" id="django"&gt;
&lt;h1&gt;[Django]: サロゲートペア文字を検出するカスタムフィールド&lt;/h1&gt;
&lt;p&gt;サロゲートペア文字が流行ってきているらしいので対策を施す。 MySQLはサロゲートペアを落としてしまうようなのでバリデータで弾いてみよう。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;utils/fields.py&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;newforms&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;forms&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.newforms.util&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ValidationError&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.utils.translation&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ugettext&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.conf&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;has_surrogate_pair&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nb"&gt;unicode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;strings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;unicode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DEFAULT_CHARSET&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;strings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;high&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;u&amp;quot;[&lt;/span&gt;&lt;span class="se"&gt;\uD800&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="se"&gt;\uDBFF&lt;/span&gt;&lt;span class="s"&gt;]&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;low&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;u&amp;quot;[&lt;/span&gt;&lt;span class="se"&gt;\uDC00&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="se"&gt;\uDFFF&lt;/span&gt;&lt;span class="s"&gt;]&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;high&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;low&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;IndexError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forms&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;surrogate_pair&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;surrogate_pair&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;surrogate_pair&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;surrogate_pair&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;has_surrogate_pair&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;ValidationError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ugettext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;u&amp;#39;Ensure this value has not surrogate pair characters.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;森鷗外&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c"&gt;# 正式版の&amp;quot;森鴎外&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;u&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\u68ee\u9dd7\u5916&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;𣏐&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="c"&gt;# &amp;quot;木&amp;quot;+&amp;quot;夕&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;u&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\U000233d0&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;surrogate_pair&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;森鷗外&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c"&gt;# 正式版の&amp;quot;森鴎外&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;u&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\u68ee\u9dd7\u5916&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;𣏐&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c"&gt;# &amp;quot;木&amp;quot;+&amp;quot;夕&amp;quot;&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;ValidationError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;u&amp;#39;Ensure this value has not surrogate pair characters.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;試しに、このようなviewを用意して、&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.http&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;HttpResponse&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;newforms&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;forms&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;utils&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestForm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forms&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Form&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;text1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;text2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="n"&gt;surrogate_pair&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;HttpResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TestForm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://127.0.0.1:8000/test/"&gt;http://127.0.0.1:8000/test/&lt;/a&gt;?text1=森鷗外&amp;amp;text2=森鷗外&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://127.0.0.1:8000/test/"&gt;http://127.0.0.1:8000/test/&lt;/a&gt;?text1=𣏐&amp;amp;text2=𣏐&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;などとアクセスしてみると様子がわかります。&lt;/p&gt;
&lt;p&gt;messageは適当、国際化がよくわからないなぁ、勉強しよう。&lt;/p&gt;
&lt;/div&gt;
</summary><feedburner:origLink>http://michilu.com/blog/posts/111/</feedburner:origLink></entry></feed>
