故障の原因究明
測定に使っているraspberry piが動かなくなったと言われたので、原因を調べてみた。これまで、raspberry piは何台も使って来たが、その故障の多くがsdの問題だった。まだ本体が壊れたところには遭遇していないので、今回も本体以外の部分に原因があるのではと予想していた。
ログイン画面のところで、キーボードが打てなくなるということで、まずはキーボードを疑ったが、実はキーボードをつないでいるusbのハブが壊れていることが分かった。ハブを交換したら無事に直ったようだ。
測定用ということで、usbtmcとusb-gpibとusb-serialなどを使っていて、これにマウスとキーボードを加えると、usbポートの増設が必要で、そのためにusbハブを使用している。しかし、ハブを通すと問題がおきる場合もあるので、比較的負荷の軽いマウスとキーボードとusb-serialをハブを介して使っている。相性問題が生じるかと心配したが、今回は問題が無かったようだ。
debianにg77
fortranのライブラリ
Debian busterで古いプログラムを動かそうと思ったら、libg2c.so.0が無いと言われた。調べてみたら、これはg77のライブラリらしい。しかし、今のdebianではg77はgfortranに置き換えられてしまっている。昔のubuntuのdebを使うと動かせるらしいので、試してみた。http://old-releases.ubuntu.com/ubuntu/pool/universe/g/gcc-3.4/から必要なdebファイルを取ってきて、以下のようにインストールする。
dpkg -i --force-depends cpp-3.4_3.4.6-6ubuntu5_i386.deb gcc-3.4_3.4.6-6ubuntu5_i386.deb gcc-3.4-base_3.4.6-6ubuntu5_i386.deb libg2c0_3.4.6-6ubuntu5_i386.deb libg2c0-dev_3.4.6-6ubuntu5_i386.deb g77-3.4_3.4.6-6ubuntu5_i386.deb ln -s /usr/bin/g77-3.4 /usr/bin/g77
必要で無い操作もある気がするけど、とりあえず動いたので、それなりうまく行っている。しかし、upgradeするときには、文句を言われるので、以下のように、一旦uninstallしてからupgradeする必要がある。
dpkg -r cpp-3.4:i386 gcc-3.4:i386 gcc-3.4-base:i386 libg2c0:i386 libg2c0-dev:i386 g77-3.4:i386
Rでsocket
Rとrubyの比較
LANを介してデータのやり取りをする必要があったので、rubyのsocketを使って、必要なプログラムを書いた。通常は一つのサーバーに複数のクライアントが何回も接続することが想定されるので、threadを使うことが多い。しかし、今回は一つのクライアントが一度だけ接続するというケースだったので、threadが必要が無いことに気がついたので、以下のように単純化した。
serv=TCPServer.open(2051) cl=serv.accept str=cl.readpartial(10) cl.close serv.close
acceptでclientが接続するまで待ってくれる。クライアント側は、TCPSocket.open("localhost",2051)で接続して、読み書きすれば良い。
ふと、これをRでできないかを考えてみた。クライアント側は、以下のように、socketを開けて、読み書きすれば良い。
tcp<-socketConnection("localhost",2051) write("123",tcp) cat("123",file=tcp) readLines(tcp,n=1) close(tcp)
サーバーもやってみたら簡単だった。
tcp<-socketConnection(port=2051,server=TRUE) close(tcp)
定義するときに、クライアントが接続するまで待ってくれるので、クライアント側とほとんど同じ書き方で、サーバー側のプログラムも書けてしまう。ただ、複数のクライアントが接続する場合は面倒そうだ。
Rでrubyと同様にsocketを用いた通信ができそうだが、違いがある。rubyではreadpartialでは、データが来るまで待ってくれるが、RだとreadBinとかでは、データがなかったら読まずに終わってしまう。特定の長さのデータを読み込みたいときには、rubyではread(length)とすれば良いが、Rでは長さを指定しても、それよりも短いデータしか読み込まない可能性があるので、読み込んだデータを数えて、特定の長さになるまで繰り返さないといけない。これは面倒だが、何か楽に固定長を読み込む方法は無いのかな。
Condon-Shortley係数
平方根の計算
球面調和関数を取り扱っていると、Condon-Shortley係数とかGaunt係数というものを使うことがある。この値は表になっているのだが、maximaを使って行列の形に表すプログラムを書いてみた。
load(clebsch_gordan); ck(k,l1,m1,l2,m2):= rootscontract((-1)^m1*sqrt(2*l1+1)*sqrt(2*l2+1)*wigner_3j(l1,l2,k,0,0,0)*wigner_3j(l1,l2,k,-m1,m2,m1-m2))$ mck(k,l):=genmatrix(lambda([a,b],ck(k,l,l+1-a,l,l+1-b)),2*l+1,2*l+1)$
苦労したのは、平方根を単純化する部分である。sqrt(2)*sqrt(6)を2*sqrt(3)と変形するやり方が分からなくて、自乗してからsqrtしたりする関数を書いたりしていたが、rootscontractを使うと良いことがやっとわかった。
Ryzen5にDebian10
first trial
AMDのRyzenはコストパフォーマンスがよいということで、興味を持っていたが、Linuxのインストールが難しいという噂を耳にしていた。最近、メインPCがいきなり電源が落ちることがあって、最初は電源ケーブルが抜けかかっているだけかと思っていたのだが、何度か再発するので、PCを更新することにした。そろそろRyzenにもLinuxのインストールが簡単にできるようになっているだろうということで、新しいPCはRyzen5にした。
今回は、CPUがryzen5になったことと、SSDとHDD両方載せていることが、今までのPCとは大きく異なる点である。パーティションを切るときに、SSDをルートに、HDDをhomeにして、インストールしようとしたが、EFIが無いと言われて進まない。よく分からなかったので、SSDのみに自動でパーティションを設定して、EFIを自動生成して、そこからSWAPを除いてルートに割り当てたあと、HDDにhomeを割り当てたら、進むことが出来た。
インストール自体は、うまく行ったようだが、再起動しても、画面が真っ黒なままである。今日は時間が無いので、後日に再挑戦しよう。
2020/6/1追記 とりあえず、前回はDebian10.3をUSBブートで試したが、最新は10.4だったので、それで試すことにした。しかし、同じような症状だったので、bootの設定がおかしいのかと思って、BIOSからいじってみた。Debianが二つあるように見えるけど、single user modeなのかと思っていたが、それだと画面が真っ黒なことの説明ができない。二つある方のどちらかを選ぶべきなのかと思って、いろいろ試していたら、grubが立ち上がるようになった。webの情報だと、ここからいろいろ設定しないといけないという話だったが、その後は問題無く動いているようである。まあ、しばらく使って試してみよう。
コロナとlinux
古い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チックで良いかな。