読者です 読者をやめる 読者になる 読者になる

Bonkura - Kenny

SIerで働く文系SEの記録

USB温度センサーで部屋の温度を可視化してみた。(RaspberryPi+Fluentd+Elasticsearch+Kibana4)

「Fluentd使って何か作りてぇなぁ…」と思っていた所、amazonでお安く売っているUSB温度センサーがあったので、部屋の温度を可視化してみました。色々と躓いて一週間くらいかかってしまったのですが、なんとか構築する事が出来たので、紹介します。(やりつくされたテーマな気もしますが、ご愛嬌。)

構築に使った物たち

サーバ

  • Raspberry Pi2 Model B
  • (上記とは別に)CentOS6.7の入ったサーバ(ESXi上で動いている仮想マシン

ミドルウェア

  • Fluentd
  • elasticsearch-2.3.3
  • kibana-4.5.1-linux-x64

温度センサー

  • USB温度計! USB thermometer-528018

USB温度計! USB thermometer-528018

USB温度計! USB thermometer-528018

概要

システム構成図は以下の通りです。ラズパイ側でログを収集して、CentOS側でログ保存と可視化用のミドルウェアであるKibanaを動かしています。

f:id:knygt15437:20160627171032p:plain

実際の画面

こんな感じになります。クーラーを入れたタイミングで温度が急激に下がってますね。あと、常に2時間タイマーでセットしているからなのか、2時間くらいたったら徐々に温度があがっているようです。

f:id:knygt15437:20160627171035j:plain

次からは手順メモを忘れない!

色々と苦戦しすぎて手順のメモを忘れてしまっていたので、詳しい構築手順までは残ってないのがホント駄目だなぁ、、と自分でも思います。なので、今回はとりあえずこんなん作ったよーというご紹介に留めておきます。。

【たのしいRuby_21】Procクラス

たのしいRubyの第21章を学んだ。

たのしいRuby 第4版

たのしいRuby 第4版

ブロックとして記述された手続きを持ち運ぶためのクラス。

Procクラスとは

  • Proc.newメソッドにブロックを与えると、そのブロックを保持するProcオブジェクトが作られる。
  • ブロックはProc#callメソッドによって実行される。
  • Proc#callメソッドを呼び出した時の引数がブロック変数となる。
  • ブロックで最後に評価された値がProc#callの戻り値となる。
  • ブロック変数を「|*配列|」の形式にすると、不定の引数を配列で受け取る事が出来る。
#うるう年判別処理

leap = Proc.new do |year|
  year % 4 == 0 && year % 100 != 0 || year % 400 == 0
end

p leap.call(2000)
p leap.call(2013)

#要素を二倍にして返す処理

double = Proc.new do |*args|
  args.map{|i| i * 2 }
end

p double.call(1,2,3)

lamda

Proc.newの別の書き方。違いとしては、下記の2つがある。

  • 引数のチェックが厳密になる
  • ブロックから値を返すときにreturnを使える

【たのしいRuby_20】Timeクラス、Dateクラス

たのしいRubyの第20章を学んだ。

たのしいRuby 第4版

たのしいRuby 第4版

TimeクラスとDateクラス

  • Timeクラス: 「年月日日時分秒」タイムゾーン の情報を持つ
  • Dateクラス: 「年月日」 だけを扱う。

Timeクラス

# 現在時刻の取得

p Time.new
sleep 1
p Time.now

#=> 2016-05-29 16:57:05 +0900
#=> 2016-05-29 16:57:06 +0900

t = Time.now

p t.year #=> 2016
p t.month #=> 5
p t.day #=> 29

#指定した時刻を表すTimeオブジェクトを得る

t2 = Time.mktime(2016,5,30,1,1,1)
p t2 #=>2016-05-30 01:01:01 +0900

# 時刻計算(秒数基準)
t3 = t2 + 60 * 60 * 24
p t3

# 時刻フォーマット修正(文字列型への変換)
t4 = Time.now
p t4.to_s
p t4.strftime("%Y-%m-%d")

Dataクラス

時刻を持たない日付を操作するためのクラス。

require "date"

d = Date.today

p d.year
p d.month
p d.day

# 月末の日付を-1で指定出来る。閏年にも対応している!
d = Date.new(2016,2,-1)
puts d  #=> 2016-02-29

【たのしいRuby_19】Encodingクラス

たのしいRubyの第19章を学んだ。

たのしいRuby 第4版

たのしいRuby 第4版

プログラムがどのように文字コードを扱うか、言語によって異なる。Rubyは、、、

という2つの情報を持っている。文字コードに関する情報を エンコーディング と呼ぶ。

文字列オブジェクトを作るには、大きく分けて二通りの方法が存在する。

  • スクリプトリテラルとして記述する方法
  • プログラムの外部(ファイル・コンソール・ネットワークなど)から情報を受け取る方法

Rubyエンコーディングで使う情報

リテラルに記述した文字列オブジェクトのエンコーディングを決定する情報。 スクリプトそのものの文字コードと一致 する。

外部から受け取ったデータをプログラム内でどのように扱うか?という情報

プログラムを外部に出力する際のエンコーディングに関する情報。

スクリプトエンコーディング

スクリプト自体のエンコーディングのこと。スクリプトエンコーディングEUC-JPなら、文字列のエンコーディングEUC-JPになる。スクリプトエンコーディングを指定するために使われるのが、 マジックコメント である。

# encodign: utf-8

hoge

Encodingクラス

文字列のエンコーディングを調べるには、String#encodingメソッドを使う。

p "こんにちは".encoding #=> #<Encoding:UTF-8>

str = "こんにちは".encode("EUC-JP")
p str.encoding #=> <Encoding :EUC-JP>
str2 = "こんにちは"

# 文字コードが違うため、false
p str == str2

その他メソッド

# 2つの文字列の互換性をチェックする。
p Encoding.compatible?("AB".encode("EUC-JP"),"".encode("UTF-8")) #=> #<Encoding:UTF-8>
p Encoding.compatible?("".encode("EUC-JP"),"".encode("UTF-8")) #=> nil

# デフォルトの外部・内部エンコーディングを返す
p Encoding.default_external
p Encoding.default_internal

# Rubyがサポートしているエンコーディングの一覧を返す
p Encoding.list

IOクラスとエンコーディング

外部エンコーディング・内部エンコーディングを明示的に設定しない場合は、デフォルト値となる。デフォルト値の確認はdefault_external,default_internalメソッドで確認できる。

IOオブジェクトのエンコーディング(ファイルをどのように扱うか?)という設定。

File.open(file,"mode:encoding:encoding")
# 第一引数に外部エンコーディング、第二引数に内部エンコーディング
# 例 File.open("hoge.txt", "r:Shift_JIS:UTF-8")

出力時エンコーディングの動き

入力時エンコーディングの動き

【たのしいRuby_18】Fileクラス

たのしいRubyの第18章を学んだ。

たのしいRuby 第4版

たのしいRuby 第4版

ファイルの操作

  • mvコマンドと同じ
File.rename("hosts","hosts2")
  • ファイルのコピー:fileutilsライブラリを読み込む。
require "fileutils"
FileUtils.cp("wcc.rb","wcc3.rb")
FileUtils.mv("wc2.rb","wc4.rb")
  • ファイルの削除
File.delete("file名")

Dirクラス

pwdとディレクトリ移動

p Dir.pwd
Dir.chdir("dir")

ディレクトリの中身を表示

Dir.open(".") do |dir|
  dir.each do |name|
    p name
  end
end

ディレクトリ作成・削除

Dir.mkdir(path)
Dir.rmdir(path)

ファイル操作メソッド

  • File.stat(path)

ファイルやディレクトリの属性を取得できる。

  • File.chmod(mode,path)

パーミッションの変更

  • File.basename(path[,suffix])

パス名からファイル名を取り出す時に使う。

  • File.dirname(path)

パス名からディレクトリ名を取り出す時に使う

  • File.extname(path)

ファイル名から拡張子のみ取り出す。

  • File.split(path)

ディレクトリ名とパス名に分解し配列にして返す。

  • File.join(name1,name2) * 引数で与えられた文字列を連結

  • File.exists?(path)

pathが存在すればtrue