genmatrixで行列を作る
maximaで角運動量演算子 
Rで角運動量演算子の行列を計算するプログラムは、以前に書いて、時々使っているが、Rでは変数を含んだ計算をすることができない。そこで、maximaを使ってこの行列を計算するプログラムを書いてみた。maximaについてはど素人なので、無駄な部分が多いと思うが、これを使うと変数を含んだ変形が簡単になるはずだ。ただし、行列の掛け算は.を、行列のn乗は^^を使うことに注意しないといけない。最後の行は、核四重極相互作用の行列を例として示した。
mjz(j):=genmatrix(lambda([a,b],if a=b then j+1-a else 0),2*j+1,2*j+1); mjp(j):=genmatrix(lambda([a,b],if a=b-1 then sqrt(a*(2*j+1-a)) else 0),2*j+1,2*j+1); mjm(j):=transpose(mjp(j)); mjx(j):=(mjp(j)+mjm(j))/2; mjy(j):=(mjp(j)-mjm(j))/2/%i; me(j):=ident(2*j+1); 3*mjz(j)^^2-j*(j+1)*me(j)+n/2*(mjp(j)^^2+mjm(j)^^2);
2020/4/15追記 久々に使おうとしたら、代入がコロンだということを忘れていて、なかなか動かなくて苦労した。
USBaspを使った書き込み
arduinoISPとUSBasp 
arduinoをいじっていて、シリアルからの書き込みに失敗したので、書き込み機から書き込むことにした。しかし、手元に書き込み機が無かったので、調べてみたらarduino UNOをISP書き込み機にするという方法があるらしい。rduino IDEのFile-Examples-ArduinoISPで選んだsketchをUNOに書き込めば良い。以下の通りの接続をして、Arduino as ISPを選択して書き込む。
10 RESET 11 MOSI 12 MISO 13 SCK
しかし、うまく行かないときもあるので、別の方法を試してみることにした。USBaspという書き込み機を以前購入したのを思い出して、使ってみることにした。ubuntu linuxを使ってやっていたのだが、portのpermissionが無いと言われる。調べてみたらplugdevというgroupになっていたので、ユーザーをplugdev groupに登録したら、書き込めるようになった。bootloaderの書き込みは、以下のような表示が出るが書き込みはうまくいっているようだ。
warning: cannot set sck period. please check for usbasp firmware update.
また、実際のsketchを書き込む場合には、Upload Using Programmerをメニューから選ばないといけない点も注意が必要である。ちなみに、この書き込み方だとbootloaderも上書きしてしまう。
最後のカンマ
配列への要素の追加 
Rでは、配列を定義するときに、最後の要素の後にコンマをつけるとエラーになる。一方、rubyやpythonでは、
ary=[ 1,2, 3,4, ]
としても問題無い。このような書き方は、配列にあとから要素を加えて行くときに便利なので、Rでも使いたいのだが、前述のようにエラーになって出来ないのである。 そこで考えたのが次のような書き方である。
ary<-head(c( 1,2, 3,4, 0),-1)最後の要素を無駄に加えておいて、それを取り除くという感じなのだが、似たような書き方を実現することができる。今後使って行こうと思う。
heicからjpg
iphoneの画像形式 
heic形式の画像をjpgに変換してと頼まれたのだが、一応できたので、その記録をしておく。heicというのは初めて聞いたのだが、最近は圧縮率の良い画像形式がいろいろと出てきている。しばらく前にはwebpというのがあることを知ったが、これは標準のviewerでは表示できなかったものの、browserで表示できた。
ubuntuで変換を行ったが、libheif-examplesというパッケージを入れて、heif-convert test.heic test.jpgという感じで変換するだけである。ファイルがいくつもあったので、シェルスクリプトを書いて変換することができた。
標準以外のソフトのインストール
debian10(buster)でlibpng12 
OSを入れ替えたときに問題になるのが、普段使っているソフトが動かなくなることである。大半のソフトは、debianの標準的なものなので、大丈夫なのだが、それ以外のソフトが動かないときがある。libpng12を使っているソフトがあり、そのインストールに少し苦労したので、メモをしておく。
libpng12は、debian9のときにはlibpng12-0_1.2.50-2+deb8u3_amd64.debを入れたら動いたのだが、debian10ではエラーが出てこれを入れることが出来なかった。その代わりに、libpng12-0_1.2.49-4ubuntu1_amd64.debを入れることで問題を解決できた。まず、このファイルをdownloadする必要があるが、launchpad.netというところにあり、これがubuntuの開発が行われているサイトだと最初は知らなくて、downloadするのを躊躇してしまった。ファイルが取れたら、
sudo apt install ./libpng12-0_1.2.49-4ubuntu1_amd64.deb sudo apt-mark hold libpng12-0
としたら、libpng12が使えるようになった。
debianのdebを入れるほうがsimpleだと思ったが、ubuntuのdebでしか動かないので、仕方が無いだろう。
ようやくdebian10に
ソフトを動かすために 
あるソフトをlinuxで動かそうと思ったら、それに必要なプログラムのversionが古かったので、OSを新しくすることにした。debian10が出てからしばらく経っているので、そろそろ安定した頃だという判断もその後押しをした。ちなみに、以前はdebianのversionを愛称で覚えていたが、そろそろ限界になって来たので、数字で区別することにした。10はbusterらしいが。
インストールはnetinstをusbに入れて、そこからlxdeを選択した。downloadや展開に時間はかかったが、特に問題無く完了した。動かそうと思っていたソフトも、少し工夫したら動くようになった。
しかし、そのソフトのネットワーク関係の設定に非常に手間取った。ユーティリティを使おうかとも思ったが、汎用性がなくなりそうに感じたので、それは止めることにした。結局、汎用のソフトを使って工夫したら、なんとかなった。
debian10であるが、debian9との大きな違いは今の所あまり感じていない。lxterminalがうメニューからうまく起動できない点も同じである。まだバグが取れていないようだ。
行列計算
maximaを使って 
行列のexpを計算をする必要があったのだが、これを手で計算するのは面倒である。これまで、行列の計算はRにさせることがあったが、Rでexpを処理しようとすると、対角化してexpを計算して、元の座標系に戻すという手法で計算していた。しかし、Rの場合には数値計算はしてくれるが、数式の変形はしてくれない。数式変形をするときには、maximaが便利だが、行列のexpも扱えることを知った。例えば以下のような感じである。
my:matrix([0,-1],[1,0])*%i/2; matrixexp(t*%i*my); demoivre(%); trigreduce(%);
最後の二行は、数式を三角関数で表して、簡略化している。指数関数や三角関数は、期待するように計算するのが、少し面倒で、trigexpandやfactorなども使って処理する必要がある場合もある。まだ、maximaには慣れていないが、数式変形の時に、使おうと思う。
ryzenの問題
debianとAMD 
debian10が7/10にreleaseされていた。三ヶ月以上たったし、そろそろmainのPCのOSをupdateしようかと思っています。しかし、debian9でも全く困っていないし、もうしばらくこのままで良いかなと思っています。
そのPCのCPUはAMDのものを使っている。intelかAMDの選択肢がある場合には、後者の方がコストパフォーマンスが良いので、AMDを選ぶようにしている。
AMDからRyzenというCPUが出て、興味があったのだが、LINUXとの相性が良くないというニュースを聞いた。もうしばらくしたら、問題が解消されないかな。
rubyとRの使い分け
Rのみでのデータ処理 
測定データの処理には、rubyとRを使っている。Rは文字列の操作が苦手なので、測定データの保存されたファイルから、必要なデータを抽出して、簡単なデータ処理をするためにはrubyを主に使っている。例えば、必要な列を取り出したり、質量から物質量に変換したりする処理などである。そして、plotやfittingなどにRを用いるという具合である。しかし、ニ段階の処理が必要で面倒なので、Rだけでデータ処理をしてしまうと楽に感じられる。
Rですべての処理をする場合に問題になるのが、データファイルのヘッダ部分の処理である。Rでファイルを読み取るコマンドとしては、通常read.tableを使っている。skipオプションを指定すれば、ヘッダを飛ばすことはできるが、ヘッダの情報を読み取ることができなくなる。ヘッダの情報を取り込むには、readLinesを使う方が良いだろう。そして、ヘッダと本体の境目を探して、両者を分離して、ヘッダから必要な情報を抽出して、本体をデータフレームにして、といろいろな処理を書く必要がある。
こういったことを考えると、もうしばらくは今のままで良いかと思ってしまう。