メインPCのOSの入れ替え
Debian Squeezeもリリースされてからしばらく経つし、新学期に向けてOSを新しくしようと思って、ようやく重い腰を上げることにした。しかし、今回は、少し苦労している。
まず、lxde用のisoをダウンロードして、CDRを一枚使うのも無駄な気がしたので、CDRWを使ったら、途中のデータのチェックではじかれたので、仕方なくCDRでやり直した。
/homeは別のパーティションにしているし、一応データのバックアップも取ったので、/のパーティションは気兼ねなくフォーマットでして、標準のインストールをした。しかし、なぜかXが立ち上がらない。taskselで選ぼうと思ったら文字化けしているので、dpkg-reconfigure localesで、標準のフォントを英語にして、taskselでdesktopを選択したら、今度は gdmが立ち上がるようになった。
次に、日本語が入力できない。lennyの時は、何も設定しないで使えたはずなのだが。これは、scim-anthyをインストールしたら、入力できるようになったので、まあそれほど苦労しなかった。
次に必要なツールをインストール。emacs23,anthy-el,ruby,libtcltk-ruby,r-base,r-cran-rgl,imagemagick,icedove-l10n-jaをとりあえず入れた。あとはtexだが、これはもう少し落ち着いてからにしよう。
まだいくつか不具合があるかも知れない。もう少し待ってからインストールした方が良かったかな。
HDDの不良
再びPCの修理
また、実家のPCが動かなくなったということで、解決してきた。二週間に一度故障するのは困ったものだが、おそらく前回の故障と関連があるのだろうが。どうやら、 HDDが時々認識できなくなっているのが原因のようだ。HDDはIDEとSATAの二台積んでいるのだが、SATAが一旦認識できなくなると、IDEがbootドライブとして設定されて、その後SATAがうまく動くようになっても、IDEから起動しようとして、うまく動かなくなっていた。BIOSの設定で、SATAをbootドライブに選択しなおすと、起動できるようになった。しかし、そもそもの原因はSATAのHDDが認識できなくなるためなのだが、それがなぜなのかは分らない。一つ気になるのは、SATAのケーブルはIDEに比べて抜けやすいので、接触不良なのではないかということだ。しかし、これを防ぐのは難しいし、ハードの問題の可能性もあるし、対策は難しいかな。IDEにwindowsを入れなおすのも面倒だし。
メモリの相性
実家のPCの修理
実家のPCが動かなくなったという連絡があったので、対応に行ってきた。始めはHDDがクラッシュしたのかと思ったのだが、BIOSのsetupが起動しないので、どうやらマザーの問題らしいと推測した。一応、マザーの上の電解コンデンサーをチェックしたが、問題なさそうだ。次にいじれる場所としてメモリを疑うことにした。以前メモリを増設したことがあったので、この相性問題点が遅れて表れたのではと推測したのだ。以前増設したメモリを抜いてみたら、無事起動するようになった。以前も経験したことがあるのだが、しばらくはうまく動いていたのに、いきなりメモリの相性問題が具現化するときがあるようだ。PCのような電子機器は、再現性よく毎回同じ挙動をしてほしいのだが、最近のPCは、人間性が出てきたのか、いきなり機嫌を損ねることがあるようである。
整数型のくせ
AVRモーター制御
GPIBからステッピングモーターを制御していたのだが、これが微妙にうまく動いていなかったので、その原因を探っていたら、予想外のところが引っかかっていた。モーターでバルブを開ける時には、30000パルス送っていて、閉めるときには確実にその一割増しにしていた。そのとき、開けることはできるのだが、閉めることができない。最初は、モーターの指定とか、排せんの異常を疑っていたのだが、いろいろと調べていると、パルス数を少なくすると動くことが分かった。AVRの中のプログラムをどのように書いたか忘れてしまったが、整数型を使っていた気がする。そういえば、2^{15}は32768ので、2byteを使ったsigned intだと、-32768から+32767まで表現できる。閉めるときには、一割増しにしているので、33000パルス送ると、ぎりぎりでこの範囲を越えることになる。これがうまくいっていなかった原因だった。そこで、開ける時に29000パルスにしたら、無事に動くようになった。なかなか難しいな。
昔は簡単だったが
telnetでX
Linuxで動いている古いマシンで、Xをtelnetでリモートで使おうとしたが、なかなかうまくいかなかった。まずはlocalで、
xhost +RemoteIP
として、そのサーバからのアクセスを許可する。次に、
telnet RemoteIP -l username
でログインする。そして、
setenv DISPLAY LocalIP:0
として、displayを設定すれば、あとはremoteで立ち上げたXのアプリケーションが使えたはずなのだが、
_X11TransSocketINETConnect: Can't connect: errno = 111
と表示されてうまくいかない。 いろいろと調べていたら、debianの場合には、/etc/X11/xinit/xserverrcに-nolisten tcpという記述があり、これを取り除かないといけないらしいという情報を見つけた。これを試してみて、Xを再起動したが、それでも症状は変わらない。次に試したのが、root権限でgdmsetupを実行して、そのセキュリティのところの「Xサーバへの転送を近視する」のチェックをはずして、Xを再起動した。すると、今度はうまくいった。MacOSXのX11でも、環境設定のところで、セキュリティーをあまくするように設定したらうまくいった。WindowsのXMingも試してみたが、適当に設定したら、一応動いている。最近は、sshばかり使っていて、-Xオプションをつけるだけで良いので、楽なのだが、telnetはもう時代遅れなので、使おうとすると苦労するようだ。
ubuntuのproxyの設定
wgetも必要だった。
ubuntuの設定をしていたのだが、ttf-mscorefontsを入れようとすると、通信ができていないことが分かった。proxyを通してapt-getをする場合には、/etc/apt/apt.confにproxyの情報を書いておかないといけないのだが、それ以外にも設定が必要なようだ。いろいろと調べてみたら、どうやらwgetでフォントのデータを取りにいっているようだ。そこで、.wgetrcにhttp_proxy=http://proxy.jpなどという項目を追加したら、うまく行くようになった。
2011/4/6追記 debianの場合には、~rootに.wgetrcを作らないといけないようだ。
2011/6/7追記 /etc/apt/apt.confに書く内容は、Acquire::http::Proxy “http://proxy”;
debianとredhat
redhatのnetwork設定
普段はdebianを使っているが、redhatを使う必要があって、少しいじってみたが、いろいろと設定の仕方が違って戸惑った。特にnetworkの設定ファイルが、debianだと、/etc/network/interfacesなのだが、redhatでは、/etc/sysconfig/network-scripts/ifcfg-eth0等になるらしい。書く内容も少し違っている。まあ、適当に修正したら動いたので、ほっとしている。
squeezeのリリース
Debian squeezeがリリースされた。
今か今かと思っていたが、ようやくDebian 6.0であるsqueezeが2/6にリリースされていた。同時に、ホームページが一新されていた。
squeezeは二ヶ月ほど前のtestingの時から使い始めているが、lxdeの以前lennyで使っていたときとほぼ同じ構成で使っているので、特に違いは感じない。個人的には、gpibが標準のパッケージから外れたのはデメリットであるが。リリースノートを見てまず驚いたのが、Debian GNU/kFreeBSDである。通常、DebianはLinux上で動いているのだが、これをBSD上で動かすようにしたものを、正式にサポートするようになったらしい。
それから、Debian Scienceというものがあり、科学関係のパッケージが管理されているらしい。とりあえず、gcrystalというものを試してみた。CIFの読み込みもできるようだが、bondの定義が面倒な感じがした。VESTAの方が洗練されているように感じるが、公式なパッケージとしてこのようなものが出てきたことは歓迎すべきであろう。
今後もDebianが使いやすいOSになって行くことを期待したい。
latexの違い
Macのtex
MacOSXのlatexを使っている人が、数式中で\rmがうまく動かないと言うので、見てみたら、確かにうまくいっていない。\mathrmも動かない。調べてみたら、jarticleでは動かないという人を見つけた。そこでは、amsの\textを勧めていたので、それを使ってみた。\usepackage{amsmath,amssymb}として、\textを使うと、今度はうまくいった。最近はフリーウェアを使うときに、OSの違いを意識することは少なくなったが、こんなところにもまだ違いがあるようだ。
再帰を用いた括弧の処理
化学式の計算
括弧付きの化学式の式量を計算する良いスクリプトのアイディアが浮かばなかったが、再帰を用いると、比較的シンプルに書けることに気がついた。単純な化学式は、以前考えたが、
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の部分の正規表現の.*?の?を取ればこれに対応するが、今度は前者に対応できなくなる。この両者をシンプルに判定するにはどうしたら良いのだろう。
2011/2/1追記 汚い方法だが、括弧の中を内側から、式量を計算して、それを水素に置き換えていくという方法で、いろいろな場合の括弧に対応できた。
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