クラス変数の使い方

クラス変数とクラス定数
同一のクラスの複数のオブジェクトで、一つの変数を共有したいときがある。このような場合には、クラス変数を用いると良い。rubyでは、クラス変数は@@で始まる。

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

などとすると、変更は可能である。このあたりがどのようになっているのかよく理解できていない。当然のことだが、変更が必要な場合には、クラス変数を用いると良いのだろう。

Read more...

CGIを使って

ダブルクリックの防止

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"})

としたら、うまく行った。思ったよりも簡単に出来て助かった。

2010.1.22追記 firefoxではうまく動いているが、ieでは動いていないことを発見した。ieでは、onclick=“this.disabled=true;this.form.submit();“としないといけないらしい。

Read more...

意外に速くなったらしい

メモリの増設
測定に使っている古いPCが遅いということだったので、メモリを増設してみた。時代からしてDIMMだろうということで、家をあさるといろいろと見つかったので、容量が不明で二枚セットになっているものを数組持ってきて試してみようということになった。しかし、立ち上がりの非常に遅いマシンだったので、五回ぐらい試しているうちに、だんだん嫌になってきて、適当なところで止めてしまった。スロットが三つあって、そこに三枚入れようとしたが、相性がよく分からず、最終的には128Mの二枚刺しで、256Mである。しかし、最初は64Mだったので、これでも4倍なので、多少は速度が速くなるだろう。噂によるとそれなりに速くなっているらしいので、今回はこれで満足することにしよう。 ところで、家にDIMMが何枚ぐらいあるのか気になって、半分ぐらい数えてみたら、約30枚あったので、全部で50枚ぐらいなのかな。まあ、DIMMも使う機会は減ったけども、今回のように役に立つこともあるので、なかなか捨てられないな。SIMMもかなりの数もっているけど。DDRやDDR2も今後増えて行くのだろう。

Read more...

コラッツの問題

rubyの練習
コンピューターを使うときには、如何にプログラムを短く美しく書くかが重要である。試しに、今年のセンターの数学の問題のコンピューターのところにでていたコラッツの問題の1になるまでの回数を求める関数を書いてみた。

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も増えたし。なかなか満足のいくコードは書けないものだ。

Read more...

DebianとGPIB

もうすぐリリース
1/13日にDebian Installer 6.0 Release Candidate 1が出た。squeezeのリリースも秒読みである。しかし、一つ残念なのは、GPIBのパッケージがsqueezeからはずれてしまったことである。sargeとlennyにはあったのだが、etchとlennyには無いので、なぜか交互になっているような感じだ。自分でlinux-gpibを入れれば良いのだが、少し面倒である。また、カーネルが変わるともう一度入れ直さないといけないし。まあ、すぐにgpibを使わなければいけないわけでは無いし、しばらく様子を見よう。

Read more...

web server

Debian Squeezeを待ちきれず
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を通さないように設定したら、無事に動くようになった。

Read more...

tdiaryの異常

uconvの場所
古いrubyに無理して入れたtdiaryだが、異常を表示するようになった。Uconvが無いと言われるのだが、これはなぜだろうか。インストールしたときに書いた部分も表示できなくなっているので、どう対処しようかと思っていたが、updateで一日ごとに探して行ったら、12/15のところにあった。良く見ると、このとき書き換えたのはupdate.rbで、今回エラーが起きているのは、index.rbである。つまり、index.rbでrbuconvが読み込まれていないのでエラーが出ていたわけである。そこで、update.rbとindex.rbの両方がrequireしているtdiary.rbにrequire ‘rbuconv’を書き換えることにした。今のところこれで動くようになった。月が変わるところでuconvを使うのかな。

Read more...

ローカル変数

pythonとrubyの変数の違い

rubyでは、グローバル変数は使わないのが原則らしい。通常の変数はすべてローカルになる。例えば、

a=1
def f(b)
  return a+b
end
print f(1)

とすると、aはf()の中では宣言されていないので、エラーが出る。しかし、pythonでは取扱いが違うらしい。

a=1
def f(b):
  return a+b
print f(1)

とすると、2を表示する。つまり、aはグローバル変数として取り扱われて、f()の中でも有効なのである。このどちらの方が便利なのか、意見が分かれるとは思う。

Read more...

texlive-science

TeXの化学式

そろそろ、学生が卒業論文や修士論文を書き始める季節になってきた。TeXを使って論文を書く人も多いと思うが、化学系で面倒なのが、化学式である。これまで、rubyを使って、化学式らしい部分を自動で変換していたが、便利なstyファイルがあることを教えてもらった。mhchemというもので、Debianの場合にはtexlive-scienceに入っている。ヘッダーに

\usepackage[version=3]{mhchem}

と書いておいて、\ce{H2O}などと書くと、それが化学式として出力される。/usr/share/doc/texlive-science-doc/latex/mhchem/mhchem.pdfに、詳しい説明がある。イオンでまぎらわしい時には、\ce{CrO4^2-}とする。結晶水の点はピリオドで記述するようだ。

texlive-scienceに入っている他のものとしては、sciposterというのが気になった。ポスターを作るときには、posterクラスを自分で修正したものを使っていたのだが、こちらの方が便利そうだ。いつか使ってみるかもしれない。

TeXに便利なツールができてくるのはうれしいことなのだが、それに取り残されている自分が悲しくなる。

Read more...

CGIとruby

CGIを動かすために
あまり時間が取れなくて、なかなかhomepageの作成がはなどらないが、少しずつ進めている。今日はCGIを動かせるようにした。.htaccessに

Options ExecCGI
AddHandler cgi-script cgi

と記述すると、CGIが動かせるようになる。しかし、どこかでエラーが生じている。ruby1.8用に書いたscriptで、IO.readを使っていたが、これがサーバーのruby1.6.4では動かないのが原因だということが分かった。代わりにopen(“formula.dat”){|f| f.read}と書くとうまく動いた。

Read more...