タイムアウト処理

RS232Cのエラー
この間、装置が暴走してしまった。その原因はまだはっきりしないが、一番状況を説明できるのが、RS232Cの読み取りで止まってしまったという可能性だ。GPIBなどでは、長い間読み取りできないと、タイムアウトエラーになるので、そのエラートラップをかけておけばよいが、RS232Cにはデフォルトではタイムアウトがない。また、パリティーぐらいしかチェックしていないので、通信ミスでうまく命令が伝わらなくても、それに気づかないで、読み取ろうとしていつまでもデータが戻ってこない。そうなると、その部分でずっとプログラムが止まってしまう。 それを防止するために、RS232Cでもtime outができるように、読み込みのmethodをこんなふうにしてみた。

def read()
  @rs.write(sprintf("L\x0d\x0a"))
  t=Thread::start{@v=@rs.gets("\x0d\x0a").to_f}
  t0=Time::now
  while Time::now < t0+1
    return @v unless t.alive?
    sleep 0.01
  end
  t.kill
  print "rs232c timeout!\n"
  @v=-1.0
  return @v
end

もっとシンプルに書ける気がするが、読み取りはスレッドにまかせて、それが終了していたらその値を返して、それがいつまでも終わらなかったら、スレッドを殺すという感じである。 これで、RS232Cのエラーは無くなるはずだが、これが本当の原因なのかはまだはっきりしないので、他の部分も調べないと。

2008/11/30追記 timeoutのライブラリもあるようで、

require 'timeout'
def read()
  @rs.write(sprintf("L\x0d\x0a"))
  timeout(1){
    return @rs.gets("\x0d\x0a").to_f
  }
  rescue TimeoutError
    return -1.0
  end
end

てな感じで良いのかも。

Read more...

ntpの設定

時計の同期
時計の正確さはあまり気にしていなかったが、ようやくntpの設定をした。以前は失敗に終わっていたので、放っておいたというのが正確ですが。いつか気がついたのが、独自のntpサーバーがあるらしく、外部のntpの使用は禁止されているかも知れないということである。つまり、そのntpサーバーを指定すれば良いということです。 インストールするのはntpかと思ったら、ntpdateだった。ntpはサーバーのようです。

sudo aptitude install ntpdate

/etc/default/ntpdateで設定を変更。NTPDATE_USE_NTP_CONF=noとntpサーバーを指定。これで、

sudo ntpdate-debian

とすれば、時計を合わせてくれる。cronなどで自動でやるのもいいけど、今回はやめにしよう。/etc/cron.daily/をみたら、ntpというのがあったけど、これはntpを誤ってインストールして、アンインストールしたけど残ってしまったものかな。

Read more...

検索form

サイト内検索
blogも長くなってくると、検索機能が欲しくなってくる。メモの意味合いもあるので。本当はNamazuなどをインストールすると良いのだろうが、面倒なので、googleで自分のサイトに限定して検索するようにしてみた。 inurlを使うと、URLに含まれる文字列を限定できるので、これをblogのURLを入れれば、良いことになります。プラグインのsearch_form.rbを使うと、短く書けそうだが、まあ良いだろう。欠点としては、googleが見に来てくれるまでは、検索にかからないということだ。

2008/9/28追記 カレンダーの右に持ってきたいのだが、うまくいかない。

2009/2/11追記 inurlではあまり検索にかからない場合が多いので、キーワードを追加して検索する方法に変えてみた。

Read more...

web cameraのストリーミング配信

web cameraで動画
ストリーミングの配信には、他のソフトをインストールする必要があるのかと思っていたが、/usr/share/doc/webcam-server/applet/webcam.htmlをブラウザで見ると、動画が見れることが分かった。デフォルトだとFPSが1なので、5ぐらいにしておくと良いだろう。 あとはIPの制限などをしたいところだが、この設定はまだ不明だ。 apacheの方で制限することはできるが、httpから直接見ることはできるし。webcam-serverを-Dhオプションで立ち上げれば、localhostのみからアクセスが可能になるが、それでは別のマシンから見れないし。

Read more...

web camera

web cameraを設置した
昨日までは出張だった。上野で新幹線から常磐線に乗り換えるときにweb cameraを見付けたので、おもちゃとして買ってきた。Creative製だったので、まあそれなりのものだろう。USBをさしたらov511というdriverで認識したようだ。xawtvをインストールして実行したら、何もしなくても見ることはできた。webcam-serverをインストールして、

webcam-server -d /dev/video1

でサーバーを起動すると、8888のポートで見ることができるようになった。video0はキャプチャーカードが使っているので、video1を指定する必要があったが、結局ほとんど何もしないでweb cameraが使えるようになってしまった。まだ細かい設定やストリーミングは配信できるようにはしていないが。Linuxでは古いハードの設定は非常に簡単にできるようになっているように感じる。

Read more...

プロジェクターとポスター

platexとrubyをつかって準備
最近のプレゼンの手法としては、プロジェクターとポスターが主で、OHPはほとんど使われなくなってきた。OHPシートは別の目的に良く使うので、無くなると困るのだが。プロジェクターの場合にはprosperを、ポスターの場合はposterクラスを使ってplatexで作っている。 しかし、直にtexで書くとコマンドなどがいろいろと入って構造がよくわからなくなるので、texのソースはrubyで作っている。arrayとして、内容を記述しておいて、それをrubyで処理すると、texのソースができる仕組である。実際には、化学式などの表記を適宜処理するスクリプトも使っているが。 このとき、プロジェクターとポスターの元になるarrayのフォーマットを共通にしておくと、ポスターの内容をそのままプロジェクターに移植することもできて便利である。多少の場所などの調整は必要になるが。 ひとつ難点を挙げると、最終的にはpdfにするのだが、間でpsを通るので、そのファイルサイズが大きくなってしまうことである。dvipdfmxで処理するとprosperはうまくいかないので、dvipsとps2pdfを使っているのである。

Read more...

色空間

rainbowのRGB表示
いくつものデータのあるグラフを書いていると、それぞれのデータをいろいろな色で区別する必要がある。このとき、どのような色で表現するか迷うことがあるが、その場合にはrainbow colorをしばしば用いる。 このrainbow colorは、HSV色空間でHueを等間隔で変化させた色となっている。色空間としては、RGBが有名であるが、rainbow colorをRGBで表すとどうなるかが必要になった。HSVとRGBの変換公式から計算すれば良いのだが、これは面倒だ。できるだけ簡単にRGB表示を求める方法はないかと考えると、Rを使うと良いということに気がついた。 Rでは、rainbow(n)とすると、n分割した色のベクトルとなる。そこで、

col2rgb(rainbow(7))

とすると、RGBの値が表示される。 YIQなんかも一種の色空間と言えると思うが、地上デジタルの場合には、どうなるのだろうか。白黒の地上デジタルなんかもあるのかな。

Read more...

クラス分け

最適な構造
最近立ち上げている装置が、ようやく動き出そうとしている。今日は、実際の測定とほぼ同じセッティングで初めての運転。昨日中に、プログラムの変更は終え、今日は本試験といった感じ。 始めは比較的シンプルな装置だったが、今ではGPIB機器が14台ぐらい、GPIBにもNIのボードとプリンターポートでGPIBをエミュレートした二系統あり、GPIB機器としてはAVRで作った自作のGPIB機器もあり、モーターが7つぐらい、電磁バルブが三つぐらい、という自分でも全体を把握しているのかあやしいような装置になってきた。昨日はそれに録音プログラムも追加したし。 それにともなって、制御用のプログラムも複雑になってきている。そのプログラムは、GUIを必要とするので、Ruby/Tkで書いている。いろいろな装置に対して、一つのクラスを定義して、それをさらに別のクラスが呼び出すという感じになっているが、いくつものクラスがどう継っているのか、よく分からなくなってしまっている。クラスを書いてブラックボックス化すると、その下の階層のことを気にしないで良くなるので、詳しいことは忘れてしまう。しかし、本当にそのクラスの割り当てかたが最適なのは、疑問が残ることがある。 それはさておき、実験の方は、中盤で物理的な問題で失敗した。プログラムは素直にそれを実行してくれるが、実際のものは想定外のことが起きることが多く、プログラムよりも難しいのかも知れない。

Read more...

wavフォーマット

音の解析
実験中の装置の音を記録する必要が生じて、いろいろと試していたが、alsaで録音ができるようになった。苦労していた点は、マイクの端子が微妙に違っていたところと、alsamixerの微妙な設定だった。 音質を上げるとサイズが大きくなるので、サンプリングレートは10kHzにして、unsigned 8bitで記録すると、5分で3Mbyteになった。これだと一日で1.4Gbyteなので、連続実験の音を記録しても大丈夫そうだ。しかし、音質はかなり悪い。 最初は音量を最大にしていたので、大きな音がうまく記録されなかった。これは、PCMでは仕方がないが、mic boostを調整してなんとかした。 記録形式は、wavの8bitPCMで、headerの44byteを除くと、そのまま1byteごとのデータになっているので、処理はそれほど難しくない。とりあえずは、大きな音がいつ生じたかを調べるために、値がある程度大きい時間を表示するプログラムを書いてみた。あとは、必要に応じて作っていこう。 しかし、データが大きいので、波形をRで表示するのもなかなか時間がかかってしまう。

Read more...

emacsで置換

emacsで改行の置換
emacsの置換は意外に難しい。すべてを置換するときに!だったり、改行を指定するときにc-q c-jだったり。改行は\nで指定したいと思うのは私だけだろうか。タブはC-q tabっぽい。 editorとしては、emacsかnanoを使っている。Linuxではまだ本当に気に入ったeditorにはであっていない。手をemacsになれさせているところである。 DOS時代はVZが最強だと思っていたし、今でもその思いは変わらない。そういえば、XZはどうなったんだろう。Windowsでもeditorは何を使うべきか迷うところだが。

Read more...