loginできない

/dev/nullのpermission
今日、debianにloginしようと思ったら、なぜかうまく行かなかった。passwordを打ち間違えたかと思ったけど、そうでは無いようだ。rootではloginができたので、少し調べてみたら、.xsession-errorsには、

cannot create /dev/null: Permission denied

となって、Xが立ち上がらないのが原因のようだ。こうなってしまった理由は良く分からないのだが、/etc/rc.localのexit 0の前に、

chmod 0666 /dev/null

と入れれば良いというのを見つけたので、そうしたらloginできるようになった。なんか、気持ち悪いけど、まあいいか。

Read more...

code golf

久々にrubyでgolfをやってみた。
このサイトのgolfを試してみた。そのNo.902の1 2 32 4 512というものである。具体的には、2のn乗で1から100までの数字から始まるものを順に探して表示するというものである。まず、普通に書いてみたのが、

100.times{|i|r=1;r*=2 until r.to_s=~/^#{i+1}/;p r}

で50bytesである。そのすぐ後に、スペースを取り除けることに気が付き、

100.times{|i|r=1;r*=2until"#{r}"=~/^#{i+1}/;p r}
として、48bytesまでになった。ここから、いろいろな工夫をしてみたが、どうしても48を切ることができなかった。例えば、

1.upto(100){|i|r=1;r*=2until"#{r}"=~/^#{i}/;p r}
1.upto(100){|i|r=1;r*=2until"%s"%r=~/^#{i}/;p r}
1.upto(100){|i|r=1;r*=2until"#{r}"[/^#{i}/];p r}
1.upto(100){|i|r=1;$_="#{r*=2}"until/^#{i}/;p r}

などを作ったが、何をやっても48止まりだった。特に、最後のは1に対する答えが16になってしまうという欠点もあるし。ruby1.8なら、100の代わりに?dを使うという技を使えるのだが。その時、一位の人は46で二位が47だった。10bytesぐらい差をつけられていたら、もう諦めるのだが、数byteとかだと、なんとかなるのでは無いかと思ってしまう。散々考えていたら、昨晩、47に到達した。

($.+=r=1;r*=2until"#{r}"=~/^#$./;p r)until$.>99

というものである。行数を表す組み込み変数$.を使って、初期値の代入と#{}の括弧をなくしたり、最初に1を足すことによって、100の代わりに99を使えるようにして、なんとか1byte減らすことに成功した。これでなんとか二位には追いついたが、一位の46bytesはどうやっているのか、全く見当もつかない。

2015/6/30追記 二位の人は、ruby1.8流のやり方をしていた。これなら、1.9以降でも動く私のscriptの方が上とも言える。一位の人は、これに加えて、補数を求める~演算子を使っていた。なるほど、これなら100を99までで良くなるのでtimesが使えるし、行頭の^も省略できる。

Read more...

共用PCの入れ替え

debian8のPC
長らく共用のPCとして使っていたnoteが死んだので、別のnoteに入れ替えた。実はそのnoteには、しばらく前にdebian8をインストールしたのだが、起動しようとしたらビープ音が鳴るようになってしまい、電源がおかしいのかなと思って放置してあった。少し調べていたら、どうやらキーボードのどれかのキーが押された状態と認識されており、そのために音がいる可能性があることが分かった。そこで、分解してキーボートのフラットケーブルを外してみたところ、うまく動くようになった。基本的には、外付けのキーボートとマウスを繋いで使うので、これで問題が無い。ftpdやntpの設定をして、共用のPCとして使えるようになった。 debian8のLXDEを少し使ってみたが、windowの移動のときに、遅れて着いてくる感じで、気持ち悪い。単にPCの性能が低いだけかも知れ無いが。

Read more...

rpi2にubuntu mate

usbtmcが使える
raspberry pi 2を使って、測定システムを組もうと思い、OSを調べていたら、新しくubuntu mateというOSが加わっていたので、試してみた。これまで、raspberry piにはraspbianを入れていたが、usbtmcがそのままでは使えないので、kernelをコンパイルし直して使っていた。これがそれなりに面倒だし、kernelが新しくなったら、またコンパイルしないといけない。しかし、ubuntu mateはそのままでusbtmcが使えたので、測定用に適しているのでは無いかと感じた。 ubuntu mateのインストールは、以下のように行った。まず、イメージの圧縮ファイルをdownloadして、解凍する。これを、

sudo dd bs=1M if=ubuntu-mate-15.04-desktop-armhf-raspberry-pi-2.img of=/dev/sdX

などとして書き込む。sdXのところにはmicroSDを指定するようにして下さい。今回は8GBのmicroSDを使ったのだが、ubuntu mateには、partitionの格調をする機能が無いようなので、gpartedを使って拡張する。microSDの二番目のpartitionを選んで、リサイズする。そして、あとはrpi2に挿して起動である。 セットアップの仕方は、ubuntuとかに慣れていれば、それほど難しくないだろう。日本語を入力できるようにするために、ibus-anthyを入れて、あとは必要なr-baseやrubyを入れれば、測定に使えるようになる。ただ、いくつかのパッケージの取得に失敗したので、source.listを少し書き換えたが。 無事usbtmcの制御もできたし、測定用のマシンとしてのセットアップをしよう。

Read more...

PWMを使ってみた

attiny2313のタイマーとPWM
LEDの光量を調節するために、AVRのattiny2313のPWMを使ってみた。もちろん、マニュアル通りにやれば動くのだが、そのすべてを読むのは大変だし、私がいくつか迷った点を書いておこうと思う。 attiny2313には、二つのタイマーがあり、timer0は8bitでtimer1は16bitである。この二種類のタイマーに対してPWMがあり、それぞれOC0A,BおよびOC1A,Bのピンが対応している。さらに、AとBの使い分けは、通常のPWMはどちらを使っても良いが、カウンタを途中までで使うときにはBのを使う。つまり、8bitの場合に255までカウントするときにはどちらでも良く、例えば100までカウントするときにはBを使うというわけである。 同様にタイマーに関して、通常の場合はOVFの割り込みで良いが、途中までのカウントの場合には、COMAの割り込みを使う。

Read more...

tinyとmega

レジスタの名称
これまで、AVRマイコンとしては、tiny2313かtiny261などを良く使っていた。今回、atmega88を使ったのだが、tinyのプログラムを流用して書いたら、エラーが沢山出てしまった。uartのところで、レジスタの名称に0を付けないといけないというのが主な原因だった。いくつかある場合に番号をつけないといけないのはわかるが、0は省略しても良いようにしておいてくれると、tinyとmegaで同じプログラムが使えるのに。折角なので、tinyとmega用のuartのsubroutineを別のファイルにして、コンパイルできるようにしておいた。これで、今後は困らないはずだ。

Read more...

ubuntu14.04にavrdude6.1をインストール

avrdudeでarduino-ft232r
久々にavrを使おうと思って、書き込みをしようと思ったら、うまくいかなかった。ft232rを使ったarduino-ft232rまたはdiecimilaというタイプの書き込み機を指定したのだが、flushの消去に失敗する。どうやら、バグがあったようで、去年の9月末ぐらいには対策されている。しかし、ubuntu14.04のマシンのavrdude6.01では、動かないようだ。6.1ももう出ており、ubuntu14.10ではこれが標準になっている。しかし、ubuntu14.04はLTSなので、このままでなんとかしたい。 調べてみたら、以下のようにすると、avrdude6.1をインストールできるらしい。

sudo aptitude remove avrdude
sudo add-apt-repository ppa:pmjdebruijn/avrdude-release
sudo apt-get update
sudo apt-get install avrdude

これで書き込んでみたら、うまくいった。

Read more...

RS-232Cの制御

ruby-serialportを使って
RS-232Cの信号線としては、TxD,RxD以外に、出力としてRTS,DTRが、入力としてCTS,DSR,DCD,RIがある。これらをLinuxから制御する方法として、ioctlを使うこともできるが、rubyのserialportを使うと簡単であることが分かった。 まず、インストールをする。

aptitude install ruby-serialport

使い方は、以下のような感じである。

require 'serialport'
sp=SerialPort.new('/dev/ttyUSB0',9600,8,1,SerialPort::NONE)
sp.flow_control = SerialPort::NONE
sp.close

ソースを見ると、methodとしては、以下のものがある。

get_modem_params
set_modem_params
modem_params
modem_params=
baud
baud=
data_bits
data_bits=
stop_bits
stop_bits=
parity
parity=
flow_control=
flow_control
read_timeout
read_timeout=
write_timeout
write_timeout=
break
signals
get_signals
rts
rts=
dtr
dtr=
cts
dsr
dcd
ri
flush_input
flush_output

rtsとdtrは0または1を入れると、出力ができる。入力は、それぞれの信号線の名前と同じ名前のmethodで読むことができる。 出力の数は少ないが、簡単なICの制御などには使えそうである。汎用性も高いし。

Read more...

raspberry piとGPIBの比較

GPIBのバスライン
GPIBの規格によると、GPIBのそれぞれのバスは3kohmを介して5Vにプルアップして、6.2kohmを介してGNDにプルダウンしてある。何もつながない状態では、約3.3Vになる計算である。ドライバとしては、SRQ, NRFD, NDACはオープンコレクタ、その他の信号線はオープンコレクタまたはトライステートにするらしい。前者の3つは、wired orを実現するために、オープンコレクタの必要があるのだろう。 一方、raspberry piのGPIOは、3.3Vなので、GPIBのバスの電圧とは相性は良いかも知れない。問題は、電流の吸い込み能力がどの程度あるかである。 少し抵抗をつないで直結しても大丈夫なのかなと不安になるが、どうなのだろう。

Read more...

GPIBアダプタのアイディア

FTDIかRaspberry piか
測定装置のインターフェースの状況が、近年変わりつつある。昔からあったRS232CとGPIBは徐々にすたれて、USBTMCやEthernetが増えつつある。後の二つはLinuxから使いやすいので、重宝している。前の二つの内でRS232Cは、USB-RS232C変換ケーブルが容易に入手できるので、簡単に使うことができる。問題はGPIBであるが、LinuxからGPIBを扱うには、いくつかの方法がある。 まずは、PCにGPIBボードをのせて、linux-gpibを使って制御する方法である。これはシンプルなのだが、最近のdebianではカーネルのコンパイルが必要なようで、少し面倒である。以前はこのようにして使っていた時期もあるが、ボードも高いし、インストールが面倒なので、あまり使わなくなってしまった。 特殊な方法としては、古いPCについていたパラレルポートを改造して、GPIBを使えるようにしたこともある。コストは非常に安いし、当時のWindowとLinuxから使えるようにして、それなりに便利に使っていた。説明はここに残っているが、パラレルポートはほとんど見かけなくなったので、今は使えない方法である。 現在、よく用いられているのは、USB-GPIB変換ケーブルを使う方法である。アダプタはいろいろな種類があるが、linux-gpibを使うものや、内部でシリアルに変換するものなどがあるようである。自分でもUSB-RS232CとMAX232とAVR tiny2313を使った変換ボックスを作ったことがある。ソースなどは汚いので、公開していないが。 最近は、使える道具も増えてきたし、新しいGPIBを作れないか考えてみた。まず考えたのが、FTDIのBitbangモードを使って、USBから直接GPIBを制御できないかというものである。もう一つの考えは、Raspberry piのGPIOを使うものである。 FTDIのbitbangは、USBからbit操作を簡単にできる、魅力的な方法である。しかし、FT232Rのbitbangでは8bit、cbusは4bitしか使えないし、FT2232は16bit使えるようだが外付けの部品がいろいろと必要なようで、どちらもGPIB用としては不十分な気がする。FT232Rを使ってシリアルにしてマイコンでGPIBに変換するようなアダプタは、他にも作っている人がいるし、特殊なコマンドを定義しないといけないので、美しくない気がする。cbusはシリアルと同時に使えるので、ATN, IFC, REN, EOIなどをcbusから出して、dataはシリアルで通信するようにするようにすれば、特殊なコマンドを定義しなくても良いので、面白いかもしれない。 一方、Raspberry piのGPIOを使えば、余分なICを使わずに、GPIBが制御できるかもしれない。model BだとGPIOが17本、pi2Bだと26本あるようなので、数は十分である。CPUは忙しくなるが、バスに抵抗はダイオードなどをつけてGPIBにつなげば、GPIBが制御できそうである。 今度、時間ができたら、どちらかのアイディアでやってみよう。

Read more...