万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

appengine ja night 18 ( #ajn18 )

http://www.zusaar.com/event/170203

Google App Engineの倹約のすゝめ
<スライドのURL>
http://goo.gl/R99Uj

→見直し、価格を抑えられる

#ajin18
#gaeja

クラウド

・GAEの簡単な詳解
2008-04-08から公開
2011-11月に正式リリース

・新旧課金体系の違い
無料枠が小さくなった、純粋な値上げ
単位時間アタチの使用料が値上げ
有料とプレミアムの3種類
最低$9+$2.1/週
APIの使用回数が課金対象
データストアAPI
無料・回数無制限のAPIもある

・重要な項目
ユーザから立ち上がって起動する
フロントエンド

・Frontend Instance Hours
 Frontend インスタンスが起動していた時間

・Datastore Weits
 Datastoreの書き込み操作

→CPU時間だったのがインスタンス時間になった

起動終了管理できるのが
バックエンド

インスタンスごとの稼働期間+APIの使用料を課金。
インスタンスの数が大きく影響する。

・CPU HoursとInstancee

CPU Hoursだけでなく、インスタンスの起動時間+αが課金対象になる

インスタンス CPU時間に比べると単位が大きくなる
インスタンス数を減らす

インスタンスが空くまで、キューの中で待機する(Pending Request Queue)

・スケジューラ
どの空きインタンスに(Idle Instance)に処理を任せるのかを決める。

・Application Settings - Performance
 Max Idle Instance Instances:ここで設定した数以上のアイドルインスタンスが存在しても課金対象にならない。

 Min Pending Latency:Pending Latencyがここで設定した時間を超えるまではインスタンスが立ち上がらない。
 どのくらいきゅーでますか?

 Max Idle Instances 最小限の1を設定する
  Min Pending Katency 15sに設定する
  できるだけインタンスを〜〜

・スケール設定による節約の事例
LingrBot
 RedmineのActivityをURLFetchする

データストアのwriteとreadを設定しないと

インスタンス時間を減らす
 concurrent requestを利用する
 1つのインスタンスで同時に複数のリクエストを処理できる
 PythonはHIDに限る

appengine-web.xml
true

app,yaml
threadsafe: true

・Put Ops, Index Writes Opsとは
新規PUT
Entity Tableへの書き込み

Index Tableへの書き込み

1 Put Ops + 11 Index Write Ops = 12 Write Ops

上書きPUT(p2のみ変更)

・Datastore Writes Operationを節約
一回のPUT操作=1 write ops...ではない

・Single Property Indexを使わない方法
 ・Java
  entity.set〜〜
 ・Slim3
  @Attribute(unindexed = true) private String unindexedString;
 ・Python
  indexed=false
 ・Go
  noindex

・unindexed設定後二回目以降のPUT(2)
 p2,p3がunindexedになっ

 unindexedで保存しなおしても、一回目は

二回目に効果が出る

一回のPUT操作=1 write ops..ではない!

Single Property Indexを節約した事例
ソーシャルゲームアプリケーション
 位置情報を利用した、領地取りゲーム
・設定前

 〜〜〜

・Datastore Read Ops
Memcache APIを活用する」
 ・クエリを実行したて50件のエンティティを取得する
 1Query Ops
 50Fetch Ops
・51 Read Opsを消費する
・キャッシュしても問題ないクエリ結果はキャッシュする。
 memcache APIは無料

・Keyだけで良い場合はKeyだけ取得する
・Keyの取得だけならSmall Opsとなる
 1Query Ops
 50 Key Fetch Ops
 1 Reads Ops + 50 Small Ops


・Backend Instanceにも無料枠がある
 $0.72/dayの無料枠があるので活用しないともったいない。
 Taskの実行に使うのが便利。

backendsの定義とアプリケーションをデプロイする
queueの定義のtargetにbackendsの名前を指定する

・まとめ
 まずは「課金対象か?」を理解する。
・現在の課金の状況を正しく把握する。
・節約するポイントを決め、節約する。
 ・Instance Hourの節約
 スケジューラの調整
 concurrrent requetの節約
Datastore APIの節約
Writes・・・Single Property Index
Reads・・・Memcache、Key

フロントエンドは15分単位だとバックエンドのインスタンスも15分単位

Staticファイルのキャッシュは

アンインデックスにしていいがやっぱり復活したい
→インデックスしなおさないといけない
PUTしたタイミングでかわる。
PUTしなおせばよい。

concurrent request の設定はPython2.5でも有効?
→有効ではない

RPCしていないCPUでも複数スレッドに鳴る

Python2.7でもジャイアンインタプリタロック

カスタムインデックスはどんんだけながくても1

プロパティクラスをつくればいける?
Expand 動的にインデックスされる?

フロントエンドとバックエンドは料金は特別変わらない

・再便場の機能をひと通りレビュー
松尾さん


App Engine 細心除法
→GDDとほぼ同じ情報

http://goo.gl/s0P9P

1.5.1 X-AppEngine-Country ProtoRPC(JSONベースRPCのハンドラ構築用モジュール) SDKでのHRDエミュレーション

・Pending Latencies
11/7リリースでは設定できる
Max必ず新しいインスタンスを生成するようになる

Min Idle InstancesはAlways Onでは一部の人は設定できた。(1-7)
※今はできない

failfastをfalseにするとPending Queueに入れられる

Python Memcache CAS
CASはCompare And Setの略
排他的なアップデートができる

API Console 新しめのやつを管理できる

プレミアムアカウント
沢山のメールをやりとりしてやっと取得

Java Remote API

SSL for Custom Domain TT
Androidも前のバージョンが使えない
モダンブラウザならOKだが一部使えない

AppEngineはトランザクションが苦手。
できるが、触るエンティティは1つのエンティティの中にいないといけない

Slim3はGlobal Transactionを実装している

XG-transactionは5EGまで同時にトランザクションかけれる

Instance hour が半額 PythonJavaも。

Python2.5&Linuxで1.55から1.6に上げると重い(レスポンスが悪い。)
Chromeのバージョンが関係ある可能性がある。
 Pre-connectが関係する。切ってもなおらない?

有料から無料にするとどうなる?
Frontendキャッシュが効かなくなる
エッジサーバがあるが、

MAXインスタンスで瀬尾ギョできるのは


#ajn18



Input系 Unity

左クリック マウス用

if (Input.GetMouseButtonDown(0)) {
	Debug.Log("MOUSE");
}

これはマウスだけでなくAndroidもなぜか認識

Input.mousePosition;

Scene::raycastAnyShape: The maximum distance must be greater than zero!



Raycastをインスペクタで選択させる方法
http://unity3d.com/support/documentation/ScriptReference/LayerMask.html

    public LayerMask mask = -1;
    void Update() {
        if (Physics.Raycast(transform.position, transform.forward, 100, mask.value))
            Debug.Log("Hit something");
        }        
    }

mask.valueだよ。maskではない。

16進数の"0x"プレフィックス由来

http://q.hatena.ne.jp/1149751438

OnCollisionStayは常ではなかった Unity

コライダーがぶつかっている間常にログを吐かなかったので、
コライダーがぶつかっている間は常に判定はしていない。

void OnCollisionStay(Collision collision) {
    Debug.Log("log");
}

タグ付け Unity

gameObject.tag = "hoge"

hogeというタグがない(インスペクタで作ってない)のにGameObjectへ充てるとどうなるか実験した。

こんなエラーになる

UnityException: Tag: タグ名 is not defined!

スタンドアロンサーバ for Unity

node.jsの使いかたわからないので他のサービスを調べた

・SlimNet

→アセット作ってるがこれはサービスではなさげ?
 http://forum.unity3d.com/threads/111299-Release-SlimNet-Public-Alpha-(Free)

・Photon
http://www.exitgamescloud.com/

Hello Worldのやりかた
 http://doc.exitgames.com/v3/quickstart/helloworldpart1

→「Viking MMO Demo」と「Bootcamp FPS Demo」とプラグイン
 http://doc.exitgames.com/v3/demos/unitydemos

・uLink
http://www.muchdifferent.com/?page=game-unitypark-products-ulink

→FREE (30 DAYS)

・SmartFox
http://www.smartfoxserver.com/