日々のメモ書き
Debian Developerが綴るメモ
IEでGETがcacheされる件
AJaxでデータをGETで取ってきてアップデートしようとしてもキャッシュされて更新されない。
バグではないが困った。解決策を探すとPOSTでリクエストする・URLにダミーのパラメータ(時刻とか)をつけてユニークなURLにするとかあるが、スマートなのはIf-Modified-Sinceをつけるのがよいとのこと。具体的には次のようなコードになる。
var myAjax = new Ajax.Updater(tagid,
url,
{
method: 'get',
requestHeaders: ["If-Modified-Since",
"Thu, 01 Jun 1970 00:00:00 GMT"]
});
generic viewのextra_context
generic viewのobject_detailでextra_contextでパラメータを渡せることがわかった、が。
パラメータにQuerySetを渡すとキャッシュされるようだ。データが更新されても一緒なのでこまった。generic viewは使っちゃ駄目かな。
09/22追記: lambdaで囲めばよいとトラックバックで指摘を受ける。ありがとうございます。さらにトラックバックの挙動のおかしさも指摘されたので修正する。
柔道
審判うんぬんは言いませんが。
最近の柔道は組まないで足へのタックルが主流になったのかのぉー。
IEではまる
prototype.jsを使っていてFirefoxでは動くのにIEではさっぱりうごかねーという謎な現象が発生。
Ajax.Updaterを使っていたがfailureが発生しているわけでもないのになんでですかねと。調べてみたらtableを書き直すのは駄目らしい。意味わからん。divで囲ってdivを書き直すようにすれば動いた。意味わからん。
prototype.jsを使ってみる
AJAXでごちゃごちゃやりたかったのでprototype.jsを少し勉強。
基本的なツールを充実させているという印象。dojoののようなウィジェット盛り沢山というかんじではない。Ajax.Updaterでばんばん書き直せばいいのは楽。これじゃあ、あんまり使ってないな。
MTB整備
いろいろ整備。
- ブレーキ調整
- サイクルコンピュータのセンサー交換
- リアハブから異音。ラチェットのような気が…。やばいなあ。
newformsあれこれ
djangoのnewformsをがんばった話。
駄目だった話
form = NewFromsForm()
form.fields['foo'].choices = SomeModel.objects.all() # エラーになる
form.fields['foo'].choices.queryset = SomeModel.objects.order_by('bar') # 無視される
という感じのコードは駄目らしい。
form.fileds['foo'].choices = [(1,'a')]
は動く。
Modelに対応したFormを作るとき
ForeignKeyになっているとき、 foo = ForeignKey(Somethng) となっていたら foo_id = forms.ModelChoiceField(...)としておくと __dict__.copy()で対応しているので楽。clean_dataをmodelに保存するときは foo_idに代入しないこと。fooに代入すること。
trml2pdfで日本語を使う
ReportLabの挙動を学んだところでtrml2pdfで日本語を通るようにする。
UnicodeCIDFontを登録するようにすればいいということがわかった。オリジナルのRMlではdocinit内でregisterCIDFontを使って指定してる。じゃあ、それを解釈するように変更すればいいんだなというのが以下のパッチ。
diff -rN -u old-trml2pdf/trml2pdf/trml2pdf.py new-trml2pdf/trml2pdf/trml2pdf.py
--- old-trml2pdf/trml2pdf/trml2pdf.py 2007-09-16 14:19:49.475214466 +0900
+++ new-trml2pdf/trml2pdf/trml2pdf.py 2007-09-16 14:19:49.975179240 +0900
@@ -35,7 +35,8 @@
#
# Change this to UTF-8 if you plan tu use Reportlab's UTF-8 support
#
-encoding = 'latin1'
+# encoding = 'latin1'
+encoding = 'utf-8'
def _child_get(node, childs):
clds = []
@@ -142,6 +143,7 @@
from reportlab.lib.fonts import addMapping
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
+ from reportlab.pdfbase.cidfonts import UnicodeCIDFont
for node in els:
for font in node.getElementsByTagName('registerFont'):
@@ -152,7 +154,11 @@
addMapping(name, 0, 1, name) #italic
addMapping(name, 1, 0, name) #bold
addMapping(name, 1, 1, name) #italic and bold
+ for font in node.getElementsByTagName('registerCidFont'):
+ name = font.getAttribute('faceName').encode('ascii')
+ pdfmetrics.registerFont(UnicodeCIDFont(name))
+
def render(self, out):
el = self.dom.documentElement.getElementsByTagName('docinit')
if el:
これで日本語が通ることを確認した。なおRMLファイルはutf-8にすること。
<!DOCTYPE document SYSTEM "rml.dtd">
<document filename="example_1.pdf">
<docinit>
<registerCidFont faceName="HeiseiKakuGo-W5"/>
</docinit>
<pageDrawing>
<setFont name="HeiseiKakuGo-W5" size="8"/>
<drawCentredString x="2in" y="10in">
こんにちは世界 ゴシック
</drawCentredString>
</pageDrawing>
</document>
元のコードを見ればわかるがTTFontの登録は実装してある。Tinyだけあって最小の努力なのかね。もうちょっと気を使ってもらえるとありがたい。
これでJasperReportsをPythonから無理矢理使おうなんていう頭の痛いことは頑張らなくてもいいようになったかな。
H2A F13
SELENEを載せたH2A 13号機は打ち上げに成功。
今回は晴天だったためロケットがよく見えた。今のところ衛星も順調。月に辿りついて下さい。
ReportLabで日本語を使う
まずはReportLabで日本語を使う方法。
# -*- encoding: utf-8 -*-
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
c = canvas.Canvas("hello.pdf")
pdfmetrics.registerFont(UnicodeCIDFont('HeiseiMin-W3'))
c.setFont('HeiseiMin-W3', 16)
c.drawString(100,620,u"こんにちは世界 明朝体")
pdfmetrics.registerFont(UnicodeCIDFont('HeiseiKakuGo-W5'))
c.setFont('HeiseiKakuGo-W5', 16)
c.drawString(100,640,u"こんにちは世界 ゴチック体")
c.showPage()
c.save()
こんな感じです。ちょっと古い資料だとUnicodeCIDFontを使わないでCIDFontを使っていたりするがドキュメントによると2.0からはUnicodeCIDFontを使うべきらしい。