rubyのclassとmodule
自作の装置で測定する場合には、rubyを用いて測定している。PCと機器で通信する場合には、インターフェースとしてGPIBやRS232CやUSBTMCを主に使っているが、これらを切り替える必要がある場合がある。当初は、機器に対してインターフェースを固定して、それ専用のプログラムを書いていたが、インターフェースを変えるために、別のプログラムを作らないといけないので面倒である。
現在ホームページに公開しているversionでは、インターフェースをclassとして定義して、機器はそれらのサブclassとして定義することによって、インターフェースを指定している。インターフェースを切り替えるためには、機器を記述しているプログラムのスーパーclassの部分を書き換えるだけで良い。スーパーclassは後から変えることは出来ないようなので、プログラムの書き換えが必須であった。
新たに装置を立ち上げるにあたって、いろいろと考えていたら、moduleを使えば、インターフェースと装置のプログラムを書き換えずに、測定プログラムからインターフェースを切り替えるという方法を思いついた。つまり、インターフェースはmoduleにして、測定プログラムの中から、機器のclassを再定義してincludeさせるのである。測定プログラムの先頭が少し長くなるが、そこでそれぞれの機器のインターフェースが明示されるのは、良い点とも考えられる。もう少しプログラムが固まってきたら、公開するかも知れません。
htmlでGL
RとrglとwebGL
rglを使うと、Rで三次元の図を作って、マウスで回したりすることができる。webGLを利用して、htmlにすることもできる。
library('rgl') open3d() shade3d(cube3d(),col='red') writeWebGL(filename='index.html')
とすると、index.htmlが出来て、これをブラウザーで表示させると、三次元の図が現れる。そのままの設定だとwebGLというフォルダが出来てしまうけど、まあいいか。このhtmlには、長いjavascriptが埋め込まれている。これを取り除いて、図形のデータだけにしたい場合は、
writeWebGL(filename='index.html',commonParts=FALSE)
とすればよい。しかし、そのままでは図形を表示できない。/usr/lib/R/site-library/rgl/htmlwidgets/lib/CanvasMatrix/CanvasMatrix.src.jsと/usr/lib/R/site-library/rgl/htmlwidgets/lib/rglClass/rglClass.src.jsを同じフォルダに置いて、"src."を除いたファイル名に変更して、htmlの最初の方に
<script src="CanvasMatrix.js" type="text/javascript"></script> <script src="rglClass.js" type="text/javascript"></script>
を加える必要がある。また、同じhtmlに複数の図を置く場合には、div idを変更する必要がある。
<div id="div" class="rglWebGL"></div> <script type="text/javascript"> var div = document.getElementById("div"),
にある二つの"div"を重複しない名前に変更すれば良い。この方法がなかなか分からずに苦労した。
ImageMagickのsecurity
pdfとjpegの変換
ImageMagickを使って、pdfをjpegに変換しようとしたら、security policyのせいで出来ないと言われてしまった。昔はできたはずなんだけど。調べてみたら、回避方法が分かった。/etc/ImageMagick-6/policy.xmlでPDFの制限をしている行をコメントアウトすれば良いようである。実際にやってみたら、うまく動くようになった。
evinceでは無かった
なかなか気づかなかった
lubuntu20.04でpdfを見たときには、使い勝手がこれまでと違うと思っていたら、実はevinceでは無いことにようやく気がついた。新たにevinceをインストールしたので、これからは同じ使い勝手で使うことができるでしょう。
lubuntuの日本語入力
思ったより簡単
最近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の行をコメントアウトすれば良いようなので、試してみた。
しばらく使ってみたけど、そこそこ良い感じである。