MackerelでRaspberryPiの監視

先日届いたRaspberryPiだけど、昨日WiFiのIPアドレス設定まで完了したので、今日からはSSHで接続ができるようになった。

色々やるのに、Slackへの通知だったり、Mackerelへのグラフ表示は必須かなと思い、RaspberryPiへMackerel-agentをインストールすることにした。
RaspberryPiはARMのCPUなので、そのままMackerelのヘルプに書いてある通りにインストールしても動かない。

実行ファイルを変えてやるだけで動くらしく、手順については下記サイトを参考にさせてもらった。

実際に実行するコマンドは下記でいける。

$ curl -LO https://mackerel.io/file/agent/deb/mackerel-agent_latest.all.deb
$ sudo dpkg -i mackerel-agent_latest.all.deb
$ curl -LO https://github.com/mackerelio/mackerel-agent/releases/download/v0.17.1/mackerel-agent_linux_arm.tar.gz
$ tar xfvz mackerel-agent_linux_arm.tar.gz
$ sudo mv mackerel-agent_linux_arm/mackerel-agent /usr/bin/
$ sudo vim /etc/mackerel-agent/mackere-agent.conf
apikey = "<YOUR_API_KEY>"
※apikeyはMackerelのオーガニゼーションから確認できる。

$ sudo /etc/init.d/mackerel-agent start

これで、標準監視はできるようなったと思う。

これだけだとつまらないので、CPUの温度とかカスタムメトリックで取れるようにしたいなと思い、雑に下記のようなスクリプトを作った。

#!/bin/bash

name="procs.count.measure_temp"
monitor_time=`date +%s`
count=`vcgencmd measure_temp | awk -F"=" '{print $2}' | sed "s/'C//g" `
echo -e "${name}\t${count}\t${monitor_time}"

Mackerel的にはタブ区切りで、上記情報が得られれば良いらしい。細かい仕様についてはMackerelのサイトで確認してほしい。

[plugin.metrics.measure_temp]
command = "/usr/local/bin/measure_temp.sh"

こんな感じで、Mackerelのconfに書いてあげて、agentをrestartしてあげればOK。

measure_temp

こんな感じでメトリクスが取れるようになった。
負荷かけてるわけではないので、54℃ちょいで推移していたけど、試しにddしたら、温度が1℃あがった笑

これからセンサーとか買って、色々試していきたい。

RaspberryPi3でIoT入門

小学生の頃こんなことがあった。

いつも読んでいたコミックボンボンの漫画の間に、ハガキがついていて、それに「ロボット工作」的なことが書いてあった。
その頃、授業でモーターの勉強をして、ミニ四駆的なものや風力で動く車みたいなものを工作したため、「ロボット工作」というハガキに大変魅力を感じたのだった。

親にお願いをしたのだけど、断固拒否をされ、二度と何かをやりたいとか言うまいと心に誓ったのを覚えている。
※ちなみにその後進研ゼミについては、進研ゼミの漫画のような頼み方をして、実際に中学の授業はそれで乗り切った。

それから20年近く経ち、すっかりそんなことは忘れていたのだけど、息子が生まれた頃にRaspberry Pi2でベビーベッド監視とかしていた。
それは奥さんの友人たちには割りと好評(?)だった気がする。
会社のディスプレイの端っこにずっと映していたりもした。

201501141300_picture

※息子は未熟児で生まれてこの頃1600gを切っていたと思う。小さく見えるのはまんま小さいからだ。

残念だったのは、1秒間に5枚くらいで描写させていたら、あっという間にカメラが焼き付いてしまったことだ。
また、新しいカメラにしたのだけど、カーネルアップデートしたら新しいカメラのドライバーと相性が悪くてなって映らなくなってしまった。

それからRaspberryPi2物理的に壊れてしまったのでお役御免となり、しばらくIoTとは程遠い生活をしていた。

今の会社に入社して4ヶ月程経つが、最近会社内でmake部なるものが発足して色々やっているらしいというのを風の噂で聞いた。

Raspberry Pi3が欲しかったし、電子工作したい思いが強くなったので思い切ってポチった。

raspberrypi3

青い透明のケース付きにしたらカッコよすぎてしびれた。
今はまさにOSのインストール中にこのブログを書いている。
今日はSSHまで出来るようにして寝ようと思う。
RaspberryPi3はWiFiモジュールがデフォルトで付いているので、SSIDと認証設定すれば管理が楽になるはずだ。
※インターネット側からつなげるようにするかは悩み中。ルーターでVPN設定していないので。。

ミニ電子工作キットみたいなのも一緒に買ったので、Lチカさせようと思う。
秋葉原に行くと、青色とかピンクのLEDとかが格安で売っているので、なんか楽しそうかなって思う。

夢は色々あるけど、とりあえず簡単そうな所からやっていく。

atcoder041のABCを解いた

いつもやってるatcoderの問題シリーズ。

今回は最新のabc041を解いてきた。

問題はこちら。

A問題の回答

s, i = STDIN.read.split(?\n)
i = i.to_i - 1
puts s[i]

改行コード区切りで縦に並んだ文字列をそれぞれ変数に入れる。
iという数字を整数の型にセットして、1引く。
文字列sのi番目を表示させる。

B問題の回答

A, B, C = STDIN.gets.split(" ").map(&:to_i)
X = A * B * C
Y = (10**9) + 7
puts X % Y

スペース区切りで変数にセットし、整数の型にセットする。
AとBとCを積算する。
Yは指定された数字10の9乗足す7を計算している。
そして最後にX割るYの余りを出している。

C問題の回答

N = STDIN.read.split("\n").map(&:to_s)
hash = {}
i = 1.to_i
N[1].split(/ /).each do | val |
  hash[i] = val.to_i
  i = i + 1
end
 
A = Hash[ hash.sort_by { | _, v | -v } ]
 
A.map { | key, value | puts key }

改行区切りで縦に変数に文字列としてセットする。
hashを宣言する。
iに1を整数としてセットする。
変数Nの2行目の値をスペース区切りで、hashにセットする。その際にkeyは整数で1から足していく。
hash.sort_byを使って、valueをsortする。※配列をソートすると、順番が変わるのでkeyを並べることはできない。結果は123のようになってしまう。
最後にhashのkeyだけを取り出している。

いつもこの手の文字列の変数セットに悩む。

S
A1,A2,A3... An

このような標準入力があって、Anを配列に入れたい場合はみなさんどうしているのだろうか。
上記方法以外になにかあるのだろうか。なんかこう1行目だけを無視して、2行目をいきなりhashに入れるみたいなことができないのだろうか。
私は分からずに、いつも一旦変数に入れて、string関数で抽出するようにしている。最近はこれが定着しつつあるけど正しいのかわからない。

来週のRubyの勉強会で聞いてみよう。
もし教えたくてムズムズした人がいたら是非教えてほしいです。