平均の計算
ルービックキューブを揃えるタイムには、いくつかの種類がある。単発のタイム以外に、12回計測してその中から最も速かった回と最も遅かった回を除外した10回の時間の平均や、5回計測してその中から最も速かった回と最も遅かった回を除外した3回の時間の平均などがある。そのうち、最後のものを計算するプログラムをrubyで書いてみた。
p data.split(/\n/).map{|l| l.to_f}.sort[1..3].inject(:+)/3
ううん。以外に長くなってしまった。
平均の計算
ルービックキューブを揃えるタイムには、いくつかの種類がある。単発のタイム以外に、12回計測してその中から最も速かった回と最も遅かった回を除外した10回の時間の平均や、5回計測してその中から最も速かった回と最も遅かった回を除外した3回の時間の平均などがある。そのうち、最後のものを計算するプログラムをrubyで書いてみた。
p data.split(/\n/).map{|l| l.to_f}.sort[1..3].inject(:+)/3
ううん。以外に長くなってしまった。
tdiary3.1.3へ
wwwサーバーが更新されるということで、tdiaryも更新することにした。rubyは1.8.7になった。最新のtdiaryは4.0.0だったが、こちらはruby1.8では動かないということで、3.1.3にした。
設定ファイルとして、tdiary.confや.htaccessと.htpasswdをいじったり、権限を変更したり、blogのデータを移したりしたら、ようやく動くようになった。また、以前tdiaryのversionを下げたときに、表示できなくなっていたページもうまく表示できるようになった。
今月は忙しかったので、なかなか更新できなかったのだが、ようやく完了した。
ruby1.8とruby1.9の違い
OSの入れ替えに伴い、普段使っているruby1.8のプログラムを、1.9に書き換えていくことにした。一応、いくつかの違いは理解しているつもりだったが、まだまだ知らないものがありそうだ。
昨日書き換えたプログラムでは、stringの[n]をgetbyte(n)に変えた。
今日は、require “file"をrequire “./file"とした。
さて、次はどんな変更が必要なプログラムが出てくるだろうか。
ようやくインストール
DebianのWheezyが出てから、しばらくたったので、そろそろインストールしてみようと思い立って、やってみた。しかし、思ったよりも苦労してしまった。
ネットワークの調子がいまいちなので、CDを焼いて、まずはそこからインストールできる分だけをインストールしたら、GNOMEになってしまった。LXDEにしようと思っていたのに。さらに、日本語が入っていない。また再インストールするのも面倒なので、必要なパッケージをaptitudeで入れていったら、なんとかなった。結局、lxde, task-japanese, task-japanese-desktopを入れれば良かったようだが、その前にibus-anthyをいれたりしたので、日本語変換ができなくなり、ibusをremoveして、さらにim-switchを入れたら、ようやくなんとかなった。
しかし、以前苦労したプリンターの設定はあっさりとできた。また、動作も機敏になった気がする。
今問題になっているのが、rubyのversionが1.9であることである。1.8を入れても良いのだが、そろそろ移行しようと思って、あえて入れないことにしている。しかし、binaryを扱った場合にはstringの[]の挙動が違うので、ことごとくエラーが出てしまうので、多くのプログラムを書き換えないといけない可能性が高い。
virtualbox上のマウスの妙な挙動
ubuntu上のvirtualboxでwindowsNTを動かして、それで装置の制御を行っている。古い装置は古いOSでしか動かないので、面倒である。少し前にようやく動くようになって、しばらくは順調だったのだが、少し問題が生じた。
virtualbox上でマウスが妙な挙動をするのだ。動かしていないときは大丈夫なのだが、動かすと、クリックをしたときのような動作が起こり、誤動作を引き起こしかねない。virtualboxを再起動すると直るのだが、二度起こったので、今後も起こる可能性が高い。
原因としては、full screen modeとwindow modwを切り替えるときに、何かが起こるのか、screen saverが悪さをするのかである。とりあえずは、様子をみることにする。
imagemagickとrubyによるデジタル文字の取り込み
装置の7セグ表示器に表示される数字を、数値データとしてPCに取り込む必要性が生じた。とりあえずwebカメラで表示器を撮影して、ファイルとして保存しておいたのだが、これから数字を読み取ることにした。当初はOCRを使えば簡単にできると思っていたのだが、表示器の数字には対応していないようである。linuxでつかえるgocr、ocrad、tesseract-ocrを試したが、どれもダメだった。
そこで、7セグだけを読み取るプログラムを書くことにした。まずは、imagemagickのconvertを使って、白黒の単純なファイル形式であるpnmに変換した。なお、asciiで保存するために、-compress Noneオプションを付けた。それをrubyで処理することにした。
数字を認識するアルゴリズムをいくつか考えたが、結局以下のようなものになった。まず、周囲の文字が無い部分を取り除き、それぞれの文字に文理し、文字の部分を3*5に分割して、0から9までのパターンとの一致具合をxorで判定して足し合わせる。そして、点数の大小で数字を判定する。それなりに短いプログラムではあるが、まあまあの認識率である。
今後の課題としては、画像の中のどこに表示器があるかを認識することがある。今は表示器の部分を切り出した後でプログラムで処理しているが、切り出しも自動でできるようになれば、少しwebカメラが動いても、そのまま処理できるのだが。
ホストオンリーネットワーク
linux上のvirtualboxでvirtualなPCを立ち上げて、ホストとvirtualなPCの二台だけでネットワークを組みたい時がある。この際には、ホストオンリーネットワークというのを使えば良い。この時、DHCPサーバーの機能も組み込まれるが、ゲストに与えるIPの範囲を限定してしまえば、実質的な固定IPとして使うことができる。ゲストOSとして、古くて外部のネットワークにつなぐのを避けたい場合に、使いやすい設定である。
rubyでベクトルの足し算
プログラムを組むときに、vaとvbのベクトル和を計算してsumに代入する必要があったので、いろいろな方法を考えてみた。まず、一番単純なものとしては、indexを使ってそれぞれの成分を足す方法がある。
va.size.times{|i| sum[i]=va[i]+vb[i]}
size.timesの代わりにeach_indexなどを使っても同じである。次に考えたのが、片方の値をmethodを使って取り出す方法である。
va.each_with_index{|v,i| sum[i]=v+vb[i]}
しかし、かえって長くなっているので、あまり意味が無いように思われる。やはり、methodをどう使うかが、rubyの醍醐味なので、次のようなものも考えてみた。
sum=va.zip(vb).map{|a| a.inject(:+)}
これは、zipでそれぞれの成分を配列にして、それをinjectで足してしまう方法である。でも、長さはあまり変わらない。素直にMatrixのVectorをつかえということかな。
コンパイルはできたが
raspberry piのraspbianでUSBTMCを使うためにいろいろとやってみた。まず、agilentから、usbtmc.tarをdownloadしてこれのコンパイルを試みた。まず、kernelのソースをgitで落として、usbtmcをコンパイルしようとしたが、ソースが古いようで、なかなかうまくいかない。結果的には、二行だけいじることで、コンパイルは通るようになった。しかし、modpostが無いとか言われたので、カーネルのmake modulesしたら、usbtmc.koを作ることに成功した。しかし、insmodをしようとすると、
Error: could not insert module usbtmc.ko: Invalid module format
となってしまう。いろいろと調べていたら、kernelのソースのdrivers/usb/classに、usbtmc.cがあることを発見した。これをコンパイルした方が良いということで、これをmake modulesしてみたが、結果は同じだった。結局、kernelをコンパイルし直さないといけないと判断した。これは、また後にしよう。