脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

raspberryPiにgvmでGoをインストールする方法

gvmとはgo version managerで、文字通りgo のvesionマネジメントシステム
GitHub - moovweb/gvm: Go Version Manager
rvmに影響を受けているらしく、似たようなコマンドで使用することが出来る
f:id:portaltan:20170208125440p:plain

install library

$ sudo apt-get install curl git mercurial make binutils bison gcc build-essential

install gvm

### install
$ bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
	Cloning from https://github.com/moovweb/gvm.git to /home/pi/.gvm
	No existing Go versions detected
	Installed GVM v1.0.22

	Please restart your terminal session or to get started right away run
	 `source /home/pi/.gvm/scripts/gvm`
$ source /home/pi/.gvm/scripts/gvm

### confirm
$ gvm help
	Usage: gvm [command]

	Description:
	  GVM is the Go Version Manager

	Commands:
	  version    - print the gvm version number
	  get        - gets the latest code (for debugging)
	  use        - select a go version to use (--default to set permanently)
	  diff       - view changes to Go root
	  help       - display this usage text
	  implode    - completely remove gvm
	  install    - install go versions
	  uninstall  - uninstall go versions
	  cross      - install go cross compilers
	  linkthis   - link this directory into GOPATH
	  list       - list installed go versions
	  listall    - list available versions
	  alias      - manage go version aliases
	  pkgset     - manage go packages sets
	  pkgenv     - edit the environment for a package set

$ gvm version
	Go Version Manager v1.0.22 installed at /home/pi/.gvm

install Go

gvmは全ての基点に1.4を利用しているようで、他のversionを利用するつもりでもまずは1.4をinstallしなければならない

install go1.4

$ gvm install go1.4
	Installing go1.4...
	 * Compiling...
	go1.4 successfully installed!

$ gvm list
	gvm gos (installed)
	   go1.4

$ gvm use go1.4
	Now using version go1.4
$ gvm list
	gvm gos (installed)
	=> go1.4

install go1.5

他のversionのinstallの確認として、stableの最新版である1.7.5をinstallしてみる

### install
$ echo $GOROOT
	/home/pi/.gvm/gos/go1.4

$ export GOROOT_BOOTSTRAP=$GOROOT

$ gvm install go1.7.5
	Installing go1.7.5...
	 * Compiling...
	go1.7.5 successfully installed!

$ gvm use go1.7.5 --default
	Now using version go1.7.5

$ gvm list
	gvm gos (installed)
	   go1.4
	=> go1.7.5

### confirm
$ go version
	go version go1.7.5 linux/arm

特定のファイルでだけvimでsyntax onが効かない場合

他のファイルはsyntax onが効くのに特定のファイルでsyntax onが反応しなくてカラー表示できない場合

そのファイルのvimの設定ファイルを削除してリセットしてやるといい

cd ~/.vim/view
rm -i ~=+path+to+file=

これで再度vimでファイルを開くと設定ファイルが1から作成しなおされて、変な設定もリセットされる

raspberryPi にnoipでDDNSの設定をする方法

raspberryPi3 jessieにnoipでDDNSの設定をする方法です。

no-ipの登録

DDNSサービスを提供している会社は色々ありますが、今回は調べていて割りと名前をよく目にするno-ipを利用することにしました
Free Dynamic DNS - Managed DNS - Managed Email - Domain Registration - No-IP

ユーザ登録

sign upを選ぶと以下のような画面が出てくるので、情報を入力します。
hostnameは後から変更できるので適当でも構いません。
f:id:portaltan:20170207085720p:plain

入力したメールアドレスに確認メールが来るので、そこからログインします。
ログインすると以下のようなGUIの管理画面が表示されます。
f:id:portaltan:20170207090352p:plain

hostname登録

画面の中段あたりのQuick Addというパネルから任意のhostnameを入力し、Add Hostnameボタンをクリックすることでhostnameの登録ができます
f:id:portaltan:20170207090735p:plain

これで登録は完了です。次は実際にサーバで利用するための設定を行います。

noip DUCの設定

DUCとはDynamic Domain Update Clientの略らしいです(それだとDDUCになりそうだけど)
以下の設定はraspberryPi側で行います。

### clientのダウンロード
$ wget http://www.noip.com/client/linux/noip-duc-linux.tar.gz
$ sudo tar zxvf noip-duc-linux.tar.gz
$ cd noip-2.1.9-1/

### clientのインストール
$ sudo make
$ sudo make install
  if [ ! -d /usr/local/bin ]; then mkdir -p /usr/local/bin;fi
  if [ ! -d /usr/local/etc ]; then mkdir -p /usr/local/etc;fi
  cp noip2 /usr/local/bin/noip2
  /usr/local/bin/noip2 -C -c /tmp/no-ip2.conf

  Auto configuration for Linux client of no-ip.com.

  Please enter the login/email string for no-ip.com  # => no-ipに登録したユーザ名を入力します
  Please enter the password for user '*****'         # => 同じく登録したパスワードを入力します

  Only one host [foobar.ddns.net] is registered to this account.
  It will be used.
  Please enter an update interval:[30]  # => 何分毎に設定を確認するかを入力します
  Do you wish to run something at successful update?[N] (y/N)  n

  New configuration file '/tmp/no-ip2.conf' created.

  mv /tmp/no-ip2.conf /usr/local/etc/no-ip2.conf

### 自動起動の設定
$ sudo cp debian.noip2.sh /etc/init.d/noip2
$ sudo vi /etc/rc.lcal
  # 以下の1行を追加します
  /etc/init.d/noip2 start

### 設定
$ sudo /etc/init.d/noip2 stop
$ sudo /usr/local/bin/noip2 -C # 再度設定
$ sudo /etc/init.d/noip2 start # 起動

### 確認
$ sudo /usr/local/bin/noip2 -S

これで30分毎および起動時にIPを確認して、IPが変わっている場合には自動でno-ipにリクエストを投げてDNS情報を変更してくれるようになりました

raspberryPiにinfluxdbとgrafanaをインストールする

ラズベリーパイにinfluxdbをインストールして、データをgrafanaでvisualization化する方法です。

Install influxdb

1. install influxdb

$ wget http://ftp.us.debian.org/debian/pool/main/i/influxdb/influxdb_1.0.2+dfsg1-1_armhf.deb
$ sudo dpkg -i influxdb_1.0.2+dfsg1-1_armhf.deb
  Selecting previously unselected package influxdb.
  (Reading database ... 133808 files and directories currently installed.)
  Preparing to unpack influxdb_1.0.2+dfsg1-1_armhf.deb ...
  Unpacking influxdb (1.0.2+dfsg1-1) ...
  Setting up influxdb (1.0.2+dfsg1-1) ...
  Adding system user 'influxdb' (UID 113) ...
  Adding new user 'influxdb' (UID 113) with group 'nogroup' ...
  Not creating home directory '/var/lib/influxdb'.
  Adding group 'influxdb' (GID 120) ...
  Done.
  Adding user 'influxdb' to group 'influxdb' ...
  Adding user influxdb to group influxdb
  Done.
  Processing triggers for systemd (215-17+deb8u4) ...
  Processing triggers for man-db (2.7.0.2-5) ...

$ ps aux | grep influx
  influxdb  1442  0.5  3.1 897392 27904 ?        Ssl  10:33   1:18 /usr/bin/influxd -config /etc/influxdb/influxdb.conf
  pi        6804  0.0  0.2   4276  1908 pts/1    S+   14:17   0:00 grep influx
$ ss -lntp | grep 808
  LISTEN     0      128                      :::8083                    :::*
  LISTEN     0      128                      :::8086                    :::*
  LISTEN     0      128                      :::8088                    :::*

(※v1.2のinstall方法も書きました)
portaltan.hatenablog.com

2. confirm GUI

GUIのportは8083なので、「http://{raspberryPiのIP}:8083」にアクセスして、以下のようなGUI画面が出てくることを確認
f:id:portaltan:20170203142048p:plain

「SHOW DATABASES」と打ち込み、きちんとクエリも投げられることを確認
f:id:portaltan:20170203142203p:plain

3. confirm API

pingチェック
$ curl -sl -I  http://localhost:8086/ping
  HTTP/1.1 204 No Content
  Content-Type: application/json
  Request-Id: 9460e8cc-e9d2-11e6-8047-000000000000
  X-Influxdb-Version: 1.0.2
  Date: Fri, 03 Feb 2017 05:35:32 GMT
  • 204ならOK
クエリチェック

APIのportは8086なので、以下のようにAPI経由でも同じようにdatabaseが確認できるかチェック

$ curl http://localhost:8086/query --data-urlencode "q=SHOW DATABASES"
{"results":[{"series":[{"name":"databases","columns":["name"],"values":[["_internal"]]]}]}]}

influxdb APIの使い方

DATABASEの作成

$ curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE ${作成したいdatabase名}"
  • endpointは/query

データ投入

method
$ curl -i -XPOST "http://localhost:8086/write?db=${データ投入したいdatabase名}" --data-binary '${measurement名} ${Field名(column名)}=${値}'
  • endpointは/write
確認
$ curl -i -XPOST "http://localhost:8086/write?db=mydb" --data-binary 'test_measurement value=100'
$ curl -i -XPOST "http://localhost:8086/write?db=mydb" --data-binary 'test_measurement value=200'
$ curl -i -XPOST "http://localhost:8086/write?db=mydb" --data-binary 'test_measurement value2=200'

$ curl -G 'http://localhost:8086/query?db=mydb&pretty=true' --data-urlencode 'q=SELECT * FROM test_measurement'
{
    "results": [
        {
            "series": [
                {
                    "name": "test_measurement",
                    "columns": [
                        "time",
                        "value",
                        "value2"
                    ],
                    "values": [
                        [
                            "2017-02-03T05:45:22.049368887Z",
                            100,
                            null
                        ],
                        [
                            "2017-02-03T05:45:31.98145523Z",
                            200,
                            null
                        ],
                        [
                            "2017-02-03T05:49:57.29042142Z",
                            null,
                            200
                        ]
                    ]
                }
            ]
        }
    ]
}

ちなみに自分の中ではinfluxdbの各項目はこんなイメージです

influxdb mysql
database database
measurement table
field column

install grafana

1. install grafana

### install grafana-data
$ wget http://ftp.us.debian.org/debian/pool/main/g/grafana/grafana-data_2.6.0+dfsg-3_all.deb
$ sudo dpkg -i grafana-data_2.6.0+dfsg-3_all.deb
$ sudo apt-get install -f

### install grafana
$ wget http://ftp.us.debian.org/debian/pool/main/g/grafana/grafana_2.6.0+dfsg-3_armhf.deb
$ sudo dpkg -i grafana_2.6.0+dfsg-3_armhf.deb
$ sudo apt-get install -f

$ ps aux | grep grafana
  grafana   5525  0.0  1.5 884972 13804 ?        Ssl  10:54   0:07 /usr/sbin/grafana --config=/etc/grafana/grafana.ini cfg:default.paths.logs=/var/log/grafana cfg:default.paths.data=/var/lib/grafana
  pi        7006  0.0  0.2   4276  1908 pts/1    S+   15:43   0:00 grep grafana

$ ss -lntp | grep 3000
LISTEN     0      128                      :::3000                    :::*

2. GUI確認

portは3000なので、「http://{raspberryPiのIP}:3000」にアクセスして、以下のようなGUI画面が出てくることを確認
f:id:portaltan:20170203155047p:plain

  • 初期アカウントはadmin/admin

ログインすると以下のような画面が表示される
f:id:portaltan:20170203155135p:plain

3. Dashboard作成

Data Sourceの設定

f:id:portaltan:20170203155501p:plain

  • Name: 好きな名前
  • Type: influxDB
  • Url: influxDBのAPI
  • Database: アクセスするdababase名
  • user/pasword: root/root

Dashboardの設定

Dashboard > New > Add Panel > Graphと選んでいくと、以下のようなグラフが表示される
f:id:portaltan:20170203160001p:plain

  • ちなみにこの段階で表示されているのはダミーデータ

data_sourceや取得したmeasurements情報を入力していくと以下のようにinfluxdb上のデータでグラフが作成されるf:id:portaltan:20170203160256p:plain

  • influxdbの項目でセットした100と200が表示されているのがわかる
  • grafanaの詳しい設定は以下参照

portaltan.hatenablog.com

気象庁の風向・風速の計測(計算)方法

瞬間風向・瞬間風速・最大瞬間風速

  • 瞬間風向:0.25秒毎の瞬間の風の向き
  • 瞬間風速:風速計の測定値(0.25秒間隔)を3秒間平均した値(測定値12個の平均値)
  • 最大瞬間風速:(任意の期間中の)瞬間風速の最大値

平均風向・平均風速・最大風速

  • 平均風向:10分間のデータの平均風向
    • ただし航空機の離着陸のための観測においては2分間で平均を出す
  • 平均風速:10分間のデータの平均風速
    • ただし航空機の離着陸のための観測においては2分間で平均を出す
  • 最大風速:(任意の期間中)平均風速の最大値

raspberryPi3(jessie)にopenCV3.1.0をインストールする

わりと手こずりましたが、ラズベリーパイにopencv3.1.0をインストールする方法です
以下のサイトを参考にさせて頂きました。

Procedure

ライブラリのインストール

$ sudo apt-get install build-essential cmake cmake-qt-gui
$ sudo apt-get install libgtk2.0-dev libjpeg-dev libtiff5-dev libjasper-dev libopenexr-dev python-dev python-numpy python-tk libeigen3-dev yasm libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev libx264-dev libqt4-dev libqt4-opengl-dev sphinx-common libv4l-dev libdc1394-22-dev libavcodec-dev libavformat-dev libswscale-dev default-jdk ant libvtk5-qt4-dev

packageのダウンロード

$ cd ~
$ mkdir src
$ cd src

# OpenCVのダウンロード
$ wget https://github.com/Itseez/opencv/archive/3.1.0.zip
$ unzip 3.1.0.zip

# OpenCV contribもダウンロード
$ wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.1.0.zip
$ unzip opencv_contrib.zip

build

$ cd opencv-3.1.0
$ mkdir build
$ cd build

$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_EXTRA_MODULES_PATH=/home/pi/src/opencv_contrib-3.1.0/modules \
-D BUILD_EXAMPLES=ON ..

$ make -j4

install

$ sudo make install
$ sudo ldconfig

確認

$ python
Python 2.7.9 (default, Sep 17 2016, 20:26:04)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> print cv2.__version__
3.1.0

無事3.1.0がインストールされていることを確認して完了

openCVでraspberryPiのUSBカメラのキャプチャをとって、サイズを変更する

import cv2

# cameraの設定
c = cv2.VideoCapture(0)

# キャプチャ
boolean, img = c.read()
h, w = img.shape[:2]
print h # 1280
print w # 720

# サイズ変更
half = cv2.resize(img, (320, 240))
hh, hw = half.shape[:2]
print hh  # 320
print hw  # 240

cv2.imwrite('half.jpg', half)
  • VideoCaptureでdeviceを指定して、readでキャプチャをとる
  • resize(source, (heightのsize, widthのsize))でサイズ変更
  • imwriteでimageをファイル出力

うまく行かない場合はlsusbとかでちゃんとUSBカメラが認識されているか確認する