July 18, 2012

cron.d に置いた設定が反映されない件

/etc/cron.d以下においたファイルがどうも反映されてないっぽい。
なんでかなーとしらべていたら、
Files must conform to the same naming convention as used by run- parts(8): they must consist solely of upper- and lower-case letters, digits, underscores, and hyphens.
(cf. http://manpages.ubuntu.com/manpages/gutsy/en/man8/cron.8.html )
とのこと。あーなるほどですね。

June 9, 2012

Arduino における正確な ADC について

Arduinoにおいて、正確なADCを行うにはコツがいるようだ。
AVccの揺れを補償してやる必要がある。

http://hacking.majenko.co.uk/node/57
http://code.google.com/p/tinkerit/wiki/SecretVoltmeter
によると、
long readVcc() {
  long result;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  result = ADCL;
  result |= ADCH<<8;
  result = 1126400L / result; // Back-calculate AVcc in mV
  return result;
}
という関数を作って、
unsigned int ADCValue;
double Voltage;
double Vcc;

Vcc = readVcc()/1000.0;
ADCValue = analogRead(0);
Voltage = (ADCValue / 1024.0) * Vcc;
という形で、対処してやる必要があるようだ。

_BV()はビットシフトするマクロでREFS0,MUX3,MUX2,MUX1,ADSCは
arduino-1.0.1\hardware\tools\avr\avr\include\avr\iom328p.hに定義されている。


ADC周りのレジスタについては
http://www9.plala.or.jp/fsson/NewHP_elc/AVR/Avr_ADC.html
を参照のこと。

これを踏まえて、readVccにコメントを付けるとするなら、
long readVcc() {
  long result;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);// ARefに1.1Vを出力し,基準電圧1.1Vをアナログ入力チャンネルに指定
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // 変換開始
  while (bit_is_set(ADCSRA,ADSC));// 変換完了待ち
  result = ADCL;// 変換結果取得(下位8bit)
  result |= ADCH<<8;// 変換結果取得(上位2bit)
  result = 1126400L / result; // 1126400 / ( 1024 * 1.1 / AVcc ) = AVcc*1000(mV)
  return result;
}
という感じか。

May 16, 2012

Windows7 における XBIB-U ( MaxStream PKG-U ) ドライバの導入

XBeeで遊びはじめたのだが、
XBee用USBアダプタであるXBIB-Uのドライバの導入で躓いたのでメモ。

XBIB-U-DEVはまったく問題なく標準USBシリアルドライバで対応できたので、面倒な人はXBIB-U-DEVを購入すべき。
標準USBシリアルドライバではXBIB-U ( MaxStream PKG-U )に対応できない。

FTDIにいって必要な物を入手する。
DLするのは ドライバそのもの(これを書いている時点では2.08.24)と、setup executable(これを書いている時点ではCDM20824_Setup.exe) 

ドライバをDL・展開し、出来たディレクトリをスペースが入らない名前にリネーム(この例ではXBIBDriverとする)してC:\直下に配置する(c:\XBIBDriver)。(このへんはスペースが入っている場合のcmdでのパス表記の仕方に理解がある人ならどうやったっていい) 

編集すべきはftdibus.infとftdiport.infの2つ。

 ftdibus.infは
[FtdiHw]セクションに
%USB\VID_0403&PID_EE18.DeviceDesc%=FtdiBus.NT,USB\VID_0403&PID_EE18
を追加

[FtdiHw.NTamd64]セクションに
%USB\VID_0403&PID_EE18.DeviceDesc%=FtdiBus.NTamd64,USB\VID_0403&PID_EE18
を追加

[Strings]セクションに
USB\VID_0403&PID_EE18.DeviceDesc="MaxStream PKG-U"
を追加
ftdiport.infは
[FtdiHw]セクションに
%VID_0403&PID_EE18.DeviceDesc%=FtdiPort.NT,FTDIBUS\COMPORT&VID_0403&PID_EE18
を追加

[FtdiHw.NTamd64]セクションに
%VID_0403&PID_EE18.DeviceDesc%=FtdiPort.NTamd64,FTDIBUS\COMPORT&VID_0403&PID_EE18
を追加

[Strings]セクションに
VID_0403&PID_EE18.DeviceDesc="USB Serial Port"
を追加

つぎにsetup executableを実行する。
これによって、C:\Users\%ユーザーネーム\AppData\Local\Temp以下に DPInstx64.exe が作成されるので、これをcmdから呼び出して上記で編集したinfをインストールする。
(ユーザーネームには自分のユーザーネームを入れる)

 cmd内で
c:\Users\ユーザーネーム\AppData\Local\Temp\DPInstx64.exe /PATH c:\XBIBDriver
としてインストールして終了。

参考:https://acs.is.nagoya-u.ac.jp/index.php?module=User&action=Diary&id=1010

May 14, 2012

Ubuntu12.04 の guest session を無効化する

guestでログインとか気持ち悪すぎるので、無効化する。 
/etc/lightdm/lightdm.confの[SeatDefaults]の最後に
allow-guest=false
を追記して再起動すれば良い。

May 2, 2012

Cisco IP Phone 7940G の SIP ファーム 化について

地味に面倒だったのでメモ。 

まず、dhcp,tftp環境を整える。
SELinuxは、あらかじめ例のあの方にごめんなさいをしてから、切っておく。
Firewallはudpの67,69が開いてれば大丈夫。
# yum install tftp-server
# yum install dhcp
# chkconfig xinetd on
# chkconfig dhcpd on

デフォルトではtftpは/etc/xinetd.d/tftp内の記述で殺されているので、
service tftp
{
 socket_type  = dgram
 protocol  = udp
 wait   = yes
 user   = root
 server   = /usr/sbin/in.tftpd
 server_args  = -s -v /var/lib/tftpboot
 disable   = no
 per_source  = 11
 cps   = 100 2
 flags   = IPv4
}
とでもして起動するようにしておく。
また-vオプションによって/var/log/messagesに詳細なログがはかれるようにしておく。

 dhcpは、/etc/dhcp/dhcpd.confを
ddns-update-style interim;
ignore client-updates;

option voip-tftp-servers code 150 = ip-address;
option voip-tftp-servers 192.168.1.1;

subnet 192.168.1.0 netmask 255.255.255.0 {

  option routers                  192.168.1.1;
  option subnet-mask              255.255.255.0;
  option nis-domain               "";
  option domain-name              "";
  option tftp-server-name         "192.168.1.1";


  range dynamic-bootp 192.168.1.200 192.168.1.250;
  default-lease-time 3600;
  max-lease-time 7200;
}
とでもしておけばよい。

/var/lib/tftpbootには、

Ciscoの提供するSIPファームのzipファイルに由来する

OS79XX.TXT
P003-8-12-00.sbn
P0S3-8-12-00.sb2
P003-8-12-00.bin
P0S3-8-12-00.loads

と、別途用意する

XMLDefault.cnf.xml
SIPDefault.cnf
SIPXXXXXXXXXXXX.cnf
XMLDefault.cnf.xml
dialplan.xml

を入れておけばよい。

後者の内容に関しては
http://www.junic.net/archives/325
を参照。
各項目の説明は
http://www.cisco.com/cisco/web/support/JP/docs/VAUC/IPTelep/SIPIPPhoneSW/AG/001/03_sipmn44.html?bid=0900e4b18252979a
http://www.cisco.com/cisco/web/support/JP/docs/VAUC/IPTelep/SIPIPPhoneSW/AG/001/02_sipins44.html?bid=0900e4b18252979a
を参照。

あとは、7940Gに電源とLANをつないで起動させれば、
勝手にファームを読みにきて、
勝手にファームを書き換えて、
起動してくれる。

Asteriskの設定で気をつけるべきはsip.confの[general]内で"nat = no"を宣言しておくこと。
これは、上記の7940Gに食わせた設定との整合のため。

7940Gの電源が地味に面倒である。
というのもIEEE 802.3af制定前のCiscoの独自規格のPoEを採用しているためである。
今回私はHPのProCurve 2600-PWRをつかった。
何の設定もなしに、一発給電!大変よい買い物であった。

April 16, 2012

スクリプトの存在するディレクトリを調べる

シェルスクリプトを書いていると、
「そのスクリプトが置かれているディレクトリをしりたい」
なんてことがままある。

そんな場合は、
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
とする。
非常に稀なケースとして、スクリプトが存在するディレクトリが消失している場合は、DIRが空になる。
DIRが空かどうかはチェックすべき。

これは.で読み込んだ場合でも正確に動作する。

shではエラーが出る。bashで実行すること。

出典:
http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in

April 9, 2012

Arduino と W5200 ( WIZ820IO )を接続する3

コレの続き。
W5200へのアクセステスト
34時間目にしてついにスタック!
n=3で2回スタックしたし、一週間も持たずにスタックするとかやっぱり信用出来ない。。。

W5200そのもの、あるいはWizNetのライブラリ、もしくはWebServerスケッチかなぁ?

WebServerスケッチとそれ以外の原因の切り分けのために
W5100搭載のEtherシールドをつけたやつも並行して実験しておこうかな。
結果:
W5200は約50時間(147,714回)でスタック!
リセットして再度実験して50分(2,939回)で再度スタック!
リセットして再度実験して4日と8時間(260,602回)で再度スタック!
リセットして再度実験して2日と20時間(181,085回)で再度スタック…
リセットして再度実験して6日と16時間(359,543回)で再度スタック……
リセットして再度実験して4日と10時間(262,735回)で再度スタック……
W5100は20日以上トラブル無く稼働中(854,712回)!
時間と回数が合わないのは1回が取得+1秒ウェイトである上に、
数十万個のファイルがスクリプトを回しているディレクトリ下に作成されていて、
そのあたりも原因っぽい。こんな長時間まわすと思ってなかった…

どうもWebServerスケッチではなく、W5200かW5200用ライブラリがおかしい。
そしてW5100は安定しておるように見える。

どっから手をつけたもんかなー。
W5200の個体差というか、ハズレ個体なのかもしれんので、
もう一個買ってみるかー。

追記:4/16
実験結果更新


追記:4/22
実験結果更新

April 7, 2012

CentOS6 における gitサーバ の構築

gitの管理系としてgitoliteを採用し、環境を構築する。 
まずは各種のインストール。
gitoliteは公式レポジトリにないので、EPELから取ってくる。
# yum install git
# rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-5.noarch.rpm
# yum install gitolite
これでgit及びgitoliteが導入された。
gitをホストするためにgitoliteという名前のユーザーがインストール時に作成されている。

注意すべきは、gitoliteアカウントがgitサーバにおけるすべてのレポジトリの所有者であり、
唯一必須のgitサーバのシステムアカウントである点である。
すべてのユーザーはgitoliteアカウントとしてgitサーバにアクセスすることになる。
各ユーザーはSSH公開鍵によって区別される。
このあたりがしばらく理解できなくて苦しんだ。

つぎにgitの管理ユーザーのための設定を行う。
gitoliteは管理情報をgitで管理するため、管理ユーザーすらgitサーバに、
(共用であるgitoliteアカウント以外には)システムアカウントを必要としない。

gitのクライアントとなる端末(サーバと同居してもいいが)のユーザーでsshの鍵を作り、
gitoliteが導入されているサーバにコピーしておく。
以下はクライアントでの作業
$ ssh-keygen -t dsa
これで、~/.ssh/id_dsaと~/.ssh/id_dsa.pubが出来ているはずである。

また、sshのコンフィグファイルを作っておくと便利である。
以下はクライアントでの作業
$ vim ~/.ssh/config
host gitserver #gitserverは適当に名前を変えてもよし
    user gitolite
    hostname 192.168.1.2 #gitserverのIPかDNSでひけるホスト名
    port 22
    identityfile ~/.ssh/id_dsa

id_dsa.pubをgitサーバにコピーし、/tmp/admin.pubなどにおいておく
(セットアップが終わったらいらなくなるのでtmpでよい) 
gitoliteは鍵の名前でユーザー名を管理することになるため注意。
(この例では管理ユーザーの名前はadminとなる)
以下はgitサーバでの作業
# chmod a+r /tmp/admin.pub 
# su -l gitolite
$ gl-setup /tmp/admin.pub
このあと設定ファイルをいじるためにvimが起動するが
ESC→:q→リターン
で抜ける。 

この時点で管理データレポジトリがたっており、あとはすべて外からgitを介して設定できる。



March 30, 2012

Arduino と W5200 ( WIZ820IO )を接続する2

ちょっとまえにこんなことをやっていた。
それの続き。

まずはおさらい。

Wiz820ioのピンアサインはこれ。














Wiz820ioとArduinoの接続は以下の表の7本。
Arduino Wiz820IO
3.3V VIM3.3
GND GND
RESET nRESET
D10 nSS
D11 MOSI
D12 MISO
D13 SCLK













入手はココ
ソフトのArduino1.0用ライブラリのDLはココ

で、前回は接続してライブラリが動く、ところまで確認した。
課題として残っていたのは、
「Wiz820ioに負荷をかけると一時間程度で死んでしまう」という点だった。
今回はこれを解決する。

解決の糸口としては、
「ライブラリに問題があるんじゃね? by マイコン風雲録さん」
が有力な気がするので、ここから手を付ける。

まず、素のW5200ライブラリだとどんな感じなのか、もう少し詳しくチェックする。
ExamplesのWebServerをロードして、Linuxから
$ watch --interval=1 wget 192.168.1.177
で一秒に一回データを取りに行き続けることで負荷をかける。

結果:
12時間ぶっ続けで負荷をかけても異常なし。
あれ????
1月にやった時は確かに不安定だったんだけどな????
前回、今回の差分とすれば、母艦がWindowsかLinuxか、という点と気温ぐらいしか…
(Arduinoは1.0のままだし、WizNetもライブラリの更新とかしてない、タイムスタンプ的には。)
Linuxに切り替えるのも面倒だし、気温依存とか考えたくもないな…

よし。あれは気のせいだった!「勝ったッ!第3部完!」
いや、えー…気のせいじゃないと思うんだけどなぁ…

諦めきれずArduinoへの電源供給をACアダプタに切り替えて、再度実験したところ、
3時間弱、10630回アクセスした所でスタックした!!!!
おー。ACアダプタがキーなのかはわからんが、ともかく不具合は再現するな。
よーしよしよし。イイコだ。不安定だな!!!!

さすがにn=2で何かを語るのもあれなので、
そのまま、もう一回トライ。
おおおお、24時間たっても異常なし。

一番面倒なタイプの障害っぽい雰囲気。なんだこれ。。。
商用電源が揺らいだ、とかそういうのかなぁ?一応実験施設なので電源は安定してると思うんだが。

これ、シリアルコンソールつないでエラーだしておくと詳細分かる可能性があるな。
あと、W5200のresetをAVRのデジタルIOにつないでおいて、
スタックした場合にW5200のみリセットして初期化、とかそういうので切り分けてみようかな。

(追記:4/2)
とりあえず、34時間でスタックしたので、やっぱW5200だめっぽい。
特定個体の問題である可能性もあるので、もう一個買ってみよう。
というか、W5200ってリビジョン変わったりしてるんだろうか?

(追記:4/9)
とりあえず、W5100とならべて、10日ぐらいテストしてる。
http://mogtechblog.blogspot.jp/2012/04/arduino-w5200-wiz820io-3.html
もりもりW5200が固まるので難儀している。
ハズレ個体かもしれないので、他に買ってみるかなー。
なにか情報ないもんかなぁ。。。

March 24, 2012

2TB以上のHDDに CentOS6.2 をインストールする

2TB以上のディスクにCentOSなりRHELをインストールするにはひと手間いるので、メモ。

普通にDVDをいれて起動、GUI画面まではいつもどおり。
GUI画面でCtrl+Alt+F2でCUIに移行
# parted /dev/sda #sdaはインストールしたいディスク
(parted) mklabel gpt
(parted) quit
# 
としてpartedでgptに設定をし直し、partedを抜ける。
その後Ctrl+Alt+F6でGUIに復帰

あとはディスクの設定時に「すべての領域を使用する」を選ばず、カスタム設定を選ぶこと。

以上

参考:
http://godwood.allnet.ne.jp/vioret/d/?date=20110815