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が認識されて困ることはない。しかし、なにか美しく無いやりかたで気に入らない。

Read more...

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が動くようになった。

Read more...

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に代えていこう。

Read more...

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.
Read more...

windowの移動

画面の外へ
ノートで作業をしていると、画面が小さいことが問題になることがある。画面の下にボタンが表示されてしまい、それが押せないときには、困ってしまう。以前はxrandrで仮想的に画面を大きくしていたが、もっと簡単なs解決策があることを発見した。windowの移動はtitle barのところをつかんでdragするのが普通だが、これだと画面の一番上までしか移動できない。しかし、Alt+dragでwindowを画面の外にはみ出すように移動ができるのだ。すると、それまで画面の下に隠れていたボタンも押せる。動作を確認したのはlxdeでだが、GNOMEとかでも使えるようだ。ひょっとするとwindowsでも使えるのかも。

Read more...

ハードディスクの検査

fsck
職場で使っているPCのデータの一部が破損しているのを発見した。おそらくハードディスクのエラーだろう。というわけで、checkをしてみた。まず、問題のHDDをunmountしてから、

fsck /dev/hdd1

を実行。いくつかの問題箇所が見つかった。bad sectorは増える傾向があるので、そのHDDは要注意だ。

Read more...

dellのdisplay

ディスプレイの修理
液晶ディスプレイが壊れた。症状から電源系統の故障だろうと判断して、直す気で中を開けてみた。すると、基盤にBENQの文字が。確かdellのだと思って枠を見てみると、DELLの文字。 肝心の修理の方は、一見してよく分からないのだが、陰極管への電圧をつくる回路と、制御系の回路へ電圧を供給するラインが分かれている。それぞれに別の電圧が供給されているようなのだが、その電圧が分からない。回路への供給は5Vだとは思うが、陰極管の方がよく分からない。時間もないし、面倒になってきて、結局捨ててしまった。もっと回路が分かるようになりたいな。

2009/12/6追記 一度はすてようとした基盤だが、救出していろいろと調べた結果、インバーター回路の中の2SC5707というトランジスタが壊れているのが故障の原因らしいことが分かった。検索してみると、このような事例は結構多いようだ。直せるかもしれないが、他の部品は捨ててしまったので、復活は不可能である。結局、四つあるうちの一つしか壊れていないようなので、三つを部品取り用にすることになった。

Read more...

ruby-gslでfitting

Gaussianでfit
たくさんのデータをgaussianでfitする必要があって、どうやってやろうか考えた。グラフソフトを使って、手でするのはデータが多すぎて現実的ではない。Rはプログラムを組めるので、可能ではあるだろうが、gaussianのfitをどうするかまだ知らないので、別の方法を試みることにした。調べてみると、GSLというライブラリがあり、科学計算に用いるいろいろな道具が揃っているらしい。さらに、これがrubyからたたけるらしい。というわけで、rubyでgaussian fitをしてみた。まずは、

aptitude install libgsl-ruby

でインストール。Histogramだとfit_gaussianというmethodがあるようだが、これだとxyデータをそのまま扱えない。いろいろと探していたら、MultiFitでできることが分かった。こんな感じだ。

require "gsl"
x=[0,1,2,3,4,5,6]
y=[0,1,2,3,2,1,0]
gx=GSL::Vector[*x]
gy=GSL::Vector[*y]
guess=[gy.min,gy.max,gx.mean,2]
y0,int,x0,var=GSL::MultiFit::FdfSolver.fit(gx,gy,"gaussian",guess)[0].to_a

いろいろと分からないことが多いが、配列を返してくるので、先頭にあるパラメータを取り出して、これがGSL::Vectorなので、rubyの通常の配列に戻して、結果を得ている。いろいろなデータを試してみると、明らかにピークがあるデータはうまくいくのだが、ピークがあるか無いかわからないようなデータだと、変な値になってしまう。ピークがなさそうなら、強度が0に近い値になって欲しいのだが。あとはこの辺りをなんとかしないと。

Read more...

rubyの配列の作り方

rubyのArray
0から一ずつ増えていく整数を要素とする配列をつくるのに、Rだと0:9、pythonだとrange(0,10)などとすれば、簡単にできる。rubyでどうやるかわからなかったので、a=[];(0..9).each{|e|a<<e}とか(0..9).to_aでつくっていたのだが、実は[0..9]でよいらしい。 rubyを始めて結構たつが、こんなことも知らなかったとは。一行ぐらいで書けることは、調べるよりも書いた方が早いので、適当に書いて済ませてしまっているが、もう一度、一から勉強し直した方が良いのかも知れない。

2010/1/13追記 今、実行してみると、[0..9]は0..9という要素をもつ配列にしかなっていない。おかしいな。どこで上のように勘違いしたのだろうか。

Read more...

新しい言語

goとscala
googleがあたらしい言語を発表したらしい。goというらしいのだが、便利なのだろうか。言語といえば、scalaというのも注目を集めているらしい。両方ともcompile言語で、簡単に書けるらしい。 最近は、ruby以外はめっきり書いていない。cも一年以上書いていない気がする。rubyの欠点はinterpreterなので、実行速度が遅いということである。rubyの一部の機能を制限すれば、compileも可能な気がするのだが、できないものなのだろうか。 実は、今もrubyを使って測定を行っている最中である。最初に同じ測定をやったときには、いろいろなことを手で行わなければならなかったので、大変だった。今ではそのほとんどを適当にやってくれるので、随分と楽になったものである。しかし、rubyで測定をやっている人は少ないのではないかと危惧している。この前、私が書いたwindowsからGPIBをrubyで叩くためのコードを使っている人をネット上で見付けて驚いた。私の書いたコードを誰かが使って少しでも役に立っていれば幸いである。 今後、学習しようと思っている言語として、javaとpythonがあるが、scalaもその候補に加えておこう。goはとりあえず様子見かな。

Read more...