<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>DailyHckr &#187; python</title>
	<atom:link href="http://hylom.net/tag/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://hylom.net</link>
	<description>Hack, Hacker, Hackest</description>
	<lastBuildDate>Mon, 16 Jan 2012 13:32:56 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
		<item>
		<title>Pythonコード中のSQL文インデントを考える</title>
		<link>http://hylom.net/2011/02/21/python-sql-indenting/</link>
		<comments>http://hylom.net/2011/02/21/python-sql-indenting/#comments</comments>
		<pubDate>Mon, 21 Feb 2011 09:03:46 +0000</pubDate>
		<dc:creator>hylom</dc:creator>
				<category><![CDATA[Docs]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://hylom.net/?p=1370</guid>
		<description><![CDATA[　Pythonコード内にSQL文を書くときどうすれば良いのか、いまいち答えが探せなかったのでググって見た話。 　ちなみに、今までは下記のような感じのコードを書いていた訳だが、これ見るからに分かりにくい。 # コード例その1 cur.execute(""" create table count ( sid text, count int);""") # コード例その2 try: cur.execute("""insert into count ( sid, count ) values ( :sid, :count );""", d) except sqlite3.IntegrityError: cur.execute("""update count set sid = :sid, count = : count where sid = :sid;""", d) # コード例その3 cmd = """select sid, title, date from [...]]]></description>
			<content:encoded><![CDATA[<p>　Pythonコード内にSQL文を書くときどうすれば良いのか、いまいち答えが探せなかったのでググって見た話。</p>
<p>　ちなみに、今までは下記のような感じのコードを書いていた訳だが、これ見るからに分かりにくい。</p>
<pre>
# コード例その1
        cur.execute("""
          create table count (
            sid text,
            count int);""")

# コード例その2
        try:
            cur.execute("""insert into count ( sid, count )
                           values ( :sid, :count );""", d)
        except sqlite3.IntegrityError:
            cur.execute("""update count set sid = :sid, count = : count
                           where sid = :sid;""", d)
# コード例その3
        cmd = """select sid, title, date from stories where date >= ? and date < ? and sid in (
                 select sid from topics where topic == ? and sid in (
                 select sid from topics where topic == ? )) order by date
        """
        cur.execute(cmd, (begin_t, end_t, t1, t2))
</pre>
<p>　「SQL インデント」でググると、そういう話のネタが一杯出てくるでてくる。その中から拾ってみたのが下記。</p>
<ul>
<li><a href="http://www.geocities.jp/mickindex/database/db_manner.html">SQLプログラミング作法</a></li>
<li><a href="http://d.hatena.ne.jp/r_ikeda/20090630/indent">SQL のコーディングスタイル（インデント） - 集中力なら売り切れたよ</a></li>
<li><a href="http://www.popxpop.com/archives/2007/05/sqlsql_in_form.html">SQL文をきれいにフォーマットしてくれる『SQL in Form』 - POP*POP ～ 世界のニュースをクオリティ重視で</a></li>
<li><a href="http://shinshu.fm/MHz/88.44/archives/0000049011.html">VB.NETで作る！ | SQL文の字下げ目安</a></li>
<li><a href="http://kamoland.com/wiki/wiki.cgi?SQL%A4%CE%C0%B0%B7%C1%A5%C4%A1%BC%A5%EB%A1%C1%C0%B0%B7%C1%B7%EB%B2%CC%A4%CE%CE%E3">SQLの整形ツール～整形結果の例 - プログラマー'sペイジ</a></li>
</ul>
<p>　異端だけど、<a href="http://d.zeromemory.info/2007/01/19/coding-rule-sql.html">俺的コーディングルール SQL編 – suVeneのアレ</a>というのも参考になった。</p>
<p>　で、この辺をまとめたところ、だいたい以下のようなルールに落ち着いた。</p>
<ul>
<li>SQLキーワードは大文字で</li>
<li>括弧挟まれた部分はインデントレベルを+1する</li>
<li>カンマ、ANDの直後で改行</li>
<li>カンマやANDでつなげられている部分はなるべくキーワード部分でそろえる</li>
</ul>
<p>　このルールで書いたコードは下記のような感じ。</p>
<pre>
# コード例その1
        cur.execute("""
            CREATE TABLE count (
                sid text,
                count int
            );
        """)

# コード例その2
        try:
            cur.execute("""
                INSERT INTO count (
                     sid,
                     count
                )
                VALUES (
                    :sid,
                    :count
                )
            """, d)
        except sqlite3.IntegrityError:
            cur.execute("""
                UPDATE count
                SET sid = :sid,
                    count = : count
                WHERE sid = :sid
            """, d)
# コード例その3
        cmd = """
            SELECT sid,
                   title,
                   date
            FROM stories
            WHERE date >= ? AND
                  date < ? AND
                  sid IN (
                      SELECT sid
                      FROM topics
                      WHERE topic == ? AND
                      sid IN (
                          SELECT sid
                          FROM topics
                          WHERE topic == ?
                      )
                  )
            ORDER BY DATE
        """
        cur.execute(cmd, (begin_t, end_t, t1, t2))
</pre>
<p>　<br />
　本当にこれで良いのかはまだ自信がないが、おおむね間違ってはいないと思う。ていうかコード内にSQL文を直書きせずO/Rマッパー使え、という話もあるが……。</p>
]]></content:encoded>
			<wfw:commentRss>http://hylom.net/2011/02/21/python-sql-indenting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>要ログインのサイトにPythonのurllib2でアクセスする</title>
		<link>http://hylom.net/2010/10/25/python-urllib2-cookie/</link>
		<comments>http://hylom.net/2010/10/25/python-urllib2-cookie/#comments</comments>
		<pubDate>Sun, 24 Oct 2010 15:55:22 +0000</pubDate>
		<dc:creator>hylom</dc:creator>
				<category><![CDATA[Docs]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[www]]></category>

		<guid isPermaLink="false">http://hylom.net/?p=1348</guid>
		<description><![CDATA[　ログインが必要なWebサイトに対してスクリプトでページを取得/送信したい場合、まずログイン用のURLに対しログイン情報をPOSTしてCookieを取得する、という作業を行うのが一般的だ。しかし、Pythonのurllib2を利用すると簡単にPOSTは行えるのだが、なぜかCookieを取得できない、という問題が発生することがある。 　これはurllib2のurlopen()でURLを開き、帰ってきたオブジェクトのinfo()メソッド経由でSet-Cookieヘッダを取得しようとする場合に発生する。たとえばCMSを使用しているWebサイトで、管理用ページ以外に（正当な）Cookieを持たずにアクセスするとCookieなしでアクセスできるトップページ等にリダイレクトされる、というケース。多くのCMSではログインに成功すると管理ページトップにリダイレクトされるのだが、urllib2のデフォルト設定ではCookie処理を行ってくれない＆リダイレクトを自動的に処理してくれるため、「ログイン成功→（Cookieを返すがurllib2はCookieを保存せず）→管理ページトップにリダイレクト→Cookieがないので公開ページのトップにリダイレクト→Cookieは受け取れず」という事態になってしまうことがある。 　この場合、urllib2.HTTPCookieProcessorを使ってCookie処理を行えばよいのだが、なぜかurllib2のドキュメントにはこのクラスの解説が無い。例にも上がっていない。ということで途方にくれるわけだが、実はCookieを扱うcookielibのほうに使い方の例が載っていたりする。 import cookielib # ： # （このへんでurlやencoded_data、headersを準備） # ： req = urllib2.Request(url, encoded_data, headers) cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) resp = opener.open(req) 　取得したCookieはCookieJarオブジェクトに保存されるので、必要に応じて適宜取り出せばOK。かわりにFileCookieJarオブジェクトを使えばファイルへのsave/loadも可能。]]></description>
			<content:encoded><![CDATA[<p>　ログインが必要なWebサイトに対してスクリプトでページを取得/送信したい場合、まずログイン用のURLに対しログイン情報をPOSTしてCookieを取得する、という作業を行うのが一般的だ。しかし、Pythonのurllib2を利用すると簡単にPOSTは行えるのだが、なぜかCookieを取得できない、という問題が発生することがある。</p>
<p>　これはurllib2のurlopen()でURLを開き、帰ってきたオブジェクトのinfo()メソッド経由でSet-Cookieヘッダを取得しようとする場合に発生する。たとえばCMSを使用しているWebサイトで、管理用ページ以外に（正当な）Cookieを持たずにアクセスするとCookieなしでアクセスできるトップページ等にリダイレクトされる、というケース。多くのCMSではログインに成功すると管理ページトップにリダイレクトされるのだが、urllib2のデフォルト設定ではCookie処理を行ってくれない＆リダイレクトを自動的に処理してくれるため、「ログイン成功→（Cookieを返すがurllib2はCookieを保存せず）→管理ページトップにリダイレクト→Cookieがないので公開ページのトップにリダイレクト→Cookieは受け取れず」という事態になってしまうことがある。</p>
<p>　この場合、urllib2.HTTPCookieProcessorを使ってCookie処理を行えばよいのだが、なぜかurllib2のドキュメントにはこのクラスの解説が無い。例にも上がっていない。ということで途方にくれるわけだが、実はCookieを扱うcookielibのほうに使い方の例が載っていたりする。</p>
<pre class="code">
import cookielib
# ：
# （このへんでurlやencoded_data、headersを準備）
# ：
req = urllib2.Request(url, encoded_data, headers)
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
resp = opener.open(req)
</pre>
<p>　取得したCookieはCookieJarオブジェクトに保存されるので、必要に応じて適宜取り出せばOK。かわりにFileCookieJarオブジェクトを使えばファイルへのsave/loadも可能。</p>
]]></content:encoded>
			<wfw:commentRss>http://hylom.net/2010/10/25/python-urllib2-cookie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pythonで被はてなブックマーク数を取得する</title>
		<link>http://hylom.net/2010/05/31/python_hatebu_withxmlrpclib/</link>
		<comments>http://hylom.net/2010/05/31/python_hatebu_withxmlrpclib/#comments</comments>
		<pubDate>Mon, 31 May 2010 10:43:54 +0000</pubDate>
		<dc:creator>hylom</dc:creator>
				<category><![CDATA[Docs]]></category>
		<category><![CDATA[module]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[xmlrpclib]]></category>

		<guid isPermaLink="false">http://hylom.net/?p=1270</guid>
		<description><![CDATA[　Pythonのxmlrpclibモジュールで、指定したURLの被はてなブックマーク数を取得する例。簡単ですね。 　server.bookmark.getCount()はURLをキー、被はてブ数の値とするdictionaryの形で返してくれるので、返ってきたデータの参照も楽勝です。URLの一覧を引数の形で与えなければならないのがなんか引っかかりますが……。 #!/usr/bin/env python import xmlrpclib def main(): uri = "http://b.hatena.ne.jp/xmlrpc" server = xmlrpclib.ServerProxy(uri) urls = ("http://sourceforge.jp/magazine/10/04/26/0244255", "http://sourceforge.jp/magazine/10/04/27/0326224", "http://sourceforge.jp/magazine/10/04/30/0243232") t = server.bookmark.getCount(*urls) for item in t: print item, t[item] if __name__ == "__main__": main()]]></description>
			<content:encoded><![CDATA[<p>　Pythonのxmlrpclibモジュールで、指定したURLの被はてなブックマーク数を取得する例。簡単ですね。</p>
<p>　server.bookmark.getCount()はURLをキー、被はてブ数の値とするdictionaryの形で返してくれるので、返ってきたデータの参照も楽勝です。URLの一覧を引数の形で与えなければならないのがなんか引っかかりますが……。</p>
<pre>
#!/usr/bin/env python

import xmlrpclib

def main():
    uri = "http://b.hatena.ne.jp/xmlrpc"
    server = xmlrpclib.ServerProxy(uri)
    urls = ("http://sourceforge.jp/magazine/10/04/26/0244255",
             "http://sourceforge.jp/magazine/10/04/27/0326224",
             "http://sourceforge.jp/magazine/10/04/30/0243232")

    t = server.bookmark.getCount(*urls)
    for item in t:
        print item, t[item]

if __name__ == "__main__":
    main()
</pre>
]]></content:encoded>
			<wfw:commentRss>http://hylom.net/2010/05/31/python_hatebu_withxmlrpclib/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pythonのwith構文と__enter__、__exit__</title>
		<link>http://hylom.net/2010/05/18/python_with_statemen/</link>
		<comments>http://hylom.net/2010/05/18/python_with_statemen/#comments</comments>
		<pubDate>Tue, 18 May 2010 11:27:36 +0000</pubDate>
		<dc:creator>hylom</dc:creator>
				<category><![CDATA[Docs]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://hylom.net/?p=1264</guid>
		<description><![CDATA[　Pythonのwith構文がいまいち掴めなかったので、ざっとまとめてみた（いまさらながら）。ドキュメントはPython リファレンスマニュアルの7.5 with 文にある。 　withを使ったコード例は、下記のような感じ。 c = ClassHogeHoge() with c: c.foobar() 　上記のコードは、下記と等価となる。 c = ClassHogeHoge() c.__enter__() c.foobar() c.__exit__() 　つまり、withに続くインデントブロックを実行する前に指定したオブジェクトの「__enter__()」メソッドを呼び出し、実行後に「__exit__()」メソッドが暗に呼び出される、という仕組み。 　__enter__()と__exit__()の定義は、Python リファレンスマニュアルの3.4.9 with文とコンテキストマネージャにある。__enter__()の引数はselfのみだが、__exit__()はself、exc_type、exc_value、tracebackの4つの引数をとる。withに続くインデントブロックが正常に実行された（つまり、例外が送出されなかった）場合、（self以外の）引数にはNoneが与えられる。なにか例外が発生した場合、その例外に関する情報が与えられるらしい。 　また、「with hogehoge as foo:」のような形でwith文を利用する場合、__enter__()の戻り値がfooに代入される。__exit__()の戻り値は例外処理の伝搬制御に使われ、Falseの場合例外が発生た場合でも例外を伝搬させず、Trueを返すと例外が伝搬されるとのこと。 　下記、使用例。 class CacheDB(object): DB_FILE = "database/db_dat" def __init__(self): self.con = None self.cur = None def __enter__(self): self.con = sqlite3.connect(self.DB_FILE) self.cur = self.con.cursor() def __exit__(self, exc_type, exc_value, traceback): if exc_type: [...]]]></description>
			<content:encoded><![CDATA[<p>　Pythonのwith構文がいまいち掴めなかったので、ざっとまとめてみた（いまさらながら）。ドキュメントは<a href="http://www.python.jp/doc/2.5/ref/with.html">Python リファレンスマニュアルの7.5 with 文</a>にある。</p>
<p>　withを使ったコード例は、下記のような感じ。</p>
<pre>
c = ClassHogeHoge()
with c:
    c.foobar()
</pre>
<p>　上記のコードは、下記と等価となる。</p>
<pre>
c = ClassHogeHoge()
c.__enter__()
c.foobar()
c.__exit__()
</pre>
<p>　つまり、withに続くインデントブロックを実行する前に指定したオブジェクトの「__enter__()」メソッドを呼び出し、実行後に「__exit__()」メソッドが暗に呼び出される、という仕組み。</p>
<p>　__enter__()と__exit__()の定義は、<a href="http://www.python.jp/doc/2.5/ref/context-managers.html">Python リファレンスマニュアルの3.4.9 with文とコンテキストマネージャ</a>にある。__enter__()の引数はselfのみだが、__exit__()はself、exc_type、exc_value、tracebackの4つの引数をとる。withに続くインデントブロックが正常に実行された（つまり、例外が送出されなかった）場合、（self以外の）引数にはNoneが与えられる。なにか例外が発生した場合、その例外に関する情報が与えられるらしい。</p>
<p>　また、「with hogehoge as foo:」のような形でwith文を利用する場合、__enter__()の戻り値がfooに代入される。__exit__()の戻り値は例外処理の伝搬制御に使われ、Falseの場合例外が発生た場合でも例外を伝搬させず、Trueを返すと例外が伝搬されるとのこと。</p>
<p>　下記、使用例。</p>
<pre>
class CacheDB(object):
    DB_FILE = "database/db_dat"

    def __init__(self):
        self.con = None
        self.cur = None

    def __enter__(self):
        self.con = sqlite3.connect(self.DB_FILE)
        self.cur = self.con.cursor()

    def __exit__(self, exc_type, exc_value, traceback):
        if exc_type:
            self.con = None
            self.cur = None
            return False
        self.con.commit()
        self.cur.close()
        self.con.close()
        self.con = None
        self.cur = None
        return True

    def add(self, foo, bar, hoge):
        try:
            self.cur.execute("""insert into data ( foo, bar, hoge )
                           values (?, ?, ?);""", (foo, bar, hoge))

def main():
    usage = "%s logfile" % sys.argv[0]
    db = CacheDB()
    try:
        fname = args[0]
    except IndexError:
        sys.exit(usage)

    f = open(fname, "r")
    with db:
        for l in f:
            term = l.strip().decode("utf-8").rsplit("\t", 3)
            db.add(foo=term[0],
                   bar=term[1],
                   hoge=term[2])

if __name__ == '__main__':
    main()
</pre>
<p>　タブ区切りのデータファイルを1行ずつ読んでデータベースに突込む、という処理。withを使うことで、データベースアクセスの準備→データ挿入→コミットという流れをきれいに実装できました。</p>
]]></content:encoded>
			<wfw:commentRss>http://hylom.net/2010/05/18/python_with_statemen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>日本語リファレンスには書いてない話：urllibとurllib2の違いってなんだ</title>
		<link>http://hylom.net/2010/02/10/urllib_and_urllib2_usag/</link>
		<comments>http://hylom.net/2010/02/10/urllib_and_urllib2_usag/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 15:51:57 +0000</pubDate>
		<dc:creator>hylom</dc:creator>
				<category><![CDATA[Docs]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://hylom.net/?p=1257</guid>
		<description><![CDATA[　Pythonでは、HTTPやFTPなどでファイルの送受信をするモジュールとして「urllib」と「urllib2」が用意されている。使い方も似ていて、どちらも引数としてURLを与えてurlopen()関数を呼び出すと自動的に対応したプロトコルでURLにアクセスしてデータを読み出せる、というものである。しかし、似たような名前で似たような機能を持つこの2つ、何が違うのかが明確にはドキュメントに記述されていない。そのためどちらを使うべきか迷って、そのたびにGoogleのお世話になるという状況だったのでざっとまとめてみよう。 　外から見える違いとしては、urlopen()の引数としてurllibはURL文字列のみを受け付けるのに対し、urllib2ではurllib2.Requestクラスを受け取ることができる、という点がある。urllib2.Requestクラスはリクエストを抽象化したクラスで、これを利用することでたとえばHTTPでのデータ送受信の際、任意のHTTPヘッダーを送信させるようなことが可能になる。また、urllibでは使用するproxyを直接引数で指定できるが、urllib2ではRequestオブジェクトで指定することになる。 　ということで、ただHTTPやFTPでデータを取得したいだけならurllibでもurllib2でもどちらでも対して変わらない、HTTPヘッダーをカスタマイズしたいならurllib2を使え、という話になる。あと、urllibにはurlretrive()という関数があったり、quote()/unquote()/urlencode()などの便利そうなユーティリティ関数がある、というくらい。 独自プロトコルを実装したい場合は？ 　いっぽう、挙動をカスタマイズしたい、独自プロトコルを実装したい、という場合は話が変わってくる。urllibもurllib2も独自プロトコルへの対応などのカスタマイズが可能なのだが、urllibはFancyURLopenerクラスの派生クラスで実装を行うのに対し、urllib2はBaseHandlerクラスの派生クラスで実装する。 　まず、urllibの場合。ドキュメントに記載されている例だが、たとえばUser-Agentを変更したい場合、下記のようにFancyURLopenerの派生クラスを作り、その初期化時に指定したいUserAgentをversion変数に代入するようにする。そして、この派生クラスのインスタンスをurllib._urlopenerに代入してやる。 import urllib class AppURLopener(urllib.FancyURLopener): def __init__(self, *args): self.version = "App/1.7" urllib.FancyURLopener.__init__(self, *args) urllib._urlopener = AppURLopener() 　これにより、以後はurllib.urlopen()などを呼び出した際、urllib._urlopener()で指定したインスタンスを使用してHTTP/FTPなどの処理が行われるようになる。 　ちなみに、FancyURLopenerとURLopenerの関係だが、HTTP/HTTPS/FTPなどの基本的な通信/データ取得処理はURLopener内で実装されており、FancyURLopenerはそれに各種HTTPレスポンスコードへの対応やリトライといった処理を実装したサブクラスとなっている。 　またドキュメントには記述されていないが、URLopenerにはaddheader()というメソッドが用意されており、ヘッダー名をキー、与えるデータを値にした辞書を引数として与えることで、任意のヘッダーを追加できる。 def addheader(self, *args): """Add a header to be used by the HTTP interface only e.g. u.addheader('Accept', 'sound/basic')""" self.addheaders.append(args) 　たとえばURLopenerの__init__()内では、次のようにしてUser-Agentを指定している。 self.addheaders = [('User-Agent', self.version)] 　なおURLopenerでは、urlopen()でHTTP/HTTPSのURLを与え、かつ第2引数が非Noneの場合（つまり、なんらかのデータを与えた場合）は「Content-Type: application/x-www-form-urlencoded」でのPOSTリクエストを利用するようにハードコーディングされている。そのため、ほかの形式でデータをPOSTしたい場合（ファイルを送信するなど）は、独自のURLopenerを作成する必要がある。 urllib2で独自プロトコルを使うには？ 　いっぽうurllib2で独自のプロトコルを扱いたい場合、まずプロトコルを実装したBaseHandler()派生クラスを用意し、続いてそれを引数として与えてbuild_opener()を呼び出してURLハンドラを作成、最後にそれをinstall_opener()引数に与えて登録、という手順となる。下記はドキュメントに記載されている例だ。 import urllib2 # ベーシック [...]]]></description>
			<content:encoded><![CDATA[<p>　Pythonでは、HTTPやFTPなどでファイルの送受信をするモジュールとして「<a href="http://www.python.jp/doc/2.4/lib/module-urllib.html">urllib</a>」と「<a href="http://www.python.jp/doc/2.4/lib/module-urllib2.html">urllib2</a>」が用意されている。使い方も似ていて、どちらも引数としてURLを与えてurlopen()関数を呼び出すと自動的に対応したプロトコルでURLにアクセスしてデータを読み出せる、というものである。しかし、似たような名前で似たような機能を持つこの2つ、何が違うのかが明確にはドキュメントに記述されていない。そのためどちらを使うべきか迷って、そのたびにGoogleのお世話になるという状況だったのでざっとまとめてみよう。</p>
<p><span id="more-1257"></span></p>
<p>　外から見える違いとしては、urlopen()の引数としてurllibはURL文字列のみを受け付けるのに対し、urllib2ではurllib2.Requestクラスを受け取ることができる、という点がある。urllib2.Requestクラスはリクエストを抽象化したクラスで、これを利用することでたとえばHTTPでのデータ送受信の際、任意のHTTPヘッダーを送信させるようなことが可能になる。また、urllibでは使用するproxyを直接引数で指定できるが、urllib2ではRequestオブジェクトで指定することになる。</p>
<p>　ということで、ただHTTPやFTPでデータを取得したいだけならurllibでもurllib2でもどちらでも対して変わらない、HTTPヘッダーをカスタマイズしたいならurllib2を使え、という話になる。あと、urllibにはurlretrive()という関数があったり、quote()/unquote()/urlencode()などの便利そうなユーティリティ関数がある、というくらい。</p>
<h4>独自プロトコルを実装したい場合は？</h4>
<p>　いっぽう、挙動をカスタマイズしたい、独自プロトコルを実装したい、という場合は話が変わってくる。urllibもurllib2も独自プロトコルへの対応などのカスタマイズが可能なのだが、urllibはFancyURLopenerクラスの派生クラスで実装を行うのに対し、urllib2はBaseHandlerクラスの派生クラスで実装する。</p>
<p>　まず、urllibの場合。ドキュメントに記載されている例だが、たとえばUser-Agentを変更したい場合、下記のようにFancyURLopenerの派生クラスを作り、その初期化時に指定したいUserAgentをversion変数に代入するようにする。そして、この派生クラスのインスタンスをurllib._urlopenerに代入してやる。</p>
<pre>
import urllib

class AppURLopener(urllib.FancyURLopener):
    def __init__(self, *args):
        self.version = "App/1.7"
        urllib.FancyURLopener.__init__(self, *args)

urllib._urlopener = AppURLopener()
</pre>
<p>　これにより、以後はurllib.urlopen()などを呼び出した際、urllib._urlopener()で指定したインスタンスを使用してHTTP/FTPなどの処理が行われるようになる。</p>
<p>　ちなみに、FancyURLopenerとURLopenerの関係だが、HTTP/HTTPS/FTPなどの基本的な通信/データ取得処理はURLopener内で実装されており、FancyURLopenerはそれに各種HTTPレスポンスコードへの対応やリトライといった処理を実装したサブクラスとなっている。</p>
<p>　またドキュメントには記述されていないが、URLopenerにはaddheader()というメソッドが用意されており、ヘッダー名をキー、与えるデータを値にした辞書を引数として与えることで、任意のヘッダーを追加できる。</p>
<pre>
    def addheader(self, *args):
        """Add a header to be used by the HTTP interface only
        e.g. u.addheader('Accept', 'sound/basic')"""
        self.addheaders.append(args)
</pre>
<p>　たとえばURLopenerの__init__()内では、次のようにしてUser-Agentを指定している。</p>
<pre>
        self.addheaders = [('User-Agent', self.version)]
</pre>
<p>　なおURLopenerでは、urlopen()でHTTP/HTTPSのURLを与え、かつ第2引数が非Noneの場合（つまり、なんらかのデータを与えた場合）は「Content-Type: application/x-www-form-urlencoded」でのPOSTリクエストを利用するようにハードコーディングされている。そのため、ほかの形式でデータをPOSTしたい場合（ファイルを送信するなど）は、独自のURLopenerを作成する必要がある。</p>
<h4>urllib2で独自プロトコルを使うには？</h4>
<p>　いっぽうurllib2で独自のプロトコルを扱いたい場合、まずプロトコルを実装したBaseHandler()派生クラスを用意し、続いてそれを引数として与えてbuild_opener()を呼び出してURLハンドラを作成、最後にそれをinstall_opener()引数に与えて登録、という手順となる。下記はドキュメントに記載されている例だ。</p>
<pre>
import urllib2
# ベーシック HTTP 認証をサポートする OpenerDirector を作成する...
auth_handler = urllib2.HTTPBasicAuthHandler()
auth_handler.add_password('realm', 'host', 'username', 'password')
opener = urllib2.build_opener(auth_handler)
# ...urlopen から利用できるよう、グローバルにインストールする
urllib2.install_opener(opener)
urllib2.urlopen('http://www.example.com/login.html')
</pre>
<p>　なお、urllib2の（デフォルトの）HTTP/HTTPSハンドラでも、urlopen()の第2引数が非Noneの場合（つまり、なんらかのデータを与えた場合）は「Content-Type: application/x-www-form-urlencoded」でのPOSTリクエストを利用するようにハードコーディングされている。そのため、ほかの形式でデータをPOSTしたい場合（ファイルを送信するなど）は、やっぱり独自のハンドラを作成する必要がある。</p>
<p>　ちなみに、Python3系ではPython2系のurllibは廃止され、urllib2もurllib.requestという名称に変更されている。ということで、Python3系を見据えるならurllibではなくurllib2を利用するのが望ましいようだ。</p>
]]></content:encoded>
			<wfw:commentRss>http://hylom.net/2010/02/10/urllib_and_urllib2_usag/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mako Templaters for Pythonメモ1：Makoってなに？</title>
		<link>http://hylom.net/2010/02/02/python_mako_intro/</link>
		<comments>http://hylom.net/2010/02/02/python_mako_intro/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 06:32:06 +0000</pubDate>
		<dc:creator>hylom</dc:creator>
				<category><![CDATA[Docs]]></category>
		<category><![CDATA[mako]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[template]]></category>

		<guid isPermaLink="false">http://hylom.net/?p=1247</guid>
		<description><![CDATA[　最近Pythonのテンプレートエンジン「Mako」を触ってるんだけど、日本語の情報が全然ないのでまとめてみる。 　Makoは「Hyperfast and lightweight templating for the Python platform.」（Pythonプラットフォーム向けの超高速で軽量なテンプレートエンジン）だ。Pythonのテンプレートエンジンとしては、Python標準ライブラリに含まれているstring.Templateや、WebフレームワークのDjangoに組み込まれているDjangoテンプレートエンジン、そしてCheetahなどが知られているが、Makoはそれらよりも高速で、テンプレート内にPythonコードを埋め込む機能や、キャッシュ機構などを備えてるのが特徴だ。また、文法もPython風であり習得しやすいのも利点だろう。 　いっぽう、特に大きな欠点は（いまのところ）見つかっていないのだが、日本語環境で利用する場合は文字コードをうまく扱うように適切にオプションを与える必要がある。 　ちなみに、MakoのWebサイトにはPython向けテンプレートエンジンのパフォーマンス比較が掲載されているのだが、ほかのテンプレートエンジンと比べてMakoは同等レベル以上に高速、という結果が出ているようだ。 Makoのインストール 　Makoはダウンロードページから行える。配布されているtar.gz形式のソースコードをダウンロードしてインストールできるほか、Pythonモジュール用のインストールマネージャ「easy_install」を利用してもインストールできる。 　ソースコードからインストールする場合は、ダウンロードしたアーカイブを展開し、次のように実行する。 # python setup.py install 　ちなみに、makoはすべてPythonコードで記述されているため、基本的にはPythonが動く環境であればどのプラットフォームでも動作するはずだ。 　つづく。]]></description>
			<content:encoded><![CDATA[<p>　最近Pythonのテンプレートエンジン「<a href="http://www.makotemplates.org/">Mako</a>」を触ってるんだけど、日本語の情報が全然ないのでまとめてみる。</p>
<div class="wp-caption aligncenter" style="width: 460px"><a href="http://www.makotemplates.org/"><img alt="Mako公式Webサイト" src="http://hylom.net/img/blog/100202/mako_web.png" title="Mako公式Webサイト" width="450" height="261" /></a><p class="wp-caption-text">Mako公式Webサイト</p></div>
<p><span id="more-1247"></span></p>
<p>　Makoは「Hyperfast and lightweight templating for the Python platform.」（Pythonプラットフォーム向けの超高速で軽量なテンプレートエンジン）だ。Pythonのテンプレートエンジンとしては、Python標準ライブラリに含まれている<a href="http://docs.python.org/library/string.html#template-strings">string.Template</a>や、Webフレームワークの<a href="http://www.djangoproject.com/">Django</a>に組み込まれている<a href="http://djangoproject.jp/doc/ja/1.0/ref/templates/api.html">Djangoテンプレートエンジン</a>、そして<a href="http://www.cheetahtemplate.org/">Cheetah</a>などが知られているが、Makoはそれらよりも高速で、テンプレート内にPythonコードを埋め込む機能や、キャッシュ機構などを備えてるのが特徴だ。また、文法もPython風であり習得しやすいのも利点だろう。</p>
<p>　いっぽう、特に大きな欠点は（いまのところ）見つかっていないのだが、日本語環境で利用する場合は文字コードをうまく扱うように適切にオプションを与える必要がある。</p>
<p>　ちなみに、MakoのWebサイトにはPython向けテンプレートエンジンのパフォーマンス比較が掲載されているのだが、ほかのテンプレートエンジンと比べてMakoは同等レベル以上に高速、という結果が出ているようだ。</p>
<h4>Makoのインストール</h4>
<p>　Makoは<a href="http://www.makotemplates.org/download.html">ダウンロードページ</a>から行える。配布されているtar.gz形式のソースコードをダウンロードしてインストールできるほか、Pythonモジュール用のインストールマネージャ「<a href="http://peak.telecommunity.com/DevCenter/EasyInstall">easy_install</a>」を利用してもインストールできる。</p>
<p>　ソースコードからインストールする場合は、ダウンロードしたアーカイブを展開し、次のように実行する。</p>
<pre>
# python setup.py install
</pre>
<p>　ちなみに、makoはすべてPythonコードで記述されているため、基本的にはPythonが動く環境であればどのプラットフォームでも動作するはずだ。</p>
<p>　つづく。</p>
]]></content:encoded>
			<wfw:commentRss>http://hylom.net/2010/02/02/python_mako_intro/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>pyblosxom用のブログ記事をWordPressにインポートする</title>
		<link>http://hylom.net/2009/12/11/migrate_pyblosxom_to_wordpress/</link>
		<comments>http://hylom.net/2009/12/11/migrate_pyblosxom_to_wordpress/#comments</comments>
		<pubDate>Thu, 10 Dec 2009 15:54:45 +0000</pubDate>
		<dc:creator>hylom</dc:creator>
				<category><![CDATA[Docs]]></category>
		<category><![CDATA[pybloxsom]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://hylom.net/?p=1225</guid>
		<description><![CDATA[<p>　以前このブログはPythonで書かれたブログシステム「<a href="http://pyblosxom.sourceforge.net/">pyblosxom</a>」を使って運用していたんだけど、機能拡張が面倒臭かった（＆色々細かいところが気にくわなかった）ので先日WordPressに移行しました。そこで面倒だったのが記事の移行。WordPressではMovableTypeとかBloggerとかからの移行ツールは充実しているんだけど、pyblosxomからの移行ツールは公式には用意されていません。また、参考情報としてWordPressの公式サイトで紹介されていた<a href="http://blog.unto.net/meta/migrating-from-blosxom-to-wordpress/">blosxomからの移行スクリプト</a>はURLやタグ情報を移行してくれなかったため、結局自前で変換スクリプトを用意することに。</p>]]></description>
			<content:encoded><![CDATA[<p>　以前このブログはPythonで書かれたブログシステム「<a href="http://pyblosxom.sourceforge.net/">pyblosxom</a>」を使って運用していたんだけど、機能拡張が面倒臭かった（＆色々細かいところが気にくわなかった）ので先日WordPressに移行しました。そこで面倒だったのが記事の移行。WordPressではMovableTypeとかBloggerとかからの移行ツールは充実しているんだけど、pyblosxomからの移行ツールは公式には用意されていません。また、参考情報としてWordPressの公式サイトで紹介されていた<a href="http://blog.unto.net/meta/migrating-from-blosxom-to-wordpress/">blosxomからの移行スクリプト</a>はURLやタグ情報を移行してくれなかったため、結局自前で変換スクリプトを用意することに。</p>
<p>　幸い、WordPressのインポート/エクスポートで使われるWXL（WordPress XML）形式のファイルを簡単に生成できるモジュールをGoogle様が提供しているのを発見、そいつを使ってお気楽に作成できました。ということでここでご紹介。</p>
<p>　スクリプト本体は<a href="http://github.com/hylom/pyblosxom2wp">github</a>で公開しているので必要な方は適宜どうぞ。「pyblosxom2wp.py」が本体です。このスクリプト内の頭で宣言している変数「title」にブログのタイトル、「link」にブログのリンクURL、「baseurl」をにBase URLが入るように書き換えて、次のように実行すると標準出力経由でインポート用XMLファイルが出力されます。</p>
<pre>./pyblosxom2wp.py ＜pyblosxomの記事ディレクトリ＞ &gt; output.xml</pre>
<p>あとはそいつをWordPressのインポート機能で読みこめばOK、のはず。これで、カテゴリやタグ、URLについてもできるだけ保持する形でインポートが可能です。</p>
]]></content:encoded>
			<wfw:commentRss>http://hylom.net/2009/12/11/migrate_pyblosxom_to_wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pythonネタ：unittestを使う</title>
		<link>http://hylom.net/2009/07/27/20090727_python_unittest/</link>
		<comments>http://hylom.net/2009/07/27/20090727_python_unittest/#comments</comments>
		<pubDate>Mon, 27 Jul 2009 08:50:35 +0000</pubDate>
		<dc:creator>hylom</dc:creator>
				<category><![CDATA[Docs]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://hylom.net/2009/07/27/20090727_python_unittest/</guid>
		<description><![CDATA[　Python標準のユニットテスト機能、「unittest」の使い方メモ。 目的 　unittestはPythonで作成したクラスの特定の関数や、機能の動作確認に利用できる機能だ。詳しくは ドキュメントを読めばすぐに分かる が、unittestクラスの派生クラスを作り、そのクラスの関数としてテストコードを記述してやると、簡単にユニットテストができる、というもの。 　メインの実装コードにprint文などを挿入したり、テストコードを挿入しても良いのだが、それだとテストコードの再利用が難しかったり、いったんバグ修正を行ってテストコードを削除した後に再度バグが発生したりした場合に二度手間になったりする。そのため、テストコードはなるべくunittestにまとめて記述しておくとデバッグや実装、テストが楽になりますよ、というお話。 使い方 　基本的な使い方はこれまたオンラインドキュメントにあるのだが、自分は下記の形をよく使っている。 import random import unittest class TestSequenceFunctions(unittest.TestCase): def setUp(self): # ここに各テスト関数を実行する前に呼び出す処理を書く。 # 通常は共通のデータの準備とかを書くことが多い def tearDown(self): # ここに各テスト関数を実行した後に呼び出す処理を書く。 # 通常は共通のデータの後片付けとかを書くことが多い def test_hogehoge(self): """test for hogehoge テストの内容をコメントに入れる""" # テストコード1をここに書く def test_foobar(self): """test for foobar テストの内容をコメントに入れる""" # テストコード2をここに書く # do unittest # テストオブジェクトを作成 suite = unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions) # テスト実行。出力するメッセージレベルはverbosity引数で設定できる unittest.TextTestRunner(verbosity=2).run(suite) 　テストコード内でテストが期待したとおりの処理を行っているかどうかは、unittest.TestCaseクラス内で用意されているasert/fail関数を使うのが好ましい。詳しくは「pydoc unittest」等で確認できるが、たとえば二つの引数の値が等しくない場合にエラーを出すには「assertEqual(引数1、引数2、エラーメッセージ)」関数を使う。 [...]]]></description>
			<content:encoded><![CDATA[<p> 　Python標準のユニットテスト機能、「unittest」の使い方メモ。</p>
<h4> 目的</h4>
<p> 　unittestはPythonで作成したクラスの特定の関数や、機能の動作確認に利用できる機能だ。詳しくは <a href="http://www.python.jp/doc/release/lib/module-unittest.html">  ドキュメントを読めばすぐに分かる </a> が、unittestクラスの派生クラスを作り、そのクラスの関数としてテストコードを記述してやると、簡単にユニットテストができる、というもの。</p>
<p> 　メインの実装コードにprint文などを挿入したり、テストコードを挿入しても良いのだが、それだとテストコードの再利用が難しかったり、いったんバグ修正を行ってテストコードを削除した後に再度バグが発生したりした場合に二度手間になったりする。そのため、テストコードはなるべくunittestにまとめて記述しておくとデバッグや実装、テストが楽になりますよ、というお話。</p>
<h4> 使い方</h4>
<p> 　基本的な使い方はこれまたオンラインドキュメントにあるのだが、自分は下記の形をよく使っている。</p>
<pre>
import random
import unittest

class TestSequenceFunctions(unittest.TestCase):
    def setUp(self):
        # ここに各テスト関数を実行する前に呼び出す処理を書く。
        # 通常は共通のデータの準備とかを書くことが多い

   def tearDown(self):
        # ここに各テスト関数を実行した後に呼び出す処理を書く。
        # 通常は共通のデータの後片付けとかを書くことが多い

    def test_hogehoge(self):
        """test for hogehoge テストの内容をコメントに入れる"""
        # テストコード1をここに書く

    def test_foobar(self):
        """test for foobar テストの内容をコメントに入れる"""
        # テストコード2をここに書く

# do unittest
# テストオブジェクトを作成
suite = unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions)

# テスト実行。出力するメッセージレベルはverbosity引数で設定できる
unittest.TextTestRunner(verbosity=2).run(suite)
</pre>
<p> 　テストコード内でテストが期待したとおりの処理を行っているかどうかは、unittest.TestCaseクラス内で用意されているasert/fail関数を使うのが好ましい。詳しくは「pydoc unittest」等で確認できるが、たとえば二つの引数の値が等しくない場合にエラーを出すには「assertEqual(引数1、引数2、エラーメッセージ)」関数を使う。</p>
<p> 　そのほか、unittestにはレポート機能などもあるが、基本的には上記さえ押さえておけば事足りるはず。</p>
]]></content:encoded>
			<wfw:commentRss>http://hylom.net/2009/07/27/20090727_python_unittest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pythonのクラスの挙動を調べる：class構文の外でクラスにメンバ関数を追加（2）</title>
		<link>http://hylom.net/2009/06/19/20090619_python_class2/</link>
		<comments>http://hylom.net/2009/06/19/20090619_python_class2/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 08:33:42 +0000</pubDate>
		<dc:creator>hylom</dc:creator>
				<category><![CDATA[Docs]]></category>
		<category><![CDATA[develop]]></category>
		<category><![CDATA[objective]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://hylom.net/2009/06/19/20090619_python_class2/</guid>
		<description><![CDATA[　今度は、別のモジュールで定義したクラスにメンバ関数を追加してみる。 [Macintosh:~]$ python Python 2.5.1 (r251:54863&#44; Feb 6 2009&#44; 19:02:12) [GCC 4.0.1 (Apple Inc. build 5465)] on darwin Type "help"&#44; "copyright"&#44; "credits" or "license" for more information. # importすることで定義されたクラスは、その名前空間内に閉じこめられる &#62;&#62;&#62; import foobar &#62;&#62;&#62; print foobar.FooBar &#60;class 'foobar.FooBar'&#62; # 名前空間が異なっていても、名前空間さえ指定すればメンバ関数を追加できる &#62;&#62;&#62; f = foobar.FooBar() &#62;&#62;&#62; f.show_name() I'm FooBar. &#62;&#62;&#62; def rename(self&#44;new_name): ... self.name = new_name ... [...]]]></description>
			<content:encoded><![CDATA[<p> 　今度は、別のモジュールで定義したクラスにメンバ関数を追加してみる。</p>
<pre>
[Macintosh:~]$ python
Python 2.5.1 (r251:54863&#44; Feb  6 2009&#44; 19:02:12)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help"&#44; "copyright"&#44; "credits" or "license" for more information.

 <b>  # importすることで定義されたクラスは、その名前空間内に閉じこめられる </b>

&gt;&gt;&gt; import foobar
&gt;&gt;&gt; print foobar.FooBar
&lt;class 'foobar.FooBar'&gt;

 <b>  # 名前空間が異なっていても、名前空間さえ指定すればメンバ関数を追加できる </b>

&gt;&gt;&gt; f = foobar.FooBar()
&gt;&gt;&gt; f.show_name()
I'm FooBar.
&gt;&gt;&gt; def rename(self&#44;new_name):
...     self.name = new_name
...
&gt;&gt;&gt; foobar.FooBar.rename = rename
&gt;&gt;&gt; f.rename("john")
&gt;&gt;&gt; f.show_name()
I'm john.
</pre>
<p> 　大体予想通りの結果ですな。</p>
]]></content:encoded>
			<wfw:commentRss>http://hylom.net/2009/06/19/20090619_python_class2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PythonでCGI経由でファイルアップロード</title>
		<link>http://hylom.net/2009/05/01/20090501_pyupload/</link>
		<comments>http://hylom.net/2009/05/01/20090501_pyupload/#comments</comments>
		<pubDate>Fri, 01 May 2009 05:51:56 +0000</pubDate>
		<dc:creator>hylom</dc:creator>
				<category><![CDATA[Docs]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://hylom.net/2009/05/01/20090501_pyupload/</guid>
		<description><![CDATA[　Webベースで記事作ったりサイトデザインしたりしていると、多量のファイルをアップロードする機会も多々あるのでファイルを自動アップロードするスクリプトを書きたい、という話。 　とりあえずググったら「 残高照会メモ: pythonでアップロード 」が出てきたのだが、自前でMIMEエンコーディングしなきゃいけないのがちょっとアレだ。 　ちなみにPerlだと下記のような感じでいける。 sub post_attachment { my $self = shift @_; my %args = @_; my $file_name = $args{file}; # filename my $url = "アップロード先URL"; my $ua = LWP::UserAgent->new( 'agent' => "適当なUserAgent文字列"&#44; ); my $req = HTTP::Request::Common::POST $url&#44; Content_Type => 'form-data'&#44; Content => [ file_content => ["$file_name"]&#44; description => ""&#44; op => [...]]]></description>
			<content:encoded><![CDATA[<p> 　Webベースで記事作ったりサイトデザインしたりしていると、多量のファイルをアップロードする機会も多々あるのでファイルを自動アップロードするスクリプトを書きたい、という話。</p>
<p> 　とりあえずググったら「 <a href="http://kyujobukuro.blogspot.com/2008/07/python_10.html">  残高照会メモ: pythonでアップロード </a> 」が出てきたのだが、自前でMIMEエンコーディングしなきゃいけないのがちょっとアレだ。</p>
<p> 　ちなみにPerlだと下記のような感じでいける。</p>
<pre>
sub post_attachment {
    my $self = shift @_;
    my %args = @_;

    my $file_name = $args{file};  # filename

    my $url = "アップロード先URL";
    my $ua = LWP::UserAgent->new( 'agent' => "適当なUserAgent文字列"&#44; );
    my $req = HTTP::Request::Common::POST $url&#44; Content_Type => 'form-data'&#44;
    Content => [
				file_content => ["$file_name"]&#44;
				description => ""&#44;
				op => "addFileForStory"&#44;   # form "op"の値
				sid => $sid&#44;               # form "sid"の値
				Submit => "Submit"&#44;        # form "Submit"の値
	];

    my $resp = $ua->request( $req );

    if( $resp->is_error ) {
	return 0; #print "upload $file_name: failed.\n";
    } else {
	return 1; #print "upload $file_name: succeed.\n";
    }
}
</pre>
<p> 　これをPythonでやりたい。ということで続く。</p>
]]></content:encoded>
			<wfw:commentRss>http://hylom.net/2009/05/01/20090501_pyupload/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

