2009-10-22

伯林旅行記 0

先週、職場での最終出社日でしたので、空いている時間を使ってドイツのベルリンに来ています。およそ旅行だとか観光だとかをしたことがないので、どうしていいか分からず、でもとりあえずヨーロッパに行ってみたいなぁという、どうしようもない動機で来ています。



搭乗口でぴこーんぴこーん



成田→フランクフルト→ベルリン、という飛行機でした。成田からフランクフルトの11時間はだるいなぁと思っていたのです。で成田での搭乗口で改札機みたいなのに搭乗券を入れてもらいますよね。あそこで、ぴこーんぴこーんとアラームが鳴るわけですよ。



ちょっとだけ英語が分かるのに、敢えてアメリカを避けている理由は、いつも出入国で別室に連れて行かれるからなのです。なんかとなりで「私が帰らないと、うちの小さい子たちはどうなるの」とかって泣き崩れているおばちゃんの横で、「で、最後にアメリカに来たのはいつだって?」とかの質問をされるのが、もう面倒で面倒で。フライト逃しそうになるし。



なのに、搭乗口でぴこーんぴこーんですよ。泣きそうになりながら係の人と話してみると、満席なのでビジネスクラスの席を用意した、とのこと。やったー、わーい。というわけで快適な11時間でした。



ちなみに国際線に乗るときには、必ず襟付きシャツ、ジャケット、革靴着用です。これが利いているのかどうか、まったく検証していませんが、何度かビジネスクラスに乗ってます。しつこいようですが、検証してません。



ビールっす



この旅行はドイツに行くこと自体が目的なので、現地でのプランはまったくありません。とりあえずビール飲んでおこうくらいなもんです。というわけで、到着したのが夕方で、ぶらぶらしつつ適当に屋台でソーセージ食べたあとは、ビールのお店へ。



Berliner Weisse なるビールのカクテルみたいなのと、Berliner Kindle なる苦いのをいただきました。Berliner Weisse のほうが甘いシロップみたいなのと混ぜるので、Weissebier 特有の臭いに気づかずに飲めました。



Img_0594


Img_0593




2009-10-05

EC2 で Django を動かした その2

前回のつづき。



開発サーバと本番サーバの設定



IBM developerWorks の記事のリスト9にあるように、settings.py を開発サーバと本番サーバを if 文で分けておきます。



import socket
import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

if socket.gethostname().startswith('mylocalhost'):
    DEBUG = True
    DATABASE_ENGINE = 'sqlite3'
    DATABASE_NAME = 'data.sqlite'
    ...
else:
    DEBUG = FALSE
    DATABASE_ENGINE = 'mysql'
    DATABASE_NAME = 'myappdata'
    DATABSEE_USER = 'myname'
    DATABASE_PASSWORD = 'mypassword'
    ...




のように書きます。私の場合は、データベースの設定くらいしか違いはありません。



デプロイするスクリプト



(生の Django ではなく)Goole App Engine のいいところは、開発コードをそのままデプロイするツールがついていることです。で、まあ、あそこまでデキはよくなくていいので、似たようなコードが欲しいなぁと思って、簡単なシェルスクリプトを書きました。



#!/bin/bash

HOST=$1
IDENTITY_FILE="/path/to/key.pem"
SRC=`dirname $(dirname $0)`
DST=root@${HOST}:/srv/django

if [ $# -eq 1 ]
then
  rsync -auvz --delete --exclude "tools" --exclude ".hg" --exclude "*~" --exclude ".DS_Store"  -e "ssh -i ${IDENTITY_FILE}" ${SRC} ${DST}
  ssh -i $IDENTITY_FILE root@${HOST} apachectl restart

else
  echo $0 host
fi


これを Django project のディレクトリと兄弟になるディレクトリ tools の中に、deploy という名前で保存しておきます。



  • /path/to/djangoproject


  • /path/to/tools/deploy


ですね。で path/to ディレクトリ内で、tools/deploy hostname で呼び出します。



まず rsync を使って、サーバ側のファイルを更新します。手元のPCは Mac なので .DS_Store ファイルを除外したり、mercurial を使っているので .hg フォルダを除外したり、Emacs を使っているのでバックアップファイル *~ を除外したりしています。



続いて本番サーバのアパッチを再起動するところまで、deploy スクリプトに任せています。



ホスト名を明示的に入力するようにしているのは、きっと将来、テスト用にサーバを作るだろうなぁと考えてのことです。EC2 を使っているので、バージョンアップをする前に、まったく同じ環境のインスタンスを立ち上げてテストするのに、ほとんどお金がかからないので。



今はまだ固定IPを取っていないのですが、人に見せられるようになったら、ドメイン取って公開する予定です。



2009-09-30

EC2 で Django を動かした

Django を動かすのに mod_python の入った本番サーバなんてないぞとつぶやいたら、@voluntas さんにEC2を勧められました。その顛末。EC2 のアカウントを取るとか、ssh でつなげる方法とかは割愛します。



MySQL、mod_python、静的ファイルは Apache で配信、/ パスがウェブアプリのルート、を想定しています。



AMI の選択
使用した AMI は、Quick Start カテゴリにある、Getting Started on Fedora Core 8 (AMI Id: ami-3c47a355) です。「Minimal Fedora Core 8, 32-bit architecture, Apache 2.0, and Amazon EC2 AMI Tools.」というやつです。特に深い理由はなくて、プレーンな Apache が欲しかっただけです。



パッケージのインストール
データベースには MySQL、Django の実行には mod_python を使います。MySQL は LAMP の M だから。mod_python は、公式ドキュメントでおすすめになっていたから。という程度の理由で選択しました。注意すべきは、python 2.5、Django 1.0 であることです。


# yum install mysql MySQL-python mod_python Django


ディレクトリ構成



  • /srv/foo/project ... Django プロジェクトディレクトリ。django-admin.py startproject で作るやつ。


  • /srv/foo/static ... スタティックファイルのフォルダ


  • /srv/foo/templates ... テンプレートのフォルダ


  • /var/www/html/media ... /usr/lib/python2.5/site-packages/django/contrib/media へのシンボリックリンク


  • /var/www/html/project ... /srv/foo/project へのシンボリックリンク


  • /var/www/html/static ... /srv/foo/static へのシンボリックリンク


Apache の設定
/etc/httpd/conf/httpd.conf の最後に以下を追記。



<Location "/">
    SetHandler python-program
    PythonHandler django.core.handlers.modpython
    SetEnv DJANGO_SETTINGS_MODULE project.settings
    PythonOption django.root /project
    PythonDebug On
    PythonPath "['/srv/foo'] + sys.path"
</Location>
<Location "/static">
    SetHandler None
</Location>
<Location "/media">
    SetHandler None
</Location>






その後、


# apachectl restart

して、/ にアクセスすると、It works! が出たような気がします。



MySQL の設定
ここらへんからが記憶がかなり曖昧です。



/etc/my.cnf を以下のように編集 (参考 http://d.hatena.ne.jp/MOZZ/20070809 )



[mysqld]
(省略)
default-character-set=utf8
skip-character-set-client-handshake

(省略)

[mysql]
default-character-set=utf8


つづいて、確かこんな感じ。



# mysql -u root -p
Enter password:

mysql> CREATE DATABASE foo_db CHARACTER SET utf8;
Query OK, 1 row affected (0.01 sec)

mysql> GRANT ALL ON foo_db.* TO 'username'@'localhost' IDENTIFIED BY 'mypassword';
Query OK, 0 rows affected (0.03 sec)

mysql> quit
Bye
# /etc/init.d/mysqld restart


以上が、本番サーバの設定。あと settings.py 内部での開発/練習サーバの設定わけと、デプロイをするためのスクリプトを書きました。眠くなったので、またこんど。