思ったより簡単
最近lubuntu 20.04をインストールしたが、そのPCは時々しか使わなかったので、日本語入力が出来ないことになかなか気が付かなかった。fcitx-mozcを入れて、再ログインしたら、入力できるようになった。昔は言語設定とかしていた気がするけど、それは必要無くなったようだ。
APUとdebian
一応復活
ディスプレイの交換作業をしたら、測定用のPCが立ち上がらなくなった。半年位前にXの部分でかなり苦労しながら立ち上げたものなのだが、おそらくその部分で立ち上がらなくなった。AMDのA4-7300というAPUを搭載したマシンなのだが、その時期のAPUはLinuxとの相性が良くないらしい。立ち上げる際は、kernelを4系統から5系統に置き換えたら、なんとかうまく行った。しかし、停電などで電源を落とした後には、いつも立ち上がるかヒヤヒヤものであった。予想通りと言うべきか、今回は立ち上がらなくなった。
grubのオプションでnomodesetを指定すると、X以外は立ち上がるので、その状態で折角なのでapt-get updateとupgradeをしたりして、kernelもより新しいものに入れ替えた。いろいろと試してみたが、なかなか立ち上がらなかった。
検索で同じマザーボードを使っている人のブログを見つけたが、そこではBIOSからover clockingの指定をdisableにしたら、うまく行ったという記述を見つけた。しかし、これも駄目だった。今から思い返すと、使っているPCのBIOSのVersionが古く、ブログのは最新のVersionを使って居たので、BIOSの更新をしたら、状況が変わっていたかも知れない。
さらにいろいろと試していたら、GRUBでquiet splash radeon.dpm=0と指定をして、DPM (Dynamic power management)を切ると、Xが立ち上がることを発見した。また立ち上がらなくなるのが怖いので、電源は落としていないが、これで安定してくれることを期待したい。
次に立ち上がらなくなったら、BIOSの更新をしてみよう。
forとmatrix
Rのくせ
Rをいじっていたら、そのくせに苦労したので、その対処法をメモしておく。
まず苦労したのが、forループを使ってn回ループしようとして、n==0のときにうまく行かない点である。
for(i in 1:n){cat(i)}とすると、n==0で実行すると1と0で二回実行されてしまうのである。いろいろと考えた結果、
for(i in (1:n)[0:n]){cat(i)}とすると、うまく行くことが分かった。または、
for(i in seq_len(n)){cat(i)}の方が素直かな。
次に苦労したのが、1行または1列の行列が自動的にベクトルに変換される点である。diag(3)[-1,-1]とすると2行2列の行列になるが、diag(2)[-1,-1]とすると、1行1列の行列になると思ったら、ベクトルになってしまうのである。これを行列にしたかったので、matrix(diag(2)[-1,-1],1)とした。美しくは無いが、仕方ないかな。
2021/4/6追記
for(i in (0:n)[-1]){cat(i)}でも良いかな。
久々の言語比較
perl, pythonとruby, R
perl6について調べていたら、rakuという名前に変わっていた。perl6はあまりにもperl5とは違い過ぎていたので、混乱しないように名前を変えたのだろう。rakuはperlの「There’s More Than One Way To Do It」という思想を発展させたものであると感じられるが、多様過ぎて理解できないことが多い。関数風に書くのが嫌いな人は、メソッド風に書くこともできるし、いろいろな書き方ができる。でも、必要なスペースを省略して、怒られることが多い。
最近はデータの処理には主にrubyとRを使っている。rubyはオブジェクト指向が徹底されていて、「楽しく」プログラムを書くことを目指している。昨年末にはruby3.0が出たようだ。ruby1.8から2.0に変わった時には、文字列などの扱いが変わって、プログラムの変更に苦労した覚えがある。他にもキーワード変数が導入されたり、様々な変更があった。互換性という意味では、3.0はそれほど大きくは変わって無いように感じられるが、速度は改善したらしい。最近のrubyはあまり勉強していないので、私の知らないことが増えているようなので、もう一度勉強し直そうかな。
私がキーワード変数を始めて使った言語はRである。最初は面倒に感じたが、慣れるとそれなりに使いやすい。Rではキーワード変数を使う時に「=」を使うためか、通常の代入が「<-」となっているのが、初心者には分かりにくいように感じる。特に、負の数を代入するときにはマイナスが二つ連続するので、見にくい。以前は主なdata処理はrubyでやって、Rでグラフを描くというように使っていたが、数値の処理はRが得意だということに気がついて、data処理もRで行なうことが多くなってきた。特に、行列の計算などは速いし使いやすい。rubyは行列は少し苦手かな。でも、Rは文字列処理が苦手なんだよな。
世界的にはpythonの人気が高まっているようである。数値計算を行なうときには、numpyを組み込むとそれなりのことができるようだが、コードが読みにくいように感じられる。何か関数で何がメソッドなのかが分かりにくいのも欠点だと思っている。あと、行数が増えてしまうのも私にとっては欠点かな。でも、読みやすくするという点では、仕方ないのかも知れない。もうしばらくは私がpythonを主に使うことは無いだろう。ただ、マイコンで使えるmicropythonはなかなか魅力的である。以前はマイコンは機械語かC言語ぐらいしか使えなかったが、スクリプト言語が使えるようになって、開発効率が上がるだろう。
ちょっとしたdata処理にはawkが便利だと思うこともある。通常の言語では、ファイルの読み込むなどで、手間取るところを、ほぼ省略できるのは便利である。でも、複雑なことをするのは難しいかな。
今後もしばらくは、rubyとRあとawkを使って、data処理をして行くと思う。pythonはマイコンでmicropythonをいじる程度かな。
evince-thumbnailer
無駄な処理?
ubuntu budgieを使っていたら、大したことはしていないのにCPUパワーが上がることが時々ある。
system-monitorで調べると、evince-thumbnailerが原因であることが分かった。短期的にはそれをkillすれば良いのだが、何度も起こると根本的な問題を解決しないといけないと思えるようになった。
調べてみると、この問題は数年前から報告されているようだが、いまだに修正されていないようだ。これを動かないようにするには、/usr/share/thumbnailers/evince.thumbnailerのExecの行をコメントアウトすれば良いようなので、試してみた。
しばらく使ってみたけど、そこそこ良い感じである。
Rで式量計算
ライブラリを使わずに
Rでデータ処理をしていたのだが、化学式の式量を計算する必要がある。以前はstringrというライブラリを使って計算するプログラムを書いたが、ライブラリのインストールが面倒だということで、ライブラリを使わずに式量を計算するプログラムを書いてみた。
fw<-function(fml){ aw<-read.table("formula.dat",row.names=1) en<-gregexpr("([A-Z][a-z]?)([0-9.]*)",fml,perl=TRUE)[[1]] cs<-attr(en,"capture.start") cl<-attr(en,"capture.length") sum(apply( matrix(substring(fml,cs,cs+cl-1),,2),1, function(x) aw[x[1],]*ifelse(x[2]=="",1,as.numeric(x[2])) )) }
以前書いたものとあまり変わらないが、attrを使ってキャプチャした文字列の場所を変数に入れて、substringで文字列を取り出している。substrを使うと、fmlを複数指定しないといけないので、一括で文字列を取り出す時には、substringの方が便利である。あとは、元素と数を行列の形にして、applyで掛け算をして、sumで足し合わせている。もう少し短く書けそうな気はするけど。
原子形状因子
atomic form factor using R
使っているdebianで何気なく
aptitude search xray
としてみたら、
libxray-absorption-perl libxray-scattering-perl libxray-spacegroup-perl python-aws-xray-sdk python3-aws-xray-sdk
というパッケージが出てきた。二番目と三番目に興味を惹かれたが、まずは二番目をインストールしてみた。すると、/usr/share/perl5/Xray/Scattering/に原子形状を求めるperlスクリプトが入ったので、これをRに移植することにした。そこにあるcromann.dbから係数を読み込んでいるようだが、これをRで読めるようにするために、yaml形式に変更した。libyaml-perlとr-cran-yamlをインストールして、
use strict; use Storable; my $r_cromann = retrieve( "/usr/share/perl5/Xray/Scattering/cromann.db" ); use YAML (); print YAML::Dump($r_cromann);というスクリプトを実行して、その出力をcromann.yamlに入れた。後で分かったことだが、窒素NとイットリウムYはそのままではうまく動かないので、"n"と"y"に変える必要がある。そして、Rで
library("yaml") crom<-yaml.load_file("cromann.yaml") #s = sin(theta)/lambda, s = q/4/pi f0 <- function(sym,s){ #atomic form factor cef<-crom[[tolower(sym)]] sapply(s^2,function(ss) sum( cef[1:4*2-1]*exp(-1*ss*cef[1:4*2]) ) + cef[9] ) }
と関数を定義した。ここで、sapplyを使っているのは、sとしてベクトルを与えても動くようにするためにである。これで、
for(ele in c("H","He","Li","Be","B","C","N","O","F","Ne")){ plot(0:100/4,f0(ele,0:100/4/4/pi),type='l',ylim=c(0,10)) par(new=TRUE)}
などとすると、原子形状因子をプロットできるようになった。
MacでLinux
古いmac book airにLinuxを入れることにした。
ubuntuかdebianか迷ったが、手元にあったUSBメモリが2Gで、普通のubuntuが2.6Gだったので、まずはDebianを試してみることにした。2Gに収まるDebianとして、debian 10.6.0 xfceを選択した。
sudo cp debian-10.6.0-amd64-xfce-CD-1.iso /dev/sda
でUSBに書き込む。USBを挿して、optionを押しながら電源ボタンを押して離すと、USBから起動できるようになる。wifiがうまく認識できないようだが気にせずに進む。パーティションの選択では、recoveryを残して、custumにインストールした。日本語を選択したら、文字化けした。ほとんどのコメントが読めないし、wifiが認識できていないので、一旦あきらめて、ubuntuに挑戦することにした。
ubuntuにはいくつかのFlavoursがある。Budgieというのが新しくできたことを発見した。やはりlubuntuが一番軽いようである。しかし、lubuntuのサイトには20.04が無い。探してみたら、ubuntuのサイトにはあったので、これをダウンロードした。サイズはUSBメモリに入る1.7Gだった。Debianのパーティションを入れ替える形でインストールをしたが、キーボードモデルはApple Aluminium (JIS)の日本語 (Macintosh)を選択すると良いらしい。インストールは無事に終了して、こんどは文字化けも無いし、wifiも認識している。
少しmacらしくしたかったので、budgie-desktopを入れることにした。taskselを入れてから、それを使ってBudgie Desktopを入れると、少しmacっぽい見た目と操作になった。日本語入力がうまく行っていなかったので、fcitx-mozcを入れて少しいじったら無事に入力できるようになった。lubuntuとbudgieが混在してフォルダの構造が汚くなった気がしたので、ubuntu budgieのisoを調べたら2.4Gあったので、USBメモリに入らないので、今回は見送ることにした。
しかし、バックスラッシュを打とうとすると円マークになってしまうことに気がついて、いろいろといじっていたら、カタカナしか入力出来なくなってしまった。ログイン時にもカタカナしか打てないようで、入れなくなった。外付けのUSBキーボードをつなぐと英数字を打てるようになるが、これではどうしょうもないので、別のインストール方法を試すことに。
ubuntu20.04のminimal install用のisoを探したら、ここで見つけた。一度目のインストールではgrubがうまく行かなかったりして、grubのプロンプトからなんとかログインして、grub設定をやり直したが、直らない。二度目のインストールでは、DHCPがうまく行かないことが多く諦めた。
というわけで、もう一度lubuntu+budgieで入れ直して、キーボードの問題をいじっていたら、カタカナ問題の原因の一端を見つけた。fcitxには、「キーボード-日本語(Macintosh)」と「Mozc」を入れていたのだが、前者を入れるとカタカナしか打てなくなる。これを「キーボード-日本語」にすると、英数字が打てるようになった。また、バックスラッシュが打てない問題は、/usr/share/X11/xkb/symbols/macintosh_vndr/jpのyenをbackslashに変えることで対応した。
他にも不具合が出るかも知れないけど、しばらく様子をみてみよう。
コマンドラインで圧縮
zipとrar
通常、ファイルを圧縮するのには、zipを使っている。コマンドラインからは、
zip temp.zip *.*
などとすれば良い。 パスワードをつけて圧縮しようと思い、zipよりもrarの方がパスワードの解析がされにくいと思ったので、rarを使ってみることにした。rarの場合には、ファイルの追加を指定するためにaを付けて、
rar a -hpPASSWORD temp.rar *.*という感じで実行する。
raspberry piの故障
故障の原因究明
測定に使っているraspberry piが動かなくなったと言われたので、原因を調べてみた。これまで、raspberry piは何台も使って来たが、その故障の多くがsdの問題だった。まだ本体が壊れたところには遭遇していないので、今回も本体以外の部分に原因があるのではと予想していた。
ログイン画面のところで、キーボードが打てなくなるということで、まずはキーボードを疑ったが、実はキーボードをつないでいるusbのハブが壊れていることが分かった。ハブを交換したら無事に直ったようだ。
測定用ということで、usbtmcとusb-gpibとusb-serialなどを使っていて、これにマウスとキーボードを加えると、usbポートの増設が必要で、そのためにusbハブを使用している。しかし、ハブを通すと問題がおきる場合もあるので、比較的負荷の軽いマウスとキーボードとusb-serialをハブを介して使っている。相性問題が生じるかと心配したが、今回は問題が無かったようだ。