BounceBall#00 Androidアプリを作る

pebbleのことを先に書こうと思いましたが、今やっているAndroidアプリ作成について書こうと思います。

カメラで四角を検出して、その四角にボールが跳ね返るアプリを作りたい!
Androidアプリ初心者ですが頑張ります。
なぜこんなアプリを?というのはおいおい書きたいと思います。

ここで「カメラで四角を検出して、その四角にボールが跳ね返る」アプリを作るために必要な処理を考えます。

1. Androidでカメラを使う
2. 取得したカメラ画像から四角を検出し、その頂点の座標を取得する
3. ボールをAndroid画面上で動かす
4. ボールが四角に接触したことを検知する
5. 接触したら跳ね返す

こんな感じだと思います。
この5つの処理を順番にクリアにしていきます。

pebbleでHelloWorld

pebbleのwatchfaceを作ります。
まずはアナログ時計を作って見たいと思いましたが、今回はHelloWorldまでにしときます。

CloudPebbleにログイン

pebbleにはwatchfaceやwatchappを簡単に作るためのクラウド環境が用意されています。*1今回はそれで作ってみます。

CloudPebble

pebbleのアカウントでログインできると思います。

HelloWorld

ログインできたら、CREATEを選択してプロジェクトを作成します。

f:id:imoto-yuya-1234:20170130235556p:plain

PROJECT NAMEは適当にここでは SAMPLE01としました。
あとTEMPLATEはHelloWorldを選択しましょう。

これでプロジェクトが作成できました。
左側のCOMPILATIONを選択して、RUN BUILDされるとプロジェクトがbuildされます。それから下記のハードウェアを選択します。

  • APLITE : pebble classic
  • BASALT : pebble time
  • CHALK : pebble time round
  • DIORITE : pebble 2
  • EMERY : pebble time 2

すると左上にpebbleのエミュレータが描画されます。*2

f:id:imoto-yuya-1234:20170131001537p:plain

これであなたもpebbleプログラマです。

*1:いつまで使えるのでしょう。

*2:久しぶりに動作させていますが、ちょいちょいエミュレータのブートエラーがでます。CloudPebbleのバグ?

pebbleのwatchfaceを作りました

このタイミングでこんな記事を書くのもどうかと思いましたが、せっかくやったことなので書こうと思います。*1

去年(2016)のゴールデンウィークあたりにpebble time roundを購入して、watchfaceを3つ作りました。

この3つです。まだSDK4に対応していません。
pebble storeにて公開中。
https://apps.getpebble.com/applications/5773e5516c2104f4b3000411
https://apps.getpebble.com/applications/573879bc07033fc7cb000010
https://apps.getpebble.com/applications/572eb542bc4006126100000e

ソースコードgithubにて公開中。
github.com
github.com
github.com

これらのwatchfaceの作成からpebble storeへの公開までを書きたいと思います。
大体こんな内容で書く予定です。ちょっと変わるかも。

  • アナログ時計を作る
  • 日付と曜日を入れる
  • ticksを入れる*2
  • bluetooth接続情報とバッテリ情報を表示する
  • 画面を90度回転させる
  • 設定できるようにする
  • pebble storeに公開する

*1:pebble社は倒産してしまいました。

*2:時計の時・分・秒を刻んでいる線のこと。日本語ではなんと言うのだろう。

Macのログイン画面でトラックパッドをカチカチしたくない

Mac(Mountain Lion)のログイン画面ではトラックパッドのタップが使えません。カチカチしないといけません。全然スマートじゃないので、ログイン画面でもタップできるようにします。

ターミナルで下記コマンドを入力します。再起動しないといけなかったような気がします。

$ sudo cp /Users/ユーザ名/Library/Preferences/com.apple.driver.AppleBluetoothMultitouch.trackpad.plist /var/root/Library/Preferences/
$ sudo chown root:wheel /var/root/Library/Preferences/com.apple.driver.AppleBluetoothMultitouch.trackpad.plist

ユーザをwheelグループに追加する

macOS(Mountain Lino)でwheel設定するときのメモ。

システム環境設定 - ユーザとグループ - ログインオプション - ネットワークアカウントサーバ:接続 - ディレクトリユーティリティ

もしくは

$ open "/System/Library/CoreServices/Directory Utility.app"

ディレクトリエディタ - 表示をGroups、ノードを/Local/Defaultに選択します。それからSystem Group - 名前のGroupMembershipを選択します。+アイコンをクリックし、値としてユーザ名を追加し、変更を保存します。

rsyncでバックアップ

rsyncを使うと簡単に差分バックアップを取ることができます。コンピュータが2台必要ですが。

私はこんな感じでバックアップを取っています。

rsync -atuv --exclude=".*" /Users/クライアントのユーザ名/backup/ user@hostname:/Users/サーバのユーザ名/backup

これでクライアントのコンピュータ上のbackupディレクトリ配下のファイルをサーバのbackupフォルダに転送できます。

オプションについて

-aオプションをつけているので、-tオプションはいらないはずですが、-aだけだとタイムスタンプがコピーされていなかった気がします。

--exclude=".*"で隠しファイルを除外しています。

-nオプションを付けるとテストできるので、初めて実行する際は試した方が良いかと思います。

外出先からssh接続する

外出先からsshサーバに接続したいですよね。
そのためにはグローバルIPアドレスを取得して、ルータの設定もしないといけません。

グローバルIPアドレスを知る

外からではMacの設定画面で見えていたIPアドレスを使ってアクセスはできません。このIPアドレスはローカルIPアドレスといって、家の中でしか使えないIPアドレスです。

まずはグローバルIPアドレスを知る必要があります。下記サイトで簡単に調べられます。

https://www.cman.jp/network/support/go_access.cgi

もしかしたら、グローバルIPアドレスが割り振られていないかもしれません。そのときはプロバイダにお問い合わせください。

ルータを設定する

グローバルIPアドレスがわかりましたが、これだけではまだ外からアクセスはできません。これはsshグローバルIPアドレスを指定しても、ルータにぶら下がっているどのコンピュータに接続を回せばよいかわからないためです。

そこでルータのポートマッピング設定を下記のように行います。
IPアドレスsshサーバのローカルIPアドレス
プロトコルTCP
ポート:22(もし変更していれば変更した番号)

これでssh接続の際にグローバルIPアドレスを指定すれば、とりあえずは外からのアクセスが可能となります。*1

ドメインを取得して、グローバルIPアドレスと結びつける

おそらくほとんどの方はグローバルIPアドレスが任意のタイミングで変化します。*2これでは困ってしまうので、ドメイン*3を取得して、ドメインで接続できるようにします。

まずはドメインを取得しましょう。

私はここでドメインを取得して運用していました。*4

http://ddo.jp/

wget -q -O - 'http://free.ddo.jp/dnsupdate.php?dn=ドメイン名&pw=パスワード' | iconv -f euc-jp -t utf-8 >> /root/log/ddns.log"

このコマンドでグローバルIPアドレスドメインを結びつけられます。また結びつける際に/root/log/ddns.logにログを吐き出すようにしています。

ただしこのコマンドを一度実行するだけではグローバルIPアドレスの変化に対応できません。そこでこのコマンドを定期的に実行して、グローバルIPアドレスの変化に備えます。

$ echo "wget -q -O - 'http://free.ddo.jp/dnsupdate.php?dn=imoto-yuya-1234&pw=Watashi2' | iconv -f euc-jp -t utf-8 >> /root/log/ddns.log" >> /root/bin/ddns.sh
$ chmod 700 /root/bin/ddns.sh
$ crontab -e
25 * * * * sh /root/bin/ddns.sh
$ systemctl enable cronie    (ArchLinuxに必要かも)
$ systemctl start cronie    (ArchLinuxに必要かも)

ここでcronというスクリプトを自動実行するデーモンプロセスを使いました。この設定でddns.shスクリプトは毎時間の25分に自動実行されます。

*1:だめなときはファイアウォールを切ってみてください。それで接続できれば、ファイアウォールの設定を見直しましょう。

*2:ルータが再起動したりすると変化するらしいです。

*3:google.co.jpとかyahoo.co.jpみたいなやつです。

*4:久しぶりに見たら、サービスの内容が少し変わっていました。今はもっといいところがあるかもしれません。