読者です 読者をやめる 読者になる 読者になる

naichi's lab

3日後の自分(他人)への書き置き

【参加してきた】雲勉:大阪【勉強会:開発者向け】サーバーレスで作るモバイルアプリバックエンド #kumoben

AWS kumoben

kumoben.doorkeeper.jp

参加してきました。

会社紹介

おきまりの宣伝

  • アイレット株式会社
    • 2003〜
    • 従業員162名ちょい
    • システム開発、ゲーム開発、保守、マネージドホスティング
  • cloudpack大阪
    • 構築
    • MSP運用
    • MSP開発
  • cloudpack
    • デザイン
    • 設計・コンサル
    • システム開発
    • MSP
  • 7年間AWSのみで運用
    • 600社1200プロジェクト超
  • APNプログラム
    • Amazonパートナープログラムの
    • プレミアパートナーに5年連続選ばれている
    • アジアで7社だけ
  • 請求代行サービス
  • AWSよりも安い
  • 大阪の話
    • RoBoHon オートヒーリングシステム
      • 改ざん自動修復
    • スタバのサーバーレス案件
    • 毎日放送 動画イズム444
      • フルサーバーレスで実現
      • 3ヶ月でデザインからリリースまで
    • 近畿大学AWS移行
    • MSP事業支援開発
      • kibana
  • サーバーレス開発チームの取り組み
    • MaaS(仮) & ServerlessPack
  • KDDIの子会社になりました。 2017/01/25
  • 募集
    • 開発・インフラ・UI/UXエンジニア

雲勉について

  • cloudpackの社内勉強会を外に公開
  • 基本的に資料公開はしない
  • 今回は中級者向け
  • #kumoben

サーバレスで作るモバイルアプリバックエンド

やっとはじまり

自己紹介

  • すみさきさん
  • Webアプリケーションエンジニア
  • 2016/09~cloudpackにjoin

サーバレスってなに

サーバ「レス」

  • サーバが存在しない
    • サーバはあります
  • サーバの存在を意識しなくていい
    • 自動スケーリング
  • ハードウェア、OS、ミドルウェアに依存しない
    • コードが動くことが大事
  • ステートレス
    • リクエストごとにプロセスを使い捨てる
  • 使いたい「機能」にフォーカスを当てる
    • FaaS (Function as a Service)

どっかの偉い人 0.5秒実行するインスタンスを20mm秒以下で効率的に起動できるならサーバレス

メリット

  • リソースを時間単位で確保
    • 運用費用を削減できる
  • インフラが存在しないため構築の手間を削減
    • 初期費用も削減できる

デメリット

  • それぞれが独立・非同期
    • 原子性を確保することが難しい
  • SLAが保障されていないものが多い
    • 障害発生時のリカバリー手順が必要
  • 構築から運用まで一貫して考える必要あり

実案件で使おうとするとここらへんが難しい

構成例

f:id:naichilab:20170208195803j:plain

AWSにおけるサーバレスサービス

いくつかある。

f:id:naichilab:20170208195602j:plain

AWS Lambda

  • AWSのサーバレスといえばこれ
  • Java8、Node.js、Phthon2.7、C#で記述可能
    • java 初回が重たい
      • CPUがっつり使う処理には有効
    • Node.js
      • 色々めんどくさい
    • Phthon
      • コンソールでかけるのでよい
    • C#
      • まだあまり試してない
  • たいていの処理はなんとかしてくれる
  • 初期の同時実行数は100に制限(アカウント単位!
    • 過度な依存は禁物
    • AWSに相談すれば少しあげることはできる・・・
  • 最大処理可能時間は5分

Amazon API Gateway

  • RESTfulなAPIを構築できるサービス
  • 他のサービスのプロキシをしたり、APII/Fになったり
  • Webサービスのスロットリングにも使える
    • スロットリング:際限なくアクセスされることを防ぐ
  • Lambdaと仲良し
  • 30秒でタイムアウトする

Amazon DynamoDB

  • 高速で柔軟なNoSQLデータベース
  • 事前に設定したスループット要件に合わせて自動的にスケーリング
  • オンラインゲームのバックエンドに使われたりする
  • スループット要件に対して課金される
    • 利用料金が青天井
    • 例)秒間1万件データ取得したい
      • -> 秒間1万件以上に設定すると、その金額がずっとかかる
  • 1日2回しかスループット要件変えられない。

Amazon S3 (Simple Storage Service)

  • シンプルで耐久性がありスケーラブルなオブジェクトストレージ
  • 99.999999999%の耐久性
  • 99.99%の可用性
  • 静的ウェブサイトホスティングという機能があり、コレ1つでWebサイトを作ることも可能
  • 仕組み上高速ではない
    • 同じオブジェクトを読み書きする際には注意が必要
  • 親戚
    • グレイシア(長期保存用)

Amazon Cognito

  • ユーザーのサインアップとサインインの機能を追加できる
  • ソーシャルIDや自前のIDシステムによる認証もできる
  • 認証したユーザーにIAMロールを割り当てる使い方など
  • 中身は3つぐらいに分かれている
    • Cognito UserPool
    • Cognito Identity
    • Cognito Sync
      • スマホ間同期とか
  • 認証用メールがAmazon SESを通じて発行される
    • キャリアメールが関わる場合は工夫が必要
      • キャリア側の迷惑メールフィルタに引っかかる
    • 動画IZMではSendGridを利用

番外編

Amazon CloudFront

  • CDNサービス
  • コンテンツを世界に配信できる
  • S3やAPIGatewayの前段に挟むことで痒いところに手が届く
    • S3へのアクセスを減らせる
    • S3は404以外のエラーはサポートしていない
    • APIGatewayの前段でAppFirewallの機能を担う

Amazon Route 53

  • 可用性・拡張性に優れたDNSサービス
  • S3の静的ホスティング、APIGateway、CloudFrontを独自ドメインで使いたい場合に

他にも

  • Amazon SNS
    • プッシュ通知
  • Amazon SES
    • Email配信
  • Amazon SQS
    • メッセージキューイング
    • 溜め込んでLambdaで取り込んで処理とか。

実際にモバイルバックエンドをサーバレスで考えてみる

簡単な構築パターンを考えてみる

アプリから送ったデータを保存したい

  • 構成例
    • API Gateway -> Lambda -> S3 or DynamoDB
  • f:id:naichilab:20170208203148j:plain

  • Lambdaを直接たたくためにはIAMが必要

  • APIGatewayを挟むと抽象化できる

写真をとったらサムネイルを作りたい

  • 構成例
    • API Gateway -> Lambda(保存) -> S3 -> Lambda(加工) -> S3
      • たまにLambdaの処理が抜ける
  • f:id:naichilab:20170208203229j:plain

  • 構成例2

    • API Gateway -> Lambda(保存) -> S3 / SQS -> (Timer起動)Lambda(加工)
      • SQSを挟むことで確実性を上げる
  • f:id:naichilab:20170208203252j:plain

許可した人にだけAPIを公開したい

  • 構成例
    • Amazon Cognito
      • 認証トークンを発行
    • API Gateway -> Lambda -> …
  • f:id:naichilab:20170208203333j:plain

デモ

  • API Gateway -> Lambda -> Lambda -> S3
  • Unity -> Lambda <- S3
  • f:id:naichilab:20170208203455j:plain

Unity用SDKもあっていくつかの機能は直接呼べる

  • API Gateway
    • AJAXで呼ぶならCORS設定が必要

ホワイトペーパー

cloudpackサーバーレス開発ホワイトペーパーとして公開している

cloudpack.jp

質疑

サーバーレスのログ追跡どうやってるの?

  • CloudWatchは大変
  • 答えはあるがまだ発表できない
    • 2月末ぐらいに発表できる

次回予告

  • 2月開催
    • AWS Storage Gateway
  • 3月
    • 3/1 ホワイトペーパーの説明
    • 3/8 AWS Code Deploy
    • 3/29 クラウド基礎

感想

まだほとんど使えてないけど雰囲気つかめてよかった。 簡単に試せそうやし触ってみよう。

GGJ2017 精華町 けいはんなプラザ会場に参加してきました

日記 GGJ

f:id:naichilab:20170123021716j:plain

タイトルの通り、GGJ2017に参加してきました。

記憶が新しいうちに感じたこととかをメモ。

GGJ(Global Game Jam)は一言で言うと全世界同時開催のゲームジャム。 知らない人たちが互いに集まって即興でチームを作り、48時間でゲームを作ります。

29時間で作ったゲーム紹介

心電図パニック

f:id:naichilab:20170122211625p:plain:w320f:id:naichilab:20170122211656p:plain:w320

心電図パニック Electrocardiogram panic | Global Game Jam®

Mac版は上記サイトからダウンロードできます。

  • 夜間病棟に勤務する医者となって次々運び込まれる急患をひたすら助けるゲーム。
  • すごい勢いでやってくる患者
  • 放っておくとすぐに心臓が止まるので助けてあげよう
  • オンラインランキング対応

これをプログラマ2人、デザイナ3人の5人で作りました。

土曜日の10時にチーム分けされて、翌日15時に完成なので29時間ですね。 いやー楽しかった。

覚えてることメモメモ

21日 07:00〜

9時半集合だけど7時に出発しないと間に合わない。 京都駅から直通バスがあるって見つけたからタクシーでバス停まで行ったら土日は運行してないとのこと。 マジかよ、調べ直して近鉄で行けることを発見。

近鉄で揺られること40分ぐらい。さらにバスで15分ぐらい。

途中にかなりでかい工場やオフィス、国会図書館とか見かけた。 学研都市って何かわかんないけどなんだかワクワクする感じ。

でもやっぱ遠いぞけいはんなプラザ。

21日 09:00〜

会場になんとか到着。

f:id:naichilab:20170123010638j:plain:w320
とんがってるのは世界一巨大な日時計らしい。
夜はレーザー光線が出る。 なんでや。

ホテルや貸会議室がくっついたような行政施設?かな。

ロビーで待っていると プログラマのみ 先に部屋に通される。

何事かと思ったら、かなりプログラマが不足しているらしく、チーム分けの作戦会議がしたかったらしい。

6人(ぐらい)中、ゲーム作ったことある人が3人いたので3チームに別れることに決定。

そのままチームリーダーに任命されてしまった。ABCチームのうち、Bチーム。

21日 09:30〜

他の参加者も部屋に通される。 どうもチーム分けは事前にされていたようで?運営の人が名前呼びながらテキパキとチームを振り分けていく。すげー手際いい。

あっという間に自分のいた机に5人が座った。

自分を含めて男性3人、女性2人
プログラマの人を除き全員Mac、学生は学校で全員購入するそうな。さすがデザイン系。

全体的に学生は多く、特に精華大学の学生だけで9人ぐらい(全員デザイナ)いた。

そのあと運営の方から自己紹介や開催の経緯説明、精華町町役場の方から精華町の紹介などがありました。

f:id:naichilab:20170123011005j:plain:w320
精華町のイメージキャラクター 京町セイカちゃん
めっちゃおしてますね
https://twitter.com/kyomachi_seika

21日 09:45〜

GGJお約束のお題発表。ビデオを見る。GoldスポンサーのUnityの宣伝がふんだんに入ってた。

お題は WAVES 。波。

21日 10:00〜

ここからは各チームごと、チームリーダーに一任された。

とりあえず自己紹介はじめる。

  • 自分はプログラマで趣味でUnity使ってることを説明。あと 太陽人間の宣伝。
  • 他にプログラマが一人。SEやっててゲーム開発は趣味とのこと。
  • あとは学生が3人。全員同じ学科(キャラクターデザイン化)で2回生と3回生。
    • イラスト見せてもらった。うますぎ。

21日 10:30〜

付箋を使いながらブレスト。2~30枚が出たかな?

WAVE、、、波、、、波形(グラフ)、、、心電図、、、心肺停止、、、心臓マッサージ!!

訳わかんないけどこんな感じで方向性決定。

ここからはA3模造紙に画面レイアウトをざっくり書いてみてアイデアを詰めていく。

絶対面白いわ!って楽しそうにする学生。いいねいいね。

21日 11:30〜

運営の人からWikiやSlackの説明を受け、チームメンバー全員に設定。自分以外Slackは初めてだった。

さらに運営の人がSilverスポンサーのGitHubも利用を勧められたので(勧められなくても使うけど)、 全員にGitHubアカウントを取得してもらいSourceTreeもインストール。こっちも自分以外使うのは初めて。

作ったプライベートリポジトリに全員を招待。

21日 12:00〜

近くにあるでかいスーパー(アピタだったか?)のフードコートでご飯。

f:id:naichilab:20170123011632j:plain:w320
ゆっくり食べられる最後のご飯かなーとか考えてた。

21日 13:00〜

SlackやGit設定を全員分完了。

もう一人のプログラマはキャラクタの移動処理とかを作り始めてもらう。
自分はゲーム全体の流れを作るためにゲームマネージャやシーン制御クラス、音関係のマネージャクラスとかを過去プロジェクトから流用して雛形を作った。

デザイナの3人には背景、メインキャラクター、患者に分かれてラフ作成開始してもらった。

背景に関しては30分もしないうちにラフが出てきてビビる。

リソース作成早すぎてプログラムまにあわねーぞこれは。

21日 15:00〜

それぞれのチームのコンセプト発表


いつのまにか動画撮影&公開されてた

発表するいい練習になるだろうと学生をそそのかして発表させる。超緊張してるw

となりのAチームはハゲについて熱く語ってましたね・・・Cチームは2人対戦ゲームになるとのこと。
楽しみ。

ここで宿泊者には部屋の鍵が配られる。

f:id:naichilab:20170123012444j:plain:w320
精華町さんびっくりするほど太っ腹。
これだけ快適だと来年は規模拡大するだろうし宿泊者や社会人は有料になるのかなーとか考えてた。

発表後は引き続きプログラムや素材作成

f:id:naichilab:20170123012358j:plain:w320
作業風景

続々とできあがる画像素材たち。
ぜんぜん進まないプログラム。

あーこれは徹夜かなって感じ。

ゲームの細かいところだとかはすぐに声を掛けてプチミーティングを開く。悩んでる暇も無いのでその場その場で決めていく。

チーム名とか、翌日までに決めればいいようなものは付箋に書き出して壁に貼っておいた。余裕のある人にやってもらう予定。

プログラマ間で共有するやることリストはGitHubのプロジェクト機能でカンバン管理することにした。

f:id:naichilab:20170123012249p:plain:w320
まぁまぁ役立ったかな?

21日 17:00〜

すがやみつる先生が応援に来てくださった。
清華大学から参加している9名の学生は、すべて先生の教え子らしい。
学生との会話を聞いているととても慕われてらっしゃるのが伝わってきました。


ドーナツごちそうさまでした。

21日 19:00〜

運営の方から差し入れのたこ焼き

f:id:naichilab:20170123013235j:plain:w320
各チームに3パックずつ。
近所のスーパーの売り切りセールで買い占めてきたとのことw ごちそうさまでした。

このころUnityCloudBuildも設定。

f:id:naichilab:20170123013436p:plain:w320 これでWin/Mac用ビルドが常に届く。 チームメンバー全員にUnityアカウントも作ってもらい、アクセスできるようにした。 あんま使わなかったけどね。

この日は夜中3時ぐらいまで作業した。

  • 背景やあらかたのUI素材は完成
  • リザルト画面素材も完成
  • プレイヤー(医者)素材は完成
  • プログラムは医者の移動と患者の生成ぐらいは完成
    • ゲームロジックやUIの制御とかは全く。やばい。

相変わらずプログラマの進捗ピンチ

とりあえずデザイナのみんなには明日引き続き作業してもらいたいことを説明して解散。

もう一人のプログラマの人とは同じ部屋だったのでもう少し進める。

結局5時までやった。

  • 患者の生成と退場処理完成
  • UI要素の制御もある程度組んだ

なんとかなりそうな目処が立ったので寝る。

22日 07:00〜

朝7時に部屋から会場に向かうと、まだ人は少なかった。

f:id:naichilab:20170123013823j:plain:w320

朝ごはんは雲丹亭ラーメン。

f:id:naichilab:20170123014042j:plain:w320

朝食後はひものさんと早朝の変なテンションでじゃがりこタワー作った。


訳がわかんねぇな。

22日 10:00〜

ベータ版をプレゼン。

UIとかはまだまだだけどだいたいのゲームロジックは完成。
なんとかなりそうだ。

22日 12:00〜

運営からピザの差し入れ

f:id:naichilab:20170123014229j:plain:w320
ごちそうさまでした。ジャムも佳境って感じですねぇ

BGMやSEを実装し、開発も佳境へ。

午後はなるべく難易度調整に時間を割く、
プログラマが調整し、デザイナ全員でテストプレイ。

全員にSourceTree(Git)とUnityをインストールしておいたので、
プログラマがPush、デザイナはPullして即座にUnityエディタでプレイ。
ってことができた。これはなかなかいい感じだった。

みるみるゲームとして遊べる形になっていく。

終了30分前から急遽オンラインランキングを実装することにした。
NCMB使えば楽勝!

22日 15:00

そうこうしているうちに締め切り。

f:id:naichilab:20170123014654j:plain:w320
モニターに映し出されるカウントダウン

お疲れ様でした!

ここからGGJ本家サイトへの登録作業。地味だけど大事な作業。

22日 16:00〜

全チーム完成品のお披露目!

今回は全チームちゃんとゲームとして動くところまでできていました。みんなすごい。

これで冒頭に紹介したゲームができあがりです。

22日 17:00〜

試遊会&懇親会

f:id:naichilab:20170123015232j:plain:w320
f:id:naichilab:20170123015233j:plain:w320
f:id:naichilab:20170123015234j:plain:w320
懇親会の最後にはちゃっかり京ゆにの宣伝もさせてもらいました!

最後まで和気藹々と、談笑の絶えない会場でした。

最後に全員で記念撮影してお開き!

皆さんお疲れ様でした!

参加してみて

やっぱりゲームを作るのは楽しい!
しんどいけれど、とんでもなく多くの経験値を得られるすばらしいイベントでした。

プログラマが二人いたおかげで、適度に作業分担しつつ作りきることができ助かりました。

0からキャラクターを生み出せるデザイナ(で呼び方あってる?)さんのすごさ、自分には絶対無理なので尊敬しっぱなしでした。SlackだのGitだのSourceTreeだのと初めて聞くツールにも関わらず使ってみる姿勢は好印象でした。Gitとかプログラマでもなかなか難しいツールなんやけど使ってくれてありがとう。

前回(一昨年)のゲームジャムはメインプログラマを担当したけれど全く時間が足りず大変な思いをした。それから2年、着実に書いたソースは残っているので管理クラス等を流用することでかなり新規実装の負担を減らすことができたと思う。

あとはゲームジャムというとプログラマ8割!みたいなイメージでしたが、今回はデザイナ6割というプログラマから見たら(いつもグラフィックリソースに困るから)夢のような環境でした。

このようなすばらしい企画を実行してくださった精華町町役場の皆さん、運営側の皆さん、ありがとうございました。そしてお疲れ様でした。

また来年も開催されるのであれば是非参加したいと思います。
また機会があればよろしくおねがいします!

【読んだ】スペシャリストが解説する Amazon Web Services 知っておきたい基礎知識 IT Leaders選書

本の感想 AWS

読んだ本の感想メモ。

読んだ本

スペシャリストが解説する Amazon Web Services 知っておきたい基礎知識 IT Leaders選書

スペシャリストが解説する Amazon Web Services 知っておきたい基礎知識 IT Leaders選書

なぜ読んだ?

  • AWS触る機会が増えそう
  • AWSの知識ゼロ
  • AWSのことググっても情報多すぎ!
  • 広く浅く、基礎知識つけたい
  • 知人に聞いたら紹介してくれた

どんな本?

  • AWSの知識ゼロの状態で広く浅く基礎知識をつけるのにうってつけ
  • たぶんこういう記事の集約本?
  • 各サービスをちょうどいい分量で紹介している
    • サービスごとに0.5P~3Pほどで読むのに苦じゃない分量
    • このサービスはこういうもので、これを使えばこんなことができるよね!みたいな説明
    • セットアップ方法や設定方法とかは無い
      • 各サービスの詳しい使い方はググるなりマニュアル読むなり必要
  • サービスのカテゴリごとに章立てしてあり、とてもわかりやすかった。
  • 通して読んでも2〜3時間あれば読めるぐらい

まとめ

AWS使ってみたいけどいっぱいあって何が何だか・・・って人にオススメ

スペシャリストが解説する Amazon Web Services 知っておきたい基礎知識 IT Leaders選書

スペシャリストが解説する Amazon Web Services 知っておきたい基礎知識 IT Leaders選書

hubotメモ

今更ながらhubot触ってみる。

下記記事を参考にしながら進める。 Hubot / ChatOps とは - Qiita

ただのメモ書き

メモ

nodejsのインストール

  • macだとnodebrewってのが主流?
    • nodebrewで入れた

新規でhubotを作成

yo hubot

新規でhubotスクリプトを作る

$ mkdir hubot-hoge
$ cd hubot-hoge
$ yo hubot:script

あとは質問に答えるだけ。

スクリプトをローカルで確認

HUBOT_SHELL_USER_NAME='naichi' PATH="./node_modules/hubot/node_modules/.bin:$PATH" $(npm bin)/hubot -a shell -n hubot -r src

herokuにデプロイ

git管理してから

heroku create
git push heroku master
heroku config:set \
HUBOT_SLACK_TOKEN=xxxx-11111111111-aaaaaaaaaaaaaaaaaaaaaa

リスナー登録

  • robot.respond /hello/, (res) ->
    • hubot hello のようなメンションを受け取るリスナーを登録する
  • robot.hear /(.+)から選んで/, (msg) ->
    • パターンそのままを受け取るリスナーを登録する

npm install

$ npm install --save cheerio

-g をつけなければそのフォルダにだけインストールされるみたい。

githubからnpm install

$ npm install --save naichilab/hubot-7days-later

上記npm install をした上で、external-scripts.json に追記する

[
  "hubot-diagnostics",
  "hubot-help",
  "hubot-heroku-keepalive",
  "hubot-google-images",
  "hubot-google-translate",
  "hubot-pugme",
  "hubot-maps",
  "hubot-redis-brain",
  "hubot-rules",
  "hubot-shipit",
  "hubot-7days-later"
]

環境変数

process.env.HOGEHOGE

参考:設定を読み込む Hubot スクリプトをつくろう - Qiita

test

npm install -g grunt-cli しておく

grunt test で単発実行

grunt test:watch でファイル監視&自動実行

【unity、Cloud Build】unityプロジェクトにGoogleAnalyticsを導入してCloud Buildを通すとこまで

Unity Google Analytics AdMob Cloud Build

f:id:naichilab:20161130021717p:plain:w320

先日の記事でFirebaseの導入に失敗したので代わりにGoogleAnalyticsを入れる。

はじめに

AdMob導入済みの

この記事の最後にも書きますが、 Cloud Buildが見事にエラーしまくるのでGit等のコミット(バックアップ)はこまめにね!!!

環境

  • やった日 : 2016/11/30
  • Google Mobile Ads Unity Plugin v3.1.2 (ビルドエラー対応で更新 3.0.5 -> 3.1.2)
  • GoogleAnalyticsV4.unitypackage (v0.5-beta) (この記事で新規追加)
  • Unity 5.5.0f2

手順

基本的に下記ページに従う

Google Analytics Plugin for Unity - Developer Guide  |  Analytics for Unity  |  Google Developers

  1. あらかじめGoogleAnalyticsにプロパティを用意しておく

    3つ用意した。

    • 太陽人間iOS
    • 太陽人間Android
    • 太陽人間Other
  2. 下記リポジトリからunity用プラグインのダウンロード

    https://github.com/googleanalytics/google-analytics-plugin-for-unity/releases

    GoogleAnalyticsV4.unitypackageをダウンロードした。

  3. [Android]AndroidManifestへのタグ追加はAdMob導入ですでに済んでいたので不要

  4. [iOS]AdSupportとかの参照追加とかも、AdMobとかですでにやってありそうだったので無視

    ちゃんと参照追加しましょう。 これがiOSビルドのエラー2(後述)を引き起こすので注意。

  5. GAv4 プレハブの配置と設定

    f:id:naichilab:20161128232255p:plain

    Send Launch Event にチェックを入れておくと起動するだけでデータが飛ぶみたい?

起動

Prefabをシーンに置いたまま、Unityエディタ上で起動してみると

Google Analytics -> レポート -> 作ったプロパティのビュー -> リアルタイム

f:id:naichilab:20161128232525p:plain

表示された!

どの画面を見ているかを取得

ここの内容です -> Google Analytics Plugin for Unity - API Reference  |  Analytics for Unity  |  Google Developers

今のプロジェクトでは SceneSwitcher ってクラスで画面遷移を制御してる。

そいつに GoogleAnalyticsV4のインスタンスをもたせて

 public class SceneSwitcher : MonoBehaviour, ISceneSwitcher
    {
        public GoogleAnalyticsV4 googleAnalytics;

画面切り替えのタイミングで LogScreen メソッドを呼び出す

googleAnalytics.LogScreen ("Field");

実行してみる。

f:id:naichilab:20161128233249p:plain

おー、簡単にどの画面開いてるか取れるようになった。

こりゃ楽しい。

CloudBuild上でエラーの嵐

エディタ上ではここまでで動くんだけど、Cloud Buildが Android / iOS ともに壊れてひどい目にあった。

よなよな対応して直すのに2日かかった...
それぞれの対応法は長くなるので全て別記事!

Androidのエラー

Unable to convert classes into dex format.

blog.naichilab.com

iOSのエラー1

'pod' command not found

blog.naichilab.com

iOSのエラー2

Undefined symbols for architecture armv7:

blog.naichilab.com

おわりに

いやー大変だった・・・

けどこれで AdMob + Google Analytics + アドフリくん を含んだ形でCloud Build通るようになったし一段落かな・・・

【unity、iOS、CloudBuild】Google Analyticsを入れたらビルドエラー(Undefined symbols for architecture armv7:)

Unity AdMob Google Analytics Error

f:id:naichilab:20161130021717p:plain:w320

blog.naichilab.com

上記前回の記事の続き。

cocoapodsのエラーは消えたけど別のエラーが出てきた。

エラー内容

Cloud Buildのコンパクトログではこんな感じ

241:        [xcode]       -[GAISqlStore errorMessage] in libGoogleAnalyticsServices.a(GAISqlStore.o)
242:        [xcode]   "_NSSQLiteErrorDomain", referenced from:
243:        [xcode]       -[GAIDataStore performBlockAndWait:withError:] in libGoogleAnalyticsServices.a(GAIDataStore.o)
244:        [xcode]       -[GAISqlStore errorMessage] in libGoogleAnalyticsServices.a(GAISqlStore.o)
245:        [xcode]   "_NSSQLiteErrorDomain", referenced from:
246:        [xcode]       -[GAIDataStore performBlockAndWait:withError:] in libGoogleAnalyticsServices.a(GAIDataStore.o)
247:        [xcode] clang: error: linker command failed with exit code 1 (use -v to see invocation)
248:        [xcode] ** BUILD FAILED **

なんかパッとしないエラーだったのでフルログを見てみると

11729:        [xcode] Undefined symbols for architecture armv7:
11730:        [xcode]   "_sqlite3_prepare_v2", referenced from:
11731:        [xcode]       -[GAISqlStore prepareSql:] in libGoogleAnalyticsServices.a(GAISqlStore.o)
11732:        [xcode]   "_sqlite3_errmsg", referenced from:
11733:        [xcode]       -[GAISqlStore errorMessage] in libGoogleAnalyticsServices.a(GAISqlStore.o)
11734:        [xcode]   "_sqlite3_close", referenced from:
11735:        [xcode]       -[GAISqlStore closeDatabase] in libGoogleAnalyticsServices.a(GAISqlStore.o)
11736:        [xcode]   "_sqlite3_open_v2", referenced from:
11737:        [xcode]       -[GAISqlStore openAndValidateDatabase] in libGoogleAnalyticsServices.a(GAISqlStore.o)
11738:        [xcode]   "_sqlite3_column_int", referenced from:
11739:        [xcode]       -[GAISqlStore rowCountForTableWithName:] in libGoogleAnalyticsServices.a(GAISqlStore.o)
11740:        [xcode]   "_inflateInit2_", referenced from:
11741:        [xcode]       +[GAICompressionUtil gai_dataByInflatingBytes:length:isRawData:] in libGoogleAnalyticsServices.a

お、それっぽいメッセージ( Undefined symbols for architecture armv7: )出てる。

ぐぐる

あれやこれやと調べていくと、 XCodeProject上でライブラリの参照が足りてないことが原因でした。

  • CoreData.framework
  • libz.tbd
  • libsqlite3.tbd

ローカルのXCodeで上記を追加したらビルド成功したので間違いなさそう。

f:id:naichilab:20161130235925p:plain

次はこれらを自動参照するようにせねば。

ライブラリの自動参照設定

Unity Cloud Buildではいちいち手動で参照設定できないので自動化する。

blog.naichilab.com

上記記事で書いたスクリプトを使い続けてるんだけど、そこに追記する。

下記を追加

     //フレームワーク追加
        List<string> frameworks = new List<string> () {
            "CoreData.framework",
            "libz.tbd",
            "libsqlite3.tbd"
        };

        foreach (var framework in frameworks) {
            pj.AddFrameworkToProject (target, framework, false);
        }

ビルド

成功した!!

GoogleAnalyticsのマニュアルみると・・・

Google Analytics Plugin for Unity - Developer Guide  |  Analytics for Unity  |  Google Developers

しっかり書いてあった!!!

f:id:naichilab:20161201000652p:plain

ごめんなさいごめんなさい。

【unity、iOS、CloudBuild】AdMobやGoogleAnalyticsを入れたらビルドエラー('pod' command not found)

Unity AdMob Google Analytics Error

f:id:naichilab:20161130021717p:plain:w320

タイトルの通り。

Google AnalyticsをUnityで使おうとして入れたんだけど、 CloudBuildが通らなくなった。

環境

  • Google Mobile Ads Unity Plugin v3.1.2
  • GoogleAnalyticsV4.unitypackage (v0.5-beta)
  • Unity 5.5.0f2

エラー内容

[Unity] Player export failed. Reason: 'pod' command not found; unable to generate a usable Xcode project. You can install cocoapods with the Ruby gem package manager:

cocoapods がないって言ってる。

状況

下記記事の通り対応した直後。 GoogleAnalyticsPlugin を入れた後で GoogleMobileAdsPlugin を入れてごにょごにょした状況。

blog.naichilab.com

すでに訳わからん状況からのスタート。

ぐぐる

それっぽいフォーラムを発見。

answers.unity3d.com

対応

1. いったんUnityのプラットフォームをiOSに変更。

プラットフォーム変更することでResolverが走るかな?と思ったけど何も起こらなかった。
このまま進める。

2. Assets/GoogleMobileAds/Editor/AdMobDependencies.cs から下記を削除

        Type iosResolver = Google.VersionHandler.FindClass(
            "Google.IOSResolver", "Google.IOSResolver");
        if (iosResolver == null) {
            return;
        }
        Google.VersionHandler.InvokeStaticMethod(
            iosResolver, "AddPod",
            new object[] { "Google-Mobile-Ads-SDK" },
            namedArgs: new Dictionary<string, object>() {
                { "version", "7.13+" }
            });

3. ローカルビルド

XCode再インストールしようとしてできてないのでパス…

3. CloudBuildでビルド

エラーが変わった・・・

241:        [xcode]       -[GAISqlStore errorMessage] in libGoogleAnalyticsServices.a(GAISqlStore.o)
242:        [xcode]   "_NSSQLiteErrorDomain", referenced from:
243:        [xcode]       -[GAIDataStore performBlockAndWait:withError:] in libGoogleAnalyticsServices.a(GAIDataStore.o)
244:        [xcode]       -[GAISqlStore errorMessage] in libGoogleAnalyticsServices.a(GAISqlStore.o)
245:        [xcode]   "_NSSQLiteErrorDomain", referenced from:
246:        [xcode]       -[GAIDataStore performBlockAndWait:withError:] in libGoogleAnalyticsServices.a(GAIDataStore.o)
247:        [xcode] clang: error: linker command failed with exit code 1 (use -v to see invocation)
248:        [xcode] ** BUILD FAILED **

長くなるので次の記事

blog.naichilab.com