なんか日記
そろそろJython本を仕上げないとヤバイらしい。
= 朝ご飯:爽快ビタミン+昼ご飯:鰻丼弁当+おやつ:ネオビタミン&人参エキス +晩ご飯:とろろオクラそば+夜食:ネオビタミン
無理矢理栄養補給。 でもさすがに体はだいぶ楽になった。
精神的ドーピング:2倍速再生
= 駅の吊り広告でハリーポッターの宣伝をしていて、 何気なく見たらハーマイオニーの髪が黒くなっていてびびった。
よく見たらハーマイオニーじゃない気もしてきた。
ハーマイオニーは死んだのかな…。
= 吊り広告。
「変身忍者嵐」
どう見ても忍者に見えない。
「忍法変化の術が覚醒する。時代劇風仮面ライダー、今ここに復活!」
なるほど。
= doukakuでは、コメントの本文をbody、 それから適当な処理をしたものをbody_htmlとし、 body_htmlを使ってレンダリングをしている。 今のところまだマークアップとかは入れていないので、 不等号などをエスケープしてpreタグで囲むだけ。
で、一覧ページでは__str__の表示をしているが、 bodyを生で使っているのでタグが通ってしまうことが指摘された。
とりあえず入り口でbodyもエスケープすることにしてみた &今までのエスケープされていないものもきちんと表示するために、 表示部分にもエスケープを入れた。
よく考えたらいわゆる「あってはいけないものを取り除く処理(サニタイズ)」と違って、 エスケープは2回掛けると二重にかかってしまう。 これじゃダメだ。
面倒がらずに古いデータの変更をする必要があったんだな。。
この手の問題に対する王道はなんなんだろう。 よく考えてみるとユーザが任意の文字列を挿入できるフィールドに JavaScriptとかで変なものを仕込めば、 管理者が管理画面でそれを見たときに発動して破壊行為をするようなことも可能か。 管理画面で表示されうる文字列はもれなく無害化しておく必要があるのかな。 もしくは__str__などはもれなく無害化してから出力するようにしておくか。
= GoogleAnalyticsの結果を見ると面白い。 アメリカ国内だとカリフォルニア州がだんとつ。 [あとでスクリーンショット貼る]
= なんかこんなバッチファイルを書いた。
perl -e %1 php -r %1 ruby -e %1 python -c %1で、こうやって使う。一番上の行だけが自分で入力したもの。
C:\>for4.bat "print (0 or 1);" C:\>perl -e "print (0 or 1);" 1 C:\>php -r "print (0 or 1);" 1 C:\>ruby -e "print (0 or 1);" 0 C:\>python -c "print (0 or 1);" 1で、なんでRubyだけ結果が0なのか、それが理解できない。
Rubyは0が真なんだそうな。
ちなみにこうやるとPythonだけ結果が違う。
C:\>for4.bat "print 0 or 1;" C:\>perl -e "print 0 or 1;" 0 C:\>php -r "print 0 or 1;" 0 C:\>ruby -e "print 0 or 1;" 0 C:\>python -c "print 0 or 1;" 1これは他の言語が「(print 0) or 1」なのに対し、Pythonは「print (0 or 1)」だから。
最後のセミコロンを削るとPHPだけパースエラーになる。
だれかPerlだけ挙動が違う例を教えてください(笑)
= Djangoのフィード配信システムを使ってフィードを作っているはずだけど、 IEではダウンロードになってしまうというフィードバックが。 うーん。 何がいけないんだろう。
= 7月6日に露木さんと常山さんに教えてもらった、 スクリプトからDjangoのデータベースAPIとか使う方法について書かれた Using Django Models In Batch Jobs : Django Aware を参考に、こんなスクリプトを書いてみた。
doukakuの言語(Lang)モデルはcountっていうフィールドを持っていて、 ユーザがその言語を選んで投稿するたびに1ずつ増えるのだけども、 たまに不整合になることがある。 原因は僕が新しい言語を追加して管理者としていじるからで、 いじったときも値が更新されるようにすればいいんだけどもそれはまだやってない。
下のスクリプトは「値が不整合になっているものを見つけて修正する」っていうスクリプト。
import os
import sys
os.environ['DJANGO_SETTINGS_MODULE'] = 'doukaku_proj.settings'
sys.path.append(os.path.abspath('/home/nishio'))
sys.path.append(os.path.abspath(r"C:\django"))
from doukaku import models
for lang in models.Lang.objects.all():
c = models.Comment.objects.filter(lang=lang).count()
if c != lang.count:
lang.count = c
print lang.slug, c
lang.save()
print "ok."
for文以降をmanage shellからexecfileして使っていたのだけど、
これで実行属性をつけておけば普通に実行するだけで修正ができる。
楽ちん。
これは電車の中で書いているのでサーバでも動くかどうかはわかんない。
Windowsでは動いた。
= ところで、doukakuを作る上で僕はまだSQLを一文字も書いたことがない。 今日、テーブルにカラムを追加する時にはALTARを使うといいと聞いたので 「ついにSQLデビューか?!」と意気込んだのだけど、 SQLite Database Browserのメニューに「Edit Table」ってのがあったのでそれでやった。 SQLデビューはいつになることやら。
ウェブアプリを作るというと、 まずMySQLをインストールしてCREATE TABLEとかから教え始める説明が多いけども、 アイデアを形にする上でそういう知識が必須ではない時代になったのだなぁ。 ちょうどmallocとか知らなくてもPythonで可変長のリストを使ってコーディングができるのと同じように。
= Djangoのテンプレートは テンプレートでの出力は、デフォルトでエスケープして、 オプションでエスケープを外せる方がいいと思うけども、 Djangoがそれをやらないのは「HTMLに特化しない」 ということになっているからだろうか。
= 個人的に、ソースコードは行数二桁に保ちたくて、 100行を超えるとイエローゾーン、200行になるとかなりダメで、 300行を超えると完全にレッドゾーン、400行で「針が振り切れている」だと思う。
doukakuのコードはそろそろmodels.pyやviews.pyの針が振り切れそうなので リファクタリングを加えよう。
= 上で書いたUsing Django Models In Batch Jobs : Django Aware を参考にしたスクリプトはサーバでもちゃんと動いた。