ようやくhttp1.1でアクセスができるようになった。
keep-aliveを要求しても、サーバー側でcloseされてしまうことがある。これに気がつくのに随分時間がかかってしまった。ヘッダーを見て、content-lengthが指定してあれば、その長さだけ読んで、connection: closeだったら全部読むというようにすれば、うまく読めた。
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版が出るまで待たないといけないな。
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
なんだか少し納得がいかない。
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でブラウザを書くのがはやっていたが、難しそうだな。
bangTeX
ベンガル語のTeX
昔からの計画のひとつとして、中国語の漢字の周期律表をTeXでつくろうと思っている。多言語のTeXとしてはBabelやOmegaがあるし、中国語や韓国語に関してはCJKなどもある。まだこれらを扱うのは難しそうなので、とりあえずベンガル語をどうやって扱うかを調べてみた。Debian Lennyでは、texlive-lang-indicをインストールすれば、bangTeXというものが使えるようになって、ベンガル文字を扱えるようになる。
\documentclass{jarticle} \usepackage{beng} \begin{document} {\bn rUpaa} \end{document}
のような感じで書くと、রূপাと表示されるようになる。しかし、ベンガル文字は母音が多いので、どのように打つとどうなるかはよく分からない。bangTeXを使って、文字の対応表を作ればよいのかもしれない。
lennyのGPIB
まだわからない
これまでに、測定装置のうち三台ぐらいをDebian Lennyにしているが、いまだにGPIBの設定のしかたがよく分からない。基本的には、2009/2/28に書いてあるようにすれば良いのだが、最後の細かい設定が毎回違っている。GPIBのモジュールを有効にするためには、スーパーユーザーで
modprobe tnt4882 gpib_config --minor 0
を実行する必要があるのだが、通常はこれをmoduleが始めて組み込まれるときに実行されるように、/etc/modprobe.d/gpibを設定しておくのだが、ここの書き方がインストールする毎に違う気がする。数ヵ月ぐらいは間が空いていると思うので、その間に何かupgradeがあるのかも知れないが。今回はどうもうまくいかないので、最終手段として、2009/12/20のように起動スクリプトの中に、これらを組み込んでしまった。まあ、測定専用マシンなので、起動時にGPIBが認識されて困ることはない。しかし、なにか美しく無いやりかたで気に入らない。
Web serverの更新
Apache2
研究室で立ち上げているWebサーバーはDebianのEtchで動いているのだが、通常はいつアクセスがあるかわからないので、なかなかOSの入れ換えをできない。年末になって、そろそろみんながお休みモードになってきたので、OSを入れ換えることにした。
Debian Lennyのlxdeをインストールすることにしたのだが、taskselのところでは、標準システムとデスクトップとWebサーバーを選択して、一通りのものをインストールする。/etc/apt/sources.listから、CDROMをコメントアウトしてaptitude updateとaptitude upgradeを実行する。openssh-serverをインストールして、あとの設定はリモートで行うことにする。 固定IPにするために/etc/network/interfacesと/etc/resolv.confを書き換える。useraddで必要なuserをつくる。
さて、いよいよapache2の設定に入る。まずはユーザーのdirectoryを見れるようにする。
/usr/sbin/a2enmod userdir /etc/init.d/apache2 restart
public_htmlを作って、属性を変えると、アクセスができるようになる。
chown -R www-data:www-data public_html
さて、つぎはCGIを動くようにする必要がある。rubyのCGIを動かせるように、インストール。
aptitude install ruby libapache-ruby1.8
最後に/etc/apache2/httpd.confにAddHandler cgi-script .cgiを加えると、CGIが動くようになった。
Lennyの起動スクリプト
LSB information
研究室の測定用のPCのLinuxとしてはDebianを使っているが、etchとlennyが共存している。いまだにetchが残っている理由としては、プリンターポートをうまく使うことができなかったからだ。起動時にcupsがlpを使ってしまうので、root権限でrmmod lpをしなければならない。etchからlennyへは、起動スクリプトの書き方が変わったようで、etchで動いていたlpをはずすスクリプトが動かなかったのだ。まだ、誤魔化しであるがやっと動くようになったので、書いておこう。
基本はetchと同じで、/etc/init.dに起動スクリプトを置く。この書き方がより厳格になった。最初にLSB informationを書かないといけないらしいが、この部分はまだ理解していない。ここを参考にするように言われるが、とりあえずは無視する。startさえちゃんと書いておけばなんとかなるようなので、
#! /bin/sh case "$1" in start) rmmod lp esac exit
という内容をrmlpという名前でつくって、
chmod ugo+x rmlp update-rc.d lp defaults 98
と登録した。いろいろと文句を言われるが、lsmodで確認すると、lpはなくなっている。これで、lennyで測定用のPCを立ち上げられる。徐々にetchをlennyに代えていこう。
TeXの化学式
rubyで変換
TeXで文章を書くときに面倒なのが、化学式である。ZnCr2O4と書きたいときに、$ZnCr_2O_4$と書くと、元素記号が斜体になってしまうので、ZnCr$_2$O$_4$と書く人が多いようだ。しかし、私の考えでは、元素記号も「式」なので、数式モードにするべきであり、${\rm ZnCr}_2{\rm O}_4$と書いている。しかし、これをいちいち書くのは面倒である。
そこで、$ZnCr2O4$と書いておくと、それを自動で変換してくれるような scriptをrubyで書いて、それで変換している。
str.gsub!(/\$([A-Z][a-z]?)([\d\.]*)\$/){"${\\rm #{$1}}_{#{$2}}$"}
とすると、化学式っぽいものを変換してくれる。元素記号は[A-Z][a-z]?と表して、この後に数字がくるかもしれないとしている。この例は一元素用で、二元素や三元素などのものも羅列しておかなければならない。また、$P$と書いたときに、燐なのか圧力なのかが分からないので、斜体にならず元素と思われてしまう。このような場合には、$P $などと余分のスペースを入れて区別している。化学式には余分なスペースは入れないようにするのである。
しかし、この手法には他にも不便な点がある。$MCr2O4$としたときには、Mは斜体にしたいのに、正体になってしまう。また、$Zn1-xCdxCr2O4$なども判定できない。こういった場合には、手で書かなければならない。
せっかくなので、少し凝ったscriptでそれらの解決を試みた。とりあえず作ってみたのがこれ。
Element='([A-Z][a-z]?)' Number='([\d\.\+\-a-z]*)' def element(str) "AMRTXQ".split(//).include?(str)? str:"{\\rm %s}"%str end def subscript(str) "_{%s}"%str end d=<<DATA $ZnCr2O4$ is one of a chromium spinels $MCr2X4$. $Cu1-xNix$ is an alloy of $Cu$ and $Ni$. DATA d.gsub!(/(\$(#{Element}#{Number})+\$)/){ str0=$1 num=str0.gsub(/[^A-Z]/){""}.size str="$" m=/\$#{(Element+Number)*num}\$/.match(str0) num.times{|i| str+=element(m[i*2+1])+subscript(m[i*2+2]) } str+"$" } puts d
数字のところには、小文字のアルファベットと+-を入れられるようにした。そして、AMRTXQは斜体になるようにした。そして、いくつの元素の場合でも対応できるようになった。
まあ、これでそれなりに便利になるだろうが、まだ問題がある。まず、$P$のような場合は今までと同様にだめである。それから、$Zn2+$は2+が下付きになってしまう。これは、あらかじめイオンを処理してから、化学式を処理すれば問題ない。
str.gsub!(/([A-Z][a-z]?)(\d?\+)/){"{\\rm #{$1}}\^{#{$2}}"}
最後に残った問題は$AB2O4$という場合である。この場合に、Bは硼素を表しているのか、複数の元素を表しているのかは、自明ではない。Aがなければ、ぼほ確実に硼素なのだろうし、Aがあれば後者の可能性が高い。そのような処理を組み込んでも良いのかも知れないが、それは面倒なので、今回はBは常に硼素と解釈することにした。
2010.1.21追記 ローマンの指定が誤っていたので、訂正しました。
windowの移動
画面の外へ
ノートで作業をしていると、画面が小さいことが問題になることがある。画面の下にボタンが表示されてしまい、それが押せないときには、困ってしまう。以前はxrandrで仮想的に画面を大きくしていたが、もっと簡単なs解決策があることを発見した。windowの移動はtitle barのところをつかんでdragするのが普通だが、これだと画面の一番上までしか移動できない。しかし、Alt+dragでwindowを画面の外にはみ出すように移動ができるのだ。すると、それまで画面の下に隠れていたボタンも押せる。動作を確認したのはlxdeでだが、GNOMEとかでも使えるようだ。ひょっとするとwindowsでも使えるのかも。