SlideShare una empresa de Scribd logo
1 de 61
Descargar para leer sin conexión
PHPからJavaへ乗り換えた。
そんな昔話をしよう
黒河 優介
今回の講演について
• 2012年ごろに開発していたモバイルタイトルでの話になります。
• プロトタイプまでは PHP 5系で作成し、本制作をJava(Tomcat 6)で
行ったため、PHPでは最後まで作成しきれていません。
• そのタイトルでは初期のプロトタイプ時からサービスクローズ
まで関わっていました。
モバイルのゲーム通信ざっくりおさらい
クライアント APIサーバー DBサーバー
サーバーへ通信するアプリケーションが
動いている
モバイルのゲーム通信ざっくりおさらい
クライアント APIサーバー DBサーバー
クライアントから受け取ったデータを
処理して返す部分
PHP / Tomcat / node.js 等
モバイルのゲーム通信ざっくりおさらい
クライアント APIサーバー DBサーバー
ゲームの設定に関するマスターデータの格納及び、
各プレイヤーのセーブデータの格納先
MySQL / DB2 / MongoDB等
モバイルゲームでの通信処理の流れ1
クライアント APIサーバー DBサーバー
1. 「ログインする」「ガチャを引いた」「ダンジョンに入る」「ダンジョンクリア」等の
アクション時にサーバーに送信。
アクションに紐づくデータをHTTP経由で送信
モバイルゲームでの通信処理の流れ2
クライアント APIサーバー DBサーバー
2. APIサーバーがクライアントから受け取ったアクション・データを元に処理。
APIサーバーがDBサーバー上のデータを読み書きして処理を行う。
モバイルゲームでの通信処理の流れ3
クライアント APIサーバー DBサーバー
3.最後に処理した結果を APIサーバーから
クライアントへ返す
今回の話
クライアント APIサーバー DBサーバー
今回の講演は、
ここを PHP実装→Java実装へ乗り換えた話
もう少し俯瞰視点での話
プレイヤー
APIサーバー
運営者
※変更したのはAPIサーバーのみでお知らせ等のWebViewや
管理画面(運営向けのWebページ)はPHPのまま実装。
(赤枠がPHP->Javaで、青枠はPHPのままの部分)
HTML表示する類は PHPが楽だった
WEBサーバー DBサーバー
運営向けサーバー
なんでJavaに変えたの?
• ボス(偉いプログラマ)からの提案でした
• プロトタイプ開発中にゲーム仕様も膨らみ、予定より規模が大きく
なったので PHPだと厳しそうだった
• PHPよりはJavaのプログラマーの方が多い部署だった
• ログイン機能と、ゲームプレイに入るときのデータ取得通信位までし
か作っていなかったので、そこまで未練はなかった
• Java自体は フィーチャーフォン時代とAndroid周りのクライアント
コード書いてたので、何とかなるだろうという算段があった
というか、何でPHPを選択したの?
• 何となくです
• PHPでWebサービスのアップデート/メンテナンスの経験があった
• 勉強会等の資料等を見ていても当時はPHPが多かったように見えた
で、結局Javaに変えてよかったと思う?
• 変えて本当に良かった。
• このタイトルだけでなく、次のプロジェクトでもJavaを採用した
• 後日PHP実装のAPIサーバーを少し見る事になりますが…。
やっぱりあの時Javaにしてよかったと思った
Javaに変えてよかった点
• 「コンパイル時に怒られる」って素晴らしい!
• 静的解析によるコード品質の担保
• 「キャッシュサーバー」なしで運用出来た
Javaに変えて面倒だった点
• DBへのアクセスで、オブジェクト変数への適応は自前で行う
必要があった
→ Reflectionを使って回避
• リソースリークが発生しうる
→ ちゃんと組めば問題ない.
「コンパイル時に怒られる」って
素晴らしい
コンパイルについて
• PHP
インタプリンタ形式なので、コンパイルせずにサーバーにソース
ファイル(.php)を置くだけで実行可能な状況になる
• Java
コンパイル形式なので、コンパイルした結果(.class/.war)をサーバーに
置くことで実行可能になる
コンパイルについて
• PHP
→ サーバーにエラーとなるプログラムがアップされてしまい、
サーバーが全く動かない状態が起こりえる。
開発中でも他スタッフの手が止まってしまうのでヨロシクない
• Java
→ 少なくともコンパイルが通ったプログラムなので、最低限の
保証はされている(実行時エラーが起きないとは言っていない)
変数・型宣言
• PHP
型付け、変数宣言なしでも いきなり変数が使える
• Java
変数を型とセットで宣言しないとソモソモ使えない
変数・型宣言
• PHP
→ 変数名のスペルミス等で実行時に未初期化変数等のエラー等が
定期的に発生する。
int型のつもりが気付くとstring型になっててトラブル
• Java
→ 変数名をスペルしたら、コンパイル通らないし、別の型で宣言された
変数には別の型の値は入れられない
PHPでありがちなエラー(極端にした例)
for( $counter = 0 ; $counter < 10; $count++ ){
// 何かを処理する…
} 変数名が間違っているので、ループ条件である
「$counter」がインクリメントされず別変数が
インクリメントされてしまう。
その結果、無限ループしてしまう。
問題なのは、実行して この処理を通るまではエラーがわからない事
やっぱり
「コンパイル時にエラーが見つかる」って
素晴らしい
静的解析によるコード品質の担保
静的解析ツールの利用
• Javaには、コードの静的解析ツール「CheckStyle」と
「FindBugs」がある
• Jenkinsでの自動ビルドに、これらのツールを組み込み活用し
た
CheckStyleについて
• ソース本体(.javaファイル)に対して行う静的解析ツール
• 主な目的は、コーディング規約が守られているかチェックする
ツール
• 特定のパスだけは例外等の細かい指定をxmlで出来る
• 実際のプロジェクトでもいくつか部分的にチェック対象から外すよう
にしていた
CheckStyleで出来ること
• 変数やクラス名の命名規則チェック
• 変数やメソッドは小文字スタートになっているか?等
• 行数の多いメソッドチェック
• コメントをちゃんと書いているかチェック
FindBugsについて
• コンパイル結果(.classファイル)に対して行う静的解析ツール
• 主な目的は、バグになりそうな箇所のチェック
• null ポインタアクセスのチェック等が出来る
PHPの頃は、こういった静的解析ツールを使用し
てなかった…
Jenkinsで構築したフロー(PHP環境)
開発用の
APIサーバー
ソースコードの
自動取得バージョン管理
(svn/git等)
Jenkinsマシンの処理
コミット
何のチェックもないので、サーバーにあげて実行
してからエラーが発覚することがちょくちょく
あった。
クライアントサイドから怒られる事もちょくちょ
くあった…
プログラムを開発用
のサーバーにアップ
開発者
しかし、Javaでは違う!!!
Jenkinsで構築したフロー(Java環境)
開発用の
APIサーバー
CheckStyleによる
コードチェック
実際のビルド
(Javaファイルのコンパイル)
FindBugsによる
チェック
ソースコードの
自動取得バージョン管理
(svn/git等)
Jenkinsマシンの処理
コミット
Jenkins内の全ての
チェックを通ると
サーバーにプログラ
ムをアップロード
プログラム更新開発者
Jenkinsで構築したフロー(Java環境)
CheckStyleによる
コードチェック
実際のビルド
(Javaファイルのコンパイル)
FindBugsによる
チェック
ソースコードの
自動取得バージョン管理
(svn/git等)
Jenkinsマシンの処理
プログラム更新
どこかに引っかかるとJenkinsから
お叱りメールが飛んでくる。
開発サーバーのプログラム更新は
行われない。
※CheckStyle/FindBugsはエラー0運用はさすがに厳
しかったので多少のエラー数10位は許容していた。
エラーが少し増えたタイミングで警告メールだけ出す
ようにしていた
開発者
エラーが起きると
メールが来る
Jenkinsで構築したフロー(Java環境)
開発用の
APIサーバー
開発者が直接「開発サーバー」に
プログラムをアップロードするのは
全面的に禁止!
開発者
静的解析ツールを自動ビルドのシステムに組
み込む事で、コードの質をある程度保つこと
が出来た
また「Jenkinsからの警告」という体にしたことで、コード修正をメンバーに依頼しやすかった。
「キャッシュサーバー」なしで運用できた
キャッシュサーバー???
APIサーバー DBサーバー
DBサーバーは、検索等が高機能なため、データを
ただ読むだけの用途では遅くなりがち
キャッシュサーバー???
APIサーバー DBサーバー
キャッシュサーバー
(memcached等)
DBサーバーから得た結果を
キャッシュサーバーに入れて、
そちらから優先的に読むようにする
何故キャッシュサーバーなしで出来た?
• PHPでは、プロセスベース
• 1アクセス毎にプログラム自体がリセットされてしまうので、次のアク
セスがあった時も再びデータを取り直すところからスタート
• 対して、Java(tomcat)はスレッドベース
• 1アクセス毎にスレッドを割り当てて実行するので、アクセス毎にデー
タはリセットされない
• 次回以降のアクセスのためのデータを何らかの形で保持してあげれば
再びデータを取り直す必要がない
PHPでは…
クライアント APIサーバー DBサーバー
ユーザーからのアクセス毎にPHP実行のためのプロセスを立てているので、
DBサーバーから取得してきたデータは消えてしまう。
Java(tomcat)では…
クライアント APIサーバー DBサーバー
ユーザーからのアクセスにプログラム中のスレッドを割り当てるだけなので、
staticな変数(グローバル変数)に置いた変数は消えずに残せる。
DBから取得したデータをstatic変数に入れることで、次回以降使いまわせる
Java(tomcat)はスレッドベースなので
自身のプログラム自体にキャッシュすることが出来た
どういうデータにどう使った?
• static変数にキャッシュしたのはマスターデータ
• DBのテーブル(種類)毎にそれぞれキャッシュの有効時間があり、一定
時間を過ぎると強制的に取り直していた
• データ更新があった場合は、キャッシュをクリアするために開発者し
か叩けないキャッシュクリア専用のAPIを用意した
• ユーザーのデータは、アクセス毎にDBへアクセスしていた
※マスターデータとは、ゲームのカード設定等のデータ。
運営以外が書き換えることはない
その他にスレッドベースでのテクニック
• static変数に アクセスしたユーザーIDの履歴を100件程用意し
て、フレンド以外のパートナーユーザー紹介に使った
• 外部サーバーにチュートリアル突破率等を渡す必要があったが、
別スレッドを立てて裏で外部サーバーへの通信を行う事でレス
ポンスの向上を測った
この結果、
「キャッシュサーバー」なしで運用も問題なく出来た
良いところは聞き飽きたんで、
悪いところを…
DBへのアクセスで、オブジェクト変数へ
の適応は自前で行う必要があった
DBの取得周りについて
• PHPでは連想配列にデータを格納出来たので、あまり面倒な事
はせず丸ごとデータをとってこれた
• Javaでは一つ一つのカラム(項目)に対してデータを取得して回
る必要があった
PHPでのDBの取得周りについて
id name lv
1 セイバー 10
2 アーチャー 9
3 ランサー 8
DBテーブル 「servant」$dbObj = GetFromDB(“SELECT * FROM servant”);
$data = array();
for( $i = 0 ; $i < $dbObj->count ; ++$i ){
$data[i] = $dbObj->GetRow($i);
}
// データへのアクセスは下記のようになる
// $data[0] で一件目のデータにヒット
// $data[0][‘id’] <= ここには1
// $data[0][‘name’] <= ここには”セイバー”
// $data[0][‘lv’] <= ここには10
// $data[1] で2件目のデータにヒット
// $data[1][‘id’] <= ここには2
// $data[1][‘name’] <= ここには”アーチャー”
// …
DB上に上記のようなテーブルがあったと
仮定して、それを処理するPHPプログラム
は左のような仮コードになる
JavaでのDBの取得周りについて
id name lv
1 セイバー 10
2 アーチャー 9
3 ランサー 8
DBテーブル 「servant」
dbObj = GetFromDB(“SELECT * FROM servant”);
Servant[] data = new Servant[dbObj.GetCount()];
for( int i = 0; i < dbObj.GetCount(); ++i ){
data[i] = new Servant();
data[i].id = dbObj.GetInt( i , “id” );
data[i].name = dbObj.GetString( i , “name” );
data[i].lv = dbObj.GetInt( i , “lv” );
}
// 各カラムごとに個別に取ってくる必要があり面倒
DB上に上記のようなテーブルがあったと
仮定して、それを処理するJavaプログラム
は左のような仮コードになる
// どこかでクラス定義している
class Servant{
public int id;
public string name;
public int lv;
}
JavaでのDBの取得周りについて
id name lv
1 セイバー 10
2 アーチャー 9
3 ランサー 8
DBテーブル 「servant」
dbObj = GetFromDB(“SELECT * FROM servant”);
Servant[] data = new Servant[dbObj.GetCount()];
for( int i = 0; i < dbObj.GetCount(); ++i ){
data[i] = new Servant();
data[i].id = dbObj.GetInt( i , “id” );
data[i].name = dbObj.GetString( i , “name” );
data[i].lv = dbObj.GetInt( i , “lv” );
}
// 各カラムごとに個別に取ってくる必要があり面倒
カラムが増えれば増えるほど、ここを書く
量が増えてきて面倒だし、ミスも増える
// どこかでクラス定義している
class Servant{
public int id;
public string name;
public int lv;
}
カラムが増えれば増えるほど
書くのが大変になるのでツライ・・・
が、これをReflectionを使って回避した
Reflectionについて
• JavaのReflectionを使うと、string型で変数名を経由してオブ
ジェクトの値をいじることが出来るようになる
• これを使えば、DBのカラム名からオブジェクトに直接代入が出来る
Reflectionについて
id name lv
1 セイバー 10
2 アーチャー 9
3 ランサー 8
DBテーブル 「servant」
// DBからデータを引くとき、各public変数の名前に勝手に代入させる
class Servant{
public int id;
public string name;
public int lv;
} DB名と変数名で紐づけして、
勝手に値が入るようにする
JavaでのDBの取得周りについて
id name lv
1 セイバー 10
2 アーチャー 9
3 ランサー 8
DBテーブル 「servant」
dbObj = GetFromDB(“SELECT * FROM servant”);
Servant[] data = dbObj.GetCount();
for( int i = 0 ; i < dbObj.GetCount();++i){
data[i] = new Servant();
dbObj.Read<Servant>( i , data[i] );
}
// どこかでクラス定義している
class Servant{
public int id;
public string name;
public int lv;
}
これで、DBアクセスするときに面倒だった
問題も解消!
同様にクライアントから送られてきたJsonを読み込むときにも
利用して、オブジェクトを一発で取得することに成功
まとめ
• PHPからJavaに乗り換え時に、静的解析ツールを導入したので
コードの品質を保った状態で開発できた
• Java(tomcat)環境下では、スレッドベースだったのを利用して
static変数(global領域)にデータをキャッシュする事が出来た
• PHPでは連想配列という便利な奴がいたので、DBへのデータ
アクセスが楽だったが、JavaではReflectionを使って楽にした
おまけ…2タイトル目の話
プレイヤー
APIサーバー
運営者
次のタイトルではWebView部分からも、PHPを抹消した。
WebViewからもJavascriptでAPIを叩いて、テンプレート適用を
Javascript側ですることによって、Jsonを返すだけのAPIサーバーと
化したため
WEBサーバー DBサーバー
運営向けサーバー
変更前の流れ
Webサーバー
Webサーバー内で、プレイヤーに合わせた
HTMLを生成(プレイヤー名埋め込み等)を
して、そのHTMLを表示している
変更後流れ
Webサーバー
Webサーバー
まずは、ただのHTMLを表示
その後に、そのページ内に仕込んだ
JavascriptでWebサーバーへJsonデータを
問合せ、受け取ったJsonデータで自身の
HTMLを書き換える
また一つ、Java化してしまった…
このJavascriptで取得する仕組みによって、サーバーサイドプログ
ラマーから 「Webデザイナーから来たHTMLからテンプレート専
用のファイルを作る」という手間を一つ省くことが出来たのだが、
これはまた別の機会があれば…

Más contenido relacionado

La actualidad más candente

【Unite Tokyo 2018】なんとっ!ユナイト!ミリシタをささえる『AKANE大作戦』とは?
【Unite Tokyo 2018】なんとっ!ユナイト!ミリシタをささえる『AKANE大作戦』とは?【Unite Tokyo 2018】なんとっ!ユナイト!ミリシタをささえる『AKANE大作戦』とは?
【Unite Tokyo 2018】なんとっ!ユナイト!ミリシタをささえる『AKANE大作戦』とは?UnityTechnologiesJapan002
 
Using Azure Compute with VMSS, Kubernetes, and Service Fabric
Using Azure Compute with VMSS, Kubernetes, and Service FabricUsing Azure Compute with VMSS, Kubernetes, and Service Fabric
Using Azure Compute with VMSS, Kubernetes, and Service FabricTakeshi Fukuhara
 
ワタシハ Azure Functions チョットデキル
ワタシハ Azure Functions チョットデキルワタシハ Azure Functions チョットデキル
ワタシハ Azure Functions チョットデキルTsuyoshi Ushio
 
NDC 2015 삼시세끼 빌드만들기
NDC 2015 삼시세끼 빌드만들기NDC 2015 삼시세끼 빌드만들기
NDC 2015 삼시세끼 빌드만들기Hyunsuk Ahn
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知るShuhei Fujita
 
Jsug spring bootコードリーディング 接触篇 a contact
Jsug spring bootコードリーディング 接触篇 a contactJsug spring bootコードリーディング 接触篇 a contact
Jsug spring bootコードリーディング 接触篇 a contacttsukasa tamaru
 
Allocators@C++11
Allocators@C++11Allocators@C++11
Allocators@C++11Cryolite
 
ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会
ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会
ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会Takayuki Shimizukawa
 
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design PatternAWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design PatternAmazon Web Services Japan
 
[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성NAVER D2
 
AWS IoTを使った双方向通信システムの実装と注意点
AWS IoTを使った双方向通信システムの実装と注意点AWS IoTを使った双方向通信システムの実装と注意点
AWS IoTを使った双方向通信システムの実装と注意点Kohei MATSUSHITA
 
Ansible troubleshooting 101_202007
Ansible troubleshooting 101_202007Ansible troubleshooting 101_202007
Ansible troubleshooting 101_202007Hideki Saito
 
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Esun Kim
 
ゲーム開発とデザインパターン
ゲーム開発とデザインパターンゲーム開発とデザインパターン
ゲーム開発とデザインパターンTakashi Komada
 
PDOでデータベース接続と SQLインジェクション対策
PDOでデータベース接続と SQLインジェクション対策PDOでデータベース接続と SQLインジェクション対策
PDOでデータベース接続と SQLインジェクション対策iPride Co., Ltd.
 
Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Etsuji Nakai
 
キャパシティ プランニング
キャパシティ プランニングキャパシティ プランニング
キャパシティ プランニング外道 父
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているKoichi Tanaka
 
長期運用タイトルの GCP 移行実例とグレンジのこれから | Google Cloud INSIDE Games & Apps
長期運用タイトルの GCP 移行実例とグレンジのこれから | Google Cloud INSIDE Games & Apps 長期運用タイトルの GCP 移行実例とグレンジのこれから | Google Cloud INSIDE Games & Apps
長期運用タイトルの GCP 移行実例とグレンジのこれから | Google Cloud INSIDE Games & Apps Google Cloud Platform - Japan
 
ドメイン駆動設計 実践ガイド
ドメイン駆動設計 実践ガイドドメイン駆動設計 実践ガイド
ドメイン駆動設計 実践ガイド増田 亨
 

La actualidad más candente (20)

【Unite Tokyo 2018】なんとっ!ユナイト!ミリシタをささえる『AKANE大作戦』とは?
【Unite Tokyo 2018】なんとっ!ユナイト!ミリシタをささえる『AKANE大作戦』とは?【Unite Tokyo 2018】なんとっ!ユナイト!ミリシタをささえる『AKANE大作戦』とは?
【Unite Tokyo 2018】なんとっ!ユナイト!ミリシタをささえる『AKANE大作戦』とは?
 
Using Azure Compute with VMSS, Kubernetes, and Service Fabric
Using Azure Compute with VMSS, Kubernetes, and Service FabricUsing Azure Compute with VMSS, Kubernetes, and Service Fabric
Using Azure Compute with VMSS, Kubernetes, and Service Fabric
 
ワタシハ Azure Functions チョットデキル
ワタシハ Azure Functions チョットデキルワタシハ Azure Functions チョットデキル
ワタシハ Azure Functions チョットデキル
 
NDC 2015 삼시세끼 빌드만들기
NDC 2015 삼시세끼 빌드만들기NDC 2015 삼시세끼 빌드만들기
NDC 2015 삼시세끼 빌드만들기
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
 
Jsug spring bootコードリーディング 接触篇 a contact
Jsug spring bootコードリーディング 接触篇 a contactJsug spring bootコードリーディング 接触篇 a contact
Jsug spring bootコードリーディング 接触篇 a contact
 
Allocators@C++11
Allocators@C++11Allocators@C++11
Allocators@C++11
 
ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会
ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会
ドキュメンテーションを加速するストレスフリーの作図ツール『blockdiag』 jus2011年6月勉強会
 
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design PatternAWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
 
[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성
 
AWS IoTを使った双方向通信システムの実装と注意点
AWS IoTを使った双方向通信システムの実装と注意点AWS IoTを使った双方向通信システムの実装と注意点
AWS IoTを使った双方向通信システムの実装と注意点
 
Ansible troubleshooting 101_202007
Ansible troubleshooting 101_202007Ansible troubleshooting 101_202007
Ansible troubleshooting 101_202007
 
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
 
ゲーム開発とデザインパターン
ゲーム開発とデザインパターンゲーム開発とデザインパターン
ゲーム開発とデザインパターン
 
PDOでデータベース接続と SQLインジェクション対策
PDOでデータベース接続と SQLインジェクション対策PDOでデータベース接続と SQLインジェクション対策
PDOでデータベース接続と SQLインジェクション対策
 
Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造
 
キャパシティ プランニング
キャパシティ プランニングキャパシティ プランニング
キャパシティ プランニング
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
長期運用タイトルの GCP 移行実例とグレンジのこれから | Google Cloud INSIDE Games & Apps
長期運用タイトルの GCP 移行実例とグレンジのこれから | Google Cloud INSIDE Games & Apps 長期運用タイトルの GCP 移行実例とグレンジのこれから | Google Cloud INSIDE Games & Apps
長期運用タイトルの GCP 移行実例とグレンジのこれから | Google Cloud INSIDE Games & Apps
 
ドメイン駆動設計 実践ガイド
ドメイン駆動設計 実践ガイドドメイン駆動設計 実践ガイド
ドメイン駆動設計 実践ガイド
 

Similar a PHPからJavaへ乗り換えた。そんな昔話をしよう

Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platformToru Yamaguchi
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) Akihiro Kuwano
 
Ibm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコードIbm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコードK Kimura
 
My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1Makoto Haruyama
 
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...Naoya Ito
 
LEGO MINDSTORMS EV3 API
LEGO MINDSTORMS EV3 APILEGO MINDSTORMS EV3 API
LEGO MINDSTORMS EV3 APIAkira Hatsune
 
メッセージングプラットフォーム Zimbra の紹介とその活用術 - JJUG ナイトセミナー2013/3
メッセージングプラットフォーム Zimbra の紹介とその活用術 - JJUG ナイトセミナー2013/3メッセージングプラットフォーム Zimbra の紹介とその活用術 - JJUG ナイトセミナー2013/3
メッセージングプラットフォーム Zimbra の紹介とその活用術 - JJUG ナイトセミナー2013/3日本Javaユーザーグループ
 
Java による Web アプリケーションのプロトタイプのために最近使っている構成
Java による Web アプリケーションのプロトタイプのために最近使っている構成Java による Web アプリケーションのプロトタイプのために最近使っている構成
Java による Web アプリケーションのプロトタイプのために最近使っている構成Yu Nobuoka
 
IBM Cloudant の細かすぎて伝わりにくい機能(その2) データの変更履歴が自動管理できるらしい
IBM Cloudant の細かすぎて伝わりにくい機能(その2) データの変更履歴が自動管理できるらしいIBM Cloudant の細かすぎて伝わりにくい機能(その2) データの変更履歴が自動管理できるらしい
IBM Cloudant の細かすぎて伝わりにくい機能(その2) データの変更履歴が自動管理できるらしいK Kimura
 
TiDBのトランザクション
TiDBのトランザクションTiDBのトランザクション
TiDBのトランザクションAkio Mitobe
 
とあるCocos2dx入門編
とあるCocos2dx入門編とあるCocos2dx入門編
とあるCocos2dx入門編kumin1030
 
Google App Engineとその影響(補足)
Google App Engineとその影響(補足)Google App Engineとその影響(補足)
Google App Engineとその影響(補足)なおき きしだ
 
Smart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless DesignSmart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless DesignRyuji TAKEHARA
 
Web Worker +α - HTML5/JavaScript and Service Worker API
Web Worker +α - HTML5/JavaScript and Service Worker APIWeb Worker +α - HTML5/JavaScript and Service Worker API
Web Worker +α - HTML5/JavaScript and Service Worker APIKen William
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejsTakayoshi Tanaka
 
Cloudstack user group meeting in osaka
Cloudstack user group meeting in osakaCloudstack user group meeting in osaka
Cloudstack user group meeting in osakaNaotaka Jay HOTTA
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回Naoyuki Yamada
 
第8回KPF発表資料
第8回KPF発表資料第8回KPF発表資料
第8回KPF発表資料cryks
 

Similar a PHPからJavaへ乗り換えた。そんな昔話をしよう (20)

Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
 
Ibm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコードIbm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコード
 
Clrh 110716 wcfwf
Clrh 110716 wcfwfClrh 110716 wcfwf
Clrh 110716 wcfwf
 
My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1
 
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
 
LEGO MINDSTORMS EV3 API
LEGO MINDSTORMS EV3 APILEGO MINDSTORMS EV3 API
LEGO MINDSTORMS EV3 API
 
メッセージングプラットフォーム Zimbra の紹介とその活用術 - JJUG ナイトセミナー2013/3
メッセージングプラットフォーム Zimbra の紹介とその活用術 - JJUG ナイトセミナー2013/3メッセージングプラットフォーム Zimbra の紹介とその活用術 - JJUG ナイトセミナー2013/3
メッセージングプラットフォーム Zimbra の紹介とその活用術 - JJUG ナイトセミナー2013/3
 
Java による Web アプリケーションのプロトタイプのために最近使っている構成
Java による Web アプリケーションのプロトタイプのために最近使っている構成Java による Web アプリケーションのプロトタイプのために最近使っている構成
Java による Web アプリケーションのプロトタイプのために最近使っている構成
 
IBM Cloudant の細かすぎて伝わりにくい機能(その2) データの変更履歴が自動管理できるらしい
IBM Cloudant の細かすぎて伝わりにくい機能(その2) データの変更履歴が自動管理できるらしいIBM Cloudant の細かすぎて伝わりにくい機能(その2) データの変更履歴が自動管理できるらしい
IBM Cloudant の細かすぎて伝わりにくい機能(その2) データの変更履歴が自動管理できるらしい
 
TiDBのトランザクション
TiDBのトランザクションTiDBのトランザクション
TiDBのトランザクション
 
とあるCocos2dx入門編
とあるCocos2dx入門編とあるCocos2dx入門編
とあるCocos2dx入門編
 
Google App Engineとその影響(補足)
Google App Engineとその影響(補足)Google App Engineとその影響(補足)
Google App Engineとその影響(補足)
 
Smart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless DesignSmart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless Design
 
Web Worker +α - HTML5/JavaScript and Service Worker API
Web Worker +α - HTML5/JavaScript and Service Worker APIWeb Worker +α - HTML5/JavaScript and Service Worker API
Web Worker +α - HTML5/JavaScript and Service Worker API
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
Cloudstack user group meeting in osaka
Cloudstack user group meeting in osakaCloudstack user group meeting in osaka
Cloudstack user group meeting in osaka
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
 
第8回KPF発表資料
第8回KPF発表資料第8回KPF発表資料
第8回KPF発表資料
 
勉強会資料①
勉強会資料①勉強会資料①
勉強会資料①
 

Más de 優介 黒河

Looking glasslt4 kurokawa
Looking glasslt4 kurokawaLooking glasslt4 kurokawa
Looking glasslt4 kurokawa優介 黒河
 
Looking glass + videoplayer
Looking glass + videoplayerLooking glass + videoplayer
Looking glass + videoplayer優介 黒河
 
Looking glassrenderinglt en
Looking glassrenderinglt enLooking glassrenderinglt en
Looking glassrenderinglt en優介 黒河
 
LookingGlass RenderingOptimizePlan(JP)
LookingGlass RenderingOptimizePlan(JP)LookingGlass RenderingOptimizePlan(JP)
LookingGlass RenderingOptimizePlan(JP)優介 黒河
 
Moverio+unityで始めるarグラスアプリ開発
Moverio+unityで始めるarグラスアプリ開発Moverio+unityで始めるarグラスアプリ開発
Moverio+unityで始めるarグラスアプリ開発優介 黒河
 
実行時ライトベイクをShaderでやってみた
実行時ライトベイクをShaderでやってみた実行時ライトベイクをShaderでやってみた
実行時ライトベイクをShaderでやってみた優介 黒河
 
Unityで炎上から身を守る方法
Unityで炎上から身を守る方法Unityで炎上から身を守る方法
Unityで炎上から身を守る方法優介 黒河
 
一般的なチートの手法と対策について
一般的なチートの手法と対策について一般的なチートの手法と対策について
一般的なチートの手法と対策について優介 黒河
 
ウェアラブル勉強会 東京#2
ウェアラブル勉強会 東京#2ウェアラブル勉強会 東京#2
ウェアラブル勉強会 東京#2優介 黒河
 
未来ガジェットMoverioを手に入れたぞ
未来ガジェットMoverioを手に入れたぞ未来ガジェットMoverioを手に入れたぞ
未来ガジェットMoverioを手に入れたぞ優介 黒河
 

Más de 優介 黒河 (10)

Looking glasslt4 kurokawa
Looking glasslt4 kurokawaLooking glasslt4 kurokawa
Looking glasslt4 kurokawa
 
Looking glass + videoplayer
Looking glass + videoplayerLooking glass + videoplayer
Looking glass + videoplayer
 
Looking glassrenderinglt en
Looking glassrenderinglt enLooking glassrenderinglt en
Looking glassrenderinglt en
 
LookingGlass RenderingOptimizePlan(JP)
LookingGlass RenderingOptimizePlan(JP)LookingGlass RenderingOptimizePlan(JP)
LookingGlass RenderingOptimizePlan(JP)
 
Moverio+unityで始めるarグラスアプリ開発
Moverio+unityで始めるarグラスアプリ開発Moverio+unityで始めるarグラスアプリ開発
Moverio+unityで始めるarグラスアプリ開発
 
実行時ライトベイクをShaderでやってみた
実行時ライトベイクをShaderでやってみた実行時ライトベイクをShaderでやってみた
実行時ライトベイクをShaderでやってみた
 
Unityで炎上から身を守る方法
Unityで炎上から身を守る方法Unityで炎上から身を守る方法
Unityで炎上から身を守る方法
 
一般的なチートの手法と対策について
一般的なチートの手法と対策について一般的なチートの手法と対策について
一般的なチートの手法と対策について
 
ウェアラブル勉強会 東京#2
ウェアラブル勉強会 東京#2ウェアラブル勉強会 東京#2
ウェアラブル勉強会 東京#2
 
未来ガジェットMoverioを手に入れたぞ
未来ガジェットMoverioを手に入れたぞ未来ガジェットMoverioを手に入れたぞ
未来ガジェットMoverioを手に入れたぞ
 

Último

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 

Último (10)

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 

PHPからJavaへ乗り換えた。そんな昔話をしよう