Heroku 上の Django アプリで django_session が溢れた

ある日 HHTQA が 500 を返して動かなくなってた.

$ heroku logs

の末尾にあやしいメッセージが.

OperationalError: (1142, "INSERT command denied to user 'user'@'hostname' for table 'django_session'")

MySQL の権限が変わるわけがない (ClearDB という add-on なので, ユーザとかは俺はいじれない) し, MySQLWorkbench では同じユーザで見れているので, 権限が根本原因ではない.

MySQLWorkbench で色々見てみると django_session というテーブルが肥大化している. テーブル名や expire_date というカラム名から, 明らかに不要なデータが溜まっている.

SELECT count(*) FROM django_session; -- 15677

このテーブル名で検索すると https://docs.djangoproject.com/en/dev/topics/http/sessions/?from=olddocs/#clearing-the-session-table という情報が見付かり, 手作業で削除することもできるそうだ.

heroku コマンド使って, Heroku 上の環境で削除操作を行った.

$ heroku run find / -name django-admin.py
Running find / -name django-admin.py attached to terminal... up, run.1
find: `/proc/tty/driver': Permission denied
find: `/proc/1/task/1/fd': Permission denied
find: `/proc/1/task/1/fdinfo': Permission denied
find: `/proc/1/fd': Permission denied
find: `/proc/1/fdinfo': Permission denied
find: `/lost+found': Permission denied
find: `/etc/ssl/private': Permission denied
/app/.heroku/venv/bin/django-admin.py
/app/.heroku/venv/lib/python2.7/site-packages/django/bin/django-admin.py

$ heroku run .heroku/venv/bin/django-admin.py cleanup
DJANGO_SETTINGS_MODULE が無いと怒られるので設定.

あくまでモジュール名. ファイル名ではないので注意.
$ heroku config:add DJANGO_SETTINGS_MODULE=settings
$ heroku run ls '$DJANGO_SETTINGS_MODULE'
確認
$ heroku run .heroku/venv/bin/django-admin.py cleanup
SELECT count(*) FROM django_session; -- 1933

予想通り django_session テーブルが小さくなったので, Heroku アプリを再起動.

$ heroku restart
$ heroku logs

まだ何かエラーが出る. 以下 heroku logs の結果.

2012-07-14T12:52:29+00:00 heroku[web.1]: Starting process with command `python manage.py run_gunicorn 0.0.0.0:33646`
2012-07-14T12:52:30+00:00 app[web.1]: Unknown command: 'run_gunicorn'
2012-07-14T12:52:30+00:00 app[web.1 ...

s3:// と s3n:// の違いとは??

現在クラウドサービスと呼ばれるものには色々あり賑やかですが, 今回の話は Amazon Web Services (AWS) が提供する Elastic MapRecude (EMR) と Simple Strage Service (S3) の小ネタです.

S3 は文字通りディスクのようにファイルの保存先として使えます. Apache Hadoop でも入出力先として S3 が使えるようになっていて, Apache Hadoop を使っている EMR でも, もちろんこの S3 が利用できます.

その S3 のファイルパスの先頭にスキーマ名が付くのですが, Elastic MapReduce (EMR) の文書では s3://s3n:// が混在しています. (ここのコマンドとか) 何か違うのかどうか色々検索してみたり, 以下の本にあたってみたりしたところ, 特に違いは無いそうです.

本家の EMR の資料に「Apache Hadoop では違いがあるけど, EMR では特に違いは無いよ」という記述があります. → http://docs.amazonwebservices.com/ElasticMapReduce/latest/DeveloperGuide/FileSystemConfig.html ちなみに Apache Hadoop での s3://s3n:// についてはこちら → http://wiki.apache.org/hadoop/AmazonS3 AWS の本家の資料はかなりしっかりしているので, サービスを使う前に舐めるように全部読むべきでした. 反省.

結論ですが,「EMR では別にどっちを使っても構わなくって, Apache Hadoop の s3:// のようにしたければ hdfs:/// (こっちはスラッシュ3つ) を指定しなさい」ということでした. (http://docs.amazonwebservices.com/ElasticMapReduce/latest/DeveloperGuide/CLI_CreateStreaming.html#API の Note)

ちゃんちゃん.

「Java 開発者のための関数プログラミング」を読んで

Java 開発者のための関数プログラミング という本をとんぷーが翻訳した (「Java開発者ための関数プログラミング」が出版されました) というので ePub で買って読んでみた. 前からとんぷーが何か本を翻訳している話は聞いていたし, タイトルにすごく惹かれたので, 出てすぐに買い iPod touch に放り込んで主に寝ながら読んでいた.

(特にアプリは入れずに iBooks で読んでたけど, 本文に対してメモが取れるところが便利.)

内容について

おおよそタイトルから想像した通りの内容だったが, Java の動くソースコードをちゃんと書いて説明しているところにこの本の価値を感じる. 余談だが, bleis さんの Java の語彙で Maybe を説明してみる という記事も近いものに思う.

通常の Java クラスをモジュールとして使ったり, 継承を使った多態を否定して使わなかったり, Java プログラムとしては挑戦的な作りになっている. こういう「無茶しやがって」感が面白い. いわゆる関数型プログラミング言語に出てくる仕組みを別の仕組みを持つ Java で実装してみるというのは, その仕組みを複数の視点から見てより理解を深めることになる. Java で無理して関数プログラミングをすることで, 関数プログラミングのスタイルがどんなもので, どれだけ Java がそのスタイルに向いてないかが良く分かる.

内容が「関数プログラミングで書くと何が良いか?」という一貫した視点で書かれていて読み易い. 色んな論点を網羅的に扱っているところも有難い. もちろん翻訳された日本語に不自然さがないところも素晴しい. 通しで読めば1日で読めてしまうのではないだろうか?

(内容も文体もどことなくブログ記事っぽく感じるのは何故なのだろう)

クスッとしたとこ

意図的かは分からないが, 原著のタイトルの "functional programming" を「関数型プログラミング」でなく「関数プログラミング」と訳したのはけっこう好き. たぶんとんぷーのことなので意図的なんだろう.

「Customerクラスは顧客に関するすべての情報を突っ込む福袋のようになっていました」というところ.「福袋」という表現がぴったりハマっていて小粋なところがにくい.

「Nullとはなんだったのか」という節のタイトル. よくブログ記事とかで見るが, null の面倒さを知ってるとウンウンと頷くタイトルだ.

本筋とは全く関係無いが, クラス NaturalNumbers に定数 (public static final なフィールド) ZERO があるということは, 著者は「0 は自然数」の人なんですね. そうなんですね.

誤植

「本書で使用されている表記規則」

半角の閉じ括弧 (")") が余計.

固定幅文字(Constant width))
                          ^

System Message: WARNING/2 (<string>, line 43)

Literal block ends without a blank line; unexpected unindent.

「コンビネータ関数:コレクションの強力なツール」

組版ツールの関係だろうが, 何やら不思議な文字列が残っている. たぶん "@" というのが特殊記号なのだろう.

filterは「head」と@「<tt>{filter}をtailに適用した結果」
                  ^  ^^^^^^^^^^^^

(指摘されるとけっこう凹むのだが, 気付いてしまったので一応報告)

おわりに

Java で関数プログラミングをしてみる, という1つの発想から書かれた本ですごく読み易い. 関数プログラミングの仕組みについて頭を整理するのにも良い.

既に関数プログラミングを理解している人は読む必要はあまり無いが, 既存の解説読んでもピンと来なかった人が読むと良いかもしれない. 人によって理解が進む解説は様々なので, 色々なスタイルの解説があることはとてもよいことだ.

こういった文章を書いて, プログラミングをする人達に貢献していくことも素敵なことだと思う.

とにかく読んでて楽しい本でした.

Licenses