|
setup diary |
require 'socket' require 'thread' q=SizedQueue::new(3) s=TCPServer.new(12344) Thread.start(s.accept){|cl| begin q.push(0) cn=cl.peeraddr.join(":") print "%s is accepted as %d/%d connection.\n"%[cn,q.size,q.max] cl.each{|cmd| cmd=cmd.strip str=case cmd when "status" (rand(2)>0)?"good":"bad" when "color" ["red","green","blue"][rand(3)] else "unknown command" end cl.puts "BEGIN" cl.puts str cl.puts "END" } #rescue Errno::ECONNABORTED ensure cl.close q.pop print "%s is closed remaining %d/%d connections.\n"%[cn,q.size,q.max] end } while trueエラーの処理とQueueを使ってアクセス数の管理を加えた。それから、BEGINとENDで囲むことによって、複数の行のやりとりをするようにした。この部分の処理をクライアント側でもする必要があって、
require "socket" END{ print "connection is closed.\n" } s=TCPSocket.open("localhost",12344) loop{ s.write(["status","color","unknown"][rand(3)]+"\n") begin p s.gets exit unless $_ end until $_=~/^END/ sleep 0.5 }とした。接続が切られたときにはgetsだとnilが返るので、そこで終了することにして、ENDの処理が行われる。この部分はreadlineで受けてエラーをrescueした方が良いかも。 これで、測定系をsocketから制御する準備は整った気がする。
久しぶりにDebianのサイトを覗いてみたら、次期メジャーリリースが近付いているようだ。リリースに関与するバグの数が100ぐらいになっている。過去の例を見ると、あと二ヶ月ほどでリーリスされる可能性が高い。
思い返してみると、メインマシンのOSをWindowsからLinux替えたのが約三年半前で、Sargeがリリースした後だった。それから二年ほどたってEtchに代えて、次はLennyか。
そういえば、研究室にはまだSargeのマシンがあるので、そろそろ入れ替えないといけないかな。EtchはなぜかGPIBがパッケージの形ではサポートされていないようだったので、なんとなくそのままにしてある。Lennyではパッケージが提供されるかな。Etchには、SSLの重大なバグがあったし。
まあ、新しいOSにしてもほとんど自分流のカスタマイズをしてしまうので、ほとんど変わらないのだけども、リリースが待ち遠しいな。そろそろGNOMEとかKDEとかにも慣れないといけないのかな。
現在、icewmを使っているが、調べてみると、このところあまり開発は盛んではないようだ。個人的には、軽いし最低限の機能はあるので、不満は無いのだが、開発が止まってしまうと徐々に廃れていく。
fluxboxをインストールして、試してみた。icewmのメニューのsystemのwindow managerのところには無かったので、.xsessionを書き換えて起動したが、後でみたら、プログラムの下のウィンドウマネージャにはあった。少し使った感じでは、まあまあ良い感じだが、メニューの一部が文字化けしていた。tabとslitが特徴らしいが、なぜか動かなかったので、icewmと比べて特に惹かれる点はあまり無いように感じた。
折角なので、Xfce4も使ってみた。こちらは統合環境の割には、起動が速くて関心した。あまりうるさい感じはしないし。キーボードショートカットの設定も比較的簡単なようだし。icewmの次の候補にしておこう。
data=cgi.params["data"].collect{|l| l.read}というようにしている。しかし、一度readしてしまうと、もう読めなくなってしまう。これをなんとかしたかったのだが、これまでどうしたら良いかが分からなかった。調べてみたら、上のlのclassはStringIOというもので、文字列なんだけどIOとして扱えるものらしい。読み込んだデータをもとに、もう一度StringIOを作ってやれば良いのだろうということで、
cgi.params["data"]=data.collect{|l| StringIO.new(l)}としてみたら、うまく行った。読み込むたびにこれをやるのも面倒だが。もっと良い方法があるのかも知れないが、これで動いているからまあ良いかな。
socketのプログラムを書いていて、サーバーが動いているマシンと同じマシンからのアクセスなのか、異なるマシンからのアクセスなのかを判断しようとして、少し迷った。サーバー側でクライアントの情報を見ると、自分のマシンが127.0.1.1になっている。localhostは127.0.0.1なのに変だなと思って調べると、/etc/hostsには'localhost'だと127.0.0.1で、ホスト名だと127.0.1.1となるらしい。とりあえず、127.0.1.1の時は、同じマシンからのアクセスだということにした。
最近はsshのみでtelnetはほとんど使わないのだが、windowsとlinuxからなる外につながっていないネットワークで使用しようと思って、linuxにtelnetをインストールした。windowsではsshも使えないので、cygwinを入れるのも面倒だし、telnetでいこうということになったのだ。
sshはコマンドラインで一発でインストールできるのだが、telnetは意外に面倒だった。まずは、aptでtelnetdを入れて、/etc/inetd.confに
telnet stream tcp nowait telnetd /usr/sbin/tcpd /usr/sbin/in.telnetdという行を追加する。さらに/etc/hosts.allowのホストですべてを許可するように、
ALL: ALLとする。そして、inetdを再起動するために、
/etc/init.d/openbsd-inetd restartとする。ついでにftpdもインストールしたが、こちらは特に設定する必要はなかった。 windowsがsshに対応していれば、こんなこともしなくても良いのだが。少しは他のOSとの共存を考えてほしいものである。
aptitude install gpib-modules-source module-assistant auto-install gpib aptitude install libgpib0-devとしたら、すべてのパッケージがそろった。あとは、/etc/gpib.confでnameを適宜変更して、/etc/groupでユーザーのグループを設定する。今回のボードでは
name="ni_pci_accel"とした。gpib-rubyのインストールはetchとかとほとんど同じだった。 設定をいろいろといじっていたら、起動したときにうまく組み込まれなかったり、gpib_configが実行されなかったりしたが、結局ボードの設定のみをいじれば良いらしい。 以前に比べると、インストールのときに打つコマンドが非常に少なくなったように感じる。gpib-modules-sourceをいれたらkernelのソースも自動的に入ったし、modprobeの設定も自動にされるようだ。しかし、くせをつかむまでにはやはり多少苦労した。
aptitude install ttf-indic-fontsあとはXを再起動しないといけないらしい。ctrl+alt+backspaceで再起動するが、他のプログラムも止まるので、仕事が終わってからにしよう。
man utf-8としたら、変換の仕方が説明してあった。原理が分かったので、変換スクリプトをrubyで書こうと思ったら、
p "\xe0\xa6\xbe".unpack("U*")で変換できてしまった。簡単に書けてうれしいような、アルゴリズムを考える必要が無くなって悲しいような。この数字に&#につければ、バイナリの代わりに文字を表すことができる。これで、ベンガル語のhtmlを楽に書けるようになった。