<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>inforno</title><link>http://inforno.net/</link><description>Inferno + Information ... inforno</description><copyright>inforno</copyright><lastBuildDate>Sun, 28 Jun 2009 11:14:10 GMT</lastBuildDate><generator>inforno</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/Inforno" type="application/rss+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><item><title>一瞬で今いるフォルダでcmd.exeを開く</title><link>http://inforno.net/articles/2009/06/28/open-cmd-here</link><description>&lt;p&gt;Windows XPを使用していると、とにかく開いているフォルダで&lt;code&gt;cmd.exe&lt;/code&gt;を起動したい、となることは多いです。
&lt;/p&gt;
&lt;p&gt;よくあるのは右クリックから開く、というやつ。まぁ当然、キーボード派の私にはありえない選択です。
&lt;/p&gt;
&lt;p&gt;んで、昔からCのプログラムとWSHをくみあわせてキーボードから開けるようにしていたのですが、やっぱWSHが絡むので遅い。
&lt;/p&gt;
&lt;p&gt;というわけでCだけで作ってみました。せっかくなのでおいておきます。
&lt;/p&gt;

&lt;h3&gt;ダウンロード&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://inforno.net/static/files/explorexe.zip"&gt;explorexe.zip&lt;/a&gt;
&lt;/p&gt;

&lt;h3&gt;使い方&lt;/h3&gt;
&lt;p&gt;解凍してできた&lt;code&gt;explorexe.exe&lt;/code&gt;のショートカットをデスクトップにつくります。
&lt;/p&gt;
&lt;p&gt;んで、ショートカットを右クリックして、
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     「リンク先」で&lt;code&gt;cmd.exe /k cd /d %s&lt;/code&gt;を後ろに追加します。&lt;ul&gt;
 &lt;li&gt;
     例:&lt;code&gt;C:\Documents and Settings\yourname\デスクトップ\explorexe.exe cmd.exe /k cd /d %s&lt;/code&gt;
 &lt;/li&gt;
&lt;/ul&gt;

 &lt;/li&gt;

 &lt;li&gt;
     「ショートカットキー」を適当に設定します。&lt;ul&gt;
 &lt;li&gt;
     例:&lt;code&gt;Ctrl + Alt + C&lt;/code&gt;
 &lt;/li&gt;
&lt;/ul&gt;

 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これでOK。あとはエクスプローラを表示して、&lt;code&gt;Ctrl + Alt + C&lt;/code&gt;を押せばそのエクスプローラに表示されているフォルダをカレントにして&lt;code&gt;cmd.exe&lt;/code&gt;が開きます。
&lt;/p&gt;
&lt;p&gt;あとは、コマンドライン型ランチャーなんかに同様に登録するとめっさ快適です。
&lt;/p&gt;

&lt;h3&gt;応用？&lt;/h3&gt;
&lt;p&gt;えー、見てのとおり引数の文字列にprintfしているだけなので、&lt;code&gt;cmd.exe&lt;/code&gt;以外にも使えます。&lt;code&gt;%s&lt;/code&gt;にあたるカレントフォルダのパスは空白が含まれている場合は自動的に「&lt;code&gt;"&lt;/code&gt;」で囲まれます。
&lt;/p&gt;</description><category>windows</category><guid isPermaLink="true">http://inforno.net/articles/2009/06/28/open-cmd-here</guid><pubDate>Sun, 28 Jun 2009 11:13:29 GMT</pubDate></item><item><title>Python版Yahooテキスト解析 APIライブラリをキーフレーズ抽出に対応させました</title><link>http://inforno.net/articles/2009/06/04/yahoo-jlp-api-wrapper-for-python-4</link><description>&lt;p&gt;しました。
&lt;/p&gt;

&lt;h3&gt;ダウンロード&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://inforno.net/static/files/yahooapi_0_4.zip"&gt;yahooapi&lt;/a&gt;
&lt;/p&gt;

&lt;h3&gt;使い方&lt;/h3&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;python&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;yahooapi.jlp&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yahooapi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jlp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;KeyphraseServiceAPI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;apikey&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&lt;span class="n"&gt;result_obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sentence&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;u&amp;quot;東京ミッドタウンから青山一丁目駅まで歩いて15分かかります&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;result_obj&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;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;print&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;Keyphrase&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&lt;span class="c"&gt;#  =&amp;gt; 東京ミッドタウン&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&lt;span class="c"&gt;#  =&amp;gt; 青山一丁目駅&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&lt;span class="c"&gt;#  =&amp;gt; 15分&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;うむ。
&lt;/p&gt;</description><category>api</category><category>library</category><category>python</category><category>text</category><category>yahoo</category><guid isPermaLink="true">http://inforno.net/articles/2009/06/04/yahoo-jlp-api-wrapper-for-python-4</guid><pubDate>Thu, 04 Jun 2009 09:54:23 GMT</pubDate></item><item><title>Python: 勉強がてらDHT(Kademliaっぽいもの)を実装しました</title><link>http://inforno.net/articles/2009/04/23/trying-to-implement-a-pseudo-kademlia-in-python</link><description>&lt;p&gt;前々から一度じっくり勉強しないとなぁと思っていたDHTまわりの勉強がてらKademliaっぽいものをPythonで実装してみました。
&lt;/p&gt;
&lt;p&gt;Kademliaはいろいろ実装があるので、ソースを読んじゃうと答えみちゃった感じになるかなーと思って、元論文と&lt;a href="http://www.shudo.net/article/Kademlia-20040727/shudo-Kademlia.pdf"&gt;首藤様の資料&lt;/a&gt;くらいしか見ずに実装してみました。ので、いろいろ間違ってるかも知れませんが･･･。
&lt;/p&gt;
&lt;p&gt;本家Kademliaとの主な違いは
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     UDPではなくTCPを使っている&lt;ul&gt;
 &lt;li&gt;
     ローカル環境しかもっていないので、UDPパケットがロスしやすい場合(WAN)を想定して実装するのがめんどくさい。
 &lt;/li&gt;

 &lt;li&gt;
     よってRPC-IDをつけていない。
 &lt;/li&gt;

 &lt;li&gt;
     パケットの分割や再送もTCPにおまかせ。
 &lt;/li&gt;
&lt;/ul&gt;

 &lt;/li&gt;

 &lt;li&gt;
     original publisherから一定時間publishを受けなくてもインデックス情報をexpireしていない&lt;ul&gt;
 &lt;li&gt;
     実装するのは簡単です。
 &lt;/li&gt;
&lt;/ul&gt;

 &lt;/li&gt;

 &lt;li&gt;
     ノードがネットワークに参加したとき、Index情報を移動させていません&lt;ul&gt;
 &lt;li&gt;
     これも実装は簡単です。
 &lt;/li&gt;
&lt;/ul&gt;

 &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;ダウンロード&lt;/h3&gt;
&lt;p&gt;適当なのですが、置いておけば誰かの役に立つこともなきにしもあらず、かもしれないので置いておきます。jsonつかっているので2.6以上で動きます。
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     &lt;a href="http://inforno.net/static/files/kademlia_tcp.zip"&gt;kademlia_tcp.zip&lt;/a&gt;
 &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;実装について&lt;/h3&gt;
&lt;p&gt;以前Chordもちょっと実装したことがあるのですが、やっぱりいろんなソフトで採用されているだけあって、Kademliaはかなり実装が楽ですね。論文読んで素直に実装すれば動きます。
&lt;/p&gt;
&lt;p&gt;えーと、内部についてはmultiprocessing使えよとか、TCPサーバを自前で書くって標準ライブラリにあるだろ、とか、twisted,eventlet使えよとか、スレッド周り適当じゃね？とかまぁいろいろあるんですが分かりやすさ重視ということで。
&lt;/p&gt;
&lt;p&gt;通信にはjsonを使いました。
&lt;/p&gt;

&lt;h3&gt;基本的な動かし方&lt;/h3&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;python&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;kademlia_tcp&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&lt;span class="n"&gt;kademlia_tcp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DEBUG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kademlia_tcp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;KademliaNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ip address&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&lt;span class="n"&gt;n&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;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&lt;span class="n"&gt;remote&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kademlia_tcp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContactNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ip address&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&lt;span class="n"&gt;n&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;remote&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;という感じでネットワークを作れます。&lt;code&gt;DEBUG&lt;/code&gt;をセットすると、通信情報など、様々な情報が出力されます。あとは
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;python&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;key&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;publish&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="s"&gt;&amp;quot;value&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_value&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;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;other_node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;other_node&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;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;other_node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;というようなメソッドが使えます。
&lt;/p&gt;

&lt;h3&gt;動かしてみて&lt;/h3&gt;
&lt;p&gt;ローカル環境でですが、100ノードほどで動かしてみました。元論文以外には特にchurnの対策はしてないのですが、そこそこ耐性があるんですね。3スレッド、0.1秒間隔で参加と脱退を繰り返したのですがちゃんとpublishしたものが取得できました。もうちょっとchurn対策をすればかなり使えそうだな、と感じました。
&lt;/p&gt;
&lt;p&gt;ルート探索は今回はTCPなのですが、そもそもKademliaは反復的探索なのでこの部分はやはりUDPにしてしかるべき、だなとも思いました。現実的にはルート探索などではUDPを使って、FIND_VALUE(値の取得)ではTCPにするなどの併用が一番現実的っぽいかなあ、とも感じました。
&lt;/p&gt;

&lt;h3&gt;というわけで&lt;/h3&gt;
&lt;p&gt;P2P実装楽しいですね。実際のマシンで実験できる環境があればもっと楽しいんでしょうけど。
&lt;/p&gt;</description><category>DHT</category><category>kademlia</category><category>p2p</category><category>python</category><guid isPermaLink="true">http://inforno.net/articles/2009/04/23/trying-to-implement-a-pseudo-kademlia-in-python</guid><pubDate>Thu, 23 Apr 2009 06:56:57 GMT</pubDate></item><item><title>埋め込みPythonを実装してみました</title><link>http://inforno.net/articles/2009/02/12/the-embedded-python-implementation</link><description>&lt;h3&gt;更新履歴&lt;/h3&gt;
&lt;ul&gt;
 &lt;li&gt;&lt;p&gt;2009/02/20 version 1.0.0
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     RendererとHelperを追加。詳しくはソースファイルヘッダ部分のドキュメントを参照してください。
 &lt;/li&gt;
&lt;/ul&gt;

 &lt;/li&gt;

 &lt;li&gt;&lt;p&gt;2009/02/17 version 0.5.0
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;&lt;p&gt;&lt;code&gt;&amp;lt;%= %&amp;gt;&lt;/code&gt;で自動的にフィルタを適応できるようになりました。また、&lt;code&gt;render&lt;/code&gt;メソッドが&lt;code&gt;unicode&lt;/code&gt;オブジェクトではなく&lt;code&gt;unicode&lt;/code&gt;のサブクラス&lt;code&gt;EmbpyString&lt;/code&gt;オブジェクトを返すようになりました。filterは&lt;code&gt;EmbpyString&lt;/code&gt;オブジェクトをスルーします。これにより2重でfilterが適応されることがなくなります。&lt;code&gt;&amp;lt;%=r %&amp;gt;&lt;/code&gt;でフィルターをオフにできます。
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;Embpy(&amp;quot;&amp;lt;%= b %&amp;gt;&amp;quot;, filter=cgi.escape).render({&amp;quot;v&amp;quot;:&amp;quot;&amp;lt;b&amp;gt;&amp;quot;})&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;#  =&amp;gt; &amp;quot;&amp;amp;lt;b&amp;amp;gt;&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;Embpy(&amp;quot;&amp;lt;%=r b %&amp;gt;&amp;quot;, filter=cgi.escape).render({&amp;quot;v&amp;quot;:&amp;quot;&amp;lt;b&amp;gt;&amp;quot;})&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;#  =&amp;gt; &amp;quot;&amp;lt;b&amp;gt;&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;result = Embpy(&amp;quot;&amp;lt;%=r b %&amp;gt;&amp;quot;, filter=cgi.escape).render({&amp;quot;v&amp;quot;:&amp;quot;&amp;lt;b&amp;gt;&amp;quot;})&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;# result.__class__ =&amp;gt; EmbpyString&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;Embpy(&amp;quot;&amp;lt;%= b %&amp;gt;&amp;quot;, filter=cgi.escape).render({&amp;quot;v&amp;quot;:result})&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;#  =&amp;gt; &amp;quot;&amp;lt;b&amp;gt;&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
 &lt;/li&gt;

 &lt;li&gt;&lt;p&gt;&lt;code&gt;re.Scanner&lt;/code&gt;のscanメソッドがスレッドセーフだったのでインスタンスをモジュールグローバルにしました。また、&lt;code&gt;re.Scanner&lt;/code&gt;インスタンスの初期化をLazyにしました。このことにより&lt;code&gt;re.Scanner&lt;/code&gt;インスタンスの生成数が減り、さらにキャッシュのみの利用時にはインスタンスを生成しないのでパフォーマンスが向上しました。
&lt;/p&gt;

 &lt;/li&gt;
&lt;/ul&gt;

 &lt;/li&gt;

 &lt;li&gt;&lt;p&gt;2009/02/16 version 0.4.0
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     パフォーマンス改善
 &lt;/li&gt;
&lt;/ul&gt;

 &lt;/li&gt;

 &lt;li&gt;&lt;p&gt;2009/02/15 version 0.3.0
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;&lt;p&gt;&lt;a href="http://wids.net/lab/epy.html"&gt;epy&lt;/a&gt;の中の人から「end.. orz」という反応をいただいたので、&lt;code&gt;end&lt;/code&gt;の代わりに&lt;code&gt;&amp;lt;% %&amp;gt;&lt;/code&gt;も使えるようにしました。
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;&amp;lt;%- if True: -%&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ok&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;% %&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;と書けるようになりました。
&lt;/p&gt;

 &lt;/li&gt;
&lt;/ul&gt;

 &lt;/li&gt;

 &lt;li&gt;&lt;p&gt;2009/02/14 version 0.2.0
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     "{" と "}"が辞書リテラルとかぶっていたので、"{:"と":}"に変更しました。
 &lt;/li&gt;

 &lt;li&gt;
     変換後コードでなく、コンパイル済みcodeオブジェクトをキャッシュするようにしました。
 &lt;/li&gt;
&lt;/ul&gt;

 &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;はじめに&lt;/h3&gt;
&lt;p&gt;このブログは&lt;code&gt;web.py&lt;/code&gt;で作られており、テンプレートエンジンも&lt;code&gt;web.py&lt;/code&gt;標準のものを使っています。でもこの&lt;code&gt;web.py&lt;/code&gt;のテンプレートエンジン、罠が多い。なので他のテンプレートエンジンに置き換えようかなあ、とか思ってました。
&lt;/p&gt;
&lt;p&gt;んで個人的にはわざわざテンプレート用に文法覚えるのはめんどいので、埋め込み形式でコードが短くて軽そうなのはないかと探したところ、&lt;a href="http://wids.net/lab/epy.html"&gt;epy&lt;/a&gt;がヒット。
&lt;/p&gt;
&lt;p&gt;ただ、この実装&lt;code&gt;%&amp;gt;&lt;/code&gt;が文字列の中にあると動かなかったり(&lt;code&gt;a= "hoge%&amp;gt;"&lt;/code&gt;みたいな)、コードの短さゆえに割り切っている部分が多いので同じくらい短いコードでもうちょっと高機能版を実装してみました。以前紹介した&lt;code&gt;re.Scanner&lt;/code&gt;を活用すれば、見やすいコードで短く実装できました。
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     キャッシュ
 &lt;/li&gt;

 &lt;li&gt;
     インラインでPythonを書くことも出来る: &lt;code&gt;def format(v) {: return "%4d"%v; :}&lt;/code&gt;みたいに。
 &lt;/li&gt;

 &lt;li&gt;
     eRubyのtrim modeの"&amp;lt;%-"と"-%&amp;gt;" : これがあると無いではテンプレートの見易さが段違い。
 &lt;/li&gt;

 &lt;li&gt;
     自動的にフィルタを適応。しかも2重でフィルタが適応されない。
 &lt;/li&gt;

 &lt;li&gt;
     もちろんマルチバイトでも大丈夫。
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;といったところが特徴ですかね。
&lt;/p&gt;

&lt;h3&gt;例&lt;/h3&gt;
&lt;p&gt;テンプレートはこんな感じにかけます。
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;&amp;lt;%-&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;class Hoge(object):&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;def __init__(self):&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pass&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;end&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;end&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;hoge = Hoge()&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;a = &amp;quot;&amp;lt; title &amp;gt;&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;-%&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;lt;%=r a %&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;lt;%- def format(v) {: return &amp;quot;%4d&amp;quot;%v; :} -%&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;lt;%- def format2(v) {: return &amp;quot;%2d&amp;quot;%v; :} -%&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;lt;% for y in xrange(1,xx):%&amp;gt;&amp;lt;%= format(y) %&amp;gt;&amp;lt;% end %&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;lt;%- for x in xrange(1,xx): -%&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;lt;%= format2(x) -%&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;lt;%- for y in xrange(1,xx): -%&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;lt;%= format(x*y) -%&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;lt;%- end %&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;lt;%- end -%&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;んでこんな感じに使います。第1引数にはファイルではなく文字列も渡せます。
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;python&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;embpy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Embpy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;codecs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;path_to_template&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;utf8&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;cache_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;path_to_cache_file&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;template_globals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="nb"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;cgi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;escape&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;xx&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;10&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;出力はこう。
&lt;/p&gt;
&lt;pre&gt;
        1   2   3   4   5   6   7   8   9
    1   1   2   3   4   5   6   7   8   9
    2   2   4   6   8  10  12  14  16  18
    3   3   6   9  12  15  18  21  24  27
    4   4   8  12  16  20  24  28  32  36
    5   5  10  15  20  25  30  35  40  45
    6   6  12  18  24  30  36  42  48  54
    7   7  14  21  28  35  42  49  56  63
    8   8  16  24  32  40  48  56  64  72
    9   9  18  27  36  45  54  63  72  81
&lt;/pre&gt;


&lt;h3&gt;ダウンロード&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://inforno.net/static/files/embpy.zip"&gt;embpy&lt;/a&gt;
&lt;/p&gt;

&lt;h3&gt;コード&lt;/h3&gt;
&lt;p&gt;先読みはいらないので、&lt;code&gt;re.Scanner&lt;/code&gt;で一発。
&lt;/p&gt;
&lt;p&gt;あと&lt;code&gt;"(((?&amp;lt;=\\)")|[^"])*((?&amp;lt;!\\)")"&lt;/code&gt;という正規表現は自分的には常套句。&lt;code&gt;"&lt;/code&gt;で囲まれていて&lt;code&gt;\"&lt;/code&gt;は&lt;code&gt;"&lt;/code&gt;自身を表す、というよくある文字列の仕様に使える正規表現です。
&lt;/p&gt;</description><category>library</category><category>python</category><category>template</category><guid isPermaLink="true">http://inforno.net/articles/2009/02/12/the-embedded-python-implementation</guid><pubDate>Thu, 12 Feb 2009 10:58:31 GMT</pubDate></item><item><title>XREAで好きなバージョンのPythonを使う方法2</title><link>http://inforno.net/articles/2009/01/25/using-any-version-of-python-on-xrea-servers-part2</link><description>&lt;p&gt;やんごとなき事情によりxrea内でWEBサーバを移動しました。
&lt;/p&gt;
&lt;p&gt;というわけで、このブログ(web.pyによる自作ブログ)を移したわけですが、今までのようにバイナリ化して動かすにはサーバと似た環境が手元にないといけません。が、移動した先のサーバでは環境がだめ。
&lt;/p&gt;
&lt;p&gt;ということで、python2.5をxreaにインストールしました。virtual-pythonもいいんですが、xreaのサーバはpython2.4なので。ちょっと工夫すれば入るし、快適ですね。以下作業ログ。
&lt;/p&gt;

&lt;h3&gt;Pythonをインストール&lt;/h3&gt;
&lt;p&gt;まずはPythonのソースをダウンロードしてコンパイル。~/root/usr/localにいれます。
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;mkdir -p ~/root/usr/local/src&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;cd ~/root/usr/local/src&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;wget http://www.python.org/ftp/python/2.5.4/Python-2.5.4.tgz&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;tar zxvf Python-2.5.4.tgz&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;cd Python-2.5.4&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;./configure --prefix=~/root/usr/local&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;make&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;make install&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;サクっと入ります。で、次にeasy_installを入れるわけですが、はいりません。OpenSSLとの絡みで&lt;code&gt;hashlib.md5&lt;/code&gt;が使えないから。easy_installを入れるときにmd5を検証するのに使ってるんですよね。
&lt;/p&gt;

&lt;h3&gt;hashlibをインストール&lt;/h3&gt;
&lt;p&gt;なんで、自前で&lt;code&gt;hashlib&lt;/code&gt;を単体でいれます。
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;cd ~/root/usr/local/src&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;wget http://code.krypto.org/python/hashlib/hashlib-20081119.tar.gz&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;tar zxvf hashlib-20081119.tar.gz&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;cd hashlib-20081119&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;vi setup.py&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;はい、setup.pyを編集しましょう。普通にbuildするとこれでもmd5が入りません。
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;105　　 if (ssl_inc_dir and&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;106　　　　 ssl_lib is not None and&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;107　　　　 openssl_ver &amp;gt;= 0x00907000):&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;108&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;109　　　　 print &amp;#39;Using OpenSSL version 0x%08x from&amp;#39; % openssl_ver&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;110　　　　 print &amp;#39; Headers:\t&amp;#39;, ssl_inc_dir&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;111　　　　 print &amp;#39; Library:\t&amp;#39;, ssl_lib&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;112&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;113　　　　 # The _hashlib module wraps optimized implementations&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;114　　　　 # of hash functions from the OpenSSL library.&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;115　　　　 exts.append( Extension(&amp;#39;_hashlib&amp;#39;, [&amp;#39;_hashopenssl.c&amp;#39;],&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;116　　　　　　　　　　　　　　　　include_dirs = [ ssl_inc_dir ],&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;117　　　　　　　　　　　　　　　　library_dirs = [ os.path.dirname(ssl_lib) ],&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;118　　　　　　　　　　　　　　　　libraries = osNameLibsMap[os.name]) )&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;119　　 exts.append( Extension(&amp;#39;_sha&amp;#39;, [&amp;#39;shamodule.c&amp;#39;]) )　　　　　　　　　&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;120　　 exts.append( Extension(&amp;#39;_md5&amp;#39;,　　　　　　　　　　　　　　　　　　&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;121　　　　　　　　　　 sources = [&amp;#39;md5module.c&amp;#39;, &amp;#39;md5.c&amp;#39;],&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;122　　　　　　　　　　 depends = [&amp;#39;md5.h&amp;#39;]) )&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;119-120あたり、強制的に&lt;code&gt;_md5&lt;/code&gt;を入れるようにします。あとは
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;~/root/usr/local/bin/python setup.py build&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;~/root/usr/local/bin/python setup.py install&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;でhashlibが入ります。
&lt;/p&gt;

&lt;h3&gt;easy_installをインストール&lt;/h3&gt;
&lt;p&gt;これでmd5が使えるようになったので
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;cd ~/root/usr/local/src&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;wget http://peak.telecommunity.com/dist/ez_setup.py&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;~/root/usr/local/bin/python ez_setup.py&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;これで無事easy_installが入ります。あとは
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;~/root/usr/local/bin/easy_install -U -Z MySQL_Python&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;てな感じで必要なモジュールを入れていきましょう。
&lt;/p&gt;

&lt;h3&gt;というわけで&lt;/h3&gt;
&lt;p&gt;わりと普通にxreaでPythonが使えています。
&lt;/p&gt;</description><category>python</category><category>xrea</category><guid isPermaLink="true">http://inforno.net/articles/2009/01/25/using-any-version-of-python-on-xrea-servers-part2</guid><pubDate>Sat, 24 Jan 2009 16:39:52 GMT</pubDate></item></channel></rss>
