N is Nougat


ご存知のように、Android N のコードネームが Nougat (ヌガー) になりました。
「Android N」、正式名称は「Nougat(ヌガー)」に決定

ヌガー は、砂糖と水飴を低温で煮詰め、アーモンドなどのナッツ類やドライフルーツなどを混ぜ、冷し固めて作るお菓子らしい。
日本ではあまり馴染みがありませんね。
20160710_wiki_nougat

スニッカーズ がヌガーの仲間のようです。
これは、ピーナッツ入りのヌガーをベースに、チョコレートでコーテイングしています。
あの歯に粘りつくような食感が、ヌガーの特徴のようです。
スニッカーズ ピーナッツ 12本入り 1356円
201607010_snickers_opened

お馴染みの チロルチョコ にもヌガー入りがあります。
チロルチョコ<コーヒーヌガー> 30個入り 648円
チロルチョコ<ミルクヌガー> 30個入り 1102円 という復刻板もあるようです。
20160710_tirol_choco_milk

Wikipeadia から横浜・泉の洋菓子屋 ラ・フォンティーヌ がリンクされてました。
アーモンドヌガー 200円
20160710_la_fontaine_amandonuga

さらに調べたところ、東京・銀座の ブールミッシュ がヒットしました。
ヌガー・モンテマール。メレンゲを加え、軽い食感にしたものらしい。
味違いの5個入り 864円。
20160710_boulmich

ブールミッシュは、横浜・馬車道に系列店 ガトー・ド・ボワイヤージュ を出しています。
ヌガー・モンテマールは、ここでも扱っています。
20160710_boulmich_gv

横浜ポルタの ROSHEN でも扱っているようです。
こちらはウクライナ製みたいです。
トローネフルーツ 200g 540円 (アマゾン価格)
20160710_roshen

台湾の 牛軋糖(ヌガータン) もヒットします。
台湾語でムガーのことです。
日本でも人気があるようで、通販サイト で販売されています。
アーモンド入り牛軋糖 10個入 1,280円
20160710_yu_yu


さくら IoT で温度・湿度を観測する


20160701_sakura_iot_system

さくらの IoT Platform さくらインターネットが提供するIoTプラットフォームサービスです。
前回 は、基本的な確認ができたので。
今回は、実用的なものを作ってみました。
センサーのデータ (温度・湿度など) を、さくらの IoT を経由して、WEB にてグラフ表示します。
作ったプログラムは Github で公開しました。

まず、センサー部です。
センサーボード として、以前作ったものを使います。
温度、湿度、気圧などが測定できます。
20160701_sakura_iot_sensor_board

Arduino にセンサーボードとIoT通信ボードを接続します。
Arduino のスケッチ を作成します。
Arduino に書き込みます。
Arduino の電源を入れると、さくらの IoT サーバーに送信されます。
データは、さくらの IoT コントロールパネルに表示されます。
これで、センサー部は完成です。

続いて、サーバー部です。
今回のアルファ版では、さくらのクラウド 2万円分チケットも付いていました。
ありがたく使わせて頂き、さくらのクラウドで新規にサーバーを立てました。
サーバーのプログラム を作成します。
主要部は、Python Flask で記述しました。
さくらの IoT Platform から来たデータを、いったんデータベース(MySQL) に格納します。
データベースから読み出し、Google Chart でグラフ表示します。
これで、サーバー部は完成です。

自宅で1日ほど運用したものが、下記に示します。
ここのところ、毎日30度を超えて暑いですね。
寝る前に、クーラーを入れたので、そこだけ温度が下がってます。
20160701_sakura_iot_graph


WiFi アクセス ポイントから位置情報を検索する


WiFi アクセス ポイントから位置情報 (緯度経度) を検索するには、
Google Maps Geolocation API を使用します。

まず、APIキーを取得します。
次に、サンプルを試します。

$ curl -d @your_filename.json -H "Content-Type: application/json" -i "https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR_API_KEY"

下記のような位置情報が返ってきます。
米国のGoogle本社のそばですね。

{ 
  "location": {
  "lat": 37.4248297,
  "lng": -122.07346549999998
 },
 "accuracy": 1145.0
}

20160620_geo_goole

手軽に試せるように Python コードを作成します。
作成したコードは Github で公開しました。

サンプルのMACアドレスで、実行します。

$ python geo_wifi.py 01:23:45:67:89:AB 01:23:45:67:89:AC

35.4437078 139.6380256 4093.0

Chromeブラウザに地図が表示されます。
なぜか、横浜市役所です。
20160621_geolocation

さて本番
家で拾えるWifiのMACアドレスを試すと、
う〜ん自宅の近くが表示されますね。(^^;

参考
Wi-FiのMACアドレスはもはや住所と考えるしかない
linux のコマンドラインから、wi-fi の情報をつかって位置情報を得る


MAC airport コマンド


MAC には WiFi の管理を行う airport というコマンドがあります。

実体はここ
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport

airport scan

SSID BSSID             RSSI CHANNEL HT CC SECURITY (auth/unicast/group)
AirPortxxxx **** -36  1       Y  JP WPA(PSK/AES,TKIP/TKIP) WPA2(PSK/AES,TKIP/TKIP) 
L02F_xxxx **** -37  40      Y  -- WPA(PSK/AES,TKIP/TKIP) WPA2(PSK/AES,TKIP/TKIP) 
BUFFALO-xxxx **** -79  6       Y  -- WPA(PSK/AES/AES) WPA2(PSK/AES/AES) 
aterm-xxxx **** -84  4       Y  JP WPA(PSK/AES/AES) WPA2(PSK/AES/AES) 

参考
airport – the Little Known Command Line Wireless Utility
Managing WIFI connections using the Mac OSX terminal command line


MAC の Python で Chrome を開く


Python で Chrome を開くには、Selenium と ChromeDriver を使用します。
Selenium は、ブラウザを自動化するツールです。WebDriver API を有しています。
ChromeDriver は、Chrome ブラウザのために WebDriver のプロトコルを実装するスタンドアロンサーバーです。

インストール
Selenium のインストール

$ pip install selenium

ChromeDriver のインストール
chromedriver_mac32.zip をダウンロードする。
解凍した chromedriver をbin ディレクトリに置く。

$ wget http://chromedriver.storage.googleapis.com/2.22/chromedriver_mac32.zip
$ unzip chromedriver_mac32.zip
$ cp chromedriver /usr/local/bin/ 

確認
test.py

import time
from selenium import webdriver
driver = webdriver.Chrome('/usr/local/bin/chromedriver')
driver.get('http://www.google.com/xhtml');
time.sleep(5) # Let the user actually see something!
search_box = driver.find_element_by_name('q')
search_box.send_keys('ChromeDriver')
search_box.submit()
time.sleep(5) # Let the user actually see something!
driver.quit()

下記のような 「ChromeDriver」 の検索画面が表示される
20160620_chrome_driver


さくらIoT通信モジュールを試してみた


さくらの IoT Platform は、さくらインターネットが提供するIoTプラットフォームサービスです。
α版テスターの公募があったので申し込んでみたところ、6月頭に通信モジュール・キットが送付されてきました。

通信モジュール・キット
送付されたのは、アルミの箱が1つでした。
201618_sakura_iot_case

何の説明もついていなかったので、まずは、ねじ回しで箱を開けます。
中身は、下記のものでした。
・通信モジュール SORACOM SIM 版 x 1個
・通信モジュール Softbank SIM 版 x 1個
・接続ケーブル x 2本
・棒形アンテナ x 2本
・アンテナケーブル x 2本
・板型アンテナ x 1個
・さくらのクラウド 2万円分チケット x 1枚
・シール x 1枚

通信モジュールは、モデムボードとデバイスボードが一体になり、SIMカードが挿入されています。
モデムボードは CEREVO 製で、デバイスボードは ABiT 製です。
20160618_sakura_iot_softbank 20160618_sakura_iot_soracom 20160618_sakura_iot_abit

マニュアル
さくらの IoT プラットフォーム 利用マニュアル – PDF販
さくらのIoTプラットフォーム 利用マニュアル – github

物理インターフェイス
電源は5V系です。
UART、SPI、I2C の3つの口を持っていますが。
どれか1つ接続すれば、OKです。

Arduino との接続

Sakura IoT Arduino
1 UART TX (O) D8 or D0
2 UART RX (I) D9 or D1
3 GND GND
4 SPI MOSI (I) D11
5 SPI MISO (O) D12
6 SPI SCK (I) D13
7 SPI CS (I) D10
8 GND GND
9 I2C SDA (I/O) SDA (A4)
10 I2C SCL (I/O) SCK (A5)
11 GND GND
12 +5V +5V

ソフト・インターフェイス
さくらインターネット から、Arduino用の SPI と I2C のサンプルコードが公開されています。
SakuraAlphaArduino

UART については、解説を書いた人がいます。
さくらのIoT通信モジュールのUARTの使い方

試してみる
(1) コントロールパネルの用意
さくらインターネットのアカウントを作成します。
IoT Platformのコントロールパネルにて、通信モジュールを登録します。
サービスとして「WebSocket」を作成します。
20160618_sakura_iot_control_top

(2) 通信モジュールの用意
通信モジュールに、棒型アンテナと、Arduinoを接続します。
パソコンにUSBコネクタを差して給電します。
5分ほどすると、コントロールパネルの表示が「オンライン」に変わります。
20160618_sakura_iot_wiring

(3) Arduinoの用意
サンプルコードの SakuraAlpha_I2C あるいは SakuraAlpha_SPI を Arduino に書き込みます。
コントロールパネルは、下記のようになります。
20160618_sakura_iot_control_data

Arduino のシリアルモニタは、下記のようになります。
20160618_sakura_iot_monitor

クライアントの作成
WebSocket のクライアントを作成します。
接続先は、コントロールパネルに表示されています。

wss://secure.sakura.ad.jp/iot-alpha/...

データは、下記のようなJSON形式です。

{"module":"xxx","type":"channels","datetime":"2016-06-18T07:43:55.024301691Z","payload":{"channels":[{"channel":0,"type":"I","value":1},{"channel":1,"type":"I","value":1},{"channel":2,"type":"I","value":1}]}}

keepalive もやってきます。

{"type":"keepalive","datetime":"2016-06-18T07:45:23.06614438Z"} 

実行結果

type: channels
datetime: 2016-06-18T17:12:18.391885263Z
module: xxxx
channel: 0 type: I value: 44
channel: 1 type: I value: 44
channel: 2 type: I value: 44

type: keepalive
datetime: 2016-06-18T17:12:19.97128196Z

コードは Github で公開しました。

参考
さくらのIoT Platformを試してみた
さくらのIoT Platform α で作ったもの
さくらのIoT通信モジュールのUARTの使い方
さくらのIoT Platform α – mbed


MAC Book Air の 有線LAN


MAC Book Air で有線LANを使うには、変換アダプタが必要です。
いくつか試してみました。

(1) Apple Thunderbolt – Ethernetアダプタ
Apple 純正なので、ケーブルを挿すだけで、つながります。

(2) USB – Ethernet アダプタ
(2−1) BUFFALO LUA3-U2-ATX
ケーブルを挿すだけで、つながりました。

(2−2) BUFFALO LUA4-U3-AGT
USB3.0 対応、Giga イーサ 対応です。
MAC用のドライバー をインストールしたら、 つながりました。


init.d と systemd


Linux にてサービスデーモンを新設するには、起動スクリプトとして、
/etc/init.d/skeleton を元に /etc/init.d/hoge を作成します。

サービスデーモンを起動しようとすると、

$ sudo /etc/init.d/hoge start

下記の警告が出ます。

'systemctl daemon-reload' recommended.

systemctl とは、service manager で systemd の一部です。

Linux 全体の傾向として、 /etc/init.d/hoge でサービスを起動するのは廃止され、 systemd を使うようになっていました。
Debian や Raspbian では、jessie から systemd に移行しています。

なぜsystemdなのか
Jessie での既存 init システムから新しい標準 init システムへのアップグレードについて

例えば、ssh は、従来は起動スクリプトが使用されていましたが。

/etc/init.d/ssh 

systemd の環境では、定義ファイルが使用されます。

/lib/systemd/system/ssh.service

サービスデーモンを新設する場合も、
下位互換として、従来の起動スクリプトが使用できますが。

/etc/init.d/hoge

新しい流儀では、定義ファイルを作成するようです。

/etc/systemd/system/hoge.service

Raspbian jessieでSystemdを使った自動起動


ラズパイ Open JTalk


20160610_openjtalk

Open JTalk は、入力された日本語テキストに基づいて自由な音声を生成する HMM テキスト音声合成システムです。

インストール

$ sudo apt-get install open-jtalk
$ sudo apt-get install open-jtalk-mecab-naist-jdic 
$ sudo apt-get install hts-voice-nitech-jp-atr503-m001

確認

$ echo "こんにちは" | open_jtalk -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice -x /var/lib/mecab/dic/open-jtalk/naist-jdic -ow /tmp/jtalk.wav
$ aplay /tmp/jtalk.wav

女性の声の設定
MMDAgent は、音声インタラクションシステム構築ツールキットです。

インストール

$ cd /tmp
$ wget http://downloads.sourceforge.net/project/mmdagent/MMDAgent_Example/MMDAgent_Example-1.6/MMDAgent_Example-1.6.zip
$ unzip MMDAgent_Example-1.6.zip
$ sudo cp -R ./MMDAgent_Example-1.6/Voice/mei /usr/share/hts-voice/

確認
-m オプションを MMDAgent にします

$ echo "こんにちは" | open_jtalk -m /usr/share/hts-voice/mei/mei_normal.htsvoice -x /var/lib/mecab/dic/open-jtalk/naist-jdic  -ow /tmp/jtalk.wav
$ aplay /tmp/jtalk.wav

参考
Raspberry piで日本語音声合成(Open JTalk)を試してみる。


ラズパイ 無線LANアクセスポイント化


20160610_wlan_ap

ラズパイを 無線LANアクセスポイント 化します。

準備するもの
無線LANの親機になるドングル
BUFFALO WLI-UC-GNM を使用しました

手順は大きく4つです
(1) 無線LANを固定IPアドレスにする
(2) DHCPサーバーの構築
(3) アクセスポイントデーモンの構築
(4) イーサネットと無線LANのルーティングの設定

無線LANのIPアドレスを 192.168.42.1 にして、192.168.42.10 から 192.168.42.50 まで配布するようにします。
有線LAN側のゲートウェイが 192.168.1.1 とします。

作成や変更したファイルは Github で公開しています

(1) 無線LANを固定IPアドレスにする
/etc/network/interfaces を変更する

# 下記のようにコメントにする
#allow-hotplug wlan0
#iface wlan0 inet manual
#    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
#allow-hotplug wlan1
#iface wlan1 inet manual
#    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

# 下記を追加する
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.42.1
netmask 255.255.255.0
gateway 192.168.1.1

(2) DHCPサーバーの構築
DHCP サーバーとして isc-dhcp-server をインストールする

$ sudo apt-get install isc-dhcp-server

/etc/dhcp/dhcpd.conf を変更する

# 下記のようにコメントにする
#option domain-name "example.org";
#option domain-name-servers ns1.example.org, ns2.example.org;

# 下記のコメントを外す
#authoritative;
authoritative;

# 下記を追加する
subnet 192.168.42.0 netmask 255.255.255.0 {
  range 192.168.42.10 192.168.42.50;
  option broadcast-address 192.168.42.255;
  option routers 192.168.42.1;
  default-lease-time 600;
  max-lease-time 7200;
  option domain-name "local";
  option domain-name-servers 8.8.8.8,8.8.4.4;
}

/etc/default/isc-dhcp-server を変更する

# 下記のように変更する
#INTERFACES=""
INTERFACES="wlan0"

(3) アクセスポイントデーモンの構築
hostapd をインストールする

$ sudo apt-get install hostapd

/etc/default/hostapd を変更する

# 下記のように変更する
#DAEMON_CONF=""
DAEMON_CONF="/etc/hostapd/hostapd.conf"

/etc/hostapd/hostapd.conf を作成する

interface=wlan0
driver=nl80211
ssid=fablab_raspi
hw_mode=g
channel=6
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=0456649009
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

(4) イーサネットと無線LANのルーティングの設定
/etc/sysctl.conf を変更する

# 下記のコメントを外す
#net.ipv4.ip_forward=1
net.ipv4.ip_forward=1

iptables コマンドで /etc/iptables.ipv4.nat を作成する

$ sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
$ sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
$ sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
iptables
$ sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

/etc/network/interfaces を変更する

# 下記を追加する
pre-up iptables-restore < /etc/iptables.ipv4.nat

確認
再起動する

$ sudo reboot

dhcpd が起動している

$ ps auxw | grep dhcpd
root       649  0.0  0.8  10476  7928 ?        Ss   23:06   0:00 /usr/sbin/dhcpd -q -cf /etc/dhcp/dhcpd.conf -pf /var/run/dhcpd.pid wlan0

hostapd が起動している

$  ps auxw | grep hostapd
root       692  0.2  0.3   5920  2996 ?        Ss   23:06   0:01 /usr/sbin/hostapd -B -P /run/hostapd.pid /etc/hostapd/hostapd.conf

dhcpd のポートが開いている

$ sudo netstat -ap | grep dhcpd
udp     0   0 *:bootps          *:*         651/dhcpd       
udp     0   0 *:20899           *:*         651/dhcpd       
udp6   0   0 [::]:60482        [::]:*       651/dhcpd       
raw     0   0 *:icmp              *:*    7   651/dhcpd       

無線LANのIPアドレスが 192.168.42.1 になっている

$ ifconfig
wlan0     Link encap:Ethernet  HWaddr cc:e1:d5:3e:33:87  
  inet addr:192.168.42.1  Bcast:192.168.42.255  Mask:255.255.255.0
  inet6 addr: fe80::3640:cb77:8e64:6f8a/64 Scope:Link

ルーティングが設定されている

$ sudo iptables -L
...
Chain FORWARD (policy ACCEPT)
target     prot opt source      destination         
ACCEPT   all  --  anywhere    anywhere   state RELATED,ESTABLISHED
ACCEPT   all  --  anywhere    anywhere            
...

参考
How to Set up a Raspberry Pi as a Wireless Access Point
Raspberry Piのアクセスポイント化 & ルータ化がうまくいかない時はこの通りにやればおk
Raspberry Piの無線LANアクセスポイント化