デブサミ2014に行ってきた(2日目)

昨日に続き、今日もデブサミに行ってきました。

1日目に比べると面白い&刺激的なセッションが多かったです。
資料は下記ページに随時アップされています。

デブサミ2014、講演関連資料まとめ:CodeZine

以下、メモ。Evernoteをコピペしたらレイアウトがおかしくなったので、後で整形したい。。

【14-B-1】「やる気を引き出す組織風土のつくり方」

講演者:サイバーエージェントの藤田 晋社長
前提
  • 業績が伸びている
  • 社員が十分な対価を得られていること

組織

  • 20-30代が大半。40代は 3%
  • ポジティブな社員がマジョリティ
  • 抜擢は実績以上に人格を重視
人事
  • CA8:2年毎に1〜3人取締役を入れ替える
  • CAJJ制度:事業の利益規模によってJ1〜J5
  • あした会議:取締役と選抜された社員が、新規事業や課題解決を提案する合宿
  • 社内キャリアエージェント:→適材適所に全力を尽くす
社風
  • 社員総会:活躍した社員を表彰する
  • オープンなSNS活用
  • 飲みニケーション
  • 社内結婚が多い
  • 若手の抜擢:新卒入社の子会社取締役数42名
効果がありそうでないもの
  • 離職率の低さ
  • ストック・オプション:タイミングによって必ずしも優秀な人が報われるわけではない。辞めるタイミングができてしまう
  • 美人が多い?
  • にんじんボーナス
  • 仕事とプライベートの切り分け
まとめ
  • 空気が大事

【14-B-2】「グリーを支えるデータ分析基盤の過去と現在」

過去の話
  • データ欲しい人が増えてきた
  • (ディレクター等への)データ提供が正直しんどくなってきた
GREEデータ分析基板
  • コンセプト
    • Accessability
    • Scalability
  • ゲーム
    • Treasure Dataベース(ゲームへのアクセスログ)
  • GREE Platform
    • Hadoopベース(ゲームからAPIへのログ、ユーザ情報)

ゲームのデータ分析基板

  • Treasure Data
  • データについて
    • 約20ゲームタイトル
    • Webサーバー 2000台以上
    • log aggregator サーバー 40台以上
    • 送信データ量 1TB/月
  • アクセス遷移分析
    • ページ遷移:起点のページから何割のユーザーが目的のページに到達したか
    • 離脱
    • クリック:ページ内のどこがクリックされたか
      • 実際の画面にオーバーレイ表示
  • ジョブ管理ツール
    • データを社内に開放したことで、非効率なジョブが大量に投げ込まれる
    • →ジョブのモニタリングと管理が重要
      • ジョブの可視化
      • 強制 kill
GREE Platformのデータ分析基板
  • 利用状況
    • 5000ジョブ/日
    • 60TB
    • 130ユーザ(ほとんどが非エンジニア)

【14-B-3】「モバイル版グーグルマップのUXはいかにして作られたのか?」

概要
  • どのようなプロセスでデザインを決定したのか?
  • 日本人がいかにしてコミュニケーションをとったのか?
グーグルのデザインの特徴
  • グーグルの検索結果の1ページ目:原稿用紙5枚分、多くの人は10秒以内に次のページへ
  • 検索キーワドに応じて、地図、ニュースなどを推測して検索結果のトップに表示
  • ユーザーが何を求めているかを推測して賢く表示
グーグルの開発チームについて
  • PM、Eng、UX
    • UXはプロジェクトの初期から携わる
  • UXメンバー構成
    • UXデザイナー、ビジュアルデザイナー、ユーザーリサーチャー、リクルーター、ウェブディベロッパー、コピーライター
    • 世界中で活躍
  • 世界中のPM、Eng、UXが協力して1つのチームに
グーグルマップのUXがいかに作られたか
  • 機能が多くなった結果、グーグルマップを作り直すことに
  • コンセプト:地図を中心にしたアプリケーションに戻す
  • 乗り換えページ
    • トップ画面から時刻の情報を取り除いた
    • 目的地を入力すると、現在時刻からの検索結果を表示(モバイルの性質)
  • 世界中の人とコミュニケーションをとって開発
    • 例:アメリカは電車が時間通りに来ないから時刻は薄くして欲しい
    • どうやって意見をまとめていったか
      • 基本的には、全会一致。どうしても決まらない時はリーダーが決定することも。
      • チームメイトを信頼する
        • 直接会って、相手のことを知る:10分だけでも、ランチするだけでもよい
        • ヴァーチャルコーヒー:テーマを決めずにミーティングする
        • メールを書く:きちんと伝えられる、深く考えていることを知ってもらう
          • 英語が苦手だと会話では上手くコミュニケーションとれないことがあるため
  • まとめ
    • ディスカッションが頻繁に行われた
    • フラットな関係で意見を言い合えた
    • 上の2つにより、開発前に様々なシミュレーションができた
    • 短期間で開発
スクリーンの前で歩きながら発表するスタイルが特徴だった

【14-C-4】「DeNAにおけるゲーム以外の新規事業の立ち上げ方」

講演者:エンターテイメント事業本部(非ゲームの新規事業の開発)
サービス紹介
  • マンガボックス
  • Showroom
    • アイドルやタレントのパフォーマンスをライブ配信
  • チラシル
  • 他多数
  • 上記サービスを1つの部署で開発

ものづくりの進め方

  • スクラムの守破離
    • 現在のメンバーのほとんどが1年前にスクラムを経験
    • スクラムを忠実に実行するにはコストがかかる(バックログなどを全てアナログで)
  • 工夫してみたこと
    • 専任のスクラムマスターをやめる
    • タスクの粒度は荒く、ストーリーポイントは振らない
    • バーンダウンは排除
    • タスク管理は各チームやりやすい方法で(Git/アナログ/GoogleDocs)
  • 少人数体制
  • 結果
    • デイリースタンドアップがプランニングと振り返りも兼ねる
    • 開発の遅れもあまりなかった
  • 人が増えたら、進捗遅延や意思疎通など、従来の問題が出てくる

フィードバックの例

  • チラシル(ターゲット:主婦)
    • アルバイト募集で出を集める
    • モックアプリをインストールしてもらう
    • 2-3週間、利用し続けてもらい、リモートで感想を聞く
  • アプリゼミ(ターゲット:小学生)
    • 小学生と親にオフィスに来てもらいモックを使ってもらって評価
    • このサイクルを何回も繰り返す
  • Peko!(ターゲット:USの大学生)
    • USの大学前でテスターを勧誘(200人)
    • 2週間ぐらい使ってもらい、分析ログを分析。
    • ヘビーユーザーはユーザーインタビューも実施
    • Facebookログインは、事前にユーザーに聞くと半分は使わないと答えるが、実際に計測すると8割は使う

どこまでエンジニアが関与

  • 9サービス中4サービスはエンジニアが事業計画を立案
技術面の話
  • サーバアプリケーション
    • リードエンジニアが好きに使いたいフレームワークやミドルウェアを決定(今はPerlが多い)
  • インフラ
    • コスト優位な部分ではAWSも積極的に活用(海外とか)
  • スケーラビリティ
    • どんなにスモールスタートでも確保必須
    • 原則、ユーザが集まる前提で企画/開発
  • GitHub Enterprise
    • 各チームの各リポジトリをエンジニア全員がWatch
  • ネイティブアプリ
    • まずはどちらか一方だけ集中開発してリリース
    • スケールしそうになったらもう片方の開発を始める
    • iOSのバージョン:最近はiOS7専用が多い
  • 通知
    • コミュニケーションスピードが年々上がってきている
    • 通知のために常時接続
プロモーション
  • オーガニックの流入は、よくて30-40DL/日
  • 広告出稿してユーザを流入させ、効果測定を行う

1年経ってみて

  • 余計なことを考えずに、コトに向かうことが最重要
  • ひたすらフィードバックループを回して、コツコツ前に進む(銀の弾丸はない)

【14-A-5】「エンジニアだからできる 自由な生き方」

講演者:IKEAの人、風呂の人
※話が面白くてメモがあまり取れま(取りま)せんでした
  • 自由とは何か
    • 自己決定権
      • 所属する社会を選ぶ(何かを捨てる)
      • フリーランスもノマドも自由じゃない
        • 時間配分は自由かもしれないが、成果物は自分で決定できない
  • なぜ自由になりたいのか
    • 好きなモノを作りたいから
    • 大きなものを作るには多くのthe dotsが必要
  • 自分の自由を価値に繋げて社会に認めて貰う
  • リスクをコントロールするため積極的にチャレンジをしよう
  • 10年後に自分がどうなりたいのか
  • 自由は闘って勝ち取る!
所感
  • スマホアプリのクリック率を分析しよう
  • dots をたくさんバラ撒こう
  • 2日目は刺激的なセッションが多かった!(宣伝感もあまりなかった)

デブサミ2014に行ってきた(1日目)

デブサミ2014に行ってきました。
参加するのは今年で3回目ですが、年々企業の宣伝イベントになってきている気が。。

資料は下記ページに随時アップされるみたいです。

デブサミ2014、講演関連資料まとめ:CodeZine

以下、メモです。

【13-A-1】「クラウドがもたらした多様な破壊と創造」

クラウドによって、今後どのような仕事やサービスが破壊され、創造されるのかというテーマの講演。
途中から、色んな会社の自社サービス宣伝大会みたいな感じに。。

【13-D-3】「フロントエンドエンジニア(仮)~え、ちょっとフロントやること多すぎじゃない!?~」

講演者:サイバーエージェント、2008-2011:ウェブデザイナー→2011-2012:ウェブディレクター→2012-:ウェブディベロッパー

  • CAで作ったアプリ:GIRL’S TALK、GF
  • GRUNT:いろんなツールの機能をもつコマンドラインツール
  • WEBPAGETEST:ウェブページのパフォーマンスを計測してくれる

資料に、ミサワなどのネタが散りばめられていて面白かった

【13-C-4】「iOSにAndroid、百花繚乱モバイル開発環境を比較する」

講演者:シリアルゲームズ

  • HTML5は、Web アプリ(Facebookなど)にオススメ。中でも「Sencha Touch」がオススメ
  • Script(LL言語)は、Web API 経由のアプリにオススメ。
  • Mono touch(Xamarin、Unity3D)は、.NET Framework/C#が使える点がオススメ。
    • Unity3Dは、iOSはネイティブで動くが、Androidは.NETのVM上で動く。
    • 一般アプリは、Xamarin。ゲームはUnity3D。
  • Delphi
    • 利点
      • iOS/Androidの両方がネイティブになる。
      • GUIも1ソースで
    • 難点
      • Androidは、ネイティブが弱点
      • Pascal系列の言語
      • NativeUIの見た目を自分で描いている(OSのアップデート時などにStyleを更新しないといけない)
      • IDEがWindowsだけ。iOSアプリを作るときは、Windows+Macが必要
  • 結論
    • 一般アプリ
      • DelphiかXamarin
    • エンタテイメント分野
      • Unity3D

【13-E-5】「Stormで実現するビッグデータのリアルタイム処理プラットフォーム」

ビッグデータ×リアルタイム

  • 1分間のFacebook投稿数やSkypeコール数は、Twitterツイート数の約10倍
  • 今後求められるビッグデータ処理
    • 不正アクセス検知、交通情報や災害情報の分析、緊急災害時の対応など
      →リアルタイム処理(ストリームデータ処理)が必要
  • ビッグデータ処理の3つのタイプ
    • バッチ処理
      • MapReduce、Hadoop
    • ストリームデータ処理
      • Storm
  • ストリームデータ処理とは
    • リアルタイムに、解析・分析の処理を行い続ける

ストリームデータ処理を実現するStorem

  • Twitter社がオープンソースとして公開した分散リアルタイム処理フレームワーク(2011/09/11)
  • コアエンジンはClojure、コンポーネントはJava、PHPなどの多くの言語で開発できる
  • 導入事例
    • Twitter、グルーポンなど

ストリームデータ処理のアーキテクチャ

【13-B-6】「mobile backend活用事例から見る「これからのスマホアプリ開発とクラウドの展望」」

mBaaS

  • サービス
    • Parse(海外でメジャー)
    • Stack Mob
    • Amazon SNS Mobile Push
    • Google
  • 機能
    • データストア、プッシュ通知、ファイルストア、会員管理、SNS連携

所感

  • XamarinとmBaaSは使ってみたい!
  • 全体的に「テーマの概要+自社サービスの宣伝」という印象で、時間の割に新しく得られた知識は少なかったような。。
    →デブサミは、興味のあるテーマより興味のないテーマのセッションを選んだほうが良いのかも

明日も行ってきます!

Unityで簡単かつ無料でアプリ内課金を実装できるライブラリ「SOOMLA」を使ってみた

先日リリースしたiPhoneアプリ「ワンパットゴルフ」では、アプリ内課金をしています。
このアプリはUnityで開発したのですが、Unity本体ではアプリ内課金をサポートしておらず、課金部分はネイティブで自作 or ライブラリを利用しないといけません。

ネイティブで自作はめんどくさそうだし、かといって Asset Store にあるライブラリはどれも有料。。どうしよう。。と悩んで色々ググってたら、SOOMLA というオープンソースライブラリを見つけました。

SOOMLAとは

アプリ内課金を簡単に実装することのできるオープンソースライブラリです。Unity以外にも、iOS、Android、cocos2d-xで利用することが出来ます。
今回は非消費型アイテムしか試していませんが、消費型アイテムにも対応しています。

インストール

下記ページの右側にある[unity3d-store]-[Download]から.unityPackageファイルをダウンロードしてインストールのが楽だと思います。その下にサンプルプロジェクトがあるので、一緒にダウンロードしておきましょう。
http://project.soom.la/

使い方

細かい実装方法に関してはサンプルプロジェクトを見ると分かると思うので、大まかな実装の流れを説明します。今回は非消費型アイテムの使い方になりますが、iOS版でしか実装していません。Android版に関しては別途必要な設定や処理が必要になるため、ドキュメントをご確認ください。

【Soomlaのプレハブをシーンに追加】
課金したいシーンに、Soomlaのプレハブを追加します。
Inspector パネルで、「Custom Secret」「Android Public Key」「Soom Sec」を設定してください。
設定内容は下記を参考にしてください。
https://github.com/soomla/unity3d-store

【課金アイテムクラスの作成】
サンプルプロジェクトの
/Assets/Soomla/Code/MuffinRushAssets.cs
を参考にして課金アイテムクラスを作成します。
プロダクトID、価格、アイテムの種類等を設定します。

【StoreController の初期化】
アプリのロード時に、StoreControllerを初期化します。
StoreController.Initialize(new YourStoreAssetsImplementation());
初期化は1度だけで、Awake()ではなく、Start()で実行しないといけません。
【追記】YourStoreAssetsImplementationの部分は、【課金アイテムクラスの作成】で作成したクラスを指定してください

【イベントの登録】
Events クラスに購入成功時などのイベント処理を登録します。
イベントの種類や具体的な登録方法は、サンプルプロジェクトの
/Assets/Soomla/Code/ExampleEventHandler.cs
を参考にしてください。
今回の実装では、StoreController.Initialize()の直後に登録処理を記述しました。

【購入処理】
StoreController.BuyMarketItem(プロダクトID);
購入に成功した場合や失敗した場合の処理は、Events.OnMarketPurchase や Events.OnUnexpectedErrorInStore に登録したメソッドで行います。

【復元処理】
StoreController.RestoreTransactions();

【(端末の)アプリで非消費型アイテムが購入済になっているか】
StoreInventory.NonConsumableItemExists(プロダクトID)

まとめ

SOOMLAの概要やUnityでの使い方について説明しました。
そんなSOOMLAを使っているアプリ「ワンパットゴルフ」は、App Store や Google Play で絶賛公開中です。
ぜひ遊んでみてください!

iPhone: https://itunes.apple.com/us/app/oneputtgolf/id791400827?l=ja&ls=1&mt=8
Android: https://play.google.com/store/apps/details?id=jp.shunsukeosawa.OnePuttGolf&hl=ja

非活性状態のGameObjectを活性状態にする

編集のために一部のGameObjectを非活性状態(active==false)にしておいて、起動時にすべて活性状態にしたい場合があったとします。

上の例では、Holeの子にHole1,Hole2,Hole3があり、Hole1とHole2は非活性状態です(Hole3を編集するために、不要なHole1,Hole2を非活性状態にしています)。
起動時にHole1,Hole2を活性状態にしたいのですが、GameObject.FindGameObjectWithTag()やGameObject.Find()だと非活性状態のGameObjectができず、SetActiveRecursively()がUnity4非奨励になって使えません。

そんなときは、活性状態にしたいGameObjectの親GameObjectのtransformから子を取得して活性状態にすることができます。

GameObject holeRootObj = GameObject.Find("Hole");
foreach( Transform child in holeRootObj.transform)
{
GameObject childGObj = child.gameObject;
childGObj.SetActive(true);
}

iPhoneやAndroidでGUI Textureがタップされたことを検知する方法

PCでGUI TextureがクリックされたときはOnMouseDown()を使えばよいのですが、iPhoneやAndroidだとそれに相当するイベントがないみたいです。なので、iPhoneやAndroidでGUI Textureがタップされたことを検知するためには自前でコードを書く必要があります。

ググると、Raycastを使う方法やiPhoneInputを使う方法など色々見つかりますが、うまく動かなかったり、Andoroidに対応できないという問題があったりしました。

最終的に、GUI TextureのComponentに以下のコードを追加することでうまく処理することが出来ました。

if (Input.touchCount == 1) {
Touch touch = Input.GetTouch (0);
if (touch.phase == TouchPhase.Ended) {
if (guiTexture.HitTest(touch.position, Camera.main)) {
//タップされた時の処理
}

このコードはタッチが終了したときにタップ処理を実行します。もしタッチの開始から終了までの間ずっと処理を実行したい場合は、
touch.phase == TouchPhase.Ended

touch.phase == TouchPhase.Began || touch.phase == TouchPhase.Moved || touch.phase == TouchPhase.Stationary || touch.phase == TouchPhase.Ended
に変えるとよいです。

また、このままだとGUI Texture外でタッチを開始し、GUI Texture内でタッチを終了した時もタップ処理が実行されます。自分のアプリだと別にそれでもよいので上記のコードで対応しましたが、もっとちゃんと処理する場合は、以下のサイトを参考にしてください。

Unity3D:GUI Textureでボタンを作成(2)