|
setup diary |
古いrubyに無理して入れたtdiaryだが、異常を表示するようになった。Uconvが無いと言われるのだが、これはなぜだろうか。インストールしたときに書いた部分も表示できなくなっているので、どう対処しようかと思っていたが、updateで一日ごとに探して行ったら、12/15のところにあった。良く見ると、このとき書き換えたのはupdate.rbで、今回エラーが起きているのは、index.rbである。つまり、index.rbでrbuconvが読み込まれていないのでエラーが出ていたわけである。そこで、update.rbとindex.rbの両方がrequireしているtdiary.rbにrequire 'rbuconv'を書き換えることにした。今のところこれで動くようになった。月が変わるところでuconvを使うのかな。
Debianの次のSqueezeがもうすぐリリースされそうなので、リリースクリティカルバグの数の推移を見ているが、もう100を切っている。ひょっとしたら昨年の内に出るかもと思っていたが、さすがにそれは無かった。それでも一月中にはリリースされると良いな。
研究室にwebサーバーを立ち上げる計画があったので、squeezeがリリースされてから、それをインストールしようと思っていたが、待ちきれずにbeta2版をインストールしてしまった。今回課題になると思ったのはproxyの設定であるが、それは入力を求められたときに入力すれば問題なくいった。問題だったのが、net-inst版でやったのだが、gnomeがいやでdesktop環境を入れずに手で設定しようと思ったら、かなり面倒になってしまった。そこでもう一度インストールしようとしたが、実はinstallerの選択肢で、lxdeを選べることを発見し、desktopとweb-serverをインストールしたら、今度はうまくいった。
しかし、次につまずいたのは、localhostではwebにアクセスできるのに、IPを打つとうまく行かないというところだ。しばらくいろいろといじっていたが、これはproxyの設定が悪さをしていた。browserもproxyをかましていたのだが、逆に自分のマシンのIPがproxyからはうまく判断できないのが問題だった。browserの設定で、IPの最後の桁を*にしたサイトは、proxyを通さないように設定したら、無事に動くようになった。
1/13日にDebian Installer 6.0 Release Candidate 1が出た。squeezeのリリースも秒読みである。しかし、一つ残念なのは、GPIBのパッケージがsqueezeからはずれてしまったことである。sargeとlennyにはあったのだが、etchとlennyには無いので、なぜか交互になっているような感じだ。自分でlinux-gpibを入れれば良いのだが、少し面倒である。また、カーネルが変わるともう一度入れ直さないといけないし。まあ、すぐにgpibを使わなければいけないわけでは無いし、しばらく様子を見よう。
def col(n) (n<2)?0:col((n%2==0)?n/2:3*n+1)+1 end再帰を使う以外は、全くもって工夫が無いものになってしまった。速度を考えると
def col(n) (n<2)?0:col((n[0]==0)?n>>1:3*n+1)+1 endの方が速くなると思ったが、遅くなってしまった。なぜだろう。2byteも増えたし。なかなか満足のいくコードは書けないものだ。
測定に使っている古いPCが遅いということだったので、メモリを増設してみた。時代からしてDIMMだろうということで、家をあさるといろいろと見つかったので、容量が不明で二枚セットになっているものを数組持ってきて試してみようということになった。しかし、立ち上がりの非常に遅いマシンだったので、五回ぐらい試しているうちに、だんだん嫌になってきて、適当なところで止めてしまった。スロットが三つあって、そこに三枚入れようとしたが、相性がよく分からず、最終的には128Mの二枚刺しで、256Mである。しかし、最初は64Mだったので、これでも4倍なので、多少は速度が速くなるだろう。噂によるとそれなりに速くなっているらしいので、今回はこれで満足することにしよう。
ところで、家にDIMMが何枚ぐらいあるのか気になって、半分ぐらい数えてみたら、約30枚あったので、全部で50枚ぐらいなのかな。まあ、DIMMも使う機会は減ったけども、今回のように役に立つこともあるので、なかなか捨てられないな。SIMMもかなりの数もっているけど。DDRやDDR2も今後増えて行くのだろう。
Debian squeezeでWebサーバーを立ち上げて、rubyのCGIを使ってhomepageを作ってみた。いろいろと細かいプログラムを書いて、それなりに動くようになったが、問題が残っていた。submitをダブルクリックすると、二回データーが送られてしまうのだ。これまでは知っていて無視をしていたが、いつかは重大な問題になるだろうということで、対策をしてみた。
以前はjavascriptを使わないといけないと思っていたが、実は使わなくても良いらしい。以下のようにすると、一回submitすると、disableになって、二回目は無効になる。
<INPUT name="button" TYPE="submit" value="submit" onclick="this.disabled=true">
rubyのCGIクラスを使う場合には、
cgi=CGI::new("html4") cgi.submit({"value"=>"submit","name"=>"button","onclick"=>"this.disabled=true"})
としたら、うまく行った。思ったよりも簡単に出来て助かった。
firefoxではうまく動いているが、ieでは動いていないことを発見した。ieでは、onclick="this.disabled=true;this.form.submit();"としないといけないらしい。
class Test @@v=0 def initialize() @@v+=1 end def v @@v end end t1=Test::new p t1.v t2=Test::new p t1.vとすると、生成したオフジェクトの数が表示される。一方、クラス定数も複数のオフジェクトで共有できるが、メソッド中での代入はできない。しかし、
class Test V=[] def initialize() V<<1 end end t1=Test::new p Test::V t2=Test::new p Test::Vなどとすると、変更は可能である。このあたりがどのようになっているのかよく理解できていない。当然のことだが、変更が必要な場合には、クラス変数を用いると良いのだろう。
def fmlwt(fml) awt=Hash[*IO.read("formula.dat").strip.split(/\s+/m)] r=0 fml.scan(/([A-Z][a-z]?)([\d\.]*)/){|a,n| n=1 if n=="" r+=awt[a].to_f*n.to_f } r endのような感じで書ける。この原子量の代わりに、括弧の中の化学式に関しては自分を再帰的に呼び出すことによって、
def fmlwt(fml) awt=Hash[*IO.read("formula.dat").strip.split(/\s+/m)] r=0 fml.scan(/(\(.*?\)|[A-Z][a-z]?)([\d\.]*)/){|a,n| n=1 if n=="" a=a.sub(/^\(/){""}.sub(/\)$/){""} r+=((a=~/^[A-Z][a-z]?$/)?awt[a].to_f : fmlwt(a))*n.to_f } r endと書くと、特定の括弧の付け方に対応できるようになる。Cu(NO3)2(H2O)2.5などはうまく判定できる。しかし、(Cu(NH3)4)Cl2はうまくいかない。scanの部分の正規表現の.*?の?を取ればこれに対応するが、今度は前者に対応できなくなる。この両者をシンプルに判定するにはどうしたら良いのだろう。
def fmlwt(fml) awt=Hash[*IO.read("formula.dat").strip.split(/\s+/m)] fml=fml.sub(/[\(\[]([^\(\)\[\]]*)[\)\]]([\d\.]*)/){ n=($2=="")?1:$2.to_f;"H%f"%(fmlwt($1)*n/awt["H"].to_f)} while fml=~/[\(\[]/ r=0 fml.scan(/([A-Z][a-z]?)([\d\.]*)/){|a,n| n=1 if n=="" r+=awt[a].to_f*n.to_f } (r*1e3).round/1e3 endしかし、やり方が汚すぎる。置換の部分を少し工夫したら、もう少し短くなった。
def fmlwt(fml) awt=Hash[*IO.read("formula.dat").strip.split(/\s+/m)] re=/[\(\[]([^\(\)\[\]]*)[\)\]]([\d\.]*)/ fml=$`+"H%f"%(fmlwt($1)*($2==""?1:$2.to_f)/awt["H"].to_f)+$' while fml=~re r=0 fml.scan(/([A-Z][a-z]?)([\d\.]*)/){|a,n| r+=awt[a].to_f*(n==""?1:n.to_f)} (r*1e3).round/1e3 end