SlideShare a Scribd company logo
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からテンプレート専
用のファイルを作る」という手間を一つ省くことが出来たのだが、
これはまた別の機会があれば…

More Related Content

What's hot

Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Masahito Zembutsu
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
Koichi Tanaka
 
忙しい人の5分で分かるMesos入門 - Mesos って何だ?
忙しい人の5分で分かるMesos入門 - Mesos って何だ?忙しい人の5分で分かるMesos入門 - Mesos って何だ?
忙しい人の5分で分かるMesos入門 - Mesos って何だ?
Masahito Zembutsu
 
C言語なWebSocketの遊び方。
C言語なWebSocketの遊び方。C言語なWebSocketの遊び方。
C言語なWebSocketの遊び方。
Masahiko Hashimoto
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
Amazon Web Services Japan
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
増田 亨
 
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
Yoshiki Hayama
 
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
NTT DATA Technology & Innovation
 
HBaseとRedisを使った100億超/日メッセージを処理するLINEのストレージ
HBaseとRedisを使った100億超/日メッセージを処理するLINEのストレージHBaseとRedisを使った100億超/日メッセージを処理するLINEのストレージ
HBaseとRedisを使った100億超/日メッセージを処理するLINEのストレージLINE Corporation
 
ゲームアプリの数学@GREE GameDevelopers' Meetup
ゲームアプリの数学@GREE GameDevelopers' Meetupゲームアプリの数学@GREE GameDevelopers' Meetup
ゲームアプリの数学@GREE GameDevelopers' Meetup
gree_tech
 
ZabbixのAPIを使って運用を楽しくする話
ZabbixのAPIを使って運用を楽しくする話ZabbixのAPIを使って運用を楽しくする話
ZabbixのAPIを使って運用を楽しくする話
Masahito Zembutsu
 
Prometheus入門から運用まで徹底解説
Prometheus入門から運用まで徹底解説Prometheus入門から運用まで徹底解説
Prometheus入門から運用まで徹底解説
貴仁 大和屋
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
Akihiko Horiuchi
 
20160526 依存関係逆転の原則
20160526 依存関係逆転の原則20160526 依存関係逆転の原則
20160526 依存関係逆転の原則
bonjin6770 Kurosawa
 
MQTTとAMQPと.NET
MQTTとAMQPと.NETMQTTとAMQPと.NET
MQTTとAMQPと.NET
terurou
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
Yoshitaka Kawashima
 
インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方
Shohei Koyama
 
ビジネスルールの複雑さに立ち向かう
ビジネスルールの複雑さに立ち向かうビジネスルールの複雑さに立ち向かう
ビジネスルールの複雑さに立ち向かう
増田 亨
 

What's hot (20)

Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
忙しい人の5分で分かるMesos入門 - Mesos って何だ?
忙しい人の5分で分かるMesos入門 - Mesos って何だ?忙しい人の5分で分かるMesos入門 - Mesos って何だ?
忙しい人の5分で分かるMesos入門 - Mesos って何だ?
 
C言語なWebSocketの遊び方。
C言語なWebSocketの遊び方。C言語なWebSocketの遊び方。
C言語なWebSocketの遊び方。
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
 
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
 
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
 
HBaseとRedisを使った100億超/日メッセージを処理するLINEのストレージ
HBaseとRedisを使った100億超/日メッセージを処理するLINEのストレージHBaseとRedisを使った100億超/日メッセージを処理するLINEのストレージ
HBaseとRedisを使った100億超/日メッセージを処理するLINEのストレージ
 
ゲームアプリの数学@GREE GameDevelopers' Meetup
ゲームアプリの数学@GREE GameDevelopers' Meetupゲームアプリの数学@GREE GameDevelopers' Meetup
ゲームアプリの数学@GREE GameDevelopers' Meetup
 
ZabbixのAPIを使って運用を楽しくする話
ZabbixのAPIを使って運用を楽しくする話ZabbixのAPIを使って運用を楽しくする話
ZabbixのAPIを使って運用を楽しくする話
 
Prometheus入門から運用まで徹底解説
Prometheus入門から運用まで徹底解説Prometheus入門から運用まで徹底解説
Prometheus入門から運用まで徹底解説
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
 
20160526 依存関係逆転の原則
20160526 依存関係逆転の原則20160526 依存関係逆転の原則
20160526 依存関係逆転の原則
 
MQTTとAMQPと.NET
MQTTとAMQPと.NETMQTTとAMQPと.NET
MQTTとAMQPと.NET
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 
インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方
 
ビジネスルールの複雑さに立ち向かう
ビジネスルールの複雑さに立ち向かうビジネスルールの複雑さに立ち向かう
ビジネスルールの複雑さに立ち向かう
 

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

Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
Toru Yamaguchi
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) Akihiro Kuwano
 
Ibm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコードIbm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコードK Kimura
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
Akira Shimosako
 
Clrh 110716 wcfwf
Clrh 110716 wcfwfClrh 110716 wcfwf
Clrh 110716 wcfwf
Tomoyuki Obi
 
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 API
Akira 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 Design
Ryuji 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 API
Ken 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 to PHPからJavaへ乗り換えた。そんな昔話をしよう (20)

Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
 
Ibm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコードIbm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコード
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
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発表資料
 

More from 優介 黒河

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を手に入れたぞ
優介 黒河
 

More from 優介 黒河 (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を手に入れたぞ
 

Recently uploaded

LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
chiefujita1
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
Toru Tamaki
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
Toru Tamaki
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
0207sukipio
 
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
Takayuki Nakayama
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
Matsushita Laboratory
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
t m
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
harmonylab
 

Recently uploaded (9)

LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
 
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
 

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