2016年1月11日月曜日

同一ネットワーク内で応答可能なマシンを調べる方法

コマンド

  • fping -g 192.168.1.0/24

結果

192.168.1.1 is alive
192.168.1.2 is alive
192.168.1.55 is alive
192.168.1.3 is unreachable
192.168.1.4 is unreachable
192.168.1.5 is unreachable
192.168.1.6 is unreachable
...

DHCP の環境に RaspberrPi を接続したときとかルータ配下に何台マシンがぶら下がっているとか調べたいときに使えます
IP からマシン名もわかると更にいんですが

2016年1月9日土曜日

Express + CoffeeScript で簡単な REST API アプリを作成してみた

概要

Express は Nodejs 用の Web フレームワークです
CoffeeScript は JavaScript を簡単に書けるようにしたラッパー言語でコンパイルすることで JavaScript のコードを生成できます
今回は CoffeeScript 内で Express を使うことで CoffeeScript だけで簡単な REST API アプリを作成してみました

環境

  • CentOS 6.7 64bit
  • Nodejs 0.10.36
  • npm 1.3.6
  • CoffeeScript 1.10.0
  • Express 4.13.3

各種インストール

Nodejs と npm は yum コマンドでインストールしました
EPEL を使えば yum でインストールすることができます

  • yum install nodejs npm –enablerepo=epel

CoffeeScript のインストール

  • npm install -g coffee-script

Express のインストール

  • cd work/
  • npm install express

サンプルアプリのソースコード

  • cd work/
  • vim app.coffee
app = require('express')()                                                                                               
http = require('http').Server(app)
port = 3000

app.get '/', (req, res) ->
  res.json {"status":"200"}

app.get '/error', (req, res) ->
  res.status 404
  res.json {"status":"404"}

http.listen port, ->
  console.log "listening on *:", port

「/」と「/error」の URI に GET メソッドでアクセスすることができる API アプリになります

実行してみる

  • cd work/
  • coffee app.coffee

で 3000 番ポートで LISTEN します
curl を使って確認してみます

  • curl http://localhost:3000/

{“status”:”200”}

  • curl http://localhost:3000/error

{“status”:”404”}

上記のようにレスポンスが返ってくれば OK です

最後に

簡単ですが、API アプリを作成してみました
Experss 自体は Nodejs 用の Web フレームワークなので、JavaScript だけで書くこともできます
わざわざ CoffeeScript を使う理由としては JavaScript よりシンプルに書けるというのが一番の理由だと思います

2016年1月8日金曜日

RaspberryPi で PWM の制御をしてみた

概要

PWM (パルス幅変調) はある一定周期の間隔で動的に変化するパルスを送信することができる仕組みです
モーターの制御や光の強弱の変化などに使われます
RaspberryPi でも PWM が使えるようなので LED を使って試してみました

環境

  • Raspberry Pi Type B Single Board Computer 512MB
  • Raspbian 8.0 (Jessie)
  • Kernel Version 4.1.7+
  • WiringPi
  • wiringpi2 (Python) 1.1.1

事前準備

今回は WiringPi を使って PWM 制御を行うので事前にインストールしておいてください

wiringpi2 のインストール

wiringpi2 は WiringPi 用の Python ライブラリです
pip を使えば簡単にインストールできます

  • sudo pip install wiringpi2

今回は Python スクリプトから PWM を制御します

配線

今回は LED の調光を PWM で変化させてみます
なので、L チカ配線をしてください
L チカ配線の方法はこちらを参考にしてください
wiring_bread_board.png

一点ポイントとしては RaspberryPi 上で PWM の信号を送信するためには GPIO 18 番を使う必要があります
なので、アノード ( + ) 側の GPIO は 18 番に接続するようにしてください

PWM 送信用スクリプトのデプロイ

  • cd work/
  • mkdir python_wiringpi_pwm
  • cd python_wiringpi_pwm
  • vim controls_pwm.py
import wiringpi2 as wiringpi
import time

OUTPUT = 2
PWM_PIN = 18
SLEEP_TIME = 0.03

wiringpi.wiringPiSetupGpio()
wiringpi.pinMode(PWM_PIN, OUTPUT)

for i in range(0, 1024, 16):
    print(i)
    wiringpi.pwmWrite(PWM_PIN, i)
    time.sleep(SLEEP_TIME)

for i in range(1024, 0, -16):
    print(i)
    wiringpi.pwmWrite(PWM_PIN, i)
    time.sleep(SLEEP_TIME)
  • sudo python controll_pwm.py

で実行すると LED が明るくなった後に徐々に暗くなると思います

ポイント

wiringPiSetupGpio で 18 番の GPIO を初期化します
実は初期化の方法には 3 通りあり他に「wiringPiSetup」「wiringPiSetupSys」があります
前者で初期化した場合は 1 番を指定する必要があり、後者で初期化した場合は 12 番を指定する必要があります
どれを使って初期化しても同じ GPIO を指すことになりますが、コールするメソッドによって初期化する GPIO の番号が違うので注意してください

range で 0 から 1024 の範囲でパルス幅を変化させています
RaspberryPi の場合指定できるパルス幅の範囲が 0 から 1024 のためそうしています
他のマイコンボードなどではもっと広い範囲の指定ができる場合があり、その場合にはより精度の高い制御ができます

二つ目の for 文は LED の明るさを暗くするために用意しています

最後に

紹介は以上です
PWM を使うと、このような動的な制御がプログラム上でできるようになります
PWM の王道といえばおそらくサーボモータだと思うので次回はサーボモータの制御をしてみたいと思います

2016年1月7日木曜日

busted で Lua スクリプトのテストをやってみた

概要

busted は Lua スクリプトをテストするためのテストフレームワークです
インストールから簡単な使い方まで紹介したいと思います

環境

  • CentOS 6.7 64bit Final
  • Lua 5.1.4
  • LuaRocks 2.1.2
  • busted 2.0.rc11-0

busted のインストール

luarocks を使ってインストールできます
luarocks のインストールはこちらを参照してください

  • luarocks install busted

依存するライブラリが結構ありました

busted
2.0.rc11-0 (installed) - /usr/lib/luarocks/rocks
dkjson
2.5-2 (installed) - /usr/lib/luarocks/rocks
lua-term
0.3-1 (installed) - /usr/lib/luarocks/rocks
lua_cliargs
2.5-5 (installed) - /usr/lib/luarocks/rocks
luafilesystem
1.6.3-1 (installed) - /usr/lib/luarocks/rocks
luasocket
3.0rc1-2 (installed) - /usr/lib/luarocks/rocks
luassert
1.7.9-0 (installed) - /usr/lib/luarocks/rocks
mediator_lua
1.1.2-0 (installed) - /usr/lib/luarocks/rocks
penlight
1.3.2-2 (installed) - /usr/lib/luarocks/rocks
say
1.3-1 (installed) - /usr/lib/luarocks/rocks

サンプルテストコードの作成

今回は function を定義している別の Lua スクリプトを busted でテストしてみたいと思います

  • sample_function.lua
function sum(a, b)
  return a + b
end

とりあえず引数の値を足しあわせて返却する簡単なメソッドを定義しておきます
これをテストするテストコードを作成します

  • sample_busted.lua
require 'busted.runner'()

require("sample_function")

describe("sum method test", function()
  it("is three", function()
    local val = sum(1, 2)
    assert.are.equal(val, 3)
  end)
end)

describe("sum method test2", function()
  it("is occured error", function()
    local val = sum(1, 2)
    assert.are.equal(val, 4)
  end)

  it("is not three", function()
    local val = sum(1, 2)
    assert.are_not.equal(val, 4)
  end)
end)

テスト冒頭で require 'busted.runner'() することで busted のテストコードであることを明示します
次にテストしたい Lua スクリプトを require します

あとはテストを記載していきます
基本形は describe -> it -> assert でテストを記載していきます

describe はテストの説明を記載するためのメソッドで階層を持たせることもできます
describe 配下に it を定義します
具体的なテストコードは it 配下に記載します
1 つの describe 内に複数の it を記述することも可能です

実行してみる

では実行してみましょう
今回は作成した 2 つの Lua スクリプトは同一ディレクトリに存在することを想定しています

  • busted sample_busted.lua

結果は以下のようになると思います
2 つ目のテストはあえて失敗するテストにしています

●?●
2 successes / 1 failure / 0 errors / 0 pending : 0.000965 seconds

Failure → sample_busted.lua @ 13
sum method test2 is occured error
sample_busted.lua:15: Expected objects to be equal.
Passed in:
(number) 4
Expected:
(number) 3

サンプルの結果だと色はないですが、失敗か成功かを丸と色で表示してくれます
成功した場合は緑になります
失敗したテストは結果と期待値を表示してくれます
あとはテストにかかった時間を表示してくれます

参考サイト

2016年1月6日水曜日

RaspberryPi でタクトスイッチの信号を受信してみた

概要

タクトスイッチ (タクタイルスイッチ) の信号を RaspberryPi で受信してみました
タクトスイッチはいわゆる普通のスイッチで押した状態 (1) or 押していない状態 (0) を制御することができます

環境

  • Raspberry Pi Type B Single Board Computer 512MB
  • Raspbian 8.0 (Jessie)
  • Kernel Version 4.1.7+
  • Python 2.7.9
  • タクトスイッチ

配線

実際に配線した写真は以下の通り
rpi_tact_switch.jpg

fritzing で書いた配線図は以下の通り
rpi_tact_switch_circuit.png

今回はプルダウンスイッチをソフトウェア側ではなくハード側で制御するので GPIO で信号を受け取る前に 10kオームの抵抗を配置しています
これがプルダウン抵抗です

タクトスイッチのサンプルは他にもいろいろと情報が転がっているので、調べればプルダウン抵抗なし版の回路も簡単に見つかると思います

ソースコードデプロイ

  • mkdir -p ~/work/tact_switch
  • vim ~/work/tact_switch/receive_signal.py
#!/usr/local/bin/python
# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO

pin = 17

def setup(): 
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(pin, GPIO.IN)

def main(): 
    try:
        GPIO.wait_for_edge(pin, GPIO.FALLING)
        print(GPIO.input(pin))
        print("pushed")
    except KeyboardInterrupt:
        print "KeyboardInterrupt"
    except:
        print "Quit"
    finally:
        print "clean up"
        GPIO.cleanup()

if __name__=="__main__":
    setup()
    main()

GPIO は 17 番を使っています
ポイントは wait_for_edge というメソッドでこれを使うことで指定された GPIO が FALLING (押された) 状態になったら次の処理に進むことができます

スクリプトを実行するとスイッチからは 0 が送信されているため入力待ち状態になるはずです
その状態でスイッチを押すと「pushd」と表示されスクリプトが終了します

自分がハマったのは信号が 0 と 1 を繰り返してしまい、待ち状態に入らない現象が発生しました
原因は超単純で別のスクリプトが同じ GPIO を制御しており、そのスクリプトを停止したら正常に動きました
回路がおかしい場合や、抵抗の値が小さい場合にも正常に動かないようです

参考サイト

2016年1月5日火曜日

Test::Nginx::Socket で Nginx のテストを書いてみる

概要

Perl のモジュールで Test::Nginx::Socket というのがありこれを使うことで Nginx のテストを書くことができます
例えば「/hoge」にアクセスしたら「fuga」がレスポンスボディで返却されてレスポンスコードが 200 になるというようなテストを書くことができます

環境

  • CentOS 6.7 64bit Final
  • nginx 1.9.3
  • Test::Nginx::Socket 0.24
  • echo-nginx-module 0.58
  • prove 3.17

事前準備

基本的な Nginx のインストールは過去の記事の手順を元に行っていることを前提にしています
Nginx をソースからインストールしていることが前提なのでご注意ください

Test::Nginx::Socket をインストール

まずはテストフレームワークである Test::Nginx::Socket をインストールします
cpanm を使ってインストールします

  • cd /var/tmp
  • wget https://cpanmin.us -O install_cpanm.pl
  • perl install_cpanm.pl - --sudo App::cpanminus
  • cpanm Test::Nginx

確認は以下のコマンドで可能です

  • find `perl -e ‘print “@INC”’` -name ‘*.pm’ -print | grep Nginx

echo-nginx-module をインストール

echo-nginx-module はテストを書くときに便利な Nginx のモジュールです
インストールしておいたほうがサンプルを書くのも楽なのでインストールします

  • cd /root/work
  • wget https://github.com/openresty/echo-nginx-module/archive/v0.58.tar.gz
  • tar zvxf v0.58.tar.gz
  • cd echo-nginx-module-0.58
  • cd /root/work/nginx-1.9.3
  • ./configure --prefix=/opt/nginx --with-http_ssl_module --with-ld-opt="-Wl,-rpath,/usr/local/lib" --add-module=/root/work/ngx_devel_kit-0.2.19 --add-module=/root/work/lua-nginx-module-0.9.19 --add-module=/root/work/echo-nginx-module-0.58
  • make -j2
  • make install
  • /opt/nginx/sbin/nginx -V
nginx version: nginx/1.9.3
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/opt/nginx --with-http_ssl_module --with-ld-opt=-Wl,-rpath,/usr/local/lib --add-module=/root/work/ngx_devel_kit-0.2.19 --add-module=/root/work/lua-nginx-module-0.9.19 --add-module=/root/work/echo-nginx-module-0.58/

-V でインストール時のビルドオプションを確認できます
ngx_devel_kitlua-nginx-module は前回インストールしたモジュールで今回も使うので指定しています

サンプルのテストコードを作成する

  • cd /var/tmp
  • mkdir t
  • cd t
  • vim sample_nginx_test.t
use Test::Nginx::Socket;

# テストを実行する回数を指定します、以下の場合は 2 回
repeat_each(2);
plan tests => repeat_each() * 2 * blocks();

# テストをシャッフルせず上から実施します
no_shuffle();
# DocumentRoot の設定を自動で生成しないようにします
no_root_location();
# テストを実行します
run_tests();

__DATA__

=== TEST 1: sample
--- config
    location /hello {
            echo hello_world;
    }
--- request
    GET /hello HTTP/1.0
--- response_body
hello_world
--- error_code: 200

テスト冒頭でオプションをコールすることができます
他にもオプションはあるので詳細は公式サイトを見てください

今回サンプルで作成したテストは「/hello」にアクセスするとレスポンスとして「hello_world」を返却する location を定義して、そのパスに対して GET でアクセスした結果、レスポンスボディが「hello_world」でありレスポンスコードが「200」であるかをチェックするテストになります

実行してみる

テストは prove コマンドを使って実行します
おそらくデフォルトでインストールされていると思います

  • cd /var/tmp
  • prove -v t

t/sample_nginx_test.t ..
1..4
ok 1 - TEST 1: sample - status code ok
ok 2 - TEST 1: sample - response_body - response is expected (req 0)
ok 3 - TEST 1: sample - status code ok
ok 4 - TEST 1: sample - response_body - response is expected (req 1)
ok
All tests successful.
Files=1, Tests=4, 1 wallclock secs ( 0.01 usr 0.01 sys + 0.10 cusr 0.01 csys = 0.13 CPU)
Result: PASS

上記のようになれば OK です

テストの流れ

どうやら、Test::Nginx::Socket は作成したテストを元に nginx.conf を独自で作成して、その作成した nginx.conf を元に Nginx を起動します
なので、自分で作成した nginx.conf を使いたい場合、そうなるようにテストを作成する必要があります
もしかしたら自分が作成した nginx.conf を指定して Nginx を実行した上でテストを実行することができるかもしれませんが、まだ調査できていません
たぶんできると思うんですが、、、

最後に

紹介は以上です
End to End のテストケースを書くには便利なツールだと思います
内部で Lua スクリプトなどを使っている場合は別途 Lua テスト用のユニットテストがあると更に良いと思います
結構いろいろなテストが書けるのでこれだけでもいいかもしれませんが

参考サイト

2016年1月2日土曜日

RaspberryPi で圧力センサー を使ってみた

概要

前回 MCP3002 を使って温度センサーを使ってみました
今回は圧力センサーの情報を MCP3002 を使って取得してみました

環境

  • Raspberry Pi Type B Single Board Computer 512MB
  • Raspbian 8.0 (Jessie)
  • Kernel Version 4.1.7+
  • Python 2.7.9
  • pip 7.1.2
  • spidev 3.1
  • 圧力センサー -> 感圧センサ円形0.5インチ

事前準備

SPI を有効にする方法や Python 用のドライバは前回と同様です
あらかじめインストールしておいてください

配線

RaspberryPi + ブレッドボードを使った配線です
rpi_pressure_circuit.jpg

fritzing を使った配線図は以下の通りです
rpi_pressure_circuit_fritzing.png

ポイント

圧力センサーにジャンパを接続するにはハンダごてとハンダが必要になります
とりあえず接触させておけば OK なので、ハンダじゃなくてもいいですが、固定したかったので自分はハンダを使いました

MCP 3002 で信号を受信する部分は前回と一緒です
違うのは圧力センサーでアナログ信号を受信する部分です
片方は電源 3.3V に接続します
もう片方は信号を出力するジャンパとして使います
受信する前に 10K オームの抵抗を接続して回路を安定させています

回路が作成できたら RaspberryPi の電源を入れます

ソースコードのデプロイ

  • cd ~
  • mkdir -p work/mcp3002_pressure
  • cd work/mcp3002_pressure
  • touch pressure_sample.py
#!/usr/bin/env python
# Read the analog sensor value via MCP3002.

import spidev
import time
import subprocess

# open SPI device 0.0
spi = spidev.SpiDev()
spi.open(0, 0)

try:
    while True:
        resp = spi.xfer2([0x68, 0x00])
        value = (resp[0] * 256 + resp[1]) & 0x3ff
        print value
        time.sleep(1)
except KeyboardInterrupt:
    spi.close()
  • python pressure_sample.py

1 秒おきにセンサーで受信したデータを表示します
強く押した場合に値が上昇します
10bit の A/D コンバータなので最大値は 1024 になります
この値を if 分等で切り分けて強弱を判断する感じです