古いPCにlubuntu
コロナウイルスの影響で,人と会う機会を減らすためにオンラインで様々なことをすることが求められるようになっている.いろいろな出先でネット環境を手軽に使えるようにするために,古いノートPCを発掘したので,これにlinuxを入れてみた.入れたOSはlubuntu18.04である.もう少ししたら20.04が出るはずなのだが.さらに,古いPCなので,amd64では無くi386である.インストール自体はうまくいったのだが,wifiとSDカードが認識できかった.前者に対しては,bmc-kernel-sourceを入れたらうまく行った.後者に関しては,/etc/modprobe.d/optionsにoptions sdhci debug_quirks=1を記述したら認識するようになった.
sambaを使ったファイルのやりとり
win7とwinXPの違い
測定用のPCにおいては、WinXPやWin7などのサポートの切れたOSを使っているものが多くある。これらのPCからデータを取り出すときに、どのようにするかが問題である。直接USBメモリなどを挿すと、そこからウイルスが感染する可能性があるし、ネットワークに繋ぐと同様である。そこで、以前構築したのが、閉じたネットワークにLinuxPCを参加させて、そのPCからUSBメモリで取り出す仕組みである。Linuxにウイルスが感染してそれがWindowsに伝染ったらどうしようも無いが、その可能性は非常に低くなる。
十年ぐらい前に作った時には、/etc/fstabには以下のように記述していた。
//ip_win7/DATA /home/user/dir1/ smbfs iocharset=utf8,password=,defaults,ro,user 0 0 //ip_winxp/DATA /home/user/dir2/ smbfs iocharset=utf8,password=,defaults,ro,user 0 0
これで、起動時にwindowsのディレクトリがLinuxにマウントされる。今回、PCも古くなったので、一新することになった。Debian10を入れて、sambaを使うためにcifs-utilsを入れる。smbfsとcifsで使い方はほとんど一緒だと思ったのだが、微妙なところが違って苦労した。結局、以下のように記述した。
//ip_win7/DATA /home/user/dir1 cifs iocharset=utf8,password=,user,dir_mode=0755,file_mode=0755 0 0 //ip_winxp/Data /home/user/dir2 cifs iocharset=utf8,password=,user,dir_mode=0755,file_mode=0755,vers=1.0 0 0
まず、重要なのが、ディレクトリの最後のスラッシュの有無である。次に問題なのが、マウントしたときのmodeの指定である。最後に悩んだのが、win7とwinXPの違いである。XPではSMB1.0なのだが、vers=1.0を指定しないとアクセスできない。7はSMB2.0にも対応しているので、指定しないでも大丈夫なようだ。
Rの高速化
BLAS/LAPACKとparallel
行列を使って対角化などの計算をやっていたのだが、高速化ができないかを試してみた。
Rの通常の計算はそれほど速くないが、Rの行列計算は、BLAS/LAPACKを使っているので、それなりに速い。sessionInfo()とすると、どのBLAS/LAPACKを使っているかが表示される。標準のもの以外にも、openblasやatlasやintel-mklなどがあり、これらを使うことにより、多少速度が変わるらしい。debianの場合は、libopenblas-base, libatlas3-base, intel-mklをaptで入れて、
sudo update-alternatives --config libblas.so.3-x86_64-linux-gnu sudo update-alternatives --config liblapack.so.3-x86_64-linux-gnu
とすると、これらを変更できる。私の環境では、atlasが若干速かったので、これを使うようにした。
繰り返し計算などで有効なのが、並列計算である。近年のCPUの多くが、複数のコアを持つので、これらを使って同時に計算をすることができれば、原理的にはコアの数の分だけ速くなるはずである。Rでは、parallelというlibraryを使うと、比較的簡単に並列計算ができるらしい。
library(parallel) cores <- detectCores() cl<-makeCluster(cores,type="PSOCK")
として、コアの数だけ同時に計算できるようにして、clusterApply()やparSapply()を使って、リストやベクトルの計算をすれば良いのだが、それぞれのコアライブラリを組み込むためにclusterEvalQ()で実行したり、変数を認識させるためにclusterExport()を使ったりする必要がある。計算の準備などをするために、実際にはコアの数分の一にはならないが、それなりには速くなる。また、最後にはstopCluster(cl)としておく。
単純な計算の並列化には成功したが、関数の中でmulti-coreを使って計算しようとしたら、環境の部分などでトラブって、なかなかうまく行かない。Rを使うと比較的簡単に並列計算ができることが分かったが、いろいろと癖がありそうである。
Rで三次元のベクトルの計算
Rで外積
Rにベクトルの計算をさせていたら、通常の外積が無いことに気がついた。とりあえず、適当に定義してみた。
"%v%"<-function(x,y)c(x[2]*y[3]-x[3]*y[2],x[3]*y[1]-x[1]*y[3],x[1]*y[2]-x[2]*y[1])
これでa%v%bとすれば、ベクトル外積が計算できる。名前は平行六面体の体積を計算するときに使うので、vにしてみた。oもxもすでに使われているし。
"%v%"<-function(x,y)x[c(2,3,1)]*y[c(3,1,2)]-y[c(2,3,1)]*x[c(3,1,2)]
の方がRチックで良いかな。
小型のarduino
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でしか動かないので、仕方が無いだろう。