2010年5月9日更新
家計簿作成メモ
webアプリ家計簿を作ったときに調べたことをメモ。
データ
JSONかXMLか
悩んだけど、ふつうにXMLで。 というのも、JSONはパースが楽なのはいいけれど、 反面、いろいろめんどくさいので、 じゃあ自分で書くよ、と。 それにXMLで表現すると、 一般的なXMLツールが使えるのもうれしいしね。 XML Schemaとか、XSLTとか。
XMLの検査
- XSV
- XML Schemaそのもののチェック
- XML Schema Validator
- XML文書のチェック
サーバ
当然Plan 9で動かすので、それなりに。
認証
見られるのは別にいいけど、勝手に変更されるのは困るので、 Plan 9でいちばん手軽なhttps+basic認証を使います。 参考までに/cfg/wisp/cpustartの一部。
ip/httpd/httpd
ip/httpd/httpd -c cert \
-n /cfg/wisp/namespace.https -w /usr/sweb
他のhttpdだと、XST(Cross Site Tracing)の危険性があるので TRACEを無効にしないと恐いですが、 Plan 9 httpdはGET, HEAD, POSTしか対応していないので大丈夫。
実行ファイルの置き場所
CGIは/bin/ip/httpd以下に置きます。 たとえばpostというプログラムを置くと、 http://domain.dom/magic/postとして参照します。 ちなみに/magic/post/path/toと参照すると、 postから/path/toを調べられます。 PATH_INFOみたいなこともできますね。
作り方
/sys/src/cmd/ip/httpd以下のソースを参考にして作ります。 PATH_INFO系の扱い方はman2html.c、 POSTの動作はwikipost.cあたりがおすすめ。
ちなみに附属のライブラリを使う場合、 httpsrv.hをincludeしないといけないので、 ソースを/sys/src/cmd/ip/httpd以下にbindしたほうが便利です。
各種変数
- httpdのルートディレクトリ
- webroot
- リクエストメソッド
- HConnection.req->meth
- PATH_INFOのようなもの
- HConnection.req->uri
動作環境
httpdは、ユーザnoneで動作しています。
noneは常にotherビットの扱いになります。 詳しくはユーザ none。
CGIトラブルシューティング
パーミッションは間違っていないのに、createがエラーになる
create(2)は、OWRITEでディレクトリを作るとエラーになります。
//fd = create(file, OWRITE, 0777|DMDIR);
fd = create(file, OREAD, 0777|DMDIR);
close(fd)
よく考えれば当然のような気もしますが、割と悩みました。
syslogに書き込んだはずなのに記録されていない
syslogは、最初に呼び出された時に/sys/log/lognameを開いて、 次からはそれに対して書き込みをします。 なので、bindでルートを変更した場合、 bind前にファイルを開いていなければログが保存できません。
localtimeで返すタイムゾーンがGMTになる
これもsyslogと同様に、はじめて呼ばれたときに/env/timezoneを 読みます。/envが開けない場合はGMTとして扱われます。
クライアント
使ったライブラリ
- jQuery
- jQuery UI
- html5.jpの折れ線グラフ、円グラフ
webアプリトラブルシューティング
jQuery.ajaxエラー時のHTTPエラーコードが見たい
第1引数のstatusを見ます。
$.ajax({
error: function(req){
alert(req.status)
}
})
req.statusTextはエラー内容のはずですが、 常にOKが入っているのはなぜだろう。
jQuery UI datepickerの書式をyyyy/mm/ddにしたい
dateFormatオプションに書式を与えます。
$('input.date').datepicker({
dateFormat: 'yy/mm/dd'
})
html5.jpのグラフを再度drawすると、前のグラフが残る
不具合なのか仕様なのか分かりませんが、とりあえず回避。
<section id="graph">
<div>
<canvas width="200" height="200" id="canvas1"></canvas>
</div>
</section>
$('#graph > div > div').remove()
circle.draw(...)
数値型に変換しようと"3"+0とすると、"30"になる
Awkのくせでやってました。 JavaScriptは文字列連結が+なのでそうなるらしいです。 ちょっと変形させて"3"-0なら3になります。
メモ
- jQuery、連想配列をeachした時の動作がおかしい
- DOMノードをafter()で追加した時の動作がなんだかおかしい