AndroidアプリをAndroidを使って作る

材料

Androidタブレットにconnectbotをインストール

ちなみに私は下記端末+

8インチタブレット用キーボード付きケースで試しました

  • Androidマーケットからconnectbotで検索
  • インストール

しかし、、、ctrlやtab,escが効かないので vimで編集とかとてもしにくい状態

UbuntuCLI Android Development環境をつくる

sun-java6-binをインストール
 $ sudo vi /etc/apt/sources.list
 #下記を追加
 deb http://archive.canonical.com/ lucid partner
 $ sudo aptitude sun-java6-jdk ant apache vim git
android sdk linux x86をインストール

Download Android Studio and SDK tools
から android-sdk_r09-linux_x86.tgzをクリック

 $ tar xvzf android-sdk_r09-linux_x86.tgz
 $ sudo mv android-sdk-linux_x86/ /usr/share/android-sdk/
android sdk セットアップ
 $ export PATH=$PATH:/usr/share/android-sdk/tools/
 $ android update sdk -u

Installed Google APIs by Google Inc., Android API 8, revision 2
Downloading GALAXY Tab by Samsung Electronics., Android API 8, revision 1
GALAXY Tab用のSDK?もダウンロードしてる..

プロジェクトを作成してみる
 $ android create project -t 4 -p $PWD/KeyTest -k "la.zeg.android.keytest" -a KeyTest
 $ export PATH=$PATH:/usr/share/android-sdk/platform-tools/
 $ cd KeyTest/
 $ ant debug
 /usr/share/android-sdk/tools/ant/main_rules.xml:306: Execute failed: java.io.IOException: Cannot run program "/usr/share/android-sdk/platform-tools/aapt": java.io.IOException: error=2, No such file or directory

ん? No such file or directory

 $ cd /usr/share/android-sdk/platform-tools
 $ ./aapt
 -bash: ./aapt: No such file or directory

んー調べたら 下記をインストールしたらなおるみたい
64bit環境だからかな

 $ sudo aptitude install lib32z1-dev  lib32stdc++6  
 $ ./aapt 
 動くようになった
キーコードを調査するためのでもアプリつくる
 $ cd KeyTest
 $ vim 
 $ vim src/la/zeg/android/keytest/KeyTest.java
 package la.zeg.android.keytest;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.TextView;

public class KeyTest extends Activity implements KeyEvent.Callback
{
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
        }
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
                TextView t = (TextView)findViewById(R.id.textview);
                t.setText(""+keyCode);
                return super.onKeyDown(keyCode, event);
        }
}

こんな感じのでもアプリをつくって
apkを公開

 $ cp bin/KeyTest-debug.apk /var/www/

Tabletでアクセスしてダウンロード,インストール
調査すると

  • ALT:57
  • F2:82
  • Tab:61
  • Ctrl,ESC,F1:0

Ctrl,ESC,F1が同じコードが割り当てられているようだ
そこで

  • ALT->Ctrl
  • F2->ESC

として Tabのキーコードを変えてconnectbotを使いやすくする

connectbotの改造

android is01+ConnectBotでCTRLとESCが入力出来るようになりました - mk18のプログラミング日記を参考にさせていただいて
改造

 $ git clone https://github.com/kruton/connectbot.git

こんな感じに改造

 $ diff -c connectbot/src/org/connectbot/service/TerminalKeyListener.java connectbot_fr-809/src/org/connectbot/service/TerminalKeyListener.java 
*** connectbot/src/org/connectbot/service/TerminalKeyListener.java      2011-01-29 23:10:06.000000000 +0900
--- connectbot_fr-809/src/org/connectbot/service/TerminalKeyListener.java       2011-01-29 21:03:47.000000000 +0900
***************
*** 49,55 ****
        public final static int META_SHIFT_ON = 0x10;
        public final static int META_SHIFT_LOCK = 0x20;
        public final static int META_SLASH = 0x40;!       public final static int META_TAB = 0x80;
  
        // The bit mask of momentary and lock states for each
        public final static int META_CTRL_MASK = META_CTRL_ON | META_CTRL_LOCK;
--- 49,57 ----
        public final static int META_SHIFT_ON = 0x10;
        public final static int META_SHIFT_LOCK = 0x20;
        public final static int META_SLASH = 0x40;
!       //public final static int META_TAB = 0x80;
!       //zegenvs change TAB 128 -> 61
!       public final static int META_TAB = 0x3D;
  
        // The bit mask of momentary and lock states for each
        public final static int META_CTRL_MASK = META_CTRL_ON | META_CTRL_LOCK;
***************
*** 403,408 ****
--- 405,420 ----
                                bridge.redraw();
  
                                return true;
+                       case 57:        //ALT->CTL
+                               metaPress(META_CTRL_ON);
+                               bridge.redraw();
+                               return true;
+ 
+                       case 82:        //F1->ESC
+                               sendEscape();
+                               bridge.redraw();
+                               return true;
+ 
                        }
  
                } catch (IOException e) 

コンパイル
その前に
ProGuard | Official website
から ダウンロードしてproguard.jar を
connectbot/tools/proguard.jar
に配置
android target を変えないとコンパイルできなかったので7に変更

 $ android update project --target 7 --path $PWD
 $ ant proguard debug
 #またapacheで公開
 $ cp bin/ConnectBot-debug.apk /var/www

Tabletでアクセスしてダウンロード,インストール.
なんとか 出来ました
 以上

Android Bazaar and Conference 2011 Winter行ってきました

スマートフォンGREE (HTML5+JavaScript & Android)

会場の人たち
スマートフォンGREE(HTML5のすばらしさ)
  • 2010/8/9リリース
  • すべてajax
    • もっと見るはAjaxで追記
    • タブを切り替えた場合はContentsの部分が動的に切り替わる
    • フォトはCSSアニメーションでなめらかに
    • 次の写真は事前に裏でロードされている
  • iOS,android(xperia)で動作
  • HTML5+CSS3+javascript
要素技術
  • PCと違ってIE対策がないのでかなり楽
  • android,iOSともにwebkitベースのブラウザなので新技術を積極的に採用
  • ajax
    • 必要な部分だけ新しくする
  • HTML5
  • CSS3,animation,transform
    • 変形機能
HTML Forms
  • フォーム機能拡張
    • placeholderのサポート
      • フォームに薄い表示ができる
<input placeholder='メールアドレス' />
      • Android1,6だと動作がおかしくなる
      • iOS4.0未満でtextareaには効かない
      • iOS3.1.3を使っている人が結構いるGREE
    • email
<input type=email />
      • androidでは対応してない
      • パスワードを覚えてもらえてもらえなくなる
    • number
<input type=number />
    • url,date,searchなんかがある
    • 入力値をクライアント側
CSS3
  • レベル3セレクタ
  • グラデーション
  • アニメーション
  • 変形
  • device-pixel-ratio
  • Selectors Level3
      • last-child/:first-child
    • :not(.loading)
  • webkit-gradient
    • ボタンを作るのに便利
      • グラデーションがかかる
      • 丸角がCSSでつくれる
  • webkit-transition1
    • CSSスタイルの値を指定した時間でなめらかに変化させてくれる
    • jQueryよりなめらか
      • jQueryはタイマーで変化させている
      • jQueryは高負荷
      • High fps
      • Low ジッタ
    • 数字から数字への変化
      • height:auto -> height:0はできない
  • transform3d
困ったこと
  • アニメーションGIF
  • devicePixcelRatio
    • 多くの端末がdevicePixelRatio=1.5
    • 解決策
      • 2倍のサイズの画像を縮小して表示
Androidアプリ版
  • スマートフォン版にあ実現機能を追加
    • IS03プリインストールのGREEアプリ
      • 一言を書く欄の下に写真を撮るとかできる
      • Nativeアプリに渡せる
写真アップロードの仕組み
  • class GreeAppJs <->WebView
iOSでもできる
  • webView:shouldStartLoadWithRequest:navigationType:
  • stringByEvaluatingJavaScript
  • 表示部分をHTMLでつくるどうしても必要なものをNativeでつくる!!すごい
  • クライアントバイナリはそのままで表示だけ変更可能
    • iOSは審査が厳しいのでバイナリを差し替えは厳しい

まとめ

Application cache
  • manifestで指定したファイルをオフラインキャッシュとして保持可能 <10M
  • 大量の小さな静的ファイルをキャッシュ
Web SQL Database
  • SQLite
  • サーバから読みだしたデータをローカルに保存可能 <10M
  • SQLでデータを読み出せるのでアプリケーションを機能的にリッチにできる
  • jsでHTMLのレンダリングをないといけなくなるので工数的に断念

HTML5によるリッチクライアント開発手法についてあれこれ

  • 白石俊平さん
  • HTML5開発者コミュニティ
  • HTML5&API入門
Web開発/HTML5の基礎知識
Web開発/HTML5の標準化団体
HTML5基礎知識
  • HTMLの最新場ジョン
  • 2011/5/22に仕様が確定する予定
    • 一応確定
    • ブラウザベンダーに確認
    • テストケースを作っていく
  • IE9.0 60%, Firefox 88%, Safari:91% , Chrome 10.0 : 93% , Opera 11.1:75%
    • 今年中にはかなり使える!!
どこまでがHTML5?
HTML5が可能にするもの
  • より美しく,インタラクティブ
  • 操作性とリアルタイム性を高く
    • Web Workers .. BackGroundの処理を可能
    • Web Socket ... リアルタイム性の高い、新たな通信新形式
      • サーバ・クライアントがほぼ対等に
      • 任意のタイミングで双方向通信
      • 基本的にはHTTPベースではない
      • 受け入れられたらその通信が使いまわせる
    • Server-Sent Events .. HTTPのサーバプッシュ
  • Offlineでも利用可能に
    • アプリケーションキャッシュ...オフライン利用可能なキャッシュ
    • WebStorage ... 簡単に利用出来るストレージAPI
    • Indexed Database API .. ブラウザ組み込みのKVS
    • File API .. ファイルの読み書き
  • Webサービス間の連携がさらに容易に
    • Cross Document Messaging ... Webページ間のメッセージ通信
    • Cross Origin Resource Sharing ... オリジンドメインを超えたHTTP呼び出し
  • プラットフォームとのより深い統合
    • Drag & Drop API ... ドラッグ&ドロップ 処理
    • Geolocation API ... 位置情報取得
    • Device APIs ... モバイルデバイス向けAPI群,カメラ、センサー、コンタクトリスト
HTML5によるRIA開発
JSによるRIA開発困難
  • 非同期処理中心のプログラミング
    • コールバック地獄
アプリケーションアーキテクチャ
  • クライアントしかできないものはクライアントに
  • サーバしかできないものはサーバ
つまり...
  • Web1.0 ... テンプレートエンジンによるHTML動的生成
    • HTML内にUIとデータが混在
  • HTML5
    • UIとデータを分離
    • WebAPIを通じたデータの読み書き
    • 基本的にはHTMLは空っぽ,SEO的によろしくない
    • HTTPリクエストが増えまくる
      • Cache!!,Cache!!,Cache!!
オフラインWebアプリへ
  • HTML5時代のキャッシュ技術
    • 静的なリソースのキャッシュ
      • HTTPヘッダで制御可能
    • 動的なリソースのキャッシュを適切に行うのは難しい
  • アプリケーションキャッシュ
    • HTML/CSS/JS/画像をまるごとキャッシュされる
      • リソースがすべてローカルから読み出される
      • DaVinciPadすぐ出てくる
  • ローカルストレージ
    • Web Storage/Web SQL Database/Indexed DB という3つがある
    • 動的なキャッシュに向いている
どの技術をいつ用いるか
  • 静的なUIリソース
    • アプリケーションキャッシュ
  • 半永続的な、、別の人がアップした画像
    • HTTPのキャッシュ
  • サーバから読み取ったデータ
    • 変更頻度によって使い分ける
  • クライアントで生成したデータ
    • スマートフォンでいきなりオフラインに、、地下鉄
      • ローカルストレージに一旦キャッすする
      • あとからサーバと同期
  • 今後フレームワークで吸収されるのでは

Androidウェブアプリケーション連携術

自己紹介
はてなAndroid 事例1:フォトライフ for Android
  • はてなフォトライフの写真を快適に閲覧
    • 同一Activity
    • インテントを投げて全部別インスタンス
    • 遷移前に保持しているサムネイルは開放し onResume時に改めてキャッシュから読みなおす実装
    • Backボタン時にロードが走るようになったが許容範囲
    • 端末の回転
      • アクティビティが作り直される
      • onRetainNonCOnfigurationInstanceを実装することで
  • 写真アップロード,自動アップロード
    • Serviceは積極的に使う
    • 写真閲覧のプロセスと別にすることでService自体のメモリ使用量を減らし,killされにくくしている
    • 非同期API(Intent.ACTION_SEND) Serviceに投げっぱなし
    • 同期API
      • プログレスを表示するためaidlを書き内部でIPC
    • 自動アップロード機能
      • Serviceを常時起動
      • 数10秒ごとにファイルシステムを監視-> バッテリー食う ->スクリーンが付いている時だけ監視
      • lastModifiedが起動直後狂うので頑張る
    • Service常時起動
      • AlarmManagerで定期的に死活監視
      • Notificationが出ていても起動しているとは限らない
    • 起動直後の時間狂い
      • 起動直後はTZが設定されるまでディレイがある
メモリ消費削減の手段
はてなAndroid 事例2:はてなログイン管理
  • アカウント情報管理アプリ
  • OSのContentPrvider+permissionを考えていた
  • セキュリティ上の問題
    • は先に定義したもの勝つ
      • 悪意のアプリが先にPermission定義しちゃうとまずい
はてなAndroid 事例3:はてなモノリス
  • バーコードを読んでモノを共有するサービス
  • アプリでバーコードを読んで投稿する
  • 出来る限りWeb
  • Webのシームレスな連携
  • zxingを使った
    • 依存関係が複雑
      • 移植頑張った
adb shell am start -n com.example.foo/.Setting --ez debug true

を投げるとデバッグで任意
インテントが投げられる

  • 国際化

Locale.javaを実装

はてなAndroid 事例4:はてなココ
  • 一情報共有サービス
    • WebViewがアプリ組み込み
WebエンジニアからAndroid

Android2.3 (Geneerbread API)

NearFileldCommunication
if(NfcAdapter.ACTION_TAG_DISCOVERD.equals(action){...
}
  • NDEF
    • NFCによるデータ交換はこの形式
    • Suica,Edy,運転免許証だと値が取れない
      • 実機では未検証
  • NdefMessage
    • NdefMessageはひとつ以上のNdefRecordから構成される
    • 一般的には1レコード
DownloadManager
  • SystemのService
DownloadMnager mDownloadMnaager = (DownloadManager) getSystemService(Content.DOWNLOAD_SERVICE);
  • バックグラウンドでダウンロードしてくれる
  • ダウンロードする対象をUriで指定
Uri uri = Uri.parse("http://download/image.png");
DownloadMnager.Request ...
  • 保存先をできる
    • デフォルトはキャッシュ
StrictMode

Y.A.M の 雑記帳: Android Android 2.3 - StrictMode -

  • デバック用
  • Application Not Responding
    • main threadが5秒以上反応しない
    • BroadcastRecieverが10秒以内で終わらない
  • ANRの原因になりそうな処理を検出してくれる
    • UIスレッド上でのネットワーク処理
    • 時間のかかるディスク偉
UI Framework
Android NDK

Android NDK

  • JavaではなくC/C++使って開発
  • NDK 4まではJava<-JNI->C
  • NDK 5からはCだけで開発可能
    • ndk-buid
  • Logcatをみると..
    • Java 16/sec
    • NDK 40/sec
  • Nativeから直接制御
    • ライフサイクル
    • ユーザInput
    • ウィンドウ制御
    • センサーリスナー
    • ハードウェア構成管理
    • apk外部のアセットをネイティブコードから読む
    • ストレージマネージャ
    • OpenSL ES を通じたNaiveーディオAPI
android.os.strage
  • storageAPI
  • ディくイメージのオンデマンドマウント
    • vfat
    • イメージの暗号化
    • オーバレイさせることが可能
SIP-based VoIP

Samples  |  Android Developers

  • Session Insiation Protocol /ひかり電話等で使われている
  • voIP:インターネット電話
  • ベンダーが許可する
SipManager#isApiSupported()
  • アプリでVoIP機能を実現するためのAPI
Mixable audio effects
  • オーディオエフェクトに対応
  • トラック単位でも全体にも適用可能
  • OpenSL ESベース
Multiple Camera Support
  • 複数カメラ標準でサポート
  • android.hardware.Cameara
getCameraInfo(int,CameraInfo)
getNumberOfCameras()
PackageManager
  • PackageItemInfo
Telephony
  • ネットワークタイプが増えた
  • getPsc
Graphics
AlermClock

以上 書ききれない部分もありましたが
とても勉強になりました.

個人的には 表示部分をHTMLでつくるどうしても必要なものをNativeでつくる
というのがとても印象に残りました。

kindle3がやっと到着しました

8/6に注文して本日無事に到着

場所 日付 現地時間
NARITA, JP 2010/09/04 11:25 ロケーションスキャン
2010/09/04 11:24 仕向国センタースキャン
2010/09/04 10:53 空港上屋スキャン(輸入)
2010/09/04 8:34 積み替え完了スキャン
2010/09/04 8:28 空港到着時刻
2010/09/04 8:28 空港到着時刻
ANCHORAGE, AK, US 2010/09/03 8:36 空港出発時刻
2010/09/03 8:36 空港出発時刻
2010/09/03 7:00 空港到着時刻
2010/09/03 7:00 空港到着時刻
ONTARIO, CA, US 2010/09/03 2:40 空港出発時刻
ONTARIO, CA, US 2010/09/02 23:04 空港到着時刻
PHOENIX, AZ, US 2010/09/02 22:00 空港出発時刻

大体3日で到着したので以外と早かった
確か到着予想は8日だったので3日も早くきたことになる

さて、箱を開けてすぐにブラウザを立ち上げて
いろんなサイトを見たが、
やっぱり PCのサイトを見るにはちょっと辛い
そこで SmartPhone用のページをいくつかブックマークしたので
メモ

第102回カーネル読書会に行ってきました

自分用メモ

DTraceでできること

DTraceで見れるコンポーネント
DTraceの使いかた

観測点が見える

$ dtrace -l

provider一覧

$ dtrace -i | awk "{print $2}" | sort -u

システムコールのプロバイダを見る

$ dtrace -n 'systemcall:write:entry{@lexecname,pid]=count();}'

関連
trasコマンド

CPU負荷
$ dtrace -n 'profile-997/arg1/{@[ufunc(arg1)}=count();}...'

DTraceによるMySQL解析ことはじめ

自己紹介

奥野幹也(Sun)さん

MySQL
  • OpenSouceのRDBMS
  • MySQL AB -> Sun -> Oracle
  • 使いやすく、安定、高速
  • Oracleに買収されても開発は大丈夫
    • MySQLチームはほとんど残っている
  • MySQL6.0は廃止
    • 機能を詰め込み過ぎた

MySQLエキスパートトラブルシューティングガイド
参考
http://forge.mysql.com/wiki/Main_Page
MySQL :: MySQL Community Downloads

MySQLの特徴
DTrace
  • カーネル/ユーザプロセスをトレース
  • プローブと呼ばれる観測点を対象んプログラムに動的に埋め込む
  • プローブの種類に応じたプロバイダ
  • D言語と呼ばれるプログラムで操作

[ユーザ空間] ユーザプロセス dtrace

                                                                          • -

[カーネル空間] プロバイダ プローブ
カーネル挙動を追尾する「DTrace」の実力 (1/8) - ITmedia エンタープライズ

プロバイダ 提供される主な情報
dtrace DTraceの開始時や終了時、エラー発生時などにイベントが発生するプローブ。後述のDスクリプトでプログラムするときに、初期化処理や終了処理、エラー処理などを記述する時に用いる
lookstat ロック状態が変化した時にイベント発生するプローブ
profile 一定時間ごとにタイマイベントを発生するプローブ。定期的に値を集計したい時などに用いる
fbt Function Boundary Tracing。カーネル内部の関数への突入/退出ごとにイベントを発生するプローブ
syscall システムコールへの突入/退出ごとにイベント発生するプローブ
sbt Statically Defined Tracing。アプリケーション定義のプローブ。アプリケーション開発者があらかじめsys/sdt.hにある関数群を呼び出し、DTraceのイベントを発生させるように構成する時、該当ルーチンを通過するとイベント発生する
sysinfo カーネルのステータス情報(kstat -n sysで取得できる情報)を提供するプローブ
vminfo カーネル仮想メモリ情報(kstat -n vmで取得できる情報)を提供するプローブ
proc プロセスの生成、終了、シグナル受信などが発生した時にイベント発生するプローブ
sched CPUスケジューリングに関する情報を提供するプローブ
io ディスク入出力情報に関するプローブ。iostatコマンドで取得できる情報を提供する
mib Management Information Bases(MIB)情報を提供するプローブ。kstat -nやnetstatコマンドで取得できる情報を提供する
fpuinfo SPARCプロセッサのFPUシミュレート機能状態を提供するプローブ
pid 任意のプロセスIDをもつプロセス内の指定した位置の関数への突入/退出ごとにイベントを発生するプローブ
plockstat プロセスのロック状態を知らせるプローブ
fasttrap ユーザープロセスがDTraceを呼び出すときに、そのユーザープロセスに対してデータを流し込むためのハンドラ。現状では利用されない

DTrace Tools

D言語
/述語/
{
  アクション
}
mysqld内に設置可能なprobe

なぜかわからないエラーが出る場合にサーバ側でトレースできる!!

  • pid
    • 関数のentry
    • 関数のreturn
    • 関数のoffset
    • 書式)pid123
  • fasttrap
    • MySQL5.4で追加された
    • 書式)mysql123

SQL文を抽出

pid$target::*mysql_pgrace*:entry
{
  trace(copyinstr(arg1));
}

http://forge.mysql.com/wiki/RandomQueryGenerator
MySQL5.4以降の、include/probes_mysql.d
これとか
./support-files/dtrace/query-filesort-time.d
./support-files/dtrace/query-execandqc.d
./support-files/dtrace/statement-time.d
./support-files/dtrace/query-rowops.d
./support-files/dtrace/query-parse-time.d
./support-files/dtrace/query-time.d
./support-files/dtrace/locktime.d
./support-files/dtrace/statement-type-aggregate.d
./support-files/dtrace/query-network-time.d

MySQL5.4で追加されたfastrrap クエリキャッシュのヒット率を算出

[ThinkIT] 第6回:query_cache_sizeの違いによるパフォーマンス比較 (1/3)
文字列をキーにしてキャッシュ

1000行以上ファイルソートしているクエリを探す
BEGIN
{
  printf("Hit Ctrl+C to exit._n");
}

mysql$target::filesort-start
{
  self->sortig = 1;
  self->db= arg0 == 0 ? "NULL" : copyinstr(arg0);
  self->table = cpoyinstr(arg1);
}
mysql$target::filesort-done
{
.
.
.
}
Q&A
  • fastrapをマクロで埋め込む場合の注意すべき点
    • MySQLで使われているテクニック
      • Linuxはdtraceがない
      • preprocessで#define文でなにも埋め込まれない
  • linux fastrapのような支援マクロはある?
    • ない
  • dtraceではなく(5.4以下)filesortしているものを抽出するには
    • 関数の境界はdtraceが使える(pidプロバイダ)
  • dtraceをして負荷が増してdownが嫌
    • そういうこともある
    • 関数の境界を*で引っかけると負荷がかかる
    • 対象をしぼってtraceすることが重要
    • まずはOSのstatでどこがネックになっているか調べる

プレゼンやソースが公開されているみたいです
漢(オトコ)のコンピュータ道: 第102回カーネル読書会 at 楽天のプレゼン資料公開しました。 #kernel100329

https://addons.mozilla.org/en-US/firefox/addon/4723をFirefox3.6で使う

IEや他のブラウザ
https://addons.mozilla.org/ja/firefox/downloads/file/50726/save_complete-1.0.1-fx.xpi
を入力してエンター 保存

save_complete-1.0.1-fx.xpi.zip
に名前変更

zipを展開

install.rdf
を編

       <em:maxVersion>3.9</em:maxVersion>


zip圧縮

save_complete-1.0.1-fx.xpi
に名前変更

Firefoxでsave_complete-1.0.1-fx.xpi
を開く

Add-onインストール、再起動

http://example.com/page.html
に行く

ファイル->Save Complete Page As..

Cookpad x シリウステクノロジーズ勉強会に行ってきました

挨拶

クックパッド開発部長 井原さん
シリウステクノロジー 安藤さん
  • 会社の魅力は社員

cookpadAWS

自己紹介
ログ解析(通常)

scheduler->worker app -> db

  • カウントのキャッシュPV/UUの解析
    • ユーザの要求が理解できていない
    • 複雑な条件で解析したい
      • 無料/有料会員のアクセス頻度
ログ解析(cookpad)

scheduler->worker app -> db
|
+- Ec2/S3 Hadoop

Hadoopクラスタ
  • Amazon EC2
  • Large instance
  • 10-20 instance/day
  • Cloudera AMIをカスタマイズ
  • CDH1
  • 独自スクリプト追加
  • MySQL等書くソフトインストール済み
Hive
SELECT count(1) FROM pv_users WHERE date="20100219" and hour = "12"
  • MySQLで可能なことは大抵OK
    • DISTINCT
    • GROUP BY
    • JOIN
Hiveのメリット
  • SELECTがスケールする
質問
  • INSERTやUPDATEはスケールするのか?

クックパッドのものづくり

自己紹介
cookpad
  • 当初は有料サイト
  • 915万UU/month
  • 16-18時がpeak
  • 秋からバレンタイン
Goodはやらない
  • Bestに集中する
  • Bestとは
    • 料理が楽しくなるか(やりたい)
    • 世界一になれるか(とくい)
    • 儲かる
もの作り3原則
  • 無言実行
    • 告知なし
    • サービスを言葉にできない
    • ユーザにメリット無し
  • 言語化
    • 機能を一瞬で理解できるI/Fを
    • ユーザはヘルプを読まない
  • サービスに値段を付ける
    • 無料だという理由ではつかわれない
    • お金を払ってでも使いたいサービスが無料だと使われる
質問
  • なんで500円の有料モデルを止めたのか?

レゴとプラレールをくっつけろ(内外混成チームとものづくり)

自己紹介
シリウステクノロジーズ
チーム
  • 世界中からエンジニアがある
  • 公用語は英語
  • 20% Ph.D
コミュニケーションや文化の問題を緩和
  • 簡単な言葉
  • 主語、述語をそろえて
  • Skypeチャットで言葉の理解をバッファ
  • ホワイトボードの活用
  • 問題は仕組みで解決
  • 議論はし尽くす
スクラム
  • あじゃいるな開発手法
  • 2-4習慣で区切られた開発期間
  • 機能横断的なチーム
  • ProductBacklog
  • SprintBacklog
  • 2-4weeks
  • Daily scrum


作ったもののレビュー(Sprintレビュー)

Ridding ショットガン

自己紹介
  • Viktor(ハンガリー)さん prezi.comにいた
  • Robby(オーストラリア)さん
AdLocalの FlontEnd
  • 3層になっている
Semantic HTML
  • 最小構成のHTML
    • 意味だけを表す
  • DIVやSpanを使わない
  • インラインCSSを使わない
  • インラインJSを使わない
DRY CSS
  • CSSをモジューラー化しる
  • 画像をできるだけ使わずにCSSだけで
unobrit javascript
  • パフォーマンスは重要
  • モジュールを疎結合
    • HTTPのレスポンス
  • Firebug等で計測
  • 最適化する

Testing@cirius

自己紹介
  • Ericさん
UnitTest
  • クラスひとつに1づつRSpec
  • YUIをつかってテスト
Integration Test
受け入れテスト
  • Post-itを使う
  • マネージャとレビューして機能
負荷テスト
    • JMeter
      • Random locations
      • Random load
ユーザビリティテスト
  • プロトタイプをまず作る
  • Flashで作る
自動化に関して
  • UnitTestとIntegrationTest
  • Hudsonを使っている

新製品near nearに付いて(Android)

自己紹介
  • 橋本さん
アプリ紹介
  • おいしいレストランとか行きたいけど忘れたという経験
  • お店を検索してブックマークに追加できるアプリ
    • 住所とかタイトルを抜き出して保存できる
  • 4sq.comのようなチェックイン機能がある

Sinatra導入事例とTips

Sinatraとは?
  • SimpleなRubyFW
  • ウェブアプリを書くためのDSL
get '/' do
 "<h1>hello world"</h1>"
end

ruby hello_world.rb
http://localhost:4567
で動く

特徴
productionは
  • passengerを使うと簡単
導入事例

のアプリをsinatoraに

よかったこと
  • パフォーマンス
  • コードがすっきり
  • 簡単deploy
  • testが書きやすい
  • GAEでも簡単に動く
Railsとの住み分け
  • Rails的になっていく
  • sinatora->Railsへのコンバートが
Sinatoraに向き
  • RDBに依存しないもの

EnigmoとBuyMaAWS

自己紹介
システム
まとめ
  • S3はストレージとして使えない
  • EBSは便利
CloudFront
  • クエリストリングにパラメータをあたえてもキャッシュされてしまう

広告効果システムの開発環境

AD Counter
  • 企画6人
  • Appエンジニア2人
  • インフラ1人
Trac
  • 情報は全てwiki
    • 機能ドキュメント,障害管理
  • バグはTicket管理
IRC+Plagger
CruiseControl.rb
  • CIツール
    • レポジトリがコミットされたらビルドを行う
    • IRCに通知
開発の流れ
  • スクラム
  • スプリントで行うことを決める
  • スプリントでブランチを切る
  • タスクを分割してチケットに登録
  • 日次MTG
    • 昨日やったこと今日やること、所外
  • 週次MTG
    • 企画者も参加

超小型人間型ロボットEMMA-U0A

自己紹介
デジタルまないた
  • まないたに画面が付いている
  • 料理のしかたを教えてくれる
  • みじん切りの回数表示
デジタルまないたTODO
  • ネットワークからレシピを取得
  • 料理ログからお薦め
  • テレビが見れる
  • 重さがはかれる

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はアトミックに値を増やせる