RSS

日々のメモ書き

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を使うべきらしい。

< 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 >