PHPKansai 2015 メモ


## PHP7

速くなったよ。

疑問：PHP7で内部的に連想配列と配列が別になった。

Formで data[AAA][BBB][],data[AAA][BBB][],data[AAA][BBB][] と３つのフィールドで同じ名前にした時、PHPのPOSTのKeyは

```php
$_POST = [
  'AAA' => [
    'BBB' => [
       'aaa',
       'bbb'
    ]
  ]
];
``` 

となるが、この場合は一番下の階層は配列になると思う。

この場合に `$_POST['AAA']['BBB']['1']` とした時、どういった挙動になる？


## Codeception Test

フロちゃん Baterd Florentさん

### なぜコードテスト？

- 何かを仮定すればそれは絶対失敗する
- 機能後退（リグレッション）が無いこと確認
- 期待通り動いてる？
- 境界値テスト（セキュリティ、大きいデータ）
- 繰り返し作業を自動化 : Jenkins
- デバッグは簡単になる

けど

- 開発者はテストを書くのを好まない
	- PHPUnit が好きな人は凄い珍しい

### CodeCeption

http://codeception.com/

- Aceeptance Tests
- Functional Tests
- Unit Tests

- BDDTest
- WebServiceTest(SOAP/REST/XML-RPC)
- Report(HTML/XML/JSON)
- Laravel/Zend/Phalcon/Yii2/Symfony/Composer
- CITools (Jenkins/Bamboo)
- Selenium2, PhantomJS


雰囲気は英語。ユーザシナリオ

```php
<?php
$I = new AcceptanceTester($scenario);
$I->wantTo('create wiki page');
$I->amOnPage('/');
$I->click('Pages');
$I->click('New');
$I->see('New Page');
$I->fillField('title', 'Hobbit');
$I->fillField('body', 'By Peter Jackson');
$I->click('Save');
$I->see('page created'); // notice generated
$I->see('Hobbit','h1'); // head of page of is our title
$I->seeInCurrentUrl('pages/hobbit'); 
$I->seeInDatabase('pages', array('title' => 'Hobbit'));
```

#### Acception Test

- Domさわれる
- Selenium/PhantomJSでJSさわれる
- 機能ゴテゴテなので遅い

#### Functional Test

- ブラウザ使ってない AcceptionTest

#### UnitTest

- Functional Test
- よくわからんテスト…
- 一番早い

#### Install


Composer: php composer.phar require "codeception/codeception"

Bonus

```
> codecept run --debug --env test // 別環境設定ができる
```


PhantomJSとか使うと、エラーが起きた時にHTMLやスクリーンショットを残してくれる。

本番サーバでは monitoring。実行しちゃだめ、絶対

## PHPに足りないセキュリティ機能


大垣さん

過去の脆弱性とか。

後でSlideShareで公開

### Session Module

- クッキーの仕組みがいい加減
- セッションマネージャーの実装もいい加減

session adaption

1. 消えないクッキーを設定可能
2. session_regenerate_id
	3. ただしに古いセッションを削除はNG
	4. 不正なセッション削除
		5. CGで削除するから消す
			6. なかなか消えないサイトあるじゃん
		7. 削除フラグ＋Timestampで。
8. 不正なスクリプトや時刻ファイルの実行
	9. include('/etc/passwd')
	10. whitelist型にすればいいんじゃない。PHP7に入るかも。
11. 任意整数型がない（short/int/long/long long)
	12. DB/JSONは64bitなのに、PHPでは getId(int $id) でコケる
		13. 議論中
	14. 整数オーバーフロー検出できない
		15. PHP_INT_MAX/PHP_INT_MIN でやる必要ある
16. Javascript関数のエスケープ内
	17. ブログ書いてる
18. LDAPエスケープない
	19. 5.6から
20. XPATHエスケープ
	21. 1.0でエスケープが無い
	22. ブログを呼んで
	23. 2.0 で仕様が追加された
24. SQL識別子エスケープ
25. JSONエスケープ
	26. 安全じゃない
		27. ブログを読んで
	28. JSON Numeric
		29. floatで文字として受け取れないので精度が。
		30. PHP7 で検討中
31. HTML Escape
	32. htmlspecialcharas はデフォルトでは安全じゃない
		33. ' がデフォルトでエスケープしない
		34. HTML5 の /エスケープ をしない
35. OS Command
	36. 仕組み的に安全にコマンドを実行が無理
37. XML Escape
	38. 無い
	39. htmlspecialchars/htmlentites の流用
40. SQL Like
	41. % -> _ でエスケープ
42. 正規表現エスケープ
	43. mbstring用には関数がない
44. validator
	45. filter モジュールはある
		46. 使いにくい
		47. フレームワークのvalidatorを。

### いままでの問題

1. typeconfuson
	2. bug #69152
	3. PHP Module が多いので対応しきれてないかもしれない。
4. 開放済メモリーにアクセスする
	5. memcpy( ptr, size, NULL) してないのか…
6. 入力バリデーションをする
7. include にNULL
	8. include('path/to/\0.php');
		9. preg_match('/.+.php\z/') でもすり抜ける
		10. '/etc/passwd\0.php' を実行できるよね。
		11. get だと example.com/aa?path=/etc/passwd%00.php で。
	12. 他の言語
		13. 追従したりしてるっぽい
	14. bug #69418
		15. stream wrapper で対応
		16. ZPP を拡張して対応させてる
17. 改行インジェクション
	18. HTTP Header Injection
	19. Mail Header Injection とか言われてる
		20. 改行を変な所に入れることで。
		21. HTTP はheaderで対応済み
	22. mail 関数には残っている
	23. PHPコミッター達：入力バリデーションは当たり前よね。
		24. だから割とどこにもある感じがあったりする
		25. アプリ側でやっといたら安全
	26. 要は一行に意味があるので、そこで。

### 防御


「コード・命令を挿入」をさせない←入力バリデーション
「意図しない動作をさせる」をさせない←escape/encode/API/出力バリデーション

webアプリはいろんな技術を複合的に使っているので、信頼境界線を超える物は入出力のバリデーションを。

契約プログラミングでやるのがいい。

### これから

WIX: http://ja.wix.com/ とか

普通にプログラムレスになっていく。ので使っていくには、契約プログラミングでやれば大丈夫じゃない。


# 進化し続けるLaravel

@localdisk さん

6/27 はPHPカンファレンス福岡

- Laravel ver1,ver2 のソースコードは現存していない

slideshared

- Laravel3 2012/2月。ver2 から4ヶ月後…
	- 最終3.2.14
		- php 5.4まで
	- Laravel - a beatiful PHP framework ナントカ
		- ブログ記事ではやった
	- UnitTest
	- Blade
	- CLI Interface
	- Migration
	- SQLServer Support
- Laravel4
	- 2013/5リリース
	- composer
	- symfony
	- illuminate
	- ServiceProvider
		- Facade
	- DB Seeding
	- Queue
	- Email (なぜなかったのだ…）
		- 裏では Swift_Mailer
- Laravel5
	- 2015/2リリース
	- ディレクトリ構造一新
		- Psr-4
		- MVC論争
	- Controller Method Injection
		- L4 では　ConstructerInjectionしかできなかった
	- Scheduler
		- cron が楽に
	- Socialite
		- Social Login/ Github,Twitter,Facebook Loginとか
	- laravel-Elixir
		- Gulpのタスクランナー
	- 当初は4.3予定だったけど、あまりにも変更点が多いので 5 になった。
	- Laravel5.1
		- Symfony2.7が週末リリース予定
		- その後にリリース予定
		- ドキュメントの量が前に比べて増えたので、日本語翻訳は時間かかるそうで。
		- LTS
			- 2年ごとにLTS Version
			- Support 3 year
			- security fix 4 year
		- PHP5.4 Drop
			- PSR-2
			- Commands -> Jobs
	- Lumen
		- 2015/4
		- マイクロ
		- Symfony - Aura


# PHPとフロントのいい関係を。

@ku_suke さん

## 動向

- 2000年〜
	- HTML tag
	- CSS
	- Flash
	- spacer.gif
- 最近
	- SEO
	- Multi Device
	- AltJS/AltCSS
	- JS Framework
	- Struct CSS
	- Parformance
	- Auto Tasking
		- Grunt ...

### 複雑化・多様化・分業化

Design&Coding が Designer/ Coding/ System/ Marketing と増えた。

## Style Guide

スタイルガイド。Bootstrapのような。

Lonely Planet で StyleGuide を検索したら出てくる。
http://rizzo.lonelyplanet.com/styleguide/design-elements/colours

ここまでやると、新しく来た人とかに、デザインの一貫性をもたせることができる。

要はコピペ見本

### Codeの一貫性

```<div class='button'><div class='innter'><i class='alert'>..``` か `<a class='btn btn-alert'>`か…？

要は「作るのではなく、自動生成で動くようにメンテしよう」という事。

## 作っていこうと

- KSS Ruby or Node
- StyleDocco - Node
- Kalei - Javascript

## PHP でスタイルガイドを作ろう :)

http://bjankord.github.io/Style-Guide-Boilerplate/

- Style Guide Boilerplate
	- PHP製のスタイルガイドジェネレーター
	- PHPは70行
	- 移植は簡単なはず
		- ベタ埋めなHTML/PHP
	- 拡張子をHTMLとPHPにしてみた
		- 動いた

# LT

メモらない

## セキュリティ検査を自動化とか

cakephper さん

vaddy.net

## NetBeans のライブコーディング

バタバタ

## DDDの話

DNSじゃないよ。

github.com/kumamidori/

(昔、Facebookが作ったDomain/Path で動くiOSアプリフレームワークを思い出した）

## CoderDojo

角田一平さん

CoderDojoのメンター募集

## Ruby のなんとか

y.andoさん……ではなくマスクドPHPさん

PHP-warrere 

## CakePHP

@4for8ppou

## Woker

@ixkaitoさん