PyPI(Python Package Index) == rubyforge, setuptools == rubygems, easy_install == gemという理解でいいのかな?

% sudo port install py25-setuptools
% sudo easy_install SQLAlchemy

と思ったら・・・

% port search easy_install
py-pip @0.4 (python, www)
    An easy_install replacement

py25-pip @0.4 (python, www)
    An easy_install replacement

py26-pip @0.4 (python, www)
    An easy_install replacement

pip == gemという感じ?

% sudo port install py25-pip
% sudo pip install GHRML

という訳でもないみたい。

genshiって何?コンパイルはじまっとる!search的なものは無いのかな?など疑問は増えつつインストール完了。

% port variants mod_wsgi
mod_wsgi has the variants:
   python24: Use Python 2.4
     * conflicts with python25 python26 python31
   python25: Use Python 2.5
     * conflicts with python24 python26 python31
[+]python26: Use Python 2.6
     * conflicts with python24 python25 python31
   python31: Use Python 3.1
     * conflicts with python24 python25 python26
   universal: Build for multiple architectures
% sudo port install mod_wsgi +python25

passengerと同じ感じで設定。

% sudo vi /opt/local/apache2/conf/httpd.conf
(...)
# mod_passenger
Include conf/extra/httpd-passenger.conf

# mod_wsgi
Include conf/extra/httpd-wsgi.conf
(...)
% sudo vi /opt/local/apache2/conf/extra/httpd-wsgi.conf
LoadModule wsgi_module modules/mod_wsgi.so
WSGIPythonHome  /opt/local

何も書かないとmod_wsgi含むapacheプロセスが立ち上がって勿体無いのでpassengerと同じ様に単独で立ち上がってsocket通信するDaemon modeというので起動。

% sudo vi /opt/local/apache2/conf/extra/httpd-vhosts.conf
(...)
<VirtualHost *:80>
    ServerName hello-mod-wsgi
    DocumentRoot "/Users/komagata/Sites/hello-mod-wsgi"
    WSGIDaemonProcess hello-mod-wsgi processes=2 threads=15
    WSGIScriptAlias / /Users/komagata/Sites/hello-mod-wsgi/hello.wsgi
</VirtualHost>
% sudo vi /etc/hosts
(...)
127.0.0.1       hello-mod-wsgi
(...) 
% vi ~/Sites/hello-mod-wsgi/hello.wsgi
def application(environ, start_response):
    start_response('200 OK', [('Content-type', 'text/plain')])
    return 'Hello, mod_wsgi!'
% sudo /opt/local/apache2/bin/apachectl restart

特に指定しないとlogsディレクトリにapacheの権限で立ち上がるみたいです。

% ls -l /opt/local/apache2/logs/*.sock  
srwx------  1 _www  admin  0 10 27 00:45 /opt/local/apache2/logs/wsgi.815.4.1.sock
http://hello-mod-wsgi/

なるほど

iPhone買ったらPC用のネット環境が無くなったのでE-MOBILEのW31DH買いました。金が無くなっていく・・・。

でもMacBook自体結構バッテリー持つのでどこでも繋がるのはやはり便利ですね。

EMOBILE D31DW

ジョナサンアイブが見たら即座に銃のセーフティーロックを解除しそうです。

PythonのWAFやORMやテンプレートエンジンにはどういうのがあるのか調べてみました。

俺の要望

  • GAEでも使えるものがいい。
  • 複雑なRoutesはうんざり。シンプルなのがいい。
  • ActiveRecordはうんざり。DataMapperがいい。
  • hamlみたいにインデントを綺麗に出してくれるテンプレがいい。
  • layoutみたいにパーツでなく枠を共有できるテンプレがいい。

調べた感じ

  • GAE SDKにdjangoが入ってるらしい。
  • Routingは正規表現が多い。
  • SQLAlchemyというORMがDataMapperパターンらしい。
  • インデントをそろえてくれるテンプレがみつからない。
  • 枠の共有はテンプレの継承で行うみたい。(?)
  • web.pyというのがシンプルっぽい。

「PythonでWAF,ORM,テンプレつったらxxxだろうjk・・・」

「xxx知らない情弱は負け組」

というのがあれば教えて頂けるとうれしいです。

python2.5からwsgirefというモジュールが標準で入ってるそうです。WSGIのリファレンス実装って意味かな?Rubyで言えばRackとWEBrickが標準で入ってるって感じでしょうか。

% vi wsgi.py
def application(environ, start_response):
  start_response('200 OK', [('Content-type', 'text/plain')])
  return 'Hello, WSGI!'

from wsgiref import simple_server

if __name__ == '__main__':
  server = simple_server.make_server('', 8080, application)
  server.serve_forever()
% python wsgi.py
http://localhost:8080/

ほう。

インストール。GAEがpython2.5だそうなので2.5を入れてみた。

% sudo port install python25
(...)
To fully complete your installation and make python 2.5 the default, please run
        sudo port install python_select
        sudo python_select python25

python_selectを入れて実行せよと出た。debianのupdate-alternativeみたいなもんだろう。

% sudo port install python_select
% sudo python_select -s
python26-apple
% sudo python_select python25
% sudo python_select -s
python25

macのデフォルトは2.6なんですね。これが普通なのかわからないけど2.5にしておきました。

% vi hello.py
print "Hello, Python!"
% python hello.py 
Hello, Python!

うん。

ジュース

machidaさんから真ん中に保冷剤が入っている飲み物入れ?を貰いました。カワユス

cucumber

cucumberのインストール画面。かわいい。(::)

随時更新。

Macのシンボリックリンク

zshで先頭を大文字で打たないと保管されないのが面倒なので。

% ln -s ~/Sites ~/site
% ln -s ~/Documents ~/doc

こっちの方が良い(via milkcocoa)

% vi ~/.zshrc
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'

viで:e ~/siteには効果なし

GAEjがどんなもんかイマイチつかめなかったんですが、やってみて、「最初からそういってくれよ!」と思ったので、過去の自分へのFAQ。

Q. どうやって動くの?
A. Java SE 6とServlet標準(実際はJetty)で動く。Java SE 6自体が過去のバージョンのclassもサポートしてるので大抵動く。あくまでServletが動くだけで勝手なプロセスを動かせるわけじゃないよ。(プロセスやスレッドの生成はできない)

Q. どうやってスケールするの?
A. 高負荷が続くと勝手にサーバインスタンスが増えてデプロイされるらしい。データはBigTable(分散KVS)に保存する。ファイルの書き込みは出来ない。

Q. どうやってアップするの?
A. そのためのクラスがあって、CUIからはラッパーシェルスクリプト、antタスク、GUIからはEclipse Pluginがある。どこのサーバーにアップするかとかそういうのを気にする必要は無い。

Q. 何をアップすればいいの?
A. app-engine.xmlという固有の設定ファイルを含めたWAR標準に則ったディレクトリをアップすればいい。(WARのアーカイブはまだサポートされてないらしい)

Q. 独自ドメイン使えるの?
A. 使える。

Q. じゃあすごい良さそうじゃん
A. だから散々そうだっつってんだろボケ!