<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3228836498109417031</id><updated>2012-01-16T03:17:43.292+09:00</updated><category term='PIL'/><category term='google app engine'/><category term='formbuild'/><category term='openid'/><category term='paste.script'/><category term='lighttpd'/><category term='javascript'/><category term='web'/><category term='東野圭吾'/><category term='温泉'/><category term='webサービス'/><category term='api'/><category term='add-on'/><category term='scgi'/><category term='chrome'/><category term='routes'/><category term='googleapp engine'/><category term='python'/><category term='東海'/><category term='BDD'/><category term='wsgi'/><category term='browser'/><category term='itertools'/><category term='turbogears'/><category term='authkit'/><category term='ミステリ'/><category term='portable contacts'/><category term='oauth'/><category term='scons'/><category term='yadis'/><category term='wxWidgets'/><category term='facebook'/><category term='screen'/><category term='fastcgi'/><category term='emacs'/><category term='wcan'/><category term='firefox addon'/><category term='php'/><category term='spapython'/><category term='paste'/><category term='sqlalchemy'/><category term='restful'/><category term='pyspa'/><category term='toscawidgets'/><category term='buildout'/><category term='流れるようなインターフェイス'/><category term='webob'/><category term='名古屋'/><category term='repoze'/><category term='読書'/><category term='pylons'/><category term='rest'/><category term='functools'/><category term='zoho'/><category term='pyqt'/><category term='Firefox'/><category term='itertoos'/><category term='unix'/><category term='twitter'/><category term='tempita'/><category term='mac'/><category term='mod_python'/><category term='qt'/><category term='testing'/><category term='画像'/><category term='formencode'/><category term='google'/><category term='ファイルアップロード'/><category term='elixir'/><title type='text'>aodag blog</title><subtitle type='html'>PythonとかWSGIとかPasteな</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.aodag.jp/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default?start-index=101&amp;max-results=100'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>142</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-3002629161756434430</id><published>2011-10-25T16:34:00.002+09:00</published><updated>2011-10-25T16:34:37.578+09:00</updated><title type='text'>G+ Blogger連携</title><content type='html'>Google+とBlogger連携が始まるらしいので、Bloggerのdraft機能を有効にして連携してみた。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-3002629161756434430?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/3002629161756434430/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=3002629161756434430' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/3002629161756434430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/3002629161756434430'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2011/10/g-blogger.html' title='G+ Blogger連携'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-898433442494029415</id><published>2011-04-02T21:55:00.001+09:00</published><updated>2011-04-02T21:57:12.182+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chrome'/><title type='text'>chromeアプリケーションとか</title><content type='html'>&lt;p&gt;最近気になるプラットフォームが増えすぎてて追いかけるのが大変です。&lt;/p&gt;&lt;p&gt;chromeアプリケーションは二種類あって、通常のWebアプリケーションとしてどこかにホスティングされてる形式と、HTML, JS, CSSだけで作られててローカルで動く形式があるようです。&lt;/p&gt;&lt;p&gt;後者がPackaged Appsと呼ばれるらしい。&lt;/p&gt;&lt;p&gt;&lt;a href="http://code.google.com/chrome/extensions/apps.html"&gt;http://code.google.com/chrome/extensions/apps.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;多分ここが大元の情報？&lt;/p&gt;&lt;p&gt;Crhome拡張と同じようにつくるけど、Webアプリとしてタブが割り当てられる。&lt;/p&gt;&lt;p&gt;APIになんか追加とかあるか調べないといけないな。&lt;/p&gt;&lt;p&gt;ちなみに、このエントリはそのようなアプリケーションのScribefireで書いている。普通のWebアプリみたいになってるけど、アドレスバーにはURLが表示されてない。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-898433442494029415?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/898433442494029415/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=898433442494029415' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/898433442494029415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/898433442494029415'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2011/04/chrome.html' title='chromeアプリケーションとか'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-1943428821765518079</id><published>2011-01-29T16:40:00.001+09:00</published><updated>2011-01-29T16:40:36.545+09:00</updated><title type='text'>PyCon mini JP で LTってきた</title><content type='html'>資料うｐ&lt;br /&gt;時間切れで話せなかったけど、複数のプロシージャを一度のリクエストで実行するのが、JSON-RPC2.0の目玉だと思うんだよね。&lt;div style="width:425px" id="__ss_6742827"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/aodag/json-rpc-20" title="Json rpc 2_0"&gt;Json rpc 2_0&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse6742827" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=jsonrpc20-110129013132-phpapp01&amp;stripped_title=json-rpc-20&amp;userName=aodag" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse6742827" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=jsonrpc20-110129013132-phpapp01&amp;stripped_title=json-rpc-20&amp;userName=aodag" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/aodag"&gt;Atsushi Odagiri&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-1943428821765518079?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/1943428821765518079/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=1943428821765518079' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/1943428821765518079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/1943428821765518079'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2011/01/pycon-mini-jp-lt.html' title='PyCon mini JP で LTってきた'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-2545494767235057523</id><published>2011-01-26T09:48:00.001+09:00</published><updated>2011-01-26T09:48:35.571+09:00</updated><title type='text'>distutils/setuptools/distribute</title><content type='html'>BeProudの勉強会はBPStudyが知られてるけど、社内勉強会でBPStyle というのもやっているのだよ。&lt;div style="width:425px" id="__ss_6704866"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/aodag/distutil-setuptools-distribute" title="Distutil setuptools distribute"&gt;Distutil setuptools distribute&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse6704866" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=distutilsetuptoolsdistribute-110125184510-phpapp01&amp;stripped_title=distutil-setuptools-distribute&amp;userName=aodag" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse6704866" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=distutilsetuptoolsdistribute-110125184510-phpapp01&amp;stripped_title=distutil-setuptools-distribute&amp;userName=aodag" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/aodag"&gt;Atsushi Odagiri&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-2545494767235057523?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/2545494767235057523/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=2545494767235057523' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/2545494767235057523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/2545494767235057523'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2011/01/distutilssetuptoolsdistribute.html' title='distutils/setuptools/distribute'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-1022361991094504308</id><published>2010-12-02T00:00:00.002+09:00</published><updated>2010-12-03T11:00:09.533+09:00</updated><title type='text'>Python Webフレームワーク作ってみた</title><content type='html'>&lt;p&gt;&lt;br /&gt;こんにちはPython界のメタ奇行子aodagです。今年も&lt;a href="http://atnd.org/events/10465"&gt;アドベントカレンダー&lt;/a&gt;の季節がやってきました。&lt;br /&gt;去年は、zope/plone関連ということで、zopeとwsgiのあいのこ&lt;a href="http://docs.repoze.org/bfg/"&gt;repoze.bfg&lt;/a&gt;を紹介してましたね。&lt;br /&gt;そして今年！&lt;a href="http://docs.pylonshq.com/"&gt;Pyramid&lt;/a&gt;紹介する気満々だったのですが、よく考えれば、repoze.bfgがPyramidになったわけで、&lt;br /&gt;これでは去年とネタがかぶってしまう！&lt;br /&gt;ということで、今年のネタはもうメタでやるしかないですねと。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;まずは、こちらにちょっとだけ目を通してほしい。&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://aodag.bitbucket.org/meta_class.html"&gt;Pythonのメタクラスについて&lt;/a&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://aodag.posterous.com/python-1"&gt;もっとPythonめたくらっす&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;これらを踏まえて、Webフレームワークを作ってみた。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;こちらがそれをつかったアプリケーションの例だ。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import webstruct&lt;br /&gt;&lt;br /&gt;class application(webstruct.Application): # '/'&lt;br /&gt;    db_url = "sqlite:///"&lt;br /&gt;    templates = ['example_templates']&lt;br /&gt;&lt;br /&gt;    @webstruct.view(template='index.html') # '/index'&lt;br /&gt;    def index(req):&lt;br /&gt;        return dict()&lt;br /&gt;&lt;br /&gt;    class users(webstruct.Application): # '/users' &lt;br /&gt;        @webstruct.view(template="users.html") # '/users/index'&lt;br /&gt;        def index(req):&lt;br /&gt;            users = webstruct.query(User).all()&lt;br /&gt;            return dict(users=users)&lt;br /&gt;&lt;br /&gt;        @webstruct.view(template="show_user.html", pattern=r'(?P&lt;username&gt;\w+)') # '/users/{username}'&lt;br /&gt;        def show_user(req):&lt;br /&gt;            username = req.urlvars['username']&lt;br /&gt;            user = webstruct.query_one_or_404(User, username=username)&lt;br /&gt;            return dict(user=user)&lt;br /&gt;&lt;br /&gt;from sqlalchemy import *&lt;br /&gt;&lt;br /&gt;class User(webstruct.Model):&lt;br /&gt;    __tablename__ = 'users'&lt;br /&gt;    id = Column(Integer, primary_key=True)&lt;br /&gt;    username = Column(String(255), unique=True)&lt;br /&gt;    description = Column(UnicodeText)&lt;br /&gt;&lt;br /&gt;webstruct.metadata.create_all()&lt;br /&gt;webstruct.new_data(User, username='aodag', description=u"""aodag is creator of webstruct.&lt;br /&gt;""")&lt;br /&gt;webstruct.transaction.commit()&lt;br /&gt;webstruct.run(application)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;クラスや関数定義でURLを構築している。&lt;br /&gt;一応それぞれのとこで、URLをコメントでつけておいた。&lt;br /&gt;実際の動きは&lt;a href="https://github.com/aodag/webstruct/blob/master/tests/test_it.py"&gt;こちらのテストコード&lt;/a&gt; を見ると、なんとなく感じをつかめると思う&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;できごころだったんです。すいません。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;いちおうここにソースおいてあるから、実装に興味がある人はどうぞ。&lt;br /&gt;&lt;a href="https://github.com/aodag/webstruct"&gt;https://github.com/aodag/webstruct&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;さて、３日目にバトンを回さないといけないのですが、最近wsgiサーバーのmeinheldを作ったりなんだりしている尊敬すべき変態 &lt;a href="http://d.hatena.ne.jp/mopemope/"&gt;mopemope&lt;/a&gt;さんにお願いします。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;関連リンク&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.cmscom.jp/blog/ranha6"&gt;Pythonベース伝統的WebフレームワークZope2上のCMS Ploneの存在&lt;/a&gt;&lt;br /&gt;1日目 寺田さんのエントリ&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/mopemope/20101203"&gt;[Python]web2pyを使おう！&lt;/a&gt; 3日目 mopemopeさんのエントリ&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://blog.aodag.jp/2009/12/repozebfgpastebuildout1.html"&gt;&lt;br /&gt;repoze.bfgで遊びながら、pasteの復習しつつ、buildoutの使い方に慣れる(1)&lt;br /&gt;&lt;/a&gt; 去年の僕のエントリ&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-1022361991094504308?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/1022361991094504308/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=1022361991094504308' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/1022361991094504308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/1022361991094504308'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2010/12/python-web.html' title='Python Webフレームワーク作ってみた'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-4944489503501905751</id><published>2010-10-18T18:12:00.001+09:00</published><updated>2010-10-18T18:12:38.682+09:00</updated><title type='text'>Sql alchemy bpstyle_4</title><content type='html'>社内勉強会で、SQLAlchemyを紹介したので、資料を公開しとくよ。&lt;br /&gt;こんなことあんなことできますって話だけど、まあ、使いたくなれば、ドキュメントは充実してるので、調べてくれればいいよ。&lt;br /&gt;あくまで、興味を持ってくれるまでの資料ね。&lt;div style="width:425px" id="__ss_5371238"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/aodag/sql-alchemy-bpstyle4" title="Sql alchemy bpstyle_4"&gt;Sql alchemy bpstyle_4&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse5371238" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=sqlalchemybpstyle4-101006073624-phpapp02&amp;stripped_title=sql-alchemy-bpstyle4&amp;userName=aodag" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse5371238" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=sqlalchemybpstyle4-101006073624-phpapp02&amp;stripped_title=sql-alchemy-bpstyle4&amp;userName=aodag" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/aodag"&gt;Atsushi Odagiri&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-4944489503501905751?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/4944489503501905751/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=4944489503501905751' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4944489503501905751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4944489503501905751'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2010/10/sql-alchemy-bpstyle4.html' title='Sql alchemy bpstyle_4'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-5801233137363295707</id><published>2010-09-28T22:46:00.003+09:00</published><updated>2010-09-28T23:06:39.223+09:00</updated><title type='text'>web3 ファーストインプレッション</title><content type='html'>PEP333 Web Server Interface Gateway の後継ともいうべき、PEP444 Web3 Interface が提案された。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Web3とはなにか？&lt;/span&gt;&lt;br /&gt;Webアプリケーション、フレームワークと、サーバー間のインターフェイスの定義。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;それはWSGIじゃないの？&lt;/span&gt;&lt;br /&gt;Yes WSGIとWeb3の目的はほぼ同じ。Web3はWSGIをベースとしている。&lt;br /&gt;なぜ、新たに提案されているかというと、WSGI提案後に、Python3がリリースされたからだ。&lt;br /&gt;Python3への対応はWeb3の主要な目的のひとつだ。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;なぜWSGI2.0じゃないのか？&lt;/span&gt;&lt;br /&gt;Python3は後方互換性を保たないバージョンアップである。そのPython3に対応するWeb3も後方互換性を保つことはない。そのため、違う名前として提案している。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Python3だけが対象なのか？&lt;/span&gt;&lt;br /&gt;現在の提案では、Python3.1以降と、2.6,2.7が対象。&lt;br /&gt;2.6と2.7はPython3への架け橋であるため、Web3でも対象にしているものと思われる。&lt;br /&gt;おおきな要因は、b前置詞の文字列リテラルがサポートされているかどうか。&lt;br /&gt;3.0が対象じゃない理由はよく分からない。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;WSGIとの大きな違いは？&lt;/span&gt;&lt;br /&gt;一番目に付くのは、関数定義である。&lt;br /&gt;WSGIの場合は第二引数にstart_responseコールバックが渡されていた。&lt;br /&gt;Web3では、引数が１つだけになり、start_responseの呼び出しで渡していたレスポンスステータスやレスポンスヘッダは、戻り値のタプルに含まれるようになった。&lt;br /&gt;引数がリクエストデータ、戻り値がレスポンスデータとなり、分かりやすくなったのと同時に、middlewareの作成が簡単になった。&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def app(environ):&lt;br /&gt;    return "200 OK", [('Content-type', 'text/plain')], ["Hello, world!"]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ほかにはどのような変更が？&lt;/span&gt;&lt;br /&gt;WSGIでは、レスポンスデータはstrとなっていた。&lt;br /&gt;Python3のstrはユニコード文字列であるため、Web3のレスポンスデータはbytesにすることになっている。&lt;br /&gt;ただし、2.6,7では、strでという話。&lt;br /&gt;また、WSGI1.0以降のWSGI2.0に向けた提案なども含まれている。&lt;br /&gt;関数シグネチャの変更もそのひとつだが、ほかにもweb3.inputのメソッドでサイズ指定可能な実装や要求されるようになったり、SCRIPT_NAME, PATH_INFO, QUERY_STRINGが省略できなくなったり、web3.script_nameやweb3.path_infoでURLデコード前の値を取得できるようになったりと、wsgiであいまいだった点などがweb3では定義されている。&lt;br /&gt;&lt;br /&gt;ざくっと読んだおおまかな内容は以上。&lt;br /&gt;まだ、わざわざWeb3と名前をかえるほどのものなのか？という疑問が消えないので、もうちょっと細かい点まで読む。&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.python.org/dev/peps/pep-0333/"&gt;PEP 333 -- Python Web Server Gateway Interface v1.0&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.python.org/dev/peps/pep-0444/"&gt;PEP 444 -- Python Web3 Interface&lt;/a&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-5801233137363295707?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/5801233137363295707/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=5801233137363295707' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5801233137363295707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5801233137363295707'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2010/09/web3.html' title='web3 ファーストインプレッション'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-1141468840899069425</id><published>2009-12-25T03:00:00.001+09:00</published><updated>2009-12-25T03:01:17.727+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Descriptor:__get__とかそのあたりのスペシャルメソッド</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;スペシャルメソッドの__get__や__set__に注目してみる。&lt;br /&gt;代入したり、されたりする場合に呼ばれる。&lt;br /&gt;こいつらをオーバーライドすれば、代入時の処理を追加できるというわけ。&lt;br /&gt;propertyもこれを使って実装できる。&lt;br /&gt;試しに、intのみ受け取り、最大値を制限できるプロパティを作ってみた。&lt;br /&gt;&lt;br /&gt;&lt;code style='white-space: pre;'&gt;&lt;br /&gt;""" descriptor test&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; class Sample(object):&lt;br /&gt;...    value = IntProperty('value', max=10)&lt;br /&gt;...    def __init__(self):&lt;br /&gt;...        self.value = 10&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; s = Sample()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; s.value&lt;br /&gt;10&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; s.value = 9&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; s.value&lt;br /&gt;9&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; s.value = 'a'&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt;    ...&lt;br /&gt;TypeError&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; s.value = 11&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt;    ...&lt;br /&gt;ValueError: 11 is greater than 10&lt;br /&gt;"""&lt;br /&gt;&lt;br /&gt;class IntProperty(object):&lt;br /&gt;    def __init__(self, name='var', max=None):&lt;br /&gt;        self.name = name&lt;br /&gt;        self.max = max&lt;br /&gt;&lt;br /&gt;    def _assert(self, value):&lt;br /&gt;        if not isinstance(value, int):&lt;br /&gt;            raise TypeError&lt;br /&gt;&lt;br /&gt;        if self.max is not None and self.max &amp;lt; value:&lt;br /&gt;            raise ValueError, '%d is greater than %d' % (value, self.max)&lt;br /&gt;&lt;br /&gt;    def __get__(self, obj, objtype):&lt;br /&gt;        return obj.__dict__[self.name]&lt;br /&gt;&lt;br /&gt;    def __set__(self, obj, value):&lt;br /&gt;        self._assert(value)&lt;br /&gt;        obj.__dict__[self.name] = value&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;    import doctest&lt;br /&gt;    doctest.testmod()&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;__dict__に値を入れるための名前が必要なのがいまいち＞＜&lt;br /&gt;&lt;p&gt;&lt;br /&gt;参考：&lt;a href='http://users.rcn.com/python/download/Descriptor.htm'&gt;How-To Guide for Descriptors&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=4dce3179-8f8f-8fb0-bf12-3bcd3b7c8f70' alt='' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-1141468840899069425?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/1141468840899069425/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=1141468840899069425' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/1141468840899069425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/1141468840899069425'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2009/12/descriptorget.html' title='Descriptor:__get__とかそのあたりのスペシャルメソッド'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-7577204770323119866</id><published>2009-12-11T00:57:00.001+09:00</published><updated>2009-12-11T00:57:48.262+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='buildout'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='repoze'/><title type='text'>repoze.bfgで遊びながら(略 （２）</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://blog.aodag.jp/2009/12/repozebfgpastebuildout1.html'&gt;前回&lt;/a&gt;repoze.bfgをbuildoutで使う環境を作ったので、なんか実装してみましょう。&lt;br/&gt;repozeは、一般的にmodel-view-templateの構成をするようですが、viewだけの実装も可能です。&lt;br/&gt;&lt;br/&gt;&lt;b&gt;viewを実装する&lt;/b&gt;&lt;br/&gt;src/board/views.py がすでにviewを実装するモジュールとして存在しているので、ここに追加してみます。&lt;br/&gt;&lt;code&gt;&lt;br/&gt;import webob&lt;br/&gt;def hello(request):&lt;br/&gt;    return webob.Response(body='Hello, world', content_type="text/plain")&lt;br/&gt;&lt;/code&gt;&lt;br/&gt;既に、my_viewという関数が実装されていますが、こちらはtemplate使ってるので、dictを返しています。&lt;br/&gt;今回は、templateなしで実装するので、自分でResponseまで作成します。&lt;br/&gt;Responseのコンストラクタで、bodyに渡した内容が、httpレスポンスのボディとなります。&lt;br/&gt;content typeの指定も可能です。&lt;br/&gt;&lt;br/&gt;&lt;b&gt;テストする&lt;/b&gt;&lt;br/&gt;あまりテストする必要もないですが、一応やってみましょう。&lt;br/&gt;&lt;code&gt;&lt;br/&gt;import webob&lt;br/&gt;def hello(request):&lt;br/&gt;    """&lt;br/&gt;    &amp;gt;&amp;gt;&amp;gt; req = webob.Request({})&lt;br/&gt;    &amp;gt;&amp;gt;&amp;gt; res = hello(req)&lt;br/&gt;    &amp;gt;&amp;gt;&amp;gt; res.body&lt;br/&gt;    'Hello, world'&lt;br/&gt;    &amp;gt;&amp;gt;&amp;gt; res.content_type&lt;br/&gt;    'text/plain'&lt;br/&gt;    """&lt;br/&gt;    return webob.Response(body='Hello, world', content_type="text/plain")&lt;br/&gt;&lt;/code&gt;&lt;br/&gt;doctestで書いています。&lt;br/&gt;前回作っておいた、webtestを実行します。&lt;br/&gt;&lt;code&gt;&lt;br/&gt;bin/webtest&lt;br/&gt;&lt;/code&gt;&lt;br/&gt;※テストが２つ実行されますが、１つは自動生成されたテストです。&lt;br/&gt;&lt;br/&gt;&lt;b&gt;viewを登録する&lt;/b&gt;&lt;br/&gt;作成したviewをWebアプリケーションから呼び出されるように登録します。&lt;br/&gt;viewの登録方法は２種類あります。&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;&lt;li&gt;zcmlファイルに記述する&lt;br/&gt;&lt;/li&gt;&lt;li&gt;Configuratorのadd_viewメソッドを呼ぶ&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br/&gt;今回はConfiguratorを使うことにしましょう。&lt;br/&gt;src/board/run.py の中でConfiguratorを作成しているので、make_wsgi_appが呼ばれる前に、add_viewメソッドを追加します。&lt;br/&gt;&lt;code&gt;&lt;br/&gt;    import views&lt;br/&gt;    config.add_view(views.hello, name='hello')&lt;br/&gt;&lt;/code&gt;&lt;br/&gt;この場合は、helloという名前でURLにマッピングされます。&lt;br/&gt;&lt;br/&gt;Webアプリケーションのテストを追加します。&lt;br/&gt;tests.pyがすでにありますが、中身を消して、改めてテストを書きます。&lt;br/&gt;&lt;code&gt;&lt;br/&gt;import webtest&lt;br/&gt;from paste.deploy.loadwsgi import loadapp&lt;br/&gt;import os&lt;br/&gt;config = os.path.join(os.path.dirname(__file__), '..')&lt;br/&gt;&lt;br/&gt;def test_hello():&lt;br/&gt;    app = webtest.TestApp(loadapp('config:board.ini', relative_to=config))&lt;br/&gt;    res = app.get('/hello')&lt;br/&gt;    assert res.status_int == 200&lt;br/&gt;    assert res.body == 'Hello, world!'&lt;br/&gt;&lt;br/&gt;&lt;/code&gt;&lt;br/&gt;repoze.bfgはPasteDeployを利用しているので、WSGIアプリケーションもPasteDeploy経由で取得します。paste.deploy.loadwsgi:loadappで取得できますが、board.iniは一段上のディレクトリにあるので、os.pathなどを使って特定しています。&lt;br/&gt;wsgiアプリケーションを取得したら、webtest:TestAppでラップします。&lt;br/&gt;TestAppは、getやpostなどの呼び出しが簡単にできるようになっています。&lt;br/&gt;Responseが帰ってくるので、レスポンスステータスやボディを確認します。&lt;br/&gt;このテストも、webtestから実行されます。&lt;br/&gt;&lt;code&gt;&lt;br/&gt;bin/webtest&lt;br/&gt;&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;&lt;b&gt;アプリケーションを実行する&lt;/b&gt;&lt;br/&gt;アプリケーションは、bin/pasterで実行できます。&lt;br/&gt;※前回のbuildout.cfgでは、実行に失敗します。以下のように直しましょう。&lt;br/&gt;&lt;code&gt;&lt;br/&gt;[repoze]&lt;br/&gt;recipe = zc.recipe.egg&lt;br/&gt;eggs =&lt;br/&gt; PasteScript&lt;br/&gt; repoze.bfg&lt;br/&gt; board&lt;br/&gt;&lt;br/&gt;&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;&lt;code&gt;&lt;br/&gt;bin/paster src/board.ini&lt;br/&gt;&lt;/code&gt;&lt;br/&gt;これで、http://localhost:6543/hello にアクセスすると、"Hello, world!"と表示されます。&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=20e1490d-a005-8337-8d2b-08a8ef0a80ca' alt='' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-7577204770323119866?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/7577204770323119866/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=7577204770323119866' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/7577204770323119866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/7577204770323119866'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2009/12/repozebfg.html' title='repoze.bfgで遊びながら(略 （２）'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-10082506059928796</id><published>2009-12-07T02:03:00.002+09:00</published><updated>2009-12-09T11:58:52.616+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wsgi'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='repoze'/><title type='text'>repoze.bfgで遊びながら、pasteの復習しつつ、buildoutの使い方に慣れる(1)</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://d.hatena.ne.jp/ytakeuch/'&gt;id:ytakeuch&lt;/a&gt;&lt;b&gt;さんから&lt;/b&gt;&lt;a href='http://takanory.net/takalog/1187' target='_blank'&gt;Zope/Ploneアドベントカレンダー&lt;/a&gt;のバトンが回ってきました。&lt;br/&gt;repozeは、zope由来のコンポーネントをWSGIアプリケーションで利用できるようにしたコンポーネント集です。&lt;br/&gt;それらのコンポーネントを再構成したrepoze.bfgというフレームワークが提供されています。&lt;br/&gt;repoze.bfgは、ZODBやURLトラバーサルなど、Zopeのベースとなるアーキテクチャを利用しつつ、必要なコンポーネントはその都度取り込むことができます。&lt;br/&gt;&lt;br/&gt;&lt;b&gt;環境構築&lt;/b&gt;&lt;br/&gt;distribute, virtualenv, buildoutを利用した環境構築をします。&lt;br/&gt;この辺りの話は@shimizukawa先生の&lt;a title='distutils, setuptools, distribute, pip, virtualenv, buildout' href='http://www.freia.jp/taka/blog/691'&gt;こちら&lt;/a&gt;のエントリが詳しいです。&lt;br/&gt;まずは、virtualenvで仮想python環境を作ります。今回は、--distributeオプションを使ってsetuptoolsの代わりにdistributeを使います。&lt;br/&gt;virtualenv --no-site-packages --distribute env&lt;br/&gt;できあがった仮想環境に入る。&lt;br/&gt;. env/bin/activate&lt;br/&gt;作業用ディレクトリを作ります。&lt;br/&gt;mkdir board&lt;br/&gt;cd board&lt;br/&gt;buildout環境を作ります。bootstrap.pyはこことかここにありますので、適当に。&lt;br/&gt;bootstrap.pyにも--distributeオプションを付けます。&lt;br/&gt;cp /path/to/bootstrap.py .&lt;br/&gt;python bootstrap.py --ditribute&lt;br/&gt;&lt;br/&gt;buildout.cfgを作成。&lt;br/&gt;PasteScriptでソースベースを生成するために、repoze.bfgとPasteScriptを入れます。&lt;br/&gt;buildout.cfg&lt;br/&gt;[buildout]&lt;br/&gt;parts = repoze&lt;br/&gt;[repoze]&lt;br/&gt;recipe = zc.recipe.egg&lt;br/&gt;eggs =&lt;br/&gt; PasteScript&lt;br/&gt; repoze.bfg&lt;br/&gt;&lt;br/&gt;ローカルのbuildoutを実行して環境を更新&lt;br/&gt;bin/buildout&lt;br/&gt;ローカルにpasterコマンドが入ります。また、プロジェクトテンプレートにrepoze.bfgのものが追加されるので、これらを使ってプロジェクトを作成します。&lt;br/&gt;bin/paster create -t bfg_zodb board&lt;br/&gt;mv board src&lt;br/&gt;&lt;br/&gt;次にテスト用にnoseを導入します。&lt;br/&gt;また、テスト対象のプロジェクトもeggで追加しないと参照できないので、作成したboardプロジェクトのsrcディレクトリをdevelopに追加してeggとして取り扱えるようにします。&lt;br/&gt;&lt;br/&gt;buildout.cfg&lt;br/&gt;[buildout]&lt;br/&gt;parts = &lt;br/&gt; repoze&lt;br/&gt; webtest&lt;br/&gt;develop = src&lt;br/&gt;[repoze]&lt;br/&gt;recipe = zc.recipe.egg&lt;br/&gt;eggs =&lt;br/&gt; PasteScript&lt;br/&gt; repoze.bfg&lt;br/&gt;&lt;br/&gt;[webtest]&lt;br/&gt;recipe = zc.recipe.egg:scripts&lt;br/&gt; eggs =&lt;br/&gt; distribute&lt;br/&gt; board&lt;br/&gt; nose&lt;br/&gt; WebTest&lt;br/&gt;initialization =&lt;br/&gt; sys.argv[1:1] = ['-w', 'board', '--with-doctest']&lt;br/&gt;scripts =&lt;br/&gt; nosetests=webtest&lt;br/&gt;上の設定では、WebTestもテストで利用できるようにeggsに追加しています。&lt;br/&gt;また、コマンドラインを編集して、srcディレクトリ以下でdoctestを有効にしたテストを実行するようにして、コマンド名をwebtestにしています。&lt;br/&gt;試しにテスト実行してみます。&lt;br/&gt;bin/webtest&lt;br/&gt;&lt;br/&gt;&lt;b&gt;生成されたプロジェクトを探索する&lt;/b&gt;&lt;br/&gt;pasterで生成されたプロジェクトの中身を確認してみます。&lt;br/&gt;PasteScriptでは、&lt;a href='http://pythonpaste.org/deploy/'&gt;PasteDeploy&lt;/a&gt;による設定ファイルを読み込んでWSGIアプリケーションを実行します。&lt;br/&gt;repoze_zodbテンプレートで生成されたプロジェクトでは、[パッケージ名].iniが設定ファイルになっています。&lt;br/&gt;pipeline:main がwsgiアプリの起点になります。&lt;br/&gt;pipelineでは、WSGIミドルウェアの設定が書かれており、さらにapp:zodbで設定されているWSGIアプリを参照します。&lt;br/&gt;app:zodbでは、use = egg:board#appと書かれている部分が実際のWSGIアプリです。その他は、WSGIアプリを呼び出すときに渡される設定値です。&lt;br/&gt;egg:board#appってなんでしょう？&lt;br/&gt;まずは、eggパッケージです。&lt;br/&gt;eggには、entry_pointsという仕組みがあり、eggパッケージが提供するインターフェイスのようなものを公開しています。&lt;br/&gt;boardのegg情報は、src/board.egg_info以下にあり、entry_points.txtにentry_pointsの情報が記述されています。&lt;br/&gt;      [paste.app_factory]&lt;br/&gt;      app = board.run:app&lt;br/&gt;board.runモジュールのappオブジェクトがpaste.app_factoryインターフェイスとして公開されています。&lt;br/&gt;これが、board.iniに書かれているegg:blog#appの正体です。&lt;br/&gt;&lt;br/&gt;paste.app_factoryは、設定を受け取り、wsgiアプリケーションを返す関数が求められます。&lt;br/&gt;&lt;br/&gt;では、src/board/run.pyを見てみましょう。&lt;br/&gt;appは関数で定義されています。&lt;br/&gt;&lt;br/&gt;def app(global_config, **settings):&lt;br/&gt;&lt;br/&gt;global_configはboard.iniのDEFAULTセクションで設定されている内容です。&lt;br/&gt;settingsは、board.iniのapp:zodbセクションで設定されている内容です。&lt;br/&gt;appはglobal_configやsettingsの内容を使って、WSGIアプリケーションを作成します。&lt;br/&gt;&lt;br/&gt;&lt;b&gt;動かしてみる&lt;/b&gt;&lt;br/&gt;pasterコマンドで、wsgiアプリを実行します。&lt;br/&gt;bin/paster serve src/blog.ini&lt;br/&gt;このときのhttpサーバーは、board.iniでserver:mainセクションに設定されています。&lt;br/&gt;&lt;img height='357' width='500' style='max-width: 800px;' src='http://lh5.ggpht.com/_hMdacNzeuHQ/SxvVkIj1maI/AAAAAAAAA18/x0rnTrP6tqA/%5BUNSET%5D.jpg?imgmax=800'/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=a27895e2-85d4-8f4f-935e-86f1f1ef885b' alt='' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;追記&lt;br /&gt;&lt;p&gt;&lt;br /&gt;次のバトンは&lt;a href="http://nagosui.org/windaround/COREBlog2/"&gt;nyusuke&lt;/a&gt;にお願いしました。&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-10082506059928796?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/10082506059928796/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=10082506059928796' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/10082506059928796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/10082506059928796'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2009/12/repozebfgpastebuildout1.html' title='repoze.bfgで遊びながら、pasteの復習しつつ、buildoutの使い方に慣れる(1)'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_hMdacNzeuHQ/SxvVkIj1maI/AAAAAAAAA18/x0rnTrP6tqA/s72-c/%5BUNSET%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-7191582452165115224</id><published>2009-12-05T19:11:00.000+09:00</published><updated>2009-12-05T19:12:19.285+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wsgi'/><category scheme='http://www.blogger.com/atom/ns#' term='repoze'/><title type='text'>repoze.whoを調べてみた</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://repoze.org'&gt;repoze&lt;/a&gt;というzope由来のコンポーネントをwsgiアプリで使えるようにしているプロジェクトがあります。&lt;br/&gt;&lt;br/&gt;ということで、&lt;a href='http://atnd.org/events/2258'&gt;(第6回)Zope/Plone開発勉強会&lt;/a&gt;行ってきました。&lt;br/&gt;今回は、ユーザー認証用のコンポーネント &lt;a href='http://docs.repoze.org/who/index.html'&gt;repoze.who&lt;/a&gt; を調べました。&lt;br/&gt;whoのポイントは、細分化されたプラグイン構造。&lt;br/&gt;ひとまずの理解は以下のとおり。Metadata Providerだけちょっとわからない＞＜&lt;br/&gt;&lt;b&gt;&lt;br/&gt;Identifier&lt;/b&gt;&lt;br/&gt;リクエスト、レスポンスでの認証情報を取り扱います。&lt;br/&gt;リクエストから認証情報を取り出したり、レスポンスに認証情報を追加したりする部分です。&lt;br/&gt;既存のプラグインには、Basic認証（のヘッダ情報）や、Cookieなどを使ったものがあります。&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Authenticator&lt;/b&gt;&lt;br/&gt;Identifierの情報を受けて、実際に認証する部分です。&lt;br/&gt;既存のプラグインでは、htpasswdを使うものや、SQLクエリ、XMLファイルが提供されています。&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Metadata Provider&lt;/b&gt;&lt;br/&gt;認証以外のユーザーデータ（電話番号とか）を取り扱う？&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Challenger&lt;/b&gt;&lt;br/&gt;認証が必要であることを通知する部分です。&lt;br/&gt;既存のプラグインでは、HTTPヘッダで通知するものや、ログインフォーム画面を表示するものなどがあります。&lt;br/&gt;&lt;br/&gt;さらに権限をとりあつかうrepoze.whatとというものがあるので、こちらも調べる！&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=d1e85acc-08fb-822f-b997-dd7446b2a5a3' alt='' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-7191582452165115224?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/7191582452165115224/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=7191582452165115224' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/7191582452165115224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/7191582452165115224'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2009/12/repozewho.html' title='repoze.whoを調べてみた'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-5284405987171333742</id><published>2009-12-05T17:46:00.000+09:00</published><updated>2009-12-05T17:47:28.975+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='buildout'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>buildoutでwebtestする</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;&lt;br /&gt;buildoutのzc.recipe.eggは、スクリプトにデフォルトの引数をつけたりできる。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;src以下にテスト対象があるって想定で以下のように。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;[webtest]&lt;br /&gt;recipe = zc.recipe.egg:scripts&lt;br /&gt;eggs = &lt;br /&gt;     myapp&lt;br /&gt;     setuptools&lt;br /&gt;     nose&lt;br /&gt;     WebTest&lt;br /&gt;initialization =&lt;br /&gt;	       sys.argv[1:1] = ["-w", "src", "--with-doctest"]&lt;br /&gt;scripts = nosetests=webtest&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;GAEのテストをしたければ以下のような。&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;[webtest]&lt;br /&gt;recipe = zc.recipe.egg:scripts&lt;br /&gt;eggs = &lt;br /&gt;     myapp&lt;br /&gt;     setuptools&lt;br /&gt;     nose&lt;br /&gt;     NoseGAE&lt;br /&gt;     WebTest&lt;br /&gt;initialization =&lt;br /&gt;	       sys.argv[1:1] = ["-w", "src", "--with-gae", "--with-doctest"]&lt;br /&gt;scripts = nosetests=webtest&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;スライスに代入するのって、文法上できるってだけで、普通やらないよなと思ってましたが…&lt;br /&gt;&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=539e9a73-0abc-87e6-af1d-71b2b9af0313' alt='' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-5284405987171333742?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/5284405987171333742/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=5284405987171333742' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5284405987171333742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5284405987171333742'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2009/12/buildoutwebtest.html' title='buildoutでwebtestする'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-4150900582959588535</id><published>2009-11-14T15:24:00.003+09:00</published><updated>2009-11-14T18:26:32.607+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Python Hack-a-thon</title><content type='html'>Python Hack-a-thonに参加中。&lt;br /&gt;発表資料的なものを作ったので、おいとく。&lt;br /&gt;&lt;iframe src="http://docs.google.com/present/embed?id=dhtkjs57_66hjzgg5hq" frameborder="0" width="410" height="342"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-4150900582959588535?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/4150900582959588535/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=4150900582959588535' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4150900582959588535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4150900582959588535'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2009/11/python-hack-thon.html' title='Python Hack-a-thon'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-5851680865073162653</id><published>2009-11-05T09:32:00.003+09:00</published><updated>2009-11-05T09:36:50.777+09:00</updated><title type='text'>delegateのシグネチャを調べる</title><content type='html'>&lt;p&gt;&lt;br /&gt;&lt;a href="http://twitter.com/moriyoshi/status/5416506673"&gt;delegateのシグネチャを調べる方法を探している人&lt;/a&gt;がいたので、調べてみた。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;    class Program&lt;br /&gt;    {&lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            Type t = typeof(MyEventHandler);&lt;br /&gt;            Console.WriteLine(t);&lt;br /&gt;            MethodInfo m = t.GetMethod("Invoke");&lt;br /&gt;            Console.WriteLine(m.ReturnType);&lt;br /&gt;            foreach (var p in m.GetParameters())&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine(p);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    public delegate bool MyEventHandler(object sender);&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;ildasmで調べてみると、&lt;br /&gt;Invokeメソッドがdelegateの宣言と一致してるようなので、リフレクションでパラメータと戻り値の型を調べればOKっぽい。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-5851680865073162653?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/5851680865073162653/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=5851680865073162653' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5851680865073162653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5851680865073162653'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2009/11/delegate.html' title='delegateのシグネチャを調べる'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-8689649482757162447</id><published>2009-10-31T17:56:00.002+09:00</published><updated>2009-10-31T17:58:40.754+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='screen'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><title type='text'>screenの中でscreenを起動しないようにする方法</title><content type='html'>気になったので、やってみた。&lt;br /&gt;screen起動中は環境変数TERMがscreenとなっているので、これを利用する。&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;if [ "$TERM" == "screen" ] ; then&lt;br /&gt;echo "already in screen"&lt;br /&gt;exit&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;exec /opt/local/bin/screen&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;mac portsの場合ね。&lt;br /&gt;これを$HOME/bin にでも入れとけばOK&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-8689649482757162447?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/8689649482757162447/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=8689649482757162447' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/8689649482757162447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/8689649482757162447'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2009/10/screenscreen.html' title='screenの中でscreenを起動しないようにする方法'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-5798026070554336146</id><published>2009-10-19T21:51:00.001+09:00</published><updated>2009-10-19T21:51:07.846+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>PythonでEnum型してみた</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;&lt;br/&gt;&lt;a href='http://d.hatena.ne.jp/Horiuchi_H/20091017/1255775555'&gt;PythonでEnumを書いてみた&lt;/a&gt;人がいたので、ちょっと考えてみた。&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;Enumって型の種類なんで、Enum型というものをまず定義せにゃならんのじゃないかと。&lt;br/&gt;ってことは、メタクラスの出番ですね。分かります。&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;使い方は、doctestのサンプルの通り。&lt;br/&gt;StandardEnumを継承したclass宣言内で、列挙します。&lt;br/&gt;Pythonは識別子だけのステートメントなんて持ってないので、値は明示的に指定しましょう:-)&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;&lt;code/&gt;&lt;pre&gt;&lt;br /&gt;# -*- coding:utf-8 -*-&lt;br /&gt;"""&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; class SampleEnum(StandardEnum):&lt;br /&gt;...     A = 1&lt;br /&gt;...     B = 2&lt;br /&gt;...     C = 3&lt;br /&gt;...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; SampleEnum.A&lt;br /&gt;&amp;lt;SampleEnum.A value=1&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; for e in SampleEnum:&lt;br /&gt;...     print e&lt;br /&gt;...&lt;br /&gt;&amp;lt;SampleEnum.A value=1&amp;gt;&lt;br /&gt;&amp;lt;SampleEnum.B value=2&amp;gt;&lt;br /&gt;&amp;lt;SampleEnum.C value=3&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; SampleEnum.A == SampleEnum.A&lt;br /&gt;True&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; SampleEnum.A == SampleEnum.B&lt;br /&gt;False&lt;br /&gt;"""&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class EnumType(type):&lt;br /&gt;&lt;br /&gt;    def __init__(cls, name, bases, dct):&lt;br /&gt;        super(EnumType, cls).__init__(name, bases, dct)&lt;br /&gt;        cls._values = []&lt;br /&gt;&lt;br /&gt;        for key, value in dct.iteritems():&lt;br /&gt;            if not key.startswith('_'):&lt;br /&gt;                v = cls(key, value)&lt;br /&gt;                setattr(cls, key, v)&lt;br /&gt;                cls._values.append(v)&lt;br /&gt;&lt;br /&gt;    def __iter__(cls):&lt;br /&gt;        return iter(cls._values)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class StandardEnum(object):&lt;br /&gt;&lt;br /&gt;    __metaclass__ = EnumType&lt;br /&gt;&lt;br /&gt;    def __init__(self, k, v):&lt;br /&gt;        self.v = v&lt;br /&gt;        self.k = k&lt;br /&gt;&lt;br /&gt;    def __repr__(self):&lt;br /&gt;        return "&amp;lt;%s.%s value=%s&amp;gt;" % (self.__class__.__name__, self.k, self.v)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;    import doctest&lt;br /&gt;    doctest.testmod()&lt;br /&gt;&lt;/pre&gt;&lt;br/&gt;&lt;p&gt;&lt;br/&gt;定義順を保ために、_valuesを使ってるけど、実際のところ値を使った方が、直感的かもしれない。ふつうは昇順に定義するだろうしね。&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=2d26e57e-6969-802e-829b-5bfdd554e486' alt='' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-5798026070554336146?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/5798026070554336146/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=5798026070554336146' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5798026070554336146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5798026070554336146'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2009/10/pythonenum.html' title='PythonでEnum型してみた'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-5290607531866265190</id><published>2009-07-08T16:40:00.001+09:00</published><updated>2009-07-08T16:40:41.229+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wsgi'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='google app engine'/><title type='text'>GAEでPOSTパラメータを柔軟に受け取る</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;GAEに限らないけど、キャッチーにしたいので。&lt;br /&gt;PHPとかで、パラメータ名を"a[]"にすると配列として複数のパラメータを受け取れるというアレ。&lt;br /&gt;とりあえずformencodeを使えばいいかな。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; import formencode.variabledecode&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; params = {"names-1.fname":"John",&lt;br /&gt;...     "names-1.lname":"Doe",&lt;br /&gt;...     "names-2.fname":"Jane",&lt;br /&gt;...     "names-2.lname":"Brown",&lt;br /&gt;...     "names-3":"Tim Smith",&lt;br /&gt;...     "action save":None,&lt;br /&gt;...     "action.option":"overwrite",&lt;br /&gt;...     "action.confirm":"yes",&lt;br /&gt;...     }&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; print formencode.variabledecode.variable_decode(params)&lt;br /&gt;{'action': {'option': 'overwrite', 'confirm': 'yes'}, 'names': [{'lname': 'Doe', 'fname': 'John'}, {'lname': 'Brown', 'f&lt;br /&gt;name': 'Jane'}, 'Tim Smith'], 'action\tsave': None}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href='http://formencode.org/modules/variabledecode.html#module-formencode.variabledecode'&gt;formencode.variabledecode – Turn flat HTML form submissions into nested structures — FormEncode v1.2.2 documentation&lt;/a&gt;&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-5290607531866265190?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/5290607531866265190/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=5290607531866265190' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5290607531866265190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5290607531866265190'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2009/07/gaepost.html' title='GAEでPOSTパラメータを柔軟に受け取る'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-8902844012881768910</id><published>2009-07-08T14:06:00.001+09:00</published><updated>2009-07-08T14:06:54.278+09:00</updated><title type='text'>書き忘れてましたが</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;font face='sans-serif'&gt;もう自由人じゃないですよ。&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-8902844012881768910?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/8902844012881768910/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=8902844012881768910' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/8902844012881768910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/8902844012881768910'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2009/07/blog-post.html' title='書き忘れてましたが'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-3906715957187645240</id><published>2009-06-21T02:44:00.001+09:00</published><updated>2009-06-21T02:44:33.241+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>twitterのユーザーリストを一気にフォローする</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;&lt;br/&gt;offに参加すると、その後フォロー祭りになったりするんだけど、かったるいのでバッチ処理した。&lt;br/&gt;既にフォローしてるかどうかを判別するのは面倒なので、全部friendships.createを呼んでみた。&lt;br/&gt;どうせ既にフォローしてるなら、403 Forbiddenになるので、問題ないだろう。&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;&lt;p&gt;&lt;br/&gt;入力のファイルは、各行が、@[ユーザー名]となっている想定。&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;&lt;pre&gt;&lt;br /&gt;import sys&lt;br /&gt;import httplib&lt;br /&gt;import time&lt;br /&gt;&lt;br /&gt;urltmpl = '/friendships/create/%s.xml'&lt;br /&gt;user, password = sys.argv[1].split(':', 1)&lt;br /&gt;basic_auth = (user + ':' + password).encode('base64')&lt;br /&gt;print basic_auth&lt;br /&gt;headers = {"Authorization": "Basic %s" % basic_auth}&lt;br /&gt;print headers&lt;br /&gt;f = open(sys.argv[2])&lt;br /&gt;twitters = [t.strip().lstrip('@') for t in f if t.strip() != '']&lt;br /&gt;f.close()&lt;br /&gt;&lt;br /&gt;for t in twitters:&lt;br /&gt;    path = urltmpl % t&lt;br /&gt;    print t&lt;br /&gt;    conn = httplib.HTTPConnection("twitter.com")&lt;br /&gt;    conn.request("POST", path, '', headers)&lt;br /&gt;    res = conn.getresponse()&lt;br /&gt;    print res.status, res.reason&lt;br /&gt;    time.sleep(3)&lt;br /&gt;&lt;/pre&gt;&lt;br/&gt;&lt;p&gt;&lt;br/&gt;考えてみたら、urlに埋め込む前にパーセントエンコーディングするべきだな。&lt;br/&gt;ユーザー名にマルチバイトって使えるんだか知らないけど。&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-3906715957187645240?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/3906715957187645240/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=3906715957187645240' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/3906715957187645240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/3906715957187645240'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2009/06/twitter.html' title='twitterのユーザーリストを一気にフォローする'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-3508063623619469680</id><published>2009-06-02T04:51:00.000+09:00</published><updated>2009-06-02T04:52:31.438+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wsgi'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>uri-templatesを実装して、WSGIディスパッチャにしてみる</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://bitworking.org/projects/URI-Templates/spec/draft-gregorio-uritemplate-03.html'&gt;URI Template&lt;/a&gt;&lt;br /&gt;&lt;blockquote/&gt;&lt;br /&gt;意味を持ったURLを構築するときに、みんな同じテンプレ使うといいんじゃね？といったところか。&lt;br /&gt;でもクールなURLとしては、クライアントにURLの構築をさせちゃいけないんじゃない？許されるのは、QueryStringくらいだったと思うけど。&lt;br /&gt;&lt;p&gt;&lt;br /&gt;まあでも、フレームワークを作るときに、こういった地味な標準は結構ありがたいかも。&lt;br /&gt;逆操作として、URLとテンプレートを比較して値を抽出する方が実際には欲しいのだけど、そこは明示されていないようだ。&lt;br /&gt;URL構築のテストケースはあるので、その逆をやればいいのだろうけど、listオペレータとか、パースをいつ区切るかってとこが難しい。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;個人的には、単純な代入と、prefix,suffixがあればいいので、他のオペレーションは適当に実装をしてみた。&lt;br /&gt;一応値抽出もできるように頑張った。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;使い方&lt;br /&gt;&lt;code/&gt;&lt;/p&gt;&lt;pre&gt;&lt;br /&gt;router = uritemplates.Router()&lt;br /&gt;router.append('users', uritemplates.UriTemplate('users/{user_id}'))&lt;br /&gt;router.url_for('controll', controller='a', action='index')&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;wsgiミドルウェアにしてみた（こっちが本当の目的）&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    router.append('users', uritemplates.UriTemplate('users/{user_id}'))&lt;br /&gt;    router.append('default', uritemplates.UriTemplate('{controller}{-prefix|/|action}{-prefix|/|id}'))&lt;br /&gt;    app = uritemplates.Middleware(app, router, None)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;うーんRoutesかWerkzeugを使った方がいいかもしれないなぁ。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-3508063623619469680?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/3508063623619469680/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=3508063623619469680' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/3508063623619469680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/3508063623619469680'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2009/06/uri-templateswsgi.html' title='uri-templatesを実装して、WSGIディスパッチャにしてみる'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-1996761119464375353</id><published>2009-05-30T13:41:00.001+09:00</published><updated>2009-05-30T13:42:49.186+09:00</updated><title type='text'>自由人</title><content type='html'>5/31を持ちまして退職の運びとなりました。&lt;br /&gt;しばし自由人となります。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-1996761119464375353?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/1996761119464375353/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=1996761119464375353' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/1996761119464375353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/1996761119464375353'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2009/05/blog-post.html' title='自由人'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-8311818733976229492</id><published>2009-05-28T02:29:00.001+09:00</published><updated>2009-05-28T02:29:43.961+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='qt'/><title type='text'>qscintillaの日本語表示について（調査）</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;PyQtも作っている英&lt;a href='http://riverbank.co.uk'&gt;riverbank&lt;/a&gt;がscintillaをQt向けにポーティングしている&lt;a href='http://riverbankcomputing.co.uk/software/qscintilla/'&gt;QScintilla&lt;/a&gt;だが、いまいち日本語の使い勝手が悪い。&lt;br/&gt;UTF-8を使うように設定すれば、入力も表示もできるんだけど、変換中の表示が一切ない。&lt;br/&gt;なんでだろうと、ソースを調べてみると、inputMethodEventは実装されている。&lt;br/&gt;でも、inputMethodQueryが実装されていない。&lt;br/&gt;inputMethodQueryは編集領域や編集中のフォント、などをInputContextに渡してあげるためのメソッド。&lt;br/&gt;多分これがないので、入力できるのに編集中の表示がないんだろう。&lt;br/&gt;とりあえず、QtのQLineEditやQTextEditがどうやってるのか調べたのだが、ソースを追っかけるのも一苦労。&lt;br/&gt;Q_Dマクロが至るところで使われていて、実装は、QLineEditPrivateとかQTextEditPrivateとかにあるのを知るまで一時間以上かかった。&lt;br/&gt;とりあえず、inputMethodQueryはオーバーライド可能なので、QScintillaのサブクラスで実装してあげればいいのかな。というところ。&lt;br/&gt;&lt;br/&gt;QVariant inputMethodQuery ( Qt::InputMethodQuery query )&lt;br/&gt;Qt::InputMethodQueryが以下&lt;br/&gt;ImMicroFocus:&lt;br/&gt;ImFont:&lt;br/&gt;ImCursorPosition:&lt;br/&gt;ImSurroundingText:&lt;br/&gt;ImCurrentSelection:&lt;br/&gt;&lt;br/&gt;中で、switch文で振り分けて、QVariantでQFontやQRectFやQStringを返すような感じで…。&lt;br/&gt;なぜ1つのメソッドでやらなきゃいけないのかいまいち理解に苦しむ。&lt;br/&gt;ImFontはfont()メソッドで返しておけばいいんだろうけど、その他がなにを返せばいいものやら。&lt;br/&gt;もう少しQTextEditの実装方法を眺めてみる。&lt;br/&gt;&lt;br/&gt;あと、問題なのは描画メソッドの方でも、考慮するとこがあるっぽいところ。&lt;br/&gt;結構茨の道だな。&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-8311818733976229492?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/8311818733976229492/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=8311818733976229492' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/8311818733976229492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/8311818733976229492'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2009/05/qscintilla.html' title='qscintillaの日本語表示について（調査）'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-8027403505923388471</id><published>2009-05-12T02:34:00.001+09:00</published><updated>2009-05-12T02:37:02.825+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Re:PythonHakathonの課題（not義務）をやってみた。</title><content type='html'>Response for &lt;a href="http://d.hatena.ne.jp/a2c/20090511/1242021450"&gt;PythonHakathonの課題（not義務）をやってみた。&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;重複あり&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;sorted(set((lambda i:[x*y for x in i for y in i if x*y&lt;100])(reduce(lambda x,y:(x if[i for i in x if y%i==0]else x+[y]),range(2,50),[2]))))&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;重複なし&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;sorted(set((lambda i:[x*y for x in i for y in i if x*y&lt;100 and x&lt;&gt;y])(reduce(lambda x,y:(x if[i for i in x if y%i==0]else x+[y]),range(2,50),[2]))))&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;で、これ誰に言えばいいの？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-8027403505923388471?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/8027403505923388471/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=8027403505923388471' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/8027403505923388471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/8027403505923388471'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2009/05/repythonhakathonnot.html' title='Re:PythonHakathonの課題（not義務）をやってみた。'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-3286874462167255544</id><published>2009-05-12T01:19:00.005+09:00</published><updated>2009-05-12T01:41:24.876+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pyqt'/><title type='text'>PyQt + Universal Feed Parser</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_hMdacNzeuHQ/SghVLf82d1I/AAAAAAAAAuY/SjgrQbdQDfg/s1600-h/feedreader-prototype2.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 400px; height: 289px;" src="http://2.bp.blogspot.com/_hMdacNzeuHQ/SghVLf82d1I/AAAAAAAAAuY/SjgrQbdQDfg/s400/feedreader-prototype2.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5334607414664001362" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;PyQtからもWebKitが使えるので、なんとなくがんばってみた。&lt;br /&gt;&lt;p&gt;重要な部分は、&lt;a href="http://www.feedparser.org/" title="Universal Feed Parser"&gt;feedparser&lt;/a&gt;を呼ぶだけ。&lt;br /&gt;&lt;p&gt;左側のQTreeViewを使ってる部分はQt4から導入されているMVCアーキテクチャだが、これのモデルを作るのが結構面倒だった。&lt;br /&gt;&lt;p&gt;parentとか、dataとか、rowCount, columnCount, index, などなどオーバーライドするメソッドが多い上に、こいつらの整合性を全部保っていないと、ルート要素が増殖したり、セグメンテーションフォルト？のような落ち方をしたりと、QTreeWidgetを使った方が良かったかなぁと途中でかなり後悔した。&lt;br /&gt;&lt;p&gt;&lt;br /&gt;まだ、リスティングのたびにネットワークアクセスしてたり、フィードの登録はソースを直接編集する必要があったりと、見た目の機能しか出来てない。&lt;br /&gt;もう少し手を入れるか。&lt;br /&gt;&lt;p&gt;&lt;br /&gt;ちなみに、こいつの作成過程は某所で語られる。かもしれない。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-3286874462167255544?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/3286874462167255544/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=3286874462167255544' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/3286874462167255544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/3286874462167255544'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2009/05/pyqtwebkit-feedparser-qtreeviewqt4mvc.html' title='PyQt + Universal Feed Parser'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_hMdacNzeuHQ/SghVLf82d1I/AAAAAAAAAuY/SjgrQbdQDfg/s72-c/feedreader-prototype2.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-6174087675687468046</id><published>2009-05-05T16:55:00.005+09:00</published><updated>2009-05-05T17:31:46.204+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scons'/><category scheme='http://www.blogger.com/atom/ns#' term='wxWidgets'/><title type='text'>sconsでwxWidgetを使ってみた on windows</title><content type='html'>&lt;p&gt;&lt;br /&gt;クロスプラットフォームなGUIライブラリwxWidgetsを使ったプログラムのビルドをsconsでやってみた。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;環境&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Windows XP SP3&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Python2.6.1&lt;/li&gt;&lt;br /&gt;&lt;li&gt;SCons 1.2.0&lt;/li&gt;&lt;br /&gt;&lt;li&gt;wxWidgets 2.8.9&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Visual C++ 2008 Express Edition&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Windows SDK 6.1&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;リンクするライブラリが多いです。&lt;br /&gt;wx-config使えばいいんだろうけど、parseConfigでの\がエスケープシーケンスになってしまうので、いまいち。&lt;br /&gt;どうしてWindowsは\で区切るの？&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;まあ、そのままだと、windows.hとかkernel32.libとかそれぞれのサーチパスに入ってないっぽいので、色々準備が必要。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;とりあえずWindows SDKは入ってるのでそちらを使うことにする。&lt;br /&gt;さらに、wxWidgetsはマルチスレッドでコンパイルされてるので、リンクするライブラリもそのあたりのやつを指定しとかないと、不可解なエラーが出る。&lt;br /&gt;今回はwxWidgetsをVC2008EEでコンパイルしたので、msvcprt90をリンクさせれば良さそう。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;SConstruct&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;cpppath = []&lt;br /&gt;libpath = []&lt;br /&gt;libs = []&lt;br /&gt;&lt;br /&gt;#wxwidgets&lt;br /&gt;cpppath += [r'C:\wxWidgets-2.8.9\lib\vc_lib\mswu',&lt;br /&gt;            r'C:\wxWidgets-2.8.9\include']&lt;br /&gt;libpath += [r'C:\wxWidgets-2.8.9\lib\vc_lib']&lt;br /&gt;libs += 'comctl32.lib rpcrt4.lib winmm.lib advapi32.lib wsock32.lib'.split() &lt;br /&gt;libs += ['wxmsw28u_core', 'wxbase28u', 'wxpng', 'wxtiff', 'wxjpeg', 'wxzlib']&lt;br /&gt;&lt;br /&gt;#win32&lt;br /&gt;cpppath += [r'C:\Program Files\Microsoft SDKs\Windows\v6.1\Include']&lt;br /&gt;libpath += [r'C:\Program Files\Microsoft SDKs\Windows\v6.1\Lib', &lt;br /&gt;            r'C:\Program Files\Microsoft Visual Studio 9.0\VC\lib']&lt;br /&gt;libs += Split("""&lt;br /&gt;kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib&lt;br /&gt;shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib&lt;br /&gt;comctl32.lib rpcrt4.lib wsock32.lib winmm.lib &lt;br /&gt;""")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;env = Environment()&lt;br /&gt;env.Append(CPPFLAGS=['/EHsc'])&lt;br /&gt;env.Append(CPPFLAGS=['/MD'])&lt;br /&gt;env.Append(CPPDEFINES=['UNICODE', '_UNICODE'])&lt;br /&gt;env.Append(LINKFLAGS=['/SUBSYSTEM:WINDOWS'])&lt;br /&gt;env.Program('diary', ['main.cpp', 'mainwindow.cpp', 'document.cpp'], &lt;br /&gt;            LIBPATH=libpath, CPPPATH=cpppath, LIBS=libs)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;こなれてない部分&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;wxWidgetsのベースフォルダは環境変数から拾ってこれるはず&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Windows SDKのベースフォルダも拾ってこれないだろうか&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Environmentに設定するのとProgramの引数で指定するのが混在しているのが気になる&lt;/li&gt;&lt;br /&gt;&lt;li&gt;wxWidgetsが必要としているlibは多すぎる。なんとかwx-configを使えるようにしたい&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Qtにはqmakeがあるけど、さてどちらの方が使いやすいかな。&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-6174087675687468046?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/6174087675687468046/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=6174087675687468046' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6174087675687468046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6174087675687468046'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2009/05/sconswxwidget-on-windows.html' title='sconsでwxWidgetを使ってみた on windows'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-6896487261283833265</id><published>2009-02-26T00:11:00.001+09:00</published><updated>2009-02-26T00:15:29.194+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='tempita'/><title type='text'>tempitaだって継承できちゃうんだから！</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;つーわけで、WebなMVCのVの部分であるHTMLテンプレートも最近のは継承できて当然！となるんでしょうか。&lt;br /&gt;tempitaを久しぶりに使おうと思ってドキュメントを読んでいたら、inheritなる単語を発見しました。&lt;br /&gt;0.3から継承をサポートするようになったようです。&lt;br /&gt;&lt;br /&gt;継承のしかたですが、テンプレート内で、{{inherit テンプレート名}}と書くと、指定したテンプレートをレンダリングします。&lt;br /&gt;その際、元のテンプレート内で、{{def}}で定義したブロックを呼び出すことができます。&lt;br /&gt;元のテンプレート内の{{def}}の外にあるコンテンツは、単に無視されるようです。&lt;br /&gt;&lt;br /&gt;index.html&lt;br /&gt;&lt;code&gt;&lt;br /&gt;{{inherit "layout.html"}}&lt;br /&gt;{{def main}}&lt;br /&gt;ここがメイン&lt;br /&gt;{{enddef}}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;layout.html&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;{{self.main | html}}&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;と用意して、index.htmlをtenpita.HTMLTemplateでレンダリングすれば、&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;ここがメイン&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;となります。&lt;br /&gt;&lt;br /&gt;ところで、デフォルトの親クラスを探す処理が微妙。&lt;br /&gt;この状態で、index.html/layout.htmlを探されても･･･&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def get_file_template(name, from_template):&lt;br /&gt;    path = os.path.join(from_template.name, name)&lt;br /&gt;    return from_template.__class__.from_filename(&lt;br /&gt;        path, namespace=from_template.namespace,&lt;br /&gt;        get_template=from_template.get_template)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;get_file_template関数があるのですが、元のテンプレートに直接継承テンプレート名を結合してます。&lt;br /&gt;&lt;code&gt;&lt;br /&gt;path = os.path.join(from_template.name, name)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;以下のように修正。うまくいきました。&lt;br /&gt;&lt;code&gt;&lt;br /&gt;    path = os.path.join(os.path.dirname(from_template.name), name)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;この関数を使うところは、入れ替え可能なので、この内容で関数を作って、tempita.HTMLTemplate.get_templateを差し替えればOKです。&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=2364b7e5-2efb-4de4-8515-4b02783a9285' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-6896487261283833265?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/6896487261283833265/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=6896487261283833265' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6896487261283833265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6896487261283833265'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2009/02/tempita.html' title='tempitaだって継承できちゃうんだから！'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-379069464067297749</id><published>2009-02-15T09:46:00.001+09:00</published><updated>2009-02-15T09:46:51.556+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='portable contacts'/><category scheme='http://www.blogger.com/atom/ns#' term='yadis'/><title type='text'>portable contactsから情報取得をしてみた。</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;portable contactsから情報取得をしてみた。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;とりあえず提案元のPlaxoから取得。&lt;br /&gt;discoveryはopenidライブラリに含まれているyadisモジュールを使用。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;認証はOAuthかBasic認証のサポートが必須となっているが、今回はBasic認証を使っている。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;openid.yadis.services.getServiceEndpointsで、XRDSからサービスエンドポイントを取得する。このとき、portableContactsのエンドポイントだけを取得するようにフィルタを使う。&lt;br /&gt;フィルタはIFilterというインターフェイスも定義されているが、Pythonだと関数を渡すだけでもOK。きっと、JavaやC#の時に使うのでしょう。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;エンドポイントが取得できたら、そのURLに対してGETリクエストしますが、認証がかかってるので、WWW-AUTHENTICATEヘッダで認証方法を確認します。&lt;br /&gt;前述のとおり、今回はBasic認証だけ対応。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;取得できたら、レスポンスボディをjsonに変換して、エントリを取り出します。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;code/&gt;&lt;pre&gt;&lt;br /&gt;import sys&lt;br /&gt;import httplib2&lt;br /&gt;import re&lt;br /&gt;import json&lt;br /&gt;from openid.yadis import services&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PORTABLECONTACTS='http://portablecontacts.net/spec/1.0'&lt;br /&gt;def portableContactsFilter(endpoint):&lt;br /&gt;    return endpoint if PORTABLECONTACTS in endpoint.type_uris else None&lt;br /&gt;&lt;br /&gt;authpattern = re.compile(&lt;br /&gt;    r'''(?:\s*www-authenticate\s*:)?\s*&lt;br /&gt;        (?P&amp;lt;scheme&amp;gt;\w*)\s+realm=['"]&lt;br /&gt;        (?P&amp;lt;realm&amp;gt;[^'"]+)['"]''',&lt;br /&gt;    re.IGNORECASE | re.VERBOSE)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def show_entries(content):&lt;br /&gt;&lt;br /&gt;    contacts = json.loads(content)&lt;br /&gt;    for entry in contacts['entry']:&lt;br /&gt;        print entry['id'], entry['displayName']&lt;br /&gt;        &lt;br /&gt;&lt;br /&gt;url = 'http://www.plaxo.com'&lt;br /&gt;&lt;br /&gt;url, endpoints = services.getServiceEndpoints(url, portableContactsFilter)&lt;br /&gt;if len(endpoints) == 0:&lt;br /&gt;    print 'endpoints not found'&lt;br /&gt;    sys.exit(0)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;e = endpoints[0]&lt;br /&gt;h = httplib2.Http()&lt;br /&gt;res, content = h.request(e.uri, "GET")&lt;br /&gt;if res.status == 200:&lt;br /&gt;    show_entries(content)&lt;br /&gt;&lt;br /&gt;if res.status == 401:&lt;br /&gt;    auth = [m.groupdict()['scheme']&lt;br /&gt;            for m in authpattern.finditer(res.get('www-authenticate', ''))]&lt;br /&gt;    if 'Basic' in auth:&lt;br /&gt;        import getpass&lt;br /&gt;        user = raw_input('username: ')&lt;br /&gt;        password = getpass.getpass('password: ')&lt;br /&gt;        h.add_credentials(user, password)&lt;br /&gt;        res, content = h.request(e.uri, "GET")&lt;br /&gt;        if res.status == 200:&lt;br /&gt;            show_entries(content)&lt;br /&gt;        else:&lt;br /&gt;            print 'Request is failed.'&lt;br /&gt;    else:&lt;br /&gt;        print 'Basic auth is not supported.'&amp;lt;/realm&amp;gt;&amp;lt;/scheme&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Webアプリで使う場合はOAuthを使うことが多くなりそうですが、yadisリクエストを何度も行うことになりそうです。&lt;br /&gt;openid.consumerのソースをみると、yadis.managerというものがキャッシュをしてくれるようです。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=393630c5-4c72-4061-8b3a-a2411ecbf471' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-379069464067297749?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/379069464067297749/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=379069464067297749' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/379069464067297749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/379069464067297749'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2009/02/portable-contacts.html' title='portable contactsから情報取得をしてみた。'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-6183253748596162434</id><published>2009-02-03T06:57:00.001+09:00</published><updated>2009-02-03T06:57:53.108+09:00</updated><title type='text'>i-nameとったりXRDSを調整したりしてみた</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;openIDはいつの間にか持ってるものと思いますが、やっぱ活用するならきちんとしたサービスを使おうじゃないかと。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;とりあえずURLをどっかのサービスに依存するのがやなので、i-nameを購入。以前からfreexriで無料のi-nameを試してみてはいたが、このたび専用のやつにしました。&lt;br /&gt;プロバイダはどれがいいのか良くわからんのですが、なんとなくsafelinkの人がネット上に多そうだったので、それに決定。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;safelinkはxrdsを編集できるので、OPをsafelinkから、すでに利用中のmyopenidに振りなおし。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;でも実際に、OpenIDでログインしてるのは、Plaxo, iKnowくらいだったりする。去年は大手ポータルが軒並みOPになったため、OpenID所有率は飛躍的に伸びた気がするけど、今年はもっとRPが増えるといいなぁ。&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-6183253748596162434?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/6183253748596162434/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=6183253748596162434' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6183253748596162434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6183253748596162434'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2009/02/i-namexrds.html' title='i-nameとったりXRDSを調整したりしてみた'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-3413380596516788374</id><published>2008-12-05T01:46:00.001+09:00</published><updated>2008-12-05T01:46:10.163+09:00</updated><title type='text'>NGK2008</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://atnd.org/events/196'&gt;NGK2008 : ATND&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;OSC2008で集まったコミュニティーを中心に忘年会をやろうという企画です。LTもあるよ。&lt;br /&gt;&lt;br /&gt;# 日時：2008/12/20（土） 19:15～21:30&lt;br /&gt;# 場所：R+BASE CAFE&lt;br /&gt;# 住所：〒461-0001 東区泉1-3-7 戸嶋屋ﾋﾞﾙ１Ｆ（TEL:052-963-5572）&lt;br /&gt;# 参加費：4500円（学生は1000円割引）&lt;br /&gt;# 参加資格：名古屋のITコミュニティに興味のある人ならOK&lt;br /&gt;# 定員：50&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;ということで、今後名古屋で勉強会を目論んでる人も参加してみてはどうかな。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-3413380596516788374?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/3413380596516788374/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=3413380596516788374' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/3413380596516788374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/3413380596516788374'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/12/ngk2008.html' title='NGK2008'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-4085117512745755518</id><published>2008-11-25T04:12:00.001+09:00</published><updated>2008-11-25T04:12:38.291+09:00</updated><title type='text'>ユビキタスしてみたい</title><content type='html'>iphoneは持ってないけどipod touchとtouch diamondを所持している。&lt;br /&gt;とりあえずevernoteでユビキタスキャプチャを始めよう。&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-4085117512745755518?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/4085117512745755518/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=4085117512745755518' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4085117512745755518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4085117512745755518'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/11/blog-post.html' title='ユビキタスしてみたい'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-5573711544886765076</id><published>2008-11-18T23:16:00.002+09:00</published><updated>2008-11-18T23:17:44.789+09:00</updated><title type='text'>Python忘年会</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://d.hatena.ne.jp/Voluntas/20081118/1226991082'&gt;Python 忘年会をやりたいと思います。 - Twisted Mind&lt;/a&gt;&lt;br /&gt;べ、別に名古屋でだって忘年会くらいできるんだからっ！&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-5573711544886765076?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/5573711544886765076/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=5573711544886765076' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5573711544886765076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5573711544886765076'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/11/python_18.html' title='Python忘年会'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-2175471480017083868</id><published>2008-11-18T21:13:00.001+09:00</published><updated>2008-11-18T21:13:33.219+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='sqlalchemy'/><title type='text'>SQLAlchemyのセッションについて</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://lab.hde.co.jp/2008/11/sqlalchemy.html'&gt;SQLAlchemyのセッションを学ぶ(セッション作成編) - HDEラボ&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;sessionmaker()では、データベースに接続するごとに違うオブジェクトが返ってきますが、scoped_session()では、同じオブジェクトが返ってきます。&lt;br /&gt;session.remove()すると内部保持しているセッションを捨ててくれる。&lt;br /&gt;&lt;br /&gt;sessionmaker()は、アプリケーション１つにデータベースが複数という場合に使用します。&lt;br /&gt;scoped_session()は、アプリケーション１つにデータベースが１つという場合に使用します。&lt;/blockquote&gt;&lt;br /&gt;scoped_sessionは常に同じオブジェクトを返すわけではなくて、スレッドローカルでセッションを保持している。&lt;br /&gt;これはWebアプリケーションがマルチスレッドで実行されている場合に、リクエストごとでsessionを扱えるようになっている。&lt;br /&gt;あと、アプリケーション１つにデータベースが１つの意味がよく分からないのだが(例でもデータベースは１つだけのようだし...)、垂直分散したければ、複数metadataを用意してそれぞれに別のデータベースへの接続をバインドして、Table作成時に各metadataを割り振ってあげればいいので、セッションは無関係。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-2175471480017083868?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/2175471480017083868/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=2175471480017083868' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/2175471480017083868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/2175471480017083868'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/11/sqlalchemy.html' title='SQLAlchemyのセッションについて'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-6664289337944198627</id><published>2008-11-17T02:37:00.001+09:00</published><updated>2008-11-17T02:37:36.720+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>仙台のPythonコミュ</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://groups.google.co.jp/group/senpy'&gt;Sendai.python | Google グループ&lt;/a&gt;&lt;br/&gt;&lt;blockquote&gt;「Python大好き、牛タン大好き！」&lt;br/&gt;&lt;br/&gt;コンセプトは「楽しい」が最優先。きっかけは Python と 仙台で。&lt;/blockquote&gt;&lt;br/&gt;&lt;a href='http://groups.google.co.jp/group/python-kansai'&gt;関西&lt;/a&gt;でもお泊まり会とかご飯とかやってますねー。&lt;br/&gt;あ、&lt;a href='http://groups.google.co.jp/group/python-tokai'&gt;東海&lt;/a&gt;もよろしく&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-6664289337944198627?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/6664289337944198627/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=6664289337944198627' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6664289337944198627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6664289337944198627'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/11/python.html' title='仙台のPythonコミュ'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-4820629598218077637</id><published>2008-10-25T15:32:00.001+09:00</published><updated>2008-10-25T15:32:30.093+09:00</updated><title type='text'>久しぶりにToscaWidgetsを使ってみたよ</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;はまった部分をメモ&lt;br/&gt;ToscaWidgetsでフォームに値を設定するときに、内部ではエンコーディング指定なしでunicodeコンストラクタを呼んでいる。&lt;br/&gt;これは、makoでもgenshiでも同じっぽい。&lt;br/&gt;で、sys.getdefaultencoding()はasciiになっているわけで、マルチバイト文字を含む通常文字列を渡すと、エンコードエラーになる。&lt;br/&gt;ユニコード文字列を渡せば回避できる。&lt;br/&gt;フォームの内容はリクエストから取り出している。今使ってるのはwebobだが、このRequestオブジェクトのparamsは、リクエストのcontent-typeに文字コードが設定されていないと、通常文字列になってしまうので、取り出す前にcharsetアトリビュートをutf-8にしてあげればOK。&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-4820629598218077637?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/4820629598218077637/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=4820629598218077637' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4820629598218077637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4820629598218077637'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/10/toscawidgets.html' title='久しぶりにToscaWidgetsを使ってみたよ'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-5424944134714889846</id><published>2008-10-24T02:11:00.001+09:00</published><updated>2008-10-24T02:11:26.007+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spapython'/><title type='text'>python温泉でやること</title><content type='html'>&lt;ul&gt;&lt;li&gt;Elixir飲む&lt;/li&gt;&lt;li&gt;WSGI飲む&lt;/li&gt;&lt;li&gt;「Google App EngineでFacebookアプリ」の続き書く&lt;/li&gt;&lt;li&gt;PyQtからQWebKitで遊ぶ&lt;/li&gt;&lt;li&gt;シュークリーム分補給&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;  &lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-5424944134714889846?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/5424944134714889846/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=5424944134714889846' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5424944134714889846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5424944134714889846'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/10/python.html' title='python温泉でやること'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-9080001174677593474</id><published>2008-10-24T02:08:00.001+09:00</published><updated>2008-10-24T02:08:20.827+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='browser'/><title type='text'>chrome?flock</title><content type='html'>chromeはシンプルで良い。flockは機能満載で楽しい。firefoxは拡張できて楽しい。&lt;br /&gt;まあ、どれでもいいんだけど。&lt;br /&gt;chromeは拡張できたらいいなぁとは思うが、実際拡張できたとして、firefox拡張の層の厚さにはかなわないだろうしなぁ。でも、ユーザースクリプトは実装して欲しいね。&lt;br /&gt;&lt;br /&gt;  &lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-9080001174677593474?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/9080001174677593474/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=9080001174677593474' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/9080001174677593474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/9080001174677593474'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/10/chromeflock.html' title='chrome?flock'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-6531936858434493289</id><published>2008-09-29T23:13:00.001+09:00</published><updated>2008-09-29T23:13:53.130+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='東海'/><category scheme='http://www.blogger.com/atom/ns#' term='名古屋'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>東海でPythonとか</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;最近勉強会やってます。&lt;br/&gt;&lt;a href='http://groups.google.com/group/python-tokai'&gt;Python東海&lt;/a&gt;&lt;br/&gt;&lt;a href='http://www.vish.co.jp/'&gt;VISH株式会社&lt;/a&gt;内のセミナールーム。&lt;br/&gt;最大で15人ほどの小規模な勉強会です。&lt;br/&gt;先日第１回(0から数えてるので通算２回目)を開催し、１６人の参加者が集まりました。&lt;br/&gt;内容は以下のとおり&lt;br/&gt;&lt;br/&gt;&lt;ul&gt;&lt;li&gt;標準モジュールを極める hfunai&lt;br/&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;いろんな外部モジュール aodag&lt;br /&gt;&lt;/li&gt;&lt;li&gt;interactiveモードで作るスクレイパー　tiid&lt;br /&gt;&lt;/li&gt;&lt;li&gt;JS（を少しだけ）の人がPythonに触ってみた  issm&lt;br /&gt;&lt;/li&gt;&lt;li&gt;階乗を求める関数をいくつか作って、実行時間を計測してみた ココサブ&lt;br /&gt;&lt;/li&gt;&lt;li&gt;たくさんpullとかupdateする便利なスクリプト MiChiLU&lt;/li&gt;&lt;/ul&gt;結構盛りだくさんでした。&lt;br/&gt;盛りだくさんすぎて、予定していた内容を消化しきれなかったのが悔やまれます。&lt;br/&gt;今回発表してくれた６人中２人が、最近Python始めたばかり。&lt;br/&gt;この勢いを受けて、気軽に参加して発表できる勉強会として、今後も続けていきたいと思います。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-6531936858434493289?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/6531936858434493289/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=6531936858434493289' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6531936858434493289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6531936858434493289'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/09/python.html' title='東海でPythonとか'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-5522064523577886830</id><published>2008-09-21T03:47:00.001+09:00</published><updated>2008-09-21T03:47:55.462+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='google app engine'/><title type='text'>Google App Engineで始めるFacebookアプリケーション（準備）</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Facebookアプリは外部でホスティングしないといけない。&lt;br /&gt;だが、僕らにはGoogle App Engineがあるじゃないか！&lt;br /&gt;ということで、Google App Engine上でFacebookアプリを作るための準備。&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Google App Engineの準備&lt;/h2&gt;&lt;a href='http://appengine.google.com/'&gt;Google App Engineのページ&lt;/a&gt;に行って、ユーザー登録する。&lt;br /&gt;携帯のメアドが必要です。&lt;br /&gt;今のところ１アカウントで１０個までアプリケーションを登録できる。&lt;br /&gt;これから作るアプリを登録しよう。&lt;br /&gt;ちなみにこの記事内では、アプリの名前はwrkngということにします。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Python&lt;/b&gt;&lt;br /&gt;Pythonをまだインストールしていなければ、&lt;a href='http://www.python.org/'&gt;Python Language Website&lt;/a&gt;から、2.5の最新版をダウンロードして、インストールしよう。&lt;br /&gt;SDK&lt;br /&gt;SDKには、ローカルで動作する開発サーバーや、デプロイツールが含まれている。&lt;br /&gt;&lt;a href='http://code.google.com/appengine/downloads.html'&gt;Google Codeからダウンロード&lt;/a&gt;して、インストールだ。&lt;br /&gt;&lt;b&gt;&lt;br /&gt;最初のアプリ&lt;/b&gt;&lt;br /&gt;Windowsの場合は、デフォルトのままインストールすれば、C:\Program Files\Google\google_appengine\new_project_templateにアプリケーションのテンプレートがある。&lt;br /&gt;適当なところにコピーしよう。&lt;br /&gt;コピーしたら、app.yamlを修正する。&lt;br /&gt;修正するのはアプリケーション名のところだ。&lt;br /&gt;一行目の&lt;br /&gt;&lt;code&gt;&lt;br /&gt;application: new-project-template&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;を&lt;br /&gt;&lt;code&gt;&lt;br /&gt;application: wrkng&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;というように修正する。(アプリケーション名は自分が登録したものに読み替えてほしい）&lt;br /&gt;&lt;br /&gt;Macの場合は、ランチャーアプリ内から新しいアプリケーションを作成できる。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ローカルで動作確認&lt;/b&gt;&lt;br /&gt;アプリケーションを展開したディレクトリで、dev_appserver.py . を実行する。&lt;br /&gt;http://localhost:8080 にアクセスすれば、Hello, worldと表示されるはずだ。&lt;br /&gt;アップロード&lt;br /&gt;アプリケーションのディレクトリで、appcfg.py update . を実行する。&lt;br /&gt;appengineを登録したアカウントで、アプリケーションがアップロードされる。&lt;br /&gt;アップロードが終わったら、実際にアクセスして実行されているのを確認できる。&lt;br /&gt;アプリケーションのURLは、http://wrkng.appspot.com のようになる。&lt;br /&gt;&lt;h2&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2&gt;Facebookの準備&lt;/h2&gt;Facebookにログインして、開発者アプリケーションを追加する。&lt;br /&gt;開発者アプリケーション内で、新規のアプリケーションを登録する。&lt;br /&gt;コールバックURLに、さきほど作成したgoogle app engineのURL(http://wrkng.appspot.com/)を登録する。&lt;br /&gt;&lt;br /&gt;キャンバスページにアクセスすると、405エラーとなるはず。&lt;br /&gt;これは、Facebookからのアクセスが常にPOSTでくるためだ。&lt;br /&gt;アプリケーションのmain.pyを修正する。&lt;br /&gt;MainHandlerクラスのgetメソッドをpostメソッドに変更しよう。&lt;br /&gt;修正したら、またアップロードする。&lt;br /&gt;キャンバスページでも、Hello, worldが表示されるのを確認しよう。&lt;br /&gt;&lt;h2&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2&gt;FBMLのAPIを使う&lt;/h2&gt;Facebook APIから様々な情報を取得できる。&lt;br /&gt;ラッパライブラリの&lt;a href='http://code.google.com/p/pyfacebook/'&gt;PyFacebook&lt;/a&gt;を使えば、APIを手軽に利用できる。&lt;br /&gt;リリースされているコードはないので、SVNのリポジトリから取得してこよう。&lt;br /&gt;http://pyfacebook.googlecode.com/svn/trunk/&lt;br /&gt;facebookディレクトリを、アプリケーションのディレクトリにコピーする。&lt;br /&gt;&lt;br /&gt;以下のコードは、アクセスしたFacebookユーザーのフレンドをリスト表示する例だ。&lt;br /&gt;apikeyや、secretは開発者アプリケーションで確認できる。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;code&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import wsgiref.handlers&lt;br /&gt;&lt;br /&gt;import facebook.wsgi as facebook&lt;br /&gt;from google.appengine.ext import webapp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class MainHandler(webapp.RequestHandler):&lt;br /&gt;&lt;br /&gt;  def post(self):&lt;br /&gt;    fb = self.request.environ['pyfacebook.facebook']&lt;br /&gt;    if fb.check_session(self.request):&lt;br /&gt;      uid = fb.uid&lt;br /&gt;      self.response.out.write('&amp;lt;fb:name uid="%s" useYou="false" /&amp;gt;\'s friends:'&lt;br /&gt;                              % uid)&lt;br /&gt;      friends = fb.friends.get()&lt;br /&gt;      self.response.out.write('&amp;lt;ul&amp;gt;')&lt;br /&gt;      for friend in friends:&lt;br /&gt;        self.response.out.write('&amp;lt;li&amp;gt;&amp;lt;fb:name uid="%s" /&amp;gt;&amp;lt;/li&amp;gt;'&lt;br /&gt;                                % friend)&lt;br /&gt;      self.response.out.write('&amp;lt;/ul&amp;gt;')&lt;br /&gt;   &lt;br /&gt;    else:&lt;br /&gt;      url = fb.get_add_url()&lt;br /&gt;      self.redirect(url)&lt;br /&gt;        &lt;br /&gt;def main():&lt;br /&gt;  application = webapp.WSGIApplication([('/', MainHandler),&lt;br /&gt;                                        ('/send', SendHandler)],&lt;br /&gt;                                       debug=True)&lt;br /&gt;  config = {"pyfacebook.apikey":"********************************",&lt;br /&gt;            "pyfacebook.secret":"********************************"}&lt;br /&gt;&lt;br /&gt;  application = facebook.FacebookWSGIMiddleware(application,&lt;br /&gt;                                                config)&lt;br /&gt;  wsgiref.handlers.CGIHandler().run(application)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;  main()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/code&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-5522064523577886830?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/5522064523577886830/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=5522064523577886830' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5522064523577886830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5522064523577886830'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/09/google-app-enginefacebook.html' title='Google App Engineで始めるFacebookアプリケーション（準備）'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-243237542432571040</id><published>2008-09-06T11:28:00.001+09:00</published><updated>2008-09-06T11:28:16.917+09:00</updated><title type='text'>WCANに行ってくる</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://docs.google.com/Presentation?id=dhtkjs57_32fjq962c9'&gt;Python東海pythonista語らいの場 - Google ドキュメント&lt;/a&gt;&lt;br/&gt;今回はLTにも参加します。&lt;br/&gt;ということで、資料さらしあげ。&lt;br/&gt;&lt;blockquote/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-243237542432571040?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/243237542432571040/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=243237542432571040' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/243237542432571040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/243237542432571040'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/09/wcan.html' title='WCANに行ってくる'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-6992208493028024704</id><published>2008-08-30T03:48:00.002+09:00</published><updated>2008-08-30T03:49:41.622+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wsgi'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='paste'/><category scheme='http://www.blogger.com/atom/ns#' term='mod_python'/><title type='text'>mod_pythonでPasteベースなwsgiアプリケーションをvirtualenv内で動かすための8ステップ</title><content type='html'>&lt;h1 id="hfkc"&gt;mod_pythonでPasteベースなwsgiアプリケーションをvirtualenv内で動かすための8ステップ&lt;/h1&gt; &lt;br id="n078"&gt; &lt;h2 id="hfkc0"&gt;1.setuptoolsをインストールする&lt;/h2&gt;&lt;a title="http://peak.telecommunity.com/dist/ez_setup.py" href="http://peak.telecommunity.com/dist/ez_setup.py" id="mryl"&gt;http://peak.telecommunity.com/dist/ez_setup.py&lt;/a&gt; をダウンロード&lt;br id="lo2d"&gt;&lt;blockquote id="lo2d0"&gt;$ sudo python ez_setup.py&lt;br id="lo2d1"&gt;&lt;/blockquote&gt;&lt;h2 id="hfkc1"&gt; 2.virtualenvをインストールしてバーチャル環境を作る&lt;/h2&gt;&lt;blockquote id="pr03"&gt;$ sudo easy_install virtualenv&lt;br id="xsfo"&gt;$ mkdir ~/ENV&lt;br id="njm4"&gt;$ cd ~/ENV&lt;br id="njm40"&gt;$ virtualenv mysite&lt;br id="pev1"&gt;$ . mysite/bin/activate&lt;br id="njm41"&gt;&lt;/blockquote&gt;&lt;h2 id="hfkc2"&gt;3.バーチャル環境にPasteなどをインストール&lt;/h2&gt;&lt;blockquote id="vl5e"&gt; (mysite)$ easy_install Paste PasteDeploy PasteScript&lt;br id="ejn62"&gt;&lt;/blockquote&gt; &lt;h2 id="hfkc3"&gt;4.サンプルアプリケーションを作成&lt;/h2&gt;&lt;blockquote id="arr1"&gt;(mysite)$ mkdir ~/webapps&lt;br id="vl5e1"&gt;(mysite)$ cd ~/webapps&lt;br id="n0780"&gt;(mysite)$ paste create -t paste_deploy mysite&lt;br id="n0781"&gt;&lt;/blockquote&gt; &lt;br id="n0782"&gt;&lt;h2 id="ibty"&gt; 5.WSGIアプリケーションローダー&lt;/h2&gt;mod_pythonで動かすには、PasteDeployを使ってWSGIアプリケーションをロードする。&lt;br id="eb-b"&gt;~/webapps/mysite/wsgiloader.py&lt;br id="arr10"&gt;&lt;blockquote id="jedt"&gt;import os&lt;br id="jedt0"&gt;from paste.deploy.loadwsgi import loadapp&lt;br id="jedt1"&gt;&lt;br id="jedt2"&gt;uri = "config:%s" % os.path.join(os.path.dirname(__file__), 'devel_config.ini')&lt;br id="jedt3"&gt;&lt;br id="jedt4"&gt;application = loadapp(uri)&lt;br id="jedt5"&gt;&lt;/blockquote&gt;&lt;br id="eb-b1"&gt;&lt;h2 id="xs3l"&gt; 6.wsgi_handler&lt;/h2&gt;mod_pythonからwsgiアプリを動かすためのスクリプト&lt;br id="eb-b2"&gt; &lt;a title="http://trac.gerf.org/pse/wiki/WSGIHandler" href="http://trac.gerf.org/pse/wiki/WSGIHandler" id="s6pw"&gt;http://trac.gerf.org/pse/wiki/WSGIHandler&lt;/a&gt; &lt;br id="wsym"&gt;~/webapps/mysite/wsgi_handler.py に保存&lt;br id="wsym0"&gt;PATH_INFOの処理がおかしいので修正&lt;br id="ejn6"&gt;&lt;blockquote id="wsym1"&gt;--- wsgi_handler.py.orig        2008-08-30 02:23:11.000000000 +0900&lt;br id="ewtp"&gt;+++ wsgi_handler.py     2008-08-30 03:29:38.000000000 +0900&lt;br id="ewtp0"&gt;@@ -130,7 +130,7 @@&lt;br id="ewtp1"&gt;         # required for WSGI to work properly&lt;br id="ewtp2"&gt;         environ['PATH_TRANSLATED'] = self.req.filename&lt;br id="ewtp3"&gt;         # this should be right...&lt;br id="ewtp4"&gt;-        environ['PATH_INFO'] = environ['SCRIPT_NAME']&lt;br id="ewtp5"&gt;+        environ['PATH_INFO'] = environ['REQUEST_URI'][len(environ['SCRIPT_NAME']):]&lt;br id="ewtp6"&gt; &lt;br id="ewtp7"&gt;         environ['wsgi.input'] = WSGIInput(self.req)&lt;br id="ewtp8"&gt;         environ['wsgi.errors'] = WSGIError(self.req)&lt;br id="eb-b3"&gt;&lt;/blockquote&gt;  &lt;br id="lr5_3"&gt;&lt;h2 id="ibty0"&gt;7.virtualenv のためのhandler&lt;/h2&gt;バーチャル環境のライブラリをロードするためのスクリプト&lt;br id="htm90"&gt;~/webapps/mysite/virtualhandler.py&lt;br id="htm91"&gt;&lt;blockquote id="m-i4"&gt;import os&lt;br id="m-i40"&gt;import site&lt;br id="m-i41"&gt;site.addsitedir('/home/*****/ENV/mysite/lib/python2.4/site-packages/')&lt;br id="m-i42"&gt;&lt;br id="m-i43"&gt;from wsgi_handler import handler&lt;br id="m-i44"&gt;&lt;/blockquote&gt;&lt;h2 id="ibty1"&gt; 8.Apacheディレクティブを設定&lt;/h2&gt;&lt;pre id="m1922" class="wiki"&gt;&lt;span id="xlxm0" style="font-family: Verdana;"&gt;PythonDebugやPythonAutoReloadはお好きなように。&lt;br id="xlxm1"&gt;&lt;/span&gt;&lt;/pre&gt;  &lt;blockquote id="zif0"&gt;&amp;lt;Location /mysite/&amp;gt;&lt;br id="m1923"&gt;PythonPath "['/home/*****/ENV/mysite/bin'] + sys.path"&lt;br id="m1928"&gt;SetHandler python-program&lt;br id="v:-i"&gt;PythonHandler virtualhandler&lt;br id="uphj"&gt;PythonOption WSGI.Application wsgiloader::application&lt;br id="uphj0"&gt;PythonDebug On&lt;br id="uphj1"&gt;PythonAutoReload On&lt;br id="v:-i0"&gt;&amp;lt;/Location&amp;gt;&lt;br id="xlxm4"&gt;&lt;/blockquote&gt;&lt;pre id="xlxm2" class="wiki"&gt;&lt;br id="xlxm5"&gt;&lt;br id="xlxm6"&gt;&lt;/pre&gt; &lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-6992208493028024704?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/6992208493028024704/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=6992208493028024704' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6992208493028024704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6992208493028024704'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/08/modpythonpastewsgivirtualenv8.html' title='mod_pythonでPasteベースなwsgiアプリケーションをvirtualenv内で動かすための8ステップ'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-3682870162079319972</id><published>2008-07-29T06:22:00.001+09:00</published><updated>2008-07-29T06:22:39.192+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>mjtemplate</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;h2&gt;Mjt&lt;/h2&gt;&lt;br/&gt;&lt;a href='http://mjtemplate.org/'&gt;mjt&lt;/a&gt; は、ブラウザ上で使えるJavascriptのテンプレートエンジンです。&lt;br/&gt;Freebaseというサービスのために作られたらしいですが、その他のWebアプリケーションでも使えます。&lt;br/&gt;オープンソースで、BSDライセンスです。&lt;br/&gt;htmlの属性を使っている点は、KidテンプレートやGenshiなどによく似ています。&lt;br/&gt;&lt;br/&gt;&lt;h2&gt;動かす準備&lt;/h2&gt;&lt;br/&gt;以下のコードがベースになります。&lt;br/&gt;bodyタグの中にテンプレートを記述します。&lt;br/&gt;&lt;pre class='literal-block'&gt;&lt;br/&gt;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&lt;br/&gt;&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&amp;gt;&amp;lt;/meta&amp;gt;&lt;br/&gt;&amp;lt;script type="text/javascript"&lt;br/&gt;        src="http://mjtemplate.org/dist/latest/mjt.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br/&gt;&amp;lt;/head&amp;gt;&lt;br/&gt;&amp;lt;body onload="mjt.run()" style="display:none"&amp;gt;&lt;br/&gt;    &amp;lt;!-- PASTE YOUR MJT EXAMPLE HERE! --&amp;gt;&lt;br/&gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;br/&gt;&lt;/pre&gt;&lt;br/&gt;&lt;br/&gt;&lt;h2&gt;最初の例&lt;/h2&gt;&lt;br/&gt;&lt;pre class='literal-block'&gt;&amp;lt;h3&amp;gt;hello&amp;lt;h3&amp;gt;&lt;br/&gt;&lt;/pre&gt;&lt;br/&gt;&lt;br/&gt;単純なHTMLはそのまま表示されます。&lt;br/&gt;&lt;br/&gt;&lt;h2&gt;変数を表示する。&lt;/h2&gt;&lt;br/&gt;&lt;pre class='literal-block'&gt;&lt;br/&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br/&gt;var message = "Hello, world!";&lt;br/&gt;&amp;lt;/script&amp;gt;&lt;br/&gt;&amp;lt;h1&amp;gt;${message}&amp;gt;/h1&amp;gt;&lt;br/&gt;&lt;/pre&gt;&lt;br/&gt;${expr}で、exprの評価結果を表示します。&lt;br/&gt;exprが変数のみの場合は、$exprとしても同様の結果となります。&lt;br/&gt;また、表示はデフォルトでエスケープされます。&lt;br/&gt;HTMLを動的に生成して表示するなど、エスケープしたくない場合は、mjt.blessを介して表示します。&lt;br/&gt;&lt;br/&gt;&lt;pre class='literal-block'&gt;&lt;br/&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br/&gt;var message = "&amp;lt;Hello, world!&amp;gt;";&lt;br/&gt;&amp;lt;/script&amp;gt;&lt;br/&gt;${mjt.bless(message)}&lt;br/&gt;&lt;/pre&gt;&lt;br/&gt;&lt;br/&gt;&lt;h2&gt;制御とか&lt;/h2&gt;&lt;br/&gt;ifやforなど使えます。&lt;br/&gt;&lt;pre class='literal-block'&gt;&lt;br/&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br/&gt;var message = "Hello, world!";&lt;br/&gt;var flag = true&lt;br/&gt;&amp;lt;/script&amp;gt;&lt;br/&gt;&amp;lt;p mjt.if="flag"&amp;gt;&lt;br/&gt; ${message}&lt;br/&gt;&amp;lt;/p&amp;gt;&lt;br/&gt;&amp;lt;p mjt.else=""&amp;gt;&lt;br/&gt; NG&lt;br/&gt;&amp;lt;/p&amp;gt;&lt;br/&gt;&lt;/pre&gt;&lt;br/&gt;&lt;br/&gt;&lt;pre class='literal-block'&gt;&lt;br/&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br/&gt;var values = [1,2,3,4];&lt;br/&gt;&amp;lt;/script&amp;gt;&lt;br/&gt;&amp;lt;ul&amp;gt;&lt;br/&gt; &amp;lt;li mjt.for="v in values"&amp;gt;${v}&amp;lt;/li&amp;gt;&lt;br/&gt;&amp;lt;/ul&amp;gt;&lt;br/&gt;&lt;br/&gt;&lt;/pre&gt;&lt;br/&gt;&lt;br/&gt;&lt;h2&gt;サブテンプレート&lt;/h2&gt;&lt;br/&gt;mjt.defで、サブテンプレートを定義できます。&lt;br/&gt;&lt;pre class='literal-block'&gt;&lt;br/&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br/&gt;var values = ["http://example.com/","http://example.net/"];&lt;br/&gt;&amp;lt;/script&amp;gt;&lt;br/&gt;&amp;lt;div mjt.def="mklink(url)"&amp;gt;&lt;br/&gt; &amp;lt;a href="${url}" title="${url}"&amp;gt;${url}&amp;lt;/a&amp;gt;&lt;br/&gt;&amp;lt;/div&amp;gt;&lt;br/&gt;&amp;lt;ul&amp;gt;&lt;br/&gt; &amp;lt;li mjt.for="v in values"&amp;gt;${mklink(v)}&amp;lt;/li&amp;gt;&lt;br/&gt;&amp;lt;/ul&amp;gt;&lt;br/&gt;&lt;br/&gt;&lt;/pre&gt;&lt;br/&gt;&lt;br/&gt;&lt;h2&gt;おわり&lt;/h2&gt;&lt;br/&gt;OpenSocialやガジェットなど、Javascriptで動的に表示させることも多くなってきました。&lt;br/&gt;テンプレートエンジンを使うと、表示内容を推測しやすく、安全に値を表示できます。&lt;br/&gt;文字列操作やDOMによる方法よりも格段に生産性がアップするのではないでしょうか。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-3682870162079319972?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/3682870162079319972/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=3682870162079319972' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/3682870162079319972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/3682870162079319972'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/07/mjtemplate.html' title='mjtemplate'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-6377065907125431365</id><published>2008-06-25T13:14:00.001+09:00</published><updated>2008-06-25T13:14:34.079+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pyspa'/><title type='text'>Python温泉でやること</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;キーワードだけ箇条書き&lt;ul&gt;&lt;li&gt;reddit&lt;/li&gt;&lt;li&gt;GAE&lt;/li&gt;&lt;li&gt;Facebook&lt;/li&gt;&lt;li&gt;Netvibes&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-6377065907125431365?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/6377065907125431365/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=6377065907125431365' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6377065907125431365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6377065907125431365'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/06/python.html' title='Python温泉でやること'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-730988464752003635</id><published>2008-06-17T22:52:00.001+09:00</published><updated>2008-06-17T22:52:28.071+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Firefox3!</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://picasaweb.google.com/aodagx/AodagBlog/photo#5212847664415412722'&gt;&lt;img src='http://lh4.ggpht.com/aodagx/SFfBVPm0kfI/AAAAAAAAAjI/bsX25uz1DD0/s144/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3%202.png'/&gt;&lt;/a&gt;&lt;br /&gt;早速インストール！&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-730988464752003635?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/730988464752003635/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=730988464752003635' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/730988464752003635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/730988464752003635'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/06/firefox3.html' title='Firefox3!'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/aodagx/SFfBVPm0kfI/AAAAAAAAAjI/bsX25uz1DD0/s72-c/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3%202.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-7336906146945932639</id><published>2008-06-11T10:20:00.001+09:00</published><updated>2008-06-11T10:20:20.819+09:00</updated><title type='text'>Google Developer Day 2008</title><content type='html'>&lt;font size="4"&gt;    Google Developer Day 2008行ってきた。&lt;/font&gt;&lt;br /&gt;   &lt;table style="width: 194px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="background: transparent url(http://picasaweb.google.com/f/img/transparent_album_background.gif) no-repeat scroll left center; height: 194px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="center"&gt;&lt;a href="http://picasaweb.google.co.jp/aodagx/GoogleDeveloperDay2008"&gt;&lt;img src="http://lh6.ggpht.com/aodagx/SE8cxAgPIRE/AAAAAAAAAeo/RhPn5HdSh6M/s160-c/GoogleDeveloperDay2008.jpg" style="margin: 1px 0pt 0pt 4px;" height="160" width="160" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align: center; font-family: arial,sans-serif; font-size: 11px;"&gt;&lt;a href="http://picasaweb.google.co.jp/aodagx/GoogleDeveloperDay2008" style="color: rgb(77, 77, 77); font-weight: bold; text-decoration: none;"&gt;Google Developer Day 2008&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;9時からの受付開始に合わせて、6:30に家を出る。地方はつらい。&lt;br /&gt;今年は乗り換え間違えなかったよ！&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;基調講演&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;午前の部、基調講演は、現在Googleが課題としている3つのCについて。&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Cloud&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Client&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Connectivity&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;以下、そのあたりのメモ&lt;br /&gt;&lt;p&gt;アプリがWeb上にあるクラウド環境は、メインフレーム時代に似てる。デプロイは一箇所にするだけだから簡単。&lt;br /&gt;でもクライアント側はブラウザ。&lt;br /&gt;クライアントとしては力不足だよね。&lt;br /&gt;そこでGears(スタンダードを目指すためGoogle GearsからGearsに名称変更。HTML5への取り込みを働きかけてるとのこと)を使おう。&lt;/p&gt;&lt;p&gt;クラウド環境のWebアプリを作りやすくする。&lt;br /&gt;Webアプリは準備に手間がかかる。&lt;br /&gt;Google App Engine で場所、ものを用意。&lt;br /&gt;純粋にアプリを作ることに集中できる。&lt;br /&gt;今はPythonだけ。今後対応言語を増やしていく。&lt;/p&gt;&lt;p&gt;クライアントとクラウドをつなげるために。&lt;br /&gt;ユビキタス環境。&lt;br /&gt;Androidプラットフォーム。&lt;br /&gt;OS以上のものを提供する。メディアプレイヤーの実演など&lt;/p&gt;&lt;p&gt;あとOpensocial最後は「Be Social」で締めくくられました。検索の話はまったくなかった&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;Google App Engine&lt;/span&gt;&lt;/p&gt;&lt;p&gt;この時間はAndroidのコードラボとGoogle App Engineの講演しかなかったので、会場で合流したid:a2cと一緒に聴きにいく。内容は既に公開されているチュートリアルを目の前でやっていた。質疑応答ではセキュリティやチャージについての質問があった。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;昼ごはん&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Pythonつながりで連れ立って、みなとみらい駅の駅ビルらしき建物の中にあったインド料理屋でバイキング。&lt;/p&gt;&lt;p&gt;去年は弁当が出てたのになぁ。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;hackathon参加&lt;/span&gt;&lt;p&gt;午後はOpensocialのHackathonに参加。&lt;br /&gt;事前に登録した人で集まり、作りたいものを発表、グループ分け。&lt;br /&gt;その日あったばかりの人とコーディングするってのが新鮮ですね。&lt;br /&gt;作業時間は正味2時間ほどでしたが、とりあえずローカルでの動作確認はOK。&lt;br /&gt;むしろローカル確認で手間どったかも。&lt;br /&gt;最後に成果発表をして終了。&lt;br /&gt;占いアプリを作ってたグループのはちゃんと動いてたよ、すごいなぁ。&lt;br /&gt;Orkutの0.8対応は今週来週ってあたりの話らしい。早くぅ。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;大きな目的はOpensocialの参加。Hackathonは初体験でしたが、今後も積極的に参加していこうと思います。&lt;br /&gt;その分他のセッションを見る時間が少なくなってしまったけど、他のかたがたのレポートに期待。&lt;br /&gt;&lt;/p&gt;&lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-7336906146945932639?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/7336906146945932639/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=7336906146945932639' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/7336906146945932639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/7336906146945932639'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/06/google-developer-day-2008.html' title='Google Developer Day 2008'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/aodagx/SE8cxAgPIRE/AAAAAAAAAeo/RhPn5HdSh6M/s72-c/GoogleDeveloperDay2008.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-2385055009091875316</id><published>2008-06-08T23:37:00.001+09:00</published><updated>2008-06-08T23:37:00.169+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='東野圭吾'/><category scheme='http://www.blogger.com/atom/ns#' term='読書'/><category scheme='http://www.blogger.com/atom/ns#' term='ミステリ'/><title type='text'>さまよう刃</title><content type='html'>&lt;a href="http://www.amazon.co.jp/%E3%81%95%E3%81%BE%E3%82%88%E3%81%86%E5%88%83-%E8%A7%92%E5%B7%9D%E6%96%87%E5%BA%AB-16-6-%E6%9D%B1%E9%87%8E-%E5%9C%AD%E5%90%BE/dp/4043718063/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1212935152&amp;sr=8-1"&gt;「さまよう刃」&lt;/a&gt;&lt;span style="font-weight:bold;"&gt;東野圭吾&lt;/span&gt;&lt;br /&gt;   事件そのものは、「模倣犯」に似てるかも。&lt;br /&gt;加害者、被害者、その周辺と、多くの視点で書かれてる。&lt;br /&gt;加害者は中途半端に改心したりせず、最後まで期待を裏切らないですね。ちったぁ裏切れよな。&lt;br /&gt;最後の方に、微妙なミスリーディングがあるけど、「で？」っていうところ。&lt;br /&gt;だって、そこで明かされるまで、とくに不思議に感じなかったしね。&lt;br /&gt;&lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-2385055009091875316?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/2385055009091875316/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=2385055009091875316' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/2385055009091875316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/2385055009091875316'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/06/blog-post_08.html' title='さまよう刃'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-1556178303782442749</id><published>2008-06-04T23:58:00.001+09:00</published><updated>2008-06-04T23:58:51.358+09:00</updated><title type='text'>THE DEATH YOU DESIRE</title><content type='html'>&lt;a href="http://www.amazon.co.jp/%E5%90%9B%E3%81%AE%E6%9C%9B%E3%82%80%E6%AD%BB%E3%81%AB%E6%96%B9-%E3%83%8E%E3%83%B3%E3%83%BB%E3%83%8E%E3%83%99%E3%83%AB-845-%E7%9F%B3%E6%8C%81-%E6%B5%85%E6%B5%B7/dp/4396208456"&gt;君の望む死に方&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;石持浅海&lt;/span&gt;&lt;br /&gt;&lt;p&gt;僕にとって衝撃的だった「扉は閉ざされたまま」の続編ともいうべき作品。&lt;br /&gt;まあ、あの知性派コンビの片方しか出てこないのですけど。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;「扉…」とドラマ化されてたんですねー。DVDチェックしとかなきゃ。&lt;br /&gt;松下奈緒さんはあまり知らなくて、演技力とかも良くわからないですが、帯についてる写真の様子ではイメージどおりです。黒髪ばんざい。&lt;/p&gt;&lt;p&gt;さて、余命いくばくもない社長がある理由により、殺されることにします。&lt;br /&gt;そして、例によってクローズドサークル。&lt;br /&gt;まだ*******なので純粋な探偵役ではないのですが、頭脳とある種の冷たさは前回のとおり。&lt;br /&gt;「扉…」で彼女のファンになった人は満足すること仕切りかと。&lt;/p&gt;&lt;p&gt;あと、「賢者の贈り物」を読まなきゃ&lt;/p&gt;&lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-1556178303782442749?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/1556178303782442749/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=1556178303782442749' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/1556178303782442749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/1556178303782442749'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/06/death-you-desire.html' title='THE DEATH YOU DESIRE'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-8171730571343611066</id><published>2008-06-02T01:06:00.001+09:00</published><updated>2008-06-02T01:06:55.528+09:00</updated><title type='text'>ニコニコ動画みてる</title><content type='html'>&lt;p&gt;&lt;br /&gt;今更技術部の存在を把握した次第。&lt;br /&gt;業者さんたちすげぇよ。&lt;/p&gt;&lt;p&gt;ガラス細工の人は編集もウマくて思わず全部見てしまった。&lt;br /&gt;疑問疑問ぎーもん♪&lt;br /&gt;&lt;/p&gt;&lt;iframe src="http://www.nicovideo.jp/thumb_mylist/3473581" style="border: 1px solid rgb(204, 204, 204);" frameborder="0" height="176" scrolling="no" width="312"&gt;&lt;/iframe&gt;&lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-8171730571343611066?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/8171730571343611066/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=8171730571343611066' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/8171730571343611066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/8171730571343611066'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/06/blog-post.html' title='ニコニコ動画みてる'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-5793205965346490064</id><published>2008-06-01T02:18:00.001+09:00</published><updated>2008-06-01T02:18:03.595+09:00</updated><title type='text'>Netvibes</title><content type='html'>&lt;p&gt;今まで放置していたNetvibesのpublic pageを充実させてみた。&lt;/p&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/aodagx/Web/photo#5206591906705189538"&gt;&lt;img src="http://lh4.ggpht.com/aodagx/SEGHwOGWKqI/AAAAAAAAAUI/obHDNjhefIo/s144/netvibes.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.netvibes.com/aodag"&gt;aodag panel &lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;twitterとかFriendfeedとかlast.fmとかのブログパーツをとりあえず配置。&lt;br /&gt;ネット上の活動を集約場所に使えば便利かも。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;あと、activityとかあるけど、followしてないので、どんなものかは不明。&lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-5793205965346490064?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/5793205965346490064/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=5793205965346490064' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5793205965346490064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5793205965346490064'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/06/netvibes.html' title='Netvibes'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/aodagx/SEGHwOGWKqI/AAAAAAAAAUI/obHDNjhefIo/s72-c/netvibes.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-3438624568176358404</id><published>2008-05-29T00:46:00.001+09:00</published><updated>2008-05-29T00:46:51.966+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wsgi'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='oauth'/><title type='text'>oAuthをWSGIで。</title><content type='html'>&lt;p&gt;&lt;br /&gt;    oAuthについてるexampleがBaseHTTPServerベースだったので、wsgiに直してみた。&lt;br /&gt;単にリクエストとレスポンスをWebObにしただけだが、clientはそのまま使って動作確認しながら、oAuthの流れを確認できた。&lt;br /&gt;&lt;/p&gt;OAuthRequestの生成やOAuthErrorのハンドリングは、ミドルウェアにすべきだったかな。&lt;br /&gt;そうすれば、Selectorあたりのディスパッチャが使えるしね。&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;class Application(object):&lt;br /&gt;    def __init__(self, *args, **kwargs):&lt;br /&gt;        self.oauth_server = oauth.OAuthServer(MockOAuthDataStore())&lt;br /&gt;        self.oauth_server.add_signature_method(oauth.OAuthSignatureMethod_PLAINTEXT())&lt;br /&gt;        self.oauth_server.add_signature_method(oauth.OAuthSignatureMethod_HMAC_SHA1())&lt;br /&gt;&lt;br /&gt;    def __call__(self, environ, start_response):&lt;br /&gt;        request = webob.Request(environ)&lt;br /&gt;        response = webob.Response(request=request)&lt;br /&gt;        postdata = None&lt;br /&gt;        if request.method == 'POST':&lt;br /&gt;            length = int(request.content_length)&lt;br /&gt;            print 'content_length %d' % length&lt;br /&gt;            postdata = request.environ['wsgi.input'].read(length)&lt;br /&gt;        print 'postdata:: %s' % postdata&lt;br /&gt;        oauth_request = oauth.OAuthRequest.from_request(request.method,&lt;br /&gt;                                                        request.url,&lt;br /&gt;                                                        headers=request.headers,&lt;br /&gt;                                                        postdata=postdata)&lt;br /&gt;        if request.path.startswith(REQUEST_TOKEN_URL):&lt;br /&gt;            try:&lt;br /&gt;                token = self.oauth_server.fetch_request_token(oauth_request)&lt;br /&gt;                response.status = 200&lt;br /&gt;                response.body = token.to_string()&lt;br /&gt;                return response(environ, start_response)&lt;br /&gt;            except oauth.OAuthError, err:&lt;br /&gt;                return self.errorResponse(response, err)&lt;br /&gt;&lt;br /&gt;        if request.path.startswith(AUTHORIZATION_URL):&lt;br /&gt;            try:&lt;br /&gt;                token = self.oauth_server.fetch_request_token(oauth_request)&lt;br /&gt;                &lt;br /&gt;                callback = self.oauth_server.get_callback(oauth_request)&lt;br /&gt;                token = self.oauth_server.authorize_token(token, None)&lt;br /&gt;                token_key = urllib.urlencode({'oauth_token': token.key})&lt;br /&gt;                &lt;br /&gt;                response.status = 200&lt;br /&gt;                response.body = """callback:%(callback)s&lt;br /&gt;token key: %(token_key)s""" % dict(callback=callback, token=token, token_key=token_key)&lt;br /&gt;                return response(environ, start_response)&lt;br /&gt;            except oauth.OAuthError, err:&lt;br /&gt;                return self.errorResponse(response, err)&lt;br /&gt;&lt;br /&gt;        # access token&lt;br /&gt;        if request.path.startswith(ACCESS_TOKEN_URL):&lt;br /&gt;            try:&lt;br /&gt;                # create an access token&lt;br /&gt;                token = self.oauth_server.fetch_access_token(oauth_request)&lt;br /&gt;                # send okay response&lt;br /&gt;                response.status = 200&lt;br /&gt;                # return the token&lt;br /&gt;                response.body = token.to_string()&lt;br /&gt;                return response(environ, start_response)&lt;br /&gt;            except oauth.OAuthError, err:&lt;br /&gt;                return self.errorResponse(response, err)&lt;br /&gt;&lt;br /&gt;        if request.path.startswith(RESOURCE_URL):&lt;br /&gt;            try:&lt;br /&gt;                # verify the request has been oauth authorized&lt;br /&gt;                consumer, token, params = self.oauth_server.verify_request(oauth_request)&lt;br /&gt;                # send okay response&lt;br /&gt;                response.status = 200&lt;br /&gt;                # return the extra parameters - just for something to return&lt;br /&gt;                #response.body = str(params)&lt;br /&gt;                response.body = "OK auth."&lt;br /&gt;                return response(environ, start_response)&lt;br /&gt;            except oauth.OAuthError, err:&lt;br /&gt;                print err.message&lt;br /&gt;                return self.errorResponse(response, environ, start_response, err)&lt;br /&gt;&lt;br /&gt;        response.status = 404&lt;br /&gt;        response.body = response.status&lt;br /&gt;        return response(environ, start_response)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    def errorResponse(self, response, environ, start_response, err=None):&lt;br /&gt;                response.status = 401&lt;br /&gt;                header = oauth.build_authenticate_header(realm=REALM)&lt;br /&gt;                for k, v in header.iteritems():&lt;br /&gt;                    response.headers[k] = v&lt;br /&gt;                return response(environ, start_response)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-3438624568176358404?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/3438624568176358404/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=3438624568176358404' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/3438624568176358404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/3438624568176358404'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/05/oauthwsgi.html' title='oAuthをWSGIで。'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-6832679593598359105</id><published>2008-05-26T01:52:00.001+09:00</published><updated>2008-05-26T01:52:07.064+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='itertoos'/><category scheme='http://www.blogger.com/atom/ns#' term='functools'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>itertoolsでフィードを処理する 続き</title><content type='html'>functoolsやitertoolsを使って整理してみた。&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;import feedparser&lt;br /&gt;import itertools&lt;br /&gt;import functools&lt;br /&gt;&lt;br /&gt;def fetchfeed(url):&lt;br /&gt;    d = feedparser.parse('http://feeds.feedburner.jp/AodagBlog')&lt;br /&gt;    return d.entries&lt;br /&gt;&lt;br /&gt;def yearMonth(entry):&lt;br /&gt;    return (entry.updated_parsed[0],&lt;br /&gt;            entry.updated_parsed[1])&lt;br /&gt;&lt;br /&gt;def groupbyYearMonth(entries):&lt;br /&gt;    return itertools.groupby(entries, yearMonth)&lt;br /&gt;&lt;br /&gt;def tags(entry):&lt;br /&gt;    return [tag.term for tag in entry.get('tags', [])]&lt;br /&gt;&lt;br /&gt;def tagIncludes(word, entry):&lt;br /&gt;    return word in tags(entry)&lt;br /&gt;&lt;br /&gt;def pipe(func1, func2):&lt;br /&gt;    return lambda x: func2(func1(x))&lt;br /&gt;&lt;br /&gt;def createFilter(filterfunc):&lt;br /&gt;    return functools.partial(itertools.ifilter,&lt;br /&gt;                             filterfunc)&lt;br /&gt;def createMapper(mapperfunc):&lt;br /&gt;    return functools.partial(itertools.imap,&lt;br /&gt;                             mapperfunc)&lt;br /&gt;&lt;br /&gt;def createGroup(groupfunc):&lt;br /&gt;    return lambda iter: itertools.groupby(iter, groupfunc)&lt;br /&gt;                             &lt;br /&gt;createCommand = functools.partial(reduce, lambda x, y:pipe(x, y))&lt;br /&gt;command = createCommand([fetchfeed,&lt;br /&gt;                         createFilter(functools.partial(tagIncludes, 'wsgi')),&lt;br /&gt;                         createGroup(yearMonth),&lt;br /&gt;                         createMapper(lambda x: (x[0], [e.title for e in x[1]])),&lt;br /&gt;                         list&lt;br /&gt;                         ])&lt;br /&gt;&lt;br /&gt;print command('http://feeds.feedburner.jp/AodagBlog')&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;多分これで、処理の入れ替えとかできるはず。&lt;br /&gt;ただし、処理がリストってことは、複数フィードをマージするなどの処理ができない。&lt;br /&gt;ツリー版のreduceなんかが必要になると思う。&lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-6832679593598359105?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/6832679593598359105/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=6832679593598359105' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6832679593598359105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6832679593598359105'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/05/itertools_26.html' title='itertoolsでフィードを処理する 続き'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-901900466284547835</id><published>2008-05-25T23:45:00.001+09:00</published><updated>2008-05-25T23:45:00.984+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='itertools'/><title type='text'>itertoolsでフィードを処理する</title><content type='html'>&lt;p&gt;&lt;br /&gt;今更だけど、Yahoo Pipesってすばらしい。&lt;br /&gt;フィードって結局エントリのリストだから、関数フィルタの連続で処理できるんだね。&lt;br /&gt;GoogleはこのあたりをMapReduceで大規模に処理するフレームワークがあるらしいけど、どんな規模でもリスト処理ってのは、基本なんだろうと思う。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;ってあたりで、Pythonでやったらどうなんだろうと思い、少し書いてみた。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;このブログのフィードから、タグにwsgiって入ってるエントリを年月ごとにグルーピングする処理。&lt;br /&gt;あんまり考えずに書いたので、lambdaとか入ってるので見づらいな。&lt;br /&gt;部分適用を使えば、フィルタ関数を簡易に書けそう。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;import feedparser&lt;br /&gt;import itertools&lt;br /&gt;d = feedparser.parse('http://feeds.feedburner.jp/AodagBlog')&lt;br /&gt;print d['feed']['title']&lt;br /&gt;&lt;br /&gt;for g, entries in itertools.groupby(itertools.ifilter(lambda e: 'wsgi'&lt;br /&gt;                                                      in [tag.term&lt;br /&gt;                                                          for tag in e.get('tags', [])],&lt;br /&gt;                                                      d['entries']),&lt;br /&gt;                                    lambda e: (e.updated_parsed[0],&lt;br /&gt;                                               e.updated_parsed[1])):&lt;br /&gt;    print g&lt;br /&gt;    for e in entries:&lt;br /&gt;        print ' ', e.title&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-901900466284547835?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/901900466284547835/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=901900466284547835' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/901900466284547835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/901900466284547835'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/05/itertools.html' title='itertoolsでフィードを処理する'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-4580252937393716595</id><published>2008-05-13T00:47:00.001+09:00</published><updated>2008-05-13T00:47:20.612+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wsgi'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='googleapp engine'/><title type='text'>GAE</title><content type='html'>Google App Engineのアカウントもらったあたりから、忙しさにかまけてほったらかしになってた。&lt;br /&gt;いまさらだけど、いろいろやろうと思う。&lt;br /&gt;&lt;br /&gt;Pylons動かそうかとも思ったけど、とりあえず用意されているフレームワークを試してみる。&lt;br /&gt;とはいえ、かったるい部分はまとめておこう。&lt;br /&gt;メモ代わりに貼り付け。&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;from google.appengine.ext import webapp&lt;br /&gt;from google.appengine.api import users&lt;br /&gt;from google.appengine.ext.webapp import template&lt;br /&gt;from google.appengine.ext import db&lt;br /&gt;&lt;br /&gt;import model&lt;br /&gt;import os&lt;br /&gt;&lt;br /&gt;templates_dir = os.path.join(os.path.dirname(__file__), "templates")&lt;br /&gt;&lt;br /&gt;def render(name, **vars):&lt;br /&gt;    path = os.path.join(templates_dir, name)&lt;br /&gt;    &lt;br /&gt;    return template.render(path, vars)&lt;br /&gt;&lt;br /&gt;def secure(method):&lt;br /&gt;    def wrap(self, *args, **kwargs):&lt;br /&gt;        user = users.get_current_user()&lt;br /&gt;        if user:&lt;br /&gt;            return method(self, *args, **kwargs)&lt;br /&gt;        else:&lt;br /&gt;            self.redirect(users.create_login_url(self.request.uri))&lt;br /&gt;    return wrap&lt;br /&gt;&lt;br /&gt;def expose(template):&lt;br /&gt;    def decorator(method):&lt;br /&gt;        def wrap(self, *args, **kwargs):&lt;br /&gt;            self.response.headers['Content-Type'] = 'text/html;charset=utf-8'&lt;br /&gt;            data = method(self, *args, **kwargs)&lt;br /&gt;            body = render(template, **data)&lt;br /&gt;            self.response.out.write(body)&lt;br /&gt;        return wrap&lt;br /&gt;    return decorator&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;認証デコレータと、テンプレートレンダラ&lt;br /&gt;あと、テンプレート呼び出しを簡単にするレンダラ。&lt;br /&gt;exposeは、まあBuffetの劣化コピーだが、とりあえずwebapp.RequestHandlerにあわせてある。&lt;br /&gt;テンプレートはとっととTempitaに変更することにしよう。&lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-4580252937393716595?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/4580252937393716595/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=4580252937393716595' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4580252937393716595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4580252937393716595'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/05/gae.html' title='GAE'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-8877393125687765986</id><published>2008-05-12T02:11:00.001+09:00</published><updated>2008-05-12T02:11:19.384+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='名古屋'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>東海地方のウェブ関係の仕事をしているすごい人100 | WEBで地域活性化～愛知県清須市から発信☆WEBシステム屋の日記～</title><content type='html'>&lt;a href="http://as.blog16.jp/index.php/2008/04/22/p259"&gt;東海地方のウェブ関係の仕事をしているすごい人100 | WEBで地域活性化～愛知県清須市から発信☆WEBシステム屋の日記～&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;うは、なんか名前出てきました。&lt;br /&gt;こういうので、他の人を推薦できないのが、僕の限界な気がする。&lt;br /&gt;もっと色んな人に会って、学ぶべきことがあるはずだよ。&lt;br /&gt;(ちなみに会っていても覚えていない可能性もある。もっと人の話を聞けと。)&lt;br /&gt;&lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-8877393125687765986?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/8877393125687765986/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=8877393125687765986' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/8877393125687765986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/8877393125687765986'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/05/100-webweb.html' title='東海地方のウェブ関係の仕事をしているすごい人100 | WEBで地域活性化～愛知県清須市から発信☆WEBシステム屋の日記～'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-4754234433964510057</id><published>2008-05-11T15:17:00.001+09:00</published><updated>2008-05-11T15:17:13.665+09:00</updated><title type='text'>もうSNSはクローズドでいられないのか</title><content type='html'>&lt;a href="http://jp.techcrunch.com/archives/20080509threes-company-google-to-launch-friend-connect-on-monday/"&gt;TechCrunch Japanese アーカイブ » Googleも月曜日にFriend Connectを発表&lt;/a&gt;&lt;br /&gt;&lt;a href="http://jp.techcrunch.com/archives/20080509facebook-responds-to-myspace-with-facebook-connect/"&gt;TechCrunch Japanese アーカイブ » FaceBook Connect－これがMySpaceの発表へのFaceBookの回答だ！&lt;/a&gt;&lt;br /&gt;&lt;a href="http://jp.techcrunch.com/archives/20080508myspace-embraces-data-portability-partners-with-yahoo-ebay-and-twitter/"&gt;TechCrunch Japanese アーカイブ » MySpace、DataPortabilityを採用：Yahoo、Ebay、Twitterとのデータ共有へ&lt;/a&gt;&lt;br /&gt;SNS間のデータ共有が一気に加速している模様。&lt;br /&gt;とはいえ、まだこれは大規模なSNSがやっていることなので、その他小規模なSNSはどうするんでしょうね。&lt;br /&gt;Googleとしては、インターネットそのものをSNSにしたいのかな。&lt;br /&gt;OpenSocial, Social Graph そして、Friend Connectと、武器はそろいつつある。&lt;br /&gt;積極的にこの流れにのっていくか、クローズドに囲い込みを続けていくのか。&lt;br /&gt;これが、太陽と北風なら、太陽についていくしかないのだろうけど、1対1の戦いでもないし、太陽が複数あるので、さて何が起きるのだろうな。&lt;br /&gt;&lt;br /&gt;   &lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-4754234433964510057?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/4754234433964510057/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=4754234433964510057' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4754234433964510057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4754234433964510057'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/05/sns.html' title='もうSNSはクローズドでいられないのか'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-5713679119831245086</id><published>2008-05-10T22:31:00.001+09:00</published><updated>2008-05-10T22:31:14.895+09:00</updated><title type='text'>Della.js</title><content type='html'>名古屋でもJavascriptは熱いぜ！&lt;br /&gt;まあ、懇親会から参加したんだけどな。&lt;br /&gt;&lt;a href="http://groups.google.com/group/dellajs/"&gt;http://groups.google.com/group/dellajs/&lt;/a&gt;&lt;br /&gt;名古屋で、Javascriptの話をしたければここに登録するといいよ。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-5713679119831245086?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/5713679119831245086/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=5713679119831245086' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5713679119831245086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5713679119831245086'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/05/dellajs.html' title='Della.js'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-8767215060023745943</id><published>2008-04-18T07:38:00.001+09:00</published><updated>2008-04-18T07:38:13.393+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wsgi'/><category scheme='http://www.blogger.com/atom/ns#' term='webob'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='paste'/><title type='text'>Another Do-It-Yourself Framework</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br /&gt;&lt;a href='http://pythonpaste.org/webob/do-it-yourself.html'&gt;Another Do-It-Yourself Framework&lt;/a&gt; &lt;br /&gt; &lt;blockquote&gt;It's been over two years since I wrote the first version of this tutorial. I decided to give it another run with some of the tools that have come about since then (particularly WebOb).&lt;/blockquote&gt;&lt;br /&gt;&lt;a href='http://pythonpaste.org/do-it-yourself-framework.html'&gt;A Do-It-Yourself Framework&lt;/a&gt;がPasteのドキュメントにあったわけですが、古くなったということで、WebObベースで新しく書き直されています。&lt;br /&gt;ざっくりと見ると、ディスパッチャがオブジェクトパブリッシャーだったのが、正規表現でのURLマッピングに変わってますね。&lt;br /&gt;コントローラも関数などの呼び出し可能オブジェクトにdecoratorをつける方式と、urlvarsとHTTPメソッドを組み合わせてインスタンスメソッドを呼び出す形式を紹介しています。&lt;br /&gt;どちらの方式でも同じように呼び出せるのはWSGIのよいところ。&lt;br /&gt;ところで、リクエストオブジェクトをスレッドローカルにするのは、paste.registryでできるのに、ここでまた実装するのは、使うなってことなのだろうか。&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-8767215060023745943?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/8767215060023745943/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=8767215060023745943' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/8767215060023745943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/8767215060023745943'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/04/another-do-it-yourself-framework.html' title='Another Do-It-Yourself Framework'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-7356370555872319057</id><published>2008-04-14T08:51:00.001+09:00</published><updated>2008-04-14T08:51:29.560+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wsgi'/><category scheme='http://www.blogger.com/atom/ns#' term='pylons'/><category scheme='http://www.blogger.com/atom/ns#' term='paste'/><category scheme='http://www.blogger.com/atom/ns#' term='google app engine'/><title type='text'>Pylons on Google App Engine</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br /&gt;&lt;a href='http://blog.ianbicking.org/2008/04/13/app-engine-and-pylons/'&gt;Ian Bicking: a blog :: App Engine and Pylons&lt;/a&gt;&lt;br /&gt;&lt;a href='http://code.google.com/p/appengine-monkey/wiki/Pylons'&gt;Pylons - appengine-monkey - Google Code&lt;/a&gt; &lt;br /&gt; &lt;blockquote&gt;How to get Pylons working on appengine &lt;/blockquote&gt;&lt;br /&gt;巷で話題のGoogle App Engine 上で、Pylonsを使う方法がまとめられています。&lt;br /&gt;lxmlを動かすには時間がかかるそうで。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-7356370555872319057?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/7356370555872319057/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=7356370555872319057' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/7356370555872319057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/7356370555872319057'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/04/pylons-on-google-app-engine.html' title='Pylons on Google App Engine'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-727246797852346426</id><published>2008-04-09T11:15:00.001+09:00</published><updated>2008-04-09T11:15:46.744+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wsgi'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Google App Engine の webapp Framework ってwsgi準拠なのだね</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br /&gt;&lt;a href='http://code.google.com/appengine/docs/webapp/'&gt;The webapp Framework - Google App Engine - Google Code&lt;/a&gt; &lt;br /&gt; &lt;blockquote&gt;The webapp Framework&lt;br /&gt;&lt;br /&gt;The webapp framework is a simple WSGI-compatible web application framework you can use with App Engine. You do not need to use webapp to use App Engine: The web server supports any Python application that uses CGI. webapp provides an easy way to get started developing apps for App Engine.&lt;/blockquote&gt;&lt;br /&gt;アカウント待ちなので、とりあえずドキュメントを見ると、WSGIの文字が。&lt;br /&gt;webapp萌え:-)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-727246797852346426?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/727246797852346426/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=727246797852346426' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/727246797852346426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/727246797852346426'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/04/google-app-engine-webapp-framework-wsgi.html' title='Google App Engine の webapp Framework ってwsgi準拠なのだね'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-2942222715520595471</id><published>2008-04-09T08:20:00.001+09:00</published><updated>2008-04-09T08:20:08.900+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Google App Engine</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br/&gt;&lt;a href='http://jp.techcrunch.com/archives/20080407google-jumps-head-first-into-web-services-with-google-app-engine/'&gt;TechCrunch Japanese アーカイブ » Google、ウェブサービスに参入―「Google App Engine」で一挙に急発進&lt;/a&gt;&lt;br /&gt;とりあえず、今Bigtableを使うには、Pythonしかないらしい。&lt;br /&gt;週末の予定は決まったな。:-)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-2942222715520595471?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/2942222715520595471/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=2942222715520595471' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/2942222715520595471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/2942222715520595471'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/04/google-app-engine.html' title='Google App Engine'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-9009064960439107189</id><published>2008-04-01T08:20:00.002+09:00</published><updated>2008-04-01T08:21:40.053+09:00</updated><title type='text'>MicroApps</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;UNIX的な哲学を感じる。&lt;br /&gt;小さくて切れ味鋭いアプリケーションを組み合わせる感じ？&lt;br /&gt;グルーにはなにが適してるだろう。ブラウザ上では、JSしかないんだろうけどさ。&lt;br /&gt;&lt;a href="http://microapps.org/"&gt;MicroApps - Microapps.org&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;MicroApps are small REST applications that are designed from the ground up to be integrated with other applications. Usually, they are not directly useful on their own, but must be integrated into other applications (this is what differentiates a MicroApp from a regular REST application).&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-9009064960439107189?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/9009064960439107189/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=9009064960439107189' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/9009064960439107189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/9009064960439107189'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/04/microapps.html' title='MicroApps'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-7862445852234801682</id><published>2008-03-22T08:46:00.001+09:00</published><updated>2008-03-22T08:48:29.868+09:00</updated><title type='text'>リダイレクトされるはずだけど</title><content type='html'>せっかく手に入れたので、とりあえず&lt;a href="http://blog.aodag.jp"&gt;http://blog.aodag.jp&lt;/a&gt; をbloggerのカスタムドメインで設定しました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-7862445852234801682?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/7862445852234801682/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=7862445852234801682' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/7862445852234801682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/7862445852234801682'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/03/blog-post_22.html' title='リダイレクトされるはずだけど'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-4487228458229503771</id><published>2008-03-11T12:52:00.001+09:00</published><updated>2008-03-11T12:52:10.144+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>あーもう、欲しくてたまらなくなる</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br /&gt;&lt;a href='http://japanese.engadget.com/2008/03/10/macbook-air-tsa-story/'&gt;MacBook Air、薄すぎて空港で足止め - Engadget Japanese&lt;/a&gt; &lt;br /&gt; &lt;blockquote&gt;Macとは思えない薄さが話題となっているMacBook Airですが、Michael Nygard氏はAirのおかげで空港の手荷物検査を通れず飛行機を乗り逃したようです。といっても厚さ4mmのエッジ部分が鋭利な武器とみなされたわけではなく、デザインが斬新すぎて保安職員にノートだと信じてもらえなかったため。&lt;/blockquote&gt;&lt;br /&gt;ところで、開いて起動すればノートだと分かると思うのだが。&lt;br /&gt;偽装と疑われてしまうのかな。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-4487228458229503771?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/4487228458229503771/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=4487228458229503771' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4487228458229503771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4487228458229503771'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/03/blog-post_11.html' title='あーもう、欲しくてたまらなくなる'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-1215986471674475350</id><published>2008-03-11T01:58:00.001+09:00</published><updated>2008-03-11T01:58:30.748+09:00</updated><title type='text'>PyDevCamp中に作ったもの</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br /&gt;&lt;a href='http://d.hatena.ne.jp/a2c/20080309/p1'&gt;PyDevCamp08w まとめ（無事帰宅） - a2c.get.diary&lt;/a&gt; &lt;br /&gt; &lt;blockquote&gt;    * 小田切ーダー出来ていた！&lt;br /&gt;&lt;br /&gt;飲み会で、RSSやらAtomの話になった。全文配信がいいよねとか、ブログのコメントよりはてぶのコメントが多いよねとか話していた時に、それらをマッシュアップすると使えるかもねぇと言っていたら、小田切さんがそれ作りたいかもって、忘れないようにメモってた。そのサービスが、翌日には完成していた。JavaScriptとGoogle使ってるぽい、その名も『オダギリーダー（OGR）」（勝手に命名）はさくさくで、ホッテントリのエントリーとそのハテブコメントがLDRの様にさくさくと見られる素敵なリーダーです。公開希望です。よろしくです。&lt;/blockquote&gt;&lt;br /&gt;Pythonの合宿に参加していたにもかかわらず、Javascriptをいじってました。&lt;br /&gt;本当は、Universal Feed Parser を使うつもりで、あくまでプロトタイプとして、Ajax Feed APIを使っていたのだが....&lt;br /&gt;まあ、でもとりあえず公開。&lt;br /&gt;見た目は気にするな:-)&lt;br /&gt;フィード情報をGoogle GearsのSqliteの保存しているので、Safariの人とかごめんなさい。&lt;br /&gt;フィードの内容は、Google Ajax Feed API 、コメントははてぶAPIを使ってるので、どっちかが調子悪いと使えません。&lt;br /&gt;サーバー側では特に情報を保存するわけでもないし、好きに使ってください。&lt;br /&gt;&lt;a href='http://aodagx.ddo.jp/aodag/odr/'&gt;ODR&lt;/a&gt;&lt;br /&gt;よく見たら、OGRって命名されてる。orz&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-1215986471674475350?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/1215986471674475350/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=1215986471674475350' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/1215986471674475350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/1215986471674475350'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/03/pydevcamp.html' title='PyDevCamp中に作ったもの'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-1292089382653039472</id><published>2008-03-09T18:45:00.002+09:00</published><updated>2008-03-09T20:26:13.839+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pylons'/><title type='text'>Pylons-jaが発足したようです。</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br /&gt;&lt;a href='http://groups.google.co.jp/group/pylons-ja'&gt;Pylons-ja | Google グループ&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;このたび、 「Pylons Developers Camp 2008 冬」 において、名古屋の小田切さんと&lt;br /&gt;Pylons のセッションをやらせていただいたのですが、Pylons に対する注目が&lt;br /&gt;高まっているのを強く感じました。&lt;br /&gt;&lt;br /&gt;そこで早速、この熱が冷めないうちに・・・ ということでPylons-ja のMLを作成いたしました。&lt;br /&gt;http://groups.google.co.jp/group/pylons-ja&lt;br /&gt;&lt;br /&gt;Pylons やWSGI に関わりのある方、ご興味のある方、ぜひ参加していただければと思います。&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;ということで、興味がある人はLet's GO!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-1292089382653039472?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/1292089382653039472/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=1292089382653039472' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/1292089382653039472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/1292089382653039472'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/03/pylons-ja.html' title='Pylons-jaが発足したようです。'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-4376415070305319471</id><published>2008-03-08T19:22:00.001+09:00</published><updated>2008-03-08T19:22:10.708+09:00</updated><title type='text'>ウィスキー！</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt; &lt;a href="http://www.flickr.com/photos/aodag/2317656727/" title="photo sharing"&gt;&lt;img src="http://farm4.static.flickr.com/3183/2317656727_73171208c0_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt; &lt;br /&gt; &lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;  &lt;a href="http://www.flickr.com/photos/aodag/2317656727/"&gt;CIMG0089&lt;/a&gt;  &lt;br /&gt;  Originally uploaded by &lt;a href="http://www.flickr.com/people/aodag/"&gt;aodagxx&lt;/a&gt; &lt;/span&gt;&lt;/div&gt;多くは語らない&lt;br clear="all" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-4376415070305319471?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/4376415070305319471/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=4376415070305319471' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4376415070305319471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4376415070305319471'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/03/blog-post.html' title='ウィスキー！'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3183/2317656727_73171208c0_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-7001556683225958903</id><published>2008-03-08T10:58:00.001+09:00</published><updated>2008-03-08T10:58:36.516+09:00</updated><title type='text'>Python Developer Camp 2008 Winter</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt; &lt;a href="http://www.flickr.com/photos/aodag/2317878938/" title="photo sharing"&gt;&lt;img src="http://farm3.static.flickr.com/2198/2317878938_f94eee39c7_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt; &lt;br /&gt; &lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;  &lt;a href="http://www.flickr.com/photos/aodag/2317878938/"&gt;CIMG0075&lt;/a&gt;  &lt;br /&gt;  Originally uploaded by &lt;a href="http://www.flickr.com/people/aodag/"&gt;aodagxx&lt;/a&gt; &lt;/span&gt;&lt;/div&gt;参加中です。&lt;br clear="all" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-7001556683225958903?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/7001556683225958903/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=7001556683225958903' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/7001556683225958903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/7001556683225958903'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/03/python-developer-camp-2008-winter.html' title='Python Developer Camp 2008 Winter'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2198/2317878938_f94eee39c7_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-6041839931890754284</id><published>2008-03-06T15:22:00.001+09:00</published><updated>2008-03-06T15:22:58.934+09:00</updated><title type='text'>オートペディア（Auto☆pedia）</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;A HREF='http://crocro.com/auto_pedia/nm_fms/aodag'&gt;aodag - 全自動百科事典『オートペディア（Auto☆pedia）』&lt;/A&gt;&lt;br /&gt;ランチとの関連はどこから？&lt;br /&gt;まあ、ロゴはちゃんと拾ってるようなのでよしとしよう。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-6041839931890754284?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/6041839931890754284/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=6041839931890754284' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6041839931890754284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6041839931890754284'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/03/autopedia.html' title='オートペディア（Auto☆pedia）'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-2815155914301748292</id><published>2008-03-05T07:26:00.002+09:00</published><updated>2008-03-05T07:28:00.285+09:00</updated><title type='text'>Netvibesがパワーアップ</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;スタートページの老舗Netvibesの次期バージョンgingerのアップグレード通知がきました。&lt;br /&gt;&lt;a href='http://blog.netvibes.com/?2008/03/04/158-ginger-is-now-open-to-any-registred-user'&gt;ginger is now open to any registered user ! - Netvibes.com Blog&lt;/a&gt; &lt;br /&gt; &lt;blockquote&gt;Here it is, Netvibes ginger is now open to any netvibes registered user.&lt;/blockquote&gt;&lt;br /&gt;とりあえずアップグレード申請をしました。利用可能になったら、またメールで連絡してくれるそうです。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Archive a widget&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Share a widget&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Widgetの状態を保存したり、共有したりできるらしい。&lt;br /&gt;あと、それぞれのタブの内容を一覧できるのかな。&lt;br /&gt;Open Social対応ってどうなってるんだろう。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-2815155914301748292?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/2815155914301748292/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=2815155914301748292' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/2815155914301748292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/2815155914301748292'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/03/netvibes.html' title='Netvibesがパワーアップ'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-6809204396467517501</id><published>2008-03-05T06:40:00.001+09:00</published><updated>2008-03-05T06:40:04.841+09:00</updated><title type='text'>eeePC はよいPC?</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;ノートPCではないって言ってるようだが、なんで名前にPCってつけるんだぜ？&lt;br /&gt;確かに個人用のコンピュータだけどさ。&lt;br /&gt;どっちにしろ、結構欲しい部類だったけど、あの画面の大きさに躊躇してたら在庫がまるでなくって、べ、べつに絶対欲しいってわけじゃないんだからっと自分をごまかそうとしてたが、次期モデルの出荷見込みがでてきましたよ。&lt;br /&gt;&lt;br /&gt;&lt;a href='http://japanese.engadget.com/2008/03/04/asus-eee-pc-9/'&gt;ギャラリー： Asus Eee PC 9インチ版 (稼働中) - Engadget Japanese&lt;/a&gt;&lt;br /&gt;9インチとなれば、かなり欲しいな。&lt;br /&gt;SDDも12GBと、今の4GBに比べたら遥かに普通なスペック？&lt;br /&gt;日本語版はいついくらで提供されるのか！？&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-6809204396467517501?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/6809204396467517501/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=6809204396467517501' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6809204396467517501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6809204396467517501'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/03/eeepc-pc.html' title='eeePC はよいPC?'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-414793385918833117</id><published>2008-03-01T00:18:00.002+09:00</published><updated>2008-03-01T00:25:10.594+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wcan'/><title type='text'>WCAN2008Spring</title><content type='html'>在籍している会社が協賛している手前、ちゃんと紹介してみるよ。&lt;br /&gt;&lt;a href="http://www.wcan.jp/index.php?ID=155"&gt;&lt;br /&gt;&lt;img src="http://www.wcan.jp/images/wcan2008spring.gif" width="140" height="140" alt="WCAN 2008 SPRING"&gt;&lt;/a&gt; &lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;WCAN ( Web Creators Association Nagoya ) は、名古屋を中心としたエリアでWEB制作に携わっている人、WEBに興味のある人のグループです。&lt;br /&gt;&lt;a href="http://www.wcan.jp/index.php"&gt;WCAN [ Web Creators Association Nagoya ]&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;WCAN 2008 SPRING は、Mozilla Japan との協賛。&lt;br /&gt;リリース間近のFirefox3のお話を聞けるとのこと。&lt;br /&gt;参加する人、声かけてね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-414793385918833117?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/414793385918833117/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=414793385918833117' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/414793385918833117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/414793385918833117'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/03/wcan2008spring.html' title='WCAN2008Spring'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-2978450329826823090</id><published>2008-02-28T23:15:00.004+09:00</published><updated>2008-02-28T23:46:35.432+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wsgi'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='formencode'/><title type='text'>formencode.htmlfill</title><content type='html'>ユーザー入力をチェックしたら、フォームを復元することはよくある話で、エラーメッセージとかも出さないといけないよねと。&lt;br /&gt;Pylonsを含むWSGI派の入力チェックといえば、formencode。&lt;br /&gt;チェックするだけじゃなくて、フォームへの値入れやエラーメッセージ表示に便利なhtmlfillがついている。&lt;br /&gt;htmlに対して適用するから、どんなテンプレートでもOK。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;import os&lt;br /&gt;import webob&lt;br /&gt;import tempita&lt;br /&gt;import selector&lt;br /&gt;import formencode&lt;br /&gt;from formencode import validators&lt;br /&gt;from formencode import htmlfill&lt;br /&gt;&lt;br /&gt;paths = tempita.bunch()&lt;br /&gt;paths.root = os.path.dirname(__file__)&lt;br /&gt;paths.templates = os.path.join(paths.root, 'templates')&lt;br /&gt;&lt;br /&gt;class PersonSchema(formencode.Schema):&lt;br /&gt;   name = validators.UnicodeString(not_empty=True)&lt;br /&gt;   email = validators.Email(not_empty=True)&lt;br /&gt;   blog = validators.URL(not_empty=True)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def form(environ, start_response):&lt;br /&gt;   request = webob.Request(environ)&lt;br /&gt;   response = webob.Response(request=request, content_type="text/html", charset="utf-8")&lt;br /&gt;   tmpl = tempita.HTMLTemplate.from_filename(os.path.join(paths.templates, 'form.html'))&lt;br /&gt;   response.body = tmpl.substitute()&lt;br /&gt;   return response(environ, start_response)&lt;br /&gt;&lt;br /&gt;def submit(environ, start_response):&lt;br /&gt;   request = webob.Request(environ)&lt;br /&gt;   response = webob.Response(request=request, content_type="text/html", charset="utf-8")&lt;br /&gt;   schema = PersonSchema()&lt;br /&gt;   try:&lt;br /&gt;       params = schema.to_python(request.params)&lt;br /&gt;   except formencode.Invalid, e:&lt;br /&gt;       errors = e.error_dict&lt;br /&gt;       tmpl = tempita.HTMLTemplate.from_filename(os.path.join(paths.templates, 'form.html'))&lt;br /&gt;       response.body = htmlfill.render(tmpl.substitute(), defaults=request.params, errors=errors)&lt;br /&gt;   else:&lt;br /&gt;       tmpl = tempita.HTMLTemplate.from_filename(os.path.join(paths.templates, 'person.html'))&lt;br /&gt;       response.body = tmpl.substitute(params=params)&lt;br /&gt;   return response(environ, start_response)&lt;br /&gt;&lt;br /&gt;application = selector.Selector()&lt;br /&gt;application.add("/", GET=form, POST=submit)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;form.htmlはこちら。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;html&gt;&lt;br /&gt;&amp;lt;body&gt;&lt;br /&gt;&amp;lt;form method="post"&gt;&lt;br /&gt;&amp;lt;ul&gt;&lt;br /&gt;&amp;lt;li&gt;&amp;lt;label for="person-name"&gt;Name:&amp;lt;/label&gt;&lt;br /&gt; &amp;lt;input id="person-name" type="text" name="name"&gt;&lt;br /&gt;&amp;lt;li&gt;&amp;lt;label for="person-email"&gt;Email:&amp;lt;/label&gt;&lt;br /&gt; &amp;lt;input id="person-email" type="text" name="email"&gt;&lt;br /&gt;&amp;lt;li&gt;&amp;lt;label for="person-blog"&gt;Blog:&amp;lt;/label&gt;&lt;br /&gt; &amp;lt;input id="person-blog" type="text" name="blog"&gt;&lt;br /&gt;&amp;lt;/ul&gt;&lt;br /&gt;&amp;lt;button type="submit"&gt;Save&amp;lt;/button&gt;&lt;br /&gt;&amp;lt;/form&gt;&lt;br /&gt;&amp;lt;/body&gt;&lt;br /&gt;&amp;lt;/html&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;form:error というタグを使えば出力位置を調節できる。&lt;br /&gt;対応するform:error がなければ、inputタグの直後にエラーメッセージを表示。&lt;br /&gt;checkboxはboolだけ対応のようだ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-2978450329826823090?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/2978450329826823090/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=2978450329826823090' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/2978450329826823090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/2978450329826823090'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/02/formencodehtmlfill.html' title='formencode.htmlfill'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-5780818579965384595</id><published>2008-02-28T23:07:00.001+09:00</published><updated>2008-02-28T23:07:44.173+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openid'/><title type='text'>OpanIDファウンデーション・ジャパン設立へ</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br /&gt;&lt;a href='http://opentechpress.jp/opensource/article.pl?sid=08/02/28/103215&amp;amp;from=rss'&gt;Open Tech Press | OpanIDファウンデーション・ジャパン設立へ&lt;/a&gt; &lt;br /&gt; &lt;blockquote&gt;シックス・アパート（本社：東京都港区）、日本ベリサイン（本社：東京都中央区）、野村総合研究所（本社：東京都千代田区）の3社は2008年02月28日、OpenID技術の国内での普及を推進する業界団体「OpenIDファウンデーション・ジャパン（仮称）」を4月に設立すると発表した。&lt;/blockquote&gt;&lt;br /&gt;ID自体は既に行き渡っているはず。&lt;br /&gt;OpenSocial, Facebook, OpenID と潜在的なユーザーが多くいる領域にどうやって乗り込んでいこう。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-5780818579965384595?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/5780818579965384595/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=5780818579965384595' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5780818579965384595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5780818579965384595'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/02/opanid.html' title='OpanIDファウンデーション・ジャパン設立へ'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-82986587600740022</id><published>2008-02-25T02:34:00.001+09:00</published><updated>2008-02-25T02:34:32.490+09:00</updated><title type='text'>Mac再インストール</title><content type='html'>&lt;p&gt;まあ、いまだにTigerなわけですが。&lt;/p&gt;&lt;br /&gt;&lt;p style="color:#008;text-align:right;"&gt;&lt;small&gt;&lt;em&gt;Powered by&lt;/em&gt; &lt;a href="http://www.qumana.com/"&gt;Qumana&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-82986587600740022?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/82986587600740022/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=82986587600740022' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/82986587600740022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/82986587600740022'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/02/mac.html' title='Mac再インストール'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-6270798117569268183</id><published>2008-02-24T02:04:00.001+09:00</published><updated>2008-02-24T02:04:45.767+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>RuleDispatch</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;&lt;br /&gt;名前だけは知っていたけど、いまいち情報が少なくてどんなものか分からなかったRuleDispatch。&lt;br /&gt;developerWorksに解説記事があったのでメモ。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;a href='http://www.ibm.com/developerworks/library/l-cppeak2/'&gt;Charming Python: Scaling a new PEAK&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;呼び出し時の引数パターンで、複数の実装に振り分けるもののようです。&lt;br /&gt;引数の型で振り分けるだけなら、JavaとかC++のオーバーロードがあるけど、HaskellやOCamlよりのパターンマッチングができる。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;ジェネリックファンクションの例&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;import dispatch&lt;br /&gt;@dispatch.generic()&lt;br /&gt;def doIt(foo, other):&lt;br /&gt;    "Base generic function of 'doIt()'"&lt;br /&gt;@doIt.when("isinstance(foo,int) and isinstance(other,str)")&lt;br /&gt;def doIt(foo, other):&lt;br /&gt;    print "foo is an unrestricted int |", foo, other&lt;br /&gt;@doIt.when("isinstance(foo,str) and isinstance(other,int)")&lt;br /&gt;def doIt(foo, other):&lt;br /&gt;    print "foo is str, other an int |", foo, other&lt;br /&gt;@doIt.when("isinstance(foo,int) and 3&amp;amp;lt;=foo&amp;amp;lt;=17 and isinstance(other,str)")&lt;br /&gt;def doIt(foo, other):&lt;br /&gt;    print "foo is between 3 and 17 |", foo, other&lt;br /&gt;@doIt.when("isinstance(foo,int) and 0&amp;amp;lt;=foo&amp;amp;lt;=1000 and isinstance(other,str)")&lt;br /&gt;def doIt(foo, other):&lt;br /&gt;    print "foo is between 0 and 1000 |", foo, other&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;ルール部分に、条件式まで書けてしまうのですねい＼(^o^)/&lt;br /&gt;条件式が文字列というのは気分的につらいのだけど、&lt;br /&gt;Python3000では、引数に注釈(Pythonオブジェクトならなんでもいいらしい)をつけられるとのことで、もっとスマートに書けるのを期待。&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-6270798117569268183?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/6270798117569268183/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=6270798117569268183' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6270798117569268183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6270798117569268183'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/02/ruledispatch.html' title='RuleDispatch'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-5898183102223373187</id><published>2008-02-15T00:30:00.001+09:00</published><updated>2008-02-15T00:30:22.643+09:00</updated><title type='text'>MURAMASA</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt; &lt;a href="http://www.flickr.com/photos/aodag/2265251814/" title="photo sharing"&gt;&lt;img src="http://farm3.static.flickr.com/2224/2265251814_4225aeb59c_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt; &lt;br /&gt; &lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;  &lt;a href="http://www.flickr.com/photos/aodag/2265251814/"&gt;CIMG0032&lt;/a&gt;  &lt;br /&gt;  Originally uploaded by &lt;a href="http://www.flickr.com/people/aodag/"&gt;aodagxx&lt;/a&gt; &lt;/span&gt;&lt;/div&gt;eeePCとかMacbook AIRとか小さいPC欲しいなーと社内で考えていたら、往年の名機MURAMASAを持っている人がいましたよ。&lt;br /&gt;いいねぇ、これの後継機があれば本当に欲しいのだけど。&lt;br clear="all" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-5898183102223373187?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/5898183102223373187/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=5898183102223373187' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5898183102223373187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5898183102223373187'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/02/muramasa.html' title='MURAMASA'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2224/2265251814_4225aeb59c_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-5535030232509918437</id><published>2008-02-12T05:06:00.000+09:00</published><updated>2008-02-12T05:20:04.423+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openid'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>python-openidで、simple registration</title><content type='html'>&lt;p&gt;&lt;br /&gt;openidで登録してあるプロフィールを取得できるという話。&lt;br /&gt;2.0から？extensionがあって、simple registrationというextensionが既に存在します。&lt;br /&gt;詳しいことは、参考にて。&lt;br /&gt;openidで新しいサービスを使い始めるときに、openidのプロフィールを使っちゃうってことですな。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;さて、python-openidでは、どうやるか。&lt;br /&gt;AuthRequestに、addExtensionArgというそのままのメソッドがあるから、それを使えばいいみたい。&lt;br /&gt;addExtensionっていうのもあるけど、渡すべきインターフェイスの定義がどうなるのか良く分からなかった。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;以下のコードで、渡してるのは、2つ。&lt;br /&gt;nsはextensionの名前空間。&lt;br /&gt;simple registrationはsregという名前空間を使う。&lt;br /&gt;required は取得したい項目。&lt;br /&gt;とりあえずemailを取得するようにしてみた。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;    c = consumer.Consumer(openidsession, filestore)&lt;br /&gt;    req = c.begin(request.params['passurl'])&lt;br /&gt;    req.addExtensionArg('sreg', 'ns', 'http://openid.net/extensions/sreg/1.1')&lt;br /&gt;    req.addExtensionArg('sreg', 'required', 'email')&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;で、取得する方法。&lt;br /&gt;AuthResponseに、getSignedNSがあってこれを使うとdict形式で、プロフィールを取得できる。&lt;br /&gt;あとgetSignedで、キーまで指定して取得もできる模様。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;    res = c.complete(request.GET, return_to)&lt;br /&gt;    if res.status == 'success':&lt;br /&gt;        response.body = "passuri:%s, %s" % (res.identity_url, res.getSignedNS('sreg'))&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;僕が実際に試したときは、emailと登録してあったからすんなり取得できたんだけど、未登録の場合はどうするんだろう。&lt;br /&gt;responseにsetupってのがあるけど、これが使われるのかな。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;APMLなんかは、こうした方法がぴったりだと思うんだけど。&lt;br /&gt;もう、検討されてるのだろうか。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;参考&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/ZIGOROu/20071207/1197018550"&gt;&lt;br /&gt; Simple Registration ExtensionとAttribute Exchangeの違いについて&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://openid.net/specs/openid-simple-registration-extension-1_1-01.html"&gt;OpenID Simple Registration Extension 1.1 - Draft 1&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-5535030232509918437?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/5535030232509918437/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=5535030232509918437' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5535030232509918437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5535030232509918437'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/02/python-openidsimple-registration.html' title='python-openidで、simple registration'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-8757494904018727850</id><published>2008-02-12T04:01:00.000+09:00</published><updated>2008-02-12T04:16:06.123+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openid'/><category scheme='http://www.blogger.com/atom/ns#' term='wsgi'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>python-openidを直接使ってopenid認証の流れを確認</title><content type='html'>&lt;p&gt;&lt;br /&gt;python-openidを直接使ってOpenID認証の流れを確認してみた。&lt;br /&gt;URLとか直接書いちゃってて適当なプログラムだけど、とりあえず認証したURLを取得して表示するまで。&lt;br /&gt;greetingとか、sampleappはpaste_deployのテンプレートに入ってるやつが残ってるだけなので、意味はないです。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;signin が認証フォーム&lt;br /&gt;submitSignin でopenidのconsumerモジュールを使って、認証サーバーにリダイレクトすると同時に、認証セッションを作成。&lt;br /&gt;認証後verifyに戻ってくるので、認証セッションを終了させて、結果を取得する。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;privateを保護するようなサンプルを考えていたんだけど、まだやってない。&lt;br /&gt;passurlをセッションに置いてとか、middleware書くのもだるいので、とりあえずこんなとこ。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;OpenID2.0では、Attribute ExchangeとかAssosciationとかあるようなので、もうちょっと調べないとな。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;wsgiapp.py&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import sampleapp&lt;br /&gt;from paste.deploy.config import ConfigMiddleware&lt;br /&gt;import selector&lt;br /&gt;import webob&lt;br /&gt;import tempita&lt;br /&gt;import os&lt;br /&gt;import formencode&lt;br /&gt;from formencode import validators&lt;br /&gt;from openid.consumer import consumer&lt;br /&gt;&lt;br /&gt;path = tempita.bunch()&lt;br /&gt;path.root = os.path.dirname(__file__)&lt;br /&gt;path.templates = os.path.join(path.root, 'templates')&lt;br /&gt;&lt;br /&gt;class PassurlSchema(formencode.Schema):&lt;br /&gt;   passurl = validators.String(not_empty=True)&lt;br /&gt;&lt;br /&gt;def signin(environ, start_response):&lt;br /&gt;   request = webob.Request(environ)&lt;br /&gt;   response = webob.Response(request=request)&lt;br /&gt;   tmpl = tempita.HTMLTemplate.from_filename(os.path.join(path.templates, 'signin.html'))&lt;br /&gt;   response.body = tmpl.substitute()&lt;br /&gt;   return response(environ, start_response)&lt;br /&gt;  &lt;br /&gt;from openid.store.filestore import FileOpenIDStore&lt;br /&gt;filestore = FileOpenIDStore(os.path.join(path.root, 'store'))&lt;br /&gt;realm = 'http://localhost:8080/'&lt;br /&gt;return_to = 'http://localhost:8080/verify'&lt;br /&gt;&lt;br /&gt;def submitSiginin(environ, start_response):&lt;br /&gt;   request = webob.Request(environ)&lt;br /&gt;   response = webob.Response(request=request)&lt;br /&gt;   try:&lt;br /&gt;       schema = PassurlSchema()&lt;br /&gt;       params = schema.to_python(request.params)&lt;br /&gt;   except formencode.Invalid, e:&lt;br /&gt;       tmpl = tempita.HTMLTemplate.from_filename(os.path.join(path.templates, 'signin.html'))&lt;br /&gt;       response.body = tmpl.substitute()&lt;br /&gt;       return response(environ, start_response)&lt;br /&gt;   openidsession = dict()&lt;br /&gt;  &lt;br /&gt;   c = consumer.Consumer(openidsession, filestore)&lt;br /&gt;   req = c.begin(request.params['passurl'])&lt;br /&gt;   print req&lt;br /&gt;   url = req.redirectURL(realm, return_to=return_to)&lt;br /&gt;   response.location = url&lt;br /&gt;   response.status = 301&lt;br /&gt;   session = environ['beaker.session']&lt;br /&gt;   session['openid.consumer'] = c&lt;br /&gt;   session.save()&lt;br /&gt;   return response(environ, start_response)&lt;br /&gt;&lt;br /&gt;def verify(environ, start_response):&lt;br /&gt;   request = webob.Request(environ)&lt;br /&gt;   response = webob.Response(request=request)&lt;br /&gt;&lt;br /&gt;   session = environ['beaker.session']&lt;br /&gt;   c = session['openid.consumer']&lt;br /&gt;   res = c.complete(request.GET, return_to)&lt;br /&gt;   if res.status == 'success':&lt;br /&gt;       response.body = res.identity_url&lt;br /&gt;   else:&lt;br /&gt;       response.body = "%s" % res&lt;br /&gt;   return response(environ, start_response)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def private(environ, start_response):&lt;br /&gt;   request = webob.Request(environ)&lt;br /&gt;   response = webob.Response(request=request)&lt;br /&gt;   response.body = "This page is private."&lt;br /&gt;   return response(environ, start_response)&lt;br /&gt;&lt;br /&gt;def make_app(&lt;br /&gt;   global_conf,&lt;br /&gt;   # Optional and required configuration parameters&lt;br /&gt;   # can go here, or just **kw; greeting is required:&lt;br /&gt;   greeting,&lt;br /&gt;   **kw):&lt;br /&gt;   # This is a WSGI application:&lt;br /&gt;   app = selector.Selector()&lt;br /&gt;   app.add('/', GET=sampleapp.application)&lt;br /&gt;   app.add('/signin', GET=signin, POST=submitSiginin)&lt;br /&gt;   app.add('/private', GET=private)&lt;br /&gt;   app.add('/verify', GET=verify)&lt;br /&gt;   # Here we merge all the keys into one configuration&lt;br /&gt;   # dictionary; you don't have to do this, but this&lt;br /&gt;   # can be convenient later to add ad hoc configuration:&lt;br /&gt;   conf = global_conf.copy()&lt;br /&gt;   conf.update(kw)&lt;br /&gt;   conf['greeting'] = greeting&lt;br /&gt;&lt;br /&gt;   from beaker.middleware import SessionMiddleware&lt;br /&gt;   app = SessionMiddleware(app, key='mysession', secret='randomsecret')&lt;br /&gt;   # ConfigMiddleware means that paste.deploy.CONFIG will,&lt;br /&gt;   # during this request (threadsafe) represent the&lt;br /&gt;   # configuration dictionary we set up:&lt;br /&gt;   app = ConfigMiddleware(app, conf)&lt;br /&gt;   return app&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;templates/signin.html&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;html&gt;&lt;br /&gt;  &amp;lt;body&gt;&lt;br /&gt;    &amp;lt;form action="" method="post"&gt;&lt;br /&gt;      &amp;lt;label for="passurl"&gt;Passurl&amp;lt;/label&gt;&lt;br /&gt;      &amp;lt;input id="passurl" type="text" name="passurl"/&gt;&lt;br /&gt;      &amp;lt;button type="submit"&gt;Signin&amp;lt;/button&gt;&lt;br /&gt;    &amp;lt;/form&gt;&lt;br /&gt;  &amp;lt;/body&gt;&lt;br /&gt;&amp;lt;/html&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;そういえば、AuthKitの次期バージョン(0.4.1かな)はpython-openidの2.0系つまりopenid2.0を使うみたいだ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-8757494904018727850?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/8757494904018727850/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=8757494904018727850' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/8757494904018727850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/8757494904018727850'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/02/python-openidopenid.html' title='python-openidを直接使ってopenid認証の流れを確認'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-926438125844856174</id><published>2008-02-11T19:10:00.001+09:00</published><updated>2008-02-11T19:10:54.738+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wsgi'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Werkzeug</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br /&gt;&lt;a href='http://werkzeug.pocoo.org/'&gt;Welcome // Werkzeug&lt;/a&gt; &lt;br /&gt; &lt;blockquote&gt;Werkzeug started as simple collection of various utilities for WSGI applications and has become one of the most advanced WSGI utility modules. It includes a powerful debugger, full featured request and response objects, HTTP utilities to handle entity tags, cache control headers, HTTP dates, cookie handling, file uploads, a powerful URL routing system and a bunch of community contributed addon modules.&lt;/blockquote&gt;&lt;br /&gt;データアクセスはSQLAlchemy、テンプレートはJinjaらしい。&lt;br /&gt;後で調べる。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-926438125844856174?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/926438125844856174/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=926438125844856174' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/926438125844856174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/926438125844856174'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/02/werkzeug.html' title='Werkzeug'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-5210020556638965122</id><published>2008-02-10T19:31:00.001+09:00</published><updated>2008-02-10T19:39:47.373+09:00</updated><title type='text'>たまには食べ物な話</title><content type='html'>eeePCの実物を見にソフマップに行った帰りに食べたのですよ。&lt;br /&gt;&lt;a href="http://picasaweb.google.com/aodagx/AodagBlog/photo?authkey=DdDOBfq8D9Y#5165296890710589346"&gt;&lt;img src="http://lh5.google.com/aodagx/R67SJ7o7_6I/AAAAAAAAAHA/7pIUEiK-UAY/s144/CIMG0026.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;名駅地下の函館塩ラーメンです。&lt;br /&gt;魚系？のダシなのでしょうか。上品な感じの味でした。&lt;br /&gt;おいしいのだけど、細麺だったこともあって、ちょっと物足りなかった気もする。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-5210020556638965122?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/5210020556638965122/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=5210020556638965122' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5210020556638965122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5210020556638965122'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/02/blog-post_10.html' title='たまには食べ物な話'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-1009350961318601969</id><published>2008-02-10T00:06:00.000+09:00</published><updated>2008-02-10T00:34:52.759+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zoho'/><category scheme='http://www.blogger.com/atom/ns#' term='api'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>zoho creator いじってみた</title><content type='html'>&lt;a href="http://creator.zoho.com/home.do"&gt;Zoho Creator&lt;/a&gt; をいじってみる。&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Web上で使えるAccessのようなもの？&lt;br /&gt;まあ、それだけだったらなんの興味も引かないのだけど、これにはREST APIやJavascript の Client API がついている。&lt;br /&gt;へぇー。これはなかなかいいんじゃないすか？ということで、少し触ってみた。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;フォームを作ると、それに対応したテーブルができる。&lt;br /&gt;あと、一覧表示と検索も自動でできる。&lt;br /&gt;まあ、まだ1テーブルでしか試してないので、複数のテーブルが結合できるのかは未確認。&lt;br /&gt;ファイルアップロードや画像リンクなども用意されていて、簡単なフォーム作成には十分なパーツがそろっている。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;さて、本題？のClient API っす。&lt;br /&gt;えーと、とりあえずAPI KEY とTicket が必要なのだけど、どこでもらえるのよ？&lt;br /&gt;と、ドキュメントを探すと、なんか here って単語にリンクされてる...&lt;br /&gt;取得したAPI KEY を使って、&lt;span style="font-weight: bold;"&gt;自分で&lt;/span&gt;URLを作ってTicketを発行してもらうのだけど、このURLには通常使っているアカウントのパスワードが含まれる。&lt;br /&gt;それ以前に、自分でURL編集してアドレスバーにコピペするってのが、正式な手順なのだろうか。&lt;br /&gt;作業中に激しく不安になりましたが、Ticketを発行して、その他の必要な情報を探します。&lt;br /&gt;他に欲しいのは、アプリケーション名、フォーム名、ビュー名、フィールド名など。&lt;br /&gt;ビュー名は、デフォルトで生成された名前にスペースが入ってる。&lt;br /&gt;どーすればいいの？どーすればいいの？&lt;br /&gt;と、発狂しそうだったが、とりあえずそのままスペースで試してみる。&lt;br /&gt;だめですorz。&lt;br /&gt;サンプルを見ると、"_"が入ってるのがあって、ひょっとして？と思いスペースを"_"に変えて試してみる。&lt;br /&gt;やったよママン！&lt;br /&gt;えー、これドキュメントに書いてあるの？&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;そして、やっとClient API までたどりつく。&lt;br /&gt;解説では、JSONデータ取得のスクリプトの後にライブラリっぽいスクリプトを書いてあるけど、javascriptエラーになりますよ？&lt;br /&gt;逆の順番にしたらうまくいったー！って、サンプルコードはそういう順番で書いてある。&lt;br /&gt;どういうこと？&lt;br /&gt;まあ、なんとかフォームを作れました。&lt;br /&gt;さて、実行！&lt;br /&gt;ローカルファイルからでも実行できたぜ。&lt;br /&gt;サーバーにあげて確認してみよう。&lt;br /&gt;あらら、日本語はうまく通りません。orz&lt;br /&gt;うーむ。&lt;br /&gt;creator内では、きちんと日本語が使えるし、そもそもフォームには、ラベルに日本語を使っていて、ちゃんとclient api で処理できているのだが...&lt;br /&gt;client側もUTF-8にして試したのだけど、登録したデータがこわれている？&lt;br /&gt;どっかで、UTF-8からlatin-1 にむりやり変換しているようなところがあるのだろうか？&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-1009350961318601969?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/1009350961318601969/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=1009350961318601969' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/1009350961318601969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/1009350961318601969'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/02/zoho-creator.html' title='zoho creator いじってみた'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-1829190402095894654</id><published>2008-02-08T22:44:00.001+09:00</published><updated>2008-02-08T22:44:58.608+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='温泉'/><category scheme='http://www.blogger.com/atom/ns#' term='pyspa'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>次回のPython温泉</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://d.hatena.ne.jp/Voluntas/20080207/1202402028'&gt;リスケジュール - Twisted Mind&lt;/a&gt; &lt;br /&gt; &lt;blockquote&gt;今のところ第三回Python 温泉は6/27 28 29 の３日間、箱根あたりを考えております。  参加希望者は一度クリアしますので、再度希望のほうお願いいたします。&lt;/blockquote&gt;&lt;br /&gt;リスケということだ。&lt;br /&gt;参加希望！&lt;br /&gt;&lt;br /&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-1829190402095894654?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/1829190402095894654/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=1829190402095894654' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/1829190402095894654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/1829190402095894654'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/02/python.html' title='次回のPython温泉'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-3682618745135375842</id><published>2008-02-07T10:07:00.001+09:00</published><updated>2008-02-07T10:07:07.936+09:00</updated><title type='text'>Yet Another? D言語</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;a href='http://japan.cnet.com/news/ent/story/0,2000056022,20366701,00.htm'&gt;マイクロソフト、新開発言語「D」を開発中:ニュース - CNET Japan&lt;/a&gt;&lt;br/&gt;&lt;a href='http://www.digitalmars.com/d/index.html'&gt;D言語&lt;/a&gt;はもうあるよね。&lt;br/&gt;MSのは、"declarative"のDのようだが...&lt;br/&gt;&lt;br/&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-3682618745135375842?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/3682618745135375842/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=3682618745135375842' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/3682618745135375842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/3682618745135375842'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/02/yet-another-d.html' title='Yet Another? D言語'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-4216705537063151166</id><published>2008-02-06T12:57:00.001+09:00</published><updated>2008-02-06T12:57:34.679+09:00</updated><title type='text'>qumana使ってみる</title><content type='html'>&lt;p&gt;ScribeFireがあるから、それほど他のものがほしいわけじゃないけど、ブログ形式で、オフラインに書き溜めれたらなと思って、ちょっと試してみた。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;えと、Windows版で動かしてみると、漢字変換の前編集領域が見えないんですけど...&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Mac版はうちで試してみようかな。&lt;/p&gt;&lt;br /&gt;&lt;p align="right"&gt;&lt;small&gt;&lt;em&gt;Powered by&lt;/em&gt; &lt;a href="http://www.qumana.com/"&gt;Qumana&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-4216705537063151166?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/4216705537063151166/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=4216705537063151166' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4216705537063151166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4216705537063151166'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/02/qumana.html' title='qumana使ってみる'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-4423033670378091501</id><published>2008-02-06T12:28:00.001+09:00</published><updated>2008-02-06T12:28:54.201+09:00</updated><title type='text'>初代SimCityがオープンソースのMicropolisとして復活</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br /&gt;&lt;a href='http://opentechpress.jp/opensource/article.pl?sid=08/02/05/0139221&amp;amp;pagenum=3'&gt;Open Tech Press | 初代SimCityがオープンソースのMicropolisとして復活&lt;/a&gt; &lt;br /&gt; &lt;blockquote&gt;またTcl/TkからPythonなどのよりパワフルな言語に移行することも考えているので、拡張が簡単になり見た目も向上することになるだろう。&lt;/blockquote&gt;&lt;br /&gt;ここだけ反応:-)&lt;br /&gt;&lt;br /&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-4423033670378091501?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/4423033670378091501/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=4423033670378091501' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4423033670378091501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4423033670378091501'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/02/simcitymicropolis.html' title='初代SimCityがオープンソースのMicropolisとして復活'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-5585660635328563956</id><published>2008-02-05T20:28:00.001+09:00</published><updated>2008-02-05T20:28:19.464+09:00</updated><title type='text'>拡張機能とはいつの間に増えているもの</title><content type='html'>&lt;a href="http://s264.photobucket.com/albums/ii174/aodag/?action=view&amp;current=myfirefox_addons-1.png" target="_blank"&gt;&lt;img src="http://i264.photobucket.com/albums/ii174/aodag/myfirefox_addons-1.png" border="0" alt="Photobucket"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-5585660635328563956?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/5585660635328563956/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=5585660635328563956' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5585660635328563956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5585660635328563956'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/02/blog-post_05.html' title='拡張機能とはいつの間に増えているもの'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-4206582828100482541</id><published>2008-02-04T07:45:00.000+09:00</published><updated>2008-02-04T07:46:07.279+09:00</updated><title type='text'>photobucketについて</title><content type='html'>なんかむかつく広告が多いな&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-4206582828100482541?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/4206582828100482541/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=4206582828100482541' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4206582828100482541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4206582828100482541'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/02/photobucket.html' title='photobucketについて'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-6913124374637472490</id><published>2008-02-04T07:44:00.001+09:00</published><updated>2008-02-04T07:44:44.696+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wsgi'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='paste'/><title type='text'>webtest</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br /&gt;&lt;a href='http://pythonpaste.org/webtest/'&gt;Testing Applications with WebTest&lt;/a&gt; &lt;br /&gt; &lt;blockquote&gt;WebTest is an extraction of paste.fixture.TestApp, rewriting portions to use WebOb. It is under active development as part of the Paste cloud of packages.&lt;/blockquote&gt;&lt;br /&gt;paste.fixture の後継。&lt;br /&gt;webobをベースに、paste内のユーティリティの書き直しをしているのか？&lt;br /&gt;doctestですっきりかけそうなところがよさそう。&lt;br /&gt;twillとどっちがいいかな。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-6913124374637472490?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/6913124374637472490/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=6913124374637472490' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6913124374637472490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6913124374637472490'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/02/webtest.html' title='webtest'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-5159651372969600056</id><published>2008-02-04T02:02:00.001+09:00</published><updated>2008-02-04T02:02:22.716+09:00</updated><title type='text'>これは行っとく鹿</title><content type='html'>&lt;a href="http://s264.photobucket.com/albums/ii174/aodag/opensource/?action=view&amp;current=CIMG0023.jpg" target="_blank"&gt;&lt;img src="http://i264.photobucket.com/albums/ii174/aodag/opensource/CIMG0023.jpg" border="0" alt="CIMG0023.JPG"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-5159651372969600056?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/5159651372969600056/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=5159651372969600056' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5159651372969600056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5159651372969600056'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/02/blog-post_04.html' title='これは行っとく鹿'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://i264.photobucket.com/albums/ii174/aodag/opensource/th_CIMG0023.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-6870664680347194064</id><published>2008-01-28T03:25:00.001+09:00</published><updated>2008-01-28T03:25:57.762+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>DataPortability</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br /&gt;&lt;a href='http://www.dataportability.org/'&gt;DataPortability.org - Share and remix data using open standards&lt;/a&gt; &lt;br /&gt; &lt;blockquote&gt;Philosophy As users, our identity, photos, videos and other forms of personal data should be discoverable by, and shared between our chosen (and trusted) tools or vendors. We need a DHCP for Identity. A distributed File System for data. The technologies already exist, we simply need a complete reference design to put the pieces together.&lt;/blockquote&gt;&lt;br /&gt;既存の標準技術(OpenIDとかoAuthとかapmlやらなんやらなど)を使ってもっとWebサービス間のコンテンツを共有できるようにしようぜってな感じの団体。&lt;br /&gt;うん。萌える:-)&lt;br /&gt;&lt;br /&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-6870664680347194064?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/6870664680347194064/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=6870664680347194064' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6870664680347194064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6870664680347194064'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/01/dataportability.html' title='DataPortability'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-5239100715178791490</id><published>2008-01-27T15:50:00.001+09:00</published><updated>2008-01-27T15:50:25.352+09:00</updated><title type='text'>Mahaloってみちゃう</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;リンク集で作るWikipdiaのようなものか？&lt;br /&gt;とりあえずWSGIのリンクを作ってみました。&lt;br /&gt;&lt;a href='http://www.mahalo.com/Wsgi'&gt;Wsgi - Mahalo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-5239100715178791490?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/5239100715178791490/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=5239100715178791490' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5239100715178791490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/5239100715178791490'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/01/mahalo.html' title='Mahaloってみちゃう'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-2167164365468693282</id><published>2008-01-27T12:50:00.001+09:00</published><updated>2008-01-27T12:50:07.063+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='sqlalchemy'/><title type='text'>sqlalchemy-validations</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br /&gt;&lt;a href='http://code.google.com/p/sqlalchemy-validations/'&gt;sqlalchemy-validations - Google Code&lt;/a&gt; &lt;br /&gt; &lt;blockquote&gt;SQLAlchemy validations is an easy way to be sure that no inconsistent data will be saved to your database. It is a new extension for SQLAlchemy that checks if an object is consistent according to a customizable set of rules just before being saved to the database.&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;SQLAlchemyとElixirに対応。&lt;br /&gt;できあいのバリデータは、数値の範囲指定、文字列のパターンマッチ、プレゼンス(nullableでいいと思うんだけど)が用意されている。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;どっちかとゆうと、モデルからFormEncodeのスキーマを作りたいな。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-2167164365468693282?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/2167164365468693282/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=2167164365468693282' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/2167164365468693282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/2167164365468693282'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/01/sqlalchemy-validations.html' title='sqlalchemy-validations'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-4419875313730139258</id><published>2008-01-24T19:12:00.001+09:00</published><updated>2008-01-24T19:12:56.290+09:00</updated><title type='text'>Python Developers Camp 2008 冬</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;告知出てますね。&lt;br/&gt;&lt;a href='http://www.python.jp/Zope/PyLog/1201102994'&gt;Python Developers Camp 2008 冬 参加者募集&lt;/a&gt; &lt;br/&gt; &lt;blockquote&gt;■ 開催概要&lt;br/&gt;&lt;br/&gt;    * 名称　Python Developers Camp 2008 冬&lt;br/&gt;    * 日時　2008年3月7日(金)～9日(日)&lt;br/&gt;      二泊三日(土曜泊のみの方の参加も歓迎します)&lt;br/&gt;    * 場所　松本ホテル花月&lt;br/&gt;    * 対象　Pythonに興味のある方&lt;br/&gt;    * 費用　交通費，宿泊費を含んだ実費&lt;br/&gt;      宿泊費は交渉中ですが、１泊あたり1万円+会議室代1000円程度を予定&lt;br/&gt;    * 主催　Python Developers Camp 2008 冬実行委員会&lt;br/&gt;    * 締切　現地参加の締め切りは2月16日です。&lt;/blockquote&gt;&lt;br/&gt;&lt;br/&gt;今年も開催される冬合宿。&lt;br/&gt;去年より交通の便はよさそう。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-4419875313730139258?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/4419875313730139258/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=4419875313730139258' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4419875313730139258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4419875313730139258'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/01/python-developers-camp-2008.html' title='Python Developers Camp 2008 冬'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-6382194114606457997</id><published>2008-01-24T16:05:00.001+09:00</published><updated>2008-01-24T16:05:28.040+09:00</updated><title type='text'>formalchemy</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br /&gt;&lt;a href='http://code.google.com/p/formalchemy/'&gt;formalchemy - Google Code&lt;/a&gt; &lt;br /&gt; &lt;blockquote&gt;FormAlchemy is a library written in Python that generates HTML form fields from your SQLAlchemy mapped classes.&lt;/blockquote&gt;&lt;br /&gt;SQLAlchemy0.4.1以降は0.2で対応。とりあえずSVNから入手できる。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-6382194114606457997?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/6382194114606457997/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=6382194114606457997' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6382194114606457997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/6382194114606457997'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/01/formalchemy.html' title='formalchemy'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-1242628158515886209</id><published>2008-01-21T12:56:00.001+09:00</published><updated>2008-01-21T12:56:08.954+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openid'/><title type='text'>6個もあってもあまり有効に使った覚えがない</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br /&gt;&lt;a href='http://www.kuribo.info/2008/01/blogger-openid.html'&gt;クリボウの Blogger Tips: Blogger が OpenID プロバイダに&lt;/a&gt; &lt;br /&gt; &lt;blockquote&gt;Blogger が（まだ Draft なんですが）、OpenID プロバイダになりました。&lt;br /&gt;ウェブ上の様々な OpenID 対応サイトを利用するときに、Blogger が直接ユーザーを認証してくれるので大変便利です。&lt;br /&gt;これまで Blogger ブログの URL を OpenID の ID にするには、OpenID.ne.jp など外部の OpenID プロバイダを通す必要があったんですが、これからはその必要がなくなるというわけです。&lt;/blockquote&gt;&lt;br /&gt;OpenIDは結構いきわたってきた感がある。&lt;br /&gt;(僕はopenid.ne.jp,yahoo,はてな,livedoor,vox,bloggerと保持している。むしろ過剰供給ぎみ)&lt;br /&gt;今年は対応サービスが増えてほしいなあ。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-1242628158515886209?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/1242628158515886209/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=1242628158515886209' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/1242628158515886209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/1242628158515886209'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/01/6.html' title='6個もあってもあまり有効に使った覚えがない'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-8978585371214675331</id><published>2008-01-20T16:09:00.001+09:00</published><updated>2008-01-20T16:09:52.443+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>FlockとFirefox</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Firefox3を試しつつも、色んなアドオンが動かないわけで、軟弱な僕は&lt;a href='http://d.hatena.ne.jp/turkey_hate/20080119'&gt;彼&lt;/a&gt;のように対応するのが面倒なので、Flockと行きつ戻りつな不適切な関係をエンジョイしているのですよ。&lt;br /&gt;ScribeFireとGreacemonkeyとFirebugとLive HTTP Header が Firefox3に対応するまでは、Flock主体で行くつもり。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-8978585371214675331?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/8978585371214675331/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=8978585371214675331' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/8978585371214675331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/8978585371214675331'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/01/flockfirefox.html' title='FlockとFirefox'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-1718490591459101131</id><published>2008-01-20T16:03:00.001+09:00</published><updated>2008-01-20T16:03:20.002+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openid'/><title type='text'>インターネット人口での割合はどうなっているだろう</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;旧聞だが。&lt;br/&gt;&lt;a href='http://journal.mycom.co.jp/news/2008/01/18/026/index.html'&gt;Yahoo! OpenIDに対応、ID総数は3億6,800万へ | ネット | マイコミジャーナル&lt;/a&gt; &lt;br/&gt; &lt;blockquote&gt;Yahoo!が新たに2億4,800万のOpenIDを追加することで、OpenIDの総数は3億6,800万ほどになる。&lt;/blockquote&gt;&lt;br/&gt;Yahoo Japan も対応してくださいな。:-)&lt;br/&gt;&lt;br/&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-1718490591459101131?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/1718490591459101131/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=1718490591459101131' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/1718490591459101131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/1718490591459101131'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/01/blog-post.html' title='インターネット人口での割合はどうなっているだろう'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-4366749467076847171</id><published>2008-01-14T20:20:00.000+09:00</published><updated>2008-01-14T20:30:07.779+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='流れるようなインターフェイス'/><title type='text'>ナガレ×ナガレ</title><content type='html'>&lt;blockquote&gt;&lt;br /&gt; Zend_Mail オブジェクトのほとんどのメソッドは、 流れるようなインターフェイス形式でコールすることもできます。 「流れるようなインターフェイス」とは、 各メソッドの返り値が呼び出し元オブジェクト自身への参照となり、 その返り値からすぐに別のメソッドをコールできる形式のことを表します。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;require_once 'Zend/Mail.php';&lt;br /&gt;$mail = new Zend_Mail();&lt;br /&gt;$mail-&gt;setBodyText('This is the text of the mail.')&lt;br /&gt;    -&gt;setFrom('somebody@example.com', 'Some Sender')&lt;br /&gt;    -&gt;addTo('somebody_else@example.com', 'Some Recipient')&lt;br /&gt;    -&gt;setSubject('TestSubject')&lt;br /&gt;    -&gt;send();&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://framework.zend.com/manual/ja/zend.mail.html"&gt;Zend Framework:Documentation&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;これって流れてるの？単なるメソッドチェーンでなくって？&lt;br /&gt;僕がイメージしている流れるようなインターフェイスって下のような感じなんだけど。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;new Mail('This is the text of the mail.')&lt;br /&gt;  -&gt;from('somebody@example.com', 'Some Sender')&lt;br /&gt;  -&gt;to('somebody_else@example.com', 'Some Recipient')&lt;br /&gt;  -&gt;about('TestSubject')&lt;br /&gt;  -&gt;send();&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-4366749467076847171?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/4366749467076847171/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=4366749467076847171' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4366749467076847171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4366749467076847171'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/01/zendmail-send-zend-frameworkdocumentati.html' title='ナガレ×ナガレ'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-4720926282878039631</id><published>2008-01-05T04:46:00.000+09:00</published><updated>2008-01-05T05:03:33.778+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='restful'/><category scheme='http://www.blogger.com/atom/ns#' term='wsgi'/><category scheme='http://www.blogger.com/atom/ns#' term='webob'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pylons'/><category scheme='http://www.blogger.com/atom/ns#' term='paste'/><title type='text'>疑似メソッドとWebOb</title><content type='html'>&lt;p&gt;&lt;br /&gt;Restfulにやろうとしても、実際にHTML4でやろうとすると、formのactionにはgetかpostしか指定できない。&lt;br /&gt;Routesでは、これを_methodパラメータでメソッドを指定して、疑似的にputやdeleteを扱えるようにしている(恐らくrailsからのパクリと思われ)&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;ところで、Pylonsの0.9.7からは、リクエストオブジェクトがこれまでのPasteのものからWebObのものになるわけだが、この疑似メソッドの部分でちょっと大丈夫かなーと思う部分。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;どちらもリクエストパラメータは、request.params というインターフェイスで取得できるのだが、この中身は、request.POSTとrequest.GET を合わせたものになる。&lt;br /&gt;paste版requestでは、疑似PUTの場合、request.POSTから取得しているようだが、これは、REQUEST_METHODを確認せずに、wsgi.input をパースしているため。&lt;br /&gt;webob版では、REQUEST_METHODを確認して、postの場合のみwsgi.inputをパースしている。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;restcontroller のupdateはきちんと動くのだろうか。要確認。&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-4720926282878039631?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/4720926282878039631/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=4720926282878039631' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4720926282878039631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/4720926282878039631'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2008/01/webob.html' title='疑似メソッドとWebOb'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-1365703092566525156</id><published>2007-12-28T12:52:00.001+09:00</published><updated>2007-12-28T12:52:44.736+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='add-on'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Firefoxでスピードダイアル</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;br /&gt;&lt;a href='http://speeddial.uworks.net/'&gt;Speed Dial - Main&lt;/a&gt; &lt;br /&gt; &lt;blockquote&gt;Speed Dial allows fast access to your most visited websites. It loads in a tab, and will show thumbnail views of it's assigned websites. Those thumbnails will be refreshed automatically in the background.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;早速導入。&lt;br /&gt;とりあえず、FaceBookとNetVibesとtwitterとbloglinesを登録しておく。:-)&lt;br /&gt;&lt;br /&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-1365703092566525156?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/1365703092566525156/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=1365703092566525156' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/1365703092566525156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/1365703092566525156'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2007/12/firefox.html' title='Firefoxでスピードダイアル'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3228836498109417031.post-8120302846034386281</id><published>2007-12-21T07:49:00.001+09:00</published><updated>2007-12-21T07:49:06.598+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>MyMiniCity</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;とりあえず作ってみた&lt;br /&gt;&lt;br/&gt;&lt;a href='http://aodag.myminicity.com/'&gt;aodag - MyMiniCity&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3228836498109417031-8120302846034386281?l=blog.aodag.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.aodag.jp/feeds/8120302846034386281/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3228836498109417031&amp;postID=8120302846034386281' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/8120302846034386281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3228836498109417031/posts/default/8120302846034386281'/><link rel='alternate' type='text/html' href='http://blog.aodag.jp/2007/12/myminicity.html' title='MyMiniCity'/><author><name>Atsushi Odagiri</name><uri>https://profiles.google.com/115486162418257194638</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-gIkjV-_o39U/AAAAAAAAAAI/AAAAAAAAAAA/rAoG8qWoFfA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
