rubyは少し面倒かな.
rubyで階乗を使おうと思ったら,意外に面倒だった.maximaだと数学と同じように4!と書ける.Rだと,prod(1:4)で計算するか,gamma(5)を使う方法もありだと思う.一方,rubyだと,(1..4).inject(:*)とするしか無いかな.その書き方を使って,階乗を沢山含んだ式を書いたら,長いコードになってしまった.わざわざ定義するほどでは無いし.
owonのオシロスコープ
SDS7202の制御
電気的なシグナルを見るためにオシロスコープを使うことがあるが,その波形をPCに取り込む必要性が出てきた.しかし,手持ちのオシロの多くはPCとのinterfaceがついていない.幸いなことに,手元にあったowonのSDS7202には,USBとLANのポートがあって,通信もできそうだと思って調べてみたら,測定のパラメータはSCPIコマンドで変えられるらしいことが分かった.しかし,波形の取り込みについては,やり方がすぐには分からなかった.
専用のソフトを使うとできるようなので,原理的には可能なはずだと思っていろいろと調べてみると,参考になる情報がいくつか見つかったので,それをもとに試行錯誤して,なんとか通信できるようになったので,その概要を書いておく.その時に作ったプログラムも,いずれは公開するかも知れない.
まず,PCとの接続には,LANを用いた.固定IPを指定したら,問題無く通信をすることができた.最初に苦労したのが,SCPIコマンドで,大文字と小文字の区別をすることである.通常の装置は,その区別が無いので,そう信じて通信していた,うまく行かずに原因の究明に時間を取られてしまった. 波形のdataは,STARTMEMDEPTHを送ると,直前の測定のbinary dataが返ってくる.このformatが少し独特で,web上で見つかった情報にもいくつかの誤りがあったので苦労したが,いくつかの不明な点を除くと,だいたい理解することができた.この詳細を書くと長くなるのでrubyで書くと,以下のような感じである.ここで,dが返ってきたdataから,先頭の通信用のフラグの12byteを除いたものである.
model,unknown1,serial, trig,channel,zero1,zero2,hPos,type, remain = d.unpack("A6VA30C4s<aa*")
trigger={"s"=>[1],"a"=>[1,2]}[type].map{
trgSrc,trgMod,remain=remain.unpack("Caa*")
unpck = trgMod=~/[ep]/ ? "l<aa*" : "aa*" # edge or pulse
remain,sep,level = remain.unpack(unpck).reverse
[trgSrc,trgMod,level,sep]
}
ch1,ch2=[1,2].map{
ch=remain.unpack("A3l<V9e4")
#ch,block,memory,from,screensize,size,movesize,tbase,voffset,vbase,attenuation,tdiv_us,freq,cycle,vdiv_mV
next unless ch[1]
block=3+ch[1].abs
ch=remain[0,block]
ch=ch.unpack("A3l<10e4a*")
remain=remain[block..-1]
unpck=ch[2][0]>0 ? "c*" : "s<*"
ch[-1]=ch.last.unpack(unpck)
[ch[11]*1e-6,ch[-1].map{|l|(l-ch[8])*ch[14]*1e-3}]
}
[ch1,ch2,trigger]
でも,これで分かってくれる人は,どの位いるのだろうか.
ubuntu22.04のくせ
Jammy Jellyfish
少し前にインストールしたubuntu22.04LTSであるが,少しだけ気になることがあったので,記録しておこうと思う.budgieを選んだが,他の環境でも同じだと思う.
まず,以前のLTSと変わっていたことに気がついたのが,firefoxがsnap版になっていたことである.apt版を入れるには,少し工夫が必要なようだった.大抵のことはどちらでも変わらないと思うが,OSのインストールなどをしたときの,環境の引き継ぎなどのやり方が変わるのでは無いかと思われるので,気をつける必要がある.
あと,いくつかのサイトのipの取得に失敗するようで,新たにgoogleのDNSである8.8.8.8を設定したら,うまく動くようになった.自動設定などでnetplanを使うようになったことによる不具合なのでは無いかと予想している.もうしばらくすると,このバグも取れるかな.
vestaのインストールの仕方
bullseyeとJammy Jellyfishにvesta
もう数ヶ月前になるが,ubuntu22.04LTSがリリースされたので,vestaが入れられるかどうかを調べてみた.また,source.listを使ったインストールの仕方がweb上にあまり書いていないようなので,ここに載せておく.まず,debian11かubuntu22.04に応じて,下のようにしてどちらかのファイルを取ってくる.
wget https://sourceforge.net/projects/materiappslive/files/Debian/sources/materiapps-bullseye.list wget https://sourceforge.net/projects/materiappslive/files/Debian/sources/materiapps-jammy.list
ここでは,debianの例を書くが,listをaptのフォルダに入れて,updateしてkeyringを有効にすると,このsource.listが有効になる.
sudo cp materiapps-bullseye.list /etc/apt/sources.list.d/ sudo apt-get -o Acquire::AllowInsecureRepositories=true update sudo apt-get -y --allow-unauthenticated install materiapps-keyring sudo apt-get update
そしたら,vestaなどはaptやaptitudeで入れられるようになる.ubuntuは試していないが,non-freeの中にvestaがあるので,多分大丈夫なんだと思う.
CPUの使用状況
topとhtop
CPUの使用状況を調べるために,これまではtopを使っていました.しかし,マルチコアのCPUに対しては,100%以上が表示されたりして,よく分からなかった.今回,htopというものがあることを知って使ってみた.スレッド毎に使用率が表示されて,わかりやすくなっている.メモリの使用状況も分かるし.
RとwebGL
やり方が変わった
約一年ぶりにRからwebGLを作ろうとしたら,以前のやり方ではうまく行かなかった.以前はwriteWebGLというコマンドを使っていたのだが,ファイルはできるものの,ブラウザーで見るとjavascriptが有効で無いというようなコメントが出る.調べてみたらhtmlwidgets::saveWidgetというコマンドを使うべきだという記述を見つけた.結局,下のコマンドを実行すると,htmlと,必要なjsなどが出力された.
htmlwidgets::saveWidget(rglwidget(), "out.html", selfcontained=FALSE, libdir="lib")
一年でやり方が変わるのは,困ったものだ.
Rとjuliaとrubyとpython
Rとjuliaとrubyとpython
Rとjuliaとrubyとpython
ファイル
4つの言語の比較の第七弾として,ファイルの取り扱い方についてまとめてみた.まさか七弾まで来るとは,始めた当初は予想しなかった.基本的な使い方を比較して行く内に,これについてもまとめないとと,増えて行った.さて,肝心の表はこんな感じです.
| R | julia | ruby | python3 | |
| 読み込み | f<-file("index.html","r") d<-readLines(f) close(f) | f=open("index.html","r") d=readlines(f) close(f) | f=open("index.html","r") d=f.readlines f.close | f=open("index.html","r") d=f.readlines() f.close() |
| ブロック | d=open("index.html","r") do f readlines(f) end | d=open("index.html","r"){|f|f.readlines} | with open("index.html","r") as f: d=f.readlines() | |
| ファイル名 | d<-readLines("index.html") | d=readlines("index.html") | ||
| 全体読み込み | d<-readChar("index.html",file.info("index.html")$size,TRUE) | d=open(f->read(f,String),"index.html") | d=open("index.html","r"){|f|f.read} | with open("index.html","r") as f: d=f.read() |
| 書き込み | cat("Hello, world!",file="out.txt") | open(f->print(f,"Hello, world!"),"out.txt","w") | open("out.txt","w"){|f|f.print "Hello, world!"} | with open("out.txt","w") as f: f.write("Hello, world!") |
| 追加 | cat("Hello, world!",file="out.txt",append=TRUE) | open(f->print(f,"Hello, world!"),"out.txt","a") | open("out.txt","a"){|f|f.print "Hello, world!"} | with open("out.txt","a") as f: f.write("Hello, world!") |