<?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; programming</title>
	<atom:link href="http://hylom.net/tag/programming/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>Gitでブランチを間違えて作業した上にpushまでしちゃった場合の対処方法</title>
		<link>http://hylom.net/2011/03/01/how-to-reset-remote-git-branch/</link>
		<comments>http://hylom.net/2011/03/01/how-to-reset-remote-git-branch/#comments</comments>
		<pubDate>Tue, 01 Mar 2011 11:01:39 +0000</pubDate>
		<dc:creator>hylom</dc:creator>
				<category><![CDATA[Docs]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://hylom.net/?p=1374</guid>
		<description><![CDATA[　時間ができたのでHandBrake 0.9.5の日本語化に着手しているのだが、うっかり0.9.4のブランチで作業してしまったあげく、SourceForge.JP上のリポジトリにpushしてしまい途方に暮れる。 　まあこういうミスをやる人は少ないだろうが、何かのヒントになるかもしれないので対処法をメモしておく。まず、「git log」コマンドで巻き戻したいcommitのハッシュを調べる。 $ git log 　： 　： commit 1485a5a2bbbb43eedbe131c919b7d604bcbd506d Author: unknown Date: Tue Jan 5 19:19:44 2010 +0900 update Installer, changelog, readme 　今回は、この「1485a5a2bbbb43eedbe131c919b7d604bcbd506d」というcommitまで巻き戻すことにする。作業中のブランチが操作したいものであることを確認したうえで、「git reset ＜対象のハッシュ＞」を実行する。 $ git branch -a jp-0.9.3 * jp-0.9.4 master original remotes/origin/HEAD -> origin/master remotes/origin/jp-0.9.3 remotes/origin/jp-0.9.4 remotes/origin/master remotes/origin/original $ git reset 1485a5 Unstaged changes after reset: M Jamrules M Makefile [...]]]></description>
			<content:encoded><![CDATA[<p>　時間ができたのでHandBrake 0.9.5の日本語化に着手しているのだが、うっかり0.9.4のブランチで作業してしまったあげく、SourceForge.JP上のリポジトリにpushしてしまい途方に暮れる。</p>
<p>　まあこういうミスをやる人は少ないだろうが、何かのヒントになるかもしれないので対処法をメモしておく。まず、「git log」コマンドで巻き戻したいcommitのハッシュを調べる。</p>
<pre>
$ git log
　：
　：
commit 1485a5a2bbbb43eedbe131c919b7d604bcbd506d
Author: unknown <hirom@.(none)>
Date:   Tue Jan 5 19:19:44 2010 +0900

    update Installer, changelog, readme
</pre>
<p>　今回は、この「1485a5a2bbbb43eedbe131c919b7d604bcbd506d」というcommitまで巻き戻すことにする。作業中のブランチが操作したいものであることを確認したうえで、「git reset ＜対象のハッシュ＞」を実行する。</p>
<pre>
$ git branch -a
  jp-0.9.3
* jp-0.9.4
  master
  original
  remotes/origin/HEAD -> origin/master
  remotes/origin/jp-0.9.3
  remotes/origin/jp-0.9.4
  remotes/origin/master
  remotes/origin/original

$ git reset 1485a5
Unstaged changes after reset:
M       Jamrules
M       Makefile
M       win/C#/Installer/Installer.nsi
M       win/C#/InstallerJp/doc/AUTHORS
M       win/C#/InstallerJp/doc/CREDITS
M       win/C#/InstallerJp/doc/NEWS
M       win/C#/Properties/AssemblyInfo.cs
M       win/C#/frmAbout.Designer.cs
</pre>
<p>　「git log」で巻戻ったことを確認する。</p>
<pre>
$ git log
commit 1485a5a2bbbb43eedbe131c919b7d604bcbd506d
Author: unknown <hirom@.(none)>
Date:   Tue Jan 5 19:19:44 2010 +0900

    update Installer, changelog, readme
</pre>
<p>　バージョン管理されているファイル自体は巻き戻されていないので、「-f」オプション付きでチェックアウトしてファイルも巻き戻す。</p>
<pre>
$ git checkout -f
</pre>
<p>　ここまでの作業でローカルブランチの巻き戻しは完了。続いてリモートブランチの巻き戻しを行う。ただし、当然ながらそのままpushすることはできない。</p>
<pre>
$ git push
Enter passphrase for key '/d/Users/hirom/.ssh/id_dsa':
To hylom@git.sourceforge.jp:/gitroot/handbrake-jp/handbrake-jp.git
 ! [rejected]        jp-0.9.4 -> jp-0.9.4 (non-fast-forward)
error: failed to push some refs to 'hylom@git.sourceforge.jp:/gitroot/handbrake-
jp/handbrake-jp.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.
</pre>
<p>　そこで、いったんリモートブランチを削除した上で再度pushする。まずは削除。リモートブランチの削除は、「git push ＜リモートリポジトリ＞ :＜対象リモートブランチ＞」で行える。</p>
<pre>
$ git push origin :jp-0.9.4
Enter passphrase for key '/d/Users/hirom/.ssh/id_dsa':
To hylom@git.sourceforge.jp:/gitroot/handbrake-jp/handbrake-jp.git
 - [deleted]         jp-0.9.4
</pre>
<p>　あとは再度ローカルリポジトリをpushするだけ。</p>
<pre>
$ git push origin jp-0.9.4:jp-0.9.4
Enter passphrase for key '/d/Users/hirom/.ssh/id_dsa':
Counting objects: 233, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (146/146), done.
Writing objects: 100% (165/165), 30.48 KiB, done.
Total 165 (delta 119), reused 0 (delta 0)
To hylom@git.sourceforge.jp:/gitroot/handbrake-jp/handbrake-jp.git
 * [new branch]      jp-0.9.4 -> jp-0.9.4
</pre>
<p>　お粗末様でした。</p>
]]></content:encoded>
			<wfw:commentRss>http://hylom.net/2011/03/01/how-to-reset-remote-git-branch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>gitメモ：ブランチを切ってないのにやばいコードを書いちゃった場合</title>
		<link>http://hylom.net/2010/07/30/git-branch-with-stash/</link>
		<comments>http://hylom.net/2010/07/30/git-branch-with-stash/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 00:32:22 +0000</pubDate>
		<dc:creator>hylom</dc:creator>
				<category><![CDATA[Docs]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://hylom.net/?p=1302</guid>
		<description><![CDATA[　gitを使ってコードの管理をしている場合において、実験的なコードを書く場合はソースコードを編集する前にブランチを作成しておくのが基本だ。しかし、ついブランチを作成し忘れたままでコードを変更してしまった、というパターンがある。 　この場合、下記のようにgit stashでいったん変更点を保存した上で直前のcommitに戻し、新たなブランチを作成してそこでgit stash applyを行えばよい。 $ git stash $ git checkout hogehoge -b $ git stash apply $ git add hogehoge foobar $ git commit 　git stash、便利だ。]]></description>
			<content:encoded><![CDATA[<p>　gitを使ってコードの管理をしている場合において、実験的なコードを書く場合はソースコードを編集する前にブランチを作成しておくのが基本だ。しかし、ついブランチを作成し忘れたままでコードを変更してしまった、というパターンがある。</p>
<p>　この場合、下記のようにgit stashでいったん変更点を保存した上で直前のcommitに戻し、新たなブランチを作成してそこでgit stash applyを行えばよい。</p>
<pre>
$ git stash
$ git checkout hogehoge -b
$ git stash apply
$ git add hogehoge foobar
$ git commit
</pre>
<p>　git stash、便利だ。</p>
]]></content:encoded>
			<wfw:commentRss>http://hylom.net/2010/07/30/git-branch-with-stash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Small Basic 0.9リリース</title>
		<link>http://hylom.net/2010/06/14/small-basic-09-release/</link>
		<comments>http://hylom.net/2010/06/14/small-basic-09-release/#comments</comments>
		<pubDate>Mon, 14 Jun 2010 04:20:56 +0000</pubDate>
		<dc:creator>hylom</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[basic]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://hylom.net/?p=1282</guid>
		<description><![CDATA[　Microsoftがプログラミング学習用としてリリースしているBASICプログラミング環境「Small Basic」の0.9が6月11日にリリースされた。 　Small Basicブログによると、Small Basicコンパイラのパフォーマンス強化や新規ライブラリの追加などが行われているとのこと。ループが多いプログラムで、4倍ものパフォーマンス向上を達成できた例もあるそうだ。 　追加されたライブラリでは、MML的記法で音楽を再生できる「PlayMusic」機能が面白そうだ。教育用とはいえ、Flickr連携や作成したプログラムをSilverlightを用いてWebブラウザ上で実行する機能などもあり、ちょっとしたユーティリティなどを作成するのにも便利かもしれない。]]></description>
			<content:encoded><![CDATA[<p>　Microsoftがプログラミング学習用としてリリースしているBASICプログラミング環境「Small Basic」の0.9が6月11日にリリースされた。</p>
<p>　<a href="http://blogs.msdn.com/b/smallbasic/archive/2010/06/11/small-basic-v0-9-is-here.aspx">Small Basicブログ</a>によると、Small Basicコンパイラのパフォーマンス強化や新規ライブラリの追加などが行われているとのこと。ループが多いプログラムで、4倍ものパフォーマンス向上を達成できた例もあるそうだ。</p>
<p>　追加されたライブラリでは、MML的記法で音楽を再生できる「PlayMusic」機能が面白そうだ。教育用とはいえ、Flickr連携や作成したプログラムをSilverlightを用いてWebブラウザ上で実行する機能などもあり、ちょっとしたユーティリティなどを作成するのにも便利かもしれない。</p>
]]></content:encoded>
			<wfw:commentRss>http://hylom.net/2010/06/14/small-basic-09-release/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>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>gitメモ：diffとやり直し</title>
		<link>http://hylom.net/2009/12/02/git_diff_rese/</link>
		<comments>http://hylom.net/2009/12/02/git_diff_rese/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 06:33:52 +0000</pubDate>
		<dc:creator>hylom</dc:creator>
				<category><![CDATA[Docs]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://hylom.net/?p=1217</guid>
		<description><![CDATA[　最近久しぶりにgitを触って色々と忘れていたので再度メモ。]]></description>
			<content:encoded><![CDATA[<p>　最近久しぶりにgitを触って色々と忘れていたので再度メモ。</p>
<h4>mergeを取り消す</h4>
<p>　mergeを実行したらconflictが大量に出てしまったので取り消したい、という場合、下記を実行。</p>
<pre class="command">
$ git reset --hard ORIG_HEAD
</pre>
<h4>conflictを解決する</h4>
<p>　gitにはmergeを実行した場合にconflictを解決するコマンド「git mergetool」がある。conflictしているファイルに対して、順番にdiffツールを実行して編集を促すもの。しかし、Windows上のMSysGit環境で実行したら見事にvimのdiffが実行されたので個人的にはデフォルトでは使えない認定（自分はvimはあまり使えないので）。</p>
<pre class="command">
$ git mergetool
</pre>
<p>　.gitconfigの「merge」および「mergetool」項目で起動するツールを設定できるそうなので、今度はEmacsに設定してテストしてみようかな。</p>
<h4>diffを使う</h4>
<p>　<a href="http://www.kernel.org/pub/software/scm/git/docs/git-diff.html">マニュアル</a>に書いてあるけど、「git diff」コマンドの書式は下記のとおり。</p>
<pre>
git diff <比較元commit> <比較先commit> [<対象ファイルパス>]
</pre>
<p>　ここで、比較元・比較先commitはハッシュだけでなく、「HEAD」（最新のコミット）や「HEAD^」（最新の1つ前のコミット）、「HEAD^^」（最新の2つ前のコミット）、「HEAD~4」（最新の4つ前のコミット）などのほか、tagも利用可能。</p>
<p>　例えば最新のコミットと、その1つ前のコミットでdiffを取るには次のようにする。</p>
<pre class="command">
$ git diff HEAD^ HEAD hogehoge.py
</pre>
]]></content:encoded>
			<wfw:commentRss>http://hylom.net/2009/12/02/git_diff_rese/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>

