グラフソフト
originをwineで
グラフソフトとしては,Rを主に使っている.使い始めた当初は,コマンドや言語の仕様になれずに,多少は戸惑ったが,使い慣れてくると使いやすいと感じるようになってきた.研究用のグラフソフトとしては,Igor ProやOriginなどがあるが,それなりに高価である.多少は安価なKaleidaGraphなども使われているようである.コマンドに慣れる必要はあるが,これらの高価なソフトに勝るとも劣らない機能を,フリーで利用できるのは良いことだと思う.
さて,知り合いがOrigin ProをLinux上で動かしたいということだったので,やってみた.IgorProはWineでほとんど苦労せずに動かすことができるので,Wineで普通に動くかも知れないと予想していたが,そうでは無かった.試したのはOrigin Pro 2023で,インストールまでは普通にできて,立ち上がるものの,クリックなどが一切できない. Wine hqのページを調べたところ,別のversionの情報があって,
winetricks vcrun2019
とすると良いようだった.しかし,これを実行すると,ハッシュが合わないと言われてうまくインストールできない.これは,microsoftが最近ファイルを更新したためらしい.そこで,
sudo winetricks --self-update
とすると,winetricksが最新のものに入れ替わって,vcrun2019が無事にインストールできるようになる. その後でOrigin Proを立ち上げると,無事に動くようになった.細かい動作はまだ確認していないが,なんとか使えるようになった.
xautomation
マウス操作の自動化
マウスをクリックする作業を,ある程度の時間をあけて繰り返さないといけないことになった.以前は古いwindowsで,何かソフトを入れてそのようなことをやっていたが,その時に使ったソフトが何か分からなくなったので,今回はlinuxで似たようなことをやってみた.
まず,aptitudeでxautomationを入れる.次に,マウスのクリックする場所の座標をxmouseposを用いて調べる.そして,シェルスクリプトを作って,永久にループするようにして,それを実行すれば出来上がりである.
実際に作ったスクリプトは以下の通りである.
sleep 3600 while true do xte 'mousemove 385 210'; sleep 1; xte 'mouseclick 1'; echo r on date; sleep 10; xte 'mousemove 485 210'; sleep 1; xte 'mouseclick 1'; echo x on date; sleep 1 xte 'mousemove 485 235'; sleep 8; xte 'mouseclick 1';echo x off date; sleep 100; xte 'mousemove 385 235'; sleep 1; xte 'mouseclick 1'; echo r off date; sleep 3600 done
これで,後は時間を待つだけのはずだ.
webpへの変換
jpegとwebp
インターネット上の画像形式としては、以前はjpegが多かったと思うのだが、最近はwebpが増えてきたように感じられる。最初にwebpを知ったときには、まだ対応しているソフトが少なくて、表示するためにブラウザーを使ったものである。
少し試してみたところ、imagemagickのconvertでjpgからwebpに変換すると、容量が増えてしまう。一方、gimpのデフォルト設定で変換すると、容量がかなり小さくなる。ただし、losslessを指定すると、imagemagickと同程度になった。試行錯誤していたら、imagemagickで変換するときも、-quality 90という指定をすると、容量が減ることを発見した。
webpを扱えるソフトが増えてきたので、今後はlosslessの必要が無く、容量を小さくしたいときにはwebpを使うのも良いかも知れない。
picotest G5100AをLANから制御
マニュアルに書いて無い
picotestのファンクションジェネレーターG5100AをLANから制御する必要があって、なんとかできたけど少し苦労したので、メモをしておく。設定をいじってLANにつないで DHCPでIPを取得するところまでは問題なくできるが、そこから先のことがマニュアルにほとんど書いていないので試行錯誤が必要だった。
まず問題なるのが、何番のポートからアクセスするかである。rubyからいくつかのポートをあけようとしてみたら、80番は開いているようだったので、ブラウザからアクセスしてみたら、説明が表示された。それによると、httpの80番とSCPI telnetの5024番とSCPIソケットの5025番が使えるようである。ブラウザからもスイッチを押す感じで使えるのは面白いと感じた。
次に、試しにtelnetで5024を開いてコマンドを入力してみたら、普通に動作したが、プログラムから制御するために5025番にコマンドを送っても、動作しなかった。いろいろといじっていたら、改行コードも送らないとコマンドが実行されないことがわかった。つまり、5025番のポートを開いて、GPIBやUSBTMCで送るコマンドに改行を加えて送ると、制御できる。
マニュアルに少しは説明を書いて欲しかった。
Rとjuliaとpythonとrubyで
inkscapeでeps
bounding boxが難しい
texに貼り付けるためのepsファイルを少し手直ししたくて,inkscapeを使ったのだが,texに貼り付けるとずれてしまうという症状に行き当たった.どうやらboundingboxが問題らしく,これを解決する手段を見つけたので,メモしておく.
inkscapeでepsをsaveすると,その時に表示されている画像が入るギリギリの枠がboundingboxとして作られるが,その原点は枠では無く紙の左下に取られる.texの場合には,枠の左下の座標が原点である方が良いらしく,それが問題になっているようである.
そこで,epsでsaveする直前に,Edit-Resize Page to Selectionとして,紙のサイズを画像ギリギリにして,それからSave asでepsにすると,枠の左下が原点となり,texに貼り付けた時にズレたりしなくなるようである.
以後,inkscapeが必要な時には,この手法を使おうと思う.
24bitのADC
ブリッジ回路
ブリッジ回路の微小な電位差を読んでマイコンに取り込みたいと思い,いろいろといじっていたが,なかなかうまく行かなかった.voltageフォロワーとしてオペアンプを使って,それをattiny261で直接読んでみたが,微小な電圧が揺らいでしまってうまく読めない.261では32倍に増幅しても,読んでいるのだが.オペアンプの種類を変えたら,若干改善したものの,必要な桁は得られないと判断して,別の方法を考えてみた.
オペアンプを介して,桁の大きなADCで読んだらどうかと思って,手持ちのICを漁っていたら,TM7711というADCを見つけた.これは24bitなのだが,datasheetが中国語のものしか無くて,細かい仕様が分からなかったが,うまく使うことができたので,その概略を書いておこうと思う.
電源電圧を参照電圧として与えたのだが,このICは差動の電圧を128倍に増幅して,それぞ基準電圧の2^24分の一を単位として読み取る.読み取り方も比較的単純で,クロックを25回から27回High/Lowを繰り返したときの,dataから読み取るというものである.このとき,最初の24回にはdataがあり,25または27回にすると,それぞれ10Hz,40Hzで,26回にすると温度を読み取るモードとなるようである.arduinoで読み出すプログラムを書いてみたので,以下に示す.
void setup() { // put your setup code here, to run once: digitalWrite(A0,LOW); pinMode(A0,OUTPUT); pinMode(A1,INPUT); Serial.begin(9600); } void loop() { // put your main code here, to run repeatedly: signed long v=0; while(digitalRead(A1)>0); for(char i=0;i<24;i++){ digitalWrite(A0,HIGH); delayMicroseconds(5); v<<=1; if(digitalRead(A1)>0)v++; digitalWrite(A0,LOW); delayMicroseconds(5); } digitalWrite(A0,HIGH); delayMicroseconds(5); digitalWrite(A0,LOW); delayMicroseconds(5); if(v>=1<<24)v|=0xff000000; Serial.println(v); delay(1000); }
maximaでベクトル解析
変形の手助け
式変形で,手計算が大変なときには,maximaを使うことが多い.しかし,ベクトル解析などの場合は,その取り扱い方がよく分からなかったので,これまでは使えなかったが,一応できるようだ.例えば,こんな感じで.
load("vect"); depends([f,p],[x,y,z]); div(grad(f*p)); express(%); ev(%,diff);
fとpが座標に依存することを明示して,式を定義する.ちなみに,rotはcurlを使う.その後で,それを展開したり,微分の公式を適用したりする.と,変形ができる.これをdivなどを使った表記に戻す方法が分からないが.あと,変数の間の関係式を代入するためには,ratsubstを使うと良いようだ.
(x+1)^2+(y+1)^2; ratsubst(1,x^2+y^2,%);
これらを使うと,これまで計算できなかった変形ができるようになった.これで,式変形が進むかな.
階乗の計算
rubyは少し面倒かな.
rubyで階乗を使おうと思ったら,意外に面倒だった.maximaだと数学と同じように4!と書ける.Rだと,prod(1:4)で計算するか,gamma(5)を使う方法もありだと思う.一方,rubyだと,(1..4).inject(:*)とするしか無いかな.その書き方を使って,階乗を沢山含んだ式を書いたら,長いコードになってしまった.わざわざ定義するほどでは無いし.