2011年10月25日

G+ Blogger連携

Google+とBlogger連携が始まるらしいので、Bloggerのdraft機能を有効にして連携してみた。

2011年4月2日

chromeアプリケーションとか

最近気になるプラットフォームが増えすぎてて追いかけるのが大変です。

chromeアプリケーションは二種類あって、通常のWebアプリケーションとしてどこかにホスティングされてる形式と、HTML, JS, CSSだけで作られててローカルで動く形式があるようです。

後者がPackaged Appsと呼ばれるらしい。

http://code.google.com/chrome/extensions/apps.html

多分ここが大元の情報?

Crhome拡張と同じようにつくるけど、Webアプリとしてタブが割り当てられる。

APIになんか追加とかあるか調べないといけないな。

ちなみに、このエントリはそのようなアプリケーションのScribefireで書いている。普通のWebアプリみたいになってるけど、アドレスバーにはURLが表示されてない。

 

2011年1月29日

PyCon mini JP で LTってきた

資料うp
時間切れで話せなかったけど、複数のプロシージャを一度のリクエストで実行するのが、JSON-RPC2.0の目玉だと思うんだよね。

2011年1月26日

distutils/setuptools/distribute

BeProudの勉強会はBPStudyが知られてるけど、社内勉強会でBPStyle というのもやっているのだよ。

2010年12月2日

Python Webフレームワーク作ってみた


こんにちはPython界のメタ奇行子aodagです。今年もアドベントカレンダーの季節がやってきました。
去年は、zope/plone関連ということで、zopeとwsgiのあいのこrepoze.bfgを紹介してましたね。
そして今年!Pyramid紹介する気満々だったのですが、よく考えれば、repoze.bfgがPyramidになったわけで、
これでは去年とネタがかぶってしまう!
ということで、今年のネタはもうメタでやるしかないですねと。



まずは、こちらにちょっとだけ目を通してほしい。




これらを踏まえて、Webフレームワークを作ってみた。



こちらがそれをつかったアプリケーションの例だ。




import webstruct

class application(webstruct.Application): # '/'
db_url = "sqlite:///"
templates = ['example_templates']

@webstruct.view(template='index.html') # '/index'
def index(req):
return dict()

class users(webstruct.Application): # '/users'
@webstruct.view(template="users.html") # '/users/index'
def index(req):
users = webstruct.query(User).all()
return dict(users=users)

@webstruct.view(template="show_user.html", pattern=r'(?P\w+)') # '/users/{username}'
def show_user(req):
username = req.urlvars['username']
user = webstruct.query_one_or_404(User, username=username)
return dict(user=user)

from sqlalchemy import *

class User(webstruct.Model):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
username = Column(String(255), unique=True)
description = Column(UnicodeText)

webstruct.metadata.create_all()
webstruct.new_data(User, username='aodag', description=u"""aodag is creator of webstruct.
""")
webstruct.transaction.commit()
webstruct.run(application)




クラスや関数定義でURLを構築している。
一応それぞれのとこで、URLをコメントでつけておいた。
実際の動きはこちらのテストコード を見ると、なんとなく感じをつかめると思う



できごころだったんです。すいません。



いちおうここにソースおいてあるから、実装に興味がある人はどうぞ。
https://github.com/aodag/webstruct



さて、3日目にバトンを回さないといけないのですが、最近wsgiサーバーのmeinheldを作ったりなんだりしている尊敬すべき変態 mopemopeさんにお願いします。


関連リンク

2010年10月18日

Sql alchemy bpstyle_4

社内勉強会で、SQLAlchemyを紹介したので、資料を公開しとくよ。
こんなことあんなことできますって話だけど、まあ、使いたくなれば、ドキュメントは充実してるので、調べてくれればいいよ。
あくまで、興味を持ってくれるまでの資料ね。

2010年9月28日

web3 ファーストインプレッション

PEP333 Web Server Interface Gateway の後継ともいうべき、PEP444 Web3 Interface が提案された。

Web3とはなにか?
Webアプリケーション、フレームワークと、サーバー間のインターフェイスの定義。

それはWSGIじゃないの?
Yes WSGIとWeb3の目的はほぼ同じ。Web3はWSGIをベースとしている。
なぜ、新たに提案されているかというと、WSGI提案後に、Python3がリリースされたからだ。
Python3への対応はWeb3の主要な目的のひとつだ。

なぜWSGI2.0じゃないのか?
Python3は後方互換性を保たないバージョンアップである。そのPython3に対応するWeb3も後方互換性を保つことはない。そのため、違う名前として提案している。

Python3だけが対象なのか?
現在の提案では、Python3.1以降と、2.6,2.7が対象。
2.6と2.7はPython3への架け橋であるため、Web3でも対象にしているものと思われる。
おおきな要因は、b前置詞の文字列リテラルがサポートされているかどうか。
3.0が対象じゃない理由はよく分からない。

WSGIとの大きな違いは?
一番目に付くのは、関数定義である。
WSGIの場合は第二引数にstart_responseコールバックが渡されていた。
Web3では、引数が1つだけになり、start_responseの呼び出しで渡していたレスポンスステータスやレスポンスヘッダは、戻り値のタプルに含まれるようになった。
引数がリクエストデータ、戻り値がレスポンスデータとなり、分かりやすくなったのと同時に、middlewareの作成が簡単になった。



def app(environ):
return "200 OK", [('Content-type', 'text/plain')], ["Hello, world!"]


ほかにはどのような変更が?
WSGIでは、レスポンスデータはstrとなっていた。
Python3のstrはユニコード文字列であるため、Web3のレスポンスデータはbytesにすることになっている。
ただし、2.6,7では、strでという話。
また、WSGI1.0以降のWSGI2.0に向けた提案なども含まれている。
関数シグネチャの変更もそのひとつだが、ほかにもweb3.inputのメソッドでサイズ指定可能な実装や要求されるようになったり、SCRIPT_NAME, PATH_INFO, QUERY_STRINGが省略できなくなったり、web3.script_nameやweb3.path_infoでURLデコード前の値を取得できるようになったりと、wsgiであいまいだった点などがweb3では定義されている。

ざくっと読んだおおまかな内容は以上。
まだ、わざわざWeb3と名前をかえるほどのものなのか?という疑問が消えないので、もうちょっと細かい点まで読む。