きっと忘れるので TensorFlow の導入手順を書いておく
環境は Ubuntu 16.04 LTS です、サーバー版に LXDE 入れてあるごちゃ混ぜ環境ですが。
基本はディープラーニングの有名ライブラリ5種を最短距離で試す半日コース(TensorFlow, Chainer, Caffe, DeepDream, 画風変換)の通りです。
pip のインストール
$ sudo easy_install pip
Virtualenv のインストール
sudo pip install --upgrade virtualenv
Virtualenv 環境を作成する
$ virtualenv --system-site-packages ~/tensorflow
~/tensorflow
に環境が作成される。ディレクトリを手動で作成しなくても virtualenv が勝手に作ってくれます。
環境をアクティベートする
$ source ~/tensorflow/bin/activate
するとプロンプトの頭に (tensorflow)
がつくようになります。
最後に TensorFlow をインストール
(tensorflow) $ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.10.0rc0-cp27-none-linux_x86_64.whl (tensorflow) $ pip install --ignore-installed --upgrade $TF_BINARY_URL
TF_BINARY_URL
は実行する環境によって異なるので、公式のガイドを参考にして自分の環境にあった URL を使います。
違う環境のをインストールするとinvalid ELF header.
が出て TensorFlow を実行できません。
debian で google-drive-ocamlfuse を使って Google ドライブをマウントする
ファイルサーバーとして利用している debian マシンでローカルディレクトリに Google ドライブをマウントさせます。
Google ローカルガイドのレベル4になった特典として1年間 100GB の追加容量を利用できるようになったので、データをあらかたそっちにコピーしてみようと思いまして。
自分の Google ドライブは標準の 15GB に加えてセキュリティ診断のボーナスによる 2GB、ローカルガイドレベル4特典の 100GB の合計 117GB 利用できる状態です。
ローカルファイルサーバーで使っている実用量が 107GB くらいなので全部乗った上に 9GB くらいは空き容量が確保できそうです。
導入した debian のバージョンは 8.5 です。
後述しますが、google-drive-ocamlfuse では Google ドライブのアクセストークンを取得するために GUI ブラウザで認証する必要があるので、インストールしようとしているマシンに GUI 環境がない場合、他の環境で認証できるようにしなければなりません。
とりあえず途中まで debian だけで進めます。
debian で google-drive-ocamlfuse をインストールする
Launchpad.net の alessandro-strada にある Ubuntu 用のリポジトリをセットしてインストールします。
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys XXXXXXXX $ sudo sh -c "echo 'deb http://ppa.launchpad.net/alessandro-strada/ppa/ubuntu xenial main' > /etc/apt/sources.list.d/google-drive.list" $ sudo sh -c "echo 'deb-src http://ppa.launchpad.net/alessandro-strada/ppa/ubuntu xenial main' >> /etc/apt/sources.list.d/google-drive.list" $ sudo apt-get update
XXXXXXXX
の部分はリポジトリのページにある Signing key か Fingerprint あたりに文字列を入力してください。
エラーが出なければOK
fuse と google-drive-ocamlfuse をインストールします。
$ sudo apt-get install google-drive-ocamlfuse fuse -y
インストールが完了したら google-drive-ocamlfuse コマンドを実行します。
$ google-drive-ocamlfuse /bin/sh: 1: xdg-open: not found /bin/sh: 1: firefox: not found /bin/sh: 1: google-chrome: not found Cannot retrieve auth tokens. <snip>
はい、google-drive-ocamlfuse が xdg-open か firefox か google-crome を使ってアクセストークンを取得しようとしますが、このマシンには GUI 環境がセットされていないのでトークンを取得できないとエラーが出ます。
そんなわけで Ubuntu デスクトップの仮想マシンを作ってそっちで認証させます。
Ubuntu 16.04 Desktop で google-drive-ocamlfuse をインストールする
Ubuntu 16.04 Desktop でのインストールと認証は簡単で、google-drive-ocamlfuse の Wiki で方法が説明されています。
まずはリポジトリの追加からインストール。
GUI の仮想端末から操作した方がいいです。
$ sudo add-apt-repository ppa:alessandro-strada/ppa $ sudo apt-get update $ sudo apt-get install google-drive-ocamlfuse -y
インストールが完了したら google-drive-ocamlfuse
コマンドを実行します。
$ google-drive-ocamlfuse
ブラウザが起動して認証を促されるれます。
無事認証を完了すれば準備 OK です。
仮想端末に戻り、scp
を使って仮想マシンからファイルサーバーへトークンの記録されたファイルをコピーします。
$ scp ./.gdfuse/default/state 192.168.10.14:/home/zoar/.gdfuse/default/
192.168.10.14
が debian のファイルサーバーで使われてる IP アドレスですね。
ここまでくれば Ubuntu の仮想マシンはいらなくなるのでシャットダウンして消すなりなんなりできます。
debian で Google ドライブをマウントする
まずマウントポイントのディレクトリを作っておきます
$ mkdir ~/google-drive
google-drive-ocamlfuse
コマンドでマウントします。
コマンドの最初のオプションがマウントポイントです。
$ google-drive-ocamlfuse /home/zoar/google-drive
確認してみましょう
$ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 106G 3.0G 98G 3% / udev 10M 0 10M 0% /dev <snip> google-drive-ocamlfuse 117G 328K 117G 1% /home/zoar/google-drive
マウントできたっぽいです。
これでデータをコピーするなりできるようになると思います。
なお、アンマウントするときは fusermount
コマンドを使って
$ fusermount -u /home/zoar/google-drive
とかすればアンマウントされます。
当然ですがトークンの記録されているファイル ~/.gdfuse/default/state
が流出すると大変なことになるので気を付けて扱う必要があります。
Zabbix のアラートメールを ssmtp で送信する
忘れがちなのでメモっておく
環境は debian 8.5 で Zabbix は 3.0.4
まずは ssmtp をインストールする。
さようなら exim4
# sudo apt-get install ssmtp -y # sudo apt-get autoremove -y --purge
設定ファイルを適当にセットする
$ sudo vi /etc/ssmtp/ssmtp.conf root=postmaster mailhub=mail hostname=zabbix FromLineOverride=YES mailhub=%外部 SMTP サーバー% AuthUser=%ユーザー ID% AuthPass=%パスワード% AuthMethod=LOGIN UseTLS=YES UseSTARTTLS=YES
アラート発生時に Zabbix がスクリプトを探しに行くパスを確認しておく。
$ grep AlertScriptsPath /etc/zabbix/zabbix_server.conf ### Option: AlertScriptsPath # AlertScriptsPath=${datadir}/zabbix/alertscripts AlertScriptsPath=/usr/lib/zabbix/alertscripts
このマシンでは /usr/lib/zabbix/alertscripts
にスクリプトを置いておく必要がある。
Zabbix からアラートを受け取って ssmtp に投げるスクリプトは公式のをそのまんま使う。
$ vi /usr/lib/zabbix/alertscripts/Zabbix_Alert_Mail.sh #!/bin/bash to=$1 subject=$2 body=$3 cat <<EOF | mail -s "$subject" "$to" $body EOF
良く見たら /bin/sh
でなくて /bin/bash
なので注意。
スクリプトのファイル名(ここでは Zabbix_Alert_Mail.sh
)を覚えておく。
Zabbix フロントエンドに繋いでメディアタイプを作成する。
「管理」→「メディアタイプ」→「メディアタイプの作成」とたどってこんな感じ。
「送信先」にスクリプトファイルの名称 Zabbix_Alert_Mail.sh
を入れる。
次に管理ユーザーにスクリプトのメディアを追加する。
「管理」→「ユーザー」→任意の管理権限のあるユーザー(Admin とか)→「メディア」→「追加」とたどってこんな感じ。
スクリプトパラメータをお忘れ無く。
最後に「設定」→「アクション」→「Report problems to Zabbix administrators」が有効になっているかどうか確認しておく。
これ忘れてすっごい悩んだ。
適当にアラートの発生しそうなことをやってアラートが飛べばOK。
うまくいかなかったら /etc/zabbix/zabbix_server.conf
の中の DebugLevel
を 3
くらいにしておくと不具合の状態がログに流れてくる。
IDCF クラウド で500円/月未満の仮想マシンを手に入れる
国内の VPS は概ね 500円/月 くらいの料金が安めの基準になっていて、IDCF クラウドでもスターター向け最小構成が 500円/月 になっています。
料金のシミュレーションでもこの料金が最低のように見えますが、ログインして仮想マシンを作成する際にカスタム構成にするとさらに安い料金で仮想マシンを手に入れられます。
仮想マシンの作成では Light.S1
を選択します、これで200円/月。
イメージの選択ではおすすめ Template
ではなく、 ISO
にある debian の ISO を選択します。
するとボリュームサイズを自分でセットできるようになるので標準の15GBよりも小さい数字を入れます。
例えば 5GB なら ディスクだけで 100円/月 で利用できます。
イメージの選択でおすすめ Template
から選ぶとこのように強制的に15GB割り当てられるのでディスクで 300円/月 が必要です。
Light.S1 + 5GB ボリュームなら 300円/月 で仮想マシンを持つことができます。
当然ストレージが小さいので運用には工夫が必要になりますが、外に置く VPN のサーバーだけとか、フロントエンドだけ置いてデータはローカルや別の(サービス|仮想マシン)に置くなどですかね。
現在は Light.S1 + 5GB ボリュームを使って OpenStreetMap のタスクマネージメントツールを動かしています。
このツールは Python と PostgreSQL で動くもので、ボリュームの空き容量が 2.1GB ほどになっています。
価格帯的に512MBが多いところですが、 Light.S1 では1GBが割り当てられるので動作は割と軽快です。
事情に合致すれば安く仮想マシンを手に入れることができます。
Windows で Git のエディタに Visual Studio Code を設定した時の話
Windows の PowerShell 上で Git を操作していて、コメントを打とうとしたときにデフォルトのエディタだと日本語が打てずにずっと適当な英語でコメントを付けていました。
当然そんなことをしていたらなんのコメントだかサッパリわからなくなるので外部エディタを Visual Studio Code に設定したのですが。
PS> git config --global core.editor code
意気揚々とコミットすると
PS> git commit -a Aborting commit due to empty commit message.
oh...
git commit からコメント用ファイルが VS Code に渡された瞬間にシェル側の待機が解除されてしまうのでコミットメッセージがねぇよとキレられてしまいました。
VS Code の起動オプションを確認すると、ウィンドウが閉じられるまでシェルを待たせるっぽいオプションがありました。
PS> code -h <snip> -w, --wait Wait for the window to be closed before returning. <snip>
そんなわけで今度は -w
を付けて外部エディタをセットします。
PS> git config --global core.editor "code -w"
コミットしてみると…
PS> git commit -a
VS Code が起動してシェルが待機状態になりました。
コメントを編集・保存してウィンドウを閉じるとシェルに戻ってコミットが完了します。
で、日本語のコメントを打てるようになったのですが、結局うまいコメントを付けられずになんのコメントなのか微妙にわからない状態は解決されませんでした。
おしまい。
BME280 で取得した室温を zabbix_sender で Zabbix サーバーに送る
昨日、センサーモジュールから値を取得するスクリプトを一般ユーザーで実行できるようにしたので、取得した値を Zabbix サーバーに投げることにしました。
使うのは Zabbix サーバーにデータを投げる zabbix_sender です。
zabbix_sender のインストール
公式サイトから 3.0.3 のソースをダウンロードして展開します。
$ tar zxvf zabbix-3.0.3.tar.gz $ cd zabbix-3.0.3/
--enable-agent
を付けてコンフィグファイルを作ってから make します。
$ ./configure --enable-agent $ make $ sudo make install
Zabbix サーバーの設定
Zabbix サーバーのフロントエンドにアクセスして、設定
→ホスト
→%対象のホスト%
→アイテム
とたどってアイテムの作成
をクリック。
アイテムの作成画面では次の様にセット。
項目 | 値 |
---|---|
名前 | 室温(適当でOK) |
タイプ | Zabbix トラッパー |
キー | room_temp(わかれば適当でOK) |
データ型 | 数値(浮動小数) |
単位 | ℃(わかれば適当でOK) |
最後に追加
をクリックしてアイテムの作成は完了。
zabbix_sender コマンドを実行する
次のオプションを付けて zabbix_sender を実行します。
オプション | 渡す値 |
---|---|
-z | Zabbix サーバーのホストネームか IP アドレス |
-s | Zabbix に登録してあるホストネーム |
-vv | コマンド結果を詳細に標準出力する(vを2つ) |
-k | Zabbix サーバーでアイテムにセットしたキーの名称 |
-o | キーの値、今回であれば室温(bme280.py の結果から) |
今回は次のようなコマンドになりました。
$ /usr/local/bin/zabbix_sender -z 192.168.10.11 -s RaspberryPi -vv -k room_temp -o `/home/zoar/src/ss/bme280.py | cut -f1 -d','
結果は次のような感じ。
zabbix_sender [18751]: DEBUG: answer [{"response":"success","info":"processed: 1; failed: 0; total: 1; seconds spent: 0.000107"}] info from server: "processed: 1; failed: 0; total: 1; seconds spent: 0.000107" sent: 1; skipped: 0; total: 1
processed: 1
となっていれば成功。
失敗したら中身を確認して再チャレンジ。
Zabbix サーバーで確認
送信が成功したっぽかったら Zabbix のフロントエンドにアクセスして値を持ってるか確認します。
監視データ
→最新データ
で名前にアイテムの名前を入れてフィルタリングをクリックすると出てくると思います。
チェック時刻がどう見ても業務時間中です、ありがとうございました。
右側にあるグラフ
をクリックするとグラフを見ることができますが、値が1つだけだと直線で表示されるだけでした。
後はコマンドをシェルスクリプトなりにして cron に登録すれば Zabbix サーバーに向かって定期的に値を飛ばし続けてくれるはずです。
BME280 をからのデータを一般ユーザーで受け取る
debian jessie では GPIO 関係が一般ユーザーで利用できるようですが、現在は wheezy を利用しているので毎度 sudo しないといけません。
$ cat /etc/debian_version 7.11
bme280_sample.py をそのまま実行すると Permission denied
と言われてしまうのでアクセスしているデバイスを調べますした。
$ sudo i2cdetect 1 WARNING! This program can confuse your I2C bus, cause data loss and worse! I will probe file /dev/i2c-1. I will probe address range 0x03-0x77. Continue? [Y/n] y 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- 76 --
/devi2c-1
にアクセスしているのでこいつのパーミッションを調べます。
$ ls -la /dev/i2c-1 crw-rw---T 1 root i2c 89, 1 Jul 12 20:20 /dev/i2c-1
i2c
グループなら書き込みもできそうなので自分を i2c
グループに追加します。
$ sudo usermod -aG i2c zoar
再起動してみて sudo なしに実行できれば OK。
$ python bme280_sample.py temp : 28.85 ℃ pressure : 1004.26 hPa hum : 45.11 %
これで今後の実行には sudo なしでいけるのでちょっとは楽に使えそうです。