2017年12月18日月曜日

ロボホンをタブレットで操作

タブレットとロボホンの連携についてお話します。
実際のコードなどの説明はしませんが、参考になればと思います。


ロボホンを借りることがあったので、少し遊んでみました。

踊ったり、歌ったり、逆立ちしたりもする芸達者なやつでしたが、
私がやってみたかったのはタブレットとの連携でした。

たまに、お店や案内所で見かけることもありますが、
ロボホンの横に置いてあるタブレットをタップすると、
ロボホンがその内容に合わせて説明をしてくれたりします。

ペッパーも同じことをしてくれますが、ペッパーよりもロボホンの方が断然かわいいです。
そして比較的安価(高いけど・・)。

最近はWi-Fiモデルも発売されて、さらにリーズナブルになったようです。

ロボホン Wi-Fiモデル
http://www.sharp.co.jp/corporate/news/171002-c.html


さて、本題のロボホンとの連携についてお話します。

実際に作ったアプリは、
タブレットのボタンをタップしたら、ロボホンが「こんにちは」としゃべるアプリです。

* SDKダウンロード

まず、ロボホンのアプリを開発するためにはロボホン用のSDKが必要です。 ロボホンのサイトから誰でも取得できますが、アカウントの作成が必要です。 https://robohon.com/ アカウントを作成した後、マイページにログインし、 メニューの「ロボホンアプリ開発」からSDKをダウンロードすることができます。 あとは、AndroidStudioでプロジェクトを作って、ライブラリを登録します。 https://robohon.com/sdk/app.php

* アプリを開発

タブレットとロボホン、それぞれにアプリを開発する必要があります。 タブレットのアプリの方は、「こんにちは」というボタンを一つつけました。 ロボホンのアプリの方はサンプルコードがあるので、 それを見ながら命令を受けたら「こんにちは」としゃべるようにします。

* タブレットとロボホンの接続(Bluetooth編)

とりあえずタブレットとBluetoothをペアリングしたら出来るだろうという考えで プログラムを構築してみました。 ペアリングして、ボタンをタップすると「こんにちは」と喋ってくれたので、 意外と簡単にできたなー・・と思っていましたが、しばらく触ってみるとそうでもありませんでした。 アプリがバックグラウンドになるたびに接続が切断してしまい、 アプリを再度起動すると再接続しますが、それにも時間がかかってしまい、 とても実用的とはいえないアプリでした。 自分が案内所などで見たタブレットとロボホンは、 とてもスムーズに連携できていたように見えたので、きっと他の方法があるはず!と思って 別の方法を考えました。

* タブレットとロボホンの接続(Beacon編)

同じくBluetoothの機能を使いますが、Beaconならいけるかもと思い実装してみました。 ここでは、AltBeaconというのを使いました。 https://github.com/AltBeacon これを使用することで、Bluetoothの接続は安定しました。 しかし、Beaconの送信側では受信側へ受信できたかどうかの判断が出来ないため、常に同じデータを送信しますし、 受信側も受信し続けてしまうため、この方法も使うことはできないと判断しました。

* タブレットとロボホンの接続(Webサーバ編)

最終的にうまくいったのはこの方法です。 Webサーバといっても、別にサーバを用意するわけではなく、 ロボホン自体をWebサーバにするという方法です。 Android(ロボホン)の中にサーバを立てるといった方法は、見当もつきませんでした。 Webサーバを立てるためには、NanoHTTPDというライブラリを使用します。 https://github.com/NanoHttpd/nanohttpd HTTPプロトコルを使用して送受信が出来るので、送信側も受信側も安定した動作が可能になりました。 Wi-Fiネットワークだけは準備する必要がありますが、これぐらいなら簡単に準備できます。

* まとめ

あとはタブレットの操作でカメラを撮ったり、プロジェクターを投影したりと いろんな操作が想定できます。 ロボホンはたくさんの可能性を持ってると思うので、 見かけることが多くなるとうれしいかなと思います。

2017年7月20日木曜日

AWS ソリューションアーキテクト アソシエイト

東京に行く用事があったので、ついでにAWSの試験を受けてきました。
田舎の方では実施してないのが不便なところです。

次のスコアで、なんとか合格できました。
正答率:76%
1.高可用性、コスト効率、耐障害性、スケーラブルなシステム設計 72%
2.実装/デプロイ 66%
3.データセキュリティ 90%
4.トラブルシューティング 80%


勉強は4月ぐらいから3ヶ月かけてゆっくりやりました。
主に、活用資料集を流し読みしながら(あればオンデマンドセミナーも)、
メモにまとめる形で進めました。スライドよりもテキストの方が見直すときに便利なので。

デプロイ部分の点数が低い通り、あまりAWS自体には触っていません。
EC2 や VPC、S3、IAM くらいは触りましたが、あとはそれほど・・

実務では開発がほとんどで、
インフラ周りはあまり詳しくないので、その辺りの勉強が大変でした。
活用資料集でわからない単語があれば、できるだけ調べるようにしました。


資格試験自体、「ソフトウェア開発技術者(今の応用情報技術者)」を
6〜7年前に受験して以来だったので、なんとなく緊張しました。

試験問題はあまり考えすぎず、
自信のない問題は「これっぽいな・・」ぐらいの意識で進めた方がよさそうです。
それで20分ほど余ったので、そこからひたすら見直しました。

「Pass」と出たときは本当に安心しました。
過去にベンダー試験(LPIC)を1度だけ受けたことがありますが、
「not pass」が出たときは唖然としました。。ほぼトラウマです。


これから仕事でAWSを使っていくこともそうですが、
個人開発でも使いたいので、ある程度頑張って勉強しました。(会社から受験料出るし)

早く、名刺にAWSロゴを入れて、ドヤァ!!したいです。 

2017年5月30日火曜日

Amazon EC2 + FTPSサーバ + FTPSClient

Androidアプリ開発で Apache Commons Net の FTPSClient を使って、FTPS機能を作成した時のことをまとめます。


サーバをたてよう


検証できる環境がなかったので、FTPサーバを立てるところから始めます。
FTPサーバを立てたことがなかったですが、調べたら簡単そうだったのでやってみました。

まず、EC2でAmazon Linux AMIを使ってサーバを構築します。
FTPSのテストに使うだけなので、無料枠があれば無料枠内で使える最小の設定で大丈夫です。
こういった環境を簡単に作れる AWS は非常に良いですね。

ついでにセキュリティグループも設定しておきましょう。
インバウンドに次のルールを追加します。

タイプ プロトコル ポート範囲 ソース
カスタムTCPルール TCP 21 0.0.0.0/0
カスタムTCPルール TCP 50021-50040 0.0.0.0/0


ユーザを作ろう


FTPでログインするための適当なユーザを作ります。
ユーザを作り、パスワードを設定するには、次のコマンドを入力します。
$ sudo useradd ftp-user
$ sudo passwd ftp-user
> 新しいパスワードを入力します。
"ftp-user"の部分は、好きなユーザ名で構いません。
ユーザ名とパスワードはメモしておきましょう。


vsftpdをインストールしよう


EC2に入り(WindowsならTeraTermで)、次のコマンドを入力します。
$ sudo yum install vsftpd -y
これでインストールは完了です。簡単です。


証明書を作ろう


FTP over SSL/TLS を実現するために証明書を作ります。

証明書の作り方は割愛します。すみません。
ググったらいっぱい出てきます。

ちなみに私は次のサイトを参考にしました。


完成した鍵ファイルや証明書は /etc/vsftpd 配下に置きます。(どこでもいいですけどね)


FTPサーバを設定しよう


FTPサーバの設定ファイルをいじっていきます。
$ sudo vi /etc/vsftpd/vsftpd.conf
いろんなサイトを参考にコピペしながら頑張ってみましたが、なかなかログインできず苦労しました。
最終的な vsftpd.conf は以下になります。
anonymous_enable=NO
ssl_enable=YES
rsa_cert_file=/etc/vsftpd/ftp.pem
rsa_private_key_file=/etc/vsftpd/server.key
ssl_sslv2=NO
ssl_sslv3=NO
ssl_tlsv1=YES
allow_anon_ssl=NO
require_ssl_reuse=NO
force_local_logins_ssl=YES
force_local_data_ssl=YES
pasv_enable=YES
pasv_address=xxx.xxx.xxx.xxx
pasv_min_port=50021
pasv_max_port=50040
use_localtime=YES
ssl_ciphers=TLSv1
local_enable=YES
write_enable=YES
dirmessage_enable=NO
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
ascii_upload_enable=YES
ascii_download_enable=YES
ls_recurse_enable=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=NO
調べてもなかなか出てこなかったのが ssl_ciphers=TLSv1 ですね。
この設定がないことで、なかなか繋がらず苦労しました。

pasv_address の xxx.xxx.xxx.xxx には、EC2のIPアドレスを入れてください。
EC2のIPアドレスは再起動するたびに変わるので注意が必要です。(ElasticIPを設定してるなら別ですが)


FTPサーバを起動しよう


FTPサーバを起動します。次のコマンドを入力してください。
$ sudo service vsftpd start
[OK]が表示されれば、起動完了です。
失敗したら、vsftpd.conf に間違いがないかなど調べてみてください。

あとは接続が出来るかどうか FFFTP などのクライアントを使って、接続テストをしてみましょう!


Androidアプリに FTPSClient を組み込もう


通信なので、AsyncTask の中で実装するのが良いですね。
細かいところは省略しますが、次のコードで FTPS でアクセスできます。

FTPSClient ftpsClient = new FTPSClient();
try {
    ftpsClient.setConnectTimeout(10000);
    ftpsClient.setDefaultTimeout(5000);
    ftpsClient.connect("xxx.xxx.xxx.xxx", 21);
    ftpsClient.login("ftp-user", "password")
    ftpsClient.setFileType(FTP.BINARY_FILE_TYPE);
    ftpsClient.enterLocalPassiveMode();
    ftpsClient.execPROT("P");
    ftpsClient.setSoTimeout(5000);
    ftpsClient.setDataTimeout(5000);
    ftpsClient.changeWorkingDirectory(mPath)
    FileInputStream fisupload = new FileInputStream(filename);
    boolean result = ftpsClient.storeFile(filename, fisupload);
    fisupload.close();
} catch (Exception e) {
 Log.d("ftpTest", ftpsClient.getReplyString());
} finally {
    if (ftpsClient.isConnected()) {
        try {ftpsClient.disconnect();} catch (IOException e) {}
    }
    ftpsClient = null;
}

ここでのポイントは ftpsClient.execPROT("P"); ですね。
FTPSClient の Example にもなかったりして、これを見つけるまで苦労しました。

最初はエラーが多いが出るかもしれませんが、 ftpsClient.getReplyString() のメッセージを見ながら頑張りましょう。

2017年2月11日土曜日

Google Play デベロッパー ポリシー違反に関わる警告

2月7日にGoogleから「Google Play デベロッパー ポリシー違反に関わる警告」というメールが届きました。
どうやら、「住所のみ録」アプリがポリシー違反となっているということのようです。

急に届いたので、なんだろう・・と思いましたけど、プライバシーポリシーを設定していないなど、書いてることはもっともだったので、週末に直そうと思い対応しました。

調べてみると、やることは2つ。

  • Google Play Developer Console から対象アプリのプライバシーポリシーにリンクを設定する。
  • アプリ内からもプライバシーポリシーを確認できるようにする。

まず、プライバシーポリシーのページですが、Webサーバを持ってるわけではないので、当ブログにプライバシーポリシーのページを作成して対応しました。
簡単に書いたけど、こんなのでいいのかな・・もうちょっと訂正するかもしれません。

次にアプリの修正が大変。。と思いきや、
Googleがリリースしてるアプリを参考に調べてみると、プライバシーポリシーのページのリンクをアプリに埋め込んでるだけっぽい。
なので、意外と簡単そうでした。

アプリの修正はまた後日にしますが、3月15日までに対応しないといけないようなので、近いうちにします。

1ヶ月というのが、また長いようで短い。。


仕事上でもお客さんが対象になってないか見ないといけないな・・。

寂しいと思えるチーム作り

12月末で一つのプロジェクトが終わりました。 最後のデイリースクラムの時に、一年目のメンバーが「寂しいですね」と言ってくれました。何気ない一言でしたが、チームをまとめている私としてはとても嬉しい言葉でした。お世辞だったかもしれませんが、それでもうれしかったです。 自分としてはちゃ...