ページ

2011年5月31日

今更ながらcookieのあれこれ

cookieについて初めて知ってからもう、10年以上経っていますが、分からないこととか、忘れてしまっていることが沢山あって、とても楽しいですね。さて、そんなクッキーですが、お仕事でいろいろやっていると、あるWebアプリケーションから発行されるクッキーがどんどん増えていく現象がありました。そのWebアプリケーションは自分たちの製品じゃないのですが、自分たちのアプリケーションと同一ドメイン上で動きます。それで自分たちの製品のクッキーが追い出される、っていう現象がでていました。まあ、そんな現象はどうでもいいのですが、それでクッキーってどういう単位で保持されて、どれくらいのサイズが限界なんだろう?っていうことで、調べてみました。

今回調べたブラウザはIE8です。他のブラウザはIE8より制限が緩いので上限にぶちあたるのに時間がかかるので・・・、という消極的理由です。いずれにせよ、制限があるのは事実です。ということで、サーバのコードはいつものようにgithubにいます。サーバは何も考えずにFlaskでかいちゃったあとに、なぜ、標準ライブラリだけで書かなかったんだろう?と反省するも、めんどいのでそのまま。

さて、IEでの結果ですが、クッキーを50個セットしたあとに、次からは古いものから順番に追い出されていきます。サイズ制限もあるはずですが、今回は、それにひかからなかったです。「クッキーの個数の上限」という記事に詳しく書かれていますね。それによると、ドメイン、ホスト単位で数の上限があるようです。僕が試したときにも同じでした。pathを指定すればその単位で個数を制御できると思っていたのですが、違っていました。

各クッキーのサイズ制限については、4kか余裕をみて5kぐらいの制限がありますが、そんなでっかいものはそうそうセットしないので、しらべてません。

というわけで、今更ながらクッキーを調べてみた結果です。

でわでわ

※ クッキーを増殖させるWebアプリって、とってもキモイですが、そんなことは今は言わないであげてください。

2011年5月28日

VisitorsでApacheのログ解析

最近はそれほどログ解析に興味はありませんが、時々、ログを見てみたい時があります。昔はanalogやawstatsを使っていました。どう設定していたかは覚えてないですが、そこそこめんどうだったと思います。時々見たいだけなので、もっと簡潔やりたいとおもってググるとVisitorsと言う人がいます。Gigazineでも使っているとか・・・。と言うことで、設定してみました。

graphvizを一部使うようなので、homebrewでインストールしておきます。次に公式サイトから最新版をダウンロードします。最新版は0.7です。tarballをダウンロードして展開して、makeをするだけです。makeだけ?やっぱりmakeだけです。シンプルすぎますねwww。./configureとかないんですね。ビルドが終わると./visitors access_log > report htmlとすれば、htmlで出力されます。いろいろオプションがあるようです。
./visitors -A --prefix http://servername > report.html
のようにすれば、すべてのオプション付きでレポートされます。graphvizが使われるのは、転送量などをグラフで出力するためみたいです。
動作自体はとても高速で、簡単に使えるのがいいですね。

でわでわ

2011年5月27日

mod_wsgiをセットアップしたときのメモ

最近はgeventを使ってコードを書いています。当然Webサーバもgeventをそのまま使っていました。今回もそれでもよかったのですが、久しぶりにフロントエンドにApacheをつかって、mod_wsgiを使ってPythonのアプリを動かしました。まあ、規模は極めて小さいですが・・・。ちなみに、今回って言うのは、この廃人養成サービス「Twwweet」のことです。で、mod_wsgiをセットアップしたときのメモです。サーバはubuntuのサポートが長いやつの最新です。

まずは、何はともあれmod_wsgiをインストールせねばなりません。いつもの「apt-get install libapache2-mod-wsgi」の召喚呪文を唱えます。召喚が完了すると、/var/www/の下にmyappっていうディレクトリをつくって、そこに自分のアプリを置きます。次に、/etc/apache2/mods-enabled/wsgi.confを開いて次の行を追加します。

WSGIPythonPath /var/www/myapps
WSGIRestrictStdout Off
WSGIDaemonProcess myapps threads=4
WSGIScriptAlias / /var/www/myapps/myapps.wsgi
<Directory /var/www/myapps>
    WSGIProcessGroup myapps
    WSGIApplicationGroup %{GLOBAL}
    Order deny,allow
    Allow from all
</Directory>

なんだか、僕が昔使っていたときとかなり違っているような気がします。WSGIPythonPathで自分の作ったモノへPythonPathが通るようにするはずだったんですが、うまく動かなかったので、あとで、wsgiのファイルで変更しています。WSGIRestrictStdoutは、僕のコードはログをloggingを通して標準エラーに出力しているんですが、これをやると例外が発生しちゃうので、標準エラーにはき出してもいいように設定してます。
WSGIDaemonProcessはスレッド数や実行するユーザやグループを制御できます。WSGIScriptAliasで実行するスクリプトを指定しています。

/var/www/myappにもどって、そこのディレクトリにmyapp.wsgiを作って次のようにかきます。

import sys
sys.path.insert(0, "/var/www/myapp")

from main import app as application

sys.pathに追加しているのはWSGIPythonPathが動かなかったせいです。appはwsgiアプリケーションですね。

でわでわ

2011年5月20日

GAE for Goをセットアップ

GAE for Goがでたので、試してみました。Golangはとっても好きな言語ではあるんですが、まだ、それでちゃんとしたモノを作る、っていう気にはなれませんでした。僕はわりと言語には保守的なんです。でもGAE for Goがでたので、この用途にはちょうどいいかな?と。Google App Engineの日本語のサイトではGoの情報はまだ、でていません。SDKのリンクすら見当たりません。なので、英語のサイトをみます。

まずは、DownloadのページからGoogle App Engine SDK for GoをCPU/OSにあったものをダウンロードします。僕はMacの64bitです。GolangのWindowsの対応状況はしらないし、興味もありませんが、SDKはLinuxとMacしかありません。きっと普通の開発者ならWindowsなんて使わないよね、っていうことです。

ダウンロードしたモノを展開します。展開したディレクトリをみると、Golangのコンパイラと標準ライブラリが同梱されています。別途Golangの環境を整える必要はないのはすばらしいことです。もっと言えば、自分でコンパイルすることすら必要ないです。Pythonのように、コードを書けばすぐに反映されて実行されます。dev_appserverを再起動する必要がないです。GAE for Javaは全く興味がないので、どうなっているかは知りません。それからGAE上で使えるライブラリしか同梱していません。
GolangのGoroutineも使えるらしいですが、本当に"並列"には動作はしないらしいです。一つのスレッド上でタイムシェアリングのように動くだけです。

さて、僕のMacの環境ですが、.bashrcに次のように書いています。ごめんね、僕は未だにbashを使い続けています。若者は内緒です。シェルの中でgae-goってやれば、gae用にpython2.5と展開したgoogle_appengeへのパスをPATHにセットされます。わかりやすいようにプロンプトも変えてます(僕の昔からの流儀です)。

gae-go() {
 export PATH=/System/Library/Frameworks/Python.framework/Versions/2.5/bin:$HOME/proj/google_appengine:$PATH
  PS1='(gae-go) \W\$ '
}

テスト用サーバは「dev_appserver.py ディレクトリ」で起動します。プロジェクトの構成は
+ appname
   - app.yaml
   + appname
      - appname.go
      - somename.go
          :

のようにすればいいです。goのソースコードの名前は何でもいいんだけど・・・。golangではWebアプリケーションのフレームワークとしてコアパッケージのhttpを利用します。テンプレートもコアパッケージのtemplateを使います。テンプレートファイルは一番上のappname直下において、template.MustParseFile(template_file_name, nil)でロードして利用できます。
SDKのdemosの下にいくつかのサンプルアプリがあるので、それ見れば大体分かります。

開発するときに、基本的には明示的に自分でコンパイルする必要はないです。スクリプトの感覚で使えます。でも、GolangはJavaとかと違ってコンパイルが一瞬なので、やっぱり実行前に一瞬で分かるものはコンパイルして見つけておきたいよね。

ということで、やっと生きる道を見いだした感があるgolangでした。また、golangで遊べそうです。

でわでわ

Google App EngineでFlaskでjinja2を使ったときのメモ

Google App EngineでもDjango使っている人が多そうな気がしますが、僕はDjangoはよく分かりません。Djangoの本は買ったりしましたが1ページも読んでません。Pythonでは普段は大体Flaskを使っています。これぐらいの規模のフレームワークが僕にはしっくり来ます。それで、GAEでFlaskを使って開発しようとしたときのメモです。

はやりはbuildbotを使って環境を構築するらしいので、それにならいます。「Flask on Google App Engine(buildbot編)」を参考に、というか、そのまんま作業します。コマンドプロンプトで作業プロンプトでプロジェクトのディレクトリに移動して次のコマンドを実行します。

$ git clone https://github.com/utahta/flask-gae-template.git
$ cd flask-gae-template
$ curl -LO http://svn.zope.org/*checkout*/zc.buildout/trunk/bootstrap/bootstrap.py
$ python2.5 bootstrap.py -d
$ ./bin/buildout

GAEはpython2.5なので、python2.5にあわせておきます。今日の地点でのflask-gae-templateのSDKのバージョンは1.4.3ベースです。1.5ベースにしたいので、buildout.cfgを編集します。あと、ほとんどの人はアプリケーションを国際化すると思うのですが、国際化できるようにbabelをインストールしてみたり。で、buildout.cfgのdiffはこんな感じになりました。tweepyがいますが、気にしないでください。

--- a/buildout.cfg
+++ b/buildout.cfg
@@ -42,6 +42,8 @@ use-zipimport = false
 eggs =
     Flask
     Flask-WTF
+    Flask-Babel
+    tweepy

 ignore-globs =
     *.c
@@ -62,7 +64,7 @@ ignore-packages =

 [gae_sdk]
 recipe = appfy.recipe.gae:sdk
-url = http://googleappengine.googlecode.com/files/google_appengine_1.4.3.zip
+url = http://googleappengine.googlecode.com/files/google_appengine_1.5.0.zip
 clear-destination = true

 [gae_tools]

この変更をしてから、./bin/buildoutを実行します。アプリケーションを実行して表示するとImportErrorでpkg_resources.pyがロードできないと怒られます。よくわからないので、この記事にあるpkg_resources.pyをsrcの下にコピーします。これで、動いたけどいいのか?と、疑問を持ちつつ、jinja2のテンプレートファイルはsrc/templatesの下に配置すればそれをロードして表示してくれます。

と言うことでGAE上のPythonは終わってGoであえて茨の道を突き進むことにしたのでした。

でわでわ

2011年5月6日

ubuntu 11.04のunity-2dをカスタマイズ

ubuntu 11.04がリリースされて、unityがデフォルトになっています。unityはOpenGLで3Dが有効になっていないと使えません。最近のPCであれば気にする必要はないですが、VMWareなどの仮想マシン上で使う場合は、3Dが使えません。つまり、unityが使えません。あれ?VirtualBoxもParallelsも3Dは使えるので、ひょっとしてVMWareだけ?些細なことは気にしません。さて、それで、unity-2dをインストールして使います。でも、unityでもカスタマイズは結構やっかいでCompizの設定をcompizconfig-settings-managerをインストールして、難解な設定を行わないといけません。それでも、できる設定は限られています。unity-2dはCompizの設定からは設定できません。unity-2dを設定するには、gconf-editorを起動して設定します。

gconf-editorを起動して、/desktop/unity-2d/launcherを開きます。hide_modeで自動で隠したり、でたり、常に表示したりできます。デフォルトは2で、ウィンドウがランチャーに被さるときえます。常に表示させたいときは3みたいです。よくわからないので、適当な数字をいれて試してください。
super_key_enableは、まあ、superキーをたたいたら、あれが出てくるかどうかですね。use_strutって何?favoratesは、ランチャーに表示させる項目ですが、これはUIから制御できるのでわざわざgconfで設定するほどのものではないです。

まあ、11.10に向けての経過点なのでしかたないところはありますが、もう少し設定できるとうれしいですね。ちなみに、Gnome3.0とUnityの違いが僕にはわかりません。

でわでわ

2011年5月3日

pypyは本当に速いのか?試してみた

pypy1.5がリリースされました。JITコンパイラを搭載するなどしていてCPythonより速いという触れ込みです。何もしなくても自分のプログラムが高速になっていくというのはとっても楽です。でも、pypyって日本語で響きは卑猥なのでちょっと避けてました。嘘です。
では、本当に速くなるのか、というのをフィボナッチ数列を計算する例のプログラムで試してみます。今回は再帰するコードと再帰しないで計算するコードの二つで計測しています。それから、参考までにJavaの計測時間ものせています。ただし、本来のJavaのコードがそうであるように、Fibonacciを計算するファクトリクラスを作って、何とかパターンでごにょごにょごにょ、っていうのはやっていません。誰かエンタープライズ用途で計算する壮大なプログラムを書いてください。さて、それでは今回計測したコードたちです。

さて、今回はPythonはpypy1.5, python2.7, python 2.6, python 2.5で計測しました。pypyとpython2.7はhomebrewでインストールしたものです。python2.6と2.5はもともとシステムについていたものです。Javaは1.6.0.24で64bitのサーバVMです。マシンは例のiMacです。確かCore i5の2.8Gで4 core。メモリは12Gです。結果はすべて秒です。再帰版では
  • python 2.5 1.46
  • python 2.6 0.94
  • python 2.7 1.03
  • pypy 1.73
  • java 0.55

です。python 2.5から2.6ではパフォーマンスがあがっていますが、2.7では若干落ちています。ビルド元が違うせいなのか、そういうものなのか・・・。Javaはさすがに無駄なことをやらなければ速いです。2倍ぐらい速いです。本命のpypyですが、1.7倍ぐらい遅くなっています。全然速くないです、というか遅いです。この結果が予想を裏切って悲しかったのでコードの書き方を変えれば速くなるかも?ということでループで書いてみました。計算が速すぎるのでループの数は再帰版とは違っています。その結果です。
  • python 2.5 6.33
  • python 2.6 5.51
  • python 2.7 3.12
  • pypy 2.34
  • Java 1.43
今回は、Pythonはバージョンが上がるたびに確実に速くなっています。そしてpypyはCPython 2.7よりさらに速くなっています。さて、みんなが大嫌いな大好きJavaは1.43秒と、やっぱり、圧倒的な速さです。

pypyは関数の呼び出しが高速になっているって聞いていたので、関数呼び出しがある再帰版のほうがCPythonより速くなりやすいと思っていたのですが、想像を裏切られました。ループの方がJITに優しいのでしょう。

でわでわ

2011年5月2日

Ubuntu 11.04でMozc

会社のUbuntuも11.04にアップグレードされていしまいましたしました。仮想マシン上の家のUbuntuとは違い、直接インストールしています。インストールは2時間ぐらいで終わったと思いますが、もっと時間がかかっているかもしれません。unityは賛否両論があるみたいですが、僕は頑張って使い続けます。と言うか、あんまりこだわりがないだけですが・・・。さて、今まではUbuntuのIMEは何も考えずにAnthyを使っていました。でも、ちょっとオバカさんなのでGoogleのMozcをインストールしました。

ビルドしたものはおこっちていないようなので、このページを見ながら自分でビルドしました。このページには、Ubuntuの9.10と10.04でしかサポートしていない、って時代遅れのことが書いてあります。でも、まあ、試していないだけだと信じて構わずにすすめます。まず、最初にビルドに必要なものをインストールします。
$ sudo apt-get install g++ python libibus-dev libcurl4-openssl-dev libssl-dev \
zlib1g-dev libdbus-1-dev libglib2.0-dev libprotobuf-dev protobuf-compiler \
libgtest-dev subversion devscripts debhelper libqt4-dev scim libscim-dev \
libzinnia-dev gyp

それから、subversionのリポジトリから最新をとってきてビルドします。
$ mkdir src/mozc
$ cd src/mozc
$ svn co http://mozc.googlecode.com/svn/trunk/src
$ debuild -b -uc -us
$ cd ..
$ sudo dpkg -i ibus*.deb scim*.deb mozc*.deb
それから、「ibusキーボード・インプットメソッド」の設定を開いてMozcをIMEに設定します。おしまい。これでかなり快適になったはず。

でわでわ