2014年12月16日火曜日

Android Wearが初期状態でどの程度の言葉に反応するのか検証してみた。

こんにちは。

1.template

==============================
この投稿は Android Advent Calendar 2014の[16]日目の記事です。
次の人
sakebook
前の人
konifar
なので今回はまだ誰も書いていないwearのボイスアクション(日本語)のまとめがなさそうだったので、書きます。

対象者は一般ユーザー向けです。

開発についての事ではないです。


3.対象OSと検証方法

対象OS

Nexus5
Android 5.0 Lollipop
Android Wear 4.4W2
インストール初期の状態

検証方法

OK Google, ○○○○と端末から5cmはなれたところで言う
明らかな誤字は無視。
検索でない画面が出たらOKとする
 
4.検証
公式サイトによると

NameExample PhrasesIntent
Call a car/taxi"OK Google, get me a taxi"

"OK Google, call me a car"
Action
com.google.android.gms.actions.RESERVE_TAXI_RESERVATION

Take a note"OK Google, take a note"

"OK Google, note to self"
Action
android.intent.action.SEND
Category
com.google.android.voicesearch.SELF_NOTE
Extras
android.content.Intent.EXTRA_TEXT - a string with note body
Set alarm"OK Google, set an alarm for 8 AM"

"OK Google, wake me up at 6 tomorrow"
Action
android.intent.action.SET_ALARM
Extras
android.provider.AlarmClock.EXTRA_HOUR - an integer with the hour of the alarm.
android.provider.AlarmClock.EXTRA_MINUTES - an integer with the minute of the alarm
(these 2 extras are optional, either none or both are provided)
Set timer"Ok Google, set a timer for 10 minutes"
Action
android.intent.action.SET_TIMER
Extras
android.provider.AlarmClock.EXTRA_LENGTH - an integer in the range of 1 to 86400 (number of seconds in 24 hours) representing the length of the timer
Start/Stop a bike ride"OK Google, start cycling"

"OK Google, start my bike ride"

"OK Google, stop cycling"
Action
vnd.google.fitness.TRACK
Mime Type
vnd.google.fitness.activity/biking
Extras
actionStatus - a string with the value ActiveActionStatus when starting and CompletedActionStatus when stopping.
Start/Stop a run"OK Google, track my run"

"OK Google, start running"

"OK Google, stop running"
Action
vnd.google.fitness.TRACK
MimeType
vnd.google.fitness.activity/running
Extras
actionStatus - a string with the value ActiveActionStatus when starting and CompletedActionStatus when stopping
Start/Stop a workout"OK Google, start a workout"

"OK Google, track my workout"

"OK Google, stop workout"
Action
vnd.google.fitness.TRACK
MimeType
vnd.google.fitness.activity/other
Extras
actionStatus - a string with the value ActiveActionStatus when starting and CompletedActionStatus when stopping
Show heart rate"OK Google, what’s my heart rate?"

"OK Google, what’s my bpm?"
Action
vnd.google.fitness.VIEW
Mime Type
vnd.google.fitness.data_type/com.google.heart_rate.bpm
Show step count"OK Google, how many steps have I taken?"

"OK Google, what’s my step count?"
Action
vnd.google.fitness.VIEW
Mime Type
vnd.google.fitness.data_type/com.google.step_count.cumulative
の9種類があるそうです。

5.検証結果

1.Call a car/taxi

これはタクシーを呼ぶコマンドです。
これは実装されていないのか
「タクシー読んで」
「車呼んで」
と言うコメントにも反応がありませんでした。

2.Take a note


これはメモを取るコマンドです。
・いけた物
 「ノートを取って」
 「記録して」
 「メモとって」
 「書いて」
 「書いといて」
・ダメだった物
 「メモ」
 「書物にまとめておいて」
 「ログとっておいて」

 書くに関係する単語はいけたが記録をするに重点をおいたものはダメだった。


3.Set alarm

これはアラームをセットするコマンドです。
・いけたもの
 「アラームをセットして」
 「アラームを○○分後/○○時にセットして」
・ダメだったもの
 「アラーム」
 「○分後に教えて」
 「○分後に知らせて」
 「○分後に報告して」

アラームという単語が出ないと反応しない

4.Set timer

これはタイマーをセットするコマンドです。
・いけたもの
 「タイマーをセットして」
 「タイマーを10分後にセットして」
・ダメだったもの
 「10秒待って」
「10数えて」



タイマーという単語が出ないと反応しない


5.Start/Stop a bike ride

これは自転車に乗った、乗り終わった時に知らせるコマンドです。
・ダメだったもの「自転車乗った」
「自転車乗る」
「自転車降りる」
「ちゃり降りる」
「ちゃり」

残念ながらどうも日本語対応はしていない模様。


6.Start/Stop a run

これは走ったとき、走り終わった時に知らせるコマンドです。
ダメだったもの
「走る」
「走ってる」
「早歩き」
「歩く」
「歩いてる」


これも、残念ながらどうも日本語対応はしていない模様。


7.Start/Stop a workout

仕事を始めた時、終わった時に知らせるコマンドです。
ダメだったもの
「仕事始める
「仕事開始」
「仕事始め」
「タスクする」
「業務開始」


これも、残念ながらどうも日本語対応はしていない模様。


8.Show heart rate

心拍数を表示するコマンドです。
・いけたもの
「心拍数を表示して」
「心拍数」

・ダメだったもの
「心拍数が見たい」

「心拍数が気になる」

微妙に対応している模様
Fitが入っているからなのか

9.Show step count

万歩計の歩数を表示するコマンドです。

・いけたもの
「万歩計を表示して」

・ダメだったもの
「万歩計」
「万歩計のデータみたい」
「万歩計が気になる」

なぜか表示してだと認識しました。

6.まとめ

今回の内容的にも進捗がないのが見て取れますね……。正直申し訳なさあります。
技術的な内容でなくAndroid Advent Calendarの水準を下げてしまった感があるので
来年はがんばりたい。

デフォルトだと赤い内容のアプリが入っていない模様なので
そこら辺のIntent受け取るアプリを開発すれば市場開拓できると思います。




2014年12月8日月曜日

Hackathonに参加しよう {Aizu Advent Calendar 2014 [8]日目}

こんにちは。

1.template

==============================
この投稿は Aizu Advent Calendar 2014の[8]日目の記事です。
次の人
@C_C_panchiga
前の人
@Mopp_jp
今回、2回目のAizu Advent Calendar参加となるが今回は今まで参加してきたHackathonについて書こうと思う。
この記事を見てくれた人が一人でも多くHackathonに参加する事がこの記事の目的である。



3.Hackathonとは

ハッカソン英語hackathon、別名:hack day,hackfest,codefest)とはソフトウェア開発分野のプログラマグラフィックデザイナーユーザインタフェース設計者プロジェクトマネージャらが集中的に共同作業をするソフトウェア関連プロジェクトのイベントである[1]quote from Wikipedia
とあるが、簡単にいえばIT系が集うお祭りである。様々な分野の人が一カ所に集い、
アイディアを出して実装、プレゼンをする祭りである。

4.Hackathonの主な流れ

実際に参加してきたHackathonの流れを紹介する。
基本的に48時間の物が大半。

  1. 集合
  2.    大体のものは午前中に受付をする。遠い場所で開催する場合は交通費が出る場合もあるので前泊も辞さないスタイルで行こう。



  3. 情報の共有
  4.   ここでお題が発表される。下にまとめるが様々な規模、種類なので運営からアイディア出しの手助けとして講演がある場合がある。

  5. アイディアソン
  6.  基本的にHackathonは新しいプロダクトの創生や課題解決を目的にしているのでアイディアを出す事が重要となっている。ココでアイディアを出し、共有する事で素晴らしいコンテンツが生まれる。

  7. チームBuild
  8.  事前にチームで登録し、参加する形が多いが、新しい視点を入れる為&弱い部分を補強する為、同じアイディアを持つ物で集まる等あるのでチーム編成を行う。
    個人的な意見だがHackathon終了後も継続して開発を続けていく場合、遠距離の人とチームになると苦しむと思う。

  9. 開発
  10.      開発 寝るな、書け 17時間ほど



  11. プレゼン
     Hackathonまとめのプレゼンである。
     ここで自分達の作ってきた物を紹介しなければならない。
     基本的に5分である。5分なので要点をしぼって、発表しなければならない。


5.Hackathonに参加して

 上の方で基本的な流れを書いたが”5.開発”がとても混沌とする場合が多い。
アイディアがうまくまとまらなくモチベーションが上がらないまま開発に入ると、仕様変更の波が押し寄せるし自分も仕様に疑問を持ち仕様を変更する。
アイディアは面白いが技術力的にとてもつらい場合は死にそうになりながら実装する、その場合2:00~3:00頃確実におかしくなる。以下一例
  • PCたたきながら歌を歌い始める奴
  • ゴロゴロといきなり寝転ぶ奴
  • レットブルとアイスクリームを混ぜてレットブルフロート作り出す奴
  • 謎の言葉を残して倒れる奴
  • 唐突にアニメ鑑賞会を始める奴
それに加えて PC抱いて床に寝てる人などがいるのでとても地獄な感極まる。大抵自分もおかしくなっているので気にしていない。


6.今まで参加してきたHackathon

  • Hack For Japan (2011/5/21)   
  • 初のHackathonだったが課題解決を目標に行われた。Androidのアプリを書いた記憶がある。(どうでもいいけど今見ると知り合いがたくさん参加してる)高校2年
  • Hack for Aizu
  • 雪がひどかった。電車が止まり人が集まらないというなかなか不思議な感じだった。回線が強くなかったのでデザリングを駆使した。
    当時の最新謎ガジェットに触れる事ができたのと、そばが食べれたので良かった。
    様々な地域の人が集まったが内輪な空気で皆わいわい開発できた。大学1年
  • Medical×Security Hackathon
  • 自分の立ち位置等いろいろふまえて特殊だった。 今まで参加した中では一番競技色強くオシャレな物だった。SecurityHackathonというジャンルはなかなかないし、面白い。夕食とコーヒーがおいしかった。3Dプリンタ、医療機材等貴重な機械に触れられた。
  • 外国人観光者を八王子に呼ぶ!アプリ開発ハッカソン
  • 八王子に行ってきた。内容はプロダクトのコンセプトや市場価値をどうやってつけるか?等マネタイズ関係の物だったので良い刺激になった。この時一人で参加して、会場でメンバーを作ったが、案外うまく進んだ。アイドルがいるHackathonというものに初めて出会った。
  • SPAJAM
  • 温泉に入りながら開発をするHackathon。千葉の田舎の方に行ってきた。無限(有限)にお菓子が出てくる。温泉に入り放題、食事がおいしい、ととても素晴らしいHackathonだった。さすが運営団体がMCFだけある。
    運営の目的がモバイル業界の活性化だったのでアイディア出しの所に力が入っていた。チーム参加なのもそういう事があるからなのだろう。
  • Global Hack with Mashape(ドコモ主催)
  • APIが潤沢、でも日本のデータがすくないという物だった。残念。
    Docomo主催だけ合って講演、設備等かなり豪華だった。
    APIを使うものという事でソフトウェア開発だと思ったら思いのほかハード開発をする人が多かった。
  • TechCrunch Tokyo Hackathon 2014
  • 規模が結構でかかった。API、ガジェットの数が多いし参加人数が160人以上。お台場の端で行われたが隣に大江戸温泉が合ってよかった。 TechCrunchなのでかなり熱く面白いHackathonだった。回線が良くなかったのが残念。EdisonだったりPepper君だったり今話題のハードから、朝日新聞の新聞データ、楽天の商品データなど膨大なデータに触れる形だった。来年も参加したい。


7.Hackathon参加のメリット

何故、自分からプチブラック体験会に参加するのかというと当然メリットがあるからである。なかったらどう見ても寿命縮めているし家でのんびりしていた方が身の為である。
メリット
  • スポンサーのお菓子が食べ放題。夕食、朝食などが出る物もあるので良い
  • 企業のAPIやハードを無料で触れるので面白い物がつくれる
  • 異業種の人と仲良くなれる。男女共に
  • 暇つぶしになる。Hackathonを口実に周辺を観光しても良い
  • ひょっとしたら賞がもらえる。たまに凄い物がもらえる
  • Hackathon駆動開発によって進捗が進捗がでる。今のところ100%出てる
なにげに勉強会などに参加するより圧倒的に進捗でる。
  プロトタイプで良いのでsapmleを触る。
  限られた時間と言う状況なので完成度を捨てて動く物を作る。
と言う事が進捗へつながるのでは。
Hackathon技術開拓やりましょう!!。
特にハード系はベンダーが大抵いるので始めるきっかけとしては十分。


8.まとめ

技術無いから参加しない ->
   アイディア出しは誰でもできる。お茶汲みも誰でもできる。
   sampleの組み合わせでも問題無いのでPCもって参加すれば何とかなる
 実際は技術力はそんなに必要ではなくアイディアを実現できる程度の能力があれば良い
お金ない->
   交通費出るHackathonに参加すれば良い
   結果的に見れば食事に宿泊費にいろいろお得
人前で話せない->
   話せる人を連れて行くか、demo動画を撮る。
 まず、人前でうまく話せる人は半分ほどなので気にしない

とりあえず祭り感覚で参加すればお得。
会津はなにげにHackathonが多いので3人程度で参加すれば面白いと思う。


==============================
次の人
@C_C_panchiga
よろしくお願いします。
==============================



Playground KLab との格闘記録


こんばんは。

Klabさんの素晴らしいゲームエンジンPlaygroundOSSが個人的に難しいと話題に
2014/12/7
とりあえずsample表示ぐらいはしたかった。


という事で現在の進捗

0.研究環境&対象OS

Mac OS X 10.9.5
Android Studio 1.0 RC1
Android NDK 10d
=============
Nexus5
Android 5.0 Lollipop 

ADTは今年のI/O的に積極的にさけた方が良いと思っているので
早くAndroidStudio対応Docくだしあ><

1.いろいろインストール



export ANDROID_NDK_ROOT="/{落とした場所}/android-ndk-r10d"
PATH=$PATH:$ANDROID_NDK_ROOT

上の2行を.profileというファイル名で~/の中にかいておく。
公式DocではSDKのインストールをしていたがAndroidStudioを使うのでいりません。
とりあえず
$ndk-build
と入力して「Android NDK: Could not find application project directory !」的な結果が帰ってきたら大丈夫です。

2.cloneする

とりあえずgitは入れておこう
$git clone https://github.com/KLab/PlaygroundOSS.git

3.Buildする

Playgroundの中に入る
$cd /{落とした場所}/PlaygroundOSS/Engine/porting/Android/GameEngine-android
permissionの設定
$chmod +x ./build.py
build実行
$./build.py --rebuild --project SampleProject
(イミワカンナイ感あるがSampleProjectでないと怒られる。イミワカンナイ)

4.AndroidStudioで開く

AndroidStudio 起動 -> Import Project ->
/{落とした場所}/Engine/porting/Android/GameEngine-androidを選択

当然いい感じに開ける。
とりあえず、もろもろ準備
local.propertiesにsdkの場所が書いてあるはずなのでその下にndkの場所も追加する。
ndk.dir=/{落とした場所}/android-ndk-r10dandroid-ndk-r10d
Gradeを走らせる。こける。

箇所1
  修正前のコード
dependencies {
        classpath 'com.android.tools.build:gradle:0.6.+'
}
  修正後のコード
dependencies {
  classpath 'com.android.tools.build:gradle:0.14.4'
}
箇所2
修正前のコード
compileSdkVersion 17
buildToolsVersion "18.1.0"
  修正後のコード
compileSdkVersion 21
buildToolsVersion "21.0.2"
箇所3
  修正前のコード
tasks.withType(com.android.build.gradle.tasks.PackageApplication) {
  pkgTask -> pkgTask.jniDir new File(projectDir, 'libs')
}
修正後のコード
tasks.withType(com.android.build.gradle.tasks.PackageApplication) {
  pkgTask ->
    pkgTask.jniFolders = new HashSet<File>()
    pkgTask.jniFolders.add new File(projectDir, 'libs')
}
多分jniDirがないだかで怒られるはず。
で、上の修正した後gradeを走らせると落ちる。落ちた。
/*今回ごり押しでやったので落ち着いたら別の方法を載せる予定*/
なので落ちた部分をコメントアウトしてgradeはしらせて成功したあとコメントアウトを外してもう一回gradeを走らせた。
コメントアウトした箇所は
/*
    if(new File(projectDir, "jni").exists()){
        tasks.withType(Compiler) {
            compileTask -> compileTask.dependsOn ndkBuild
        }
        tasks.withType(com.android.build.gradle.tasks.PackageApplication) {
            pkgTask ->
                pkgTask.jniFolders = new HashSet<File>()
                pkgTask.jniFolders.add new File(projectDir, 'libs')
        }
        clean.dependsOn 'ndkClean'
        clean.dependsOn 'libsClean'
    }
*/
である。 多分Buildはできたはず。


5.Assetsの追加

$cd /PlaygroundOSS/Tutorial/01.SimpleItem/.publish/android/ $zip -r -0 /PlaygroundOSS/Engine/porting/Android/GameEngine-android/assets/AppAssets.zip ./* $echo -n "1" > /Playground0SS/Engine/porting/Android/GameEngine-android/assets/version ./*
公式のDocのまま。echoの数字はバージョン番号で、変更が合ったら数字をかえよう。
できた、AppAssets.zipとversionをAndroidStudio上でassetsというディレクトリを作って放り込む。階層はGameEngine-android直下にした。


6.コードの修正

やはりか、という感じでエラーが起きる。イミワカンナイ!ダレカタスケテー!

    
Process: klb.android.GameEngine, PID: 31119  java.lang.RuntimeException: createContext failed: EGL_BAD_MATCH
  at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1192)
  at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1183)
  at android.opengl.GLSurfaceView$EglHelper.start(GLSurfaceView.java:1033)
  at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1400)
  at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1239) 


で。このエラーを解決するのに時間を無駄にしたのだが結論は
klb.android.GameEngine.GameGLSurfaceView内の54行目あたりにある
PFInterface pfif = PFInterface.getInstance();int glver = pfif.getGLVersion();setEGLContextClientVersion(glver);
で、glverが-1を返していた。
setEGLContextClientVersion(2);のコメントアウトを外したら動いた。

画面が黒い。Assetが表示されない<-今ココ



という訳で
ダレカタスケテー!


2014年10月24日金曜日

Androidアプリを作るときのLog表示のメモ

いつも同じクラスを使っているので。
import android.util.Log;

public class LogUtils {

    
    public static String getTag(Object o){
        return o.getClass().getSimpleName();
    }

    public static void putD(Object o,String msg){
        Log.d(getTag(o),msg);
    }
    public static void putE(Exception e){
        e.printStackTrace();
    }

}
つかいかた
    LogUtils.putD(this,"test");
結構便利

2014年10月15日水曜日

Python FLASK でAPI(準備編)

PythonでREST API作りたくなったのでとりあえず、準備
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json
from functools import wraps

from flask import Flask, jsonify, request, url_for, abort, Response

app = Flask(__name__)

user = {'name': 'Mizuki',
'twitter':'@Mizuki_Sonoko',
'like':('Android','python','AWS'),
'location':'Aizu',
'school':'University of Aizu',
'comments':'I will add useless apis.',
'apis':()}

@app.route('/', methods=['GET'])
def index():
    response = jsonify({'introduction': user})
    response.status_code = 200
    return response
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json
from functools import wraps

from flask import Flask, jsonify, request, url_for, abort, Response

app = Flask(__name__)

user = {'name': 'Mizuki',
'twitter':'@Mizuki_Sonoko',
'like':('Android','python','AWS'),
'location':'Aizu',
'school':'University of Aizu',
'comments':'I will add useless apis.',
'apis':()}

@app.route('/', methods=['GET'])
def index():
    response = jsonify({'introduction': user})
    response.status_code = 200
    return response
動いた

2014年9月30日火曜日

東京メトロアプリコンテスト用メモ



以下のようなコンテストに出すアプリ用メモ
東京メトロアプリコンテスト公式サイト


1.Volleyについて
取り合えずVolleyとAsyncTaskでデータを取ってみようとするも、文字化け

 com.android.volley.toolbox.BasicNetwork
のperformRequest関数内でレスポンスヘッダを取る場所に

responseHeaders = convertHeaders(httpResponse.getAllHeaders());
/* 追加ポイント*/
responseHeaders.put("Content-Type","application/json;charset=utf-8");
という形で強引にUTF-8にした。

Volleyは com.android.volley.toolbox.JsonObjectRequestを覗くと分かるように
new JSONObject(jsonString)とorg.jsonを利用している。
今回、JSON-LDなので、急遽jsonld-javaを導入した。

=======================

結論としてVolleyを使うと逆に面倒な感じになるっぽいので
HttpClientを使ってやることにした。



2.jsonld-javaについて
jsonld-java←これ

いろいろ面倒な感じではまったのでメモ
普通にApacheのHttpClientを使う形だったのだが、httpcomponents-client-4.3.5
だけを入れるとエラーが起こった。どうも内部で存在しないクラスを参照してるようだ。
ぐぐったら4.1を使ってねとか言われたので謎だったが4.1を入れてみる。
エラーが発生

今度は別の問題が発生。moudameda

多分ソースを自分でBuildすればいいんだろうなとおもいつつ、4.1と4.3を併用したら
動いた。
libs/
・commons-codec-1.6    (from 4.3.5)
・commons-logging-1.1.3 (from 4.3.5)
・fluent-hc-4.3.5             (from 4.3.5)
・httpclient-4.1               (from 4.1)
・httpclient-cache-4.1     (from 4.1)
・httpmine-4.3.5              (from 4.3.5)
・jackson-annotation-2.5.0
・jackson-core-2.5.0
・jackson-databind-2.5.0
※JSONLD-javaの内部でJacksonが使われている

あと
jsonldjava.core.DocumentLoaderの getDefaultHttpClient()関数内で

final DefaultHttpClient client = new SystemDefaultHttpClient();

という文があるのだがSystemDefaultHttpClient()関数が
見当たらないので

final DefaultHttpClient client = new DefaultHttpClient();

と書き換えたら普通に動いた。

使ったライブラリの場所
HttpClient archive.apache.org 
JSON-LD jsonld-java
Jackson   oss.sonatype.org
良く分からないので、リリース時には変える予定。