cutmail's blog

write the code

GDD2010JPに参加してきました。

平日の昼間でしたが、GDD2010に参加してきました。
簡単にですが、下記メモです。

基調講演

▽Chrome &HTML5

   - 人々がWebの上で生活し始めている
   - Webがアプリケーション化する
      - それに対応するのがHTML5
   - HTML5によりWebがパワフルに
   - W3C活動報告
      - HTML5でいこう
   - 進むブラウザの対応(HTML5)
      - IE9
      - FF
      - Opera
      - Safari
      - Google Chrome
   - 実用に耐える高いパフォーマンス
   - 実用化に向けてのフェーズ
   - ハードウェアとの連携
      - GPUアクセラレーション
   - ローカル資源の活用
      - 画像のファイルサイズなど
   - CSS3のトランスフォーム
   - 音声認識による検索@ブラウザ
   - デバイスオリエンテーション
      - デバイスの方位をDOMイベントとして定義
   - マイクアクセスおよび音声認識
      - @speech属性の追加
      - <input type="search" name="q" speech required onchange="startSearch">
   - ファイルアクセス
      - File API
      - FileSystem API
   - 課題(webアプリケーションの課題)
    1. みつけやすさ
    2. 再アクセスの容易さ
    3. マネタイゼーション
   - Chrome Web Store
   - スマートフォンで加速するモバイルHTML5
      - 北米では、HTML5のトラフィックが従来のものを超えた
   - Input
      - Google日本語入力
      - Mozc
      - Google日本語入力Cloud API
         - Transliteration API
            - 本日公開
            - バックエンドのみ
            - フロントエンド/web uiは後日公開
         - 10/23にコードリーディングを含む、テクニカルイベント開催

▽Android

   - Why?
   - Tim Bray
   - spectral souls
   - New In Android
      - Market search suggestions
      - New "similar" tab in Market display
      - Comments visible in Market publisher site
      - Error reports in Market publisher site
      - Android Market licensing server
      - Unbundled apps.For example new Gmail last week.
      - Cloud to Device messaging.For example, Chrome to phone.
      - Tethering and portable hot spot (usb, wifi)
   - Android and Japan
      - モトヤフォント
      - アプリのダウンロード数は世界第2位
▽Cloud Platform

   - Google App Engine
      - Easy to build
      - Easy to manage
      - Easy to scale
   - 90K developers
   - 130K apps active every week
   - 5.5B pageviews / week
   - Japanese success story (use GAE)
      - エコポイント
      - mixiFESアプリ
   - Google App Engien for Business
      - SSL and SQL
      - Technical support
      - Formal SLA
      - centralized admin console
      - enterprise pricing
   - Domain Console
   - IT予算の60%は保守
   - Roadmap
      - Full MapReduce
      - Datastore dump and restore
      - Background servers & Reserved instances
      - Real time Channel API
      - Built in OAuth & OpenID
      - Make you smile :)
   - CLOUD PORTABILITY
   - OPEN STANDARDS
    1. Data portability
    2. app portability
   - GWT &#9829; Roo
▽石原直樹さん

高性能な Android アプリを作るには (ティム ブレイ)

   - Reacting to events quickly
   - Don't hog the event looop("main" / UI) thread!
   - SQLite
      - Use indexes(see EXPLAIN & EXPLAIN QUERY PLAN)
      - For logging, consider file-append rather than database-write
      - sqliteはindexをはるとselectは早くなるがupdateが遅くなる
   - AsyncTask
      - Must be called from a main thread
   - IntentService
      - is a base class for Services that handle asynchronous requests on demand. Clients send requests through startService(Intent) calls;
   - UIスレッドには絶対に重い処理を置かないで!

   - UI Tips
    1. Immediately, disable UI elements
    2. Briefly, a spinner in the title bar
    3. if more than 200msec, show a ProgressDialog
    4. in AsyncTask onPostExecute, cancel alarm timer
   - Performance Advice
      - "Premature optimization is the root of all evil." -Donald Knuth
   - Profiling Tools
      - Traceview
      - Log.d() calls with a timestamp aren't terrible
      - Extreme profiling: Aggregate user profile data
   - 

ここちよい Android - おもいやりの UI デザイン(adamrocker、矢野りん)

   - 物販アプリ「DropCart」
   - UX(User experience)とは?
      - ユーザへの”おもいやり”
      - 気持よくさせるのではなく、不快にさせない
      - 不快ではない=違和感がない
      - 静的・動的な資格情報に対して「違和感のない」体験を提供する
         - アニメーションを資料したインタラクション
         - グラフィックによる世界観
   - SimejiにおけるUXの考え方
      - ユーザの脳への”おもいやり”
      - 設定変更
         - 何が変わったのかを認識するには時間が必要(ダイアログあり)
            - 脳への負担
      - おもいやり1
         - 脳の処理負担を軽減するため、変化は操作に対して時間・距離的に近くする
      - モバイルにおける課題
         - ディスプレイが狭い
            - 手が邪魔
      - Simejiの解決策
         - 4次元の活用
            - ゆとり
      - おもいやり2
         - 脳が処理する時間的な余裕を与える
      - おもいやり3
         - 自然な動作表現
      - フィッツの法則
      - ヒックの法則
      - テスラーの複雑性保存の法則
   - SimejiのUXにおけるグラフィックデザイン面の工夫
      - グラフィックデザインのねらい
         - 情報の理解を助ける
         - 好きになってもらう
      - Simejiデザイン方針
         - フラット
            - スタイルを単純にしてスキンを目立たせたい
         - シンプル
            - アイコンのもつ意味をストレートに伝えたい
         - ラブリー
            - 毎日使うものだから、愛着を持って欲しい
      - Mies van der Rohe
         - "Less is more."
      - アイコン
         - 苑の大きさが目安
         - もともとマルイデザインは目安より一回り小さく
         - "God is in the detail."
         - "Form follows function." 形態は機能に従う

クールな Android アプリを作るには (安生真、山下盛史 @yyaamma、江川崇 @t_egg)

<江川崇 : IMoNi>

   - IMoNi
      - 非公式i-モードクライアント
   - 技術的な仕組み
      - Intent
         - Action, Category
         - Uri
         - MIME
      - Content Provider
         - 標準(Contacts, SMS, Mediaなど)
         - 独自
   - 共有ダイアログについて
      - 面倒と考えるか、汎用的と考えるかは様々な観点があり、賛否両論わかれるところだが、いいところもたくさんある。
   - Uriがおすすめ
      - ex) IMoNiでは、mailto:スキーマに対応したアプリからメール送信できる機能を設けている
      - 振る舞いと情報を包含している(ReSTFull)
   - 有名アプリの威を借る
      - 有名アプリに規制すると付加価値が上がる
      - 連携もIntentを使えば実装は楽
      - ex) マッシュルーム
         - IMoNiのマッシュルーム「Emoji picker」
   - 標準装備されている仕組みに乗る(1)
      - 標準のContent Providerに突っ込むといい
         - IMoNiではメールの新着通知をSMSのDMに
   - 標準装備されている仕組みに乗る(2)
      - Intent Filterを標準のアプリにあわせておくといい
         - ギャラリー、連絡先など
   - 標準装備されている仕組みに乗る(3)
      - 自分のアプリが持っている情報も、標準の仕組みで公開できるようにしておくといい
         - 独自に作るのは面倒だが、いい面もある
      - Global Searchに対応
   - 批判は目につきやすいが、何も言わないけど分かってくれる人もたくさんいることを忘れずに。
   - 開発者と開発者
      - アプリとアプリが人と人とをつなぐ
         - ex) IMoNi x デコ美
      - http://goo.gl/HUZG
   - まとめ
      - Androidの緩やかにつながる仕組みを使いこなしているアプリはクール
      - Share Dialog はいい側面も悪い側面もある

<山下盛史 FxCamera>

   - FxCamera
   - 370万
   - 20万アクティブ

   - The Developer's Guide
   - UIガイドライン
   - Appleの Human Interface Guidelineはとても参考になる
      - そのままではなく、参考にする感じ
   - あえて標準部品を使う
   - Backキーを使う
      - 開発者的にはonResume()とか
      - ユーザーが期待・想定しているのは大抵の場合、「戻る」「Undo」
         - 画面/ユーザー操作の階層に合わせる
   - Menuキー
      - 実装はアプリ次第なのでアプリによってoption menuが出る場合とでない場合があるし、同じアプリでも画面によって出る場合とでない場合がある
      - 積極的に活用する
         - menuキー使うのが必須なつくりにすれば押して貰える(ブラウザ、Gmail)
         - 一切使わない
            - officialのtwitterアプリ
         - うまくハイブリッド
            - よく使うものだけ出すとか
   - 落ちないこと
      - Config Change
         - 見落としがち
         - Activityの強制再起動
            - orientation
            - keyboard, keyboardHidden
   - サポートがしっかりしていること
      - webページとして作るのがおすすめ
         - アプリ更新しなくてもいつでも更新できる
         - メールの対応が楽になる(リンク教えるだけ)
         - iUI http://code.google.com/p/iui/
   - カスタムスキーマ
      - http://bit.ly/fxcameratest

Android でリアルタイムゲームを開発する方法: リベンジ (クリス プルエット)

- リベンジ
- ワンダのレプリカ島
- Androidのゲーム開発
- 端末の種類が多い
   - 第一世代
      - HVGA(480x320)
      - OpenGLES1.0/ 1.1
      - HT03A
   - 第2世代
      - OpenGL ES2.0, 1.1
      - WVGA(800x480)
- 端末の特徴
   - 画面サイズ、解像度
   - インプット機能
      - トラックボール、十字キー、キーボード、マルチタッチ
      - API的に対応しやすい
         - MotionEventかKeyEvent
   - OpenGL
      - テクスチャフォーマット:ATITC? PVRTC? ETC1?
      - OpenGLバージョン
      - GL_EXTENSIONS?
   - 端末のバージョン
      - Android1.5 12%
      - Android1.6 18%
      - Android2.1 42%
      - Android2.2 29%
- HeightMapProfiler
- パフォーマンスを高める方法
   - 必ずVBOを利用
   - VBOの数を減らす
   - 浮動小数点数の頂点を利用
   - テクスチャコンプレッションならETC1
   - 2DならOpenGLのdraw_textureエクステンション
   - 30ヘルツで遊べるようにプランニング
   - 第一世代端末から第二世代端末までランタイムでスケール
      - GL_EXTENSIONSは役に立つ
   - 第二世代のみの端末用ゲームなら、GLES2.0を使用
   - GLSurfaceView (Androidのclass)
- 操作設定は必要
   - 端末がわからないため、Configure Keyboard的な画面とか
   - あとから付けるのは大変
- PHPxJSでテストゲームを作った
   - 死んだところをサーバーに投げる
   - 死にやすいところをヒートマップ
   - 改良
- O3C Client Interface
- "It's not really about innovation so much as exploring interestingness."
   - 楽しいゲームには「革新」より「面白さ」のほうが大事
- Androidマーケット
   - ユーザーランキング第二位
   - ダウンロードが一番多い(5月くらいから倍になっている)
   - インプレッションは一番高い
- リンク
   - http://code.google.com/p/apps-for-android/
   - http://replicaisland.net/

Google Developer Day2009に参加してきました。

遅くなってしまったのですが、講演を聴きながらとったなぐりがきのメモを公開します。

HTML5

・HTML5はアプリケーションプラットフォーム
       アプリケーションを動かすための標準プラットフォームを定義する規格へ

・ユーザーにとってのメリット
       オフライン関連機能
       SVG, MathML, canvas, audio, videoなどによる表現力向上
       メニュー,フォームの強化による利便性向上
       スクリプトコード現象によるアプリケーションのロード高速化と動作高速化

・開発者にとってのメリット
       プラグインを使わないと実現できなかったことの一部がHTMLとスクリプトで可能になる
       例) Gmailの複数アップロードでのFlash使用など
       メニューやフォーム検証などに大量のスクリプトコードだったのが、HTMLの記述だけで可能に
       規格で曖昧だった点や、まったく標準規格が存在しなかった部分が規格化されることで、ブラウザ間の非互換が減少

・HTML5の新機能
       Web Workers マルチスレッド
       Web Socket  サーバーとのメッセージ交換
       Web Storage クライアント側へのデータ保管
       アプリケーションキャッシュ
       フォームの強化
       メディア要素
       アプリケーション向け要素
       構造化向け文章
       ドラッグ&ドロップ機構(API)
       contenteditable属性の標準化
       ドキュメント間メッセージング
       ルビ
       data-*属性        アプリケーション依存のデータを埋め込む
       SVGとMathMLの埋め込み

・HTML5は10年ぶりのHTML新バージョン
       HTML4, XHTML1.1, DOM Level 2 HTMLを包括し、機能を加える規格
       XHTML2および、XFormsは含まない
       W3Cの規格となるが、実作業はWHATWG(Apple, Opera, Mozilla)

・HTML5は4つの規格で構成
       HTML5
       Web Storage
       Web Workers
       Web Socket
       The Web Sockets API
       今年の10月くらいに最後のDraft

・新機能
       Web Workers
               バックグラウンドでスクリプトを実行する仕組み
               毎回新しいスレッドを生成するWorkerと、複数のウィンドウで共有できるSharedWorker
               ウィンドウを閉じても動き続けるpersistent workerを議論中

       Web Sockets
               専用のプロトコルでサーバと文字列の送受信をする仕組み
                       HTTPではないので、サーバ側での実装も必要
               XMLHttpRequestと比べると、オーバーヘッドが小さくリアルタイム性が高い

       Web Storage
               ページ遷移しても消えない、クライアント側のデータ格納機能
               データ形式の違いで2Type
                       storage型
                               window.localStorage
                                       サイト別に保持される、key-valueペア。cookieと同じような感じ。
                               window.sessionStorage
                                       サイト別、かつウィンドウ別に保持されるkey-valueペア。

                       Database型
                               localStorageと同様、サイト別に保持される記憶領域
                               SQLが使用可能
                               同期実行型と非同期実行型の2つのインターフェイス

       アプリケーションキャッシュ
               キャッシュしても良いURL、しないで欲しいURLを宣言
               オンライン時にキャッシュされていないURLを先読み、オフライン時にはキャッシュを使う


       フォームの強化
               input要素の新タイプ
                       search
                       email
                       time
                       datetime-local
                       number
                       color

               フォーム検証機能
                       フォームがsubmitされる前に、各フィールドの最小値、最大値、文字列パターン、入力必須かチェック
                       <input type="url" placeholder="デフォルトメッセージ"
pattern="https://???">

               メディア要素:canvas
                       スクリプトによる2次元グラフィックス描画

                       video,audio
                               img要素と同じように、srcを指定

       メニュー要素
               あらゆる要素にコンテキストメニューを定義
               ツールバーを簡単に定義


       datagrid要素
               まとまったデータを表現する
               リスト構造、木構造、表を扱う
               ソートや編集が可能

       progessとmeter

       構造化文書向け要素
               section, article, aside, header, footer, nav, timeなど
                       文章の見た目にはほとんど影響がない
                       HTMLソースの可読性向上など

ソーシャルWebの可能性

ユーザーレビュー
コメント

ソーシャル化によってサイトの認知を高める

mixiアプリ


ECサイト
・大量のレビュー
・まったく異なるレビュー

・友人のレビュー
・すべてのレビュー
⇒自分の友人関係(ソーシャルグラフを利用)

OpenID
       Webにおけるシングルサインオン
       認証=異なるWebサイトにおける識別子(ID)の共有/統一
       IDはURL形式

必ずしもユーザー情報が必要なわけではない
アウトソースみたいな形

OAuth
       アプリケーションに対して、APIの利用権限を与えるプロトコル
       認可/承認

OpenID OAuth Extension
       OpenIDとOAuthをハイブリッド化

Google Friend Connect

Androidのデータ共有

■Intent

Intent.putExtra()
       タイプの異なる一つ以上のデータを渡したいとき
       IntentにIntentを渡したり、バイナリデータも

       HOMEのショートカットアイコンも、Intent.putExtra()でバイナリデータ(アイコン)を渡してる
       あんまり大きいサイズは渡せない(ハードに依存)

       byte[]
               binary data
               bitmap
       serializable
               Object
       Bundleも便利

■SharedPreferences
       マルチプロセスには現在、非対応

       MODE
               同一アプリ内なら、MODEは気にしなくてよい
               ファイルのパーミッションで管理されている

       実際はFile
               /data/data/application_name/shared_prefs/***.xml

■Content Provider
       Activity.managedQuery
               cursorのライフサイクルをActivityが管理

       SQLiteDatabase
               共有は必要ないけど、sqliteを使いたい場合

■Web server(cloud)
       データはサーバーへ
       java.net.HttpUrlConnection

       UI Thread(main thread)でhttp送受信はNG
               サーバーからのレスポンスが得られるまでの間、threadが止まる
                       ⇒ANR dialog (Application Not Responding)

               Androidが,ANRを出す条件
                       ユーザーからの入力に対して、5秒間反応しない
                       BroadcastReceiverに対する処理に10秒以上かかっている

               ANRを避けるために
                       ユーザーに待ってもらう
                               Progress barやProgress Dialogを表示させる
                       backgroundで通信
                               Threadクラスを継承したり、Runnable
interfaceを実装する形で通信処理を行うクラスを別スレッド化しておく


■速度
       Intent ⇒ SharedPref ⇒  ContentProvider ⇒ Http

       HTTPが一番遅い
               ただし、ハードによる


■メリット
       Network
               記憶容量を気にしなくてよい
               データの永続性が端末に依存しない
               共有範囲が自分の端末に限定されない

■デメリット
       Network
               時間がかかる
               処理時間が推定しづらい
               UXに注意を払う必要がある
               バッテリーに難あり

■まとめ
       SDカードも
       ハードウェアや、実行環境によってメリット、デメリットは変わるため、複数のデータ共有の方法を知っておくことは大事

Androidのゲーム開発

ゲームグラフ
       背景、キャラクタのサブグラフ

       「経過時間」を入力することにより、フレームスキップ(コマ落ち、処理落ち)しても自然に動く。

スレッド
       スレッドは3つ
               メインスレッド
               ゲームスレッド
               レンダリングスレッド


高速なゲームを作るには、パフォーマンスと拡張性/保守性のバランスを取ることが重要

       ゲーム中には、メモリ確保や開放はしない
       DDMSを使ってメモリの使用状況を確認
       C++みたいにコードを書こう!

       関数呼び出しのコストは半端じゃない

Google Analyticsを使ってアクセス解析をしてみる

はてなは簡単な設定で、Analyticsが利用できるのがいいですね。

そんなわけで、日頃どんな人たちがこのサイトを見ているのか確認してみます。

f:id:invent:20081225130759p:image

世間のブラウザシェアだと、IEを使っている人が圧倒的に多いですが、はてなは圧倒的にfirefoxユーザーが多いんですね。

あと、Google Chromeが12.42%と、まだ出てきたばかりなのにこの比率はすごいですね。

ちなみに、私は先日までGoogle Chromeを使っていたのですが、amebloが編集できないなどの理由で、
firefoxに再び戻ってきました。

Googleによると、ChromeRSS対応予定などが発表されていますが、ブラウザだけでなく、
コンテンツを提供するサイトの対応状況によっても、ブラウザ選びが変わってくるのではないんでしょうか。

結局Google Gearsってなんなの?

最近ではあまりラボの進歩があまりないように見えるGoogleですが、
そのGoogleのGrearsっていうのが、結構いろんなところで見かけるようになりましたね。
例えば、

なんかが結構有名ですね。
サービスによって、Gearsの使い方が結構いろいろあります。

その前にどんな機能が実際あるのか?

Google Gearsの機能

  1. オフライン時のために、サーバーのリソースをキャッシュに保存
  2. クライアントサイドのDBを持つ
  3. スレッド機能

というのが、3大要素ですかね。

Google GearsってWebアプリケーションをオフラインで使えるようにするものってイメージが結構
あったりしますが、他にもいろいろ使い方があります。

例えば、Wordpressなんかではローカルに管理画面で読み込むデータをキャッシュすることにより、
管理画面の高速化をやってたりします。

オフラインにするというだけでなく、既存のWebアプリケーションにもいろいろと適用することができるんですね。

また、クライアントサイドのDBというのが、Sqliteなので、
Gearsの中でデータベースを作ったりということができるようです。
詳しくはこちらを参照。

基本Gearsはクライアントサイド技術なので、javascriptを使用します。
javascriptをガシガシ書くのが好きな人はいいと思います。

また、GoogleのAndoroidでも、mobile用のgearsが搭載されるらしいので、
まだまだいろいろ期待できそう。

Google Gadgetにタブを追加してみる

Google GagetでAPIで取得したデータなどを表示するのはできましたが、
よくあるガジェットにはタブが採用されています。

このタブの仕組みがよくわからなかったのですが、
意外に結構シンプルな仕組みで実装できました。

tab.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<Module>
  <ModulePrefs title="タブサンプル" height="140" scrolling="true" > 
    <Require feature="tabs" /> 
  </ModulePrefs>
  <Content type="html">
  <![CDATA[ 

    <script type="text/javascript">
    var tabs = new gadgets.TabSet(__MODULE_ID__, "Two");
    function init() {

	tabs.addTab("1つ目", {
	   contentContainer: document.getElementById("one_id")
	});

        tabs.addTab("2つ目", {
           contentContainer: document.getElementById("two_id")
        });

    }

    gadgets.util.registerOnLoadHandler(init);
    </script>

   <div id="one_id" style="display:none">1つ目のタブの内容。</div>
   <div id="two_id" style="display:none">2つ目のタブの内容。</div>
  ]]>
  </Content>
</Module>

解説

  1. の部分でタブを表示するのに必要なライブラリを読み込む。
  2. gadgets.TabSet() コンストラクタ を使用して、tabs オブジェクトを作成。
  3. addTab() 関数を使用して個々のタブを追加。タブの内容は、idをもとに
    要素の内容を追加する。

これでこんな感じでタブが作れます。
f:id:invent:20081213233205p:image

Google Gadget上でいろいろやってみる2

前回は足し算スクリプトなる、足し算ガジェットを作ってみましたが、今回もjavascriptとgadgetの勉強という名目のもといろいろ作ってみたいなーと。

今回はおみくじgadget。
ソースはこんな感じです。

<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs title="おみくじ" />
<Content type="html">
<![CDATA[
<script type="text/javascript">
function fortune(obj){
     var message = new Array(4);
     message[0] = "大吉!";
     message[1] = "小吉";
     message[2] = "凶";
     message[3] = "大凶…";
     var rand = Math.floor( Math.random() * 4 );
     obj.box1.value = message[rand];
}
</script>
</head>
<body>
<h1>おみくじプログラム</h1>
<div class="form">
<form name="frm1" action="" method="">
<input type="text" name="box1" value="今日の運勢は…" />
<input type="button" name="calc_btn" value="占う" onclick="fortune(this.form);" />
</form>
</div>
]]>
</Content>
</Module>

これをインポートしてやると、こんな感じに表示されます。
f:id:invent:20081208141922p:image

やべーすごい簡単。
ということでもう少し難しいことできたらいいなと。