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
構築手順
- vs2013対応のtesseract関連ファイルの取得
- Cドライブ直下にTesseract-Buildディレクトを作成し、移動
- ファイルの取得
git clone https://github.com/tesseract4java/tesseract-vs2013
関連ファイルのbuild
- VS2013のコメンドラインを開く
- C:¥Tesseract-Build¥tesseract-vs2013へ移動
msbuild build.proj
を実行- ※ 私の場合は、ここで定義したtypedefが利用できないというエラーが発生
- 発生したファイルをutf-8で保存 or エラー箇所のテキストのインデントなどを修正したらエラーが直りました
- C:¥Tesseract-Build¥tesseract-vs2013¥releaseにincludeとlibディレクトリとファイルができていることを確認
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
- C:¥Tesseract-Build¥tesseract-ocr¥vs2013¥bin¥Win32に各構成のlib、dllがあることを確認
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にコピー
VS2013へのinclude、libの設定
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用のものを選択。
Vagrantのインストール
下記サイトより、ダウンロードページに移動し、各OS用の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を利用しました。手順は以下の通りです。
- putty.exeファイルとputtygen.exeファイルをダウンロード PuTTY Download Page
puttygen.exeファイルで%USERPROFILE%.vagrant.d\insecure_private_key をpptファイルに変換
この手順をやらないまま、puttyでsshの暗号鍵にinsecure_private_keyを指定するとうまくログインできませんでした。
この手順については以下のサイトを参考にしました。
SSH to Vagrant box in Windows? - Stack Overflow Putty Unable to Use Vagrant’s Private Key | A Little of BothputtyでcoreOSにログイン 以下の通りの設定を行い、ログインします。
ホスト: 127.0.0.1
ポート番号: 2222
暗号鍵: %USERPROFILE%.vagrant.d\insecure_private_key.ppt- ログイン画面でユーザ名に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が動作する環境の構築までを行いました。
LinuxやMac、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というライブラリを導入する必要があります。 導入手順は以下の通りです。
- Downloads - mockito - simpler & better mocking - Google Project Hosting より、最新(現在、1.9.5)のmockitoのjarファイルをダウンロードし、Androidのlibsディレクトリにコピー
- 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を利用したテストの書き方については、以下のサイトが参考になると思います。
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の使い方
AndroidのKitkat(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を取得する場合に呼ばれている気がします)
- このListenerの別のメソッドを介して、過去に取得した情報が有効でなくなったり、更新される場合に通知される。
- onClientMetadataUpdate(RemoteController.MetadataEditor metadataEditor)
- onClientPlaybackStateUpdate(int state, long stateChangeTimeMs, long currentPosMs, float speed)
- playback 状態が変更、playback位置やスピードを知らせる場合に呼ばれる
(RemoteControlClinetのsetPlaybackState(int state, long timeInMs, float playbackSpeed)が呼ばれた時に呼ばれている気がします)
- playback 状態が変更、playback位置やスピードを知らせる場合に呼ばれる
- onClientPlaybackStateUpdate(int state)
- playback状態が変更されたときに呼ばれる
(RemoteControlClientのsetPlaybackState(int state)が呼ばれた時に通知を受けているようです。)
- playback状態が変更されたときに呼ばれる
- onClientTransportControlUpdate(int transportControlFlags)
- クライアントがサポートするトランスポートフラグ(RemoteContolでどの制御が可能かを指定するフラグ)が変更れた場合に呼ばれる
(RemoteControlClientのsetTransportControlFlags呼び出し時に、通知を受けているようです。)
- クライアントがサポートするトランスポートフラグ(RemoteContolでどの制御が可能かを指定するフラグ)が変更れた場合に呼ばれる
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代男性が多い(エンジニアの方限定とされていたため?)
講演の流れ
- LINEのサービス概要について
- LINE GAMEのPlatformについて
- LINEの Platformについて
- Fire Side Chat(パネルディスカッション)
今回は1〜3についてメモを残します.
LINEのサービス概要について
LINEの現在
- 今年4月にユーザ登録数4億人突破
- 100億メッセージ/day
- グローバルに展開
- 13ヶ国語のサポート
- LINEのBranch: 日本, 韓国, タイ, スペイン, 台湾, USA + 9カ国の連絡事務所
- 格好のマーケットの動きをキャッチして伝達して迅速に対応する
- LINEの開発拠点: 日本(東京)と韓国がメイン + 大連, 北京, 福岡
- LINE遠征隊: 全世界を回って世界の状況を観察
- 世界の半分以上?を観察対象(世界地図の約半分くらいは対象国だった)
- グローバルにサービスを展開し且つ高い品質を保つ
LINEのユーザ登録数の推移は以下を参照
LINEの競争相手
- Whats App
- 欧米で人気のメッセージ交換サービス
- WeChat
- 中国で人気の無料通話サービス
サービスカテゴリー
メモしたサービスカテゴリーを図で表します.
各国のニーズにあったサービスの展開
- 台湾の例
- LINE whosecall
- 知らない番号からの電話やSMSの発信者情報をすぐ識別し、特定の番号からの着信拒否
- LINE whosecall
- 日本の例
- 漫画, 占い, モールなど..
- 新しく「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はグローバルに展開
- 日本, 韓国, 中国, ロシア, フィンランド, etc
LINE GAME Platformについて
- ミッション
- 3rd party, 内製のゲームがLINEGAMEとして簡単につなげる
- 安定的且つ安心してユーザに届ける
- 開発者にとって開発しやすい環境の提供
- 3rdパーティ向けSDKとサーバのAPIの提供
- バックエンドの改善
- Before
- GAME毎に専用サーバがあり, その下にPlatformが大きくある
- 管理しやすいが, あるGAMEに急激に負荷がかかった場合, 他のGAME全体に影響してしまう
- After
- GAME毎に専用サーバがあり, その下に専用のPlatformがある
- GAMEごとに必要な機能をPlatformに入れるよう対応
- Before
LINE GAME Monitoringについて
- Server System
- CPU, Memory, Disk, Load average, Network, Process
- Application
- Log, Health check, Crash Log
- ログレベル別, サービス別, ホスト別で単位時間あたりの件数を検索することができる
- Log, Health check, Crash Log
- CS abusing
- 利用者からのお問い合わせ
- 不正行為のモニタリング
- スコア改竄, アプリ内データの改竄を検知
- いち早く不正行為を検知してリアルタイムに通知する
⇨ 大きな問題になる前に障害を防ぐ
ESPERについて
ESPERについては以下を参照
Esper - Complex Event Processing
イベントストリームの結合, 統計的な解析とフィルタリング, グルーピングをリアルタイムに処理
- INPUT: 端末やSDKから送られてくるイベント
- OUTPUT: EPLと呼ばれる言語でフィルタリングされた結果
-
単位時間あたりのゲームへのアクセス数
- お昼の時間, 夜寝る前にあがったりする様子がみえる
- イベントなどがあがると上がる
- データに不整合があるとすぐにその不整合を検知でき対応できる
5min RTA monitoring test case (ESPERを使った簡単なモニタリング例)
今後取り組みたいこと
- LINEからGAMEの人気が出るのではなく, GAMEからLINEの人気がでる逆パターンを目指す
LINE Platform(LINE本体について)
現状
- ゲームのタイトル数が50以上
- LINE漫画, LINE モール, などゲーム以外のアプリも増えている
- GAME Platform特有の機能ではなく, もっと汎用的な機能をLINEと統合して使いたいという要望
⇨ 「Channel Gateway」と呼ばれる GAMEもファミリーアプリもすべてを網羅した汎用のプラットフォームがGAME Platformの下に存在(LINE Platformじゃないのか?という発表者自身のツッコミ)
Channel Gatewayについて
- Channel Gatewayの構成
- Authentication
- LINE StoreのLoginや, アプリのユーザ認証に利用
- oAuth2をベース(ほとんど準拠)
- API
- Profile
- 認証を要求したユーザのID, 顔写真, ニックネームなどを取得
- Friend list
- ソーシャル機能といして, 友達のリストと友達のプロフィールを取得
- Send Message
- 別のユーザに対してメッセージを送る
- Post Timeline
- タイムライン機能にPostする(ハイスコア取りましたよ!とか)
- Profile
- Authentication
- Channel GatewayのAPIの仕組み
- 規模
- 1億6000万request: 1日のfriendly APIのアクセス数
LINEアプリのPlatformに対する違和感(何か物足りない)
LINEアプリの本質って?
- メッセージのやりとり
⇨ プラットフォームとして, メッセージを扱うことではじめてLINEらしさが出るのでは!?
- メッセージのやりとり
LINE Business Connectの登場
- ユーザはアプリからメッセージをスタンプで送ることで各種サービスを利用できる
- ピザスタンプを押せば実際にピザが届く
- レンタルビデオの返却メッセージが前日に届く
- タクシースタンプを押す事でタクシーの手配
⇨ それぞれの会社が独自のサービスで実現することもできるが, LINEでひとまとめにできることが手軽で魅力的
- ユーザはアプリからメッセージをスタンプで送ることで各種サービスを利用できる
LINE Business Connectを利用した実例
- 放送番組でLINE経由で意見を募集
- いっぷく! (継続中)
- 東京LIVE24 (終了)
LINE Business Connectの技術的側面
- 仕組み
- LINEが土管となってメッセージをやりとり
- ピザの例
LINE Developersサイトを準備中(一般公開はまだ)
- GAMEを作ったり, アプリを作ったり, LINE Business Connectで何か作ったりすることを目的
- 技術情報
- SDK, ドキュメント
- Channelの登録
- 共通鍵の発行
- 技術情報
LINEの裏側の仕組み (LINEのクライアントとサーバの技術的な仕組み)
- SPDYを拡張したものを利用
- クライアントはLINEアプリのみという前提のもと, クライアント不明の場合の手順を省いてやり取りを削減
- 通信の遅い国に対しては, 通信を速くする仕組みを導入して最適化
- LEGY(LINE Event Gateway)
- クライアントとのセッションを管理しているプログラム
- LEGY Server Push
- LEGY Encryption
- クライアントとのセッションを管理しているプログラム
- LINEのStorage, DB
Fire Side Chat
こちらの内容に関しては省略します.