SlideShare a Scribd company logo
1 of 60
Download to read offline
バリデーション駆動開発(仮称)で
プロジェクトメンバー全員を幸せにした話
Laravel/オレオレ両対応
アジェンダ
話すこと
開発フェーズに特有の「厄介ななバグ」
「バリデーション」の適用範囲を考える
php/Laravel での実装例
テスト駆動開発との併用
話さないこと
Laravel のValidation
自己紹介
@KentarouTakeda
サーバサイド
php / node.js / TypeScript
Laravel / express / AWS Lambda
PostgreSQL / MySQL
インフラ
RHEL / CentOS / AmazonLinux / Chef / Ansible
フロントエンド
TypeScript
Angular / jQuery / Hexo
心がけていること
担当業務の範囲にとらわれず、
幅広い視野で全体の効率アップを図りたい。
API / ネットワーク/ インターフェース
人/ 部署/ 会社
「厄介なバグ」とは?
影響範囲が広い
再現が取れない
利用者への影響が大きい
事例「ソシャゲのガチャ機能」
開発は「サーバ」「アプリ」「デザイナー」の3名
抽選はサーバ側の「ガチャAPI」が行う
ガチャAPIの返却に応じてアプリ上で入手演出
素材は随時追加・デザイナー単独でcommit
バグ報告
「回す」ボタンを押した瞬間にクラッシュ。
演出まで進まない=画面には何の情報も無い
頻度は100回に1回程度。
外部スタッフからの報告
クラッシュログ入手困難
最初に誰に相談するか?
考えられる原因
特定条件で「サーバ」が規格外のレスポンス
特定条件で「アプリ」が未定義プロパティを参照
特定の「素材」が破損している?
最初に誰に相談するか?
些細なバグの裏で、こんなことが起きている?
「誰に相談すれば良いんだろう?」
「自分ではありません!」
「相談したら怒られた…」
「例のバグ、進捗どうですか?」
「全員に相談、するしかないな…」
「また人のバグで時間取られるのか…」
「厄介なバグ」例えばこういう指針
困るのは誰か?
自分<自分以外の誰か
遭遇するのは誰か?
自分<自分以外の誰か
原因箇所を特定できるのは誰か?
自分以外の誰でも<自分のみ
「厄介なバグ」をどう対処するか?
人海戦術で原因探し!
出さないように気をつける!
あらかじめ可能性を潰しておく。
今回はどこに問題があったのか?
今回はどこに問題があったのか?
特定条件で「サーバ」が規格外のレスポンス
というバグが存在したこと。
今回はどこに問題があったのか?
特定条件で「サーバ」が規格外のレスポンス
というバグが存在したこと。
というバグの可能性が存在したこと。
可能性を潰す
IT用語辞典バイナリ
バリデーション
https://www.sophia-it.com/content/バリデーション
入力されたデータが、あるいはプログラミング言
語やマークアップ言語の記述が、規定された文法
に即して、または要求された仕様にそって、適切
に記述されているかどうかを検証することであ
る。
“
“
バリデーションが必要な値とは?
外部から入力された値
信頼できない値
信頼できない値
自分の書くプログラムに
100%の信頼を持てますか?
JSON Schema
https://json-schema.org/
JSONへの型定義
JSONが特定の型を満たしているか検証
JSON Schema is a vocabulary that allows you to
annotate and validate JSON documents.
“
“
ガチャAPI
gatcha: # ガチャAPIは
type: "object" # オブジェクトを返却する
properties:
cardIds: # cardIds プロパティは
type: "array" # 配列型を取り
items:
type: "integer" # それぞれの値は整数
minimum: 1000 # 最小値は1000
maximum: 2999 # 最大値は2999
minItems: 1 # 配列の要素数は最小で1個
minItems: 3 # 最大で3個(1~3個のカードが出てくるガチャ)
bonusId: # bonusId というプロパティは
type: "integer" # 整数を取り
minimum: 3000 # 3000以上
maximum: 4999 # 4999以下
required: # 必須プロパティは
- "cardIds" # cardIds のみ(ボーナスは無い時もある)
additionalProperties: false # 上記で定義された以外のプロパティは存在
PHP での実装
$ composer require justinrainbow/json-schema
$validator = new Validator();
$validator->validate($response, $schema, $options);
if(true !== $validator->isValid()) {
throw new Exception("サーバ側のバグ!");
}
echo json_encode($response);
status=200 であれば必ず安全
安全でない場合必ず必ずstatus=500
可能性を一つ潰した
事例「Webアプリのマイページ」
Laravel案件、2名体制。
サーバエンジニア
ルーティングやコントローラーを担当
Webデザイナー
Bladeテンプレートへhtmlをコーディング
バグ報告
プロフィールに「氏名」を登録した状態でマイページ
にアクセスすると以下のエラーが表示されます。
ErrorException (E_ERROR)
Undefined variable: firstName
(View: /var/www/resources/views/mypage/index.blade.php)
考えられる原因
テンプレート側のtypo
正しくは$ rst_name だった
コントローラー側のバグ
$ rstName の初期化漏れ
今回はどこに問題があったのか?
今回はどこに問題があったのか?
コントローラー側のバグ
$ rstName の初期化漏れ
というバグが存在したこと。
今回はどこに問題があったのか?
コントローラー側のバグ
$ rstName の初期化漏れ
というバグが存在したこと。
というバグの可能性が存在したこと。
※コーダーはプログラマーの想像以上にエラー画面に
ビビってます。
ビューに渡す値を検証
class MypageController extends Controller {
public function index(Request $request) {
/* ビューに渡す値を準備する */
/* ここでバリデーション? */
return view('mypage.index', $data);
}
}
何の保証にもならない。
(仕組み化して一括で防ぎたい)
コントローラーではオブジェクトを返
却するのみ
class MypageController extends Controller {
public function index(Request $request) {
/* ビューに渡す値を準備する */
return $data;
}
}
ビュー適用
class ApplyViewMiddleware {
public function handle($request, Closure $next) {
$response = $next($request);
/* 実際は abort() や RedirectResponse の際の処理が必要 */
$name = Route::currentRouteName(); // ビュー名 = ルート名
$response = new Response(view($name, $content));
return $response;
}
}
バリデーション
class ValidationMiddleware {
public function handle($request, Closure $next) {
$response = $next($request);
$name = Route::currentRouteName(); // バリデーション名 = ルート
$isValid = $this->valication($response,$this->getSchema($nam
if($isValid) {
abort(500, "コントローラー側のバグ!")
} else {
return $response;
}
}
ミドルウェア適用
afterミドルウェアなので定義は逆順。
namespace AppHttp;
use IlluminateFoundationHttpKernel as HttpKernel;
class Kernel extends HttpKernel {
protected $middlewareGroups = [
'web' => [
/**/
AppHttpMiddlewareApplyView::class, // ビュー適用が先
AppHttpMiddlewareValidation::class, // バリデーションが後
],
]
}
バリデーションとテスト
テスト駆動開発(TDD)
[DO03] 50 分でわかるテスト駆動開発
https://www.slideshare.net/decode2017/do03-50/9
TDDのサイクル
1. 次の目標を考える
2. その目標を示すテストを書く
3. そのテストを実行して失敗させる(Red)
4. 目的のコードを書く
5. 2.で書いたテストを成功させる(Green)
6. テストが通るままでリファクタリングを行う
(Refactor)
7. 1~6を繰り返す
TDDと黄金の回転
Red, Grren, Refactor
https://www.slideshare.net/decode2017/do03-
50/10
出力の検証=テスト
バリデーション駆動開発
1. 次の目標を考える
2. その目標を示すテストバリデーションを書く
3. そのテストバリデーションを実行して失敗させる
4. 目的のコードを書く
5. 2.で書いたテストバリデーションを成功させる
6. テストが通るままでリファクタリングを行う
7. 1~6を繰り返す
「ガチャAPI」
目標「ガチャAPIが存在する」
// ApiTest.php
class ApiTest extends TestCase {
/** @test */
public function gatcha() {
$this->post('/api/gatcha', [])->assertStatus(200);
}
}
テストをパスする最小限のコード
# api.schema.yml
gatcha:
// ApiController.php
class ApiController {
public function gatcha() {
}
}
次の目標「返却はcardIdsというプロ
パティを持つ」
gatcha:
+ type: "object"
+ properties:
+ cardIds:
class ApiController {
public function gatcha() {
+ return [
+ 'cardIds' => null,
+ ];
}
}
次の目標「cardIdsは配列」
gatcha:
type: "object"
properties:
cardIds:
+ type: "array"
class ApiController {
public function gatcha() {
return [
- 'cardIds' => null,
+ 'cardIds' => [],
];
}
}
次の目標「cardIdsの各要素(略)」
gatcha:
type: "object"
properties:
cardIds:
type: "array"
+ items:
+ type: "integer"
+ minimum: 1000
+ maximum: 2999
+ minItems: 1
+ minItems: 3
class ApiController {
public function gatcha() {
return [
- 'cardIds' => [],
+ 'cardIds' => [1000, 1001, 1002],
];
}
}
開発体験
最小限のテストコード
Red -> Green -> Refactor
仕様・実装・テストが同時に出来上がっていく
共有可能な成果物
「ガチャAPI」
今回はどこに問題があったのか?
今回はどこに問題があったのか?
特定条件で「アプリ」が未定義プロパティを参照
というバグが存在したこと。
今回はどこに問題があったのか?
特定条件で「アプリ」が未定義プロパティを参照
というバグが存在したこと。
というバグの可能性が存在したこと。
TypeScript
https://github.com/bcherny/json-schema-to-
typescript
{
"title": "Example Schema",
"type": "object",
"properties": {
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
},
"age": {
"description": "Age in years",
"type": "integer",
"minimum": 0
},
"hairColor": {
"enum": ["black", "brown", "blue"],
"type": "string"
}
},
"additionalProperties": false,
export interface ExampleSchema {
firstName: string;
lastName: string;
/**
* Age in years
*/
age?: number;
hairColor?: "black" | "brown" | "blue";
}
C#
https://www.newtonsoft.com/jsonschema
{
"$schema": "http://json-schema.org/draft-03/schema#",
"title": "Country",
"description": "A nation with its own government, occupying a
"type": "object",
"properties": {
"flag": {
"$ref": "flag.json"
},
"cities": {
"type": "array",
"description": "A large town",
"items": {
"$ref": "city.json"
},
"uniqueItems": true
},
"population": {
"type": "integer",
"description": "The number of people inhabiting this count
"minimum": 1000,
namespace generated
{
using System;
using com.cvent.country.entities;
using generated;
using System.Collections.Generic;
using Cvent.SchemaToPoco.Core.ValidationAttributes;
using System.ComponentModel.DataAnnotations;
// A nation with its own government, occupying a particular
public class Country
{
// Used as the symbol or emblem of a country
public Flag Flag { get; set; }
// A large town
public HashSet<City> Cities { get; set; }
// The number of people inhabiting this country
[Required()]
[MinValue(1000)]
クライアントへの適用
ビルドが通っていれば確実に安全
安全でない場合ビルドで落ちる
心がけていること
担当業務の範囲にとらわれず、
幅広い視野で全体の効率アップを図りたい。
API / ネットワーク/ インターフェース
業務/ 人/ 部署/ 会社
仕組み化で解決。
サーバサイドは仕組み化に取り組みやすい立ち位置。

More Related Content

What's hot

Kubo100903
Kubo100903Kubo100903
Kubo100903kubo
 
PHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めようPHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めようYuya Takeyama
 
最近の単体テスト
最近の単体テスト最近の単体テスト
最近の単体テストKen Morishita
 
Phpstudy44 Zend Frameworkが抱えている問題は多い。
Phpstudy44 Zend Frameworkが抱えている問題は多い。Phpstudy44 Zend Frameworkが抱えている問題は多い。
Phpstudy44 Zend Frameworkが抱えている問題は多い。sasezaki
 
Klocwork 2017.1アップデート
Klocwork 2017.1アップデートKlocwork 2017.1アップデート
Klocwork 2017.1アップデートMasaru Horioka
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
 
tech talk about JS #0
tech talk about JS #0tech talk about JS #0
tech talk about JS #0Hika Maeng
 
nGrinder3 : だれもが簡単にできる性能テスト
nGrinder3 : だれもが簡単にできる性能テストnGrinder3 : だれもが簡単にできる性能テスト
nGrinder3 : だれもが簡単にできる性能テストJunHo Yoon
 
静的解析ツールKlocwork によるCERT-C/CWE対応
静的解析ツールKlocwork によるCERT-C/CWE対応静的解析ツールKlocwork によるCERT-C/CWE対応
静的解析ツールKlocwork によるCERT-C/CWE対応Masaru Horioka
 
anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件y-uti
 
テスト駆動開発入門
テスト駆動開発入門テスト駆動開発入門
テスト駆動開発入門Shuji Watanabe
 
レビューで保守性のためにした コメントをふりかえってみた
レビューで保守性のためにした コメントをふりかえってみたレビューで保守性のためにした コメントをふりかえってみた
レビューで保守性のためにした コメントをふりかえってみたTakhisa Hirokawa
 
VMの歩む道。 Dalvik、ART、そしてJava VM
VMの歩む道。 Dalvik、ART、そしてJava VMVMの歩む道。 Dalvik、ART、そしてJava VM
VMの歩む道。 Dalvik、ART、そしてJava VMyy yank
 
静的解析Klocwork とJenkins CIの連携
静的解析Klocwork とJenkins CIの連携静的解析Klocwork とJenkins CIの連携
静的解析Klocwork とJenkins CIの連携Masaru Horioka
 
GTMF 2015: バグを減らそう。テストを楽にしよう。静的解析が開発者を救う。 | 日本シノプシス合同会社
GTMF 2015: バグを減らそう。テストを楽にしよう。静的解析が開発者を救う。 | 日本シノプシス合同会社GTMF 2015: バグを減らそう。テストを楽にしよう。静的解析が開発者を救う。 | 日本シノプシス合同会社
GTMF 2015: バグを減らそう。テストを楽にしよう。静的解析が開発者を救う。 | 日本シノプシス合同会社Game Tools & Middleware Forum
 
CakePHP - The point of upgrade
CakePHP - The point of upgradeCakePHP - The point of upgrade
CakePHP - The point of upgradeYasuo Harada
 
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い sasezaki
 
PHP Conference Japan 2010 : Zend Framewrok
PHP Conference Japan 2010 : Zend FramewrokPHP Conference Japan 2010 : Zend Framewrok
PHP Conference Japan 2010 : Zend Framewroksasezaki
 

What's hot (20)

Kubo100903
Kubo100903Kubo100903
Kubo100903
 
PHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めようPHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めよう
 
最近の単体テスト
最近の単体テスト最近の単体テスト
最近の単体テスト
 
Phpstudy44 Zend Frameworkが抱えている問題は多い。
Phpstudy44 Zend Frameworkが抱えている問題は多い。Phpstudy44 Zend Frameworkが抱えている問題は多い。
Phpstudy44 Zend Frameworkが抱えている問題は多い。
 
Klocwork 2017.1アップデート
Klocwork 2017.1アップデートKlocwork 2017.1アップデート
Klocwork 2017.1アップデート
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
tech talk about JS #0
tech talk about JS #0tech talk about JS #0
tech talk about JS #0
 
Klocworkのご紹介
Klocworkのご紹介Klocworkのご紹介
Klocworkのご紹介
 
nGrinder3 : だれもが簡単にできる性能テスト
nGrinder3 : だれもが簡単にできる性能テストnGrinder3 : だれもが簡単にできる性能テスト
nGrinder3 : だれもが簡単にできる性能テスト
 
静的解析ツールKlocwork によるCERT-C/CWE対応
静的解析ツールKlocwork によるCERT-C/CWE対応静的解析ツールKlocwork によるCERT-C/CWE対応
静的解析ツールKlocwork によるCERT-C/CWE対応
 
anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件
 
テスト駆動開発入門
テスト駆動開発入門テスト駆動開発入門
テスト駆動開発入門
 
Introduction to Spock
Introduction to SpockIntroduction to Spock
Introduction to Spock
 
レビューで保守性のためにした コメントをふりかえってみた
レビューで保守性のためにした コメントをふりかえってみたレビューで保守性のためにした コメントをふりかえってみた
レビューで保守性のためにした コメントをふりかえってみた
 
VMの歩む道。 Dalvik、ART、そしてJava VM
VMの歩む道。 Dalvik、ART、そしてJava VMVMの歩む道。 Dalvik、ART、そしてJava VM
VMの歩む道。 Dalvik、ART、そしてJava VM
 
静的解析Klocwork とJenkins CIの連携
静的解析Klocwork とJenkins CIの連携静的解析Klocwork とJenkins CIの連携
静的解析Klocwork とJenkins CIの連携
 
GTMF 2015: バグを減らそう。テストを楽にしよう。静的解析が開発者を救う。 | 日本シノプシス合同会社
GTMF 2015: バグを減らそう。テストを楽にしよう。静的解析が開発者を救う。 | 日本シノプシス合同会社GTMF 2015: バグを減らそう。テストを楽にしよう。静的解析が開発者を救う。 | 日本シノプシス合同会社
GTMF 2015: バグを減らそう。テストを楽にしよう。静的解析が開発者を救う。 | 日本シノプシス合同会社
 
CakePHP - The point of upgrade
CakePHP - The point of upgradeCakePHP - The point of upgrade
CakePHP - The point of upgrade
 
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
 
PHP Conference Japan 2010 : Zend Framewrok
PHP Conference Japan 2010 : Zend FramewrokPHP Conference Japan 2010 : Zend Framewrok
PHP Conference Japan 2010 : Zend Framewrok
 

Similar to バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話

Laravel における Blade 拡張のツラミ
Laravel における Blade 拡張のツラミLaravel における Blade 拡張のツラミ
Laravel における Blade 拡張のツラミShohei Okada
 
IDEを目指す開発者コンソール
IDEを目指す開発者コンソールIDEを目指す開発者コンソール
IDEを目指す開発者コンソールminoaw
 
Travis CIですぐに始める継続的インテグレーション
Travis CIですぐに始める継続的インテグレーションTravis CIですぐに始める継続的インテグレーション
Travis CIですぐに始める継続的インテグレーションYusuke Ando
 
MakeGoodで快適なテスト駆動開発を
MakeGoodで快適なテスト駆動開発をMakeGoodで快適なテスト駆動開発を
MakeGoodで快適なテスト駆動開発をAtsuhiro Kubo
 
pi-1. プログラミング入門
pi-1. プログラミング入門pi-1. プログラミング入門
pi-1. プログラミング入門kunihikokaneko1
 
Apexコアデベロッパーセミナー(Apexコード)071010
Apexコアデベロッパーセミナー(Apexコード)071010Apexコアデベロッパーセミナー(Apexコード)071010
Apexコアデベロッパーセミナー(Apexコード)071010stomita
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Tokuhiro Matsuno
 
テストしなイカ? Seleniumで自動ブラウザテスト
テストしなイカ? Seleniumで自動ブラウザテストテストしなイカ? Seleniumで自動ブラウザテスト
テストしなイカ? Seleniumで自動ブラウザテストOhishi Mikage
 
レガシーなWebアプリケーションと向き合う
レガシーなWebアプリケーションと向き合うレガシーなWebアプリケーションと向き合う
レガシーなWebアプリケーションと向き合うYuta Ohashi
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門Yasuko Ohba
 
CodeIgniter東京勉強会 2011.05.14
CodeIgniter東京勉強会 2011.05.14CodeIgniter東京勉強会 2011.05.14
CodeIgniter東京勉強会 2011.05.14Takako Miyagawa
 
Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodAtsuhiro Kubo
 
Java SE 再入門
Java SE 再入門Java SE 再入門
Java SE 再入門minazou67
 
How to manage Cakephp @CakePHP_Fukuoka_2
How to manage Cakephp @CakePHP_Fukuoka_2 How to manage Cakephp @CakePHP_Fukuoka_2
How to manage Cakephp @CakePHP_Fukuoka_2 ichikaway
 
Inside frogc in Dart
Inside frogc in DartInside frogc in Dart
Inside frogc in DartGoro Fuji
 
【XDev】A-2 アジリティ向上のためのツール活用
【XDev】A-2 アジリティ向上のためのツール活用【XDev】A-2 アジリティ向上のためのツール活用
【XDev】A-2 アジリティ向上のためのツール活用智治 長沢
 
第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめ第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめhakoika-itwg
 

Similar to バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話 (20)

Laravel における Blade 拡張のツラミ
Laravel における Blade 拡張のツラミLaravel における Blade 拡張のツラミ
Laravel における Blade 拡張のツラミ
 
IDEを目指す開発者コンソール
IDEを目指す開発者コンソールIDEを目指す開発者コンソール
IDEを目指す開発者コンソール
 
Travis CIですぐに始める継続的インテグレーション
Travis CIですぐに始める継続的インテグレーションTravis CIですぐに始める継続的インテグレーション
Travis CIですぐに始める継続的インテグレーション
 
MakeGoodで快適なテスト駆動開発を
MakeGoodで快適なテスト駆動開発をMakeGoodで快適なテスト駆動開発を
MakeGoodで快適なテスト駆動開発を
 
PHP版レガシーコード改善に役立つ新パターン #wewlc_jp
PHP版レガシーコード改善に役立つ新パターン #wewlc_jp PHP版レガシーコード改善に役立つ新パターン #wewlc_jp
PHP版レガシーコード改善に役立つ新パターン #wewlc_jp
 
pi-1. プログラミング入門
pi-1. プログラミング入門pi-1. プログラミング入門
pi-1. プログラミング入門
 
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。 【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
 
Apexコアデベロッパーセミナー(Apexコード)071010
Apexコアデベロッパーセミナー(Apexコード)071010Apexコアデベロッパーセミナー(Apexコード)071010
Apexコアデベロッパーセミナー(Apexコード)071010
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)
 
テストしなイカ? Seleniumで自動ブラウザテスト
テストしなイカ? Seleniumで自動ブラウザテストテストしなイカ? Seleniumで自動ブラウザテスト
テストしなイカ? Seleniumで自動ブラウザテスト
 
レガシーなWebアプリケーションと向き合う
レガシーなWebアプリケーションと向き合うレガシーなWebアプリケーションと向き合う
レガシーなWebアプリケーションと向き合う
 
Play勉強会 第3回
Play勉強会 第3回Play勉強会 第3回
Play勉強会 第3回
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門
 
CodeIgniter東京勉強会 2011.05.14
CodeIgniter東京勉強会 2011.05.14CodeIgniter東京勉強会 2011.05.14
CodeIgniter東京勉強会 2011.05.14
 
Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGood
 
Java SE 再入門
Java SE 再入門Java SE 再入門
Java SE 再入門
 
How to manage Cakephp @CakePHP_Fukuoka_2
How to manage Cakephp @CakePHP_Fukuoka_2 How to manage Cakephp @CakePHP_Fukuoka_2
How to manage Cakephp @CakePHP_Fukuoka_2
 
Inside frogc in Dart
Inside frogc in DartInside frogc in Dart
Inside frogc in Dart
 
【XDev】A-2 アジリティ向上のためのツール活用
【XDev】A-2 アジリティ向上のためのツール活用【XDev】A-2 アジリティ向上のためのツール活用
【XDev】A-2 アジリティ向上のためのツール活用
 
第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめ第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめ
 

More from Kentarou Takeda

コード品質を保つために心がけたいこと
コード品質を保つために心がけたいことコード品質を保つために心がけたいこと
コード品質を保つために心がけたいことKentarou Takeda
 
Composer bin plugin / ツールの依存管理から解放される
Composer bin plugin / ツールの依存管理から解放されるComposer bin plugin / ツールの依存管理から解放される
Composer bin plugin / ツールの依存管理から解放されるKentarou Takeda
 
Docker friendly PHP / Laravel
Docker friendlyPHP / LaravelDocker friendlyPHP / Laravel
Docker friendly PHP / LaravelKentarou Takeda
 
マスタデータの管理と運用について
マスタデータの管理と運用についてマスタデータの管理と運用について
マスタデータの管理と運用についてKentarou Takeda
 
スモールサービスにおけるCloudFrontの真骨頂
スモールサービスにおけるCloudFrontの真骨頂スモールサービスにおけるCloudFrontの真骨頂
スモールサービスにおけるCloudFrontの真骨頂Kentarou Takeda
 

More from Kentarou Takeda (6)

コード品質を保つために心がけたいこと
コード品質を保つために心がけたいことコード品質を保つために心がけたいこと
コード品質を保つために心がけたいこと
 
Composer bin plugin / ツールの依存管理から解放される
Composer bin plugin / ツールの依存管理から解放されるComposer bin plugin / ツールの依存管理から解放される
Composer bin plugin / ツールの依存管理から解放される
 
Docker friendly PHP / Laravel
Docker friendlyPHP / LaravelDocker friendlyPHP / Laravel
Docker friendly PHP / Laravel
 
マスタデータの管理と運用について
マスタデータの管理と運用についてマスタデータの管理と運用について
マスタデータの管理と運用について
 
スモールサービスにおけるCloudFrontの真骨頂
スモールサービスにおけるCloudFrontの真骨頂スモールサービスにおけるCloudFrontの真骨頂
スモールサービスにおけるCloudFrontの真骨頂
 
HttpClientModule
HttpClientModuleHttpClientModule
HttpClientModule
 

バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話