「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

93
「CodeIgniter」を読もう。 ~ソースコードから知る仕様や拡張方法~ 加賀 誠人 @makotokaga project92.com この作品はクリエイティブ・コモンズ 表示 - 非営利 - 継承 2.1 日本 ライセンスの下に提供されています。

description

2011年2月19日(土)に東京で開催された「CodeIgniterカンファレンス2011 (CodeIgniter Con 2011, Tokyo Japan)にてプレゼンテーションした内容です。http://cicon.codeigniter.jp/2011/主にCodeIgniter 2.0.0で、ソースを読むメリット、拡張のしかたの概要を述べています。

Transcript of 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

Page 1: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

「CodeIgniter」を読もう。~ソースコードから知る仕様や拡張方法~

加賀 誠人@makotokagaproject92.com

この作品はクリエイティブ・コモンズ 表示 - 非営利 - 継承 2.1 日本 ライセンスの下に提供されています。

Page 2: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

about me

•加賀 誠人 (かが まこと)

Page 3: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

about me

•加賀 誠人 (かが まこと)• @makotokaga

Page 4: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

about me

•加賀 誠人 (かが まこと)• @makotokaga • http://project92.com

Page 5: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

about me

•加賀 誠人 (かが まこと)• @makotokaga • http://project92.com• フリーランスのウェブエンジニア

Page 6: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

about me

•加賀 誠人 (かが まこと)• @makotokaga • http://project92.com• フリーランスのウェブエンジニア• PHPとの出会いはPHP/FI 2.0のころ

Page 7: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

about me

•加賀 誠人 (かが まこと)• @makotokaga • http://project92.com• フリーランスのウェブエンジニア• PHPとの出会いはPHP/FI 2.0のころ• CodeIgniter歴は4カ月ほど

Page 8: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterのソースコードを読むべき3つの理由

Page 9: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterのソースコードを読むべき3つの理由•細かい振る舞いを理解できる

Page 10: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterのソースコードを読むべき3つの理由•細かい振る舞いを理解できる• CodeIgniterを拡張するには理解するところから

Page 11: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterのソースコードを読むべき3つの理由•細かい振る舞いを理解できる• CodeIgniterを拡張するには理解するところから•コンパクトだから読むのが簡単

Page 12: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterのソースコードを読むべき3つの理由•細かい振る舞いを理解できる• CodeIgniterを拡張するには理解するところから•コンパクトだから読むのが簡単

ソースを使え、ルーク!Use the Source, Luke!

Evil Preacher / http://predicadormalvado.blogspot.com/Illustration by

Page 13: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

主要フレームワークとの行数の比較

Page 14: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

0 250,000 500,000 750,000 1,000,000

43,044

45,439

190,022

300,891

468,480

949,707

CodeIgniter 1.7.3

CodeIgnter 2.0.0

CakePHP 1.3.7

symfony 1.4.9

Zend Framework 1.11.3 Minimal

Zend Framework 1.11.3 Full

主要フレームワークとの行数の比較

•配布パッケージ中の *.php ファイルの行数を集計•コメント行や空行を含みます

Page 15: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

コンパクトということは……

Page 16: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

コンパクトということは……

• CodeIgniterは機能がシンプル• お仕着せでないよさ

Page 17: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

コンパクトということは……

• CodeIgniterは機能がシンプル• お仕着せでないよさ•マニュアル(User Guide)を読むのに多くの時間を要さない

Page 18: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

コンパクトということは……

• CodeIgniterは機能がシンプル• お仕着せでないよさ•マニュアル(User Guide)を読むのに多くの時間を要さない•ソースを読んで深く理解するのにも多くの時間を要さない• すぐに使いこなせるツールとなる

Page 19: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

細かい振る舞いを理解できる

•例題1 Template Parser Classで、

とした場合の振る舞いってどうなるのか?

{entries}...{/entries}{entries}...{/entries}

Page 20: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

細かい振る舞いを理解できる

•例題1 Template Parser Classで、

とした場合の振る舞いってどうなるのか?• ドキュメントには書かれてないが、ソースを読めば一目瞭然

{entries}...{/entries}{entries}...{/entries}

Page 21: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterを拡張するには、理解するところから•標準の機能がシンプルであるため、CodeIgniterの機能を拡張することは、特別なことじゃない!

Page 22: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

ディレクトリ構成~ 1.7.3以前と2.0.0以降の違い

Page 23: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

ディレクトリ構成~ 1.7.3以前と2.0.0以降の違い•おおきく整理され理解しやすくなった

Page 24: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

ディレクトリ構成~ 1.7.3以前と2.0.0以降の違い•おおきく整理され理解しやすくなった• 標準ではsystemディレクトリの配下にあったapplicationディレクトリは、systemディレクトリと同階層に

Page 25: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

ディレクトリ構成~ 1.7.3以前と2.0.0以降の違い•おおきく整理され理解しやすくなった• 標準ではsystemディレクトリの配下にあったapplicationディレクトリは、systemディレクトリと同階層に• コアクラスとその他のライブラリのディレクトリが分離された

Page 26: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniter 2.0.0のディレクトリ構成

Page 27: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniter 2.0.0のディレクトリ構成

index.php

system

application

Page 28: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniter 2.0.0のディレクトリ構成

core

database

libraries

helpers

index.php

system

application

Page 29: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniter 2.0.0のディレクトリ構成

core

database

libraries

helpers

index.php

system

application

configcontrollers

viewsmodels

Page 30: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniter 2.0.0のディレクトリ構成

core

database

libraries

helpers

core

libraries

helpers

index.php

system

application

configcontrollers

viewsmodels

Page 31: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う①• フロントコントローラ「index.php」

Page 32: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う①• フロントコントローラ「index.php」• 最初に呼び出され実行される

Page 33: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う①• フロントコントローラ「index.php」• 最初に呼び出され実行される• system/applicationディレクトリのパスを決定

Page 34: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う①• フロントコントローラ「index.php」• 最初に呼び出され実行される• system/applicationディレクトリのパスを決定• ファイルパスについての定数の定義

Page 35: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う①• フロントコントローラ「index.php」• 最初に呼び出され実行される• system/applicationディレクトリのパスを決定• ファイルパスについての定数の定義• core/CodeIgniter.phpへ処理を引き継ぐ

Page 36: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う①• フロントコントローラ「index.php」• 最初に呼び出され実行される• system/applicationディレクトリのパスを決定• ファイルパスについての定数の定義• core/CodeIgniter.phpへ処理を引き継ぐ

• このファイルだけはDocumentRoot以下に置く必要がある

Page 37: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う②•フロントコントローラ「index.php」で初期化される定数

Page 38: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う②•フロントコントローラ「index.php」で初期化される定数

SELF フロントコントローラのファイル名。通常は「index.php」

EXT PHPファイルの拡張子BASEPATH systemディレクトリの絶対パスAPPPATH applicationディレクトリのパス

FCPATH フロントコントローラのあるディレクトリの絶対パス

SYSDIR systemディレクトリの名前。通常は「system」

Page 39: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う②•フロントコントローラ「index.php」で初期化される定数

SELF フロントコントローラのファイル名。通常は「index.php」

EXT PHPファイルの拡張子BASEPATH systemディレクトリの絶対パスAPPPATH applicationディレクトリのパス

FCPATH フロントコントローラのあるディレクトリの絶対パス

SYSDIR systemディレクトリの名前。通常は「system」

Page 40: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う②•フロントコントローラ「index.php」で初期化される定数

SELF フロントコントローラのファイル名。通常は「index.php」

EXT PHPファイルの拡張子BASEPATH systemディレクトリの絶対パスAPPPATH applicationディレクトリのパス

FCPATH フロントコントローラのあるディレクトリの絶対パス

SYSDIR systemディレクトリの名前。通常は「system」

Page 41: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う②•フロントコントローラ「index.php」で初期化される定数

SELF フロントコントローラのファイル名。通常は「index.php」

EXT PHPファイルの拡張子BASEPATH systemディレクトリの絶対パスAPPPATH applicationディレクトリのパス

FCPATH フロントコントローラのあるディレクトリの絶対パス

SYSDIR systemディレクトリの名前。通常は「system」

Page 42: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う②•フロントコントローラ「index.php」で初期化される定数

SELF フロントコントローラのファイル名。通常は「index.php」

EXT PHPファイルの拡張子BASEPATH systemディレクトリの絶対パスAPPPATH applicationディレクトリのパス

FCPATH フロントコントローラのあるディレクトリの絶対パス

SYSDIR systemディレクトリの名前。通常は「system」

Page 43: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う②•フロントコントローラ「index.php」で初期化される定数

SELF フロントコントローラのファイル名。通常は「index.php」

EXT PHPファイルの拡張子BASEPATH systemディレクトリの絶対パスAPPPATH applicationディレクトリのパス

FCPATH フロントコントローラのあるディレクトリの絶対パス

SYSDIR systemディレクトリの名前。通常は「system」

Page 44: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う③• system/core/CodeIgniter.php

Page 45: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う③• system/core/CodeIgniter.php• リクエストの実行~終了までの流れを制御

Page 46: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う③• system/core/CodeIgniter.php• リクエストの実行~終了までの流れを制御• Common.phpのロード

Page 47: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う③• system/core/CodeIgniter.php• リクエストの実行~終了までの流れを制御• Common.phpのロード• コアシステムクラスのロード

Page 48: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う③• system/core/CodeIgniter.php• リクエストの実行~終了までの流れを制御• Common.phpのロード• コアシステムクラスのロード• constants.php、config.phpの読み込み

Page 49: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う③• system/core/CodeIgniter.php• リクエストの実行~終了までの流れを制御• Common.phpのロード• コアシステムクラスのロード• constants.php、config.phpの読み込み• アプリケーションControllerのロードと実行

Page 50: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う③• system/core/CodeIgniter.php• リクエストの実行~終了までの流れを制御• Common.phpのロード• コアシステムクラスのロード• constants.php、config.phpの読み込み• アプリケーションControllerのロードと実行• フックの実行

Page 51: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う③• system/core/CodeIgniter.php• リクエストの実行~終了までの流れを制御• Common.phpのロード• コアシステムクラスのロード• constants.php、config.phpの読み込み• アプリケーションControllerのロードと実行• フックの実行• 必要ならDB接続のクローズ

Page 52: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う④• system/core/Common.php

Page 53: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う④• system/core/Common.php• CodeIgniterの実行に必要な関数を定義する

Page 54: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う④• system/core/Common.php• CodeIgniterの実行に必要な関数を定義する• &load_class()

Page 55: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う④• system/core/Common.php• CodeIgniterの実行に必要な関数を定義する• &load_class()• ファイルからクラスをロード

Page 56: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う④• system/core/Common.php• CodeIgniterの実行に必要な関数を定義する• &load_class()• ファイルからクラスをロード• &get_config()

Page 57: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う④• system/core/Common.php• CodeIgniterの実行に必要な関数を定義する• &load_class()• ファイルからクラスをロード• &get_config()• config.phpを読み込み

Page 58: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う④• system/core/Common.php• CodeIgniterの実行に必要な関数を定義する• &load_class()• ファイルからクラスをロード• &get_config()• config.phpを読み込み• などなど

Page 59: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う⑤• system/core/CodeIgniter.phpがロードするコアクラスCI_Benchmark 実行速度を計測するCI_Hooks フックの機能を提供CI_Config 設定ファイルの読み込みCI_Utf8 UTF-8サポートCI_URI URIの操作CI_Router URIのルーティングCI_Output 出力の制御

CI_Input POST、COOKIE、SERVERデータの取得や、XSSフィルタなど

CI_Lang メッセージの国際化

Page 60: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う⑥•ロードされたコアクラスは、CI_Controllerのコンストラクタでメンバ変数に設定される• コントローラ内で、以下のようにアクセスできる$this->output->set_header();

Page 61: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの起動時の動きを追う⑦• system/core/CodeIgniter.phpが読み込むファイル

• CI_Controllerのコンストラクタがロードするクラス

CI_Controller アプリケーションControllerの基底クラス(core/Controller.php)

CI_Loader ViewやModel、database、ヘルパー、ライブラリを読み込む

$this->load->view('welcome_message');

Page 62: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

アプリケーションコントローラからアクセスできるコアクラスCI_Benchmark $this->benchmark

CI_Hooks $this->hook

CI_Config $this->config

CI_Utf8 $this->utf8

CI_URI $this->uri

CI_Router $this->router

CI_Output $this->output

CI_Input $this->input

CI_Lang $this->lang

CI_Loader $this->load

CI_Log $this->logコアクラスではないが、ログを有効にすると以下もロードされる

Page 63: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの拡張手段

Page 64: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの拡張手段

•フック

Page 65: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの拡張手段

•フック•コアクラスのカスタマイズ

Page 66: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの拡張手段

•フック•コアクラスのカスタマイズ•標準ライブラリ、ヘルパのカスタマイズ

Page 67: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの拡張手段

•フック•コアクラスのカスタマイズ•標準ライブラリ、ヘルパのカスタマイズ•ライブラリ、ヘルパの追加

Page 68: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

CodeIgniterの拡張手段

•フック•コアクラスのカスタマイズ•標準ライブラリ、ヘルパのカスタマイズ•ライブラリ、ヘルパの追加•ドライバ

Page 69: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

コアシステムクラスを拡張する

Page 70: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

コアシステムクラスを拡張する

• 完全に置き換えることも、継承して拡張することも可能。• いずれも application/core/ にファイルを置く

Page 71: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

コアシステムクラスを拡張する

• 完全に置き換えることも、継承して拡張することも可能。• いずれも application/core/ にファイルを置く

• コアクラスを置き換える場合• 「CI_」で始まるクラス名

Page 72: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

コアシステムクラスを拡張する

• 完全に置き換えることも、継承して拡張することも可能。• いずれも application/core/ にファイルを置く

• コアクラスを置き換える場合• 「CI_」で始まるクラス名• コアクラスを拡張する場合• 「MY_」で始まるクラス名• 「CI_」で始まるクラスを継承

Page 73: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

コアクラスを置き換える

• CI_Outputを置き換える場合• system/core/Output.phpを削除• バグ? or 仕様? ~1.7.3と違う• application/core/Output.php

• CI_Controllerは置き換えできない

Page 74: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

コアクラスを置き換える

• CI_Outputを置き換える場合• system/core/Output.phpを削除• バグ? or 仕様? ~1.7.3と違う• application/core/Output.php

• CI_Controllerは置き換えできない

<?phpclass CI_Output { function __construct() { ... }}

Page 75: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

コアクラスを拡張する

•たとえば、CI_Controllerを拡張する場合• application/core/MY_Controller.php

Page 76: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

コアクラスを拡張する

•たとえば、CI_Controllerを拡張する場合• application/core/MY_Controller.php<?php

class MY_Controller extends CI_Controller {

function __construct() {

parent::__construct();

}

}

Page 77: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

ライブラリを拡張する

Page 78: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

ライブラリを拡張する

•基本的にコアクラスと同じ

Page 79: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

ライブラリを拡張する

•基本的にコアクラスと同じ• 置き換えるか拡張するか

Page 80: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

ライブラリを拡張する

•基本的にコアクラスと同じ• 置き換えるか拡張するか• 置き換える場合、単にapplication/libraryにファイルを置けばよい

Page 81: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

ライブラリを拡張する

•基本的にコアクラスと同じ• 置き換えるか拡張するか• 置き換える場合、単にapplication/libraryにファイルを置けばよい• system/coreに同名ファイルが残ってても無視される

Page 82: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

宣伝!

Page 83: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

宣伝!

• PostgreSQL Conference 2011

Page 84: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

宣伝!

• PostgreSQL Conference 2011

• 2011年 2月 25日(金)開催 来週!

Page 85: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

宣伝!

• PostgreSQL Conference 2011

• 2011年 2月 25日(金)開催 来週!• 10:00~17:40

Page 86: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

宣伝!

• PostgreSQL Conference 2011

• 2011年 2月 25日(金)開催 来週!• 10:00~17:40• AP品川 (品川駅高輪口 徒歩3分)

Page 87: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

宣伝!

• PostgreSQL Conference 2011

• 2011年 2月 25日(金)開催 来週!• 10:00~17:40• AP品川 (品川駅高輪口 徒歩3分)• 主催: 日本PostgreSQLユーザ会(JPUG)

Page 88: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

宣伝!

• PostgreSQL Conference 2011

• 2011年 2月 25日(金)開催 来週!• 10:00~17:40• AP品川 (品川駅高輪口 徒歩3分)• 主催: 日本PostgreSQLユーザ会(JPUG)• 参加費 3,500 円(懇親会は別途 3,500 円)

Page 89: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

宣伝!

• PostgreSQL Conference 2011

• 2011年 2月 25日(金)開催 来週!• 10:00~17:40• AP品川 (品川駅高輪口 徒歩3分)• 主催: 日本PostgreSQLユーザ会(JPUG)• 参加費 3,500 円(懇親会は別途 3,500 円)

• チケット販売 ~2月25日

Page 90: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

宣伝!

• PostgreSQL Conference 2011

• 2011年 2月 25日(金)開催 来週!• 10:00~17:40• AP品川 (品川駅高輪口 徒歩3分)• 主催: 日本PostgreSQLユーザ会(JPUG)• 参加費 3,500 円(懇親会は別途 3,500 円)

• チケット販売 ~2月25日 http://www.postgresql.jp

Page 91: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜
Page 92: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜

The Source will be with you, always.

@makotokagahttp://project92.com

Page 93: 「Code igniter」を読もう。〜ソースコードから知る仕様や拡張方法〜