Life, Education, Death

プログラミング以外でも思ったことをつらつらと書きたい

hubotのインストールからアダプタ、スクリプトの自作まで

※2014/11/15 スクリプトの書き方加筆

オレオレシステムに投稿するためのボット作成にhubotを使ってみました。
公式ページの最新ぽいやり方でインストールを進めてみてハマったところをメモ。

インストール


hubot/README.md at master · github/hubot · GitHub

より

% npm install -g yo generator-hubot

 でyeomanというテンプレートからプロジェクト生成を行うツールとhubot用のテンプレートをインストール。

% mkdir myhubot
% cd myhubot
% yo hubot

適当にフォルダを作ってyoコマンドを使ってプロジェクト作成のウィザードを起動します。色々聞かれますが練習なら何も入力しなくていいはずです。
以下では全てmyhubotフォルダをカレントディレクトリに設定している前提です。

※既にhubotをインストールしていたらyo hubotのところでコケました

アダプタを作る

オレオレシステムに投稿するためのアダプタを作ります。投稿やタイムラインの受信を実装すればオレオレシステムにボットが動かせます。

node_modules/adapters/にアダプタのソースをおけばいいので

% cp node_modules/hubot/src/adapter.coffee node_modules/hubot/src/adapters/myadapter.coffee

を実行してテンプレートをコピー。
node_modules/hubot/src/robot.coffeeの

HUBOT_DEFAULT_ADAPTERS = [
  'campfire'
  'shell'
  'myadapter'
]
辺りを自作したアダプタ名を追加して保存する。

アダプタの実装方法はサンプルを見るかググった方が詳しいページが出てくるので割愛します。

% bin/hubot -a myadapter

で動作確認します。エラーが出なければ成功。

スクリプトを作る

スクリプトは実際のボットの動作を記述するもので、前述のアダプタのおかげで特定のシステム依存のコードを書く必要がないので使い回しが楽チン。
スクリプトにもテンプレートがあるのでそれを使えばOK。スクリプトはscriptsフォルダに配置したものが全て読み込まれるようです。
scripts/example.coffeeをコピーしてオレオレスクリプトを書き始めると良いでしょう。

割と公式の情報も充実しているので慣れてきたら読んでみようと思います。

hubot/adapters.md at master · github/hubot · GitHub

hubot/scripting.md at master · github/hubot · GitHub

 

実際に書き始めてみたら、self.emit 'connected'を実行しないとスクリプトの読み込みが進まなかったのでしばらくハマりました。
何かハマったら

export HUBOT_LOG_LEVEL="debug"

してから実行するとデバッグログが出るようになるので何かヒント見つかるかもしれません

絵を普段描かないから気づかなかったけど、絵描きも結構体系化されている知識があるんじゃないかと

前に熱中教室というイベントに行ってきて思ったんですが*1

車のデザイン画などは、右上がりになっている構図が多い印象があるのはデザイナーがみんな右利きなんじゃないかと。。。

熱中教室の山中先生の授業でデッサンするときに骨を意識して描きましょうというお話だったんですが、初級編として円を描く練習をやりました。
何周もクルクル描いてきれいな円になったらペンを抜きましょうという練習をしました。

正円はいいとして、斜めになっている円を描こうとしたら、どうも見本と同じように描けなくて苦労しました。
左上がりの円の方が描きやすく、右上がりの円が描きづらかったです。なので利き手によって描きやすさが異なるんだなと気づきました。
(似たような話をしている人もいますね http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1386268378

そうつまり、骨(構造)の問題だ!

絵を描くに当たって描きやすいものと、描きにくいものがあるって発見をしたわけです。
こんなことを知り合いに話していたら、熱中教室で教えてもらったような”骨を意識して描こう”とか描くときのハウツーを学校とかで教えてもらえるらしいことがわかりました。
絵を描くのは見稽古しかない世界かと勘違いしてましたが、実は高速道路*2あるじゃん!と感激したわけです。
実は知らないだけで、絵描き界のRuby on Railsみたいなものが実はあったりするんじゃないかと。。。
そういうものがもっと溢れて世界総アマチュア時代にやっぱり突入するんだろうし、それを加速させたいなと思いました。

 

全然ジャンルの違う勉強会やイベントに行っても色々発見があって面白いですね。
それにしても山中先生=骨展*3のイメージだったので、デッサンで骨の話をしだしたときは納得でしたw

おまけ 円の書き方など


動画で解説! 指だけでキレイな円を描く方法 | ライフハッカー[日本版]

このハックは練習しておいてもいいかも。


World Freehand Circle Drawing Champion - YouTube

すげーきれいに一発で書いてて面白いです。体をちゃんと使ってるのがポイントかと。

*1:3331熱中教室 8/9,8/10 | Peatix

*2:将棋羽生さんの学習の高速道路論

*3:21_21 DESIGN SIGHT

AndroidStudio0.4がご機嫌斜めです

Android Studioを更新するたびにトラブルになってるような気がする。

しばらくバージョンを上げていなくて、0.3系から0.4.2にアップデートしたところビルドが失敗するようになってしまった。

1つ目

公式にあるように、build.gradleに書いてあるgradleプラグインのバージョンを上げる対応が必要だった。

Change those to "0.7.0" (or 0.7.+ to pick up the latest dot release) :

http://tools.android.com/recent/androidstudio040released

2つ目

ビルド時に以下のようなエラーが出るようになってしまった。

: duplicate files during packaging of APK /XXX/myapp/build/apk/myapp-debug-unaligned.apk
Execution failed for task ':myapp:packageDebug'.
> Duplicate files copied in APK META-INF/DEPENDENCIES
File 1: /XXX/myapp/libs/httpmime-4.3.1.jar
File 2: /XXX/myapp/libs/httpmime-4.3.1.jar

使っているライブラリによってエラー内容は変わるが、何かプラグインのバグの模様。
ここに上がっているIssueにある解決方法のように

android {
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
    }
}

というように問題になっているファイルをどんどん除外していけばビルドが通るようになるようだ。

android {
    中略

    packagingOptions {
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/NOTICE'
    }
}

こんな感じにbuild.gradleに書いてどうにかビルドできた。


メモリダンプ(HPROFファイル)がAndroid Studioから取れるようになったらしいのでバージョンアップしたかっただけなのにかなりハマってしまった。

iOS側でカメラを使って撮った動画をAndroidで再生したいのですが

作ってるアプリで欲しかった機能についてかなりハマりながらもやっとどうにかなったのでメモ。
iOSで撮った動画をAndroidでもどうこうしたいってのがニーズが少ないんだろう…全然ぐぐっても出てこなかった。

環境

iOS:iPhone4
Android:Galaxy S2(Android 4.0.3)

結論

  • movはAndroidで再生しづらいのでmp4が無難

細かいところはちょろちょろ書きます

iOS

標準カメラだとmovで保存されてしまうので自前でカメラアプリを実装する必要がある。
よく見たら

という定数があってmp4で書き出すことが標準ライブラリで出来ました


カメラを自分でちゃんと実装するのは大変そうだったのでPBJVisionというライブラリを使っている。
PBJVisionは投稿時点では、kUTTypeQuickTimeMovieを指定して書き出されていたのでうまくAndroid側で再生できていなかった。
kUTTypeQuickTimeMovie -> kUTTypeMPEG4に書き換えて使った

Android

Androidが標準でサポートしているフォーマットは以下の通り。当然QuickTime形式はありません。
http://developer.android.com/guide/appendix/media-formats.html

ファイルフォーマットがmp4になってしまえばあとはAndroid標準のMediaPlayerクラスを使って再生する実装を行うだけ
この辺りを参考にしつつ実装を進めました。

MediaPlayerにサポート外のファイルを渡した場合にIOExceptionが発生した

具体的に書くと、PBJVisionをそのまま使っていたのでkUTTypeQuickTimeMovieで書き出した、.mp4ファイルを再生しようとして
MediaPlayer.setDataSourceを呼んだときに

java.io.IOException: setDataSourceFD failed.: status=0x80000000

という例外が発生していた。kUTTypeMPEG4を指定して書き出した場合にはうまく再生出来たのでAndroidで再生出来ない形式になってしまっていたというふうに考えている。これ以上詳細は調べられていないので何か知っている人がいたら教えて欲しいところ。

まとめ

カメラアプリでiOS-Android連携って聞かないからハマってもしょうがないのかも。

無事、iOSで撮った動画がAndroidで再生できました。

parse.comでプッシュ通知を実装してみた

どっかにちゃんと書いてあったけど割とハマった。

書き出し時にキーチェーンアクセスの分類->自分の証明書のところを選択しておかないと、書き出せないようだ。

Parse.comのサイトからはプッシュ通知ができるけど、アプリ側から発行できない

Parse.comのSetting->Push Notification->Client push enabled?
をONにする必要があった。設定していないと
送信リクエストがParse.com上では確認できるが、送信対象が0と表示されたり、Invalid Targetと表示されたりして、実際には届かない。

自分のアプリではプッシュ通知が受け取れたけど、Testflightで配布したアプリだとプッシュ通知受け取れない

プロビジョニングプロファイルの問題。配布用のプロファイルをTestflightでは使っていて、Apple Push Certificateの項目で設定した証明書が開発用のものにしていたのが原因だった。

無料版では、1つしか証明書が設定出来ないのでとりあえず配布用の証明書を設定した。

まとめ

すごく便利なのでみんな使おう!

プッシュ通知を送信する際に条件をつけられるので特定のユーザーやグループに対して送信する事が簡単に出来る。
また、ブラウザ上でも簡単にプッシュ通知を送信でき、送信リクエストも確認できるのでデバッグが楽チンでした

parse.comでプッシュ通知を実装してみた

AndroidからiOSに向かってプッシュ通知が出したかったので、parse.comを使ってみました。
ほとんどチュートリアル通りでサクサク実装できてparse.comすごく便利。ロックインされる問題はあるものの、スタートアップとか個人でやる場合は、どんどん使っていいんじゃないかなと。

チュートリアルをまずやりましょう

iOS版はここ
https://www.parse.com/tutorials/ios-push-notifications

Android版はここ
https://www.parse.com/tutorials/android-push-notifications


最初サインインしたときはもっとスマートなチュートリアルに案内されたんだけど、リンクが見つからない・・・。


Androidチュートリアルは特にハマるところなく出来た。
iOS版は証明書のやりとりがあったりするのでちょっと面倒でした。AppIDをワイルドカードにしてるとダメなので再発行したり色々ごにょごにょ。

iOS版の導入に際して
http://tech.aainc.co.jp/archives/3145
も参考にしました。
cocoapodがされてるようでセットアップ楽チン。

特にハマったところ

証明書を書き出す際に、p12ファイルが選択できない

WiiリモコンをAndroidで動かしたい(楽チン編)

目標

Wiiリモコンを使って自作アプリを動かしたい。あと出来るだけ手抜きで動作検証したい。

  1. Wiiリモコンをキーボードとして認識させるアプリをインストールする
  2. キーボードとして動作しているか確認する

※動作確認したのは、Xperia ray(Android2.3.4)です。特に特殊なことはしてないはずなので他のバージョンでも動作はするはず。しなかったら教えて欲しいです。

Wiiリモコンをキーボードとして認識させるアプリをインストールする

いくつかアプリはあるようですが
http://android-k.com/story/3029/
を参考にしつつ、SimpleWiiControllerをインストールした。

ダウンロードはこちらから

インストールしてペアリングしたら、無事認識されました。

キーボードとして動作しているか確認する

一行もコードを書きたくないのでこれも手抜きをした。

githubに上がっているキー入力を画面に出すだけのテストアプリをインストールして、wiiリモコンのボタンを押したときに適当な値が表示されるのを確認できました。

ダウンロードはこちらから

ソースコードは↓のような感じみたいなので、コピーして自分のアプリに組み込むのは簡単かと
https://github.com/chrisboyle/keytest/blob/master/src/name/boyle/chris/keytest/KeyTest.java

まとめ

無事、WiiリモコンAndroidで認識させて自分のアプリに組み込めそうなことを確認出来た。

もし、別のアプリをインストールしたくないとかあれば
http://wiibrew.org/wiki/Wiimote
とか見つつ、ペアリングの方法とか見て実装すれば出来るのではなかろうか?(試していません)