ラジオコントロールヘリコプターのページじゃないよ。ぷろぐらまーの愚痴日記だよ
by f3c
カレンダー
S M T W T F S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
カテゴリ
最新のトラックバック
謎の男
from saaya_holic
みんなのPython
from 最新注目話題のアレって??
イーホームズ社長・架空増..
from ニュースな日々-オレ流徒然日記-
こんにちは
from 秋葉原 メイド喫茶
さて、今日か明日からファ..
from リーダー萌え♪
どうするの?小泉さん。靖..
from shigezoh blog
ネタ報告、ご意見:BBS消失

巡回ブログ集:
ビバの鉈(ナタ)でカチ割るぞ - ビバ氏


High Quality Life - token氏

高木浩光@自宅の日記 - JavaHouseの高木先生

メモ狭っ!
エキサイト分は↓の
専用項目で~~
フォロー中のブログ
ライフログ
以前の記事
その他のジャンル
ファン
記事ランキング
ブログジャンル
画像一覧
2007年 03月 12日
やっぱ動くと楽しいもんねぇ
最近仕事の内容がすごい管理っぽい事ばっかしてて
全然コードが触れない。

まぁ2つも同時にプロジェクトやりながら社内業務もやってりゃそうなるか・・・
年度末進行・・・恐ろしい子!!!

設計的なことはしてるので、別におもしろいっちゃーおもしろいんやけど、
なーんかこうねぇ。。。





コードが書きたいんじゃぁぁぁぁぁぁぁ!!!



というわけで、昨日今日とDjangoでアプリを作ろう!と思い立ち
作成方針やら、画面イメージやらつくってたけど、いやーWebページの
デザインってむずいね~。デザインセンス無いので苦労しまくり。

なんとかそれらしいTopの体裁が出来たので、
今日の夕方ごろからようやくurls.pyやらview.pyやらmodel.pyやら弄りだしました。
どうせ平日は忙しくて進められんと思うけど、
時間見てチマチマと作ってきたいなーと思う。

内容は、自分用スケジュール管理アプリ。実績のトレースとニコカレもおもしろそうなので
それっぽくできればいいな~とか思ったりなんかしたり。

うむ・・・三日坊主にならなければいいがw
[PR]
by f3c | 2007-03-12 00:37 | Django
2006年 10月 01日
勉強アプリのテンプレートを作りながら感じた事
少しはデザインもできないかんなぁ・・・と思った。orz

仕事の場合、大抵ベースデザインを他の人(デザインできる人)が作って~
って感じなので、自分で一からどうのこうのってのは、あんまやらんのですたい。

で、Django的にカッコイイやりかたはなんだろう?と思って
本家のHTML見たりAdminのテンプレート見たりDjengelのソース読んだり、色々したけど、
やっぱdivタグ&CSSでかっちょよくサイトデザイン!って感じらしい。

まぁねぇ。CSSわかるし書けるけど、見た目って難しいやん・・・
とりあえず、本家のCSSパクって進めるか!と思ってソース覗いたら

/*
djangoproject.com by Wilson Miner (wilson@lawrence.com)
Copyright (c) 2005 Lawrence Journal-World. Please don't steal.
*/

とのこと・・・ハイ。スミマセンデシタ。

とりあえずのっぺらぼうHTMLで進めよう。うん。。後でなんとかなるやろ。。
[PR]
by f3c | 2006-10-01 23:33 | Django
2006年 09月 24日
Windows環境で国際化ファイル作成時にエラーが出たら
今日勉強用Djangoアプリを弄ってて、modelで「_('')」を利用した
国際化対応をやってる時に、ちょっとしたエラーに出くわしたのでメモ。

まず、結論から。

Windows上でのDjangoアプリ開発時はCygwin&gettext-develを入れておきましょう。

と言う事がわかりました。

で、内容。

一通りコードを書いて、projectフォルダにlocaleフォルダを作成。
んで、poファイルを作る為にmake-messages.pyしたらエラーが出た。

$make-messages.py -l ja
processing language ja
errors happened while running xgettext on manage.py
'xgettext' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

どうやら内部で"xgettext"とやらを呼び出しているらしい。
xgettextって何ぞや?という時はここ「gettextメモ」でよくわかった。
そうすると、xgettextを何とかして手に入れなきゃいかん。という話になるんやけど、

・Cygwinでインストール。
・xgettext.exeを何処からか探してきてパス通る所に置いておく。


の2通りになる。
そうするとCygwinの方が、探す手間とかupdateの手間を考えると楽。

自分はCygwinは入れてたんやけど、"gettext"しか入れとらんかった。
"gettext-devel"を入れると"xgettext"も入る。

んで後はmake-message.pyとcompile-message.pyまでやれば、
moファイルも出来て、めでたしめでたし。となります。

あ、poファイルのCHARSETをちゃんと変えるのを忘れずに!!
[PR]
by f3c | 2006-09-24 19:16 | Django
2006年 09月 17日
Djangoの勉強会
Django勉強会 Disc0とのこと。

Django-jaでメールが来てたけど、
さすがに旅行帰りの次の週で有休は厳しい&納品近いので見送り・・・

連休はぷちぷちDjengelみたりなんかをなんかしたりするか~
[PR]
by f3c | 2006-09-17 15:00 | Django
2006年 09月 02日
My! Djengel!!

LLRingのDjango製アプリ(フライング)
で、LLRingで露木さん&徳嶋さんが作ったDjango製の家計簿アプリが公開されてた。

最近ちまちましかDjango弄れてないけど、良いサンプル降って来た!!
と、早速ゲットして解凍&Readme.txtを読む読む・・・
動作させるためには、以下のものが必要です。

 PostgreSQL:MySQLでも動作するかもしれませんが、未確認です。集計で敢えて生SQLを利用したため+デフォルトデータとしてバックエンドごとにフォルダを用意しなかったため自動でPKをインクリメントするタイプのバックエンドでしかインストールができません。Oracleを利用している方は、/djengel/squander/sql/expenseitem.sqlを修正してください。
うぐぅ・・・PostgreSQLか。MySQLならあるんやけどな~
とりあえず意外となんとかなるかもしれんと思って、syncdb&runserver後、
実行させてみるも・・・撃沈!
syncdb自体は問題なく行ったみたいなんで、やはり
集計で敢えて生SQLを利用したため
のあたりが利いとるんやろか。ウムム。

・・・まてよ。これはDjangoのDB周りを勉強する格好の教材になるんちゃうか?!

ということで、DjengelをMySQLで動作させてみよう!


を、もうちょいで稽古の時間なので、帰ってきて夕飯食って、疲れて寝なければ書く!!!
FF3やりながら寝かけたけど、忘れないうちに書こうと思って起きた。

そんなわけで、エラーになるんだけど、runserverやってるコンソール上に
(Windowsでやってるのでコマンドプロンプト上にだけど)SQLがずらっと出てる。
これが生SQL部ですな。たぶん。

んで、Djangoなので、models.pyみればわかるだろっちゅことで、
squander/models.pyを開くと~


_sum_sql = """
SELECT to_char(o.pay_date, %s) as pay_date, ei.name as name,
sum(o.amount) as amount, ei.id as ei_id,
ei.max_amount as max_amount
FROM squander_outgoing o, squander_expenseitem ei
WHERE
o.expense_item_id = ei.id AND
o.pay_date >= to_date(%s, 'yyyy/mm/dd') AND
o.pay_date < to_date(%s, 'yyyy/mm/dd')
GROUP BY to_char(o.pay_date, %s), name, ei_id, max_amount
ORDER BY pay_date, ei_id"""


これっぽいっすね。
見た感じ、to_char関数がMySQLに無いらしい。date_formatに置き換えて、フォーマット文字も"%Y/%m"とかに置き換えてやる。
保存した時点でサーバが勝手にmodels.pyを更新するので、ブラウザをリロードすると・・・
b0038859_2363598.jpg

'Y'??フォーマット文字列をちょっと弄ってやると'y'とかにエラーが変化する。
でも、最初にコンソールに出たSQLをエディタで同じように書き換えて
phpMyAdmin経由でMySQLに投げても正常に通る・・・

どうやらこのこの辺は_get_summarycursor.executeあたりを調べんとわからんぽい。

が、しかし・・・日本語訳のデータベース API (The database API)を見たけど、
よくわからず・・・うぐぅ。
Google先生に色々キーワードを投げてみたら、日本語訳のカスタムSQLの実行
にたどり着いた。

なるほど。executeの第二引数には%sとかへの置き換え文字列がつっこめるらしい。
んで、%sが4つあるから_get_summaryの第二引数も4つあるのか。

%sねぇ・・・%Yを置き換え文字と勘違いしとるんかなぁ・・・??

(稽古の時間が迫ってることもあり)executeの置き換え規則の詳細にたどり着けなかったけど、
特殊文字のエスケープっつったらまずは同じ文字2回書きだろ!!
と安直にこんな感じにしてみる。


#MySql
_sum_sql = """
SELECT date_format(o.pay_date, %s) as pay_date, ei.
name as name, sum(o.amount) as amount, ei.id as ei_id,
ei.max_amount as max_amount
FROM squander_outgoing o, squander_expenseitem ei
WHERE
o.expense_item_id = ei.id AND
o.pay_date >= date_format(%s, '%%Y/%%m/%%d') AND
o.pay_date < date_format(%s, '%%Y/%%m/%%d')
GROUP BY date_format(o.pay_date, %s), name, ei_id, max_amount
ORDER BY pay_date, ei_id"""


・・・通ってしまった!!w

と、いうわけで、MySQLで無事Djengelが稼動!!

細かい事は今から調べますw

----
追記1:フォーマット文字のエスケープは、みんPy 139ページに載ってた。みんな読もうw
追記2:expenseitem.sqlの件はMySQLだとBoolはtinyint(1)になるので、0=False,1=Trueらしい。以下で通った。

insert into squander_expenseitem(name, food_cost, visible)
values ('衣服費', 0, 1) ;
insert into squander_expenseitem(name, food_cost, visible)
values ('食費', 1, 1) ;
insert into squander_expenseitem(name, food_cost, visible)
values ('住居費', 0, 1) ;
insert into squander_expenseitem(name, food_cost, visible)
values ('電気 ガス 水道', 0, 1) ;
insert into squander_expenseitem(name, food_cost, visible)
values ('レジャー費', 0, 1) ;
insert into squander_expenseitem(name, food_cost, visible)
values ('雑費', 0, 1) ;


追記3:cygwinにpatchutil入れてなくて作るのに手間取った・・・
調子こいてdjengel mysql対応patchを作ってみた。
djengelフォルダと同階層にpatchおいて

patch -p0 -d . -E < djengel_mysql_20060903.patch


で、どうぞ。たぶん大丈夫・・・だとおもう。
先にあやまっとこう。変なふうになったらごめんなさい。
djengel_mysql_20060903.patch
[PR]
by f3c | 2006-09-02 17:54 | Django
2006年 05月 20日
結局テンプレートをいじった
来週納品があって、ちょっと忙しいのですが、
仕事中もDjangoのobjects中身がどうなってるのか気になってしょうがないf3cです。
仕事しろ?いや全くその通りです。スミマセン。

前回のインライン編集なフィールドをcollapseにするには?ですが、
結局テンプレートをいじることにしました。

Model&DBAPIの部分は管理者画面を作りながらshellもいじりながらで
ちょっとずつ感覚がつかめてるきがする(だけかもしれ)んですが、
テンプレートはチュートリアルでちょろっといじっただけ。

つか、ファイルコピって別フォルダに置いて編集してパス通せば勝手に見てくれる

レベルだったので、全然わからん。
とりあえず当たって砕けろでcdjango/contrib/admin/templates/adminを覗く。
b0038859_17201455.jpg

むーー。管理者画面の編集画面ではどのテンプレが呼ばれるんだ。
とりあえずファイル名からそれっぽいものを一通り開いてやった。

  • change_form.html

  • edit_inline_stacked.html

  • edit_inline_tabular.html

たぶんchange_form.htmlが変更画面で、
edit_inline_....がインライン編集で使われるやつなんだろう。と勝手に思う。
change_list.htmlも見たけど、なんか違うっぽい気がした。

実際にHTMLとしてブラウザに表示されている画面のソースも見ながら、
Show - Hide やってるとこを調べるとー

fieldsetタグの辺りが怪しい。
普通の方

<ieldset class="module aligned ()">
<h2>Entry Information</h2>



隠す方

<fieldset class="module aligned collapse">
<h2>Details</h2>



んで、そこに該当しそうなchange_form.htmlの個所

<fieldset class="module aligned {{ bound_field_set.classes }}">
{% if bound_field_set.name %}<h2>{{ bound_field_set.name }}</h2>{% endif %}



あーー

{{ bound_field_set.classes }}

とかいうのがmodels.pyの

fields = (('見出し', {'classes': 'collapse',}).)

あたりをみとるんかな
bound_field_setはbound_field_setsとかいうのの要素らしいが
どこをどーなるとこのfieldsが見られるのかまでは追えず。
まぁいいや。

あとはedit_inline_tabular.htmlとかをコピって自分のtemplatesに置く。

んで開いて~

この部分を

<fieldset class="module">
<h2>{{ bound_related_object.relation.opts.verbose_name_plural|capfirst }}</h2>



こうする。

<fieldset class="module aligned collapse">
<h2>{{ bound_related_object.relation.opts.verbose_name_plural|capfirst }}</h2>



とりあえず直書き
まぁ最初はこんなもんでしょ。

んで、パスとおして・・・
b0038859_17462129.jpg

完成!!
開いたときに、ちょっとスタイルが変な気がするが、まぁおいおい考えようw
[PR]
by f3c | 2006-05-20 17:36 | Django
2006年 05月 15日
やべー。おもしれーー
こんな時間になってしまった・・・
Modelいじるだけで管理者画面ぶりばり変わるのおもしれー!

edit_inline=modelsなフィールドを
リレーション元画面でcollapseなフィールドとして表示するには
どうしたらいいか調べようと思ったけど、もういい加減今度にしないと、
「明日起きれない自信があります!」な状態になりそうなので寝よう。

他の日記はまたこんどにしよう・・・orz
[PR]
by f3c | 2006-05-15 02:03 | Django
2006年 05月 05日
Django Trank最新版をWindowsで試す2
前回のスタイルが当たらなかったのは、
どうやらサーバがリロードとかしてて忙しかったので
レスポンスが返せなかったからっぽいでした。

んではチュートリアル第三弾。
公開用ページの作成をしてみまっしょう。

なになに。まずは、URLの設計か。
要するに、何のURLが指定されたら、何を返すかってのを決めるんやね。
とりあえずサンプル通りに進める。
urls.pyを編集してrunserver

urls.pyはこんな感じ。

from django.conf.urls.defaults import *

urlpatterns = patterns('',
# Example:
# (r'^myproject/', include('myproject.apps.foo.urls.foo')),
(r'^polls/$', 'myproject.polls.views.index'),
(r'^polls/(\d+)/$', 'myproject.polls.views.detail'),
(r'^polls/(\d+)/results/$', 'myproject.polls.views.results'),
(r'^polls/(\d+)/vote/$', 'myproject.polls.views.vote'),

# Uncomment this for admin:
(r'^admin/', include('django.contrib.admin.urls')),
)


色んなリクエストを叩いてみると、定義している以外のは404に、
定義しているのはviewがまだねぇよ!エラー画面になった。
ふむふむ。なるほどなるほど。
んで、このurlが指定された結果の関数をviews.pyに定義するんか。
indexとdetailを追加して・・・

from django.http import HttpResponse

def index(request):
return HttpResponse("Hello, world. You're at the poll index.")

def detail(request, poll_id):
return HttpResponse("You're looking at poll %s." % poll_id)


おぉでたでた。
Hello,worldとリクエストで渡したID2つがでた・・・
ってModel噛んで無いから、ただ表示させただけやねこれ。

でも、この動作は基本的でかつ重要なことな気がする。
いろいろURL変えていじってみる。

んで、次はModelを使ってみるらしい。
チュートリアルのコードを書き写して・・・ブラウザをリロード。
テンプレートがない。とエラーがでるので、テンプレートをつくるんやね。
setting.pyにテンプレートパスを定義して~
指定したパスにpolls/index.htmlをつくる。。と。

んでリロード!・・・テンプレートが見つからん。とエラー。
なぜ??とおもってエラーを見てみると、どうやらindex.htmlじゃなくてindexを探しに行ってるらしい。

まさかとおもって、テンプレートファイル名をindex.htmlからindexに替えてみると・・・

ちゃんと出た。
今度は逆に、indexを消してindex.htmlに戻し、
テンプレート取得部を次のように替えてみる。

t = loader.get_template('polls/index.html')


ふむふむ。ちゃんとでますなぁ。
厳密に定義するように変わったのかな?
とりあえず、DBからPollの一覧を取ってきて、画面に出すと言う事が出来たくさい。
あとは404画面やらショートカット(DRY原則ってやつか)を使ったレスポンスの返し方を一通りやった。

今までDjangoの処理プロセスが全然わからんかったけど、
ここまでやると大体わかってきた気がする。うん。たぶん。
こんなかんじかな?

  • settings.py : アプリケーションの色んな設定

  • urls.py : リクエストに対して、views.pyの何を呼べばよいかを定義する。

  • views.py : urls.pyから呼び出される。
    Modelから値とってテンプレートに貼り付けて結果を帰す。

  • models.py : モデル定義。ここがアプリのキモ。

  • テンプレート : views.pyから呼び出される。
    Modelの処理結果を貼り付けるテンプレート


よくいじりそうなものは、
urls.py,views.py,models.py,テンプレート。
settings.pyは最初にちょっと触って後はたまにしかいじらなさそう。

最後はフォームのチュートリアルがあるけど、
ざっと見た感じ、さっきやったurls.py, views.py, テンプレートと、Djangoのクラスの応用っぽい。

ある程度めんどくさいことは用意してあげるよ的な感じなので、
作ってて疲れないというか、コード書く量がすくないから楽何かな?
しばらくチュートリアルで作ったアプリをいじったら
なんか一個自分でつくってみようかな~~
[PR]
by f3c | 2006-05-05 17:26 | Django
2006年 05月 03日
Django Trank最新版をWindowsで試す
そんなわけで、DjangoのTrankから最新版を試す。

前回の触るシリーズをやった後なので、環境は次の感じ。

・Windows環境(XPSP2)
・Python2.4インストール済み(日本語パックもいれた)
・コマンドプロンプトでpythonって打つと動くようにパス設定済み
・Django-0.91をインストール済み
・MySQLがLinux別マシンにインストール済み
・ブックマークにhttp://djangoproject.jp/が入ってて
 こないだの記事がピックアップされててビビり済み

まぁMySQLの代わりにWin版PostgreSQLとか入れるといいらすぃけど、
既にあるので、MySQL使ってます。えぇ。

あとは最新版を取ってくるためのSVNクライアントが無いので、インストール。
よく使うTortoiseCVSのSVN版のTortoiseSVNと言語パックを持ってきて入れる。
で、設定画面で日本語に・・・ならん。何故か英語のままだ。
まぁいいか・・・なんとなくわかるし。

適当にDLフォルダを作成し、
Export->リポジトリURLにhttp://code.djangoproject.com/svn/django/trunk/->Headリビジョン->OK
で最新版をゲット。

んで、落ちてきたファイルのINSTALLをみると
Thanks for downloading Django.

To install it, make sure you have Python 2.3 or greater installed. Then run this command:

python setup.py install

For more detailed instructions, see docs/install.txt.

とあるので、そのままやってみる。

$cd django-trunk
$python setup.py install
The required version of setuptools (>=0.6a10) is not available, and
can't be installed while this script is running. Please install
a more recent version first.


えーー。何かいるんか。setuptools入れろってか。
あくまでもWindowsで進めたいので、setup.pyは使えんっぽいなー
まぁ考えても仕方が無いので、素直に日本語ドキュメントのお世話になる
http://ymasuda.jp/python/django/docs/install.html

ほっほー。
site-packagesにシンボリックリンクか・・・
Winにはlnないからなぁ。。ショートカット置いてもしょうがないだろうし。。

というわけで、そのままコピって置いてやる事にした。
落としてきたtrankフォルダのdjangoフォルダをC:\Python24\Lib\site-packagesにコピー。
んで、前インストールしてた0.91のDjango-0.91-py2.4.eggフォルダを
なんとなく競合しそうな気がするという理由から移動(消してもいいけど?なんとなく。)

んで、django-admin.pyが使えなくなっちゃうので、
環境変数パスを書き換えてC:\Python24\Lib\site-packages\django\binを見に行くようにする。

あとは、前回まで頑張って編集したmyprojectをバックアップに移動しておいて、

$django-admin.py startproject myproject


してmyprojectフォルダ&スッキリした.pyファイル達が見れれば完了~

※イタリック部は自分の環境にあわせて。

まぁ適当にやったけど、結果オーライで。うん。
ざっと見た感じ、階層がシンプルになったんかな?

とりあえず、日本語ドキュメントのチュートリアルを開いて
前回やった管理者サイト構築までの流れをざっと見てみる。
http://ymasuda.jp/python/django/docs/

んで、myprojectをいじる。
やっぱちょっと違う所があるなぁ~ふむふむ。あ。DBまっさらにしてないや。
0.91の時に作ったテーブルがそのままだったので、phpMyAdminからばっさり消してやる。
んで、syncdbしてやる。

$python manage.py syncdb
Creating table auth_message
Creating table auth_group
Creating table auth_user
Creating table auth_permission
Creating many-to-many tables for Group model
Creating many-to-many tables for User model
Creating table django_content_type
Creating table django_session
Creating table django_site

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username: username
E-mail address: hoge@example.com
Password:
Password (again):
Superuser created successfully.
Adding permission 'group | Can add group'
Adding permission 'group | Can change group'
Adding permission 'group | Can delete group'
Adding permission 'user | Can add user'
Adding permission 'user | Can change user'
Adding permission 'user | Can delete user'
Creating example.com Site object
Adding permission 'site | Can add site'
Adding permission 'site | Can change site'
Adding permission 'site | Can delete site'


0.91のinitとcreatesuperuserやってるみたい。
でもコマンドがsyncだから、足りてない事を勝手にやってくれてる。
って感じなんかな。

あと、startapp pollsしたりモデルいじったりして一通り堪能。
なんかたまに日本語コンテンツ表示させるとスタイルが当たらなかったりしたけど
お腹減ったのでご飯食べてあした考える事にする。。
[PR]
by f3c | 2006-05-03 20:45 | Django