2016年10月28日金曜日

miniUSB 版の FTDI232 を Arduino Pro mini で使ってみた

概要

FTDI232 はシリアル変換用の USB アダプタです
主にシリアル通信を使ってプログラムを書き込んだり、マイコンにコマンドを write/read するときに使います
いつもはスイッチサイエンスさんの microUSB の FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き) を使っていたのですがこれだと結構な値段もするので複数買うのを拒んでいました
miniUSB で使える安いやつを見つけたので今回それを使ってみました

環境

始める前に

気づいたのですが、今回購入した変換アダプタはオスピンのヘッダピンがデフォルトでハンダされています
これはこれでいいのですが、Arduino Pro mini 側もオスピンなので接続ができません
なので、メス - メスの接続コネクタを作成する必要があったので、ジャンパケーブルを切断して自作しました

とりあえずジャンパケーブルをぶった切って銅線を剥き出しにします
ftdi232_miniusb_connect1.jpg

それをセットにしてねじって結合します
ftdi232_miniusb_connect2.jpg

でハンダ付けして固定します
汚いですが、OK です
ftdi232_miniusb_connect3.jpg

あとは絶縁テープを巻いて完了です
ftdi232_miniusb_connect4.jpg

これを使って FTDI232 と Arduino Pro mini を接続してシリアル通信させます

接続

では、接続します
配線時の向きだけ気をつけてください
VCC や TX, RX がちゃんと合うように配線しましょう
以下のようになりました
固定するためにテープを巻いています
ftdi232_miniusb_connect5.jpg

あとは miniUSB ケーブルを接続して Arduino Pro mini とも接続します
向きに注意
ftdi232_miniusb_connect6.jpg

PC と接続

では PC と接続しましょう
FTDI 上の LED と Arduino Pro mini の LED が光れば OK です
ftdi232_miniusb_connect7.jpg

FTDI のドライバは事前にインストールされていたので特にインストールしないでも認識してくれました
Arduino IDE 上では以下のように表示されました
ftdi232_miniusb_connect8.png

試し手にスケッチの例にある Blink を書き込んで見ましたが問題なく書き込めました
Arduino Pro mini 上のLED も問題なく点滅しました

最後に

miniUSB 版の FTDI232 USB 変換アダプタを使ってみました
特に問題なく想定どおりに動いてくれました
今回購入したアダプタのほうが値段的にかなり安いので、miniUSB をお持ちの方はこちらをおすすめします

ただ、メスメスのピンソケットを準備する必要があるので、その点は注意です
今回は自作しましたが、短すぎかつ、長さがバラバラだったので、ちょっと使いづらい感じになってしまったのは反省点です

オスメスのピンソケットを購入してそれをつなげてもいいと思います

2016年10月26日水曜日

Error:The number of method references in a .dex file cannot exceed 64K.

概要

AndroidStudio で久しぶりにアプリを apk にビルドしてみたら以下のエラーが発生しました

Error:The number of method references in a .dex file cannot exceed 64K.
Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html

対処してみたので、その方法を紹介します

環境

  • Mac OS X 10.10.5
  • AndroidStudio 2.1.2
  • Android SDK 24.3.4
  • Build Target API Level 23
  • Java SDK 1.8.0_31-b13

対処方法

build.gradle に以下を追記したら対応できました

multiDexEnabled true

実際に書いた場所は以下の通り (一部抜粋)

defaultConfig {
    applicationId "com.yourdomain.app"
    minSdkVersion 11
    targetSdkVersion 23
    multiDexEnabled true
}

こんな感じで記載してとりあえずビルドしてみたらエラーが出なくなりました

ビルドすると同時に app.iml も更新されたのでもしかすると multiDexEnabled に必要なライブラリをインストールしてくれているのかもしれません

2016年10月25日火曜日

Xcode7 で Firebase/AdMob を導入する方法

概要

Admob は Google が提供するアプリに広告を入れられるサービスです
Google が Firebase をモバイルのプラットフォームとして統合したことで Admob も Firebase と連携できるようになりました
Admob 単体でも組み込むことができるのですが、Firebase とリンクさせて使うことで Firebase の Analytics 機能も使えるようになります
また、後々を考えてプラットフォームは Firebase に統合されるのを見据えて今回は Firebase 版の Admob を使ってみたいと思います

環境

  • Mac OS X 10.10.5
  • Xcode 7.2.1
  • Cocoapods 1.0.1
  • Google-Mobile-Ads-SDK 7.9.1
  • Firebase/AdMob 3.4.0
  • Firebase/Core 3.4.0

ライブラリのインストール

まずは必要なライブラリをインストールします
最近では Cocoapods を使って簡単にライブラリをインストールできます

  • vim Podfile
pod 'Firebase/Core'
pod 'Firebase/AdMob'
  • pod install

で OK です
インストールされたバージョンは冒頭の環境に記載されているバージョンでした

Firebase にプロジェクトおよびアプリを作成する

Firebase のコンソール にアクセスします
すでに Admob アカウントを持っている場合はそのアカウントでアクセスすると後々の設定が楽になります

アクセスしたらプロジェクトを作成しましょう
Google プロジェクトがすでにある場合はそこからインポートしても良いです
プロジェクトが作成できたら作成したプロジェクトを選択して、そのプロジェクトの中にアプリを作成しましょう
アプリは iOS のアプリを作成します
firebase_admob_creating_app.png

アプリを設定する画面になったら公開しているアプリの情報を入力しましょう
iTunes Connect とかで確認できるので入力してください
今回はすでに公開している自分のアプリに対して Admob を設定するので、その情報を入れましたがまだ公開していないアプリに設定したいケースもあると思います
その場合は iOS バンドル ID だけ公開予定のものを入れておけば OK です
あとは省略してください
firebase_admob_setting_app.png

GoogleService-Info.plist を入手する

上記の情報を入力して「アプリの追加」をクリックすると GoogleService-Info.plist というファイルがダウンロードできます
これをプロジェクトの直下にコピーしましょう
以下のような感じで配置すれば OK です
firebase_admob_copy_info_file.png

ファイルの中身は Admob で使用するテスト用の広告ユニット ID が記載されている他、Push Notification (GCM) の情報やデータストアの情報など Firebase を利用するための情報が XML 形式で記載されています

AppDelegate.swift で Firebase の初期化をする

さて、ここからは Xcode でプログラミングをしていきます
まずは Firebase を使うための初期化です
これは簡単で AppDelegate.swift に以下の 2 つ追記するだけです

import Firebase

import 文は冒頭に追記してください

FIRApp.configure()

上記メソッドは didFinishLaunchingWithOptions 内のどこかで宣言してください
心配であれば return true の前に追記すれば OK です
これで Firebase を使う準備ができました

GADBannerView を追加する

Storyboard を使って View を追加していきます
View を一つ追加して、更にその上に View を追加しましょう
オートレイアウトは各人の環境に併せて適当に設定してください
バナーをこの View に表示するので最低でも 50 以上にしておいてください
firebase_admob_insert_bannerview.png

そして追加した 2 つ目の View を CustomClass で GADBannerView にすれば OK です
firebase_admob_setting_gadbanner.png

GADBannerView を IBOutlet としてコードに追加する

Storyboard で追加した View をコードに紐付けます
Xcode 上で画面分割モードにして GADBannerView を選択して Ctrl を押しながらコード側にドラッグアンドドロップすれば OK です

名前は bannerView にしましょう
以下のような感じで swift ファイル側に追加できれば OK です

@IBOutlet weak var bannerView: GADBannerView!

GADBannerView に広告ユニット ID を設定する

コード側に追加した bannerView に広告ユニット ID を設定しましょう
viewDidLoad に以下を追記しましょう

import GoogleMobileAds

は冒頭に追記してください

override func viewDidLoad() {
    super.viewDidLoad()
    bannerView.adUnitID = "ca-app-pub-3940256099942544/2934735716"
    bannerView.adSize = kGADAdSizeSmartBannerPortrait
    bannerView.rootViewController = self
    bannerView.loadRequest(GADRequest())
}

上記で設定した広告ユニット ID は Admob が提供しているテスト用の ID になります
なので、本番で利用する広告ユニット ID を Admob の画面から取得しておきます
テスト用のユニット ID だと広告のサイズがバナーになっていないためかうまく表示されないことがあったので、アプリ用の ID を取得しておきます (どうせ、公開するときには変更しなければいけないので)

Admob にアクセスしたらログインします
ログインするユーザは Firebase と同じ Google アカウントにしたほうが良いです
「新しいアプリを収益化」からアプリを作成します
するとアプリの情報を入力する画面になるので入力していきます
ここでもまだアプリを公開していない場合は「アプリを手動で追加」からアプリを追加してください
firebase_admob_creating_admob_app.png

ポイントは 2 つ目の広告ユニットの設定でここで必ずバナー広告を選択するようにしてください
firebase_admob_setting_admob_app.png

アプリを作成すると本番で使用する広告ユニット ID が払い出されるので、コード側の bannerView.adUnitID に設定しましょう

ちょっとおまけ

GADBannerViewDelegate を継承して以下のメソッドを追加しておくと広告が取得できなかったときやうまく取得できたときのイベントを追えるのでデバッグしやすくなるかもしれません

// Admob から広告が取得できなかったときに呼ばれます
func adView(bannerView: GADBannerView!, didFailToReceiveAdWithError error: GADRequestError!) {
    print("didFailToReceiveAdWithError")
}

// Admob から広告が取得できたときに呼ばれます
func adViewDidReceiveAd(bannerView: GADBannerView!) {
    print("adViewDidReceiveAd")
}

また、その場合は bannerView の delegate に self を設定してください

bannerView.delegate = self

動作確認

では、アプリを起動してみます
今回は広告のタイプをバナーでサイズを kGADAdSizeSmartBannerPortrait というものにしています
これは動的にサイズを変更してくれる設定でスマホを縦にしたり横にしたりしても適切なサイズの広告を毎回取得してくれます
以下のような感じで表示されると思います


firebase_admob_ret_portrait.png


firebase_admob_ret_landscape.png

一応注意としては本番用の広告ユニット ID を使っているので、テストの状態で自分の実機などで広告をクリックするとアウトらしいので、クリックしないようにしてください

トラブルシューティング

  • STOP!! Will reset deviceID from memory.

となり広告が表示できないことがあった
対処方法としては Admob で広告を追加するときに広告タイプを「テキスト」「画像」の 2 つを表示しないとダメでした
はじめはテキストだけにしていたのですが、どうやらそれだと表示できないことがあるようです

  • NSLocalizedFailureReason=Request Error: No ad to show.

didFailToReceiveAdWithError メソッドがいつもコールされて広告が表示れない場合の対処ですが、コード上の設定や Storyboard 上の設定が何も間違っていなくそれでも上記のエラーが発生する場合は少し時間を置いて試してみましょう
Google Adsense 等もそうですが、広告がすぐに表示されないことがあります
自分の間隔だと 1 時間おけば確実に表示されます

最後に

iOS アプリに Firebase 版の Admob を導入する方法を紹介しました
基本つまづくことはなさそうですが、細かいところ (広告ユニットのサイズや広告ユニット ID を正しく設定するところなど) は若干ハマりそうな印象を受けました
それでも昔に比べたら格段に iOS アプリに広告を入れる方法は簡単になったと思います

あと、タイトルにもあるように今回は Xcode7 での手順です
Xcode8 だと追加の手順があるはずなので、それも検証して記事にできればと思います

参考リンク

2016年10月24日月曜日

avrdude: no programmer has been specified on the command line or the config file

概要

Arduino Pro mini にスケッチを書き込もうとしたら発生しました

avrdude: no programmer has been specified on the command line or the config file
Specify a programmer using the -c option and try again

解決方法を紹介します

環境

  • Mac OS X 10.10.5
  • Arduino IDE 1.6.7

対応方法

Arduino IDE 1.6.7 だと発生するようです
ボードのファームウェアのバージョンを上げていても本体自体のバージョンが古いと等がエラーが発生するようです

自分は Arduino IDE 1.6.12 のバージョンアップしたら該当のエラーが発生しなくなりました

古い人で該当エラーが発生する場合は公式からダウンロードしてバージョンアップしてみてください

2016年10月22日土曜日

Arduino で IMBLE を試してみた

概要

IMBLE は interplan が提供する Bluetooth Low Energy 用の無線通信モジュールです
シリアル通信を代用できる無線モジュールがほしかったので、試してみました
Arduino で拾った信号を IMBLE に送信して、それを Bluetooth で飛ばしてみます

環境

組み立ておよびハンダ

まず組み立てです
今回はブレッドボード上で使用したかったので、2.54mm ピッチの変換基板を使います
本体と変換基板を組み立てます
組み立ては簡単ではめるだけになります
わかりやすいように線が引かれているのと、固定するためのスペーサのくぼみがあるので、それに合わせてピンヘッダの部分をはめ込めば OK です
imble_and_arduino_assemble1.jpg

合体するとこんな感じになります
imble_and_arduino_assemble2.jpg

あとはハンダ付けです
これは必須ではないです
というのも、変換基板にすでに 26 ピンのソケットがついておりこれを使っても全然問題ないからです
自分はブレッドボード上で使いたかったのでピンヘッダをつけました
が、実はブレッドボードにもちょっと工夫しないとはめ込むことができません
先ほど紹介した 26 ピンのソケットが邪魔をするためのブレッドボードの先頭部分でないと挿すことができませんでした
実際にピンヘッダをハンダ付けしてブレッドボードに挿した図は以下の通りです
imble_and_arduino_handa.jpg

写真だと見えないですが、出っ張っている右側のちょうど裏側に 26 ピンのソケットが飛び出しているためこの場所でないとブレッドボードに挿せませんでしえた

配線

今回の配線の全体図は以下の通りです
基本は Arduino 側で拾ったスイッチの情報をシリアル通信を使って IMBLE 側に送信する回路になります
imble_and_arduino_circuit.jpg

ちょっと複雑に見えるので簡単に説明します
まず上部はブレッドボードは Arduino pro mini でスイッチの情報をアナログピン 6 番で読み込んでいるだけなので、それほど重要ではありません

ポイントは下部のブレッドボードになります
配線は以下のとおり

  • IMBLE VCC (上の段の左から 3 ピン目) -> Arduino VCC
  • IMBLE GND (下の段の左から 3 ピン目) -> Arduino GND

まずこの 2 つの配線で IMBLE に電源を入れています
これだけでもアドバタイズは始まるので、スマホで見つけることができます
※下の段の配線はブレッドボードギリギリだったので、IMBLE の下からジャンパワイヤを引いて、右側に出しています
残りの IMBLE の配線は以下の通り

  • IMBLE MODE (下の段左から 4 ピン目) -> Arudino GND
  • IMBLE RxD (下の段右から 2 ピン目) -> Arduino TX0
  • IMBLE CTS (下の段右から 1 ピン目) -> Arduino GND

という感じです
あとで詳細にも説明しますが CTS は SLEEP REQUEST というピンでスリープ状態を無効にするために GND に接続しています
MODE はデータ通信モードにするために GND に接続します
RxD で Arduino からのシリアル情報を受け取っています

とりあえずここまで配線にしてから起動するとこの後もうまくいきます

IMBLE の変換基板のピンアサインの詳細は以下の通りです
下の写真を横にして使っています
imble_and_arduino_pins_info.png

imble_and_arduino_pins_info2.png

スケッチ

アナログピンで拾った値 (今回の場合スイッチが押されたという値) が 0 以上の場合に Serial.print と Serial.println を使ってコマンドと送信したいデータを 16 進数で送信しています

スケッチ自体は非常に簡単なものになっています

void setup() {
  Serial.begin(19200);
}

void loop() {
  int val = analogRead(6);
  if (val > 0) {
    Serial.print("TXDT ");
    Serial.println(10, HEX);
  }
  delay(1000);
}

スケッチの書き込みをするときは Arduino TX0 と IMBLE RxD の接続は解除してから行ってください

説明詳細

スケッチと配線の説明をちょっと詳細に行います

IMBLE へのデータや命令の送信は基本的にコマンドを通して行われます
※各種コマンドの詳細は公式ドキュメントが参考になると思います
今回スイッチが押されたときに 10 (0x0B) を送信しましたが、その前にデータを送信するという「TXDT」という命令を送っています
ただ 10 を送信しただけだと IMBLE 側はデータを受け取ってくれません

また、コマンドの区切り文字として改行が必要なので、Serial.println を使ってデータを送信しています
Serial.write を使う場合は、別途改行コードを最後に送信する必要があります

配線時に GND に入れた SLEEP REQUEST (2 ピン) と MODE (14 ピン) というピンなのですが、デフォルトで電源を入れるとこれが High (有効) の状態で上がってきます
SLEEP REQUEST は読んで時のごとく High の場合スリープ状態となり一切のコマンドを受け付けなくなります
MODE は予約モード (High) とデータモード (Low) があり、データのやり取りを行う場合は Low に入れる必要があります
なので、どちらも GND (Low) につないだ状態で起動してあげると起動した直後でもデータのやり取りが行えるようになります
本来は Arduino の別のデジタルピンを使って Low にしてあげてスリープモードを解除してからコマンドを送ったほうが省電力な使い方にはなると思います

動作確認

では、動作確認しましょう
スケッチを書き込んで配線しましょう
今回は LightBlue という iOS アプリを使って動作確認します
スマホの Bluetooth を ON にしてアプリを起動すると IMBLE がアドバタイズしていると思います (IMBLE029C)
見つかったら選択しましょう
imble_and_arduino_ret1.png

あとは、Arduino から送信される信号を Notify で待ち受けます
Services の一覧になったら Properties に Read, Notify を持つ Characteristics が下の方にあるので選択します
そしたら、Listem for notifications をタップして Arduino からの信号を待ち受ける状態にします
そしてたら Arduino 側のスイッチを押してみましょう
以下のようにスマホ側でデータが受信できるのを確認できると思います
imble_and_arduino_ret2.png

最後に

IMBLE と Arduino で Bluetooth でのデータのやり取りを試してみました
最大のポイントは IMBLE の MODE と SLEEP REQUEST ピンを GND に入れる必要があったのと、送信したいデータをシリアル通信される前にコマンドを送信する必要があることでした

あとちょっと感じたのは、スマホとペアリングするときに若干時間がかかる印象でした
他の BLE モジュールだとペアリングに 1 秒程度しかかからないのが、IMBLE だと 3 秒くらいかかる感じでした

一番辛かったのは全くドキュメントがなかったことでしょうか
Arduino と連携するくらい基本かと思ったのでドキュメントもたくさんあるだろうと思ったのですが全くなく公式のドキュメントとにらめっこしながらやるのは、ちょっと素人には厳しかったです

参考サイト

2016年10月21日金曜日

Arduino Pro mini のアナログピン 4 番以降を制御してみた

概要

Arduino Pro mini は通常のピン配列だけでアナログピンを 4 つ制御することができます (A0 から A3)
実は基板上ではアナログピン 4 番から 7 番まで制御することができるスルーホールがありここにピンヘッダを取り付けることでアナログピンとして使用することができます
今回はヘッダピンをハンダ付けしてアナログピンの 4 から 7 番を使ってみました

環境

  • Mac OS X 10.12
  • Arduino IDE 1.6.12
  • Arduino Pro mini (5V, 16Hz)

ヘッダピンのハンダ

まずはヘッダピンをハンダ付けしていきます
必要になるヘッダピンは 2 x 1 のヘッダピンが 2 セット必要になります
try_promini_analog4567_handa1.jpg

これを通常のピン配列よりも中にある 4 つのスルーホールにハンダ付します
ハンダ付けは長いヘッダが上に来るようにハンダ付けします
try_promini_analog4567_handa2.jpg

完成するとこんな感じです
ブレッドボードには刺さずジャンパケーブルのメス側を追加したヘッダピンに挿すことになります
try_promini_analog4567_handa3.jpg

配線

動作確認のための配線です
今回はセンサ等でアナログ値を取得せず単純にスイッチが ON になった値 (1023) をアナログ値で取得してみたいと思います
try_promini_analog4567_circuit.jpg

追加したヘッダピンにはジャンパケーブルオス x メスを挿してください
先ほども記載しましたがブレッドボード上には刺さっていないのでメスピンを挿す必要があります
ちなみに追加したアナログピンの配列は写真向かって左から A6, A7, A4, A5 という順番になっています

スケッチ

アナログピンを読み込むだけの簡単なスケッチです
ピン番号を 4 から 7 番に変更して動作確認していきます

void setup() {
  Serial.begin(9600);
}

void loop() {
  int val = analogRead(4);
  Serial.println(val);
  delay(1000);
}

動作確認

では、スケッチを書き込んで動作確認してみましょう
スイッチを押すと 1023 が読み取れるのが確認できると思います
try_promini_analog4567_ret.png

最後に

Arduino Pro mini のアナログピン 4 番以降を制御してみました
ピンヘッダさえ挿してしまえば普通に使えます
ただ、ポイントとしてはジャンパケーブルのメス側を挿す必要があるので、ない場合は準備する必要があります
Arduino UNO とかはデフォルトだとアナログピンが 6 ピンしか使えないので、そう考えると小型で安価な Arduino Pro mini はすごいと思います

あえてデメリットを言うなら、FTDI の USB シリアル変換アダプタがスケッチの書き込みに必要なくらいでしょうか

2016年10月20日木曜日

Java で形態素解析 kuromoji を使ってみた

概要

Java で形態素解析を使いたいと思っていて探していたら kuromoji という jar だけで動作する形態素解析ライブラリを発見したので使ってみました

環境

  • Mac OS X 10.11.6
  • Eclipse Mars 4.5
  • Java SDK 1.8.0_25
  • Maven 3.3.3
  • kuromoji 0.7.7

ライブラリインストール

今回は Maven を使っているので以下を pom.xml に追加すれば OK です

  • pom.xml
<repositories>
  <repository>
    <id>ATILIKA dependencies</id>
    <url>http://www.atilika.org/nexus/content/repositories/atilika</url>
  </repository>
</repositories>

<dependencies>
  <dependency>
    <groupId>org.atilika.kuromoji</groupId>
    <artifactId>kuromoji</artifactId>
    <version>0.7.7</version>
    <type>jar</type>
    <scope>compile</scope>
  </dependency>
</dependencies>

既に repositories と dependencies タグがある場合はそこに追加してください
記載したら mvn install を実行してライブラリをインストールしてください
Eclipse の場合は追記したら自動的にダウンロードが始まるかもしれません

トラブルシューティング

自分の場合以下のエラーがずっと消えず困りました

[ERROR] Failed to execute goal on project sample: 
Could not resolve dependencies for project test-mvn:sample:jar:0.0.1-SNAPSHOT: 
Failure to find org.atilika.kuromoji:kuromoji:jar:0.7.7 in http://www.atilika.org/nexus/content/repositories/atilika was cached in the local repository, 
resolution will not be reattempted until the update interval of ATILIKA dependencies has elapsed or updates are forced -> [Help 1]

調べてみると .m2 配下にディレクトリはあるのですが、肝心の jar がなくエラーになっていました
仕方ないので本末転倒ですが、jar だけダウンロードして .m2 リポジトリの該当するディレクトリに手動でコピーしました

これでプロジェクトをクリーンすれば mvn install が通るようになりました

サンプルコード

与えられた文章を解析します
名詞だけを取り出して最終的にスペースで区切った文字列を生成します

  • src/main/java/test_mvn/sample/App.java
package test_mvn.sample;

import java.util.ArrayList;

import org.atilika.kuromoji.Token;
import org.atilika.kuromoji.Tokenizer;

public class App {
    public static void main(String[] args) {
        String word = "ご予約受付中!threezeroさんアイテム「Skull Knight (髑髏の騎士)」☆";
        Tokenizer tokenizer = Tokenizer.builder().build();
        ArrayList<String> surfaceForms = new ArrayList<String>();
        for (Token token : tokenizer.tokenize(word)) {
            if (token.getAllFeaturesArray()[0].equals("名詞")) {
                surfaceForms.add(token.getSurfaceForm());
            }
        }
        String ret = String.join(" ", surfaceForms.toArray(new String[0]));
        System.out.println(ret);
    }
}

あとは App.java を直接「Java Application」として実行すれば OK です
Maven 経由で実行したい場合は mvn exec:java が実行できるようにプラグインをインストールすれば OK です

最後に

kuromoji という Java の形態素解析ライブラリを使って見ました
有名な Java の形態素解析に Sen というものがありますが、これは辞書のインストールや sen という本体プログラムのインストールするなど他の準備を行う必要がありました

kuromoji はその辺の作業が不要で jar だけインストールすれば良いのでかなり簡単に使えました
辞書も ipa や juman の辞書をカスタムで使えるようにできるので、すでに辞書がある場合も使いまわすことができます

参考サイト

2016年10月19日水曜日

LINE Messaging API をとりあえず試してみた

概要

10.18 に LINE BOT API Trial Account の廃止とともに LINE Messaging API が公開になりました
さっそく Messaging API を試してみたので紹介します

環境

  • LINE@ Manager 2016/10/19 時点の UI
  • LINE Developers 2016/10/19 時点の UI
  • Ruby 2.2.3p173
  • gem 2.4.5.1
    • sinatra 1.4.7
    • line-bot-api 1.0.0
  • Heroku + Fixie

LINE Business Center での作業

まずは、ボット用のアカウントの作成を行います

LINE Business Center へのログイン

LINE Business Center のサービス一覧から Messaging API を選択し Messaging API のトップ画面を表示したら「Messaging API を始める」を選択しましょう
try_line_msging_api_top_page.png

すると LINE Business Center にログインする画面になるのでログインしてください
このアカウントは普段スマホ等で利用している LINE アプリの ID/PW になります
try_line_msging_api_login.png

次に組織を選択する画面になるので組織情報を選択します
会社を登録したい場合には新規で追加しても良いですが、今回は個人で進めるのですでにある下の欄にある個人名義の組織を選択すれば OK です
try_line_msging_api_choise_org.png

ボット用のアカウントの作成

次の画面でボットのアカウントを作成することができます
名前、アイコンを適当に決めたらアカウントの業種を選択しましょう
今回は「個人」「個人 (IT・コンピュータ)」を選択しました
例えばグルメ情報を配信するボットなのであれば「飲食店・レストラン」とかを大業種に選択すると良いと思います
try_line_msging_api_input_bot_info.png

「確認する」をクリックすると確認画面になるので、問題なければ「申し込む」で申し込んでください

LINE@ Manager での作業

作成したアカウントが Messaging API を使えるための設定を行っていきます

Messaging API を有効にする

アカウントの登録が完了した画面から「LINE@ Manager」に移動できるので移動してください
LINE@ Manager は作成したアカウントの設定やメッセージの管理ができる所謂コンパネになります
アカウントごとに準備されているので、アカウントごとに切り替える必要があります

アクセスできたら左メニューから「アカウント設定」->「Bot 設定」と選択します
「API を利用する」というボタンが右ペインに表示されると思うので、選択し Messaging API を利用できるようにします
try_line_msging_api_enable_api.png

ちなみに上記を実施した後、LINE Business Center のアカウントリストを見ると Messaging API がアカウントに追加されていることがわかります
try_line_msging_api_confirm_status.png

リクエスト設定 を有効にする

引き続き LINE@ Manager で作業します
「アカウント設定」->「Bot 設定」を選択します

リクエスト設定という欄があると思うので「利用する」にチェックを入れて「保存」を選択します
try_line_msging_api_enable_webhook.png

これは何の設定かと言うと、ボットに話かけた際に実際に何か処理をするサーバに対して Webhook を送信することで、そちらで具体的な処理が開始できるようにしています
もちろんこの Webhook で送信される情報にボットに話しかけた際のメッセージや誰から話かけれたかなどの情報が含まれています

またこの画面で同時に以下の詳細設定を変更することができます

  • Botのグループトーク参加
  • 自動応答メッセージ
  • 友だち追加時あいさつ

必要であれば変更しましょう
今回はとりあえずデフォルトのまま進めます

LINE Developers での作業

実際にボットが動作するサーバのための設定を行います

Channel Access Token の確認

LINE Business Center のアカウントリストから「LINE Developers」を選択してください
すると LINE Developers という新たな管理画面に移動します
try_line_msging_api_move_developers.png

LINE Developers では主にチャネルと呼ばれる Messaging API を呼び出すために必要なボットの認証情報やサーバの設定を行います

「Basic Information」に「Channel Access Token」という欄があります
そこの「ISSUE」というボタンをクリックすると認証に必要なトークンが表示されるのでメモしておきましょう
try_line_msging_api_issue_token.png

Webhook URL と Server IP Whitelist の設定

ボット用のアプリケーションをデプロイしたサーバの情報を設定する必要があります
先にアプリケーションを作成する必要があるので後述します

アプリケーションの作成

ではボットのアプリケーションを作成していきます
今回は Ruby の line-bot-sdk-ruby を使ってアプリケーションを開発しデプロイ先は Heroku とします

アプリケーションの開発

とりあえずオウム返しするボットアプリケーションを作成してみます

  • cd /path/to/work
  • bundle init
  • vim Gemfile
gem 'sinatra'
gem 'line-bot-api'
  • bundle install
  • vim app.rb
require 'sinatra'
require 'line/bot'

class HTTPProxyClient
  def http(uri)
    proxy_class = Net::HTTP::Proxy(ENV["FIXIE_URL_HOST"], ENV["FIXIE_URL_POST"], ENV["FIXIE_URL_USER"], ENV["FIXIE_URL_PASSWORD"])
    http = proxy_class.new(uri.host, uri.port)
    if uri.scheme == "https"
      http.use_ssl = true
    end

    http
  end

  def get(url, header = {})
    uri = URI(url)
    http(uri).get(uri.request_uri, header)
  end

  def post(url, payload, header = {})
    uri = URI(url)
    http(uri).post(uri.request_uri, payload, header)
  end
end

def client
  @client ||= Line::Bot::Client.new { |config|
    config.httpclient = HTTPProxyClient.new
    config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
    config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
  }
end

get '/' do
  "Hello, world"
end

post '/callback' do
  body = request.body.read

  signature = request.env['HTTP_X_LINE_SIGNATURE']
  unless client.validate_signature(body, signature)
    error 400 do 'Bad Request' end
  end

  events = client.parse_events_from(body)
  events.each { |event|
    case event
    when Line::Bot::Event::Message
      case event.type
      when Line::Bot::Event::MessageType::Text
        message = {
          type: 'text',
          text: event.message['text']
        }
        client.reply_message(event['replyToken'], message)
      when Line::Bot::Event::MessageType::Image, Line::Bot::Event::MessageType::Video
        response = client.get_message_content(event.message['id'])
        tf = Tempfile.open("content")
        tf.write(response.body)
      end
    end
  }
  "OK"
end
  • vim config.ru
require 'bundler'
Bundler.require

require './app'
run Sinatra::Application
$stdout.sync = true

でアプリケーションの開発は OK です
IP を固定化して動作させる必要があるためローカルでは動作しません
今回は Heroku 上で動作させるので Heroku にデプロイしていきます

アプリケーションのデプロイ

ターミナルから Heroku にデプロイしていきます

  • cd /path/to/work/
  • git init
  • git add .
  • git commit -m "Initial Commit"
  • heroku create --app your-line-bot
  • heroku git:remote --app your-line-bot
  • git push heroku master
  • heroku config:set LINE_CHANNEL_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx LINE_CHANNEL_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx --app your-line-bot

でデプロイできます
今回は新規で Heroku 上にアプリケーションをデプロイしています

Fixie アドオンの有効化

過去 に Heroku + Fixie を紹介したのでそれと全く同じ手順で有効にしてください

heroku config で設定する項目も同じなので Fixie を有効後に Fixie の Host と ID/PW を設定してください
有効時に Fixie から払い出された IP アドレスをメモしておいてください

再び Webhook URL と Server IP Whitelist の設定

アプリケーションをデプロイできれば、LINE Developers で Webhook URL と Server IP Whitelist の設定ができます

まず Webhook URL は Heroku にデプロイしたアプリの /callback にアクセスする URL を設定してください
一番下に「Edit」ボタンがあるのでクリックします
Webhook URL の欄にデプロイしたアプリケーションの URL を入力し「Save」します
try_line_msging_api_config_webhook.png

次に Server IP Whitelist を登録します
左メニューから「Server IP Whitelist」を選択し Fixie から払い出された IP アドレスを設定していきます
try_line_msging_api_config_white_ips.png

Fixie の IP アドレスはコマンドラインでアドオンを追加したときに確認できます
もし、忘れてしまった場合は https://dashboard.usefixie.com/#/account で確認することができます

動作確認

まずは今回作成したボット用のアカウントと LINE アプリで友達になりましょう
QR コードを読み込むなり適当に友達になるボタンをサイトに配置してスマホでアクセスして友達になってください

今回のボットの場合友達になった瞬間メッセージが届くと思います
これは今回の Messaging API で新たに追加になった「友だち追加時あいさつ」の機能を ON にしているためです

適当にメッセージを送信してみましょう
するとボットがオウム返ししてくると思います
しかもそのときにまた謎のメッセージが返ってくると思いますがこれは「自動応答メッセージ」機能を無期限で ON にしているためどんなメッセージに対しても必ず返してしまいます

この辺の「友だち追加時あいさつ「自動応答メッセージ」を OFF にしたい場合は先ほど紹介した LINE@ Manager から Bot 設定で詳細設定を変更できるので試してみたください
try_line_msging_api_test_bot.png

最後に

新しくなった LINE Messaging API を試してみました

前回の BOT API Trial Account に比べて機能が拡充したのと LINE@ Manager なる管理画面が増えたおかげで、自動応答のメッセージや定期配信などがプログラミングなしで行えるようになったのは、嬉しい点だと思います
導入障壁が低くなったという感じも少し感じました

ただ、API の互換性やイベント名前などプログラミングレベルでは結構互換性が崩れていたので、前のボットをそのまま利用するのは厳しいと思います

一番自分が厄介だなと感じたのは、機能うんぬんよりも「LINE Business Center」とか「LINE@ Manager」とか「LINE Developers」とか「Messaging API」とか「Channels」とか言葉がたくさん出てくるところでした
要するにそれらの概念が非常にイメージしにくかったです
試してみるとそれぞれがどういう意味でどういう機能を持っているかわかるのですが、初見だと言葉だけで意味や概念を理解するのは少し大変なんじゃないかなと思いました

とりあえず基本の動作方法はわかったので、この後は新しく追加になったグループ投稿やリッチコンテンツ作成などを試してみたいと思います
そして、せっかくなので LINE BOT AWARDS 2016 にも参加してみたいと思います

参考サイト

2016年10月18日火曜日

nodejs で mysql にアクセスする方法

概要

nodejs で mysql にアクセスする方法を紹介します
他の方法も Web 上にたくさんあるので備忘録として残しておきます

環境

  • CentOS 6.7 64bit
  • node 4.2.5
  • npm 2.14.12
    • mysql 2.11.1
  • MySQL Server 5.6.22

ライブラリインストール

  • npm init
  • vim package.json
"dependencies": {
  "mysql": "latest"
}

を追記する

  • npm install

サンプルコード

  • vim index.js
var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : '192.168.0.10',
  user     : 'user',
  password : 'password',
  database : 'test_db'
});

connection.connect(function(err) {
  if (err) {
    console.error('error connecting: ' + err.stack);
    return;
  }
  console.log('connected as id ' + connection.threadId);
});

connection.query('SELECT count, day FROM test_table', function (error, results, fields) {
  results.forEach(function(record) {
    ret = {
      "count": record.count,
      "day": record.day
    };
    console.log(ret);
  });
});
  • node index.js

でレコードの情報が表示されれば OK です
他に気にすることは MySQL が立ち上がっているかや MySQL Server への接続ができるかどうかを確認してください

最後に

基本的な使い方を紹介しました
他にも nodejs にはいろんな OR Mapper や SQL builder もあるので、そっちを使っても全然問題ないと思います

とりあえず基本ぽかったので mysql ライブラリを使ってみました

2016年10月15日土曜日

redash のアラート機能を試してみた (Webhook 編)

概要

redash のアラート機能を試してみました
今回は Webhook のアラートを IFTTT を使って試してみました
redash サーバは Ubuntu 上の Docker に構築します

環境

  • Ubuntu 16.04 LTS
  • Docker 1.12.2
  • docker-compose 1.8.0
  • redash 0.11.1+b2095

事前準備

Ubuntu 上に Docker をインストール方法はこちら
インストールした Docker 上に redash を構築する方法はこちら

などを参考に redash が動作する環境を構築しておいてください

データソースの作成とクエリの作成

これも過去の手順に沿って作成してください
今回は MySQL をデータソースとして進めていきます

通知先の設定 (Webhook)

とりあえずお手軽な Webhook を試します
Webhook 先は IFTTT の Maker を使います
Maker の設定はここでは詳しく紹介しませんが、 Maker 用の URL に Webhook が送信されると Slack に通知するようなレシピを作成します
try_redash_alert_config_maker.png

Maker の通知先の URL のフォーマットは以下の通りです
イベント名やトークンは各自のものに置き換えてください

https://maker.ifttt.com/trigger/{event}/with/key/xxxxxx-xxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxx

この情報を redash のアラートの通知先として設定します

まず通知先の設定ですが右上の設定ボタンっぽいやつから -> ALERT DESTINATIONS -> New Alert Destination と選択します
try_redash_alert_creating_alert_dst.png

すると Alert Destination を追加する画面になるので先ほどの IFTTT の Maker の情報を入力していきます
try_redash_alert_input_alert_dst.png

Name は適当に設定してください
Type に「Webhook」を設定します
Username, Password がベーシック認証があれば入力してください
Url は IFTTT の Maker で発行された URL を入力してください

問題なければ「Save」を選択します

アラートの作成

アラートの作成には事前にクエリを作成する必要があります

先ほど作成した Alert Destination にアラートをする設定を行います
上部の Alert から「New Alert」で追加します
try_redash_alert_creating_alert.png

するとアラートを設定する画面になります
まず、Query の欄に事前に作成しておいたクエリを入力します
今回は「count」というクエリを準備しました、あるカラムの値をカウントするだけのクエリになります
その後設定しなければいけないのは Op と Reference の部分です
ここにクエリで取得した値の条件を設定します
例えば「greater than」「0」と設定するとクエリの値が 0 以上のときにアラートが発泡されることになります
Rearm seconds はとりあえず空にしておきます (後述します)
できたら「Save」を押しましょう
try_redash_alert_input_alert.png

スクリーンショットを見るとわかりますが、赤帯でメールの設定がされていないという旨の警告が表示されます
今回はとりあえずメールでの通知は行わないのでそのままで OK です

Save を押すと右側に Notifications の設定が表示されます
デフォルトだとメールになっているので、プルダウンで先ほど作成した Maker の通知先を設定しましょう
設定したら「Add」をクリックしてください
try_redash_alert_add_notification.png

これでアラートの作成は完了です

動作確認

通知が来ているか確認してみましょう
クエリに設定したクロール時間が来て、そのときにアラートに設定された条件を満たしていると通知されます
アラートの一覧画面を見て「TRIGGERED」になっていれば通知が来るはずです
try_redash_alert_list_alerts.png

アラートが解消すると OK という表示に戻ります
try_redash_alert_list_alerts_ok.png

自分が検証した感じだとこの OK になったときにもアラートが飛んでくるようです

Tips

  • Rearm seconds について
    例えばこれを 30 秒とかで設定しておくと TRIGGERD の状態が 30 秒続くと再度通知してくれます
    基本は TRIGGERD <-> OK が切り替わったときにだけ通知してくれるのですが、Rearm seconds を設定しておくと TRIGGERD のときには設定した間隔で通知を続けてくれます
    何も設定していないと切り替わったときにだけ通知してくれます

最後に

redash のアラート機能の 1 つである Webhook 機能を試してみました
今回は IFTTT と連携しました
IFTTT と連携することで簡単に redash にアラート+通知機能を追加することができました

Webhook を使っていて少し困ったのはアラートが発生したときの情報を Webhook 先でどうやって取得するのかわかりませんでした
要するにアラートが発生したときの値 (クエリで取得した値) を Slack に載せたかったのですが、取得する方法がわからず諦めました
Webhook 先を自分のサーバとかにしてリクエストをデバッグしたりすればもしかしたらヘッダとかに含まれているかもしれません

あとは、通知としてメールと Slack と Hipchat に対応しているのでこの辺も試してみたいと思います