2016年5月19日木曜日

RUST でファイル入力処理

迷路のレイアウトをコードにベタ書きで埋め込むのは骨が折れるので、下のようなテキストで作成した迷路を読み込めるようにした。

だいぶ長くなってきたので、アルゴリズム以外を別ファイルに移した上で、ファイルから迷路を構築する処理を追加。
メインからはモジュールとして読み込んで利用する。
ファイル入力自体は比較的簡単だったが、エラー処理にだいぶ嵌められた。
エラー処理の仕様をきちんと理解しないままサンプルを見よう見まねでコピペしても全然コンパイルできなかった。
その分ちゃんと理解すれば柔軟なエラー処理ができるんだが、正直かなりとっかかりにくいと思う。

2016年5月14日土曜日

RUST 勉強中

環境構築

インストール

Ubuntu16.04 だと apt-get から入手できるようになった。

エディタ設定

Emacs 使いなので、melpa から lang-rust を導入

お勉強

何は無くとも RUST のドキュメントを熟読。
どうやらメモリ参照の透過性の高いプログラミング言語らしい。
なので、マルチスレッドとかに向いているそうだ。
一応オブジェクトっぽいこともできそうだが、オブジェクト指向言語ではないようだ。

実践

試しに単純な右手の法則で迷路を解くプログラムを書いてみた。

どうしても関数の引数が borrow ばっかりになってしまうが、これでいいんだろうか。

オブジェクト指向のようにポリモーフィズムばりばりで抽象化すると言うよりも、テンプレートで抽象化するが、テンプレートだとなんでもありになってしまうので、Trait で期待するテンプレートを指定するという感じか。
なんとなく、Cのマクロでこうできれば便利なんだけどなー、ってもどかしかったのができるようになっている感じで使っていて気持ちいい。

2016年1月18日月曜日

Kinect + Raspberry Pi 2 で監視カメラを作る(8)

運用の自動化

前回からだいぶ間が開いてしまったが、再起動のたびに手動でプログラムを起動するのはアホらしいので、Kinect プログラムを自動で起動するようにしていく。

自動起動の設定

まずは、camtest を適当にそれっぽいディレクトリにコピーしてついでにファイル名も kinect に変えておく。

> sudo install camtest /usr/local/sbin/kinect

で、/etc/init.d の下に起動/終了用スクリプトを作成
------------------------------
#! /bin/sh
### BEGIN INIT INFO
# Provides:             kinect
# Required-Start:       $remote_fs $syslog
# Required-Stop:        $remote_fs $syslog
# Default-Start:        2 3 4 5
# Default-Stop:        
# Short-Description:    Kinect remote webcam system
### END INIT INFO
set -e
test -x /usr/local/sbin/kinect || exit 0
. /lib/lsb/init-functions
case "$1" in
  start)
        log_daemon_msg "Starting Kinect webcam system" "kinect" || true
        if start-stop-daemon --background --start --quiet --oknodo --pidfile /var/run/kinect.pid --make-pidfile --exec /usr/local/sbin/kinect; then
            log_end_msg 0 || true
        else
            log_end_msg 1 || true
        fi
        ;;
  stop)
        log_daemon_msg "Stopping Kinect webcam system" "kinect" || true
        if start-stop-daemon --stop --quiet --oknodo --pidfile /var/run/kinect.pid; then
            log_end_msg 0 || true
        else
            log_end_msg 1 || true
        fi
        ;;
  *)
        log_action_msg "Usage: /etc/init.d/kinect {start|stop}" || true
        exit 1
esac
exit 0
------------------------------
sshd のスクリプトをベースに見よう見まねで改造しただけ。
本当は restart や status も作ったが、スペースの都合で割愛した。

出来上がったら、
> /etc/init.d/kinect start

などして動くのを確認したら
> sudo init q

でスクリプトのリストを更新(Ubuntu だと要らなかったのだが、よくわからん)

最後に
> update-rc.d kinect defaults

で、自動起動に登録。

ラズパイを一度再起動して自動で立ち上がるか確認しておく。

自動終了

Kinect の深度センサーは赤外線レーザーを使っている。
人体に影響があるとは思えないが、一晩中我が子に照射し続けるのも気が引けるため、深夜になったら自動で切れるようにする。

入手したラズパイはタイムゾーンが違っていたので、まずはそれを合わせておく。
> cp /etc/localtime /etc/localtime.org #念のためバックアップ
> cp  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

色々と試行錯誤したのだが、Kinect の深度センサーの照射を止めるには USB から切り離す方法でしか止められなかった。
ちと乱暴だが、以下のコマンドで大本のポートから止めることで深度センサーの照射を止めることが出来るようだった。
> echo -n '1-1' > /sys/bus/usb/drivers/usb/unbind
(止まっているかどうかは、肉眼で深度センサーからうっすら出ている赤い光をみて確認した)

しかしながら、これをやると無線 LAN まで止まってしまうので、子供を寝かせる時間になったら自動で再起動するようにしたい。

というわけで、cron を使って以下のように自動で Kinect センサーの停止とラズパイの再起動を行うように設定した。

> sudo crontab -u root -e
※エディタが起動するので以下の行を追加
0 23 * * * /etc/init.d/kinect stop
5 23 * * * echo -n '1-1' > /sys/bus/usb/drivers/usb/unbind
0 18 * * * /sbin/reboot

これで、毎晩 23 時に Kinect プログラムが終了。その 5 分後にセンサーを停止し、翌日の 18 時になったら自動で再起動するようになる。