Rの変数の取扱い

変数と環境

普段グラフを書くためにRを使っているが、そのためのプログラムは比較的単純なので、バグに苦しむことは少ないが、少し複雑なプログラムを書いていたら、バグに大変苦しめられた。その要因はいくつかあるのだが、一つは変数の有効範囲の問題だった。

例えば、あるプログラムの中で、関数を定義した場合に、変数のスコープがどうなるかを実験してみよう。以下のようなプログラムを動かすとどうなるだろうか。

a<-1
b<-function(){print(a);a<-2}
b()
print(a)

functionの中では、当初はaが定義されていないが、外のaの値を取ってくるので、エラーは起こらず、1が表示される。しかし、次の代入は関数内のスコープをもつ変数に代入されるので、関数の外では1のままとなるのである。読み込めるのに書き込めないというややこしい状況になる。

functionの中と外でスコープを一致させるためには、以下のようにすると良い。代入と取り出しを書くのが長くなるが、環境を指定することができるようになる。すると、関数の外でもaの値が更新されて2となる。ちなみに、evalで環境を指定するという方法もある。

e<-new.env()
assign("a",1,envir=e)
b<-function(){print(get("a",envir=e));assign("a",2,envir=e)}
b()
print(get("a",envir=e))
Read more...

グラフから数値の読み取り

g3dataを使ってみた
グラフから数値を読み取りたいときに、グラフの図のファイルから自動的に数値を抽出してくれるソフトがあれば便利である。linuxの場合には、g3dataというものがあるようなので、それを使ってみた。まず、座標軸を決めるために、縦軸と横軸について二点ずつ指定する。そして、読み取りたい点を指定すると、その座標を計算してくれる。 まあ、それなりに使えるが、座標の設定が面倒である。このくらい自動でやってくれるようなソフトを自分でも書けるのでは無いかと思ったが、面倒なので、今回は見送った。 最近のデータなら良いが、古いグラフだと、スキャナーで取り込むときに、少し回転したり、歪んだりしていることがあるが、これをどう補正するのかは、非常に難しい気がする。

Read more...

LinuxのPCの入れ替え

新しいCPUと古いCPU
測定用に使っているPCが故障しているというので、いろいろといじっていたのだが、CPUのFANが回ってないことを発見した。そのFANは12Vで三ピンのもので、GNDと12Vラインに加えて、シグナルラインがあるので、修理は簡単では無さそうだと感じた。 ホコリを飛ばした後で分解してみると、NTCと書かれた素子があり、その抵抗を測定したら、テスターでは測れなかった。調べたら負の温度係数を持つサーミスタのようなので、これが壊れたのが原因だと推測した。試しにその部分を短絡してつないでみたら、FANがすごい勢いで回りだした。温度が高くなったと思って、全力で冷やそうとしているのであろう。数キロオームの抵抗をつないだら、適切な回転数になったので、起動を試みた。 しかし、なぜか立ち上がらない。マザーボードの設定がおかしくなったかもと思って、電池を外して初期化したりしていたら、PCは立ち上がるようにな ったのだが、FANがまた回らなくなってしまった。 仕方がないので、PCそのものを別のに置き換えることにした。OSのインストールは面倒なので、HDDをそのまま移してしまうことにした。元のPCはpen4だったのだが、dualcoreのPCにHDDを移植したら、起動の途中で止まってしまう。仕方がないので、別のpen4のPCに載せ替えたら、ようやく動くようになった。Linuxの場合には、HDDの移植で大抵は立ち上がると思っていたのだが、世代が違い過ぎると、立ち上がらないようだ。 LANの設定などがまだ不完全なのだが、まあそれはまた後日やろう。

Read more...

not mathematica but maxima

maximaで数式処理
簡単な数式の計算をしたいことがあったので、raspberry piのMathematicaでやろうかとも思ったが、手元になかったので、maximaでやってみた。aptでインストールして、ターミナルでmaximaと打って立ち上げる。 今回やりたいのは、複素数の実部と虚部を求めることである。最初につまずいたのは、文の最後に;を打たないといけないことである。そして、虚数単位は%iとして記述する。実部はrealpart()で、虚部はimagpart()で求めることができる。しかし、表示が目で見て分かりやすいようになっていて、通常の表示にはなっていない。そこで、display2d:false;とすると、表示形式が通常のプログラムで書くような感じになる。これで、maximaの出力を別のソフトに渡すことができる。

Read more...

ESP8266

NodeMCUとD1 miniとWio Nodeが良いかも
トラ技の過去の目次を見ていたら、ESP8266が紹介されていた。これを使うとWiFiを簡単に使えるようになるらしい。また、それが組み込まれたボードもいろいろな種類が発売されているので、それらを使う方法もある。 ESP8266自体を直接使うためには、ピッチ変換基板にハンダ付けをしたり、USBシリアル変換と繋いだりしないといけないので、それなりに面倒なようだ。一方で、Arduinoとピン互換のD1や、それを小型化したD1 mini、さらにはNodeMCUなどは、USBケーブルに繋ぐだけで、使えるようになっているので、ちょっと試してみたい人には良いように思える。これらはArduino IDEから使えるようだ。実際、NodeMCUは試してみたが、簡単に動かすことができた。大きさ的にはD1 miniが良いように思える。 Groveを簡単に使えるようにしたWio Nodeというものもある。しかし、こちらはWiFiからしか命令を送ることができず、汎用性に乏しいように感じられる。しかし、Groveコネクタとして、RxDとTxDが出ているので、これにUSBシリアル変換をつなげば、直接プログラムを流し込むことができるのでは無いかと考えている。いつか試してみよう。

Read more...

arduinoとNodeMCU

AVRからarduinoへ
マイコンとしてAVRを使い出したのは2010年頃だった。それ以前は、論理ICを組み合わせて回路を作ったりしていたが、PS2のマウスとの通信をする必要があって、いろいろと調べていたらAVRを見つけれ、使い出したのが最初だと思う。それから約六年が経つが、必要なものを作るのに、AVRはいろいろと活躍してきた。PCと測定装置のインターフェースや測定装置自身、最近では電力制御電源なども作ったりした。 この間に、書き込み機もいくつか使って来た。最初はプリンターポートを使っていて、専用のケーブルを自作した。しかし、プリンターポートがだんだんと無くなって来て、USBの書き込み機として、FT232のbitbangを使ったものを作って使うようになった。しかし、PCと通信させるようなものを作るときには、USBシリアル変換と書き込み機の両方の役割をFT232にさせることもある。その際、配線の手間を省くためには、arduino互換の基板を使うと便利であることに気が付き、それを使うことが多くなった。 こうなって来ると、arduinoを使ったら良いのでは無いかと思うが、それなりの値段がするので、あまり乗り気では無かった。いろいろと探してみると、arduino互換機の中には、非常に安く売られているものもある。AVRとUSBシリアル変換ICの値段よりも、安くなっているものを見ると、もうこれを使わない手は無いということで、重い腰を上げることになった。 まず使ってみたのはarduino UNOの互換機であるが、確かに簡単なことは簡単に使えて素人には便利である。しかし、AVR自身を使っていた人間にとっては、かゆいところに手が届かないような感じもする。例えば、すべての種類の割り込みが使えないようだし、ADCも差動が使えないようだ。基板だけarduinoを使って、プログラムは普通に書いて、ISPで流しこんだら良い気もする。普通のAVRのプログラムをUSBからarduinoに流し込めるのかな。これができたら私に取っては非常に便利なのだが。簡単なことをするときには、arduinoのスケッチを書いて、複雑なことをしたいときにはAVRのプログラムを書けば良いのである。 arduino IDEから扱える、NodeMCUも試してみた。こちらのCPUについてはまだ理解していない部分が多いのだが、WiFiを手軽に使えて、少し驚いた。CPUも速いし、メモリも多いので、あまり気にしないでプログラムできるし。 今後、arduinoとNodeMCUを使って、いろいろな装置を作っていこうと思う。

Read more...

proxy越しのftp

いろいろと試したが
proxy越しにサイトにアクセスするときには、いろいろと苦労することがある。httpの場合には、ブラウザーできちんとproxyの設定をすれば良いが、ftpの場合には、どのようにするかよく分からなかった。認証の仕方はいろいろとあるようだが、以下のようにするとうまくいった。proxyサーバーにftpサーバーのuser@serverをユーザー名として使って、ログインすると、proxy越しに外部のサイトにアクセスできる。

Read more...

日本語のunzip

Shift-JISのファイル名のunzip
受け取ったzipファイルをunzipしようと思ったら、日本語のファイル名が文字化けした。utf-8でやってくれれば、linuxでも化けないのに、windowsのファイル名はshiftjisなので、問題が起こるらしい。ubuntuの日本語版には、shiftjisに対応したunzipが入っているらしいが、debianのunzipは対応していないようだ。調べてみるとunarというのがあるらしく、unarの後にファイル名をつけるだけで、unzipと同じように展開できて、日本語のファイル名も変換してくれる。私の使っているdebianには入っていたので、そのまま使えた。

Read more...

ノートのキーボード

交換は可能だが、修理は不可能
ノートのキーボードのいくつかのキーが打てなくなったということで、キーボードの交換を行ってみた。webで分解の仕方を調べると、丁寧に書いてあったので、そのとおりにして、あとはフラットケーブルを抜いて、交換するだけである。フラットケーブルのコネクタを閉じる時に、少し固かったので、焦ったが、無事に交換できた。これまでうまく反応しなかったキーも、うまく打てるようになった。 古いキーボードで、キーが打てなくなった原因を探るために、分解を試みた。しかし、ネジはひとつも使っていない。裏側のアルミの大きなシールを剥がしても、分解の仕方が分からない。仕方がないので、キートップを強引に外していったら、キーボードのコアのシートが顔を出した。しかし、キートップすべてと、キーの隙間の部品をはずさないと、シートを取り出せないことが分かって、断念した。調子が悪かったキーのキートップなどを調べたが、大きな異常には気が付かなかった。ゴムの部品もシートに接着されていて、取り外しができない。それも引きちぎって調べてみたが、故障の原因は分からなかった。パッと見た感じ、シートの配線は傷んでいないようだったので、ゴムの部分の劣化が故障の原因だと思うことにした。本来は平行に押されないといけない部品が、片側だけが劣化しれ、平行になりにくくなって、シートがうまく押せなかったのかも知れない。でも、そのゴムは接着されているので、修理は不可能である。 ノートは薄く小型に作らないといけないので、仕方がないことかも知れないが、修理できないのは残念な構造である。別の人のノートのキーボードも、不調らしいが、こちらは交換用のキーボードがなかなか見つからない。その場合には、修理も交換もできないことになってしまうのだろうか。

Read more...

long term support

lubuntu16.04のインストール
ノートに入れているubuntuが古くなってきていたが、LTSが出るまでは、面倒なので、そのままにしていた。先週ようやく16.04LTSが出たので、インストールしてみた。 いつものようにインストール用のisoをCDRに焼こうと思ったら、850Mぐらいあって、CDRには入らない。mini.isoというのも見つけたが、これは50Mぐらいで、CDRには小さすぎる。いろいろと悩んだ結果、USBでインストールすることにした。ubuntuのシステムツールの中に、ブート用のUSBを作るソフトがあったので、これを使って、1GBのUSBにdesktopのisoを入れた。しかし、インストールの初期の段階で止まってしまう。原因は分からないが、alternateにしたら、うまく進むことができた。 しかし、おそらくproxyが悪さしているようなのだが、aptがうまく動かない。synapticsは動くのだが。

2016/4/27追記 /etc/apt/apt.confのproxyの設定を消したら、aptが動くようになった。なぜだろう。/etc/wgetrcは書いておいたけど、それは問題無いようだ。

Read more...