最近、僕がハマったFuelPHPの紹介

76,926 views
79,009 views

Published on

2012年7月20日に行われたFukuoka.php Vol.2での資料です。
スライドの内容に間違い等あれば、ご指摘ください。
質問等は、お気軽に@mawatarinまで。

Fukuoka.php Vol.2 リポート
http://mawatari.jp/archives/fukuoka-php-02-report

Published in: Technology
0 Comments
63 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
76,926
On SlideShare
0
From Embeds
0
Number of Embeds
47,180
Actions
Shares
0
Downloads
0
Comments
0
Likes
63
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • 最近、僕がハマったFuelPHPの紹介

    1. 1. 最近、僕がハマった FuelPHPの紹介 2012/7/20 Fukuoka.php Vol.2 @mawatarin
    2. 2. 自己紹介• @mawatarin• ウェブプログラマ• Perlを4年くらい• そのあとPHPを4年くらい• ただ最近は専らマネジメントより
    3. 3. セッションを始める前に• まず、言い訳から始めさせてください!
    4. 4. セッションを始める前に• まず、言い訳から始めさせてください!• 1週間前に子どもが生まれました!
    5. 5. セッションを始める前に• まず、言い訳から始めさせてください!• 1週間前に子どもが生まれました!• そのため、スライドを作る時間がほとんどありません でしたっっっ• ネタとか仕込む間もなかったので、つまらなかったら ごめんなさい
    6. 6. セッションを始める前に• 事前のヒアリングでFuelPHPに関しては名前は聞いた ことあるけど、使ってことがないという人が多かった です• とりあえず、ざっくりFuelPHPの概要を伝えるスライド を作りました
    7. 7. 今日のお話
    8. 8. 今日のお話1. FuelPHPに興味を持ったきっかけ2. FuelPHPとは3. FuelPHPのインストールとフォルダ構成4. FuelPHPの使い方(MVCの基本)5. セキュリティについて6. その他ざっくりと(デバッグ、プロファイラ、コア クラス一覧)
    9. 9. 1. FuelPHPに興味を持ったきっかけ
    10. 10. 1. FuelPHPに興味を持ったきっかけ • Web API 制作の案件が入った • IDに応じたデータを返すだけの簡単なもの
    11. 11. 1. FuelPHPに興味を持ったきっかけ • Web API 制作の案件が入った • IDに応じたデータを返すだけの簡単なもの • たまたま空いてるPGがいなかった
    12. 12. 1. FuelPHPに興味を持ったきっかけ • Web API 制作の案件が入った • IDに応じたデータを返すだけの簡単なもの • たまたま空いてるPGがいなかった • 自分で作るか
    13. 13. 1. FuelPHPに興味を持ったきっかけ • なんかフレームワークを使おう
    14. 14. 1. FuelPHPに興味を持ったきっかけ • なんかフレームワークを使おう • 最近よく聞くようになったフレームワーク「FuelPHP」 • RESTコントローラが簡単っぽい • 試しに調べてみよう
    15. 15. 1. FuelPHPに興味を持ったきっかけ例えば、このようなテーブルがあったとして CREATE TABLE user ( id int(11) auto_increment ,name varchar(50) ,email varchar(255) );
    16. 16. 1. FuelPHPに興味を持ったきっかけこんな風にコントローラを実装 class Controller_User extends Controller_Rest public function get_list() { $user = Model_User::forge(); $data = $user->find(Input::get(id)); $this->response($data); } } // 実際はもっと作り込みますが……
    17. 17. 1. FuelPHPに興味を持ったきっかけこんな風にコントローラを実装※中身は後ほど解説します class Controller_User extends Controller_Rest public function get_list() { $user = Model_User::forge(); $data = $user->find(Input::get(id)); $this->response($data); } } // 実際はもっと作り込みますが……
    18. 18. 1. FuelPHPに興味を持ったきっかけ以下のURLにアクセスすると…… http://localhost/user/list.xml?id=123
    19. 19. 1. FuelPHPに興味を持ったきっかけ以下のURLにアクセスすると……XMLが返ってくる! http://localhost/user/list.xml?id=123 <xml> <id>123</id> <name>foo</name> <email>foo@example.jp</email> </xml>
    20. 20. 1. FuelPHPに興味を持ったきっかけ拡張子をjsonに変更すると…… http://localhost/user/list.json?id=123
    21. 21. 1. FuelPHPに興味を持ったきっかけ拡張子をjsonに変更すると……JSON形式で返ってくる! http://localhost/user/list.json?id=123 { "id":"123", "name":"foo", "email":"foo@example.jp" }
    22. 22. 1. FuelPHPに興味を持ったきっかけ拡張子をphpに変更すると……PHP arrayで返ってくる! http://localhost/user/list.php?id=123 array ( id => 123, name => foo, email => foo@example.jp, )
    23. 23. 1. FuelPHPに興味を持ったきっかけ何これステキ!
    24. 24. 1. RESTコントローラの使い方
    25. 25. 1. RESTコントローラの使い方 • Controller_Rest クラスを継承します • 実装するメソッドには、HTTPメソッドのプレフィック スをつけます • URLのメソッド名に続けて、出力フォーマットの拡張子 を付けます
    26. 26. 1. RESTコントローラの解説Controller_Rest クラスを継承 class Controller_User extends Controller_Rest public function get_list() { $user = Model_User::forge(); $data = $user->find(Input::get(id)); $this->response($data); } }
    27. 27. 1. RESTコントローラの解説メソッドのプレフィックスでHTTPメソッドを指定GET, POST, PUT, DELETE が指定できます class Controller_User extends Controller_Rest public function get_list() { $user = Model_User::forge(); $data = $user->find(Input::get(id)); $this->response($data); } }
    28. 28. 1. RESTコントローラの解説メソッド名に続けて出力フォーマットの拡張子を付けます拡張子に応じて自動的にフォーマットしてくれます class Controller_User extends Controller_Rest public function get_list() { $user = Model_User::forge(); $data = $user->find(Input::get(id)); $this->response($data); } } http://localhost/user/list.xml?id=123
    29. 29. 1. RESTコントローラの解説以下のフォーマットに対応 拡張子 フォーマット xml XML json JSON jsonp JSONP csv CSVファイル php PHP array serialized シリアライズされたデータ
    30. 30. 1. RESTコントローラの解説FuelPHPとの出会いはそんな感じ
    31. 31. 2. FuelPHPとは
    32. 32. 2. FuelPHPとは 公式サイトより
    33. 33. 2. FuelPHPとは つたない和訳ですが FuelPHPは他のフレームワークの 良いところを参考にし、コミュ ニティ駆動で一から開発された PHP5.3を対象としたシンプルで 柔軟なウェブアプリケーション フレームワークです。
    34. 34. 2. FuelPHPとは • フューエル・ピー・エイチ・ピーと読みます
    35. 35. 2. FuelPHPとは • フューエル・ピー・エイチ・ピーと読みます • 2011年7月にversion 1.0が出た新しいフレームワーク • その後、2011年12月に1.1、2012年6月に1.2リリース
    36. 36. 2. FuelPHPとは • フューエル・ピー・エイチ・ピーと読みます • 2011年7月にversion 1.0が出た新しいフレームワーク • その後、2011年12月に1.1、2012年6月に1.2リリース • FuelPHPのコア開発者5名すべてはCodeIgniterの開発に 関わっている(いた) • 他のフレームワークの良い所取りをしたCodeIgniter ライクなフレームワーク
    37. 37. 2. FuelPHPとは • 規約より設定 • PHP5.3以上必須 • オートローダー • oilコマンド • スキャフォールディング • DBマイグレーション • テスト、タスク • モジュール、パッケージ、HMVC、 ViewModel • MITライセンス
    38. 38. 3. FuelPHPのインストール
    39. 39. 3. FuelPHPのインストール $ curl get.fuelphp.com/oil | sh $ oil create /path/to/install_dir/project_name
    40. 40. 3. FuelPHPのインストール2行、それだけで。 $ curl get.fuelphp.com/oil | sh $ oil create /path/to/install_dir/project_name
    41. 41. 3. FuelPHPのインストールインストール完了! ※要Git
    42. 42. 3. FuelPHPのインストールTwitter Bootstrapが取り入れられてるってのもイイ感じ
    43. 43. 3. FuelPHPのインストールざっくり解説 $ curl get.fuelphp.com/oil | sh $ oil create /path/to/install_dir/project_name
    44. 44. 3. FuelPHPのインストールoilコマンドのインストール $ curl get.fuelphp.com/oil | sh $ oil create /path/to/install_dir/project_name
    45. 45. 3. FuelPHPのインストールFuelPHPのファイル群を生成 $ curl get.fuelphp.com/oil | sh $ oil create /path/to/install_dir/project_name
    46. 46. 3. FuelPHPのインストール中身はともにGitHubからのgit clone(ざっくり解説) $ curl get.fuelphp.com/oil | sh $ oil create /path/to/install_dir/project_name
    47. 47. 3. FuelPHPのフォルダ構成
    48. 48. 3. FuelPHPのフォルダ構成 アプリケーションファイルを置く場所 =僕らが書く場所
    49. 49. 3. FuelPHPのフォルダ構成 FuelPHPのコアが置かれた場所 基本的に触ることはないです
    50. 50. 3. FuelPHPのフォルダ構成 パッケージを置く場所
    51. 51. 3. FuelPHPのフォルダ構成 パッケージを置く場所 標準で5つのパッケージが 格納されています 自作のパッケージもここに格納します
    52. 52. 3. FuelPHPのフォルダ構成 スタティックファイルを置く場所
    53. 53. 3. FuelPHPのフォルダ構成 アプリケーションファイルの中を 見ていきましょう
    54. 54. 3. FuelPHPのフォルダ構成 Model
    55. 55. 3. FuelPHPのフォルダ構成 View
    56. 56. 3. FuelPHPのフォルダ構成 Controller
    57. 57. 3. FuelPHPのフォルダ構成 ViewModel Viewファイルとは違います
    58. 58. 3. FuelPHPのフォルダ構成 ViewModel Viewファイルとは違います ビューモデルはビューの生成に必要なロジックを含むク ラスです。 コントローラがユーザ入力を処理し、必要な アクションを処理すると、 ビューモデルにビューに必要 なデータを取得するように処理を引き継ぎます。 http://press.nekoget.com/fuelphp_doc_1.2/general/ viewmodels.html
    59. 59. 3. FuelPHPのフォルダ構成 Config 必要に応じて設定ファイルをオーバーライドします 例えば、環境に応じてDBを変えたり、プロファイラを有 効する等
    60. 60. 3. FuelPHPのフォルダ構成 Config 必要に応じて設定ファイルをオーバーライドします 例えば、環境に応じてDBを変えたり、プロファイラを有 効する等 core/config app/config app/config/production or app/config/development の順でオーバーライドされます productionまたはdevelopmentは、環境に応じて読み込まれ ます
    61. 61. 3. FuelPHPのフォルダ構成 Config 必要に応じて設定ファイルをオーバーライドします 例えば、環境に応じてDBを変えたり、プロファイラを有 効する等 core/config app/config app/config/production or app/config/development の順でオーバーライドされます productionまたはdevelopmentは、環境に応じて読み込まれ ます 初期状態でフォルダは存在しませんが、stage, test という 環境も定義されています
    62. 62. 4. FuelPHPの使い方 - Controller
    63. 63. 4. FuelPHPの使い方 - Controller • APPPATH/classes/controller以下に配置 • ファイル名はコントローラー名で小文字にします • Controllerクラスを継承します • クラス名にはController_プレフィックスをつけます • クラス名の単語の先頭は大文字にします • クラス名の単語の区切りにアンダースコアを使うと サブフォルダを意味してしまうので注意が必要です
    64. 64. 4. Controllerでのお約束 ファイル名はすべて小文字APPPATH/classes/controller/welcome.phpclass Controller_Welcome extends Controller{ public function action_index() { return Response::forge(View::forge(welcome/index)); }}
    65. 65. 4. Controllerでのお約束 Controllerクラスを継承しますAPPPATH/classes/controller/welcome.phpclass Controller_Welcome extends Controller{ public function action_index() { return Response::forge(View::forge(welcome/index)); }}
    66. 66. 4. Controllerでのお約束 Controller_プレフィックスをつけますAPPPATH/classes/controller/welcome.phpclass Controller_Welcome extends Controller{ public function action_index() { return Response::forge(View::forge(welcome/index)); }}
    67. 67. 4. Controllerでのお約束 クラス名の単語の先頭は大文字にしますAPPPATH/classes/controller/welcome.phpclass Controller_Welcome extends Controller{ public function action_index() { return Response::forge(View::forge(welcome/index)); }}
    68. 68. 4. Controllerでのお約束 クラス名の単語の区切りにアンダースコアを使うとサブ フォルダを意味しますAPPPATH/classes/controller/welcome/member.phpclass Controller_Welcome_Member extends Controller{ public function action_index() { return Response::forge(View::forge(welcome/index)); }}
    69. 69. 4. ControllerとURLの関係 第一セグメントがクラス名http://localhost/welcome/indexclass Controller_Welcome extends Controller{ public function action_index() { return Response::forge(View::forge(welcome/index)); }}
    70. 70. 4. ControllerとURLの関係 第二セグメントがメソッド名http://localhost/welcome/indexclass Controller_Welcome extends Controller{ public function action_index() { return Response::forge(View::forge(welcome/index)); }}
    71. 71. 4. ControllerとURLの関係 ブラウザから実行されるメソッド(アクションメソッ ド)には、action_プレフィックスをつけますhttp://localhost/welcome/indexclass Controller_Welcome extends Controller{ public function action_index() { return Response::forge(View::forge(welcome/index)); }}
    72. 72. 4. ControllerとURLの関係 第三セグメント以降はパラメータ 受け取りの際はデフォルト値を設定しておいた方が無難http://localhost/welcome/index/123class Controller_Welcome extends Controller{ public function action_index($page = null) { return Response::forge(View::forge(welcome/index)); }}
    73. 73. 4. Controllerの定義済みメソッドとプロパティ詳しい解説は省略します メソッド/プロパティ 意味 action_index() メソッド名を省略されたときに実行される before() アクションメソッドが実行される前に自動実行 after() アクションメソッドが実行された後に自動実行 $request Requestクラスのオブジェクトを保持 $response Responseクラスのオブジェクトを保持
    74. 74. 4. Controllerクラスの種類詳しい解説は省略します クラス名 意味 Controller ベースコントローラ Controller_Template ビューでレイアウト機能を使うコントローラ Controller_Rest RESTfulなコントローラ RestコントローラにTemplateコントローラが備 Controller_Hybrid わったもの
    75. 75. 4. FuelPHPの使い方 - View
    76. 76. 4. FuelPHPの使い方 - View • APPPATH/views以下に配置 • ファイル名は小文字にします • 拡張子.phpをつけます
    77. 77. 4.ViewファイルViewファイルの中身については、本日は割愛します。PHPとHTMLで構成されたファイルです。</head><body> <div id="header"> <div class="row"> <div id="logo"></div> </div> </div> <div class="container"> <div class="row"> <div class="span16"> <h1><?php echo e($title); ?> <small>We cant find that!</small></h1> <hr> <p>The controller generating this page is found at <code>APPPATH/classes/controller/welcome.php</code>.</p> <p>This view is located at <code>APPPATH/views/welcome/404.php</code>.</p> </div> </div> <footer> <p class="pull-right">Page rendered in {exec_time}s using {mem_usage}mb of memory.</p> <p> <a href="http://fuelphp.com">FuelPHP</a> is released under the MIT license.<br> <small>Version: <?php echo e(Fuel::VERSION); ?></small>
    78. 78. 4.Viewの読み込みコントローラからView::forge(path/view)として読み込むAPPPATH/views/までのパスは省略しますclass Controller_Welcome extends Controller{ public function action_index() { return View::forge(welcome/index); }}
    79. 79. 4.Viewに値を渡す連想配列で値を渡すレンダリング時にextract()されるのでキーが変数名となりますclass Controller_Welcome extends Controller{ public function action_index() { $data = array(); $data[name] = foo; return View::forge(welcome/index, $data); }}
    80. 80. 4.Viewに値を渡す他にもset()メソッドを利用して値を渡すclass Controller_Welcome extends Controller{ public function action_index() { $view = View::forge(welcome/index); $view->set(name, foo); return $view; }}
    81. 81. 4.Viewに値を渡す他にもプロパティに値をセットするclass Controller_Welcome extends Controller{ public function action_index() { $view = View::forge(welcome/index); $view->name = foo; return $view; }}
    82. 82. 4. テンプレートコントローラとViewテンプレートのレイアウトを行いたいときは、Controller_Templateを継承します コンテナ メニュー メイン
    83. 83. 4. FuelPHPの使い方 - Model
    84. 84. 4. FuelPHPの使い方 - Model • APPPATH/classes/model以下に配置 • ファイル名はモデル名で小文字にします • Modelクラスを継承します • クラス名にはModel_プレフィックスをつけます • クラス名の単語の先頭は大文字にします • クラス名の単語の区切りにアンダースコアを使うと サブフォルダを意味してしまうので注意が必要です
    85. 85. 4. Modelでのお約束 •Controllerと基本的には同じなので詳細解説は省略します APPPATH/classes/model以下に配置 • ファイル名はモデル名で小文字にします • Modelクラスを継承します • クラス名にはModel_プレフィックスをつけます • クラス名の単語の先頭は大文字にします • クラス名の単語の区切りにアンダースコアを使うと サブフォルダを意味してしまうので注意が必要です
    86. 86. 4. Modelクラスの種類詳しい解説は省略します クラス名 意味 Model ベースモデル Model_Crud CRUD処理をするモデル OrmModel ORMパッケージ
    87. 87. 4. oilコマンドでModelを作ってみる
    88. 88. 4. oilコマンドでModelを作ってみる名前とパスワードとemailを持つユーザテーブルを作りたいとした場合CREATE TABLE user ( id int(11) auto_increment ,name varchar(50) ,password varchar(255) ,email varchar(255));
    89. 89. 4. oilコマンドでModelを作ってみるoilコマンドだとこんな感じ$ oil g model user name:varchar[50] password:string email:string
    90. 90. 4. oilコマンドでModelを作ってみるテーブル名$ oil g model user name:varchar[50] password:string email:string
    91. 91. 4. oilコマンドでModelを作ってみるフィールド名$ oil g model user name:varchar[50] password:string email:string
    92. 92. 4. oilコマンドでModelを作ってみるフィールドの型$ oil g model user name:varchar[50] password:string email:string
    93. 93. 4. oilコマンドでModelを作ってみるマイグレーションを実行し、テーブルを作成します$ oil g model user name:varchar[50] password:string email:string$ oil refine migrate
    94. 94. 4. oilコマンドでModelを作ってみる Userモデルができた! テーブルもできた!class Model_User extends OrmModel{ protected static $_properties = array( id, name, password, email, created_at, updated_at ); protected static $_observers = array( OrmObserver_CreatedAt => array( events => array(before_insert), mysql_timestamp => false, ), OrmObserver_UpdatedAt => array( events => array(before_save), mysql_timestamp => false, ), );}
    95. 95. 4. oilコマンドでModelを作ってみる 例えば、こんな風に書いておけば、Fieldsetクラスで自動 的にフォームを作ってくれたり、バリデートしてくれたりclass Model_User extends OrmModel{ protected static $_properties = array( id, name => array( data_type => varchar, label => お名前, validation => array(required), form => array(type => text), default => , ), password, email, created_at, updated_at ); // 略
    96. 96. 4. oilコマンドでModelを作ってみる リレーションの設定はこんな感じclass Model_User extends OrmModel{ protected static $_properties = array( id, name, password, email, created_at, updated_at ); protected static $_has_many = array( comments => array( model_to => Model_Comment, key_from => id, key_to => user_id, cascade_save => false, cascade_delete => true, )); // 略
    97. 97. 4. FuelPHPの使い方説明できてないことの方が多いですが、FuelPHPのざっくりとした使い方は以上です
    98. 98. 5. セキュリティについて
    99. 99. 5. セキュリティについて代表的なウェブアプリケーションのセキュリティリスクと対応状況 リスク名 対応状況 ビューへ渡す値は自動的にエ XSS スケープされる クエリビルダ、ORMパッケー SQLインジェクション ジを使えば、自動的にエス ケープされる Cookieを使ったトークンを作 CSRF るクラスが用意されている。 手動で利用する
    100. 100. 5. セキュリティについて出力フィルタ、URIフィルタはSecurity::htmlentities()が使われます
    101. 101. 5. セキュリティについて 出力フィルタ、URIフィルタはSecurity::htmlentities()が使わ れます中身 public static function htmlentities($value, $flags = null, $encoding = null, $double_encode = null) { static $already_cleaned = array(); is_null($flags) and $flags = Config::get(security.htmlentities_flags, ENT_QUOTES); is_null($encoding) and $encoding = Fuel::$encoding; is_null($double_encode) and $double_encode = Config::get(security.htmlentities_double_encode, false); // 略 if (is_string($value)) { $value = htmlentities($value, $flags, $encoding, $double_encode); } // 略
    102. 102. 5. セキュリティについて
    103. 103. 5. セキュリティについて• ある程度は、自動的に保護してくれる• または保護をするクラスが用意されている• ただ過信は禁物!• ウェブアプリケーション制作に関わる以上、アンテナを 常に張りセキュリティに関する知識を高めておく必要が ある
    104. 104. 6. その他ざっくりと
    105. 105. 6. 開発補助 - デバッグエラーがあった場合は整形して表示してくれます
    106. 106. 6. 開発補助 - プロファイラconfig で profiling => true にすることで、プロファイラが使えます
    107. 107. 6. コアクラス一覧• Agent • Form • Package• Arr • Format • Pagination• Asset • Ftp • Profiler• Autoloader • Fuel • Redis• Cache • Html • Request• Cli • Image • Response• Config • Inflector • Router• Cookie • Input • Security• Crypt • Lang • Session• Database • Log • Str• Date • Markdown • Theme• Debug • Migrate • Upload• Event • Model_Crud • Uri• Fieldset • Module • Validation• File • Mongo_Db • View• Finder • Num
    108. 108. 7月1日から20日間FuelPHPを触ってみた感想 • 必要な機能は大凡そろってるかなー • シンプルで、やりたいことがサクッとできるイメージ • ただ、フィーチャーフォン(いわゆるガラケー)向け のウェブアプリを作ったりするのは苦手分野かな? (ただ単に調べきれてないとも言う) • その辺は、CakePHPとかの方が一日の長がある感じ • まあ実質1週間くらいしか触ってないけどね!
    109. 109. こんな人にはFuelPHPを勧めてみます • 現場から少し離れてたけど、やっぱり自分でもアプリ ケーションを作りたい人 • WordPress等を通してPHPでのアプリケーション制作に 興味を持ったけど、何から手を付けたら良いかわから ない人 • CodeIgniterのライセンス騒動に疲弊した人 • このスライドを通して興味を持ったもの皆
    110. 110. 参考文献とかウェブページとかFuelPHP 公式サイト(英語)http://fuelphp.com/FuelPHP日本語訳ドキュメントhttp://press.nekoget.com/fuelphp_doc/FuelPHP Google グループhttp://groups.google.com/group/fuelphp_jp
    111. 111. 参考文献とかウェブページとか FuelPHP 入門 2012年6月20日 初版 第1刷発行 ブログ作成を通して、FuelPHPの使い方等を学びます。 フォーム処理、認証管理、メール送信等。 はじめてのフレームワークとしての FuelPHP 2012年7月2日 バージョン0.9.0発行 フレームワークとはなんぞやという所から始まって、FuelPHPを用いた ウェブアプリケーション作成について学びます。テスト手法について しっかりと書かれているのが好印象。電子書籍のみの販売。 達人出版会 http://tatsu-zine.com/books/fuelphp1st
    112. 112. 勉強会のお知らせ スイミー http://swimmy.me/
    113. 113. 勉強会のお知らせ• ウェブプログラマ向けの勉強会をやってます• PC持ち込んでやる勉強会です• 月に1∼2回くらいのペースです• 現在はPHPerも、ちゃんとCIしようってことで、 Jenkinsの勉強をしています• 一人で悩んでても仕方ない!がコンセプトなので、 皆さんもお気軽に、ご参加ください!
    114. 114. さいごに このような機会を与えてくださってあ りがとうございました。 おかげで目標を持って勉強することが できました。
    115. 115. さいごに ご清聴ありがとうございました @mawatarin

    ×