2020年東京オリンピックの会場予定地の OSM 書き込み状況をざっくり調べた

会場予定地の名称と住所は東京都オリンピック・パラリンピック準備局ウェブサイトから引用し、住所を東京大学空間情報科学研究センターが提供するCSVアドレスマッチングサービスによってジオコーディングした結果を Getofabrik の Map CompareGoogle Maps と並べて表示させて確認しました。
引用した情報とOSM状況は2016年9月9日の状況です。状況のコメントは偏見で判定しました。

会場工事が行われる、または見込まれるところは立て替え後でないと編集できないかもしれませんが、一部建物や土地利用を追加した方がいいっぽいところがありました。
ちょっと早い気もしますが、ぼちぼち書き込んでいくと開催時にはいい感じの地図になっているかもしれません。

名称 住所 OSM状況
新国立競技場 東京都新宿区霞ヶ丘町10番地2 会場工事で更新が必要
東京体育館 東京都渋谷区千駄ヶ谷一丁目17番1号 良好
国立代々木競技場 東京都渋谷区神南二丁目1番1号 良好
日本武道館 東京都千代田区北の丸公園2番3号 良好
皇居外苑 - 良好
東京国際フォーラム 東京都千代田区丸の内三丁目5番1号 良好
国技館 東京都墨田区横網一丁目3番28号 良好
有明アリーナ 東京都江東区有明一丁目(有明北地区) 会場工事で更新が必要?
有明体操競技 東京都江東区有明有明北地区) 会場工事で更新が必要?
有明BMXコース 東京都江東区有明有明北地区) 会場工事で更新が必要?
有明テニスの森 東京都江東区有明二丁目2番22号 良好
お台場海浜公園 東京都港区台場一丁目 良好
潮風公園 東京都品川区東八潮1番地 良好
大井ホッケー競技場 東京都品川区八潮四丁目1番19号 良好
海の森クロスカントリーコース 東京都江東区青海三丁目地先 良好
海の森水上競技場 東京都江東区青海三丁目地先 良好
カヌー・スラローム会場 東京都江戸川区臨海町六丁目1番 良好
アーチェリー会場(夢の島公園 東京都江東区夢の島二丁目地内 良好
オリンピックアクアティクスセンター 東京都江東区辰巳二丁目1番35号 良好
東京辰巳国際水泳場 東京都江東区辰巳二丁目8番10号 良好
馬事公苑 東京都世田谷区上用賀二丁目1番1号 良好
武蔵野の森総合スポーツ施設 東京都調布市飛田給一丁目1番41号 会場工事で更新が必要、建物不足
東京スタジアム 東京都調布市西町376番地3 建物不足
さいたまスーパーアリーナ 埼玉県さいたま市中央区新都心8番地 良好
陸上自衛隊朝霞訓練場 東京都練馬区大泉学園町九丁目4番 建物不足
幕張メッセ 千葉県千葉市美浜区中瀬2丁目1番地 良好
埼玉スタジアム2002 埼玉県さいたま市緑区中野田500 Landuseほしいかも
横浜国際総合競技場 横浜市港北区小机町3300 良好
東京ビッグサイト 東京都江東区有明三丁目11番1号 良好

きっと忘れるので 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 を実行できません。

使えるようにはなったけど、続くかどうかは知らない。
つか機械学習Python もよくわからんのだけれどね。

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 だけで進めます。

debiangoogle-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

fusegoogle-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 か firefoxgoogle-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.14debian のファイルサーバーで使われてる IP アドレスですね。
ここまでくれば Ubuntu仮想マシンはいらなくなるのでシャットダウンして消すなりなんなりできます。

debianGoogle ドライブをマウントする

まずマウントポイントのディレクトリを作っておきます

$ 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 を入れる。

f:id:k-side:20160904094000p:plain

次に管理ユーザーにスクリプトのメディアを追加する。
「管理」→「ユーザー」→任意の管理権限のあるユーザー(Admin とか)→「メディア」→「追加」とたどってこんな感じ。 スクリプトパラメータをお忘れ無く。

f:id:k-side:20160904093959p:plain

最後に「設定」→「アクション」→「Report problems to Zabbix administrators」が有効になっているかどうか確認しておく。
これ忘れてすっごい悩んだ。

f:id:k-side:20160904094001p:plain

適当にアラートの発生しそうなことをやってアラートが飛べばOK。

うまくいかなかったら /etc/zabbix/zabbix_server.conf の中の DebugLevel3 くらいにしておくと不具合の状態がログに流れてくる。

IDCF クラウド で500円/月未満の仮想マシンを手に入れる

国内の VPS は概ね 500円/月 くらいの料金が安めの基準になっていて、IDCF クラウドでもスターター向け最小構成が 500円/月 になっています。
料金のシミュレーションでもこの料金が最低のように見えますが、ログインして仮想マシンを作成する際にカスタム構成にするとさらに安い料金で仮想マシンを手に入れられます。

仮想マシンの作成では Light.S1 を選択します、これで200円/月。

f:id:k-side:20160830101017p:plain

イメージの選択ではおすすめ Template ではなく、 ISO にある debian の ISO を選択します。

f:id:k-side:20160830101018p:plain

するとボリュームサイズを自分でセットできるようになるので標準の15GBよりも小さい数字を入れます。
例えば 5GB なら ディスクだけで 100円/月 で利用できます。

f:id:k-side:20160830101019p:plain

イメージの選択でおすすめ Template から選ぶとこのように強制的に15GB割り当てられるのでディスクで 300円/月 が必要です。

f:id:k-side:20160830101020p:plain

Light.S1 + 5GB ボリュームなら 300円/月 で仮想マシンを持つことができます。
当然ストレージが小さいので運用には工夫が必要になりますが、外に置く VPN のサーバーだけとか、フロントエンドだけ置いてデータはローカルや別の(サービス|仮想マシン)に置くなどですかね。

現在は Light.S1 + 5GB ボリュームを使って OpenStreetMap のタスクマネージメントツールを動かしています。
このツールは PythonPostgreSQL で動くもので、ボリュームの空き容量が 2.1GB ほどになっています。 価格帯的に512MBが多いところですが、 Light.S1 では1GBが割り当てられるので動作は割と軽快です。

事情に合致すれば安く仮想マシンを手に入れることができます。

Windows で Git のエディタに Visual Studio Code を設定した時の話

WindowsPowerShell 上で 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 サーバーのフロントエンドにアクセスして、設定ホスト%対象のホスト%アイテムとたどってアイテムの作成をクリック。

f:id:k-side:20160713114239p:plain

アイテムの作成画面では次の様にセット。

項目
名前 室温(適当でOK)
タイプ Zabbix トラッパー
キー room_temp(わかれば適当でOK)
データ型 数値(浮動小数)
単位 ℃(わかれば適当でOK)

f:id:k-side:20160713114240p:plain

最後に追加をクリックしてアイテムの作成は完了。

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 のフロントエンドにアクセスして値を持ってるか確認します。
監視データ最新データで名前にアイテムの名前を入れてフィルタリングをクリックすると出てくると思います。

f:id:k-side:20160713114241p:plain

チェック時刻がどう見ても業務時間中です、ありがとうございました。

右側にあるグラフをクリックするとグラフを見ることができますが、値が1つだけだと直線で表示されるだけでした。

後はコマンドをシェルスクリプトなりにして cron に登録すれば Zabbix サーバーに向かって定期的に値を飛ばし続けてくれるはずです。