2015年10月11日日曜日

RaspberryPi で Bluetooth キーボードを接続する方法

概要

RaspberryPi に有線キーボードを接続しているといろいろと邪魔なので Bluetooth の無線キーボードに変更してみました

環境

必要なパッケージのインストール

この作業はまだ有線キーボードで実施する必要があります

  • sudo apt-get -y update
  • sudo apt-get install bluetooth bluez-utils blueman

apt-get でインストールされる BlueZ は 4.99 になるので注意してください
Bluetooth キーボードと接続するだけであれば 4.99 でも問題ないです

Bluetooth レシーバを接続する

この作業も有線キーボードで実施します

空いている USB ポートに Bluetooth レシーバを接続しましょう
RaspberryPi が起動中の状態でもOKです
うまく認識しない場合は停止してからお試しください

  • lsusb
    Cambrige Silicon Radio, Ltd Bluetooth Dongle (HCI mode) が認識されていることを確認しましょう
  • Bluetooth キーボードの Bluetooth を ON にする
    RaspberryPi がレシーバを認識したら Bluetooth キーボードを ON にしましょう
    今回使用した iBuffalo のキーボードであれば左側の側面に ON/OFF のスイッチがあります
    また充電式なので MicroUSB ポートを使って事前に充電しておきましょう
  • Bluetooth キーボードをペアリング待機状態にする
    今回のキーボードであれば、電源を ON にしてランプが青から消灯した段階で fn + delete を押すことでペアリングの待機状態にすることができます
    待機状態になるとランプが青色の点滅状態になります
  • sudo hcitool scan
    RaspberryPi 側から Bluetoothe キーボードを探索します
    おそらく簡単に見つかると思います
    見つかったらそこに表示されている Mac アドレスをメモしておきましょう
    見つからない場合はちゃんとペアリングの待機状態になっているかキーボード側を確認してください

スクリプト修正

bluez-simple-agent というスクリプトを修正しないと、うまくペアリングできなかったので修正します

  • sudo cp /usr/bin/bluez-simple-agent{,.back}
  • sudo vi /usr/bin/bluez-simple-agent

cabability=”DisplayYesNo”

92行目 を上記のように修正しましょう
修正できたらペアリングしていきます

ペアリング

  • sudo bluez-simple-agent hci0 [mac_address]
  • sudo bluez-test-device trusted [mac_address] yes
  • sudo bluez-test-input connect [mac_address]

でエラーがでなければペアリング完了です
実際に Bluetooth キーボードから入力ができるかと思います
入力が確認できたら有線キーボードは外してもらってOKです

英語キーボードとして認識させる

例えば有線の場合は日本語キーボードだったので raspi-config で日本語キーボードの設定をしていたため英語キーボードを接続したらうまく動かなくなったなど (自分はそのパターン)

以下のようにキーボードの設定ファイルを書き換えることで英語キーボードとして認識させることができました

  • sudo cp /etc/default/keyboard{,.back}
  • sudo vi /etc/default/keyboard
# KEYBOARD CONFIGURATION FILE

# Consult the keyboard(5) manual page.

XKBMODEL="pc105"
XKBLAYOUT="us"
XKBVARIANT=""
XKBOPTIONS="ctrl:swapcaps"

BACKSPACE="guess"

上記のように必要な箇所を書き換えましょう
( 自分は XKBLAYOUT, XKBVARIANT, XKBOPTIONS だけ書き換えれば OK でした)
その後

  • sudo reboot

で次回起動時に英語キーボードとして認識します
XKBOPTIONS の設定でついでに capslock と ctrl を入れ替えているので不要な場合は空白を設定してください

トラブルシュート

  • キーボードからの入力ができなくなった

おそらく RaspberryPi がキーボードを認識できなくなったんだと思います

sudo hcitool con

で何も表示されなくなります
USBドングルを RaspberryPi から外して再度接続すると RaspberryPi がリフレッシュし再度認識されると思います
それでもダメな場合は再起動してください
キーボード側の充電がなくなった可能性もあります
Bluetooth キーボードの種類によっては一定時間操作していない場合は休止状態になることがあるので、久しぶりに触る場合は何度かキーをストロークすることで再認識することもあります

  • 再度ペアリングする

上記の再起動方法はちょっと力づくなので、この方法がいいと思います
fn + delete で再度ペアリング状態にして別ターミナルで SSH ログインして

sudo bluez-test-input connect [mac_address]

を実行すると再度ペアリングしてキーボードが使えるようになります
RaspberryPi の bluetooth は一定期間通信していないとペアリングを解除してしまうのでしょうか、それともキーボード側が一定期間使われていないとペアリングを解除してしまうとか
ペアリングを解除しないために RaspberryPi 側から一定間隔で信号を送っておく必要がありそうです

  • RaspberryPi 再起動後の挙動

特に再度ペアリングのコマンドを実施しなくてもキーボードに接続することができました
もちろん再起動時にキーボード側の Bluetooth は ON にしておいてください

2015年10月9日金曜日

RaspberryPi に BlueZ をインストールして BLE を検知してみた

概要

BlueZ は Linux 上で Bluetooth を扱うためのプロジェクトです
RaspberryPi で Bluetooth や Bluetooth Low Energy を扱う場合にも BlueZ が必要になります
今回は BlueZ のインストール方法と BlueZ を使った簡単な Python スクリプトのサンプルを動作させてみました

環境

  • Raspberry Pi Type B Single Board Computer 512MB
  • Raspbian 7.8
  • Python 2.7
  • BlueZ 5.32
  • pybluez 0.22
  • Boost 1.49

BlueZ 5.32 のインストール

Rasbian 上で BlueZ をインストールする際に apt-get を使うと 4.99 というバージョンがインストールされてしまうのでソースからコンパイルしてインストールします

  • sudo apt-get install libdbus-1-dev libdbus-glib-1-dev libglib2.0-dev libical-dev libreadline-dev libudev-dev libusb-dev make
  • mkdir -p work/bluetooth
  • cd work/bluetooth
  • wget https://www.kernel.org/pub/linux/bluetooth/bluez-5.32.tar.xz
  • tar xvf bluez-5.32.tar.xz
  • cd bluez-5.32
  • ./configure --disable-systemd --enable-library
  • make
  • sudo make install

make から make install にかけてやや時間がかかります
続けて make でインストールされないものを手動でインストールします

  • sudo cp attrib/gatttool /usr/local/bin/

あと、libbluetooth-dev の各種ヘッダファイルをビルドしたもので置き換えます

  • sudo cp -ipr lib/ /usr/include/bluetooth.5.32
  • cd /usr/include
  • sudo mv bluetooth bluetooth.4.99
  • sudo ln -s bluetooth.5.32/ bluetooth

BLE 検知テスト

hcitool という検知用の簡易ツールがあるのでそれを使ってみます

  • sudo hcitool lescan

とすることで BLE の信号を検知することができます
近くに BLE の端末がある場合は近づけると Mac アドレスとデバイス名を表示してくれます
hcitool のバージョンは hcitool と入力して表示されるヘルプの先頭に表示されています

より詳細な情報 (Advertising パケットの中身など) をみたい場合はあらかじめ sudo hcidump & としてバックグランド実行した状態で lescan をかけましょう

pybluez インストール

Python から操作するためのライブラリをインストールします
pip を使うのでインストールしています

  • sudo apt-get -y install python-pip
  • sudo apt-get install python-dev libbluetooth-dev libboost-all-dev
  • sudo pip install pybluez
  • sudo pip install pybluez[ble]

Python スクリプトから検知してみる

サンプルスクリプトを作成してスクリプトで BLE デバイスが検知できるか確認してみましょう

  • cd work/bluetooth
  • touch scan_ble.py
  • vim scan_ble.py
# bluetooth low energy scan
from bluetooth.ble import DiscoveryService

service = DiscoveryService()
devices = service.discover(2)

for address, name in devices.items():
    print("name: {}, address: {}".format(name, address))
  • sudo python scan_ble.py

でエラーにはならいのですが、BLE をうまく検知してくれず、、、

P.S 20151015
以下を対応してから実施したら上記でもうまく検知できました
http://kakakikikeke.blogspot.com/2015/10/raspberrypi-error-connect-connection.html

別のサンプルスクリプトを試してみる

で 10個 BLE情報を受信すると情報を出力しつづけてくれます
こちらはあっさり動きました
pybluez と一緒にインストールされる bluetooth というライブラリを使っていますがこっちのほうが簡単に扱えるかもしれません

最後に

BlueZ をインストールして BLE デバイスを検知してみました
最後は Python スクリプトから検知してみました
正直 hcitool がよく出来ているので難しいソースコードを見て自分スクリプトを組まなくてもいいかもしれません

また pybluez の BLE サポートライブラリをインストールするのに libbluetooth-dev が 4.101 以上のバージョンでないと gattlib のインストールに失敗するのはハマりました
今回は BlueZ をコンパイルしてできた bluetooth ディレクトリをコピーして最新にすることで対応しましたが、どこを探してもなかったので結構大変でした
2つ目のサンプルは gattlib を使っていないので BLE サポートのライブラリも入れる必要がないので 2 つ目を素直に使うのがいいと思います

参考サイト

2015年10月8日木曜日

消えた 1a0a666f941c99882093d7bd08ced15033bc3f0c の package.el

概要

どこを探してもない
とりあえず emacs23 で動いた package.el をキャッシュしておきます

package.el

たぶんこれのはず
package.el

とりあえず Debian 上で動作する emacs 23.4.1 ではちゃんと動くことを確認しました

2015年10月7日水曜日

RaspberryPi で日本語の文字化けを解消する方法

概要

raspi-config の初回設定時に Locale を ja_JP.UTF-8 にしていると RaspberryPi 上で日本語が文字化けを起こします
RaspberryPi 上でも日本語を使う方法を紹介します

環境

  • Raspberry Pi Type B Single Board Computer 512MB
  • Raspbian 7.8

日本語フォントインストール

  • sudo apt-get install ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname
  • sudo apt-get install jfbterm
  • sudo reboot

apt を使ってインストールするのでインターネットに接続していることが条件になります
フォントをインストールしたら一旦再起動します

jfbterm 起動

  • jfbterm

上記コマンドを実行するとつらつらーとログが流れて再度プロンプトが表示されると思います
この状態で例えば存在しないコマンドなどを入力すると

pi@raspberrypi ~ $ hoge
-bash: hoge: コマンドが見つかりません

とちゃんと日本語表示されると思います
日本語表示したい場合は jfbterm を起動する必要があります
ログイン直後などに実行するといいと思います

Tips

Ctrl + d とかで jfbterm を終了すると普通はもとのプロンプトに戻るのですが戻らない場合がありました
何も入力を受け付けなくなり、元に戻れない現象になってしまいます
RaspberryPi 自体を再起動してもいいですが面倒です
そんな場合もし SSH が使えるのであれば別のマシンから RaspberryPi に SSH ログインして再度 jfbterm を実行すると復活すると思います

Zabbix のアクションで送信するメールに日付を挿入する方法

概要

Zabbix で発泡するアクションメール内に時刻情報を記載する方法を紹介します

環境

  • CentOS 6.6 64bit
  • Zabbix 2.4.5

設定方法

設定 -> アクションを開き設定したいアクションに以下のマクロを追記します

  • Event time: {EVENT.TIME}
  • Event date: {EVENT.DATE}

設定画面のサンプルは以下のような感じです

insert_event_info.png

これで時刻情報がアクションメールの本文内に記載されます

2015年10月6日火曜日

chef-td-agent の cookbooks を chef-client でインストールしてみた

概要

公式では Berkshelf を使用するのが推奨されていますがあえて使わないでインストールしてみました
chef-client を使って実行しています

環境

  • CentOS 6.6 64bit
  • Chef 12.0.3-1 (chef-client)
  • td-agent 0.12.12
  • chef-td-agent (revision : 143057e)

必要なレシピを取得

実行用 json ファイルを作成

  • cd work/td-agent
  • touch td-agent.json
  • vim td-agent.json
{
  "run_list": [
    "td-agent"
  ]
}

実行

  • cd work/td-agent
  • chef-client -z -j td-agent.json -o td-agent

確認

  • which td-agent

    /usr/sbin/td-agent

  • ls -l /etc/td-agent/td-agent.conf

  • td-agent-gem list | grep fluent

2015年10月2日金曜日

AutoLayout 超入門

概要

AutoLayout はサイズの異なるデバイス間でもレイアウトを自動で調整することで綺麗に見せる機能です
Xcode の InterfaceBuilder を使って設定する方法を紹介します
Android で言うところの RelativeLayout 的な機能です

環境

  • Mac OS X 10.10.5
  • Xcode 7.0.1

サンプルプロジェクト作成

Xcode を開いてサンプルプロジェクトを作成します

  • Fire -> New -> Project
  • Single View Application
  • Choose options for your new project は適当に決定してOK
  • プロジェクトの保存先を適当に決定

これでOKです
配布するアプリではないので、AppID とかは気にしないでいいと思います

Main.storyboard を開く

左メニューから Main.storyboard をクリックして開きましょう
とりあえず View Controller が 1 つあると思います
今回はこれをそのまま使っていきましょう
open_xib.png

UIコンポーネントを設置する

View が 1 つあるのでそれに Label の UI コンポーネントを 3 つ配置しましょう
set_3_label.png

とりあえずこんな感じになればOKです
3 つの UI コンポーネントを重ねて設置しないように注意しましょう

あと AutoLayout の効果がわかるように適当に背景色を指定しておきましょう
set_background.png

constraints を設定する

さて、ここからが本題です
この constraints (制約) という機能が AutoLayout の正体といってもいいでしょう

まず一番上の Label から設定していきましょう
Label を選択した状態にし、右下にある 4 つ並んだアイコンの右から 2 番目を選択します
すると吹き出しみたいなやつが出てきて constraints を設定できます
これで何ができるのかというと、他のUIコンポーネントとのマージンや配置場所を設定することができます
マージンを設定する場合は

  • 赤い点線になっている部分をクリック
  • 赤い実線になる
  • プルダウンからマージンの基準となる他のUIコンポーネントを指定
  • 距離を設定

という手順になります(これが非常にわかりづらい、あと点線を実線にしたり、他にフォーカスがあたると指定した数字が戻っちゃったりする、、)

とりあえず一番上のラベルは以下のような感じで設定しました
set_constraints.png

隣接するコンポーネントとはそれぞれ 10 マージンするという設定になります
これで良ければ一番下の Add 4 constraints をクリックします
すると左メニューに constraints が追加されます
added_constraints.png

こんな感じで他の Label も設定しましょう
最終的に以下のような constraints の設定にしました
set_all_constraints.png

急に複雑になった感がハンパないですが、落ち着きましょう
一番初めの Label にした上下左右の 10 のマージンの設定を他の Label にもやっただけです

フレームを更新する

constraints を設定したらその設定を InterfaceBuilder に反映させてどう見えるか確認することができます
4 つ並んでいるアイコンの一番右をクリックし「Update Frames」を選択しましょう
update_frame.png

すると作成した constraints にしたがって UI コンポーネントが整理されます
たぶん今回の設定だと以下のようになると思います
updated_frames.png

最後のラベルが異様な高さになっていますが、今回は各コンポーネント間のマージンだけを設定しました
具体的に高さを決めていません
この場合、先にマージンが決定されそれに応じて各UIコンポーネントの高さが決定します
上に配置したコンポーネントから先に評価され最後のラベルのコンポーネントが最後に評価されたため余った高さ分がコンポーネントの高さに割り当てられたことになります

動作確認

では動作確認してみましょう
適当にシミュレータを選択してビルドしましょう

まず Portrait (縦向き) の場合ですが、これは InterfaceBuilder で確認していた通りの感じだと思います
横まできっちりラベルが伸びており、縦は最後のラベルの高さで画面いっぱいまで伸びていると思います
portrait.png

では、次にシミュレータを Landscape (横向き) にしてみましょう
Hardware -> Lotate Left で横向きにできます
すると横幅と縦幅が変化したにも関わらずピッタリ綺麗に表示されていると思います
landscape.png

これが AutoLayout のちからになります
例えばこれが AutoLayout を使わずに決め打ちで width や height を設定していると Landscape にしたときに横幅が足りなくなる現象に見舞われると思います

最後に

InterfaceBuilder だけで設定できるので、使いこなせると非常に便利な機能だと思いました
ただ、操作や設定がやや困難でマスタするまでには少し時間が必要かなと感じました
また、Xcode のバージョンは頻繁にアップデートし、それに伴い UI が変わるので、今回紹介した操作とは、バージョンが違う場合異なる可能性が高いです

自分的にハマったのは隣接するコンポーネント間のマージンの設定です
マージンを設定するときに XCode が自動で判断して隣接するコンポーネントを決めるのですが、それが全然違うコンポーネントだったケースがあったので、それにハマりました

あとは自分は遭遇したことがないですが、1 つの View 上に非常に大量の UI コンポーネントがある場合にそれに 1 つ 1 つ constraints を設定するのは非常に大変で手間のかかる作業になると思いました
そういった場合にはちょっと使えないレベルになってしまうかもしれません