2010年
1月
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

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2010-01-01 bangTeX

_ ベンガル語のTeX

昔からの計画のひとつとして、中国語の漢字の周期律表をTeXでつくろうと思っている。多言語のTeXとしてはBabelやOmegaがあるし、中国語や韓国語に関してはCJKなどもある。まだこれらを扱うのは難しそうなので、とりあえずベンガル語をどうやって扱うかを調べてみた。Debian Lennyでは、texlive-lang-indicをインストールすれば、bangTeXというものが使えるようになって、ベンガル文字を扱えるようになる。
\documentclass{jarticle}
\usepackage{beng}
\begin{document}
{\bn rUpaa}
\end{document}
のような感じで書くと、রূপাと表示されるようになる。しかし、ベンガル文字は母音が多いので、どのように打つとどうなるかはよく分からない。bangTeXを使って、文字の対応表を作ればよいのかもしれない。

2010-01-16 HTTP 1.0と1.1の違い

_ rubyでhttpに直接アクセス

rubyでhttpを使うときには通常http.rbを使う。open-uriなんかも便利なようだ。しかし、headerの処理などの細かい部分が気に入らない場合がある。そのような場合には、httpを直接たたいた方が簡単である。 HTTP1.0の場合には、
GET /file HTTP/1.0
を送って、ソケットから全部readすれば良いので簡単であるが、HTTP1.1の場合には、keep-aliveするので、content-lengthの部分を見て、必要なサイズを読み込まなければならないので、処理が少し煩雑になる。 とりあえずは簡単なpageにはアクセスできるようにはなったが、HTTPのすべてを組み込むのは大変なので、徐々に機能を増やしていこう。一時期rubyでブラウザを書くのがはやっていたが、難しそうだな。

2010-01-17 hashのhash

_ rubyのhashのくせ?

hashを値として持つhashを作るときに、
h={}
h[1][2]=3
p h
とすると、h[1]がnilなのに[]=というmethodを呼び出すので、エラーになる。そこで、次のようにすれば問題ないだろうと思って実行してみたが、うまくいかない。
h=Hash.new({})
h[1][2]=3
p h
ここでは、h[1]はすでにdefault値の{}になっているので、エラーは起きないが、hを表示すると{}となる。これは、バグなのかどうかは微妙なところだが、不思議な挙動な気がする。しかたがないので、冗長にはなるが、次のように書いたら当然だがうまく動いた。
h={}
h[1]={} unless h[1]
h[1][2]=3
p h
なんだか少し納得がいかない。

2010-01-21 New mini 10

_ dellからようやくN450搭載のmini10が発売された。

新しいInspiron Mini 10は、アメリカでは1/5にはすでに発売されていたが、それが日本では1/21か。もとのmini 10と名称は一緒だが、デザイン等、いろいろな点が変わっている。VGAもついたし。ちなみに型番は、旧型が1010で新型は1012のようだ。dellのサイトにはまだ分解の仕方などは載っていないが、いずれは出ると期待したい。

しかし、6セルバッテリーで1.39kgと重くなっている。3セルだと1.24kgらしいが、まだ日本では発売されていないようだし、それでも10vや旧10よりも若干重くなっている。

いずれにせよ、まだ全くカスタマイズできないし、ubuntu版が出るまで待たないといけないな。


2010-01-23 rubyでhttp

_ ようやくhttp1.1でアクセスができるようになった。

keep-aliveを要求しても、サーバー側でcloseされてしまうことがある。これに気がつくのに随分時間がかかってしまった。ヘッダーを見て、content-lengthが指定してあれば、その長さだけ読んで、connection: closeだったら全部読むというようにすれば、うまく読めた。


2010-01-25 chunked

_ またまたHTTP1.1

今度はchunkedでつまってしまった。
transfer-encoding: chunked
とあったら、受け取り方を変えなければならない。一行目に16進数でバイト数があり、それだけのバイト数を読んで、一行改行を読む。さらにこれを繰り替えして、最後はバイト数の指定が0となるまで読む。最後に空行が来るまで読んで終わり。今のところ、ヘッダーのtransfer-encodingとcontent-lengthとconnectionを見て、読み方を変えている。まだ別の読み方があったりするかも。

2010-01-31 encodeのバグ?

_ urlencodeとhtmlencode

httpでアクセスするときには、特殊な文字をencodeやdecodeする必要が出てくる。その代表的なものが、urlencodeとhtmlencodeである。これらをrubyで扱うときには、それぞれURI.escapeとCGI.escapeHTMLを使えば良い。ちなみに、これらはそれぞれ"uri","cgi"をrequireしてから使用する。URI.escapeの場合には、デフォルトではURI::UNSAFEで定義された文字をencodeする。しかし、このUNSAFEの定義が変な気がする。試しにURI::UNSAFEをpしてみると、
/[^-_.!~*'()a-zA-Z\d;\/?:@&=+$,\[\]]/n
となる。これだと"["や"]"はencodeされないことになるが、encodeするべきのようだ。uri/common.rbを覗いてみると、次のように定義されている。
ALPHA = "a-zA-Z"
ALNUM = "#{ALPHA}\\d"
UNRESERVED = "-_.!~*'()#{ALNUM}"
RESERVED = ";/?:@&=+$,\\[\\]"
UNSAFE  = Regexp.new("[^#{PATTERN::UNRESERVED}#{PATTERN::RESERVED}]", false, 'N').freeze
RESERVEDとUNRESERVEDの意味は分からないけど、
UNSAFE  = Regexp.new("[^#{PATTERN::UNRESERVED}]", false, 'N').freeze
が正しい気がする。urlencodeもいろいろな種類があるのかも知れないけど。