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]
でも,これで分かってくれる人は,どの位いるのだろうか.
Read more...

ubuntu22.04のくせ

Jammy Jellyfish
少し前にインストールしたubuntu22.04LTSであるが,少しだけ気になることがあったので,記録しておこうと思う.budgieを選んだが,他の環境でも同じだと思う. まず,以前のLTSと変わっていたことに気がついたのが,firefoxがsnap版になっていたことである.apt版を入れるには,少し工夫が必要なようだった.大抵のことはどちらでも変わらないと思うが,OSのインストールなどをしたときの,環境の引き継ぎなどのやり方が変わるのでは無いかと思われるので,気をつける必要がある. あと,いくつかのサイトのipの取得に失敗するようで,新たにgoogleのDNSである8.8.8.8を設定したら,うまく動くようになった.自動設定などでnetplanを使うようになったことによる不具合なのでは無いかと予想している.もうしばらくすると,このバグも取れるかな.

Read more...

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があるので,多分大丈夫なんだと思う.

Read more...

CPUの使用状況

topとhtop
CPUの使用状況を調べるために,これまではtopを使っていました.しかし,マルチコアのCPUに対しては,100%以上が表示されたりして,よく分からなかった.今回,htopというものがあることを知って使ってみた.スレッド毎に使用率が表示されて,わかりやすくなっている.メモリの使用状況も分かるし.

Read more...

RとwebGL

やり方が変わった
約一年ぶりにRからwebGLを作ろうとしたら,以前のやり方ではうまく行かなかった.以前はwriteWebGLというコマンドを使っていたのだが,ファイルはできるものの,ブラウザーで見るとjavascriptが有効で無いというようなコメントが出る.調べてみたらhtmlwidgets::saveWidgetというコマンドを使うべきだという記述を見つけた.結局,下のコマンドを実行すると,htmlと,必要なjsなどが出力された.

htmlwidgets::saveWidget(rglwidget(), "out.html", selfcontained=FALSE, libdir="lib")

一年でやり方が変わるのは,困ったものだ.

Read more...

Rとjuliaとrubyとpython

行列の取り扱い方 4つの言語の比較の第八弾として,そのきっかけとなった行列の使い方について表にまとめてみた. Rjuliarubypython3 初期化 using LinearAlgebra require "numo/linalg" import numpy as np 定義 a<-matrix(c(1,3,2,4),2,2) a=[1 2; 3 4] a=Numo::NArray[[1,2],[3,4]] a=np.array([[1,2],[3,4]]) 単位行列 b<-diag(2) b=I(2) b=Numo::DFloat.eye(2) b=np.eye(2) b=np.identity(2) 対角行列 d<-diag(c(1,2)) d=diagm([1,2]) d=Numo::NArray[1,2].diag d=np.diag([1,2]) 対角要素 diag(a) diag(a) a.diagonal np.diag(a) np.diagonal(a) a.diagonal() 型 dim(a) size(a) a.shape a.shape 要素 a[1,2] a[1,2] a[0,1] a[0,1] 行 a[1,] a[1,:] a[0,true] a[0,:] 列 a[,1] a[:,1] a[true,0] a[:,0] 転置 t(a) transpose(a) a.transpose a.T a.transpose() 随伴行列 Conj(t(a)) a' adjoint(a) a.transpose.conj a.T.conjugate() 跡 sum(diag(a)) tr(a) a.
Read more...

Rとjuliaとrubyとpython

特殊関数 4つの言語の比較の第八弾として特殊関数などの使い方についてまとめてみた.まず,比較的一般的な特殊関数は,以下の表のように使うことができる. Rjuliarubypython3 導入 julia using Pkg Pkg.add("SpecialFunctions") aptitude install ruby-gsl aptitude install python3-scipy 初期化 using SpecialFunctions require "gsl" from scipy import special ガンマ関数 gamma(3) gamma(3) Math.gamma(3) special.gamma(3) ダイガンマ関数 digamma(3) digamma(3) GSL::Sf::psi(3) special.psi(3) ベッセル関数 besselJ(0.1,1) besselj(1,0.1) GSL::Sf::bessel_Jn(1,0.1) special.jv(1,0.1) 次に,多項式で表される特殊関数は,例えば以下のように使うことができる. Rjuliarubypython3 導入 aptitude install r-cran-polynom R install.packages("orthopolynom") julia using Pkg Pkg.add("SpecialPolynomials") aptitude install ruby-gsl aptitude install python3-scipy 初期化 library(polynom);library(orthopolynom) using SpecialPolynomials require "gsl" from scipy import special エルミート多項式 predict(hermite.h.polynomials(3)[[3]],0.8) basis(Hermite,2)(0.8) GSL::Poly.hermite(2).eval(0.8) special.
Read more...

Rとjuliaとrubyとpython

ファイル
4つの言語の比較の第七弾として,ファイルの取り扱い方についてまとめてみた.まさか七弾まで来るとは,始めた当初は予想しなかった.基本的な使い方を比較して行く内に,これについてもまとめないとと,増えて行った.さて,肝心の表はこんな感じです.

Rjuliarubypython3
読み込み 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!")
それぞれの言語で少し異なっているが,一番上の標準的は方法はほとんど同じだが,openとcloseが面倒である. Rでは,ファイル名を指定する方法が楽かな. juliaは,読み込みはファイル名を指定して,書き込みはopenで関数を指定するのが良い気がする. rubyとpythonはブロックを使うと良い. 使いやすさにはあまり違いは無いが,Rが少しだけくせが強くて難しいかな.
Read more...

Rとjuliaとrubyとpython

辞書 4つの言語の比較の第六弾として,辞書とかハッシュなどと呼ばれるデータの取り扱いについて,表にまとめてみた.perlを学んだときに,私は始めて知ったものだが,なかなか便利なものだと感じた.perlやrubyではハッシュと,pythonやjuliaではdictionaryつまり辞書と呼ばれる.Rにはこのようなデータ構造は無いが,いくつかの方法で似たような取り扱いができるので,その一つのやり方として,名前付きのベクトルを使った方法を示した. Rjuliarubypython3 定義 h<-c("a"=1,"b"=2) h=Dict("a"=>1,"b"=>2) h={"a"=>1,"b"=>2} h={"a":1,"b":2} 内包表記 d<-sapply(as.character(1:5),function(x)as.numeric(x)^2) d=Dict((string(k),k^2) for k=1:5) d=(1..5).to_h{|i|[i.to_s,i**2]} d={str(k):k**2 for k in range(1,6)} テキスト x<-scan(text="H 1\nHe 4", what=list("",1)) names(x[[2]])<-x[[1]] x<-x[[2]] x=Dict(split(i) for i in split("H 1\nHe 4","\n")) x=Hash[*"H 1\nHe 4".split] x=dict(i.split() for i in "H 1\nHe 4".split("\n")) アクセス h["a"] h["a"] h["a"] h["a"] 追加 h["c"]<-3 h["c"]=3 h["c"]=3 h["c"]=3 キー names(h) keys(h) h.keys h.keys() 値 h values(h) h.values h.values() キーの存在 "a"%in%names(h) haskey(h,"a") h.key?("a") "a" in h 値の存在 1%in%h 1∈values(h) h.
Read more...

Rとjuliaとrubyとpython

配列 4つの言語の比較の第五弾として,配列の取り扱いについて,表にまとめてみた.言語によって,ベクトルとかリストとか呼び方が違う場合もあります.集合の取り扱いも含まれています. Rjuliarubypython3 定義 a<-c(1,2,4,8,4) a=[1,2,4,8,4] a=[1,2,4,8,4] a=[1,2,4,8,4] 連続 b<-1:10 b=Vector(1:10) b=[*1..10] b=list(range(1,11)) 等差数列 b<-seq(1,20,2) b=Vector(1:2:20) b=[*(1..20).step(2)] b=list(range(1,21,2)) 内包表記 [i^2 for i in 1:5] [i**2 for i in range(1,6)] map sapply(1:10,function(x){2*x}) map(x->2x,1:10) [*1..10].map{|x|2*x} list(map(lambda x:2*x,range(1,11))) 最初 a[1] head(a,1) a[1] a[begin] first(a) a[0] a.first a[0] 要素 a[2] a[2] a[1] a[1] 最後 tail(a,1) a[end] last(a) a[-1] a.last a[-1] 最後から tail(a,2)[1] a[end-1] a[-2] a[-2] 範囲 a[1:3] a[1:3] a[0..2] a[0,3] a[0:3] 追加 a<-append(a,3) a<-c(a,3) push!
Read more...