2010年6月27日日曜日

PythonStartup

Pythonのコマンドラインでの開発の際に過去のコマンドヒストリや補完のやり方は以下のとおり。

.pythonstartupファイルをhomeに作成し下記の内容にする。


# -*- coding: utf-8 -*-
import readline
import rlcompleter
import atexit
import os

readline.parse_and_bind('Tab: complete')
# osxの場合は下記でないと動かないかも
#readline.parse_and_bind("bind ^I rl_complete")
histfile = os.path.join(os.environ['HOME'], '.pythonhistory')
try:
readline.read_history_file(histfile)
except IOError:
pass
atexit.register(readline.write_history_file,histfile)
del os, histfile, readline, rlcompleter, atexit


で環境変数に以下を追加。
PYTHONSTARTUP=~/.pythonstartup


これでコマンドラインでタブ補完と上下キーでヒストリが表示されるようになる。
ipythonも素敵だけど、サーバでのインストールが面倒なときや、
windowsではこっちの方が良いかも(windowsのipythonは表示がおかしなことになる。自分だけか)

2010年6月19日土曜日

エキスパート Python プログラミング

買いました。

内容は、表紙の帯(と思ったら帯じゃない)に書いてある通り、Pythonプログラミングについてのベストプラクティスという題材で書いてあるので趣味プログラミングでしかPythonを使っていない私にとって非常にありがたい内容。

業務でちょっとしたツール(スクリプト)を作る時に個人的にPythonを使っているが、一般的な書き方で他の人に展開しても恥ずかしくないようなコードを書いていこう。

とりあえず、写経します。
Quick Lookup:


2010年5月30日日曜日

ハイパフォーマンスWebサイト

O'REILLYから出ているハイパフォーマンスWebサイトを読んでいる。

サイトを高速にする14個のルールが章ごとにわかりやすく書かれている。

あんまりWebサイト構築したことないからかなり勉強になる。

まず最初に結構びっくりする内容があったのでメモがてら書いておく。

・レスポンスにかかっている時間のほとんどはフロントエンドでの処理である
高速にするという作業は、DBのインデックスチューニングであったり、
レスポンスのアルゴリズムといったことに考えがいきがち(少なくとも私は)だが、
実際には8-9割がフロントエンドの処理に費やされている。
つまりブラウザに表示する時間がかかっているということ。

高速なサイトを実現するためには、ブラウザでの処理を高速化させることが重要だとおいうことらしい。

読んで良かったところを抜粋しておく。

1章 HTTPリクエストを減らす
・イメージマップやCSSスプライトを利用して画像をまとめる
・スクリプトやスタイルシートを結合する
・ファイルをまとめてリクエスト数を減らす

>なるほどという感じ。
とにかく1リクエストにかかるオーバーヘッドはかなりのものらしい。


3章 Expiresヘッダを設定する

・クライアントにキャッシュさせるようにHTTPヘッダにExpiresを設定させる
・ファイル名にバージョンをつけることで変更をブラウザに認識させる

>クライアントにキャッシュさせるっていうのは当たり前な気がしていたが、
ファイル名にバージョンつけて変更を通知するっていのは賢い。
たしかニコニコ動画がそうやってるって何かに書いてあった。


5章 スタイルシートは先頭に置く
・最後に置くとスタイルシートが読み込まれるまで表示されない
6章 スクリプトは最後に置く
・スクリプトが読み込まれている間はレンダリングが中断される

>外部ファイル関係。
レンダリングが逐次実行されることで、見ている人のストレスが低くなるらしい。
レンダリングが中断されないようにするためには
スタイルシートは先頭にスクリプトは最後に置くのが吉とのこと


Webやっている人には当たり前のTipsだったりするんですかね。
あーWebやりたいす。

kestrel

Twitterでも使われているMessageQueingシステムのkestrelの記事を読み、
memcachedのプロトコルで使えるということだったのでちょっと使ってみた。

バイナリが発見できなかったので、ソースからコンパイルすることにした。
とりあえず以下からソースコードをダウンロード。
http://github.com/robey/kestrel/tree/master

JavaなのででビルドはAnt。
Windows上でビルドするとどうもうまくいかない。

build.xmlを読むとどうやらOSXとLinuxでしかできないよう。
build.xmlを書き換えるのも面倒だったので、VMWare上のDebianでビルド。
今度は上手くいった。

ジャーナリングしたりログの出力パスの設定があるので、
Windows上で使うためには設定がいくつか必要。

とりあえずさくっと使うためにはconfigディレクトリ内の
production.confの以下の部分を変更

-ログ設定-----------------------------------------------------
log {
filename = "/var/log/kestrel/kestrel.log" →任意のパスに変更
roll = "daily"
level = "info"
}
-ジャーナリング設定-------------------------------------------
queue_path = "/var/spool/kestrel" →任意のパスに変更
--------------------------------------------------------------

ポートとかも設定ファイル上で変える模様。

以下のコマンドで早速起動。
java -jar kestrel-1.1.2.jar

実際にpythonからアクセスしてみた。

以前書いたmemcachedのソースコードそのままで使える。

違うのはアクセスが2回行われたときにエラーが発生する。
まあキューなので当たり前だがちょっと感動。

juno

MOONGIFTに紹介されていたので
PythonのWebFW junoを使ってみる。

Rubyの軽量WebFWのSinatraに近いらしく
かなり簡単にWebアプリがかけるということらしい。

まずとりあえずインストール。

以下のサイトからjuno本体をダウンロードする。

http://brianreily.com/project/juno/

本体を解凍したフォルダ内で以下のコマンド実行しインストール

$python setup.py install

すると色々インストールしておけと言われるので
以下のコマンドでインストールしておく。

$easy_install SQLAlchemy
$easy_install Jinja2
$easy_install Mako
$easy_install Werkzeug

さて実際のアプリケーションを書く

junoのサンプルをとりあえず利用した。
---------------------------------------------------------

from juno import *

@route('/')
def index(web):
return 'Juno says Hi'

run()


---------------------------------------------------------

これを普通にPythonインタプリタで実行する。
以下のようなログがコマンドプロンプトに表示される

---------------------------------------------------------
running Juno development server, to exit...
connect to 127.0.0.1:8000 to use your app...

GET request for /...
/ matches, calling index()...

---------------------------------------------------------

WEBブラウザ以下のアドレスにアクセスすると
http://127.0.0.1:8000

画面出た。

本気ですごい。超簡単。

memcached

memcachedを使ってみたかったので、せっかくなので、
pythonでやってみた。

memcachedのpython用クライアントインストールは
easy_installを使った。

easy_installをインストールした後で以下のコマンドを実行
$easy_install python-memcached

memcachedをインストールして起動した状態で以下のコードを実行

---------------------------------------------------------
import memcache

#memcached index key
indexkey = 1000

#set data to memcached
#initialize memecached
cachedata = 'cache data'
memcachedclient = memcache.Client(['127.0.0.1:11211'])
memcachedclient.flush_all()
memcachedclient.set(str(indexkey), cachedata)

#get data from memcached
memcachedclient = memcache.Client(['127.0.0.1:11211'])
cacheddata = memcachedclient.get(str(indexkey))
print cacheddata

---------------------------------------------------------

動いた。使うのはめちゃくちゃ簡単。

キーは文字列のみを受け付けるようだ。
integerだとだめって以下のようなエラーが出た。
(memcache.MemcachedKeyTypeError: Key must be str()'s)