PHP checkEmpty, preg_match

private function checkEmpty($key, $message, ErrorCode $errorCode){
	if(self::isEmpty($this->array, $key)){
		throw new InnerException($message, $errorCode);
	}
	return $this->array[$key];
}
if(preg_match("/PHP/", "今PHPを勉強しています。")){
	echo "マッチしました。";
} else {
	echo "マッチしませんでした。";
}

PHP ErrorException

function exceptionErrorHandler($errono, $errstr, $errfile, $errline){
	throw new ErrorException($errstr, $errno, $errfile, $errline);
}
set_error_handler('exceptionErrorHandler');

error_reporting(E_ALL);
try {
	$arr = array();
	print $arr['a'] . "\n";
	strpos();
} catch (Exception $e){
	print $e->getMessage(). "\n";
	print $e->getTraceAsString(). "\n";
}

PHPのインターフェースと抽象クラス、多重継承、トレイト

インターフェースは、そのインスタンスはこのメソッドを持っているという意味

interface hoge {
	public function t1();
}

class foo implements hoge {
	public function t1(){
		echo "foo's t1()\n";
	}
}

$obj = new foo();
$obj->t1();

抽象クラス

abstract class hoge {
	abstract public function t1();
	abstract protected function t2();

	private $i_;
}

class foo extends hoge {
	public function t1(){
		echo "foo's t1()\n";
		$this->t2();
	}
	public function t2(){
		echo "foo's t2()\n";
	}
}

$obj = new foo();
$obj->t1();

PHPのマジックメソッドと無名関数

マジックメソッドはPHP固有に近い
マジックメソッドは、インスタンスがある特定の条件になった時に、明示的にcallしなくても暗黙的にcallされるメソッドの総評
先頭2文字がアンダースコア(__)になっている

### アクセス不能プロパティを読み書きする__get(), __set()

class hoge {
	
	private $i_;
}

$obj = new hoge();
var_dump($obj->i_);
$obj->i_ = 1;
class hoge {

	public function __get($name){
		echo "get: name is ${name}\n";
		return "dummy";
	}
	public function __set($name, $val){
		echo "set: ${name} <= ${val}\n";
	}

	
	private $i_;
}

$obj = new hoge();
var_dump($obj->i_);
$obj->i_ = 1;

### __call()と__callStatic()
アクセス不能メソッド

class hoge {
	public function __call($name, $args){
		echo "call {$name}\n";
		var_dump($args);
	}
	public function __callStatic($name, $args){
		echo "callStatic {$name}\n";
		var_dump($args);
	}
}

$obj = new hoge();
$obj->func();
hoge::func_static();

### 無名関数

$func = function(){
	echo "Anonymous function\n";
};

$func();
var_dump($func);
class hoge {
	public function __invoke(){
		echo "call method\n";
	}
}

$obj = new hoge();
$obj();

PHPにおける継承、オーバーライド、protected、parentの書き方

class hoge {
	
	public function A(){
		echo "call A\n";
	}
	private $i_ = 1;
}

class foo extends hoge {
	public function B(){
		echo "call B\n";
	}
	private $j_ = 999;
}

$hoge_obj = new hoge();
$hoge_obj->A();
var_dump($hoge_obj);

$foo_obj = new foo();
$foo_obj->B();
$foo_obj->A();
var_dump($foo_obj);

### オーバーライド

class hoge {
	
	public function A(){
		echo "call A\n";
	}
	private $i_ = 1;
}

class foo extends hoge {
	public function A(){
		echo "call B\n";
	}
	private $j_ = 999;
}

– protected

class hoge {
	
	private function h_pri_func(){
		echo "call h_pri_func\n";
	}
	protected function h_pro_func(){
		echo "call h_pro_func\n";
	}
}

class foo extends hoge {
	public function f_pri_func(){
		echo "call f_pri_func\n";
	}
	public function test(){
		$this->f_pri_func();
		$this->h_pro_func();
	}
}


$foo_obj = new foo();
$foo_obj->test();

– parent: 継承元のconstructor, destructorを呼ぶ

class foo extends hoge {
	public function __construct(){
		parent::__construct();
		echo "run foo constructor\n";
	}
	public function __destruct(){
		parent::__destruct();
		echo "run foo destructor\n";
	}
}

なるほど、constructorの整理にはなった。

PHPのアクセス修飾子、カプセル化、アクセサー、コンストラクター/デストラクター

### アクセス修飾子 — public, protected, private
public: 外からOK
protected: クラス内、あるいは継承先のクラス内
private: クラス内のみ

class hoge {
	public function pub_func(){
		echo "call pub_func\n";
		$this->pro_func();
		$this->pri_func();
	}

	protected function pro_func(){
		echo "call pro_func\n";
	}

	private function pri_func(){
		echo "call pri_func\n";
	}
}

$obj = new hoge();
$obj->pub_func();
class hoge {
	public $_pub_val;
	protected $_pro_val;
	private $_pri_val;
}

$obj = new hoge();
$obj->_pub_val = 10;
var_dump($obj);
class hoge {
	
	public function f(){
		$this->_pro_val = 20;
		$this->_pri_val = 20;
	}
public $_pub_val;
public $_pro_val;
public $_pri_val;
}

$obj = new hoge();
$obj->_pub_val = 10;
$obj->f();
var_dump($obj);

隠蔽化とは、全てのプログラム詳細を理解できていなくても、必要な箇所のみ修正•加筆等を行えば、全体として動くことをいう。

### アクセサー(セッター)

class hoge {
	
	public function setVal($v) {
		$this->_val = $v;
	}
	public function getVal(){
		return $this->_val;
	}
}

$obj = new hoge();
$obj->setVal('test');
var_dump($obj->getVal());

### コンストラクター

class hoge {
	
	public function __construct(){
		echo "run constructor\n";
	}
}

$obj = new hoge();

run constructor

デストラクター

class hoge {
	
	public function __destruct(){
		echo "run destructor\n";
	}
}

$obj = new hoge();
$obj = null;
sleep(5);

### immutableなオブジェクト

class hoge {
	
	public function __construct($v){
		$this->_val = $v;
	}
	public function getVal(){
		return $this->_val;
	}
}

$obj = new hoge('vall');
var_dump($obj->getVal());

PHPのclassの書き方

関数(メソッド)はpublicで変数(プロパティ)はprivate

class hoge {
	public function hogeMethod(){}

	private $_hogeProperty;
}

$obj = new hoge();

echo "<pre>";
var_dump($obj);
echo "</pre>";

object(hoge)#1 (1) {
[“_hogeProperty”:”hoge”:private]=>
NULL
}

### マルチプルインスタンス

class hoge {
	public function setValue($i){
		$this->_value = $i;
	}

	private $_value;
}

$obj = new hoge();
$obj->setValue(10);

echo "<pre>";
var_dump($obj);
echo "</pre>";
$obj = new hoge();
$obj->setValue(10);
var_dump($obj);

$obj2 = new hoge();
$obj2->setValue(20);
var_dump($obj2);

ここまでは基礎。他の言語でもほぼ同じ。

httpd.confの書き方

Section 1: Global Environment
Apache全体に影響を与えるセクション
Server RootはApacheをインストールした場所のパスが指定
Timeoutはクライアントから接続要求を受け取ってからタイムアウトになるまでの時間
KeepAliveはクライアントから接続要求を受け取った際に、すぐにはHTTPセッションを閉じずに、ある一定の時間まで継続してセッションを保っておく機能
MaxKeepAliveRequests: KeepAliveがOnの時に接続要求を受け付ける最大許容値
Listenディレクティブは特定のIPアドレスや特定のIPやポート番号だけをlistenすることができる

Section 2: “Main” server configuration
サーバを実行するためのユーザとグループを指定
User apache
Group apache

ServerAdminは、サーバがエラードキュメントを返す際などに表示される管理者のメールアドレスを指定
ServerNameは、サーバ自身が使用するサーバ名とポート番号を指定
UseCanonicalNameは自身がURLをどのように決定するかを指定
DocumentRoot
Directory: サーバルートディレクトリに対する設定。2度目に出てくるDirectoryはドキュメントルートを指定
Option Mutliviews: 曖昧なURLを指定した場合でも、クライアントに対して最適な値を検索して返す
ユーザにホームページスペースを提供するのがUserDir
AccessFileName アクセス制御を行うためのファイル
はブラウザはアクセスできないようにする
TypesConfigはMIMEタイプ設定ファイルの位置を設定
AddType application/x-smaf mmn mmfを追加したい場合、以下のようにすることで実現
DefaultTypeはMIME Typeファイルに記述がなかった場合の扱いを指定
IfModule mod_mime_magic.c : mod_mine_magic.c モジュールが組み込まれているかどうかを確認し、もし組み込まれていればファイルの内容からさまざまな手がかりを探り出し、MIMEタイプを決定できる
HostnameLookups は IPアドレスをホスト名に変換し、ログに記録する機能を提供
ServerSignature はエラーメッセージなどをクライアントに帰す際のフッターラインを表示させるかどうかを指定するディレクティブ

うーむ、なかなか埋まらんな〜

RPMとは

RedHatLinuxのために開発されたパッケージ管理方法
標準のファイル拡張子は.rpm
複数のファイルやディレクトリをcpio形式のアーカイブファイルにまとめた形になっている
独自のspec形式ファイル、バイナリファイルやソースコードなどが格納されている
パッケージ名称、説明、種類、バージョン番号、ライセンス情報、開発元、公式サイトのURL、ツール、他のパッケージとの依存関係などの情報を記述した部分と、シェルスクリプトなどを記述したスクリプト部分が格納

apr rpmはapache
apr-util は依存関係
httpd rpm
libfontenc rpm
libXfont rpm
xorg-x11 rpm : x window system

うーむ、DMZのapache設定がわからん…

DMZとは?

DeMilitarized Zoneの略で、外部ネットワークと社内ネットワークの中間に作られるネットワーク上のセグメント(区域)のこと。
外部ネットワークからも、内部ネットワークからも見ることができる
外部ネットワークからも内部ネットワークからもファイヤーウォールによって隔離されている
社内ネットワークと隔離することで、不正侵入された後のマルウェアの感染拡大を防ぐ

DMZの構成には2台のファイヤーウォールを設置して、インターネット – FW – DMZ – FW – 社内ネットワークとする方法がある

DMZホストとなるパソコンはIP固定が必要

### DMZ
IPアドレス単位で転送するため、公開するポートを指定する必要がない
セキュリティ: 無条件で全通信がサーバにたどり着くため注意が必要
ルータ設定: 簡単
IPアドレスの有効活用: 1つのグローバルIPアドレスに1つのサーバ

DMZの作成方法がわからん…