2009年
1月
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2009-01-03 Socketプログラムの改良

_ Queueを使ったアクセス数の制限

いろいろと試してたら、Socketのプログラムがだいたい動くようになってきた。今度のはこれ。
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から制御する準備は整った気がする。

2009-01-11 Debian

_ lennyのreleaseも間近か

久しぶりにDebianのサイトを覗いてみたら、次期メジャーリリースが近付いているようだ。リリースに関与するバグの数が100ぐらいになっている。過去の例を見ると、あと二ヶ月ほどでリーリスされる可能性が高い。

思い返してみると、メインマシンのOSをWindowsからLinux替えたのが約三年半前で、Sargeがリリースした後だった。それから二年ほどたってEtchに代えて、次はLennyか。

そういえば、研究室にはまだSargeのマシンがあるので、そろそろ入れ替えないといけないかな。EtchはなぜかGPIBがパッケージの形ではサポートされていないようだったので、なんとなくそのままにしてある。Lennyではパッケージが提供されるかな。Etchには、SSLの重大なバグがあったし。

まあ、新しいOSにしてもほとんど自分流のカスタマイズをしてしまうので、ほとんど変わらないのだけども、リリースが待ち遠しいな。そろそろGNOMEとかKDEとかにも慣れないといけないのかな。


2009-01-12 window manager

_ いくつかのwindow managerを試してみた。

現在、icewmを使っているが、調べてみると、このところあまり開発は盛んではないようだ。個人的には、軽いし最低限の機能はあるので、不満は無いのだが、開発が止まってしまうと徐々に廃れていく。

fluxboxをインストールして、試してみた。icewmのメニューのsystemのwindow managerのところには無かったので、.xsessionを書き換えて起動したが、後でみたら、プログラムの下のウィンドウマネージャにはあった。少し使った感じでは、まあまあ良い感じだが、メニューの一部が文字化けしていた。tabとslitが特徴らしいが、なぜか動かなかったので、icewmと比べて特に惹かれる点はあまり無いように感じた。

折角なので、Xfce4も使ってみた。こちらは統合環境の割には、起動が速くて関心した。あまりうるさい感じはしないし。キーボードショートカットの設定も比較的簡単なようだし。icewmの次の候補にしておこう。


2009-01-14 StringIO

_ CGIのformのデータ

CGIをrubyを使って書くことがあるが、formのデータを取り込むときには、
data=cgi.params["data"].collect{|l| l.read}
というようにしている。しかし、一度readしてしまうと、もう読めなくなってしまう。これをなんとかしたかったのだが、これまでどうしたら良いかが分からなかった。調べてみたら、上のlのclassはStringIOというもので、文字列なんだけどIOとして扱えるものらしい。読み込んだデータをもとに、もう一度StringIOを作ってやれば良いのだろうということで、
cgi.params["data"]=data.collect{|l| StringIO.new(l)}
としてみたら、うまく行った。読み込むたびにこれをやるのも面倒だが。もっと良い方法があるのかも知れないが、これで動いているからまあ良いかな。

2009-01-16 localhost

_ 127.0.0.1 or 127.0.1.1

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の時は、同じマシンからのアクセスだということにした。


2009-01-20 telnetのインストール

_ telnetとssh

最近は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との共存を考えてほしいものである。

2009-01-22 lennyのGPIB

_ lennyにGPIBをいれてみた

lennyのリリースがもうそろそろということで、lennyをインストールした。Xを入れるつもりはなかったので、標準システムしか入れなかったので、特にetchとの違いは感じなかった。etchではなぜかgpibのパッケージが無かったが、lennyは今のところgpibに対応してみるようなので、GPIBもインストールしてみた。
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の設定も自動にされるようだ。しかし、くせをつかむまでにはやはり多少苦労した。

2009-01-23 ベンガル語のフォント

_ ベンガル語とlinux

ベンガル語を勉強する必要がでてきたので、とりあえずフォントをインストールした。
aptitude install ttf-indic-fonts
あとはXを再起動しないといけないらしい。ctrl+alt+backspaceで再起動するが、他のプログラムも止まるので、仕事が終わってからにしよう。

2009-01-24 utf-8とhtml

_ utf-8の番号

htmlで多国語を扱うときには、utf-8が便利である。しかし、utf-8の文字を入力するのはそれほど簡単ではない。バイナリをいじったりする必要もある。htmlでは、অなどという書き方をすることができ、これだと普通のエディタで編集できるので、扱いやすい。このバイナリと番号の対応が分からなかったのだが、
man utf-8
としたら、変換の仕方が説明してあった。原理が分かったので、変換スクリプトをrubyで書こうと思ったら、
p "\xe0\xa6\xbe".unpack("U*")
で変換できてしまった。簡単に書けてうれしいような、アルゴリズムを考える必要が無くなって悲しいような。この数字に&#につければ、バイナリの代わりに文字を表すことができる。これで、ベンガル語のhtmlを楽に書けるようになった。