GMO TECHNOLOGY BOOT CAMP2015(PHP編)

>100 Views

June 12, 15

スライド概要

自社の新卒研修(PHP編)で使った資料です。

profile-image

Agile Practitioner / CSP-SM, CSP-PO(Certified Scrum Professional) / Modern Offshore Development / Vietnam / Paris Hilton / RareJob / BOOKOFF / TIER IV, Inc.

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

2015 GMO TECHNOLOGY BOOT CAMP PHP 2015年6月12日 GMOインターネット株式会社 次 世代システム研究室 藤村 新 1

2.

自己紹介 2

3.

藤村 新 ふじむら あらた 省略 アジャイルPM研究会所属

4.

伝えたいこと覚えてますか? 4

5.

伝えたいこと 1.夢や実現したいこ とを言葉に出そう 2.自己投資しよう 3.まずは行動しよう

6.

その後の近況報告 6

7.

スプツニ子!に会った(話し聞いた)

8.

Sputniko! The Moonwalk Machine Selena's Step https://www.youtube.com/watch?v =6P1uFNdKdQA HELLO KITTY IN SPACE https://www.youtube.com/watch?v =5REsCTG4-Gg

9.

5/29-30 Regional Scrum Gathering Vietnam 2015 • 参加してきた(自費) 9

15.

今日の目的 15

16.

1. PHPをざっくり理 解する 2. チームで何かを作 れるようになる

17.

個人開発 ≠ チーム開発

18.

PHPとは 18

19.

• PHP(PHP:Hypertext Preprocessor)は、1995年最初 のバージョンが生み出された。 • 当時はPHP(Personal Home Page) Toolsと呼ばれていた

20.

• PHP(PHP:Hypertext Preprocessor)は、1995年最初 のバージョンが生み出された。 • 当時はPHP(Personal Home Page) Toolsと呼ばれていた 昔からある

21.

[特徴]※Wikipediaから引用 •Webアプリケーションのサーバーサイド・スクリプトに専門化している。 •C言語やJava言語に似た、平易な文法。 •データベースへの容易なアクセス(組み込み関数、および、標準ライブラリPDOによる)。 •クラスベースオブジェクト指向のサポート。 •例外処理 (try, catch, throw) のサポート。 •多くのオープンソースのフレームワークやライブラリが利用可能である。 •ASP, JSPと似たHTML埋め込み型の構文をとる。ただし最近のフレームワークを使った 開発では、埋め込み型の構文を使用しないことが多い。 •様々な付加機能がPEARというオンラインライブラリ集でモジュールとして提供されてい る。pearコマンドで導入/管理ができる。PerlでいうところのCPANである。 •ウィキ構築に用いられるソフトのMediaWiki(Wikipediaで使われている)やPukiwikiを始 めとして、数多くのオープンソースウェブアプリケーションに利用されている。 •処理系本体は、C言語で書かれている。

22.

[特徴]※Wikipediaから引用 •Webアプリ向け •平易な文法 •世の中で数多く 使われている •Webアプリケーションのサーバーサイド・スクリプトに専門化している。 •C言語やJava言語に似た、平易な文法。 •データベースへの容易なアクセス(組み込み関数、および、標準ライブラリPDOによる)。 •クラスベースオブジェクト指向のサポート。 •例外処理 (try, catch, throw) のサポート。 •多くのオープンソースのフレームワークやライブラリが利用可能である。 •ASP, JSPと似たHTML埋め込み型の構文をとる。ただし最近のフレームワークを使った 開発では、埋め込み型の構文を使用しないことが多い。 •様々な付加機能がPEARというオンラインライブラリ集でモジュールとして提供されてい る。pearコマンドで導入/管理ができる。PerlでいうところのCPANである。 •ウィキ構築に用いられるソフトのMediaWiki(Wikipediaで使われている)やPukiwikiを始 めとして、数多くのオープンソースウェブアプリケーションに利用されている。 •処理系本体は、C言語で書かれている。

23.

その他の特徴として、

24.

PHPは初心者に学びやすいと言われて いることが問題である。 Webアプリケーションをなめるな! Disられる PHPユーザーは他の言語から学んでい るのか、という点。 PHPユーザーが他の言語ユーザーよりも 弱いのは、そこなのではないか。

25.

一貫性の欠如 混血言語(C, Perl, Java) 英語も同じ?

26.

強いアイデンティティを持たない 最も強いものが生き残るのではなく、最も賢いものが 生き延びるわけでもない。 唯一、生き残るのは変化できるものだけである。 過去現在に渡って躊躇無く変化してきた

27.

「PHP開発者は、開発者宇宙におけ るダークマターのようだ。目に見えな いし、声もあげない。だが、そこには 多くの開発者が存在している」 (Heroku) PHP開発者は、何で作るかよりも、 何を作るかに重きを置いているので はないか。(Fujimura)

28.

当たり前だけど、ちゃんと書く!

29.

皆さん、開発環境ありますか? 29

30.

Hello, world! <?php echo 'Hello, world!'; # php test.php Hello, world!

31.

休憩 https://www.flickr.com/photos/emiliokuffer/8359208711/ 31

32.

PHPのお約束 •PHPタグ •ここから •<?php •ここまで •?> •省略した方が良い

33.

PHPのお約束 •文末にはセミコロン(;) •コメント •一行 •// or # •複数行 •/* から */ まで

34.

変数への代入、出力 <?php $age = 38; // 数字 echo $age; // 38と出力 $name = "Fujimura ${age}才"; echo $name; // Fujimura 38才

35.

演算子 <?php $a = 2; $b = 3; echo $a * $b; // 6 $a++; // $a = $a + 1と同じ echo $a * $b; // 9 echo $a / $b; // 1 echo $a % $b; // 0 echo 'gmo' . '.jp' // gmo.jp

36.

条件で処理を分ける <?php $age = 18; // 20に書き換えてみる if ($age < 20) { echo 'ジュースをどうぞ。'; } else { echo 'ビールはいかがですか?'; }

37.

条件で処理を分ける <?php $age = 18; // 20に書き換えてみる $order = 'beer'; if ($age >= 20 && $order == 'beer') { echo 'ビールをどうぞ。'; }

38.

配列 <?php $animals = array( 'bear' => 'くま', 'rabbit' => 'うさぎ' ); print_r($animals); $animals['cat'] = 'ねこ'; print_r($animals); $animals['bear'] = 'ベアー'; print_r($animals);

39.

配列 <?php $bears = array('Teddy', 'Pooh', 'Brown'); print_r($bears); $bears[] = 'Momo'; print_r($bears); $bears[5] = 'Foo'; print_r($bears);

40.

配列 <?php $animals = array( 'bears' => array('Teddy', 'Pooh', 'Brown'), 'rabbits' => array('Peter', 'Miffy', 'Cony'), ); print_r($animals); echo $animals['bears'][2]; // Brown

41.

ループ(while) <?php $i = 1; while ($i <= 10) { echo $i; $i++; } // 1から10までの数字が表示される

42.

ループ(for) <?php for ($i =1; $i <=10; $i++) { echo $i; } // 1から10までの数字が表示される

43.
[beta]
ループ(foreach)
<?php
$bears = array('Teddy', 'Pooh', 'Brown');
foreach ($bears as $bear) {
echo $bear . "はクマです。¥n";
}

44.
[beta]
ループ(foreach)
<?php
$animals = array(
'bear' => 'くま',
'rabbit' => 'うさぎ'
);
foreach ($animals as $key => $value) {
echo $key . 'は' . $value . "です。¥n";
}

45.

関数(内部関数) <?php $scores = array(57, 89, 72); $sum = array_sum($scores); $count = count($scores); $average = round(($sum / $count), 1); echo $average; // 72.7

46.
[beta]
関数(内部関数)
<?php
$url = 'http://www.gmo.jp/';
$html = file_get_contents($url);
echo $html;
$url = 'http://feeds.feedburner.com/kumagai';
$rss = simplexml_load_file($url);
var_dump($rss);
echo $rss->item[0]->title; // 記事タイトル

47.
[beta]
関数(ユーザー関数)
<?php
function average($scores) {
$sum = array_sum($scores);
$count = count($scores);
$average = round(($sum / $count), 1);
return $average;
}
echo average(array(57, 89, 72)) . "¥n";
echo average(array(75, 66, 98)) . "¥n";

48.

変数のスコープ <?php $word = 'りんご'; function say() { echo $word; } say(); /* PHP Notice: Undefined variable: word */

49.

変数のスコープ <?php $word = 'りんご'; function say($word) { echo $word; } say($word); // りんご

50.

ペアで課題を 解いてください

51.

ペアプログラミングとは •ペアプログラミングとは、二人が一つのキーボードでプログラ ミングをすること。 •driverはキーボードを叩き、observer(あるいはnavigator)は driverの書くコードを眺め、エラーや設計を吟味する。 •driver側 •どうやって機能を作るか細かいことを考える。 •observerに言われたとおりにコードを打ち込むことような ことはしない •observer側 •driverのコードを横から睨み、バグ、デザインの改善や簡 潔化、大局的な問題について考える。

52.

1.FizzBuzz問題 •1から100まで順番に数を表示する •ただし、その数が3で割り切れるなら“Fizz”、5 で割り切れるなら“Buzz”、両方で割り切れるな ら“FizzBuzz”と表示する •プログラムでは、剰余演算子(%)を使ってはな らない

53.

1.FizzBuzz問題(実行例) 1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 … ※実際は改行区切りで出力

54.

2.insertNum関数 •与えられた文字列に対して、数字を挿入する 関数。 •挿入ルールは、最初に"1",1文字あけて"2",2 文字あけて"3",... •最後はあける文字数によらず数字で終わらせ る。

55.

2.insertNum関数(実行例) •呼び出し $str = 'Hello Jason, how are you?'; echo insertNum($str); •実行結果 1H2el3lo 4Jaso5n, ho6w are 7you?8

56.

3.checkSamePath関数 •渡された2つのパスが同じ場所を指している かチェックする関数。 •同じパスなら “Match”, 異なるパスなら “Not Match”を表示する。

57.

3.checkSamePath関数(実行例1) •呼び出し1 $pathA = '/home/admin/index.html'; $pathB = '/home/admin/public_html/index.html'; if(checkSamePath($pathA, $pathB)) { echo 'Match'; } else { echo 'Not Match'; } •実行結果1 Not Match

58.

3.checkSamePath関数(実行例2) •呼び出し2 $pathA = '/home/user/../admin/./index.html'; $pathB = '/home/admin/public_html/../index.html'; if(checkSamePath($pathA, $pathB)) { echo 'Match'; } else { echo 'Not Match'; } •実行結果2 Match

59.

昼休憩 https://www.flickr.com/photos/emiliokuffer/8359208711/ 59

60.

パフォーマンス・チューニング 60

61.

4.素数の数を返す関数 •コマンドラインから1つの引数Nを受け取り、N 以下の素数の数を返却する。 •Nは1桁から7桁の間の整数(1~ 9,999,999)であること。 •正しい答えを返すのは当たり前として、実行 時間の短縮を工夫してください。

62.

アプリケーションフレームワークとは Web アプリケーションフレームワークは、動的なウェブ サイト、Webアプリケーション、Webサービスの開発をサ ポートするために設計されたアプリケーションフレーム ワークである。 フレームワークの目的は、Web開発で用いられる共通 した作業に伴う労力を軽減することである。 たとえば、多数のフレームワークがデータベースへのア クセスのためのライブラリや、テンプレートエンジン、 セッション管理を提供し、コードの再利用を促進させる ものもある。

63.

ハッピーコーディング? 「ハッピーコーディング」とは、煩わしい定型処理 はすべてフレームワークに任せて、アプリケーショ ンの中核となるロジックに集中できる状態です。 入出力の処理やリダイレクト、データベースへの 接続、ロジックと表示の分離、これらをフレーム ワークは担ってくれます。 あなたは実現したいことをコードに書くだけです。

64.

PHPの代表的なフレームワーク •Laravel4(近年爆発的に人気急上昇) •Symfony2(大規模重厚、多機能) •CodeIgniter(軽量、高速。ライセンス問題で話題) •FuelPHP(軽量、高速) •CakePHP(RoRのPHP版、日本で大人気) •Zend Framework2(保守的で誠実) •Silex(マイクロフレームワーク) •Yii Framework(ロシア、ウクライナ、中国) •BEAR.Sunday(DI、AOP、REST) •Phalcon(最速)

65.

PHPの代表的なフレームワーク 高級品 日用品 Laravel CodeIgniter (FuelPHP) 小規模 BEAR.Sunday Symfony CakePHP Zend Framework 2 Yii 大規模 http://www.slideshare.net/KenichiMukai/conferencekphpugjp2014/56

66.

早速使ってみる!

67.
[beta]
# cd /var/www
# wget
https://github.com/cakephp/cakephp/archive/2.6.4.zip
# unzip 2.6.4.zip
# ln –s cakephp-2.6.4 cakephp
# chmod –R 777 cakephp/app/tmp
# chmod –R 777 /var/lib/php/session
# vi cakephp/app/Config/core.php
Configure::write('Security.salt', 'xxxxxxxxxxxxxxxxxxxx');
Configure::write('Security.cipherSeed', '1234567890123');
# vi /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/cakephp/app/webroot"
AllowOverride All
# service nginx stop
# service httpd start

68.

# mysql –uroot –p mysql> create database gtb; mysql> create database gtb_test; mysql> quit # cd cakephp/app/Config # mv database.php.default database.php # vi database.php public $default = array( 'datasource' => 'Database/Mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'root', 'password' => '', 'database' => 'gtb', 'prefix' => '', //'encoding' => 'utf8', );

69.

# vi database.php public $test= array( 'datasource' => 'Database/Mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'root', 'password' => '', 'database' => 'gtb_test', 'prefix' => '', //'encoding' => 'utf8', );

70.

# cd ../.. # curl -sS https://getcomposer.org/installer | php # mv composer.phar /usr/local/bin/composer # composer update # vi app/Config/bootstrap.php require ROOT . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php' ;

71.

インストール完了! http://IPアドレス/

72.

掲示板アプリを 作ってみよう!

73.

# mysql –uroot –p gtb mysql> CREATE TABLE `posts` ( `id` int(11) unsigned NOT NULL auto_increment, `name` varchar(255) NOT NULL, `post` text NOT NULL, `active` boolean NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; mysql> quit # ./Console/cake bake all Post

74.

設定より規約 CoC(convention over configuration)

75.

完成!

76.

http://IPアドレス/posts "New Post"で生成(C) "View"で読み取り(R) "Edit"で更新(U) "Delete"で削除(D)

77.

CRUD UIが備えるべ き機能

78.

_人人人人人人人人人人人人人_ > 突然のMVCアーキテクチャ <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

79.

Model View Controller

80.

ユーザーインターフェースを もつアプリケーションを実 装するためのアーキテク チャ。 CakePHPもMVCアーキテク チャ採用のフレームワーク。

81.

一般的な(勘違い)MVC http://at-grandpa.hatenablog.jp/entry/2013/11/01/072636

82.

Controllerが 肥大化する!

83.

本来のMVC http://at-grandpa.hatenablog.jp/entry/2013/11/01/072636

84.

ビジネスロジック とは Modelの持つ 加工メソッド!

85.

掲示板アプリの Controller

86.
[beta]
/var/www/cakephp/app/Controller/PostsController.php

public function index() {
/*
/posts でやりたい処理をここに書く
*/
echo 'Hello!';
$this->Post->recursive = 0;
$this->set('posts', $this->Paginator>paginate());
}

87.
[beta]
/var/www/cakephp/app/Controller/UsersController.php

public function index() {
/*
/post データの中身を見てみる
*/
print_r($this->Post->find("all"));
$this->Post->recursive = 0;
$this->set('posts', $this->Paginator>paginate());
}

88.

Array ( [0] => Array ( [Post] => Array ( [id] => 1 [post] => こんにちは [active] => 1 [created] => 2015-06-08 18:39:29 [modified] => 2015-06-08 18:39:29 ) ) )

89.

掲示板アプリの View /var/www/cakephp/app/View/Posts/add.ctp /edit.ctp /index.ctp /view.ctp

90.
[beta]
/var/www/cakephp/app/View/Post/index.ctp
<?php foreach ($posts as $post): ?>
<tr>
<td><?php echo h($post['Post']['id']); ?>&nbsp;</td>
<td><?php echo h($post['Post']['name']); ?>&nbsp;</td>
<td><?php echo h($post['Post']['post']); ?>&nbsp;</td>
<td><?php echo h($post['Post']['active']); ?>&nbsp;</td>
<td><?php echo h($post['Post']['created']); ?>&nbsp;</td>
<td><?php echo h($post['Post']['modified']); ?>&nbsp;</td>
<td class="actions">
<?php echo $this->Html->link(__('View'), array('action' => 'view',
$post['Post']['id'])); ?>
<?php echo $this->Html->link(__('Edit'), array('action' => 'edit',
$post['Post']['id'])); ?>
<?php echo $this->Form->postLink(__('Delete'), array('action' =>
'delete', $post['Post']['id']), array('confirm' => __('Are you sure you want to delete # %s?',
$post['Post']['id']))); ?>
</td>
</tr>
<?php endforeach; ?>

91.

掲示板アプリの Model

92.

/var/www/cakephp/app/Model/Post.php public $validate = array( 'name' => array( 'notEmpty' => array( 'rule' => array('notEmpty'), ), 'post' => array( 'notEmpty' => array( 'rule' => array('notEmpty'), ), ), 'active' => array( 'boolean' => array( 'rule' => array('boolean'), ), ), );

93.

掲示板アプリに ビジネスロジックを 追加してみよう。 アクティブな投稿一覧が 見たい!

94.
[beta]
/var/www/cakephp/app/Model/Post.php

/**
* アクティブな投稿一覧を取得する。
*
* @return array
*/
public function getActive() {
$option = array(
'conditions' => array('Post.active' => 1),
'order' => array('Post.created asc'),
);
return $this->find('all', $option);
}

95.
[beta]
/var/www/cakephp/app/View/Post/active.ctp
# cd /var/www/cakephp/app/View/Posts
# cp index.ctp active.ctp
# vi active.ctp
↓以下の部分を削除↓(ページャー部分でエラーが出るため)
<p>
<?php
echo $this->Paginator->counter(array(
'format' => __('Page {:page} of {:pages}, showing {:current} records out of
{:count} total, starting on record {:start}, ending on {:end}')
));
?>
</p>
<div class="paging">
<?php
echo $this->Paginator->prev('< ' . __('previous'), array(), null, array('class'
=> 'prev disabled'));
echo $this->Paginator->numbers(array('separator' => ''));
echo $this->Paginator->next(__('next') . ' >', array(), null, array('class' =>
'next disabled'));
?>
</div>

96.
[beta]
/var/www/cakephp/app/Controller/PostsController.php

/**
* active method
*
* @return void
*/
public function active() {
$this->set('posts', $this->Post->getActive());
}

http://IPアドレス/posts/active

97.

避けては通れない テストの話し (ユニットテスト)

98.

# cd /var/www/cakephp/app # ./Console/cake bake What would you like to Bake? (D/M/V/C/P/F/T/Q) >T Enter the type of object to bake a test for or (q)uit (1/2/3/4/5/q) [q] > 1 Choose a Model class 1. AppModel 2. Post >2 Wrote `/var/www/cakephp/app/Test/Case/Model/PostTest.php`

99.

What would you like to Bake? (D/M/V/C/P/F/T/Q) >F --------------------------------------------------------------Bake Fixture Path: /var/www/cakephp-2.6.4/app/Test/Fixture/ --------------------------------------------------------------Use Database Config: (default/test) Possible Models based on your current database: 1. Post Enter a number from the list above, type in the name of another model, or 'q' to exit [q] > 1 Would you like to import schema for this fixture? (y/n) [n] > y Would you like to use record importing for this fixture? (y/n) [n] > y Baking test fixture for Post... Creating file /var/www/cakephp-2.6.4/app/Test/Fixture/PostFixture.php Wrote `/var/www/cakephp-2.6.4/app/Test/Fixture/PostFixture.php`

100.
[beta]
/var/www/cakephp/app/Test/Case/Model/PostTest.php
public function testgetActive(){
$actives = $this->Post->getActive();
foreach($actives as $row) {
$this->assertEquals('1', $row['Post']['active']);
}
}

http://IPアドレス/test.php

101.

さらに一歩進んだ テストの話し (テスト駆動開発[TDD])

102.

1.モデルに空のgetActive関数を作成 2.今回と同様のテストケース作成 3.テスト実施 4.エラーになる 5.エラーにならないようにざっくりgetActive関数 を実装 6.テスト実施 7.テスト通る 8.リファクタリング(ソースコードを綺麗にする) 9.テスト実施 10.テスト通る

103.

HTML以外の出力 (JSON, XML)

104.
[beta]
/var/www/cakephp/app/Controller/PostsController.php
public function active() {
$this->viewClass = 'Json';
// $this->viewClass = 'Xml';
$this->set('posts', $this->Post->getActive());
$this->set('_serialize', array('posts'));
}

http://IPアドレス/posts/active

105.

掲示板拡張

106.

1. やっぱり複数のスレッドを作りたい! 2. スレッド一覧ページをTOPページにしたい 3. 投稿者固有のIDを表示したい • 2chのIDのように、同一ブラウザからの 投稿は同一IDになる

107.

ヒント

108.

# mysql –uroot –p gtb mysql> CREATE TABLE `threads` ( `id` int(11) unsigned NOT NULL auto_increment, `name` varchar(255) NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; mysql> ALTER TABLE `posts` ADD COLUMN `thread_id` int(11) unsigned NOT NULL AFTER `id`; mysql> quit # ./Console/cake bake all Thread # ./Console/cake bake all Post

109.

/var/www/cakephp/app/Config/routes.php // Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home')); Router::connect('/', array('controller' => 'threads', 'action' => 'index')); http://IPアドレス/

110.

あとは、 ドキュメント読もう http://book.cakephp.org/2.0/ja /index.html

111.

Keep Problem Try

112.

おわり 112