Archive@2008/10

django-command-extensions で manage.py のコマンドを色々拡張する

django-command-extensions - Google Code

という manage.py のコマンドの拡張をいっぱい集めたプロジェクト(名前がdjango-extensionsに変更になるみたいです)があるというのを、

Screencast: Django Command Extensions | Surfing in Kansas

のブログで知ってちょっと面白そうなんで、いじってみることにしました。多分ここのブログを見た方が伝わるとおもいます。

まずはインストール

  • まずは、GoogleCodeからダウンロード。
  • 解凍して、できたディレクトリに移動。
  • python setup.py install を実行
  • 使いたいプロジェクトの settings.py の INSTALLED_APPS に、'extensions' を追加。(公式のドキュメントだと、'django_extensions'を追加って書いてあるけど、setup.py でいれると extensions になるっぽいです。)

これで色々と拡張された manage.py が使えるようになります。

例えば…

create_app
新しいアプリケーションを作るときに、startapp を使いますが、これを使うと、--template で新しいアプリケーションのテンプレート構造を指定して作成できます。要するに最初から、forms.pyとかadmin.pyのファイルが作られた状態のアプリケーションができあがるという話です。
describe_form
python manage.py describe_form guestbook.guestbook > guestbook/forms.py こんな感じに使えます。
generate_secret_key
settings.py に書く secret_key を作ってくれます。
graph_models
モデル相関図を表した GraphViz dot file を作ってくれます。
passwd
auth_user のユーザのパスワード変更ができます。
print_user_for_session
session key を渡すと中身を表示してくれます。
runserver_plus
runserver がパワーアップします。Werkzeugが必要ですが、デバッグが超便利になるかも。上記ブログのスクリーンキャストで紹介されてます。
shell_plus
個人的に今すぐ使いたいレベル。モデルを全部インポートした状態で、Python シェルを起動。
sqldiff
まだ実験段階っぽいけど。現在のモデルと実際の DB を比べて SQL の diff を出しくれる。

他にもまだあるっぽいです。JobsSchedulingっていうのが気になるけどまだ見てないです。あと、Field とか Model もあるみたいです。 TimeStampedModel っていう作成時間と更新時間が入ったベースモデルは割と便利かも。

というわけで Django は楽しいです。

Posted at: 
2008/10/29 23:35:58
2 Comments
1 TrackBack
Tags: 
Django
Trackback: 
http://blog.monospace.jp/2008/10/29/django_command_extensions/trackback/

Django Evolution で Model の変更をデータベースに反映させる その2

Stored evolutions

もうちょっとマニュアルを読んだので、 前回 の続きを書いてみます。前回は、

$ python manage.py evolve --hint --execute

で、実行しましたが、一旦ファイルに保存してから行う、 Stored evolutions という方法も試してみます。モデルを作って、変更するところまでは、まったく同じです。最初の syncdb を行って、モデルを変更した後、まず、guestbook アプリケーションディレクトリに evolutions ディレクトリ(モジュール)を作って、次のように evolve --hint の出力を evolutions ディレクトリ内のファイルに書き出します。

$ mkdir guestbook/evolutions
$ python manage.py evolve --hint > guestbook/evolutions/add_tags_and_is_public.py

evolutions/add_tags_and_is_public.py

#----- Evolution for guestbook
from django_evolution.mutations import *
from django.db import models

MUTATIONS = [
    AddField('GuestBook', 'tags', models.CommaSeparatedIntegerField, initial='', max_length=255),
    AddField('GuestBook', 'is_public', models.BooleanField, initial=True)
]
#----------------------
Trial evolution successful.
Run './manage.py evolve --hint --execute' to apply evolution.

あ、↑の最後の2行はいらないですね。消しておきましょう。次に、evolutions 内に __init__.py を設置します。 __init__.py には、↓のようなことを書きます。これは、実行する evolution ファイルのリストです。複数ある場合は、複数指定できます。

SEQUENCE = ['add_tags_and_is_public']

これで、

$ python manage.py evolve

を実行します。ここでは、単に、 evolve だけで大丈夫です。勝手に、guestbook アプリ内の evolutions モジュールを読み込んでくれます。で、以下のように出力されます。これは、 --hint のときの出力とほぼ一緒ですね。最後の1行が違います。

#----- Evolution for guestbook
from django_evolution.mutations import *
from django.db import models

MUTATIONS = [
    AddField('GuestBook', 'tags', models.CommaSeparatedIntegerField, initial='', max_length=255),
    AddField('GuestBook', 'is_public', models.BooleanField, initial=True)
]
#----------------------
Trial evolution successful.
Run './manage.py evolve --execute' to apply evolution.

evolve だけでは、実際の処理は行われないので、 --execute をつけて実行します。

$ python manage.py evolve --execute

yes と答えると、データベースに反映されます。前回と同じようにデータは無事に残っています。

sqlite> select * from guestbook_guestbook;
test|2008-10-13 14:46:31.744999|1|hfunai||1

これで、テスト環境での動作が確認できれば、本番環境でも同じように、 ./manage.py evolve を実行したらいいので、楽になりそうです。これは使える。きっと使える。次回は、SQL で evolutions を保存しておく方法の予定です。

Posted at: 
2008/10/15 04:31:34
0 Comments
0 TrackBacks
Tags: 
Django
Trackback: 
http://blog.monospace.jp/2008/10/15/django_evolution_2/trackback/

Django Evolution で Model の変更をデータベースに反映させる

久々に ReviewBoard をチェックしてたら、 Django Evolution を使ってることを知りました。んで、この Django Evolution は何をしてくれるものかと調べてみたら、 Model の変更をデータベースに反映させてくれるものってことが分かって早速試してみました。

とりあえず、適当にプロジェクト&アプリ作成。Djangoは、1.0 で動かして欲しいみたいです。

$ django-admin.py startproject djtest
$ cd djtest
$ python manage.py startapp guestbook # なんでもいいけど、 guestbook とかつくる。
$ vim guestbook/models.py # guestbook の Model を書く。

guestbook/models.py はこんな感じ。

from django.db import models

class GuestBook(models.Model):
    name = models.CharField(max_length=20)
    comment = models.TextField()
    posted_date = models.DateTimeField()

    class Meta:
        pass

    def __unicode__(self):
        return self.name

Django Evolution をチェックアウトしてプロジェクトディレクトリにコピー、 settings.py を書く。

$ svn checkout http://django-evolution.googlecode.com/svn/trunk/ django-evolution
$ cd django-evolution && cp -r django_evolution /path/to/djtest # プロジェクトディレクトリにコピー
$ vim settings.py # データベースの設定とかしつつ、 INSTALLED_APPS に 'django-evolution' を追加。

settings.py の変更したとこだけ。

DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = 'djtest'

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django_evolution',
    'guestbook',
)

とりあえず、これで一度、 syndb を。

$ python manage.py syncdb

sqlite> .schema guestbook_guestbook してみると、

CREATE TABLE "guestbook_guestbook" (
    "id" integer NOT NULL PRIMARY KEY,
    "name" varchar(20) NOT NULL,
    "comment" text NOT NULL,
    "posted_date" datetime NOT NULL
);

guestbook/models.py をちょっと書きかえました。tags と is_public の追加です。リレーションとかするとちょっとめんどそうなので、とりあえずあたりさわりなさそうな感じで。ちなみに必須フィールドは初期値を入れておかないとうまくいきません。この辺のことは次回調べてみようかと。

from django.db import models

class GuestBook(models.Model):
    name = models.CharField(max_length=20)
    tags = models.CommaSeparatedIntegerField(max_length=255, blank=True)
    comment = models.TextField()
    is_public = models.BooleanField(default=True)
    posted_date = models.DateTimeField()

    class Meta:
        pass

    def __unicode__(self):
        return self.name

ちなみに現在、以下のようなデータを入れてあります。

sqlite> select * from guestbook_guestbook;
test|2008-10-13 14:46:31.744999|1|hfunai

これで、

$ python manage.py evolve --hint --execute

yes と答えると、データベースに反映されます。以下のようにデータは無事に残っています。まあこれくらい簡単なのならね…

sqlite> select * from guestbook_guestbook;
test|2008-10-13 14:46:31.744999|1|hfunai||1

とりあえず、面白そうなのでいろいろと試してみますかね。

個人的に、 Django で開発するときは、いきなり Model にかきまくって、どんどん変更していくような開発をしているので、大変便利なのではないかと思ってます。というか使います。

Posted at: 
2008/10/14 05:17:19
1 Comment
1 TrackBack
Tags: 
Django
Trackback: 
http://blog.monospace.jp/2008/10/14/django_evolution/trackback/

知らなかった Vim の使い方をメモ

最近は、もっぱら screen + vim です。gvim は全く使わなくなりました。結局春頃に入れたプラグインも全然使ってなくて、素の Vim って感じです。で、ちょっと基本操作を見直したくなったので調べてみました。

↑のサイトで知らなかった&今後使おうをメモ。

$ vim file +54
ファイルを開いて 54 行目へ移動
:ls
バッファのリストを表示。まあ buffers 使ってたからそれでもいいんだけど。
80|
指定カラムへ移動。この場合は 80 行目へ。
Ctrl+y
Ctrl+e の逆スクロール。非常によく忘れて困る。
zt, zz, zb
現在行を画面の一番上、真ん中、下にもってくる。
CTRL-Z
vimをサスペンド。 :st でやってたけど、こっちの方がいいなー。
:10,20d
10行目から20行目を削除。すぐに VisualMode に頼ってしまうので…
g~~
現在行1行分で、大文字/小文字の切り替え。
g~w
カーソル以降の単語の大文字/小文字の切り替え。
<Ctrl-W>o
ウィンドウ分割してるときに、現在のウィンドウ以外を閉じる。
Ctrl+c
コマンドラインとかインサートモードとかビジュアルモードから抜ける。そういえばそうだった…
*
カーソル位置の単語を検索。たまに何か間違ってなってたけど、* だったのを知った…
#
カーソル位置の単語を逆方向に検索。これは知らなかった。

Vim は奥が深すぎます…。あと Vi でもやっていけるようになりたい。

Posted at: 
2008/10/13 03:52:56
0 Comments
1 TrackBack
Tags: 
vim
Trackback: 
http://blog.monospace.jp/2008/10/13/vim_tips_1/trackback/

HTML5 が面白そうなので追ってみることにした

経緯

Ajaxian » This Week in HTML 5: Web Forms 2, Search, and more

http://ajaxian.com/archives/this-week-in-html-5-e8

ずっとスルーしてた HTML5 ですが、↑で、Web Forms 2 なんておもしろそうなものが HTML5 には搭載されることを知ったので、ちょっと HTML5 関連を調べてみました。XHTML はどうなるのとおもってたら、↓の記事で分かりやすく解説してくれてました。

HTML5が持つ本当の意味 − @IT

http://www.atmarkit.co.jp/news/200801/25/html.html

つまり、 W3C の仕事の遅さにしびれをきらした Apple、Mozilla、Opera の人たちが、仕様作ったから採用しろと W3C に持ちかけたのが採用になっているようですね。最近のブラウザで使える Canvas 要素とかもこの辺の流れみたいです。ちなみに、 Canvas は、元々、MacOS の Dashboard のために作られたものだそうです。

日本にも情報サイトがありました。HTML5関連英文書の日本語訳とかすごく助かります。

http://www.html5.jp/

正式な勧告は 2010 年らしいのでちょっと先ですが、流れはこっちに向いてるっぽい?のでそろそろフォローしていこうかと。仕様は完全にかたまっていないので、どのブラウザでもほとんどの機能は実装されていませんが、 Operaは結構がんばってるっぽいんで、試してみようかな。

関連する日本語記事とか

Posted at: 
2008/10/12 22:34:56
0 Comments
0 TrackBacks
Tags: 
html
Trackback: 
http://blog.monospace.jp/2008/10/12/following_html5/trackback/

Mercurial Dev を実験台にしてパッチを送る方法を学んだ

事の発端

すでに4ヶ月前になりますが、こんなものを作っていました。

[追記 2008/10/12] 以下の URL に patch をあてて、monoblue を試す方法を書きました。

http://blog.monospace.jp/2008/06/07/hgweb_design_template/

しばらく放置…ののち

PATCH 形式でくれっていわれて、すぐに送るつもりだったけど、hgwebにグラフ機能がついたり、直す箇所とかもあって放置していたら、すでに10月でした。とあるメールがきっかけで勢いで作ってパッチを送ったんですが、見事に失敗…Mercurial Developers の ML にゴミを残してしまいました。

問題のポイント

Mercurial Developers の ML はいつも見てるので、パッチを送る場合は、[PATCH]とか複数の場合は[PATCH 1 of 3]みたいな感じで送ればいいんだなと認識してたので、そういう感じで作ってみました。今回のパッチは、すべてのファイルが新規ファイルで、10個以上のHTMLとCSSを含んでいるので行数にすると1400行くらいです。これをメールの本文に貼るのは、つらいと思っていくつかに分割してみました。(そもそもこれが間違いで、分割するのはChangesetが分かれてるときだけっぽい)。で、手動で3つに分けてGmailから送信。

なぜ分割したかという言い訳をちょっとしておくと、最初に1400行のまま送ったパッチがどうやら送信されなかったっぽい?ので容量オーバーかと思ったわけです。

ご教授頂く

自分が送ったパッチを見てくれた方が、Gmailからの送信のときに改行でおかしくなってるよと指摘してくれて、↓の Patchbomb という拡張機能を教えてくれました。この機能を見てちょっとはずかしくなったわけです。どうやら[PATCH 1 of 3]っていうのは、手動でやってるわけじゃなくて、この拡張を使うと勝手に changeset に分けてそういうメールを作って送ってくれるみたいなんです。使ってみてちょっと感動しました。

http://www.selenic.com/mercurial/wiki/index.cgi/PatchbombExtension

Twitter で長い URL を載せるときに自分で TinyURL に行って短い URL にして貼っていたのを思い出しました。勝手にやってくれるのを知ったときも衝撃でしたね。

パッチの問題はいろいろあるっぽい?

こんだけ大量のパッチがとびかってるとそりゃー大変でしょうね。↓こんなのがあがってました。パッチを送るときの心得みたいなものがのってます。本文にインラインで入ってるのが望ましいっていうのがちょっと意外だったんだけど、大量のパッチをさばくとなるとその方が楽なのかな。添付だと確かに開く手間がちょっとあるし。

http://www.selenic.com/mercurial/wiki/index.cgi/SuccessfulPatch

というわけで

Mercurial を使ってるプロジェクトでパッチをやりとりするならこの方法なのかな。本家がやってるくらいだから推奨なんでしょうね。

で、自分のパッチが採用になるかは分かりませんが、特にすごい技術力がなくても(たいしたデザインもしてないし、HTMLとCSS書いただけ)こうやってオープンソースのプロジェクトに参加できるんだなってことが分かったし、いろいろと勉強になります。英語とかも。目指せ世界進出。

Posted at: 
2008/10/10 04:00:06
3 Comments
0 TrackBacks
Tags: 
mercurial
Trackback: 
http://blog.monospace.jp/2008/10/10/mercurial_sending_patch/trackback/