<?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>ハセテツラボ &#187; Python</title>
	<atom:link href="http://tt-house.com/category/python/feed" rel="self" type="application/rss+xml" />
	<link>http://tt-house.com</link>
	<description>生涯一開発屋</description>
	<lastBuildDate>Wed, 08 Sep 2010 23:42:04 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>DjangoでDatetimeのフィールドを年月でGroupByして集計する方法</title>
		<link>http://tt-house.com/2010/07/django-annotate-groupby.html</link>
		<comments>http://tt-house.com/2010/07/django-annotate-groupby.html#comments</comments>
		<pubDate>Thu, 29 Jul 2010 02:53:25 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=328</guid>
		<description><![CDATA[以前のエントリーで集計クエリを利用する方法を説明しましたが、それだとDatetimeのフィールドを「年月」ごとに、っていう集計はできませんでした。購買履歴データを月別に件数集計したいときなんかは非常に困るんですよね。ので、それを解決する方法です。 select_column = {&#8220;d_column&#8221;:  &#8221;DATE_FORMAT(pub_date, &#8216;%%Y%%m&#8217;)&#8221;} _list = PurchaseRecord.objects.extra(select=select_column) _list = _list.values(&#8220;d_column&#8221;).annotate(cnt=Count(&#8216;id&#8217;)) 上記はMySQLを利用しているケースの書き方です。 あ、横長になると見難いから2行に分けただけで、1行で大丈夫ですからね。 「ORマッパー使ってるのにデータベースに依存ってなによ」 な感じではありますが、extraを使っている部分は直接クエリが流れるみたいですね。 つまり、「DATE_FORMAT(pub_date, &#8216;%%Y%%m&#8217;)」の部分は select *,DATE_FORMAT(pub_date, &#8216;%Y%m&#8217;) as d_column from app_purchaserecord といった風に、追加されるのです。で、追加されたカラムを使って集計、という流れですね。うっかりミスりやすいのが「%」を二つにする点でしょうか。 あと、データベースを変えたら「select_column～」の部分に修正が必要です。使用するデータベースに依存した書き方になります。ここは要注意ですね。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2010%252F07%252Fdjango-annotate-groupby.html%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2Faztedn%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Django%E3%81%A7Datetime%E3%81%AE%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%92%E5%B9%B4%E6%9C%88%E3%81%A7GroupBy%E3%81%97%E3%81%A6%E9%9B%86%E8%A8%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%22%20%7D);"></div>
<p><a title="Djangoで集計クエリ（1.1以降でannotateを使用）" href="http://tt-house.com/2010/04/django-query-annotate.html" target="_blank">以前のエントリーで集計クエリを利用する方法を説明</a>しましたが、それだとDatetimeのフィールドを「年月」ごとに、っていう集計はできませんでした。購買履歴データを月別に件数集計したいときなんかは非常に困るんですよね。ので、それを解決する方法です。</p>
<blockquote>
<div id="_mcePaste">select_column = {&#8220;d_column&#8221;:  &#8221;DATE_FORMAT(pub_date, &#8216;%%Y%%m&#8217;)&#8221;}</div>
<div id="_mcePaste">_list = PurchaseRecord.objects.extra(select=select_column)<br />
_list = _list.values(&#8220;d_column&#8221;).annotate(cnt=Count(&#8216;id&#8217;))</div>
</blockquote>
<p>上記はMySQLを利用しているケースの書き方です。</p>
<p>あ、横長になると見難いから2行に分けただけで、1行で大丈夫ですからね。</p>
<p>「ORマッパー使ってるのにデータベースに依存ってなによ」</p>
<p>な感じではありますが、extraを使っている部分は直接クエリが流れるみたいですね。<br />
つまり、「<span style="font-size: 13.2px;">DATE_FORMAT(pub_date, &#8216;%%Y%%m&#8217;)</span><span style="font-size: 13.2px;">」の部分は</span></p>
<blockquote>
<div><span style="font-size: 13.2px;">select *,</span><span style="font-size: 13.2px;">DATE_FORMAT(pub_date, &#8216;%Y%m&#8217;) as d_column<br />
from app_purchaserecord </span></div>
</blockquote>
<p>といった風に、追加されるのです。で、追加されたカラムを使って集計、という流れですね。うっかりミスりやすいのが「%」を二つにする点でしょうか。</p>
<p>あと、データベースを変えたら「select_column～」の部分に修正が必要です。使用するデータベースに依存した書き方になります。ここは要注意ですね。</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/07/django-annotate-groupby.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Djangoのmodelで自分自身に対するリレーション（再帰的なリレーション）を張る</title>
		<link>http://tt-house.com/2010/07/django-self-relation.html</link>
		<comments>http://tt-house.com/2010/07/django-self-relation.html#comments</comments>
		<pubDate>Wed, 28 Jul 2010 08:22:59 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=326</guid>
		<description><![CDATA[例えば組織図なんかのmodelを構築する際に、「属する部門」を表現するには再帰的なリレーションを使うことになると思います。「部門が属する部門」ですね。 class Div(models.Model): name = models.CharField(max_length=100) upper = models.ForeignKey(Div) だと、syncdbの時に「Divなんてありません」と怒られてしまいます。そりゃそうだ。 ので、 class Div(models.Model): name = models.CharField(max_length=100) upper = models.ForeignKey(&#8216;self&#8217;) と書きます。 Python2.5、Django1.1.1でのお話でした。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2010%252F07%252Fdjango-self-relation.html%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2F9CZXSa%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Django%E3%81%AEmodel%E3%81%A7%E8%87%AA%E5%88%86%E8%87%AA%E8%BA%AB%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%EF%BC%88%E5%86%8D%E5%B8%B0%E7%9A%84%E3%81%AA%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%EF%BC%89%E3%82%92%E5%BC%B5%E3%82%8B%22%20%7D);"></div>
<p>例えば組織図なんかのmodelを構築する際に、「属する部門」を表現するには再帰的なリレーションを使うことになると思います。「部門が属する部門」ですね。</p>
<blockquote><p>class Div(models.Model):</p>
<p style="padding-left: 30px;">name = models.CharField(max_length=100)</p>
<p style="padding-left: 30px;">upper = models.ForeignKey(Div)</p>
</blockquote>
<p>だと、syncdbの時に「Divなんてありません」と怒られてしまいます。そりゃそうだ。<br />
ので、</p>
<blockquote><p>class Div(models.Model):</p>
<p style="padding-left: 30px;">name = models.CharField(max_length=100)</p>
<p style="padding-left: 30px;">upper = models.ForeignKey(&#8216;self&#8217;)</p>
</blockquote>
<p>と書きます。</p>
<p>Python2.5、Django1.1.1でのお話でした。</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/07/django-self-relation.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DjangoでMySQLのストレージエンジンをInnoDBにする</title>
		<link>http://tt-house.com/2010/07/django-using-innodb.html</link>
		<comments>http://tt-house.com/2010/07/django-using-innodb.html#comments</comments>
		<pubDate>Tue, 27 Jul 2010 02:12:30 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=324</guid>
		<description><![CDATA[DjangoでMySQLを利用する場合、初期状態だとMyISAMでテーブルが作成されます。まぁ後からalterすればよい話ではあるのですが、なんかそれだと違うかなぁと。 一昔前はInnoDBはMyISAMほどパフォーマンスが優れず、更新系のテーブルと参照系のテーブルでストレージエンジンを使い分けたものですが、今はストレージエンジンによるパフォーマンスの差も少ないため、行レベルロックができるInnoDBを積極的に採用するケースが増えてるみたいですね。まぁ数千万行をレコードから数ミリ秒でレスポンスを返さないといけないケースとかではどうなるのかわかりませんが。 DATABASE_OPTIONS = { &#8220;init_command&#8221;: &#8220;SET storage_engine=INNODB&#8221;, } settings.pyに上記を記載するだけでsyncdbするときにInnoDBでテーブル作成してくれます。が、この記述はテーブル作成が終わって運用にはいったら削除するように、とのことです。 MySQLとの接続が確立された後にわざわざストレージエンジンを指定するコマンドを送っているっぽいので、普段は無駄な処理が発生しちゃうっていうことなんですかね。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2010%252F07%252Fdjango-using-innodb.html%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FcyuL5I%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Django%E3%81%A7MySQL%E3%81%AE%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3%E3%82%92InnoDB%E3%81%AB%E3%81%99%E3%82%8B%22%20%7D);"></div>
<p>DjangoでMySQLを利用する場合、初期状態だとMyISAMでテーブルが作成されます。まぁ後からalterすればよい話ではあるのですが、なんかそれだと違うかなぁと。</p>
<p>一昔前はInnoDBはMyISAMほどパフォーマンスが優れず、更新系のテーブルと参照系のテーブルでストレージエンジンを使い分けたものですが、今はストレージエンジンによるパフォーマンスの差も少ないため、行レベルロックができるInnoDBを積極的に採用するケースが増えてるみたいですね。まぁ数千万行をレコードから数ミリ秒でレスポンスを返さないといけないケースとかではどうなるのかわかりませんが。</p>
<blockquote>
<div id="_mcePaste">DATABASE_OPTIONS = {</div>
<div id="_mcePaste" style="padding-left: 30px;">&#8220;init_command&#8221;: &#8220;SET storage_engine=INNODB&#8221;,</div>
<div id="_mcePaste">}</div>
</blockquote>
<p>settings.pyに上記を記載するだけでsyncdbするときにInnoDBでテーブル作成してくれます。が、この記述はテーブル作成が終わって運用にはいったら削除するように、とのことです。</p>
<p>MySQLとの接続が確立された後にわざわざストレージエンジンを指定するコマンドを送っているっぽいので、普段は無駄な処理が発生しちゃうっていうことなんですかね。</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/07/django-using-innodb.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Djangoでテンプレート出力と同時にcookieを書き込む方法</title>
		<link>http://tt-house.com/2010/05/django-template-cookie.html</link>
		<comments>http://tt-house.com/2010/05/django-template-cookie.html#comments</comments>
		<pubDate>Wed, 19 May 2010 07:53:51 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=292</guid>
		<description><![CDATA[Djangoでテンプレートを出力するとき、あわせてcookieの書き込みもしたいケースがあります。よくあるサンプルだと return render_to_response(&#8216;index.html&#8217;) っていう書き方をしているのですが、「コレ、cookieの書き出しどうすんのよ」って悩んでしまいました。その結果、 def  index(request): _max_age = 45*24*60*60 _expires = datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=_max_age), &#8220;%a, %d-%b-%Y %H:%M:%S GMT&#8221;) _response = render_to_response(&#8216;index.html&#8217;) _response.set_cookie(&#8216;hoge&#8217;, value=&#8217;hogehoge&#8217;, max_age=_max_age, expires=_expires, path=&#8217;/') return _response こんな書き方をしたらできているようでした。上記の例だと、現在時刻から45日間有効なcookieを書き出しています。 単純なことなんですが、意外と躓いてしまった。。。 Python2.5、Django1.1.1です。 そういえばDjangoの1.2がリリースされてますね。検証したいな。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2010%252F05%252Fdjango-template-cookie.html%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Django%E3%81%A7%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E5%87%BA%E5%8A%9B%E3%81%A8%E5%90%8C%E6%99%82%E3%81%ABcookie%E3%82%92%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%82%80%E6%96%B9%E6%B3%95%22%20%7D);"></div>
<p>Djangoでテンプレートを出力するとき、あわせてcookieの書き込みもしたいケースがあります。よくあるサンプルだと</p>
<blockquote><p>return render_to_response(&#8216;index.html&#8217;)</p></blockquote>
<p>っていう書き方をしているのですが、「コレ、cookieの書き出しどうすんのよ」って悩んでしまいました。その結果、</p>
<blockquote>
<div id="_mcePaste">def  index(request):</div>
<div id="_mcePaste" style="padding-left: 30px;">_max_age = 45*24*60*60</div>
<div id="_mcePaste" style="padding-left: 30px;">_expires = datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=_max_age), &#8220;%a, %d-%b-%Y %H:%M:%S GMT&#8221;)</div>
<div id="_mcePaste" style="padding-left: 30px;">_response = render_to_response(&#8216;index.html&#8217;)</div>
<div id="_mcePaste" style="padding-left: 30px;">_response.set_cookie(&#8216;hoge&#8217;, value=&#8217;hogehoge&#8217;, max_age=_max_age, expires=_expires, path=&#8217;/')</div>
<div id="_mcePaste" style="padding-left: 30px;">return _response</div>
</blockquote>
<p>こんな書き方をしたらできているようでした。上記の例だと、現在時刻から45日間有効なcookieを書き出しています。</p>
<p>単純なことなんですが、意外と躓いてしまった。。。</p>
<p>Python2.5、Django1.1.1です。</p>
<p>そういえばDjangoの1.2がリリースされてますね。検証したいな。</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/05/django-template-cookie.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHPとRubyとPythonのパフォーマンスを比較してみました</title>
		<link>http://tt-house.com/2010/05/php-ruby-python-2.html</link>
		<comments>http://tt-house.com/2010/05/php-ruby-python-2.html#comments</comments>
		<pubDate>Tue, 11 May 2010 02:44:50 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=286</guid>
		<description><![CDATA[同じような処理をさせた場合、PHP、Ruby、Pythonでどの言語が一番早いのか。非常に気になるところでありますが、試したことがありませんでした。今回試してみたところ、意外な結果が出たのです。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2010%252F05%252Fphp-ruby-python-2.html%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22PHP%E3%81%A8Ruby%E3%81%A8Python%E3%81%AE%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%82%92%E6%AF%94%E8%BC%83%E3%81%97%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F%22%20%7D);"></div>
<p><a title="RubyとPythonについて考えてみました" href="http://tt-house.com/2010/04/think-about-ruby-python.html" target="_blank">前回のエントリ</a>が結局フレームワークの話になってしまったため、新しいエントリを書きました。</p>
<p>同じような処理をさせた場合、どの言語が一番早いのか。非常に気になるところでありますが、試したことがありませんでした。今回試してみたところ、意外な結果が出たのです。</p>
<p>下の方に書いたそれぞれのプログラムを実行した結果の、プログラム内部で計測したミリ秒を比較してます。</p>
<table class="post">
<tbody>
<tr>
<th>PHP</th>
<th>Ruby</th>
<th>Python</th>
</tr>
<tr>
<td>2.80秒</td>
<td>0.36秒</td>
<td>0.93秒</td>
</tr>
</tbody>
</table>
<p>3回計測した平均です。同じ処理をさせるプログラムを書いたつもりですが、本当にフェアなものになっているのか正直自信がありません。そもそもPHPはWebアプリを主な目的としているとのことなので、こういう処理は得意としていないのかもしれない。</p>
<p>また、それぞれのプログラムのループ内2行目、文字列連結の部分をコメントアウトして実行してみると、これまた意外な結果が出ました。</p>
<table class="post">
<tbody>
<tr>
<th>PHP</th>
<th>Ruby</th>
<th>Python</th>
</tr>
<tr>
<td>0.07秒</td>
<td>0.06秒</td>
<td>0.39秒</td>
</tr>
</tbody>
</table>
<p>PHPは文字列連結が苦手なんだろうか。暗黙的な型変換にコストがかかるのだろうか、等々考えてしまいます。それとも秒を求める部分がネックなんですかね。その辺は今後追っていきます。</p>
<p>ただ、これまでPythonの方がRubyより早い、と思っていたために自分の無知さに猛烈に恥ずかしい思いをしています。</p>
<p>実際にMySQLと連携するバッチを書いたときにはRubyの方が遅かったり、Railsアプリがもっさりだったり、「速い」という印象がまったくありませんでした。が、それはある特定の面しかみていない上での思い込みだったのかもしれません。</p>
<p>これはRailsが遅いのか、もしくはMySQL/Rubyが遅いのか。当時の書き方がマズかったのか。今後、いろんなケースでこういった比較をしてみようかと。</p>
<p>今回の検証がすべてではないし、これが答えだとも思っていません。また、そういう意図を含んだエントリではありません。今回の検証だって、特定の面しか見ていません。が、あまりに意外な結果だったため、自戒の念を含めてブログに書きました。</p>
<p>「こう書くともっとフェアだよ」「こういうテストの方がいいんじゃない」等、アドバイスいただけるとうれしいです。</p>
<p>フレームワークまで含めた検証した方が現実的なのだろうか。。。</p>
<hr /><strong>PHP</strong></p>
<blockquote><p>#!/usr/bin/php<br />
&lt;?<br />
function microtime_float()<br />
{</p>
<p style="padding-left: 30px;">list($usec, $sec) = explode(&#8221; &#8220;, microtime());<br />
return ((float)$usec + (float)$sec);</p>
<p>}<br />
$_start = microtime_float();<br />
$_sec = date(&#8216;s&#8217;);</p>
<p>for($i=1;$i&lt;100000;$i++)<br />
{</p>
<p style="padding-left: 30px;">$_val = (mt_rand(0, 100) + $i) / $i;<br />
$_str = $_val.date(&#8216;s&#8217;);</p>
<p>}</p>
<p>echo microtime_float() &#8211; $_start;<br />
?&gt;</p></blockquote>
<p><strong>Ruby</strong></p>
<blockquote><p>#! /usr/local/bin/ruby</p>
<p>i=1<br />
_start = Time.now</p>
<p>99999.times do</p>
<p style="padding-left: 30px;">_val = rand(100) / i<br />
_str = _val.to_s + Time.now.sec.to_s<br />
i += 1</p>
<p>end</p>
<p>p (Time.now &#8211; _start).to_f</p></blockquote>
<p><strong>Python</strong></p>
<blockquote><p>#!/usr/bin/python<br />
# -*- coding: utf-8 -*-<br />
import datetime<br />
import random</p>
<p>_start = datetime.datetime.now()</p>
<p>for i in range(1, 100000):</p>
<p style="padding-left: 30px;">_val = random.randint(0, 100) / i<br />
_str = str(_val) + str(datetime.datetime.now().second)</p>
<p>print datetime.datetime.now() &#8211; _start</p></blockquote>
<hr />検証環境</p>
<p>CPU:Xeon 1.86GHz<br />
メモリ:2GB<br />
OS: CentOS5.4 32bit<br />
PHP:5.2.11<br />
Ruby:1.8.7<br />
Python:2.5.2</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/05/php-ruby-python-2.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Pythonでバーコードを作成する</title>
		<link>http://tt-house.com/2010/05/python-barcode.html</link>
		<comments>http://tt-house.com/2010/05/python-barcode.html#comments</comments>
		<pubDate>Fri, 07 May 2010 02:18:07 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=282</guid>
		<description><![CDATA[バーコードリーダーではなく、バーコードの画像を作成する方法です。EANコード（JANコード）を作成してみます。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2010%252F05%252Fpython-barcode.html%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Python%E3%81%A7%E3%83%90%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%22%20%7D);"></div>
<p>バーコードリーダーではなく、バーコードの画像を作成する方法です。EANコード（JANコード）を作成してみます。</p>
<p>必要なライブラリはhuBarcode。現時点でのバージョンは0.57です。easy_installでもインストールできます。</p>
<p>実はこのhuBarcodeにちょっと問題があって、インストールしたままでは利用できませんでした。</p>
<ol>
<li>site-packages/hubarcode-0.57-py2.5.egg/ean13/__init__.pyと<br />
site-packages/hubarcode-0.57-py2.5.egg/ean13/renderer.pyの<br />
「from functools import reduce」をコメントアウト。</li>
<li> fontsフォルダ（WindowsのFontフォルダではなく、huBarcodeについているもの）site-packagesの下に配置。easy_installの場合は不明だが、ソースからのインストールの場合は手動で配置する必要があった。</li>
</ol>
<p>「from functools import reduce」はPython3からの記述方法なのかな？Python2.5の環境では動きませんでした。</p>
<p>ここまでが前準備。やっとコーディングに入れます。</p>
<blockquote><p>from ean13 import EAN13Encoder</p>
<p>_barcode = EAN13Encoder(&#8217;123456789012&#8242;)<br />
_barcode.save(&#8220;sample.png&#8221;)</p></blockquote>
<p>コーディングは簡単。これだけでバーコードのpng画像が作成されます。EANは13桁ですが、最後の一桁はチェックサムなので、指定できるのは12桁までです。</p>
<p>どっちかっていうと二次元コードの方がニーズがあるだろうから、そっちも調査してみます。</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/05/python-barcode.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pythonで数値を3桁区切り</title>
		<link>http://tt-house.com/2010/04/python-number-format.html</link>
		<comments>http://tt-house.com/2010/04/python-number-format.html#comments</comments>
		<pubDate>Wed, 28 Apr 2010 07:52:09 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=280</guid>
		<description><![CDATA[Windows環境とLinux（CentOS5.4）環境とで異なったのでメモ。 import locale locale.setlocale(locale.LC_ALL,&#8217;ja&#8217;) print locale.format(&#8216;%d&#8217;, 123456789, True) Windows環境ならこれでOKですが、Linux（CentOS5.4）環境なら、以下になります。 import locale locale.setlocale(locale.LC_ALL,&#8217;ja_JP.UTF-8&#8242;) print locale.format(&#8216;%d&#8217;, 123456789, True) 環境の文字コードにも依存するんだと思います。環境のlocaleに関する情報は locale.setlocale(locale.LC_ALL,&#8221;) で取得できます。 Python2.5です。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2010%252F04%252Fpython-number-format.html%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Python%E3%81%A7%E6%95%B0%E5%80%A4%E3%82%923%E6%A1%81%E5%8C%BA%E5%88%87%E3%82%8A%22%20%7D);"></div>
<p>Windows環境とLinux（CentOS5.4）環境とで異なったのでメモ。</p>
<blockquote><p>import locale</p>
<p>locale.setlocale(locale.LC_ALL,&#8217;ja&#8217;)<br />
print locale.format(&#8216;%d&#8217;, 123456789, True)</p></blockquote>
<p>Windows環境ならこれでOKですが、Linux（CentOS5.4）環境なら、以下になります。</p>
<blockquote><p>import locale</p>
<p>locale.setlocale(locale.LC_ALL,&#8217;ja_JP.UTF-8&#8242;)<br />
print locale.format(&#8216;%d&#8217;, 123456789, True)</p></blockquote>
<p>環境の文字コードにも依存するんだと思います。環境のlocaleに関する情報は</p>
<blockquote><p>locale.setlocale(locale.LC_ALL,&#8221;)</p></blockquote>
<p>で取得できます。</p>
<p>Python2.5です。</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/04/python-number-format.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RubyとPythonについて考えてみました</title>
		<link>http://tt-house.com/2010/04/think-about-ruby-python.html</link>
		<comments>http://tt-house.com/2010/04/think-about-ruby-python.html#comments</comments>
		<pubDate>Tue, 27 Apr 2010 05:28:06 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyOnRails]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=278</guid>
		<description><![CDATA[ハセテツは複数の言語を状況に応じて使い分けてきましたが、最近のWeb系開発はPython（+Django）がメインになってきています。

ちょっと前までRuby（+Rails）だったのですが、いろいろと考えるところもあり、乗り換えました。その乗り換えた理由をまとめてみようと思います。

まとめてみたら「やっぱりRailsじゃね？」となるかもしれません。ｗ]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2010%252F04%252Fthink-about-ruby-python.html%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Ruby%E3%81%A8Python%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E8%80%83%E3%81%88%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F%22%20%7D);"></div>
<p>ハセテツは複数の言語を状況に応じて使い分けてきましたが、最近のWeb系開発はPython（+Django）がメインになってきています。</p>
<p>ちょっと前までRuby（+Rails）だったのですが、いろいろと考えるところもあり、乗り換えました。その乗り換えた理由をまとめてみようと思います。</p>
<p>まとめてみたら「やっぱりRailsじゃね？」となるかもしれません。ｗ</p>
<p>Ruby（+Rails）</p>
<ul>
<li>Rails便利すぎる。</li>
<li>コントローラとモデルが別々のファイルになってくれるのはソースが追いやすい。</li>
<li>Railsを通さない画像やCSSはpublicフォルダに置けばよいのはわかりやすい。</li>
<li>urlディスパッチャーがいまいち使いにくい。（知らないだけかも）</li>
<li>APサーバはmongrel一択？</li>
<li>VirtualHost使おうとするとApache+Passenger（mod_rails）だが、これが重い。（チューニングで速くなるのかも）</li>
<li>というか、Railsがそもそも重い。</li>
<li>ちゅーか、Rubyが重い、遅い。</li>
<li>PassengerはWindowsじゃ動かない。</li>
<li>mongrelもPassengerより激速軽快かというと、そうでもない。</li>
<li>gem便利すぎ。</li>
<li>ワンライナで書く人が多くて、Perlとおなじ匂いがする。</li>
</ul>
<p>ハセテツが使っていたRubyは1.8で、速くなったといわれる1.9には触れていないのでもしかすると古いのかもしれません。でも、Railsって1.9には対応してないですよね？（本日現在）</p>
<p>Python（+Django）</p>
<ul>
<li>Django便利すぎる。</li>
<li>日本語の書籍、情報が少なすぎる。（ハマるとキツい）</li>
<li>modelが一枚のファイルなので、大量のmodelがあると可読性が激しくダウン。</li>
<li>viewファイルをフォルダで分けたくても、アプリケーションフォルダ直下以外にviewファイル置くなら「sys.path.append」しないといけない。（違う？）</li>
<li>urlディスパッチャーのカスタマイズが超便利。</li>
<li>mod_pythonが使えるので、Windows環境だろうがLinux環境だろうが気にせずVirtualHostが使える。</li>
<li>速い。</li>
<li>日本語大変。Shift_JIS怖い。</li>
<li>easy_installでパッケージのインストールは楽だが、管理が悪夢。</li>
</ul>
<p>メリットとデメリットが入り乱れました。見難くてすいません。</p>
<p>結局フルスタックのフレームワークということで、DjangoとRailｓに関しては一長一短だと思います。個人的にはRailsの方が良くできてたかなぁと。</p>
<p>最終的に、「RubyonRailsは重い」というオチになってしまうのです。Rubyも、Railsも、です。ただ、これはRuby1.9が実は劇的に速くなっていて、1.9に対応したRailsがリリースされたらすべて解決されるのかもしれません。</p>
<p>それでも、いまのところPythonの軽快さ、シンプルさに満足しています。あと、GAEでPythonが動くのもいいですよね。</p>
<p>「Googleが導入した言語」というのがハセテツ的に琴線に触れたのかもしれません。</p>
<p>ミーハーですいません。ｗ</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/04/think-about-ruby-python.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>受信したメールをパイプでPythonに渡して本文読んだり添付を保存したり</title>
		<link>http://tt-house.com/2010/04/python-pipe-mail.html</link>
		<comments>http://tt-house.com/2010/04/python-pipe-mail.html#comments</comments>
		<pubDate>Thu, 22 Apr 2010 03:08:58 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=272</guid>
		<description><![CDATA[携帯メールでのブログエントリ投稿だったり、ユーザ登録だったり、メールのパイプ処理って結構重要だと思います。パイプさせなくてもcronで定期的にPOPすればいい話ですが、それだとユーザからのリクエストに対してシームレスに反応できないですよね。それはなんかイヤなんです。 #!/usr/bin/python # -*- coding: utf-8 -*- import sys, os, email _mail = email.message_from_file(sys.stdin) for item in _mail.walk(): if  item.get_content_maintype()==&#8217;text&#8217;: _file = open(&#8216;/path/to/save/log.txt&#8217;, &#8216;a&#8217;) _file.write(_mail['Subject']+&#8217;\r\n&#8217;) _file.write(item.get_payload(decode=True)+&#8217;\r\n&#8217;)  #body _file.close() elif  item.get_content_maintype()==&#8217;image&#8217;: _filename = item.get_filename() _attache = open(&#8216;/path/to/save/&#8217;+_filename, &#8216;wb&#8217;)  #添付ファイルを保存 _attache.write(item.get_payload(decode=True)) _attache.close() Python2.5です。 標準入力で読み込んで、要素（きちんと理解できてないのですが、boundaryで区切ったものってことだろうか）ごとにイテレートして、content_maintypeがtextなのかimageなのかで処理を分岐しています。ちなみに、content_maintypeはExcelファイルだったら「application」になります。 なお、エンコード処理入れてないのとエラー処理入れてないのです。いつものことなのです。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2010%252F04%252Fpython-pipe-mail.html%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%E5%8F%97%E4%BF%A1%E3%81%97%E3%81%9F%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E3%83%91%E3%82%A4%E3%83%97%E3%81%A7Python%E3%81%AB%E6%B8%A1%E3%81%97%E3%81%A6%E6%9C%AC%E6%96%87%E8%AA%AD%E3%82%93%E3%81%A0%E3%82%8A%E6%B7%BB%E4%BB%98%E3%82%92%E4%BF%9D%E5%AD%98%E3%81%97%E3%81%9F%E3%82%8A%22%20%7D);"></div>
<p>携帯メールでのブログエントリ投稿だったり、ユーザ登録だったり、メールのパイプ処理って結構重要だと思います。パイプさせなくてもcronで定期的にPOPすればいい話ですが、それだとユーザからのリクエストに対してシームレスに反応できないですよね。それはなんかイヤなんです。</p>
<blockquote><p>#!/usr/bin/python<br />
# -*- coding: utf-8 -*-</p>
<p>import sys, os, email</p>
<p>_mail = email.message_from_file(sys.stdin)</p>
<p>for item in _mail.walk():</p>
<p style="padding-left: 30px;">if  item.get_content_maintype()==&#8217;text&#8217;:</p>
<p style="padding-left: 60px;">_file = open(&#8216;/path/to/save/log.txt&#8217;, &#8216;a&#8217;)<br />
_file.write(_mail['Subject']+&#8217;\r\n&#8217;)<br />
_file.write(item.get_payload(decode=True)+&#8217;\r\n&#8217;)  #body<br />
_file.close()</p>
<p style="padding-left: 30px;">elif  item.get_content_maintype()==&#8217;image&#8217;:</p>
<p style="padding-left: 60px;">_filename = item.get_filename()</p>
<p style="padding-left: 60px;">_attache = open(&#8216;/path/to/save/&#8217;+_filename, &#8216;wb&#8217;)  #添付ファイルを保存<br />
_attache.write(item.get_payload(decode=True))<br />
_attache.close()</p>
</blockquote>
<p>Python2.5です。</p>
<p>標準入力で読み込んで、要素（きちんと理解できてないのですが、boundaryで区切ったものってことだろうか）ごとにイテレートして、content_maintypeがtextなのかimageなのかで処理を分岐しています。ちなみに、content_maintypeはExcelファイルだったら「application」になります。</p>
<p>なお、エンコード処理入れてないのとエラー処理入れてないのです。いつものことなのです。</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/04/python-pipe-mail.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Djangoでパスワード等の暗号化保存を隠蔽する</title>
		<link>http://tt-house.com/2010/04/django-model-save-override.html</link>
		<comments>http://tt-house.com/2010/04/django-model-save-override.html#comments</comments>
		<pubDate>Wed, 21 Apr 2010 10:47:01 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=269</guid>
		<description><![CDATA[隠蔽するっていうか、viewにごりごり書くのではなくてModelのメソッドで処理してしまおうという話です。このエントリの応用ですね。 import hashlib class Member(models.Model): &#160;&#160;&#160;&#160;name = models.CharField(max_length=32) &#160;&#160;&#160;&#160;passwd = models.CharField(max_length=256) &#160;&#160;&#160;&#160;def save(self, force_insert=False, force_update=False): &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;self.passwd = hashlib.md5(self.passwd).hexdigest() &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;super(Member, self).save(force_insert, force_insert) Modelのsave()メソッドをオーバーライドしています。これで、登録フォームなどからPOSTされたデータをそのままsave()してもデータベース上には暗号化された状態で保存されます。 adminサイトで作成したユーザ情報なんかのパスワードとかも、暗号化して保存してくれます。便利便利。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2010%252F04%252Fdjango-model-save-override.html%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Django%E3%81%A7%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E7%AD%89%E3%81%AE%E6%9A%97%E5%8F%B7%E5%8C%96%E4%BF%9D%E5%AD%98%E3%82%92%E9%9A%A0%E8%94%BD%E3%81%99%E3%82%8B%22%20%7D);"></div>
<p>隠蔽するっていうか、viewにごりごり書くのではなくてModelのメソッドで処理してしまおうという話です。<a href="http://tt-house.com/2010/01/python-hash-md5.html" target="_blank">このエントリ</a>の応用ですね。</p>
<blockquote><p>import hashlib</p>
<div id="_mcePaste">class Member(models.Model):</div>
<div id="_mcePaste">&nbsp;&nbsp;&nbsp;&nbsp;name = models.CharField(max_length=32)</div>
<div id="_mcePaste">&nbsp;&nbsp;&nbsp;&nbsp;passwd = models.CharField(max_length=256)</div>
<div id="_mcePaste">&nbsp;&nbsp;&nbsp;&nbsp;def save(self, force_insert=False, force_update=False):</div>
<div id="_mcePaste">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.passwd = hashlib.md5(self.passwd).hexdigest()</div>
<div id="_mcePaste">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(Member, self).save(force_insert, force_insert)</div>
</blockquote>
<div>Modelのsave()メソッドをオーバーライドしています。これで、登録フォームなどからPOSTされたデータをそのままsave()してもデータベース上には暗号化された状態で保存されます。</div>
<div>adminサイトで作成したユーザ情報なんかのパスワードとかも、暗号化して保存してくれます。便利便利。</div>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/04/django-model-save-override.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
