<?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>ハセテツラボ</title>
	<atom:link href="http://tt-house.com/feed" rel="self" type="application/rss+xml" />
	<link>http://tt-house.com</link>
	<description>生涯一開発屋</description>
	<lastBuildDate>Thu, 29 Jul 2010 02:53:25 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<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[
<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(&#8217;self&#8217;)

と書きます。
Python2.5、Django1.1.1でのお話でした。

]]></description>
			<content:encoded><![CDATA[
<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(&#8217;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[
<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>Objective-Cでの文字列比較</title>
		<link>http://tt-house.com/2010/07/objective-c-nsstring.html</link>
		<comments>http://tt-house.com/2010/07/objective-c-nsstring.html#comments</comments>
		<pubDate>Sat, 24 Jul 2010 08:34:49 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[objective-c]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=322</guid>
		<description><![CDATA[
iPhoneアプリの開発やっていて、はじめにつまずいたのはIBOutletとIBActionの使い方でした。ここで「？」ってなる人多いんじゃないかなぁ。

最近はobjective-cの文法に手間取っています。文字列の比較でつまずくレベルです。w

NSString* _str = @&#8221;hoge&#8221;;
if([_str isEqualToString:@"hoge"])
{
NSLog(@&#8221;match!&#8221;);
}

これだけなんですけどね。ついつい「_str ==@&#8221;hoge&#8221;」って書いちゃう。

]]></description>
			<content:encoded><![CDATA[
<div id="_mcePaste">iPhoneアプリの開発やっていて、はじめにつまずいたのはIBOutletとIBActionの使い方でした。ここで「？」ってなる人多いんじゃないかなぁ。</div>
<div></div>
<div>最近はobjective-cの文法に手間取っています。文字列の比較でつまずくレベルです。w</div>
<blockquote>
<div>NSString* _str = @&#8221;hoge&#8221;;</div>
<div id="_mcePaste">if([_str isEqualToString:@"hoge"])</div>
<div id="_mcePaste">{</div>
<div id="_mcePaste" style="padding-left: 30px;">NSLog(@&#8221;match!&#8221;);</div>
<div id="_mcePaste">}</div>
</blockquote>
<div>これだけなんですけどね。ついつい「_str ==@&#8221;hoge&#8221;」って書いちゃう。</div>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/07/objective-c-nsstring.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SmartyでArrayの内容を出力する</title>
		<link>http://tt-house.com/2010/07/smarty-print_r.html</link>
		<comments>http://tt-house.com/2010/07/smarty-print_r.html#comments</comments>
		<pubDate>Tue, 13 Jul 2010 03:14:19 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Smarty]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=318</guid>
		<description><![CDATA[
PHPではprint_rでArrayの内容を出力できますが、smartyの場合どうしたらよいものかと。まぁループして書き出せばよいのですが、それは面倒だなと。
{$array&#124;@debug_print_var}
これで出力できます。簡単ですね。
最近ものすごく久しぶりにPHPを書いていますが、Array関連のメソッドが非常に豊富で、便利だなぁと。

]]></description>
			<content:encoded><![CDATA[
<p>PHPではprint_rでArrayの内容を出力できますが、smartyの場合どうしたらよいものかと。まぁループして書き出せばよいのですが、それは面倒だなと。</p>
<blockquote><p>{$array|@debug_print_var}</p></blockquote>
<p>これで出力できます。簡単ですね。</p>
<p>最近ものすごく久しぶりにPHPを書いていますが、Array関連のメソッドが非常に豊富で、便利だなぁと。</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/07/smarty-print_r.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhoneアプリをリリースしました</title>
		<link>http://tt-house.com/2010/06/my-first-iphoneapp-answer9.html</link>
		<comments>http://tt-house.com/2010/06/my-first-iphoneapp-answer9.html#comments</comments>
		<pubDate>Sun, 20 Jun 2010 07:05:36 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=307</guid>
		<description><![CDATA[
やっと初めてのiPhoneアプリをリリースすることができました。
iPhoneアプリが作りたくてmac買ったのにiPhoneの母艦としてしか使わずに早一年。実際の開発期間は一ヶ月以下という情けないだらしなさです。申し訳ない。
「Answer9」
単純なパズルゲームです。３秒間の間にパネルの場所覚えてめくっていくだけ。ノーマルモードだと1から順番に9までめくっていきます。ハードモードの場合はめくる順番をランダムに指定されます。ハセテツはハードモードをクリアしたことがありません。w

リリースしてから24時間程度ですが、アメリカですでにレビューを書いていただけました。２件あって、両方とも五つ星！最高にうれしいです。開発屋にとって、こういうのが最高の報酬なんだろうなと思う瞬間です。
「It&#8217;s a great memory game for all ages!」
「Very simple, but it&#8217;s a nice memory exerciser.」
感涙です。
このまま勢いに乗って調子に乗って、次のアプリ開発に着手します。次はタスク管理アプリ。タスク管理はシンプルじゃないと意味がないんですよ。偉い人にはそれがわからんのです。

]]></description>
			<content:encoded><![CDATA[
<p>やっと初めてのiPhoneアプリをリリースすることができました。</p>
<p>iPhoneアプリが作りたくてmac買ったのにiPhoneの母艦としてしか使わずに早一年。実際の開発期間は一ヶ月以下という情けないだらしなさです。申し訳ない。</p>
<p><a title="Answer9" href="http://itunes.apple.com/jp/app/answer9/id377562141?mt=8" target="_blank">「Answer9」</a></p>
<p>単純なパズルゲームです。３秒間の間にパネルの場所覚えてめくっていくだけ。ノーマルモードだと1から順番に9までめくっていきます。ハードモードの場合はめくる順番をランダムに指定されます。ハセテツはハードモードをクリアしたことがありません。w</p>
<p><a href="http://tt-house.com/wp-content/uploads/2010/06/Screenshot-2010.06.11-22.41.29.jpg"><img class="alignnone size-thumbnail wp-image-308" title="Screenshot 2010.06.11 22.41.29" src="http://tt-house.com/wp-content/uploads/2010/06/Screenshot-2010.06.11-22.41.29-150x150.jpg" alt="" width="150" height="150" /></a><a href="http://tt-house.com/wp-content/uploads/2010/06/Screenshot-2010.06.11-22.42.14.jpg"><img class="alignnone size-thumbnail wp-image-309" title="Screenshot 2010.06.11 22.42.14" src="http://tt-house.com/wp-content/uploads/2010/06/Screenshot-2010.06.11-22.42.14-150x150.jpg" alt="" width="150" height="150" /></a><a href="http://tt-house.com/wp-content/uploads/2010/06/Screenshot-2010.06.11-22.42.45.jpg"><img class="alignnone size-thumbnail wp-image-310" title="Screenshot 2010.06.11 22.42.45" src="http://tt-house.com/wp-content/uploads/2010/06/Screenshot-2010.06.11-22.42.45-150x150.jpg" alt="" width="150" height="150" /></a></p>
<p>リリースしてから24時間程度ですが、アメリカですでにレビューを書いていただけました。２件あって、両方とも五つ星！最高にうれしいです。開発屋にとって、こういうのが最高の報酬なんだろうなと思う瞬間です。</p>
<p>「It&#8217;s a great memory game for all ages!」</p>
<p>「Very simple, but it&#8217;s a nice memory exerciser.」</p>
<p>感涙です。</p>
<p>このまま勢いに乗って調子に乗って、次のアプリ開発に着手します。次はタスク管理アプリ。タスク管理はシンプルじゃないと意味がないんですよ。偉い人にはそれがわからんのです。</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/06/my-first-iphoneapp-answer9.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RubyonRailsでOAuth経由でTwitterのタイムラインを取得する</title>
		<link>http://tt-house.com/2010/06/rubyonrails-oauth-twitter.html</link>
		<comments>http://tt-house.com/2010/06/rubyonrails-oauth-twitter.html#comments</comments>
		<pubDate>Fri, 18 Jun 2010 03:56:23 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyOnRails]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=301</guid>
		<description><![CDATA[
OAuthを使えるようになっておけば今後いろいろなマッシュアップに便利だろうと思い、試してみました。RoRで書いたのは、最近ご無沙汰過ぎてあまりに覚えてなかったのでリハビリを兼ねたわけです。
class TwitterAuth
require &#8216;oauth&#8217;
def self.consumer
OAuth::Consumer.new(
[Consumer key],
[Consumer secret],
:site =&#62; &#8220;http://api.twitter.com&#8221;
)
end
def self.request_token(_token, _secret)
OAuth::RequestToken.new(
consumer,
_token,
_secret
)
end
def self.access_token(_token, _secret)
OAuth::AccessToken.new(
consumer,
_token,
_secret
)
end
end
まずは上記のクラスを作成。OAuth関連の処理はこっちにやらせます。で、次がコントローラー。
require &#8216;rubytter&#8217;
class AuthController &#60; ApplicationController
def index
request_token = TwitterAuth.consumer.get_request_token(:oauth_callback =&#62; &#8220;http://#{request.host_with_port}/auth/callback&#8221;)
session[:request_token] = request_token
redirect_to request_token.authorize_url
end
def callback
_token = session[:request_token]
request_token = TwitterAuth.request_token(_token.token, _token.secret)
access_token = request_token.get_access_token(
{},
:oauth_token =&#62; params[:oauth_token],
:oauth_verifier =&#62; params[:oauth_verifier]
)
session[:request_token]=nil
_account = {
:user_id =&#62; access_token.params[:user_id],
:token =&#62; access_token.token,
:secret =&#62; access_token.secret
}
session[:account] = _account
redirect_to :action =&#62; &#8220;timeline&#8221;
end
def timeline
_account = session[:account]
token = TwitterAuth.access_token(_account[:token] , [...]]]></description>
			<content:encoded><![CDATA[
<p>OAuthを使えるようになっておけば今後いろいろなマッシュアップに便利だろうと思い、試してみました。RoRで書いたのは、最近ご無沙汰過ぎてあまりに覚えてなかったのでリハビリを兼ねたわけです。</p>
<blockquote><p>class TwitterAuth<br />
require &#8216;oauth&#8217;</p>
<p style="padding-left: 30px;">def self.consumer</p>
<p style="padding-left: 60px;">OAuth::Consumer.new(<br />
[Consumer key],<br />
[Consumer secret],<br />
:site =&gt; &#8220;http://api.twitter.com&#8221;<br />
)</p>
<p style="padding-left: 30px;">end</p>
<p style="padding-left: 30px;">def self.request_token(_token, _secret)</p>
<p style="padding-left: 60px;">OAuth::RequestToken.new(<br />
consumer,<br />
_token,<br />
_secret<br />
)</p>
<p style="padding-left: 30px;">end</p>
<p style="padding-left: 30px;">def self.access_token(_token, _secret)</p>
<p style="padding-left: 60px;">OAuth::AccessToken.new(<br />
consumer,<br />
_token,<br />
_secret<br />
)</p>
<p style="padding-left: 30px;">end</p>
<p>end</p></blockquote>
<p>まずは上記のクラスを作成。OAuth関連の処理はこっちにやらせます。で、次がコントローラー。</p>
<blockquote><p>require &#8216;rubytter&#8217;</p>
<p>class AuthController &lt; ApplicationController</p>
<p style="padding-left: 30px;">def index</p>
<p style="padding-left: 60px;">request_token = TwitterAuth.consumer.get_request_token(:oauth_callback =&gt; &#8220;http://#{request.host_with_port}/auth/callback&#8221;)<br />
session[:request_token] = request_token<br />
redirect_to request_token.authorize_url</p>
<p style="padding-left: 30px;">end</p>
<p style="padding-left: 30px;">def callback</p>
<p style="padding-left: 60px;">_token = session[:request_token]<br />
request_token = TwitterAuth.request_token(_token.token, _token.secret)<br />
access_token = request_token.get_access_token(<br />
{},<br />
:oauth_token =&gt; params[:oauth_token],<br />
:oauth_verifier =&gt; params[:oauth_verifier]<br />
)<br />
session[:request_token]=nil<br />
_account = {<br />
:user_id =&gt; access_token.params[:user_id],<br />
:token =&gt; access_token.token,<br />
:secret =&gt; access_token.secret<br />
}<br />
session[:account] = _account<br />
redirect_to :action =&gt; &#8220;timeline&#8221;</p>
<p style="padding-left: 30px;">end</p>
<p style="padding-left: 30px;">def timeline</p>
<p style="padding-left: 60px;">_account = session[:account]<br />
token = TwitterAuth.access_token(_account[:token] , _account[:secret])<br />
_twitter = OAuthRubytter.new(token)<br />
@user_timeline = _twitter.user_timeline(_account[:user_id],:count =&gt; 100)</p>
<p style="padding-left: 30px;">end</p>
<p>end</p></blockquote>
<p>def timelineが自分のタイムラインを取ってくるところで、「:count=&gt;100」と指定しているのは「新着100件取ってきて」っていうことです。ここを指定しないでおくと規定値では２０件取得してくれます。def callbackでセッションに入れたuser_id、token、secretをデータベース等に保存しておけば次回以降はこれらだけで認証とツイートの取得ができます（というか認証自体はtokenとsecretだけでOK）。</p>
<p><a title="アプリケーション登録申請" href="http://twitter.com/apps/new" target="_blank">Twitterのアプリケーション登録申請</a>で登録する際、コールバックURLを指定しないとWebアプリケーションとして登録されません。「開発中だからURLなんて決まってないよ」っていうケースでも、適当なURLを登録しておいてください。どうせ実際のコールバックURLはRubyのスクリプトで指定しなおしています。ハセテツはここに気が付かず、そこそこの時間を浪費しました。</p>
<p>で、タイムラインを表示するviewは</p>
<blockquote><p>&lt;ul&gt;<br />
&lt;% for item in @user_timeline do -%&gt;<br />
&lt;li&gt;&lt;%= item.text %&gt;&lt;/li&gt;<br />
&lt;% end -%&gt;<br />
&lt;/ul&gt;</p></blockquote>
<p>こんな感じです。</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/06/rubyonrails-oauth-twitter.html/feed</wfw:commentRss>
		<slash:comments>1</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[
<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[
<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(&#8217;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(&#8217;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[
<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(&#8216;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>
	</channel>
</rss>
