pho@自習室

2011-06-30

Djangoでカレンダー

| 00:12

カレンダー機能をつけようってことになって、Javascriptでつくるかpythonでつくるか迷ったけど、pythonにHTMLCalendarなんて便利そうなものがあると知ったので、とりあえずpythonでつくることにした。HTMLCalendarの動作はこんな感じ。

import calendar

myCal = calendar.HTMLCalendar(calendar.SUNDAY)

print myCal.formatmonth(2009, 7)

html - python calendar.HTMLCalendar - Stack Overflow

引数に年と月を入れたら、HTMLのテーブルでカレンダーが返ってくる。便利そう。

これをDjangoでどう実現したらいいかなと思って探したらあった。

http://journal.uggedal.com/creating-a-flexible-monthly-calendar-in-django/

ここではmodels.pyとviews.pyのみが紹介されている。テンプレートについては

{{ calendar }}と書けばどこにでも挿入できるので明記されていない。

でもこれだけでは動かなくて、models.pyにWorkoutsというclassが必要。

class Workouts(models.Model):
    my_date = models.DateTimeField(auto_now_add=True, auto_now=False)
    workout = models.CharField(max_length=255, null=True, blank=True, verbose_name=_('workout'))

みたいなのがあればいいと思う。一つ思ったのは

field = lambda workout: workout.performed_at.day

の最後の部分はworkout.my_date.dayにしないといけないと思った。

get_absolute_url()も設定しておく必要がありそう。

これをカスタマイズしてカレンダーを作っている人がいたので参考にした。

http://drumcoder.co.uk/blog/2010/jun/13/monthly-calendar-django/

こっちはスタイルシートもあって、前の月、次の月への移動もできる。

この他、文字列操作が必要だったのでいくつかのサイトを参考にした。

文字列の長さを取得

http://www.pythonweb.jp/tutorial/string/index8.html

文字列の一部を取り出す

http://d.hatena.ne.jp/yumimue/20071223/1198407682

datetimeから年月日を取得

http://www.yukun.info/blog/2008/06/python-date.html

ちなみにlambdaはこんなふうに使うらしい。

http://atkonn.blogspot.com/2008/02/python-python27-lambda.html

カレンダーはそんなとこ。

2011-06-09

初心者向けDjangoチュートリアルいろいろ

| 01:04

Djangoチュートリアル検索していろいろ試して、なんとなく雰囲気がつかめたので実際に新機能を作っているところ。

https://docs.djangoproject.com/en/dev/intro/tutorial01/

これは、けっこう丁寧でわかりやすい。Pollというアプリで投票できるようにするというもの。基本中の基本かな。

http://www.webmonkey.com/2010/02/get_started_with_django/

2010年2月のもの。DeliciousAPIを使って自分の最新のブックマークを引っ張ってくる例が良かった。ただソースコードコピペしにくくて残念。インデントが崩れて非常に面倒くさい。ちなみにpythonのインデントがどのくらい重要かってのは、これがわかりやすかった。

http://codezine.jp/article/detail/1617

コーディングスタイルは、ここがわかりやすかった。

http://docs.python.org/tutorial/controlflow.html#intermezzo-coding-style

ここを参考にしてmacvimの設定ファイルをpython向けにカスタマイズ。これ重要。

http://d.hatena.ne.jp/bellbind/20091109/1257723740

http://www.djangorocks.com/tutorials/how-to-create-a-basic-blog-in-django.html

webmonkeyではDeliciousの情報は引っ張って来れたけど、なぜかうまくブログが表示できなかった。それでDjangorocksのブログを作るチュートリアルをやってみた。こっちならできた。ただ更新がDjangoのadmin画面を利用していたのが残念。その方が簡単なのはわかるけど、自分が知りたいのはフォームを使ってどうやってアップロードして、情報を処理するかなので。

http://www.lightbird.net/dbe/index.html

Django1.2向け。画像をアップロードするやり方が参考になった。Djangoのドキュメントでもやり方は書いてあるけど、最初から最後まで手取り足取り書いてくれてるチュートリアルってのは、初期段階で非常に参考になる。

https://docs.djangoproject.com/en/dev/topics/http/file-uploads/

https://docs.djangoproject.com/en/dev/topics/forms/

フォームを使ったファイルのアップロードは本家を参考にして学んだ。

http://www.djangobook.com/en/2.0/

なにげにこのDjango Bookがいい。他のドキュメントに出てない例とか書いてあって参考になる。Formの項では検索用のクエリなども取り上げられていて、これから調べたいと思っていたところなので助かる。切り口の違う資料があるってのはいいものだ。

  • 時刻取得と数値から文字列への変換

http://stnhm.posterous.com/python-datetime

http://www.pythonweb.jp/tutorial/string/index9.html

ファイル名をどうしようかなと思って、とりあえずミリ秒にしてみた。

感想

10日くらいひたすらチュートリアルをやって感じたこと。

少しずつちびちびやっても忘れてしまうので、集中して一気にできたのは良かった。

pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start & (DB動かす)
createdb mydb(mydbというDBを作成)
django-admin.py startproject mysite (mysiteというプロジェクトの立ち上げ)
cd mysite
mvim setting.py(DBの設定ー>engineとDBname)
python manage.py syncdb(DBの同期)
python manage.py startapp myapp(myappというアプリの作成)
mvim myapp/models.py(モデルの作成)
mvim setting.py(installedappsにmyappを追加)
python manage.py sql myapp(DBにモデルの内容を反映させる)
python manage.py syncdb(同期)
mvim urls.py(admin作成のため数行uncommentにする)
python manage.py runserver(ブラウザで見られるようにする)
mvim setting.py(テンプレートまでのパスを書く)
mvim urls.py(urlパターンを書く)
mvim myapp/views.py(どんな処理をするか書く)
mkdir templates
mvim templates/mysite.html(テンプレートファイルの作成)
python manage.py runserver(サーバー起動)
できあがり(だったらいいな)。いろいろ遊ぶ。
pg_ctl -D /usr/local/var/postgres stop(終わったら一応DB止めてる)

てな感じの流れにようやくなじんできた。

2011-05-31

Djangoチュートリアルその3とその4

| 23:22

エラーメッセージががんがん出始め、チュートリアル2で表示できていたadmin画面まで表示できなくなり、なんかおかしいと思ったら、英語版がDjango1.3で日本語版がDjango1.0だった。

from django.conf.urls.defaults import *

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    (r'^polls/$', 'polls.views.index'),
    (r'^polls/(?P<poll_id>\d+)/$', 'polls.views.detail'),
    (r'^polls/(?P<poll_id>\d+)/results/$', 'polls.views.results'),
    (r'^polls/(?P<poll_id>\d+)/vote/$', 'polls.views.vote'),
    (r'^admin/', include(admin.site.urls)),
)

のimportの後が*ではなく3つ指定されていたり、urlpatternsのそれぞれの括弧の前にurlがついていたりして微妙に違う。3が一応終わったところで、英語版のチュートリアルを最初からやり直した。だいたいDjangoでdebugをONにしていたら出てくるエラーメッセージで検索して解決した。

Error: No module named pollsdjango.contrib.admin

Error: No module named pollsdjango.contrib.admin

なんてのもあった。コンマ忘れ。

CSRF verification failed. Request aborted.

Django 1.2 CSRF verification failed - Joshua Gourneau

settings.py を編集した。Part4の最後でvoteした後に投票結果のページが表示されず悩む。

return HttpResponseRedirect(reverse('polls.views.results', args=(p.id,)))

Writing your first Django app, part 4 | Django documentation | Django

これがmysite.polls.views.resultsにしないと表示されなかった。

dotcloud

ramen-on-dotcloud$ dotcloud push ramen.www .

404 : Docker

のramen.wwwと.の間に半角スペースがあることに気づかずにてこずる。

チュートリアルの最後のstagingで

SSL error: wrong version number

expected authentication request from server, but received S

というエラーが出た。どうしようか。

追記:ポート番号が間違ってただけだった。infoで出てくる番号を書いておかないと。

2011-05-30

Djangoチュートリアルその1とその2

| 19:37

何を思ったかDotCloudのチュートリアルからDjangoを学ぼうとして、

ramen-on-dotcloud$ django-admin startproject ramen

404 : Docker

初っ端で詰まる。django-adminが見つからない。locateで探した。そもそもlocateのデータベース更新ってどうだっけとなり、

sudo /usr/libexec/locate.updatedb

http://matsuesns.jp/blog_entries/1660

で解決したが、パスは通ってて原因不明。諦めてDjangoチュートリアルをやった。

コマンドラインから、コードを置きたい場所に cd して、 django-admin.py startproject mysite を実行してください。現在のディレク トリに mysite ディレクトリが作成されます。

はじめての Django アプリ作成、その 1 — Django v1.0 documentation

django-adminではなくdjango-admin.pyってやらないと動かないのかと知る。ここでそろそろエディタを入れようかと思い、brew install emacs --cocoaとやるが、Xcode4が入ってるからか知らないけどインストールできず。知識もこだわりもないのでbrew install macvimでmacvimをインストール。今日はmvimをよく使った。Djangoを動かす前にPostgreSQL

pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start &

setting.pyで

DATABASE_ENGINE -- 'postgresql_psycopg2'

チュートリアル1はそんな感じで、あとはコピペでだいたいうまくいった。

チュートリアル2は、微妙に違ってるところがあってわりと大変だった。django1.3のurls.py。

from django.conf.urls.defaults import patterns, include, url

# Uncomment the next two lines to enable the admin:

from django.contrib import admin

admin.autodiscover()

urlpatterns = patterns('',

# Examples:

# url(r'^$', 'negi.views.home', name='home'),

# url(r'^negi/', include('negi.foo.urls')),

# Uncomment the admin/doc line below to enable admin documentation:

url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

# Uncomment the next line to enable the admin:

url(r'^admin/', include(admin.site.urls)),

)

こんな感じで4行"#"を削除しないと動かなかった。

もう一カ所ひっかかったのが、admin画面にPollだけでなくChoiceを表示するところ。

from mysite.polls.models import Choice

admin.site.register(Choice)

この一行目は不要。入れたらエラーメッセージが出る。そのくらい。

vimコマンドをもうちょい覚えようかと。http://www.7key.jp/software/vi.html

2011-05-28

Djangoでwebアプリケーション OS Xでの環境構築

| 01:08

作りたいwebサービスを思いついたけどスキルが何もないので、友達が一人で立ち上げたベンチャーに転がり込むことにした。場所は大学のインキュベーション施設。月曜日に遊びに行ったところ、好きなときに来ていいよと言われ、どんな環境でやってるとかどんなコードを書いているのかとか見せてもらった。その友達はwindows上でいろいろやってるので、とりあえずmac上で同じことをやってみることにした。

pythonEclipseDjangoインストール。python2.7.1をパッケージからインストールしたら思ったところに入らなくて、Djangoはpython2.6の下に入ってしまって困った。結局削除して、homebrewを入れて、homebrew経由でやり直すことにした。

まずXcode4をインストールした。3でも良かったけど5ドルくらいなんで4で。シンガポールの貧弱な回線で頑張って4.5GBダウンロードXcodeはそのままでは表示できず、パッケージの内容を表示しないとインストールできないという罠があった。それからhomebrewインストールmac portsとか不要なフォルダとかいろいろ削除してからインストール。なんでもbrew installで入るので非常に便利。pythonDjangoも問題なく入った。Djangoeasy_installでインストール。これも便利。それからEclipsePyDevも入れた。よくわかんないけど入れておこうかという程度。break pointを挿入してdebugとかしてるのを見ると、けっこう便利そうって思った。

次に、bitbucketでコードを管理するので、そのリポジトリをローカルに作った。最初TortoiseHGインストールしようとしたが、windowsソフトウェアを無理矢理macに移植しようとしたものらしく、半端じゃなくインストールが面倒でしかも途中で詰まった。よく考えてみれば、同じ機能がある別のソフトでもいいわけで、ちょっと探したらMacHGがよさげな感じだったのでインストールした。MacHGはGUIの部分だけなのでMercurialインストールeasy_installでらくちん。

PATHの設定がよくわからなかったし、viを完全に忘れてたのでちょっと確認。./bash_profileを変えればいいと知る。vi手軽に編集

ローカルでDjangoを動かすため、PostgreSQLインストールPostGISも使うと言われたのでそっちもインストールbrew install postgisで両方入ってしまうのが素晴らしい。インストールしてもどう動かすのかわからなかった。イニシャライズして実行すればいいようだ。dbのユーザー名とパスワードを設定するやり方を調べて見つけた。必要そうだったのでPsycopg2インストールpythonpostgreSQLをつなぐらしい。Djangoでさらに自由にPostgreSQLを操作するためsouthインストール。そこでpostgreSQLを動かしてみようとして、createdb -T template_postgis my_spatial_dbとやったが、template_postgisが見つからないと言って怒られた。ここに書いてあることを順にやっていってから再び上のコマンドを打つとうまくいった。

あと画像処理に必要ってことでjpegを入れた。PILはpipを使っていれた。そのあたりで環境再現終了。友人が3ヶ月かけてつくったレシピサイトをローカルで実行できたので、いろいろ写真をアップロードして遊んだ。

こういう機能があったらいいんじゃね?って言ったら、作ってみる?って言われたのでそういう方向へ。とりあえずDjangopythonチュートリアルをやりながら考えよう。ipythonがいいよと言われたのでpip経由インストールした。あと数値計算もやりたいのでScyPyも入れてみた。この一週間でやったのはそんなとこ。まだカードキーはもらってないけど、机も用意してもらった。純粋にこういう取り組みって楽しいなと思う。