みなさん、こんにちは。コンテンツ・メディア第1事業部インフラ担当の藤本佳世です。前回のブログの続き、「OpenStack構築手順」などご紹介する予定ですが、その前に2016年6月1日(水)に開催された「Ansible Meetup in Tokyo 2016.06」に参加したお話しをしたいと思います。自称「Ansible女子」の私。3年前にも参加したことがあり、今回は3回目の参加でした。

詳細URL http://ansible-users.connpass.com/event/31222/

Ansible

Ansibleとは、今回Meetupの会場でもあるレッドハットが開発するオープンソースの構成管理自動化ツールです。
ssh通信を利用して、クライアントサーバに直接命令を送り込むことができます。
フリューでは約3年前にAnsibleを導入し、ミドルウェアのインストールなどサーバ構築・管理には欠かせないツールとして利用しています。Ansibleを使うメリットはとても大きく、導入したことで、今まで手動で3時間もかかっていたサーバ構築作業を、1時間以内まで時間短縮を実現することができました。
使い始めた頃は、参考書も少なく、公式HPの英語ドキュメントを参考にしていましたが、今年の4月にO’Reillyから本も発売され、ますます注目されています。

公式ホームページ https://www.ansible.com/

発表内容

  • 「Ansible Core 2.0 Overview and future releases」 by Dylan Siliva
  • 「Jupyter+AnsibleによるLiterate Computing(手順書 as a Code)への挑戦」 @ enakai00
  • 「共通言語Ansible」 @seri_wb
<LT詳細>
  • 「ansible-vaultについて何か」 (ynn)
  • 「Ansibleの教育トレーニングはじめました」 (spchildren)
  • 「Ansible2.0とOpenStackの関係」 (saito_hideki)
  • 「Playbookからのドキュメント自動生成やってみてる」 (h-hirokawa)
  • 「Ansibleとterraformで実現するタグベース複数環境プロビジョニング実例」 (takuya_onda_3)

内容まとめ

Ansible2.0新機能と今後のリリース関連

  1. 200以上の新しいモジュールが追加された
  2. エラーメッセージの改善:よりわかりやすくエラーメッセージ内容を記載するようになった
  3. アーキテクチャが変更され、より簡単に開発できるようになった
  4. ansible-vaultと呼ばれる機密情報が書かれたファイルを暗号化するツールがリリースされた
  5. 36個の OpenStackモジュール追加され、バージョン1と比べて、とても使いやすく親和性が高い
  6. sudo機能が使えなくなる予定。ansible_ssh_hostnameを ansible_hostname, ansible_userに変更する必要がある
  7. 約400以上のモジュールをリリース予定(Dockerモジュールも追加予定)
  8. python3対応予定
  9. クラウド技術にも力を入れる予定 (AWS, OpenStackなど)

運用について

  1. 開発とインフラの作業ラグをなくす取り組みについて、ミドルウェアバージョンアップなどインフラではなく、開発メンバーにAnsibleを実行してもらっている
  2. ansible-vaultと呼ばれる機密情報が書かれたファイルを暗号化するツールの利用
  3. Ansibleは自動化だが、やはりメンテナンスする必要がある。複雑なplaybookを書いてしまい、結果ブラックボックス化してしまう。手順書を用いることで、だれが見ても分かるようにする
  4. Ansibleコードをシンプルに保つことが大切

感想

Ansibleバージョン2.0の新機能や今後リリース予定のモジュールなどの紹介がありました。
個人的には、【Jupyter+AnsibleによるLiterate Computing(手順書 as a Code)への挑戦 @ enakai00 】の発表が非常に興味深かったです。手順書作成の必要性について、いかにAnsible(コード)だけに頼らず、うまく手順書にAnsibleを載せるかについて紹介されていました。

私が所属するインフラチームは、Ansibleを導入して約3年ほど経ちます。新規サーバ構築以外に、ミドルウェアのアップデート、脆弱性対応など、様々なケースで利用しています。しかし、Ansibleの構成が複雑化してしまい、他のメンバーが使いこなす事が非常に難しい状態です。そんな時、やはり手順書があればと思っていました。発表で「Jupyter」を使った手順書作成についてのお話しを聞くことができました。Jupyterの知識はゼロですが、是非検証してみたいなと思いました。

その他にもOpenStackについて、Ansibleバージョン2以降、とても使いやすくなったとの発表もありました。
前回のブログで紹介したOpenStackは、Ansibleを使って構築しました。今後のブログで、その手順をご紹介するので、是非読んでいただければ嬉しいです。



Hello world! コンテンツ・メディア第1事業部のjyukutyoこと阪田です。

概要

今回の内容はこちらの続きです。

Java Flight RecorderとJava Mission Controlを使ってみよう


上記の記事ではJava Flight Recorder(JFR)のファイルとして、JDKに付属しているサンプルのものを使いました。
今回は、自分で起動したアプリケーションにJFRのファイルを出力させ、Java Mission Controlで内容を見ることにします。

対象アプリケーション

対象のアプリケーションには要件がとくにないので、起動しやすいSpring Bootアプリケーションにします。
https://spring.io/guides/gs/scheduling-tasks/
このアプリケーションは定期的に日時を出力するだけのアプリです。GitHubから取得できます。Gitクライアントがない場合はZIPファイルでダウンロードもできます。

build/libs/gs-scheduling-tasks-0.1.0.jarという実行可能JARファイルができます。

Java Flight Recorderの出力設定

以前の記事でJFRは以下のようなものだと記載しました。
「Java Flight Recorderは、Oracle JDKに組み込まれているプロファイリングとイベント収集フレームワークです。Javaの管理者および開発者は、Java Virtual Machine (JVM) とJavaアプリケーションがどのように動作しているかについての詳細な低レベル情報を収集することができます。」
http://www.oracle.com/technetwork/jp/java/javaseproducts/mission-control/index.html

JFRのガイドは以下のページにあります。
http://docs.oracle.com/javacomponents/jp/jmc-5-5/jfr-runtime-guide/toc.htm

JFRのファイルを出力するためには、javaコマンドに次のオプションを指定します。

-XX:+UnlockCommercialFeaturesオプションは、JFRと直接関係はありませんが、商用機能のロックを解除するものです。JFRを使うためには必要です。-XX:+FlightRecorderオプションでJFRをオンにし、-XX:StartFlightRecording=duration=60s,filename=sample.jfrで記録する期間と出力先のファイル名を指定します。この例の場合、収集する時間は60秒で、javaコマンドを実行したディレクトリにsample.jfrというファイルを出力します。
なお、商用機能のロック解除は「Java SEのBCL(Oracle Binary Code License Agreement for the Java SE Platform Products and JavaFX)に定義されている開発用途での利用の場合」のみに限られていることに注意してください。

アプリケーションの起動

ではJFRを有効にしてSpring Bootアプリケーションを、JFRのオプションをつけて起動しましょう。

Started recording 1. The result will be written to:という出力があるので、JFRが起動してファイルに出力していることがわかります。今回は120秒を指定したので、2分経過したらアプリケーションを停止してもらって大丈夫です。sample.jfrが出力されているか確認します。

ありました。

Java Mission Controlで見てみよう

ではJava Mission Control(JMC)でsample.jfrを開きます。
スクリーンショット 2016-06-17 17.43.20
高負荷なアプリケーションではないので、たいしたデータはありませんが、見れています。
メモリーを見てみます。ガベージ・コレクションタブを開きます。
スクリーンショット 2016-06-17 17.45.19
ガベージコレクションは起動時にしかなかったようです。フルGCはなくScavenge(New領域のGC)だけでした。次にGC構成のタブを開きます。
スクリーンショット 2016-06-17 17.45.40
GCアルゴリズムもデフォルトのままですので、パラレルGCです。ヒープサイズは初期128MB、最大2GBです。こういったこともJFRを通じてわかります。

サマリー

やはりJFR、JMCはすごいですね!今回は起動時にJFRの収集を開始させましたが、次の機会には起動後のアプリケーションに対してJFRに収集させる方法について書きたいと思います。


Posted bysakata


Hello world! コンテンツ・メディア第1事業部のjyukutyoこと阪田です。
突然ですが、みなさんはJava Flight RecorderとJava Mission Controlをご存知でしょうか?

Java Flight Recorder

「Java Flight Recorderは、Oracle JDKに組み込まれているプロファイリングとイベント収集フレームワークです。Javaの管理者および開発者は、Java Virtual Machine (JVM) とJavaアプリケーションがどのように動作しているかについての詳細な低レベル情報を収集することができます。」
http://www.oracle.com/technetwork/jp/java/javaseproducts/mission-control/index.html
Java Flight Recorder(JFR)はアプリケーションとJVMの詳細な情報をファイルに出力することができます。

Java Mission Control

「Java Mission Controlは、Java Flight Recorderによって収集されたデータを効率的かつ広範囲に詳細な分析を可能にする高度なツール・セットです。ツール・チェーンは、開発者や管理者が、ローカルで実行している、あるいは本番環境でデプロイされているJavaアプリケーションからデータを収集し分析することを可能にします。」
Java Mission Control(JMC)は直接アプリケーションに接続して情報を収集することもできますが、JFRのファイルから分析することができます。

注意事項

JFRとJMCはともに商用機能です。使用するためにはOracle Java SE Advancedのライセンスが必要となります。ただし、Java SEのBCL(Oracle Binary Code License Agreement for the Java SE Platform Products and JavaFX)に定義されている開発用途での利用の場合は無料です。
BCLはこちらです。
http://www.oracle.com/technetwork/java/javase/terms/license/index.html
基本的には、本番環境で使用する場合は必ずライセンスがいるということです。

JMCの起動

JMCはOracle JDK 7 Update 40 (7u40)以降バンドルされています。$JAVA_HOME/binディレクトリにjmcコマンド(jmc.exe)があるので実行します。次のような画面が表示されます。今回のJMCのバージョンは5.5です。

WS000048

起動したけどどうしよう?

さてJMCを起動しましたが、JFRのファイルがないため、何も見るものがありません。ですが、JDKのDemos and SamplesにJFRのファイルが含まれています。今回はそれを使います。
http://www.oracle.com/technetwork/java/javase/downloads/index.html
このページからJDKのダウンロードに進み、ページの下部に「Java SE Development Kit xxx Demos and Samples Downloads」という項目があります。ここからダウンロードしてください。そして解凍します。

JFRのファイルを開いてみる

解凍したディレクトリのsample/missioncontrol/flightrecordingsディレクトリに、拡張子がjfrのファイルがあります。このファイルをJMCで開きます。wldf.jfrを開いてみます。ロードに少し時間がかかります。それから次のような画面になります。

WS000049

本当にさまざまな情報を見ることができます。ヒープ、CPU使用状況、スレッド数といった一般的な情報からJITコンパイルの状況、ホット・メソッド、ロック・インスタンスなどの細かい情報が見れます。

サマリー

JFRとJMCは本当に強力なツールです。もしライセンスを持っているなら、すぐにJFRでファイルを出力してデータを収集されるとよいと思います。持っていなくても、こうしてサンプルで試してみることができます。ぜひ一度JFRとJMCを触ってみてください!


Posted bysakata

2016年06月9日

sakata

OpenJDKのJDK 9をビルドしよう #openjdk

カテゴリ
Java

Hello world! コンテンツ・メディア第1事業部のjyukutyoこと阪田です。
みなさん、JDK 9は使っていますか?この記事ではOpenJDKのJDK 9をMacでビルドします。
実はビルドせずともダウンロードしてインストールすることもできます。
https://jdk9.java.net/download/
ですが、最新ではない場合もありますので、ここではビルドします!

Mercurial

OpenJDKのソースコードはMercurialで管理されています。まだMercurialをセットアップしていない場合は、インストールしましょう。MacでHomebrewを使っている方であればbrew install hgです。

ソースコードの取得

OpenJDKのソースコードを取得します。defaultブランチの最新のソースコードを取得するよりも、バージョンのタグが付いている方がよいでしょう。タグの一覧は次のURLで見れます。
http://hg.openjdk.java.net/jdk9/jdk9/tags
上部にあるものが新しいタグです。jdk-9+xxx形式の最新のタグ名を使いましょう。今回はjdk-9+121のタグを使います。
Mercurialでソースコードを取得します。

最後のjdk-9+121はクローンしたソースコードを格納するディレクトリ名です。ディレクトリに移動します。

ここからさらにソースコードを取得します。

ビルド

これでconfigureできます。私の環境は複数のJDKが入っているので、ビルドに使うJDKを指定します。デバッグ版がほしい場合はさらに--enable-debug --with-target-bits=64オプションをつけます。

configureできたので、make allコマンドを実行します。

JDK9がインストールされました。さっそく使いましょう。

JDK 9を使う

build/macosx-x86_64-normal-server-release/jdkディレクトリがJAVA_HOMEとなります。

JDK 9から入ったjhsdbjmodというコマンドがありますね。

ヒャッハー!9になりました。これでJavaのREPL、jshellが使えますよ!

サマリー

さて今回はOpenJDK 9をビルドしてみました。次回はJava 9の機能のどれかを使ってみます。

2016/06/09追記

コマンドではないですが、HSDB自体ははJava 7から使える、とのご指摘をいただけました。


Posted bynishikawa

2016年05月27日

nishikawa

Java8のDate and Time APIでハマった話

カテゴリ
Java

はじめましてこんにちは!コンテンツ・メディア第1事業部の西川です。ピクトリンクというアプリのサーバサイドの開発をしています。 今日はJava8のDate and Time APIでハマった話をします。
ある文字列を日付型に変換したい…よくあると思います。

これを実行すると…DateTimeParseExceptionが。

ResolverStyleをSTRICT(厳密)にしているのでLENIENTかSMART(デフォルト)を指定すると動きます。

DateTimeFormatterのドキュメントを見ると

y year-of-era
u year

とあります。

eraは暦を表すのでSTRICTを指定した場合はどの暦かわからなくてエラーになっているということです。歴は日本で言うと平成、昭和などです。

単純に解決するには yyyyuuuu にすればOK。

どうしても yyyy を使いたい!という人は以下のように暦を指定させるようにする必要があります。

おまけ:SimpleDateFormatで判定を厳密にしたい場合

以下のように setLenient(false) でOKです。


Posted byKayo


みなさん、こんにちは。コンテンツ・メディア第1事業部インフラ担当の藤本佳世です。 少し前になりますが、テスト系環境にOpenStackを導入しました。OpenStackを聞いたことがない方も安心して下さい。これから構築手順やTipsなどご紹介できればと思っています。今回は1回目「OpenStackとは?」についてお話ししたいと思います。今後、下記の内容をブログに投稿する予定です。

  • OpenStack構築手順
  • ネットワーク設定  ※高可用構成やFloatingIP割り当てなど
  • 仮想マシンの起動や管理について  ※イメージやフレーバーの作成など
  • セキュリティグループについて ※追加や削除方法など
  • つまずいたこと

What is OpenStack?

OpenStack とは、簡単に説明すると、プライベートクラウド環境でAmazon Web Services(以下AWS)のようなものを構築可能にしたソフトウェアです。AWSを使ったことがない方に向けて、もう少し詳しく説明すると、OpenStackを使ってプライベートクラウド上に仮想サーバやネットワーク、ストレージなどを構築することができます。そして、それら作成したものはダッシュボードの Web インターフェースから管理することができ、GUI上で簡単に仮想サーバを構築することができます。
その他にもOpenStackは、DockerやAnsibleなど構成管理ツールとも連携することができ、より効率よく短時間で用途にあったサーバを構築することができます。

OpenStack導入でサーバ構築時間を短縮

openstack導入1

openstack導入2

OpenStackを導入することにより、サーバの構築時間を今まで以上に短縮することができました。開発メンバーから、「新技術の検証環境として新しいサーバが欲しい」や「新しいサーバを購入するほどではないけど、検証用にサーバが欲しい」など要望があった場合、今までサーバが届いてから3時間ほどかかっていた構築作業が、10分以内で可能となりました。構築が早くなったことで、開発メンバーを待たせることなく、気軽にサーバ構築依頼をしてもらえるようになりました。

7つのコンポーネント

OpenStackは7つの機能から構成されます。

  1. Nova (仮想マシンの提供と管理を行う)
  2. Keystone (ユーザー認証・管理を行う)
  3. Horizon (Webブラウザ経由で管理・操作できるGUIコンソールを提供する)
  4. Glance (仮想イメージの管理を行う)
  5. Cinder (仮想マシンが使用するストレージ管理を行う)
  6. Neutron (仮想ネットワークの管理を行う)
  7. Swift (クラウドストレージを提供する)

OpenStack構築内容

ホストOS: Ubuntu14.04LTS (8台構成), OpenStackバージョン: Liberty

  • サーバ1:Nova,Keystone,Horizon,Glance,Cinder
  • サーバ2:Nova,Keystone,Horizon,Glance,Cinder
  • サーバ3:Nova,Glance,Cinder
  • サーバ4:Nova,Glance,Cinder
  • サーバ5:Nova,Glance,Cinder
  • サーバ6:Nova,Glance,Cinder
  • サーバ7:Neutron
  • サーバ8:Neutron

※Swiftは未検証

ホストOSのUbuntuインストールは、前回ご紹介したPXE機能を使って構築しました。
前回の記事はこちらへhttp://tech.furyu.jp/blog/?p=3858

次回は、各コンポーネントの説明と構築手順をご紹介したいと思います。



コンテンツ・メディア第1事業部の荒木です。ピクトリンクというアプリのAndroid版を作っています。今回は、Google Tag Manager(以下、GTM)でAndroidアプリのABテストを効果的に行うためにウェブテストの目的を設定します。ちなみに今回の記事の内容は、Androidアプリに限らずiOSアプリでも使えます。

GTMによるモバイルアプリのABテスト開始方法については、前回の記事(Google Tag Manager でAndroidアプリのABテスト -ABの出し分け-)を参照してください。

設定の概要

ウェブテストの目的は、各パターン(Aパターン、Bパターン)の優劣判定に使われます。GTMは、ウェブテストの目的を基準にして各パターンの優劣を判定します。GTMの「Google アナリティクスのウェブテスト」変数の編集画面から目的を設定することができます。

ウェブテストの目的

デフォルトでは、スクリーン数、セッションの長さ、例外数、クラッシュ数の四つから選ぶことができます。たとえば、スクリーン数をウェブテストの目的に設定していると、Google Analytics(以下、GA)で送信したスクリーン数が多いパターンが優秀と判定され、クラッシュ数を目的に設定していると、クラッシュ数が少ないパターンが優秀と判断されます。

GAの目標を作成する

さて、ここで特定ボタンのクリックイベントが多いパターンを優秀と判定したい場合を考えてみましょう。カスタムの目的を設定するには、GAの目標を利用します。GAにログインし、「アナリティクス設定」タブの「目標」を選択してください。このとき、アカウント・プロパティ・ビューがGTMのウェブテストと連携していることを確認してください。

GAの目標を選択

目標の設定画面に遷移したら、「+新しい目標」ボタンから目標の作成を開始してください。目標作成は「① 目標設定」「② 目標の説明」「③ 目標の詳細」の3ステップで実施します。

① 目標設定

「テンプレート」と「カスタム」から選びます。テンプレートは、プロパティ設定で指定されている業種で一般的に目標に設定されるものの候補を表示してくれるので、これから何を目標とすべきかわからないときに参考にしてください。今回は特定ボタンのクリックという目標がすでに決まっているので、「カスタム」を選択します。

② 目標の説明

ここでは、目標の名前とタイプを設定します。タイプとは目標の達成基準に関わるもので、全4種あります。以下は、各タイプの目標達成基準です。

  • 到達ページ:特定スクリーンへ到達したか
  • 滞在時間:滞在時間が設定した時間より長いか
  • ページビュー数 または スクリーンビュー数:1セッションあたりのPV数またはスクリーン数が設定した数より多いか
  • イベント:特定イベントが送信されたか

今回は、ボタンのクリックイベントを目標としたいので、「イベント」を選択します。

目標の説明

③ 目標の詳細

ここでは、 ②で選択した目標タイプごとの詳細設定を行います。今回は、イベントの目標詳細を設定します。イベントの詳細設定では、GAイベントのカテゴリ、アクション、ラベル、値についてそれぞれ条件を設定することができます。カテゴリ、アクション、ラベルは「等しい」「先頭が一致」「正規表現」で一致条件を設定します。値については、「超」「完全一致」「未満」で条件を設定できます。ここで設定した条件が全て満たされた場合に、目標達成となります。なお、空欄の条件は無視されます。

目標の詳細

GAの目標を目的に設定する

GAの目標作成が完了したら、GTMの設定に戻ります。「Google アナリティクスのウェブテスト」変数の編集画面で設定できるウェブテストの目的に、先ほど作成したGAの目標「特定のボタンをタップ」が追加されています。これを選択すれば、ボタンのクリック率が良いパターンが優秀と判定されるようになります。

GAの目標をテスト目的に

テスト結果の確認

テスト結果の確認は、GAで行います。GA左サイドメニューの「行動」→「ウェブテスト」から、ウェブテストの進捗や結果が確認できます。ウェブテストの目的で設定した基準の達成率(コンバージョン率)を元に、各パターンの優劣が判定されます。GTMの設定によっては、テスト終了時に成果の高いパターンに自動で固定したり、テスト中に徐々に成果の高いパターンに移行していくということが可能です。

ウェブテストの結果

おわりに

ウェブテストの目的を適切に設定することで、ユーザーの動向にリアルタイムに追従して、より適切な画面を出せるようになります。みなさんもウェブテストの目的を設定して、よりユーザーに楽しんでもらえるようなアプリを作りましょう!

以上です。



Hello world! コンテンツ・メディア第1事業部のjyukutyoこと阪田です。

5/21(土)に開催されたJJUG CCC 2016 Springにて登壇しました。「Seasar2で作った俺たちのサービスの今」というセッションです。
登壇のいきさつはこちらに書いています。

JJUG CCC 2016 Springで登壇します!

そして、スライドはこちらです。

私の感想/思い

技術の解説ではなく実際のサービスの設計判断や詳細を話すというのは、自分のすべてをさらけだす感じがします。私のこのセッションが、弊社フリューの技術レベルの基準になるとも言えます。
もちろん私は天才プログラマーではなく、知らない知識や誤った判断などがあります。それでもこうして発表することで、そうした部分を教えていただき、改善へのアドバイスをいただくことができました。大切なことは、そうした知識を得て私自身の能力が向上すること、そしてサービスがよくなることですから。

私の部署のアプリケーションは、利用者数も1,000万人を超え、決して小さくないサービスです。精鋭エンジニア集団というよりは、向上心はあるけれども、私を始めある種普通(定義が難しいですが)のエンジニアが集まったチームです。そんな状況でも四苦八苦しながらこのレベルのサービスを運用開発できるということも伝えたかったことです。

私の思い

Twitterやブログで感想もたくさんいただくことができました。Twitterではハッシュタクグ「#ccc_gh6」に主に集まっています。「理想ではなく現実解で進んでいること、メンバーのことを考えながら進んでいることに共感できた」という言葉を多くいただきました。私が伝えたかったのは、技術的方法論ではなく、ベストな正解などはなく、自分の置かれた背景、コンテキストに合わせて、よりベターな方法を探りながら進んでいくしかなく、多くの誤りをしながらもそこからフィードバックを得て誤りを直し進めばいいということでした。

エンジニアは論理性や一貫性の能力が高いですから、システムやアプリケーションの今の状況、つまりスナップショットを見て、「ダメ!」という判断を下してそれで終わらせることがあります。でもシステムやサービスには時間軸があります。時間の経過とともに変化していくものです。もちろん置かれている状況によっては、契約や納品など簡単には適用できない現場もあるかとは思います。ただ、そんな中でも時間軸があり、「終わっている!」というときでも今から変化させていくことができます。

CCC自体の感想

私が聴講した他のセッションについては、別のエントリで書きたいと思います。ここではCCCというイベント全体についての感想を書きます。

今回のCCCは登録者数1,200名以上、実際の参加者も800名以上とのことでした。私も関西Javaエンジニアの会(関ジャバ)の会長という立場ではありますが、スケールが違いすぎます。CCC1回の会場費も200万円!JJUG会長である鈴木さんのスライドに記載があります。

これだけのイベントを運営するJJUG幹事、スタッフの方はとても大変だと想像します。これを年2回開催されていることに頭が下がります。

関西から参加されている方も10名以上はおられました。私が知っている方だけでその人数ですので、実際はもっと多いでしょう。次のCCCは秋頃に開催されますので、ぜひみなさんにも参加をお勧めいたします!



初めまして、フリュー佐藤、こと、ジョンです。 安心してください、普通の日本人です。

普段は「ピクトリンク」のサイトの開発、運用しており、サーバサイドの開発を行っております。

今回はSPAJAM2016 大阪予選に参加したことを書きたいと思います

SPAJAM2016とは

http://spajam.jp/

スマートフォンアプリジャム2016、2日間でスマートフォンアプリを開発するハッカソンイベントです。

spajam6

全国で予選があり、本戦が温泉地で行われます。本戦には、各予選での最優秀賞の9組、各予選の優秀賞の中から2組、学生枠で1組が本戦に参加することができます。

SPAということで温泉に浸かり、頭をリフレッシュしながらの開発です。 素晴らしいですね。

本戦で優勝するとシリコンバレーツアーがプレゼントされます。 素晴らしいですね。

SPAJAMに参加する前準備

チームはプログラマ3人、デザイナー1人、プランナー1人という構成でした。 プログラマは業務で画像処理をメインにやっていた2人と、僕でした。

つまり、圧倒的なスマートフォンアプリ開発者不足。逆に言えば、これからどうやって開発していこうかと考える幅がありました。

……いや、正直言ってそんな暇はありませんでした。出場が決まってから当日までは2週間ほどです。

とりあえず手持ちの環境で、かつ、ネイティブアプリ作成ができそうなものということでAndroidのネイティブ開発にしました。Androidの開発は弊社でも行われていたため、その人達に教えてもらいながら勉強をしました。

全員ハッカソン自体にも出たことがないので、半日での模擬ハッカソンをしてみました。

ハッカソンの結果、様々な課題が見えてきました。

僕の方から、開発環境として以下のものを勧めてみました。

  • バージョン管理システム:Git

ブランチの切り替えが早い。また、githubを使うとレポジトリが無料で使えるのでcodeの共有も簡単。

  • 統合開発環境(IDE):Android Studio

Googleが提供しているIntelliJがベースとなっているIDE。弊社Android開発でも使用しているため、ノウハウはある。

  • Slack

無料で使えるコミュニケーションツール。チャットも使え、ファイルの共有もできる。また、Mac、Windows関係がなく使うことができる。

しかし、他のメンバーは、他の開発環境(svnやVisual Studioなど)を使っており、馴染みがなく、僕もきちんと説明している暇もなく、あまつさえAndroidに関しては僕も詳しくないので、お世辞にもスマートな開発ではありませんでした。

ハッカソンの結果を踏まえ、2週間ほどで得た付け焼き刃立派な知識の中で、結局このチームで何ができるのか、できないのかを考えました。

結果、ツールは触りながら覚え、それにプラスして、チームでのカラーを出せるように、画像処理を使ったアプリが開発出来るように環境を整えることで、本番を迎えようと決めました。

模擬ハッカソンはやっておいて本当に良かったです。本番で起こりえそうな問題(proxy、ソースコードの競合などの技術的問題から、プレゼンでの発表形式、画像の共有のしかたなどのハッカソンの進め方まで)について身をもって体感できたからです。

大きなディスプレイとmac miniをキャリーカーに詰めて出発です。(僕だけ

SPAJAM当日

予選会場はYahoo!JAPAN大阪でした。27階という高層。

spajam風景1

高所恐怖症の人はまずそれとの勝負(僕だけ

今回のテーマは、「おでかけを楽しむ」でした。

アイデアソンでは、たくさんのアイデアが出てきましたが、チーム内ではこれだというアイデアは出てきませんでした。15時まで考えつづけましたが結局はいいアイデアが出ず、当初の予定である画像処理を使ったアプリを考えるようにしました。

役割分担は以下です。

  • 僕: UIまわりの組み立て
  • プログラマ他二人: 画像処理部分を作成
  • プランナー: アプリの仕様、その見せ方
  • デザイナー: 発表資料やアプリに必要な画像の作成

UI周りについてもいろいろ考えたりしていました。

spajam2

時間がないうちにどれだけ完成に近づけるか、プレゼンで発表される部分を意識して作成をしていきました。

spajam7

最終的には各自、自分の担当範囲だけではなく、今何が足りていないのか、時間が決まっているなかで、何ができて、何ができないのかを考え行動していけていました。

成果物について

今回作成したアプリは以下です。

パシャ男

「お出かけを楽しむ」ため、お出かけ中にライブでアルバムを埋めていくアプリとなっています。

spajam4

レイアウトを決めて(プレゼンテーションの時は全部同じレイアウトでした。

Screenshot_2016-05-15-18-07-54

カメラアイコンをタップすると写真がとれます。また、動画を撮影することができます。

Screenshot_2016-05-15-18-08-04

しかし、パシャ男の本気はこれだけではありません。写真を取る際に通行人を消すことができるのです。

これがプレゼンテーションでは大きく反響を得られました。

結果

大阪予選計12チームがあり、僕達のチーム以外にも、他のチームのアプリもとても魅力的なものが多く、SPAJAMのレベルの高さを感じました。また、学生のスキルの高さにも驚かされました。

しかし、そんな中、僕達のチームはプレゼンテーションを完璧にこなすことができ、結果

最優秀賞

をいただくことができました。

OLYMPUS DIGITAL CAMERA

総評としては

  • 画像処理などの技術力が光っていた
  • アプリのUI部分で完成度が高かった
  • アイデアについては他の優秀賞とも比べると少し弱かった

とのことです。これを次の本戦で活かしていきたいです。

まとめ

ここまでで説明させていただいた通り、アプリ開発をやったことのないメンバでもアプリを開発することができました。また、アプリ開発においては秀でた知識は無いですが、それを他の知識でカバーして、最優秀賞をいただくことができました。

本戦は、7月2日(土)〜7月4日(月)です。それまで、今回受けた刺激や、面白いと思ったアイデアをどうやれば実現できるのかという部分まで落とし込んで、実装力を上げて行きたいと思います。

この記事を読んだ方で興味がある方、まだ、予選の応募ができる箇所がありますのでぜひ申し込んでみてください!



コンテンツ・メディア第1事業部の荒木です。 今回は、Google Tag Manager を利用してAndroidアプリでABテストをするために、AパターンとBパターンをアプリで出し分ける方法を紹介したいと思います。

Google Tag Manager とは

Google Tag Manager(以下、GTM)は、タグと呼ばれるウェブサイトに埋め込む解析用のコードを管理するためのツールです。たとえば、Google Analytics用の共通タグを各ページに埋め込んでおけば、イベント名などの設定を全てウェブ上で実施できるといったメリットがあります。

GTMでABテストをするメリット

Google AnalyticsとアプリのプログラムだけでABテストの仕組みを作ることは可能です。しかし、GTMによるABテストには、少なくとも以下のメリットがあります。

  • テスト結果の解析を自動で行って、成果の高いパターンに移行してくれる
  • ABテスト用のGAイベント送信が不要である
  • ABテストの開始条件(アプリバージョンや、日時)をプログラムに書かなくて良い

GTM自体のメリットと同様、テストの設定とプログラムを独立できるというのが良い点です。

コンテナの作成

実際にタグの管理を行うために作成するものがコンテナです。GTMではコンテナの設定によって、タグを管理します。 初めてGTMにログインしたときは、アカウントとコンテナを一つずつ作成することになります。今回は、コンテナの使用場所として「Android」を選択します。

アカウントとコンテナの作成

Google Analytics と連携する

コンテナと Google Analytics (以下、GA)を連携させることで、ABテストの設定ができるようにします。GTMのページ上部の「管理」タブをクリックすると表示される画面で、「外部アカウント リンク」をクリックすると、以下のような画面になります。ここで、GTMにログインしているGoogleアカウントが持っているGAアカウント(持っていない場合は新しく作ってください!)とGAのプロパティが選択できるようになっているので、連携させたいものを選んでください。

GAとの連携

ABテスト用の変数を作成する

さて、いよいよABテストの設定です。ABテストをするためには「Google アナリティクスのウェブテスト」という変数を作成する必要があります。変数とは、アプリに動的に取り込む値を設定したり、アプリから送るデータのフィルタリングに利用される、名前と値のペアです(今回は、アプリに取り込む値の設定に使います)。画面左の「変数」を選ぶと以下のような画面になるので、「新規」をクリックします。

変数の新規作成

変数の作成画面は以下のようになっています。変数の種類に「Google アナリティクスのウェブテスト」を選んでください。

変数の設定

つづいて、各種設定の大まかな説明をします。詳細オプションや有効化のタイミングについては、今回は割愛させていただきます。

Google アナリティクスのアカウント・プロパティ・ビュー

GAとの連携部分です。

ウェブテストの目的

このテストで何を成果とするかを選択します。デフォルトでは、スクリーン数、セッションの長さ、例外数、クラッシュ数の四つしか選べませんが、GAの目標を設定しているとテストの目的に設定することができます。たとえば、特定ボタンのクリックイベントや、ユーザーの課金状況などを設定することもできます。

パターン

ここがABを出し分ける仕組みになります。パターンとは key と value のペアでjsonデータのようになっています。ここで、各パターンで使いたい値を定義していきます。たとえば、アプリのテキスト領域に「Aパターンです。」「Bパターンです。」と出し分けたい場合は、Aパターンで{'text' : 'Aパターンです。'}、Bパターンで{'text' : 'Bパターンです。'}と定義しておけば、アプリ側で「text」という key の値を取得した時に、「Aパターンです。」または「Bパターンです。」のどちらかの値を得ることができます。

コンテナを公開して、ダウンロードする

コンテナは公開することで初めて動作します。画面の右上に「公開」ボタンからコンテナを公開することを忘れないようにしましょう。公開したら、画面上部「バージョン」タグから公開したバージョン(最初は1)を選んでください。以下のような画面になるので、右上の「アクション」→「ダウンロード」をクリックするとGTM-XXXXXXというバイナリファイルがダウンロードされます。

コンテナのダウンロード

ここまでが、GTMでの設定になります。

Androidアプリで各パターンの値を取得する

ここからは、Android Studio での作業になります。

GTMをアプリに導入する

GTMは、GAのライブラリに含まれているので、build.gradledependencies に以下を追加してください。

また、GTMを利用するために必要なパーミッションは、android.permission.INTERNETandroid.permission.ACCESS_NETWORK_STATEなので、必要ならばAndroidManifest.xmlに設定しておいてください。

GTMの初期化

GTMを初期化して、ユーザーがAパターンかBパターンかを確定します。GTMの初期化は、以下のように書きます。アプリの初期化の際に、実施するのが良いと思われます。

ここで、GTM-XXXXXXは自分のコンテナID、R.raw.gtm_default_containerはコンテナを公開した後にダウンロードしたバイナリファイルです。バイナリファイルはres/rawディレクトリに配置すること、バイナリファイル名(元々は「GTM-XXXXXX」)が大文字を含まないようにリネームすることに注意してください(リネームしないとエラーになります)。また、取得したContainerHolderをアプリのどこからでも参照できるようにContainerHolderSingletonというシングルトンクラスを作って、セットしておきます。

値の取得

最後に値の取得を行います。

Container#getString(String key) メソッドで値の取得をすることができます。ここで取得できる値は、ユーザーがどのパターンであるかによって変わります。文言や色などのシンプルなデータなら、GTMから取得した値をそのまま表示すれば良いです。もし、レイアウト自体を大きく変えたい場合は、取得した値をフラグにして読み込むべきレイアウトのxmlを変えるという実装になると思います。

おわりに

この記事では、アプリでABパターンを出し分けるための方法を紹介しました。この時点では、まだテストの解析や開始条件の設定といったことがわからないと思います。それについては、また別の機会に紹介したいと思います。