Google devfest 2010にいってきました

3/11のdevfest2010に参加しました
A会場にずっといました。

以下メモです

基調講演

及川さん
  • Webアプリ
    • mixi クリスマスアプリケーション
      • リリース後100万以上のユーザが利用
      • ソーシャルアプリは、トラフィック予測が難しい
      • GAEがバックボーン
    • Google ModeratorもGAEがバック
  • Client
    • Webアプリがローカルアプリに追い付く
    • ほぼ全ての機能はWeb標準技術で提供できる

デモ
html5

    • HTML5/CSS3でWebをパワフルに
    • Chrome4の機能
      • WebFonts

Fontはローカルに入っているものを使う
ローカルではゴシックと明朝のみ(多くのプラットフォームに対応しようとすると)
サーバからダウンロードできたら...
Chrome4で実装

      • WebSockets

いままではCommetという技術を使っていた
ひとつのポートを張っただけで任意のタイミングでデータを送信可能

    • Androidアップデート
      • 26修理 60キャリア 49ヶ国 一日あたり60,000台
    • Webプラットフォームでの開発
石原さん
  • Google I/O
    • 一番大きいイベント
  • Google Developer Day
    • 日本では秋に開催予定
  • DevFest
    • 東南アジア等でおこなっていたが、日本では初めて
    • いくつか実験的なことがらを試す
      • Androidアプリケーションがregist systemに
      • バックエンドはGAE
      • GoogleのSoftware Engineerがボランティアで開発
  • Hack-a-thon
  • Community Events

Google,User,Developerが一体となってEcosystemを作る

Google Code Archive - Long-term storage for Google Code Project Hosting.

  • クイズサマリ
    • 開催期間:7日間
    • エントリした人:2113
    • クリアした人:461
    • 最高点:36.6/46
    • パスした人:22/46
  • 11問目
    • Google DevQuiz 2010 Japanを採点

たのしい Android : カスタム UI で Android アプリにワクワク感を加えよう

自己紹介
インタラクションのキモeasingとは何か?
  • "ため"のあるアニメーションを実現する方法
  • UIの動きに特徴をあたえることで、楽しく使っている

Tweener Documentation and Language Reference

  • どの程度のeasingが妥当か
    • 自分自身が気持ちいいと感じるまで、微調整を繰り返す
easingをDialogに採り入れよう

Interpolator:アニメーションの程度を調整する変換関数
android.view.animation

<?xml/ version="1.0" encoding="utf-8">
  <resouces>
    <style name="Theme.CustomDialog" parent="andoird:style/Theme.Dialog">
      <item name="android:windowAnimationStyle">@style/Mydialog</item>
    </style>
  </resouces>
<?xml/ version="1.0" encoding="utf-8">
<set xmlns:android=" android:interpolator="@anim/anticipate">
<!-- ここ同じ -->
</set>
mDialog = new Dialog(this,R.style.xxxx)だけ
カラーコーディネートの効果
  • レイアウトした素材の徒手津間をなくし、ユーザに操作の余計な違和感を感じさせない
  • 目立たせたい部分を計画的に目立たせる

themes.xml

<?xml/ version="1.0" encoding="utf-8">
  <resouces>
    <style name="Theme.CustomDialog" parent="andoird:style/Theme.Dialog">
      <item name="android:windowAnimationStyle">@style/Mydialog</item>
      <item name="android:windowBackgroun">@drowable/xx_bg</item>
    </style>
  </resouces>

btn_image.xml

<?xml/ version="1.0" encoding="utf-8">
<selector>
  <item nadroid:state_pressed="true"..
  <item nadroid:state_forcused="true"..
</set>
mDialog = new Dialog(this,R.style.xxxx)だけ
easing付き横スクロールで楽しい操作感

移動幅に応じてテンションの値を変更する

  • 移動量大->派手=テンション小さめ
  • 移動量小->地味=テンション高め
float tension = 1.2f - (0.1f*x);//xは移動量
Interpolator ip = new OvershootInterpolator(tension);
mScroller = new Scroller(context,ip);

移動幅に応じてアニメーション時間を変更する

  • 移動量大=アニメーション時間:長
  • 移動量小=アニメーション時間:短
int duration = (1+Math.log(x))*350;//xは移動量
mScroller.startScroll(mScrollX,mScrollY,dx,dy,duration);

HorizontalScrollViewのsmoothScrollByの第3引数にdurationを設定できるように
MyHorizontalScrollViewを作る
OSSならでわ

質問
  • Androidでのデザイナとプログラムの共有方法
  • タブの位置どっちがいい
    • iPhoneは下 HT-03Aは上,Xperiaは下
    • 下に物理的なボタンがあるので 下がよいのでは?
  • Googleマップでピンをドロップして落とすアニメーションは可能か?
    • スタート地点と終点がわかればできる
  • Activityをアニメーションで出すことは可能
    • テーマを設定するときにアニメーションを設定できる

やさしい Android -- ユーザフレンドリかつデベロッパーフレンドリーな Android アプリケーション開発手法

自己紹介
  • Google 宮川大輔
    • 2007年 M卒業後 Google
    • Android
    • 日本語化一般
      • 特に連絡帳
      • あかさたなのカーソル
        1. 819012341234 -> +81-90-1234-1234
      • vCard
      • 絵文字サポート
      • git logで終える
ユーザにとって"やさしい"とは
  • クラッシュ/フリーズしない
  • 安心して使える
developerにとって"やさしい"とは
  • 世界中のAndroidバイスで動作する
  • バグを用意に抑制/検出できる
互換性を保つ
  • より多くのハードウェアでアプリケーションを使ってもらうために
    • 必要な機能に絞りこむ
    • サイズを小さくする
    • さらにコンパクトに
  • 全デバイスで検証->現実的には厳しい
  • より多くのユーザに使ってもらうために開発の軸が必要
Android Market
  • 多数のデバイスが搭載しているマーケット
      • 互換性を意識すれば良い
公開SDKで規定されたAPIを使う
  • SDKにないAPIのしようは非推奨
    • 公開SDKにない"public"メソッドは非公開->非推奨
    • そもそも、デバイス上に存座いしないかもしれない
APIのバージョンを管理しましょう
  • minSDKVersion -> 3(1.5)
  • targetSDKVersion ->4(1.6)

複数解像度
  • 各解像度用にディレクトリを作りデータを管理は必須
    • drawable-ldpi
    • drawable-mdpi
    • drawable-hdpi
    • drawable-land-ldpi
  • 特定の解像度にしたい

XMLでレイアウトを記述する
  • Android側が自動的にサイズ決定してくれる
  • RelativeLayout
    • View間の位置関係をレイアウトを指定できる
  • AbsoluteLayoutは危険
    • pxで指定してしまうとAndroidが検知できない場合がある
国際化対応
  • 本質的には非常に難しい
    • 10 out of 10 "%s out of %s" =>日本語だと10件中1000件
  • Androidの市場で英語圏は無視できない
  • 文字列をJavaプログラム本体に埋め込まない
    • values/strings.xml
    • values-ja/strings.xml
  • 絵文字
    • Unicodemojiに画像をかぶせてみる
String tulip = "u1F340";
//文字の上に何かをかぶせる
SpannableStringBuilder ssBuilder = new SpannableSringBuilder();
ssBuilder.append(tulip);
Drawable drawlabe = getResources().etDrawable(R.drawalbe.tulip)
drawable.setBound(0,0,100,100);
ssBuilder.setSpan( new ImageSpan(drawable),0,ssBuilder.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(ssBuilder);
バグを未然に防ぐ:ユニットテスト
  • Classを作るときにJUnitTestCase
バグを未然に防ぐ:ロギング
  • logcat
バグに見える挙動を減らす
  • 次にして欲しいことを表示
    • 例:メニューを押してください
  • フィードバックをもらう
    • アプリを説明せずに使ってもらう
  • 操作方法に気づくまで、何十秒もかかる
    • UIが不親切

Mobile Mapping

レイテンシとは
  • ページロードにかかる時間
  • 画面の変化に気づく時間
ブラウザベースのMapsの利点
  • たくさんのプラットフォームに存在する
  • アプリんダウンロードいらず
    • すぐに最新のバージョンになる
  • HTML5GeoLocation
NativeAPIを使う利点
  • NativeUIが使える
  • 改善が簡単に行える
  • AppStoreで見付けられる
  • レイテンシが少ない
    • ブラウザベースだとJavaScript ダウンロードとか..
使いどころ
  • Low bandwidth situations and non-JS browser
  • iPhone or Android
    • Native API
    • Map V3 appli
Static Maps API
  • 静的画像をresponse
  • Version 2 は以下の特徴
    • カスタムアイコン
    • encoded polylines
    • special mobile tiles
  • 広く互換性がある
Native API(iPhone)
Native API(Android)
ブラウザベース
  • HTML5
  • マルチプルプラットフォーム
  • だけどレイテンシが多い
  • iPhoneAndroidのNative APIよりJSのAPIの方が充実
Hybrid Native +ブラウザ(ベストな選択)
Google Map API V3
  • JSのページロードレイテンシを減らした
  • JSのサイズをへらす
  • 必要になるまでロードを遅延させた(遅延評価?)
  • MVCアーキテクチャにした
  • 画像をCSS Spriteにした
改良点
  • StaticMapをDLして、JSをDLする方法にかえた
  • MapsAPIの起動時間比較

V2:bootstrap->main.js ->set_center -> tiles
9s 18s
V3:bootstrap->main.js ->set_center -> tiles
2s 7s

デモ

native APIでGeoLocationを得て
WebViewでGoogle MAP V3つかうAndroidコード
http://beta.gr-3.net/map-api

プログラミング言語Go

Go言語とは
  • 2009/11/10にリリース
  • Fast
  • Fun
  • Productive
  • 開発エンジニア
hello world

gofmtでGOの標準フォーマットで

Code Example

i := 0

var i int = 0
と等しい

  • 関数

func enc(s string) string {
r := kk
}

  • 多値の return ができる
  • if の条件式に複数指定できる
goルーチン
  • Threadみたいなもの
  • goルーチン同士の会話はチャンネルで
    • チャンネルは同期処理

http://golang.org/pkg/websocket/
を作ってみた

まとめ
質問
  • コンパイル速度が速い理由
    • いらない機能を省いている
      • テンプレートとかない
      • Goはパッケージが既にできている状態だから
  • 実行速度が速い理由
    • いらない機能を省いている
      • Exceptionがない

GoogleWave

概要
  • Google WaveGoogle I/Oで発表したコラボレーションツール
  • リアルタイム性の高いコミュニケーションが使える
新しい
  • 多人数でDocを編集できるのはログイン - Google アカウントでも
  • 多人数でも同じドキュメントをリアルタイムに編集してもコンフリクトしない
操作変換
  • 自分の操作と他人の操作をそのまま反映すると衝突がおこってしまう場合にその操作を変換することで

衝突を避ける

GoogleWaveの拡張
  • Wave gadget
    • Waveに張り付けることができる小さなアプリケーション、他のユーザと共有が可能
  • Wave robot
    • ユーザのWave操作...
Wave Gadget
  • GoogleガジェットをWave用にはりつけられる
  • 開発
    • Waveガジェットを定義するXMLファイルを配置することで開発可能
    • 画面のHTMLはそのXMLの中に埋め込む
    • JSで記述
同期処理
  • Waveガジェット上での他のユーザとのデータの同期処理は非常に簡単に実装することができる
Wave Robot
  • ウェーブに対する変更をイベントとして駆動するプログラム
  • 例:
    • プログラムを張り付けると 自動的に色をつけてくれるロボット
    • 顔文字を書くと自動的にアイコン変換
  • 開発環境
    • GAEの環境が必要
    • [app id]@appspot.comがロボットアドレスになる

Do Task Queues Dream of MapRedule?

自己紹介

#devfest_jp 「Task QueueはMapReduceの夢を見るか?」の資料です - スティルハウスの書庫の書庫

TaskQueueとは

http://code.google.com/intl/ja/appengine/docs/python/taskqueue/

Queue queue = QueueFactory.getDefaultQueue();
queue.add(url(xxx)...)

GAEの管理コンソール上でQueueが確認できる

使い道
  • GAEで特に遅い並列な更新処理に活用
  • メール送信
  • 他のサイトからRSSをfetch
気を付ける点
  • 個々のタスクも30秒ルール
  • 1アプリあたり20task/sが上限
デモ
  • 500文字のランダムなアルファベットを全文検索するデモ
  • GTalkでサーブレットXMPPで話しかけると サーブレットはTQにタスクを積んで、返答するアプリ
  • シーケンシャルの処理よりもTQで実装すると4倍位少なくとも高速になる
  • GAEはウォーミングアップが必要

参考
Google App Engine for Javaを使ってみよう! (9)XMPP Java API (1/4):CodeZine(コードジン)

  • TQはAppサーバを並列
    • クライアントで並列にrequestを投げる
  • もしくはサービスが並列
Appサーバを増やすには
  • 初期は2instance
  • 負荷がかかってくるとinstanceが自動的に増える
    • 数分かかる
    • spin upという処理がかかってしまい 立ち上げが間に合わなかったら(10秒) Aboted
  • 30req/sが上限
    • googleに個別相談すればリミットを外してくれる

参考
http://code.google.com/intl/ja/appengine/docs/quotas.html

まとめ
  • MapReduceに似ている
  • 違い
    • 副作用が無い関数に基づいている仕組みであるがTQは排他制御はアプリ作る人まかせ
    • 大規模な(1億レコード)を前提としている
memcachedとMemcache
  • グローバルなのでどのGAEinstanceからでも呼べる
  • 無くなる可能性がある
    • 消えるタイミング
      • 計画停止
      • データセンターの移行
  • 排他制御はない
    • Memcheのincrement APIはアトミックに値を増やせる