ふたつのブラケット
Rのtcltkでbindを使ってみた。tkbindを使えば良いのはすぐに分かったが、
tkbind(widget,"<<ListboxSelect>>",function(){})
でなんとか動いた。ふたつ括弧が必要なのはなぜだろう。ruby/tkのときは一つだったのに。まあ、tcl/tkを理解しないで使っているので、気にしないことにしよう。
ふたつのブラケット
Rのtcltkでbindを使ってみた。tkbindを使えば良いのはすぐに分かったが、
tkbind(widget,"<<ListboxSelect>>",function(){})
でなんとか動いた。ふたつ括弧が必要なのはなぜだろう。ruby/tkのときは一つだったのに。まあ、tcl/tkを理解しないで使っているので、気にしないことにしよう。
Rの正規表現は面倒だ。
perlやrubyでは、スラッシュでquoteするので、バックスラッシュの取扱いが簡単だが、Rでは、“や’でquoteするので、バックスラッシュを二個重ねないといけないので、厄介だ。
rubyだと、
r.gsub!(/\^\{([^\}]*)\}/){"\",phantom()\^{#{$1} phantom()},\""}
と書けば良いところを、
r<-gsub('\\^\\{([^\\}]*)\\}',"\",phantom()^{\\1 phantom()},\"",r)
というように長くなってしまう。ちなみに、phantom()はV4+とかのときに、エラーがでないようにするためにつけています。
Rのプログラムは思ったより組みやすい。
オブジェクト指向だし、変数はローカルだし、慣れればなんとかなりそうある。しかし、癖はある。rubyに慣れていると、括弧とかを省略してしまって、すぐにエラーがでる。
今日は、どんなデータフレームが読み込まれているかを調べる関数を作るのに苦労した。データフレームもローカルなんですね。また、is.data.frameは名前の文字列を入れると、文字列なので、常にFALSEを返してしまうので、evalでごまかした。
data_frame <- function(){
l<-ls(env=.GlobalEnv)
r<-c()
for(i in l){
if(eval(parse(text=sprintf("is.data.frame(%s)",i)))){r<-c(r,i)}
}
return(r)
}
Rでもtcltkが使えるようだ。
ruby/tkについて調べていたら、Rでもtcl/tkが使えることが分かった。試しに、基本的なwidgetをつかったプログラムを書いてみた。
require(tcltk)
tt<-tktoplevel()
tkwm.geometry(tt, "200x100")
tkwm.title(tt,"Hello")
tm<-tkmenu(tt)
tkconfigure(tt,menu=tm)
tmf<-tkmenu(tm,tearoff=FALSE)
tkadd(tmf,"command",label="open",
command=function(){fl<-tkgetOpenFile();cat(tclvalue(fl),"\n")})
tkadd(tmf,"command",label="quit",command=function(){tkdestroy(tt)})
tkadd(tm,"cascade",label="file",menu=tmf)
tkpack(tf1<-tkframe(tt),side='left')
tkpack(tf2<-tkframe(tt),side='left')
tkpack(tklabel(tf1,text='hello'))
tkpack(tkbutton(tf1,text='push',
command=function()tkmessageBox(message="hello!")))
te<-tclVar("entry")
tkpack(tkentry(tf2,width=10,textvariable=te))
tkpack(tkbutton(tf2,text='push',command=function()cat(tclvalue(te),"\n")))
Rは統計処理ソフトだが、グラフソフトとしても非常に強力だと思っている。しかし、GUIで使うのが困難なので、素人にはなかなか難しい。これに簡単なGUIをつけてみようと思って、rsrubyを使って、ruby/tkでGUIを作ってみたが、Rの処理が終わってしまうと、グラフの再描画が行われないなど、いろいろと問題があった。実は、Rから直接tcl/tkをたたけば、良いものができるかも知れない。問題はRのプログラムには慣れていないことと、作る時間があるかということかな。
コードの長さを競うゴルフがあるらしい。
rubyist magazineを読んでいたら、面白いものを見付けた。昔は、マシン語で、1バイト、1クロックを減らすために努力していたのを思い出す。Rubyist Magazine - るびまゴルフ 【第 3 回】では、標準入力から読み込んで、行番号、語数、文字数、内容を表示するものが問題として出ていた。もう締め切られているかもしれないし、どうやって投稿するのかよく分からないが、とりあえず書いてみた。
$><<[$.,split.size,$_.size-1,$_]*" "while gets
46byteだが、どうだろうか。トラックバックの設定をしてみよう。
2008/6/2追記 るびまのサイトにも登録されたようである。しかし、>等はそのまま記述すれば良いようだ。
2008/6/3追記 ~/$/とすると、行末のオフセットが帰るので、文字数が表示できるらしい。すると、41byteになる。
2008/6/3追記 私の知るところ、最短は38byteのようだ。byte数は変わらないが、別のversionを作ってみた。
#!ruby -ap $_=[$.,$F.size,~/$/,$_]*" "
ROXの挙動がおかしくなったので、初期化した。
~/に設定ファイルがあるはずだと思って探したが、あまりそれらしいファイル名がない。最初は.iconsかなと思って消したけどダメで、.configだということが分かった。これを消したら、当然前の設定は無くなって、うまく動くようになったけど、誤って消してしまった.iconsのために、アイコンが?と表示されるようになってしまった。まあ、使用する上では問題ないけど。
SSLを入れ換えたらGPIBが動かなくなってしまった。
DebianのSSLのセキュリティーホールを塞ぐために、先日dist-upgradeを行ったのだが、GPIBが動かなくなっていることに気がついた。新しいkernelがインストールされたので、それを使っていたのだが、GPIBのモジュールがそれに対応していないようだ。また、コンパイルし直すのも面倒だと思っていたら、古い方のkernelでbootしたら、動いた。まあ、しばらくはこのままでいこう。
整数の要素をもつ行列には注意が必要だ。
rubyでは行列も扱える。determinantや逆行列も簡単に求められるので、比較的便利である。しかし、注意が必要であることが分かった。例に次のコードを実行してみた。
require "matrix" m=Matrix[[2,0],[0,2]] p m.inv
結果は、零行列になってしまう。始めはなぜだか分からなかったが、実は整数の演算として計算するために起こることに気づいた。つまり、determinantを計算して、それが分母にくるので、すべて整数で計算した場合には、切り捨てられて0になってしまうのである。m.to_fとかのmethodが欲しいところであるが、それは無いようだ。/usr/lib/ruby/1.8/matrix.rbを見ると、collectはあるようなので、
m=m.collect{|e| e.to_f}
とすれば良いようだ。
DebianのSSLにセキュリティーホールが見付かった。
早速、研究室内のすべてのDebianマシンをdist-upgradeを行った。その過程で、実はsargeが一台だけ残っていたことが判明した。結果としては、この方がセキュリティー上は良かったわけだが。
今回のは、SSLというよく使われている部分だったので、影響は大きいだろう。
ウイグル文字でhtml
今週はウイグル語というよりウイグル文字の勉強をした。目的は、homepageのどこかを見れば分かるでしょうが。ウイグル文字はアラビア文字系で、右から左に読む。htmlでは、utf-8を使うのが良いのだろうということで、
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
として、コードは
ھىدروگېن
というように記述した。ちなみに、上の文字列は水素です。文字はアルファベットと対応がつけられているようなので、この変換スクリプトをrubyで書いて、いろいろ変換して表示させていくうちに、なんとなくは読めるようになってきた。 そうしているうちに気づいたのだが、ややこしいことに、前後の文字とのつながり方によって、文字の形が変わってしまいます。時には、元の文字が分からないぐらいに。ただ文字を並べるだけで、表示が変わるので、書くときにはそれほど意識する必要はないのだが、フォントはどんなしくみでこれを実現しているのだろう。しかし、困ったことに、いくつかの文字では、このつながったときに形が変わるべきなのに、変わらないということが起きている。おそらくこれは、アラビア語には無い文字の場合に、そのような処理が行われていないのではと予想しているが、確証は無い。ウイグル語のフォントも見付けたのだが、インストールするべきか迷っている。