Engineer Llfe Dogear

エンジニアリング活動におけるメモやTipsを書くブログ

Postgresqlの設定からRailsアプリケーションをherokuで動かすまで①

Macの開発環境において、簡単なRailsアプリケーションをheroku上で動かすまでの手順をメモとして残します。 説明の大まかな流れは以下の通りです。

  • herokuで利用するpostgresqlのローカルでのインストールと設定
  • herokuのインストールと設定
  • railsアプリケーションの生成とherokuへのデプロイ

Postgresqlのインストールと初期設定

1. インストール

brew install postgresql

2. 設定ファイルの変更

echo 'export PGDATA="/usr/local/var/postgres"' >> ~/.bash_profile
source ~/.bash_profile

3. 起動

postgres -D /usr/local/var/postgres

4. Password設定

psql postgres  // ログイン

postgres=# \password
(パスワードの入力)
\q            // ログアウト

5. confファイルの変更

  • /usr/local/var/postgres/pg_hba.confを以下の通り変更
// 変更前
local   all     all                         trust
host    all     all     127.0.0.1/32        trust
local   all     all     ::1/128             trust

// 変更後
local   all     all                         md5
host    all     all     127.0.0.1/32        md5
local   all     all     ::1/128             md5

6. 再起動

  • 停止: Ctrl + Cでストップ
  • 起動
postgres -D /usrl/local/var/postgres

7. ログイン

psql -d postgre
psqlオプション
  • -d: データベース名 (省略可、省略した場合はログインユーザ名が指定される)
  • -U: ユーザ名 (省略可、 省略した場合はログインユーザ名が指定される)
  • h: ホスト名 (省略可、省略した場合はlocalhostが指定される)

次の記事に関して

次の記事では、Postgresqlでユーザ作成+DB作成について説明します。

参考URL

TesseractをVS2013で動かす

仕事で、TesseractをVS2013で動かす必要があり、VS2013でビルドするなど少し手間がかかりましたので、その手順をメモとして残します。 TesseractはVS2008、VS2010用のLibは存在するのですが、VS2013のものはないようです。 手順に関しては、以下を参考にしました。 http://vorba.ch/2014/tesseract-3.03-vs2013.html

構築手順

  1. vs2013対応のtesseract関連ファイルの取得
    • Cドライブ直下にTesseract-Buildディレクトを作成し、移動
    • ファイルの取得
      • git clone https://github.com/tesseract4java/tesseract-vs2013
  2. 関連ファイルのbuild

    • VS2013のコメンドラインを開く
    • C:¥Tesseract-Build¥tesseract-vs2013へ移動
    • msbuild build.proj を実行
      • ※ 私の場合は、ここで定義したtypedefが利用できないというエラーが発生
      • 発生したファイルをutf-8で保存 or エラー箇所のテキストのインデントなどを修正したらエラーが直りました
    • C:¥Tesseract-Build¥tesseract-vs2013¥releaseにincludeとlibディレクトリとファイルができていることを確認
  3. Tesseractのbuild

    • C:¥Tesseract-Buildに移動
    • tesseractのソースコードをチェックアウト
      • git clone https://code.google.com/p/tesseract-ocr/
    • C:¥Tesseract-Build¥tesseract-ocrへ移動
    • C:¥Tesseract-Build¥tesseract-vs2013にあるパッチファイルを適用
      • git apply ..¥tesseract-vs2013¥vs2013+64bit_support.pach
      • ※ vs2013+64bit_support-git.pathというファイルもあるが、これはsvn用のpatch(名前ミス?)
    • C:¥Tesseract-Build¥tesseract-ocr¥vs2013ディレクトリとslnファイルができていることを確認
    • C:¥Tesseract-Build¥tesseract-vs2013¥release以下のincludeとlibディレクトリをC:¥Tesseract-Build直下へコピー
    • C:¥Tesseract-Build¥tesseract-ocr¥vs2013以下のslnファイルを開く
    • DLL_DEBUG、DLL_Release、LIB_Debug、LIB_Releaseのそれぞれの構成でbuild
      • ※ このとき。equationdetect.cppでエラーが発生
      • このファイルをutf-8で保存しなおして解決(自分のVS2013の文字コード設定が問題かも)
    • C:¥Tesseract-Build¥tesseract-ocr¥vs2013¥bin¥Win32に各構成のlib、dllがあることを確認
  4. VS2013用のlib、dll、includeファイルの配置
    ※ lib、dll、includeファイルの配置は任意のディレクトリとなります。

    • Cドライブ直下に、Tesseract_vc12ディレクトリを作成
    • C:¥Tesseract_vc12に移動し、include、libディレクトリを作成
    • C:¥Tesseract-Build¥tesseract-vs2013¥release¥include以下のファイルすべてをC:¥Tesseract_vc12¥includeディレクトリにコピー
    • C:¥Tesseract-Build¥tesseract-vs2013¥release¥lib¥Win32以下のファイルすべてをC:¥Tesseract_vc12¥libディレクトリにコピー
    • C:¥Tesseract_vc12¥include¥tesseractディレクトリを作成
    • C:¥Tesseract-Build¥tesseract-ocr以下のディレクトのファイルをC:¥Tesseract_vc12¥include¥tesseractにコピー
  5. VS2013へのinclude、libの設定

    • VS2013プロジェクトの作成
    • ソリューションエクスプローラからプロジェクトを選択し、右クリック > プロパティの選択
    • 構成プロパティ > VC++ディレクトリを選択
    • インクルードディレクトリに以下を追加
      • C:¥Tesseract_vc12¥include
      • C:¥Tesseract_vc12¥include¥leptonica
      • C:¥Tesseract_vc12¥include¥tesseract
    • ライブラリディレクトリに以下を追加
      • C:¥Tesseract_vc12¥lib
  6. Tessearctを使ったサンプルの作成と実行
    OcrSample.cppとして以下のソースコードを追加

#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>

int main(int argc, char* argv[])
{
    tesseract::TessBaseAPI *baseAPI = new tesseract::TessBaseAPI();
    if (baseAPI->Init(NULL, "eng")) {
        printf("Could not initialize tesseract.\n");
        exit(1);
    }

    Pix *pix = pixRead("sample.jpg");
    baseAPI->SetImage(pix);

    char* outText = baseAPI->GetUTF8Text();
    printf("recognized text: %s", outText);

    baseAPI->Clear();
    baseAPI->End();
    delete[] outText;
    pixDestroy(&pix);

    return 0;
}

実行して、読み込んだ画像中の文字がコンソールに表示されれば成功です。

Windows環境でVagrantでCoreOSを入れて、Dockerを試した

Dockerを試して見ようと思い調べた結果、CoreOSには標準でdockerが入っているということで、vagrantでCoreOSを入れてDockerを試した手順のメモを残します。 Windows上でのVirtualbox + proxy環境であったため少しだけハマってしまいました。

Virtualboxのインストール

下記サイトより、ダウンロードページに移動し、各OS用のvirutal boxをダウンロードし、インストールする。 今回は, Windows用のものを選択。

Oracle VM VirtualBox

Vagrantのインストール

下記サイトより、ダウンロードページに移動し、各OS用のvagrantをダウンロードし、インストールする。

Vagrant

CoreOSの準備

CoreOSのVagrantのBoxファイルを下記より、git cloneする。

https://github.com/coreos/coreos-vagrant.git

git cloneはSourceTreeをインストールしていたので、SourceTreeのgit環境でcloneしました。

CoreOSの起動

git cloneしたcoreOSファイルのディレクトリにcommand promptで移動し、以下のコマンドを実行。

vagrant up

また、以下のコマンドでvagrantで立ち上げた仮想マシーンの動作状況を確認できます。 coreosがrunning状態になっていればOK。

vagrant status

Vagrantで立ち上げたCoreOSへのログイン

windowsでは、sshでログインするためにはssh クライアントが必要になります。 今回はputtyを利用しました。手順は以下の通りです。

  1. putty.exeファイルとputtygen.exeファイルをダウンロード PuTTY Download Page
  2. puttygen.exeファイルで%USERPROFILE%.vagrant.d\insecure_private_key をpptファイルに変換
    この手順をやらないまま、puttysshの暗号鍵にinsecure_private_keyを指定するとうまくログインできませんでした。
    この手順については以下のサイトを参考にしました。
    SSH to Vagrant box in Windows? - Stack Overflow Putty Unable to Use Vagrant’s Private Key | A Little of Both

  3. puttyでcoreOSにログイン 以下の通りの設定を行い、ログインします。
    ホスト: 127.0.0.1
    ポート番号: 2222
    暗号鍵: %USERPROFILE%.vagrant.d\insecure_private_key.ppt

  4. ログイン画面でユーザ名にcoreを入力してログイン
    通常、vagrantで設定した仮想マシーンにログインする時のユーザ名はdefaultでvagrantになっていますが、 ここでは、coreとなってますので注意。

Dcokerをproxy環境で利用する

この設定を行ったのがproxyがある環境であったため、最初正常にdockerを動作させることができませんでした。 proxy環境でdockerを利用するために以下の手順を実施しました。手順1は必要ないかもしれません。

1. vagrantのproxy用のプラグインの導入
以下のコマンドで、インストール

vagrant plugin install vagrant-proxyconf 

次に、coreos-vagrant/Vagrantfileに以下の設定を追加

Vagrant.configure("2") do |config|
  config.proxy.http     =  "http://proxy.foo.bar:8080"  //任意のproxyホスト+ポート番号
  config.proxy.https    = "http://proxy.foo.bar:8080"  //任意のproxyホスト+ポート番号
  config.proxy.no_proxy = "localhost,127.0.0.1" //任意のアドレス

2. dockerの設定ファイルにproxy設定の追加
まず、docekr.serviceファイルを/etc/systemd/system以下にコピーします

cp /usr/lib/systemd/system/docker.service /etc/systemd/system/

次に、コピーしたdocekr.serviceファイル中のExecStart コマンドの上に以下の記述を追加します。

Environment="HTTP_PROXY=http://proxy.example.com:8080"

最後に、以下で変更内容を反映させます。

systemctl daemon-reload
systemctl restart docker

これらの設定に関しては、以下のサイトを参考にしました。 Customizing docker

Dockerの動作確認

以下のコマンドで、dockerのバージョン確認と、dockerでimage検索(ubuntuを検索)ができるか確認します。正常に動けばOK。

docker -v
docker search ubuntu

今回は、coreOS上でdockerが動作する環境の構築までを行いました。
LinuxMac、proxyがない環境だともっと簡単に環境構築できたのかなと思います。 次は、Dockerの内容に関する記事も書きたいと思います。

Android+mockitoの利用時の設定

Androidユニットテストを作成するにあたり、モックのライブラリがないかと探して、mockitoというライブラリが良さそうなので今回導入を行ってみました。Androidで利用する場合に、別のライブラリや設定が必要であったため、その時にハマった点について共有します。 以下の記事を元にしています。

Mockito + Dexmaker on Android - Stack Overflow

mockitoとは?

mockitoとは、Java用のテスト作成時にモックやスタブを作成するためのライブラリです。mockや、spyといったメソッドを利用することで、モックやスタブの生成が可能です。 残念ながら、テスト作成時のprivate メソッドの呼び出しには対応していないため、private メソッドを利用した場合はpowerMockというライブラリを新たに導入すると良いそうです。 powerMockの導入については別の機会に対応したいと思います。

mockitoの導入と設定

Androidでmockitoを利用する場合、mockitoとdexmakerというライブラリを導入する必要があります。 導入手順は以下の通りです。

  1. Downloads - mockito - simpler & better mocking - Google Project Hosting より、最新(現在、1.9.5)のmockitoのjarファイルをダウンロードし、Androidのlibsディレクトリにコピー
  2. Downloads - dexmaker - Programmatic code generation for Android. - Google Project Hostingより、dexmaker-mockito-1.0.jar、dexmaker-1.0.jarをダウンロードし、Androidのlibsディレクトリにコピー
    ここで、mockitoを利用すると 以下のようなエラーで発生する場合があります。
java.lang.IllegalArgumentException: dexcache == null (and no default could be found; consider setting the 'dexmaker.dexcache' system property)
at com.google.dexmaker.DexMaker.generateAndLoad(DexMaker.java:359)
at com.google.dexmaker.stock.ProxyBuilder.buildProxyClass(ProxyBuilder.java:252)
at com.google.dexmaker.mockito.DexmakerMockMaker.createMock(DexmakerMockMaker.java:54)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:26)

このエラーを解消するために、以下のような対応を行います。
3. 以下のCustomInstrumentationTestRunnerファイルを作成

public class CustomInstrumentationTestRunner extends InstrumentationTestRunner {

    @Override public void onCreate (final Bundle arguments) {
        super.onCreate(arguments);

        System.setProperty("dexmaker.dexcache", getTargetContext().getCacheDir().toString());
    }
}

CustomInstrumentationTestRunnerは、InstrumentationTestRunnerを継承したクラスです。
システムに、dexmakerキャッシュのディレクトリパスの設定を行います。
4. テストプロジェクトのManifestファイルのInstrumentationにCustomInstrumentationTestRunnerを設定

<instrumentation
    android:name="my.package.CustomInstrumentationTestRunner"
    android:targetPackage="my.target.package" />

テストプロジェクトのデフォルトのInstrumentationの設定をCustomInstrumentationTestRunnerへ変更します。
5. eclipseのconfigureの設定 eclipseのrunning configurationから、Instrumentationとして作成したCustomInstrumentationTestRunnerを利用するよう設定を行います。

以上で設定は完了です。 mockitoを利用したテストの書き方については、以下のサイトが参考になると思います。

Mockito 初めの一歩 - Qiita

Mockitoの真価はspyにあり - R42日記

RemoteControlClientの使い方(RemoteControllerとの連携)

前回の記事で、API 19から登場したRemoteControllerの使い方について説明をしました。 今回は、RemoteControlClientのどのような動作がRemoteControllerに関連しているか、studyしましたので、そのメモを残します。

RemoteControlClientの生成

まず、以下の用にRemoteControlClientのインスタンスの生成を行います。 このとき、AudioMangerのrequestAudioFocusを利用して、Focusを取得しないとRemoteControlClienは正常に動作しません。

AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
ComponentName component = 
    new ComponentName(this, RemoteControlEventReceiver.class);
am.requestAudioFocus(new OnAudioFocusChangeListener() {
    @Override
    public void onAudioFocusChange(int foucusChange) {
        Log.d(TAG, "onAudioFocusChange");
    }
}, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);

am.registerMediaButtonEventReceiver(component);

Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
mediaButtonIntent.setComponent(component);
PendingIntent mediaPendingIntent = 
    PendingIntent.getBroadcast(getApplicationContext(), 0, mediaButtonIntent, 0);

mRemoteControlClient = new RemoteControlClient(mediaPendingIntent);
am.registerRemoteControlClient(mRemoteControlClient);

RemoteControlClientの生成とRemoteControllerの関係に関してですが、requetAudioFocusでfocusがあたっとときに、 RemoteContoller.OnClientUpdateListener#onClientChange が呼び出されているようです。

RemoteControlClientがどの制御をサポートするかの設定

RemoteControlClientがサポートするPlayerの制御の設定をflagにより行います。 このサポート状況を見て、RemoteControllerはどのようにRemoteControlClientを制御すればよいかを判断することができるのだと思います。

設定は以下のように行います。設定するflagは任意です。

mRemoteControlClient.setTransportControlFlags(
    RemoteControlClient.FLAG_KEY_MEDIA_PLAY |
    RemoteControlClient.FLAG_KEY_MEDIA_PAUSE | 
    RemoteControlClient.FLAG_KEY_MEDIA_STOP |
    RemoteControlClient.FLAG_KEY_MEDIA_POSITION_UPDATE);

RemoteControlClientのsetTransportControlFlagsの呼び出た場合に、RemoteContoller.OnClientUpdateListener#onClientTransportControlUpdate が呼び出されます。

RemoteControlClientでのメタデータのupdate

RemoteControlClientでのメタデータのupdateは、以下のように editMetadataでRemoteControlClient.MetadataEditorを生成し、編集したいメタデータ項目をputStringなどで指定することで行います。

mRemoteControlClient.editMetadata(true)
    .putString(MediaMetadataRetriever.METADATA_KEY_ARTIST, "a")
    .putString(MediaMetadataRetriever.METADATA_KEY_ALBUM, "b")
    .putString(MediaMetadataRetriever.METADATA_KEY_TITLE, "c")
    .putLong(MediaMetadataRetriever.METADATA_KEY_DURATION, getDuration())
    .apply();

RemoteControlClientのeditMetadataでメタデータを更新した場合に、 RemoteContoller.OnClientUpdateListener#onClientMetadataUpdate が呼び出されます。

RemoteControlClientでの再生状態の設定

RemoteControlClientで、再生状態の設定は以下のように行います。設定には、再生状態だけを設定するもの、再生位置と再生速度も設定するものの2つが存在します。

// 再生状態のみ
mRemoteControlClient.setPlaybackState(playbackState);

// 再生状態 + 再生位置、再生速度
mRemoteControlClient.setPlaybackState(playbackState, timeInMs, playbackSpeed);

playbackStateにはRemoteControlClient.PLAYSTATE_PLAYINGなどを指定します。 RemoteContolClientのそれぞれのsetPlaybackStateが呼ばれた時に、それぞれに対応した RemoteContoller.OnClientUpdateListener#onClientPlaybackStateUpdate が呼び出されます。

RemoteControllerの使い方

AndroidKitkat(API level19)で新たに追加されたRemoteControllerというAPIについて少しStudyする機会があったので、そのメモを残します。 日本語だけでなく海外の記事も少なかったのであまり使われていないのだと思います。 今回のメモは以下の記事を元にしています。サンプルコードもgithub上で公開されているので参考になると思います。

[GUIDE] Implement RemoteController in your app - XDA Forum

RemoteControllerとは?

RemoteControllerとは、RemoteControlClientを実装したプレーヤーアプリケーションの再生、ディスプレイ、プレーヤーで再生するコンテンツのメタデータ、再生状態などを制御、更新するための仕組みです。

RemoteControllerをAudioManger#registerRemoteControllerにより、システムに登録することで、現在再生中のRemoteControlClientを実装したプレーヤーアプリ制御することができます。 RemoteControlClientはそもそもロック状態の時に、システムからプレーヤーの再生制御ができるための仕組みだったみたいですが、RemoteControllerの登場により、RemoteControllerからより多くの制御ができるよう、API level19で拡張されたみたいです。

RemoteControllerの実装方法

1. RemoteControllerを利用するめの設定

RemoteControllerを利用して、RemoteControlClientを実装したMedia Playerの制御を行うために、NotificationListenerServiceを継承したServiceを実装します。 NotificationListenerServiceにより、システムのイベントの通知を受け取るためには、 以下のように、android.permission.BIND_NOTIFICATION_LISTENER_SERVICEのpermissionを指定する必要があります。

<service
android:name="<service-package>.<service-name>"
android:label="@string/service_name"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" >
    <intent-filter>
       <action android:name="android.service.notification.NotificationListenerService" />
    </intent-filter>
</service>

RemoteControllerの利用するために、必ずしもNotificationListenerServiceを継承したServiceを実装する必要はないのですが、 android.permission.BIND_NOTIFICATION_LISTENER_SERVICEのpermissionは、利用するために必ず指定する必要があるようです。
また、このpermissionを有効にするためには、Androidの設定->セキュリティ->通知へのアクセス->該当アプリケーションにチェックをつける 、ということを手動で行う必要があります。最初、これに気づかずにRemoteControllerが利用できなくて困ってしまいました。 android.permission.BIND_NOTIFICATION_LISTENER_SERVICEを設定したアプリをインストールすると、該当アプリケーションの中にアプリ名が追加されます。

2. RemoteController#OnClientUpdateListener の実装

RemoteControllerのコンストラクタの引数にRemoteController#OnClientUpdateListenerが含まれています。これを実装することで、RemoteControlClientの状態変化などの通知を受け取り、それに応じてRemoteControllerの処理を行うことができます。 RemoteController#OnClientUpdateListenerのメソッドには以下のものがあります。

  • onClientChange(boolean clearing)
    • このListenerの別のメソッドを介して、過去に取得した情報が有効でなくなったり、更新される場合に通知される。
      (RemoteControlClient実装時に、requestAudioFocusでAudioFocusを取得する場合に呼ばれている気がします)
  • onClientMetadataUpdate(RemoteController.MetadataEditor metadataEditor)
    • 新しいメタデータが有効になった場合に呼ばれる
      (RemoteControlClinetのeditMetadataにより、メタデータの更新を行ったときに通知を受けているようです。)
  • onClientPlaybackStateUpdate(int state, long stateChangeTimeMs, long currentPosMs, float speed)
    • playback 状態が変更、playback位置やスピードを知らせる場合に呼ばれる
      (RemoteControlClinetのsetPlaybackState(int state, long timeInMs, float playbackSpeed)が呼ばれた時に呼ばれている気がします)
  • onClientPlaybackStateUpdate(int state)
    • playback状態が変更されたときに呼ばれる
      (RemoteControlClientのsetPlaybackState(int state)が呼ばれた時に通知を受けているようです。)
  • onClientTransportControlUpdate(int transportControlFlags)
    • クライアントがサポートするトランスポートフラグ(RemoteContolでどの制御が可能かを指定するフラグ)が変更れた場合に呼ばれる
      (RemoteControlClientのsetTransportControlFlags呼び出し時に、通知を受けているようです。)

3. RemoteControllerの作成と登録

  • RemoteControllerインスタンスを作成
    • 引数に、Contextと手順2で説明をした、OnClinetUpdateListnerを実装したものを指定します。
  • RemoteContollerの登録
    • AudioManagerのregisterRemoteControllerにより、作成したRemotecontrollerインスタンスを指定することで登録

その他

  • RemoteContoller#setSynchronizationModeを呼び出すとexceptionが発生する
    • 上記で挙げた、Remotecontrollerをstudyする元の文献のサンプルコード内にも記述されていますが、setSynchronizationModeがうまく呼び出せません。バグなのか、うまく呼び出すための設定が必要なのか、今のところはわかりません。

LINE Developer Conference 「テーマ:プラットフォーム」の参加メモ

LINE Developer Conference の2日目「テーマ: プラットフォーム」に参加してきました. そのときにとったメモを残して起きます. メモしきれなかった部分については, 以下で公開されていた内容も参考にさせていただきました.

LINE Developer Conference(Day 2 - プラットフォーム) - Qiita

聞いた内容に加えて, 参加後に, 知らなかった内容について一部情報を補足している部分もあります.

感想としては, 以下にもメモしましたが, LINE Buiness Connectという仕組みが今後どのように展開していくかが楽しみです. LINE Business Connectの目的として挙げられているように, 外部と連携したサービスのPlatformっていろんなところが今までに挑戦してきた思うのですけど, いまいちこれは成功していると思わないので, そのあたりをこのLINE Business Connectがどのように打ち破っていくのか気になります.

開催概要

  • 日時: 2014年4月17日(木) 17:00〜19:00
  • 場所: LINE株式会社 渋谷ヒカリエ 27F カフェスペース
  • 参加者に関して
    • 人数: 約150人 + 周りにLINEの開発者のみなさま
    • 傾向: 20代, 30代男性が多い(エンジニアの方限定とされていたため?)

講演の流れ

  1. LINEのサービス概要について
  2. LINE GAMEのPlatformについて
  3. LINEの Platformについて
  4. Fire Side Chat(パネルディスカッション)

今回は1〜3についてメモを残します.

LINEのサービス概要について

LINEの現在

  • 今年4月にユーザ登録数4億人突破
    • 100億メッセージ/day
    • グローバルに展開
      • 13ヶ国語のサポート
      • LINEのBranch: 日本, 韓国, タイ, スペイン, 台湾, USA + 9カ国の連絡事務所
        • 格好のマーケットの動きをキャッチして伝達して迅速に対応する
    • LINEの開発拠点: 日本(東京)と韓国がメイン + 大連, 北京, 福岡
    • LINE遠征隊: 全世界を回って世界の状況を観察
      • 世界の半分以上?を観察対象(世界地図の約半分くらいは対象国だった)
      • グローバルにサービスを展開し且つ高い品質を保つ

LINEのユーザ登録数の推移は以下を参照

【LINE】LINE、登録ユーザー数が世界4億人を突破

LINEの競争相手

  • Facebook
  • Whats App
    • 欧米で人気のメッセージ交換サービス
  • WeChat
    • 中国で人気の無料通話サービス

サービスカテゴリー

メモしたサービスカテゴリーを図で表します.

f:id:dogear11:20140428000518p:plain

各国のニーズにあったサービスの展開

  • 台湾の例
    • LINE whosecall
      • 知らない番号からの電話やSMSの発信者情報をすぐ識別し、特定の番号からの着信拒否
  • 日本の例
    • 漫画, 占い, モールなど..
    • 新しく「Creators Market」が登場
      • 一般のクリエーターがLINEのスタンプを作成して, 販売できるサービス

LINE GAMEのPlatformについて

LINE GAME について

  • 2012年11月サービス開始(約1年半)
  • 人気の上位アプリ
    • LINE POP : 19カ国でトップ10入り, 4000万DL
    • LINE Cookie Run : 1000万DL(1ヶ月で), 日本以外が70%
    • LINE Disney ツムツム : 400万DL(2週間で)
  • ゲーム全体で3億DL
  • ゲームタイトル数は約50
  • LINEGAMEのDeveloperはグローバルに展開

LINE GAME Platformについて

  • ミッション
    • 3rd party, 内製のゲームがLINEGAMEとして簡単につなげる
    • 安定的且つ安心してユーザに届ける
    • 開発者にとって開発しやすい環境の提供
  • 3rdパーティ向けSDKとサーバのAPIの提供
    • SDKの種類
      • Logging(クラッシュログ etc), Notice(メンテナンス, お知らせ通知etc), Present, Ranking(ランキング支援), Extra, Security, auth/login, IAP/IAB, KPT, Webview, push
    • サポートプラットフォーム
  • バックエンドの改善
    • Before
      • GAME毎に専用サーバがあり, その下にPlatformが大きくある
      • 管理しやすいが, あるGAMEに急激に負荷がかかった場合, 他のGAME全体に影響してしまう
    • After
      • GAME毎に専用サーバがあり, その下に専用のPlatformがある
      • GAMEごとに必要な機能をPlatformに入れるよう対応

LINE GAME Monitoringについて

  • Server System
    • CPU, Memory, Disk, Load average, Network, Process
  • Application
    • Log, Health check, Crash Log
      • ログレベル別, サービス別, ホスト別で単位時間あたりの件数を検索することができる
  • CS abusing
    • 利用者からのお問い合わせ
    • 不正行為のモニタリング
      • スコア改竄, アプリ内データの改竄を検知
      • いち早く不正行為を検知してリアルタイムに通知する
        ⇨ 大きな問題になる前に障害を防ぐ

ESPERについて

ESPERについては以下を参照
Esper - Complex Event Processing

  • イベントストリームの結合, 統計的な解析とフィルタリング, グルーピングをリアルタイムに処理

    • INPUT: 端末やSDKから送られてくるイベント
    • OUTPUT: EPLと呼ばれる言語でフィルタリングされた結果
  • RTA: Real Time-Access

    • 単位時間あたりのゲームへのアクセス数

      • お昼の時間, 夜寝る前にあがったりする様子がみえる
      • イベントなどがあがると上がる
      • データに不整合があるとすぐにその不整合を検知でき対応できる
    • 5min RTA monitoring test case (ESPERを使った簡単なモニタリング例)

      1. クライアントの端末から[アプリケーションID,OS,ユーザの暗号化されたハッシュの値,リージョン]をイベントして送る
      2. Web ServerからESPERに送る
      3. ESPERのエンジンでタイムバッチで5minおきにgroup by した結果をリスナーで検知してMy SQLに output
        ※最初はWeb Serverで後ろのHadoopで分散処理しようとしたが間に合わなかった
      4. 集計結果をさらに設定した条件でリアルタイムに分析することで, 条件に一致したwarningを検知する

今後取り組みたいこと

  • LINEからGAMEの人気が出るのではなく, GAMEからLINEの人気がでる逆パターンを目指す

LINE Platform(LINE本体について)

現状

  • ゲームのタイトル数が50以上
  • LINE漫画, LINE モール, などゲーム以外のアプリも増えている
  • GAME Platform特有の機能ではなく, もっと汎用的な機能をLINEと統合して使いたいという要望
    ⇨ 「Channel Gateway」と呼ばれる GAMEもファミリーアプリもすべてを網羅した汎用のプラットフォームがGAME Platformの下に存在(LINE Platformじゃないのか?という発表者自身のツッコミ)
    • Why Channel Gateway?
      • GAMEやファミリーアプリなどLINEとなんらかの連携をして機能する別のアプリやサービスを総称してChannelと呼んでいる
      • LINEとChannelの間を橋渡ししてくれる出入り口がChannel Gateway

Channel Gatewayについて

  • Channel Gatewayの構成
    • Authentication
      • LINE StoreのLoginや, アプリのユーザ認証に利用
      • oAuth2をベース(ほとんど準拠)
    • API
      • Profile
        • 認証を要求したユーザのID, 顔写真, ニックネームなどを取得
      • Friend list
        • ソーシャル機能といして, 友達のリストと友達のプロフィールを取得
      • Send Message
        • 別のユーザに対してメッセージを送る
      • Post Timeline
        • タイムライン機能にPostする(ハイスコア取りましたよ!とか)
  • Channel GatewayAPIの仕組み
    • RESTful API
    • SDK
      • iOS, Android向けに提供
      • High-Level API を提供(RESTful APIを直接た叩く必要がない)
      • Objective-C, Javaのメソッド呼び出しで簡単に呼び出し可能
      • httpsも気にしなくてすむ
  • 規模
    • 1億6000万request: 1日のfriendly APIのアクセス数

LINEアプリのPlatformに対する違和感(何か物足りない)

  • LINEアプリの本質って?

    • メッセージのやりとり
      ⇨ プラットフォームとして, メッセージを扱うことではじめてLINEらしさが出るのでは!?
  • LINE Business Connectの登場

    • ユーザはアプリからメッセージをスタンプで送ることで各種サービスを利用できる
      • ピザスタンプを押せば実際にピザが届く
      • レンタルビデオの返却メッセージが前日に届く
      • タクシースタンプを押す事でタクシーの手配
        ⇨ それぞれの会社が独自のサービスで実現することもできるが, LINEでひとまとめにできることが手軽で魅力的

LINE Business Connectを利用した実例

  • 放送番組でLINE経由で意見を募集
    • いっぷく! (継続中)
    • 東京LIVE24 (終了)

LINE Business Connectの技術的側面

  • 仕組み
    • LINEが土管となってメッセージをやりとり

f:id:dogear11:20140428223225p:plain

  • ピザの例

f:id:dogear11:20140428223500p:plain

LINE Developersサイトを準備中(一般公開はまだ)

  • GAMEを作ったり, アプリを作ったり, LINE Business Connectで何か作ったりすることを目的
    • 技術情報
      • SDK, ドキュメント
    • Channelの登録
      • 共通鍵の発行

LINEの裏側の仕組み (LINEのクライアントとサーバの技術的な仕組み)

  • SPDYを拡張したものを利用
    • クライアントはLINEアプリのみという前提のもと, クライアント不明の場合の手順を省いてやり取りを削減
    • 通信の遅い国に対しては, 通信を速くする仕組みを導入して最適化
  • LEGY(LINE Event Gateway)
    • クライアントとのセッションを管理しているプログラム
      • LEGY Server Push
      • LEGY Encryption
  • LINEのStorage, DB
    • Redis cluster(redis, redis) + MySQL + HBase HA + storm + Mongo DB という仕組み
      • Redis (キャッシュ機能に利用): 30TB
      • Hbase(サービスのメインストレージ): 1PB
      • Hadoop(Log analyze, statistics): 7PB(42%利用)

Fire Side Chat

こちらの内容に関しては省略します.