オーバーライド
オーバーライドとはなんぞ
「オーバーライド」とは、継承クラスにおいて、親クラスのメソッドを上書きする仕組みの事をいいます。
親クラスのメソッドに追加機能を持たせたい場合、または親クラスのメソッドの機能を殺したい場合などに使用します。
何かの時に継承元のメソッドを書き換えたい時があるんだろう。うん、きっと。何かの時に。
オーバーライドってどうするの?
継承クラス、子クラスで継承元の上書きしたいメソッドと同じ名前のメソッドを作ればOK
継承元、親クラス
3 class Product { 4 protected $price; 5 6 public function getPrice() { 7 return $this->price; 8 } 9 10 public function setPrice($price) { 11 $this->price = $price; 12 } 13 }
継承、子クラス
15 class FoodProduct extends Product { 16 private $expire = 15; 17 18 public function getExpire() { 19 return $this->expire; 20 } 21 22 public function decrementExpire() { 23 $this->expire--; 24 return $this->getExpire(); 25 } 26 27 // 価格取得のオーバーライド 28 public function getPrice() { 29 $price = $this->price; 30 if($this->expire <= 10) { 31 // 残り賞味期限が10日以下になったら半額 32 $price = $price / 2; 33 } 34 return $price; 35 } 36 }
継承クラスを実体化、インスタンスを生成
38 $prd = new FoodProduct(); 39 $prd->setPrice(100); 40 41 $expire = $prd->getExpire(); 42 while ($expire > 0) { 43 echo '賞味期限:' . $expire .'日 価格:' . $prd->getPrice() . '<br />'; 44 $expire = $prd->decrementExpire(); 45 }
実行結果
賞味期限:15日 価格:100 賞味期限:14日 価格:100 賞味期限:13日 価格:100 賞味期限:12日 価格:100 賞味期限:11日 価格:100 賞味期限:10日 価格:50 賞味期限:9日 価格:50 賞味期限:8日 価格:50 賞味期限:7日 価格:50 賞味期限:6日 価格:50 賞味期限:5日 価格:50 賞味期限:4日 価格:50 賞味期限:3日 価格:50 賞味期限:2日 価格:50 賞味期限:1日 価格:50
と、getPrice() が上書きされると。
オーバーライドした場合 継承元、親クラスのメソッドはどうなるの?
オーバーライドした継承元クラスのメソッドを呼び出すことも可能らし
継承元クラスのメソッドを呼び出したい場合は
parent::someMethod()
継承元クラス、親クラスのメソッドを修正してみる
3 class Product { 4 protected $price; 5 protected $discountRate = 0.03; 6 7 // 価格取得 8 public function getPrice() { 9 $price = $this->price - ($this->price * $this->discountRate); 10 return $price; 11 } 12 13 // 価格設定 14 public function setPrice($price) { 15 $this->price = $price; 16 } 17 }
継承クラス、子クラスを修正
19 class FoodProduct extends Product { 20 private $expire = 15; 21 22 public function getExpire() { 23 return $this->expire; 24 } 25 26 public function decrementExpire() { 27 $this->expire--; 28 return $this->getExpire(); 29 } 30 31 // 価格取得のオーバーライド 32 public function getPrice() { 33 $price = parent::getPrice(); 34 35 if($this->expire <= 10) { 36 // 残り賞味期限が10日以下になったら半額 37 $price = $price / 2; 38 } 39 return $price; 40 } 41 }
実行結果
賞味期限:15日 価格:97 賞味期限:14日 価格:97 賞味期限:13日 価格:97 賞味期限:12日 価格:97 賞味期限:11日 価格:97 賞味期限:10日 価格:48.5 賞味期限:9日 価格:48.5 賞味期限:8日 価格:48.5 賞味期限:7日 価格:48.5 賞味期限:6日 価格:48.5 賞味期限:5日 価格:48.5 賞味期限:4日 価格:48.5 賞味期限:3日 価格:48.5 賞味期限:2日 価格:48.5 賞味期限:1日 価格:48.5
継承元、親クラスのメソッドを見にいってることが分かると。
このあたりから怪しくなってきたぞー。
継承
今更感満載
継承 (extends) とはなんぞ
すでに定義されたクラスの機能を引き継いで、新しいクラスを定義することを
継承 ( extends ) と言います。
なんで継承するの?
まだまだよく分かってないけど、例えば
- 似たような内容なんだけど、ちょこっと違う仕様
そんな時に、継承したクラスを作ると便利じゃね!って話かなと。
それならコピペで作ればいいんじゃね?
とも思ったら、例えば
- 元のコードとコピペコード共通で重複してる箇所にちょっとした変更があった場合 とか
元のコードをコピペして作った場合、コピペ元も、コピペして作成したコードもどっちも修正しなくちゃならん!ってことになると。
これがコピペコードが1個ならまだKIAIで乗り切れるけども、10個以上作成してた場合はKIAIで乗り切れる気がしなくなってくると。
親クラス、スーパークラス
3 class Product { 4 protected $name; 5 protected $price; 6 7 public function __construct($name) { 8 $this->name = $name; 9 } 10 11 public function setPrice($price) { 12 $this->price = $price; 13 } 14 15 public function getPrice() { 16 return $this->price; 17 } 18 }
継承クラス、子クラス
20 class FoodProduct extends Product { 21 private $expire; 22 23 public function setExpire($expire) { 24 $this->expire = $expire; 25 } 26 27 public function getExpire() { 28 return $this->expire; 29 } 30 31 public function getName() { 32 return $this->name; 33 } 34 }
継承クラスを実体化、インスタンス生成
36 $food = new FoodProduct('肉'); 37 $food->setExpire(100); 38 echo '価格を' . $food->getExpire() . '円に設定しました。'; 39 40 $food->setExpire(30); 41 echo '賞味期限を' . $food->getExpire() . '日に設定しました。'; 42 43 echo '商品は' . $food->getName() . 'です。';
実行結果
価格を100円に設定しました。 賞味期限を30日に設定しました。 商品は肉です。
継承クラスには書かれてない setPrice(), getPrice() メソッドの実行も継承してるからできるよ!
継承元クラスのプロパティも参照できるよ!
もしsetPrice(), getPrice() の内容が変わっても、継承元クラスを書き換えれば継承クラスすべてに反映されるよ!
ってなところが、オブジェクト指向で継承が重要と言われる理由なのかなと最近やっとひとつ学びました。
継承元クラスが書き換わったら折角いい塩梅だった、継承先クラスの内容が変わっちまったじゃねーかどーしてくれるんだバカー!
って状態になった時の為に、偉い人は言ったとか言わないとか。
You オーバーライド しちゃいなよ。 次回へ続く。続いたらいいな
phpMyAdmin のインストール
phpMyAdminをインストールしてみます
phpMyAdmin のダウンロード
参照:phpMyAdmin プロジェクト日本語トップページ - SourceForge.JP
例の如く、wget でダウンロードできなかったので、とりあえず windows上で、Linux用 phpMyAdmin をダウンロード。現時点での最新版。
php, mysql のバージョンによっては、前のバージョンの phpMyAdmin が必要になるらしい。最新版を入れても、これと言ったエラーはまだ出てないので大丈夫なはず...多分...恐らく...きっと(:D)rz
phpMyAdmin-4.0.4-all-languages.tar.bz2
アップロード
FTPクライアントを使って、ダウンロードしてきたブツをアップロードする。
コムギコカナニカダ
圧縮ファイルの展開
ファイルの展開
- 展開先ディレクトリに移動し、ファイルを展開する。
tar jxf phpMyAdmin-4.0.4-all-languages.tar.bz2
- 展開したディレクトリに移動し、設定ファイルを編集
cd phpMyAdmin-4.0.4-all-languages/ cp config.sample.inc.php config.inc.php
設定ファイルを編集せずにそのままでも、一応動く。
※ 追記
色々とエラー文が出てたので対処
Pukiwiki のインストール
参照:FrontPage - PukiWiki-official
ローカルで設定後、FTPでアップロードの流れが一般的らしい。
今回はお勉強の為、下記の流れで設定してみる。*1
サーバ側で解答 ==> 設定 ==> パーミッションの確認
Pukiwikiのダウンロード
本当はダウンロードから全部 Linux 上でやりたかったんだけど、wget コマンドでダウンロードに失敗したので、windows からダウンロード。
wget コマンドの使い方も怪しい...
pukiwiki-1.4.7_notb_utf8.tar.gz
設定
圧縮ファイルの展開
解凍先のディレクトリに移動して、tar コマンド
tar -xvf pukiwiki-1.4.7_notb_utf8.tar.gz
展開したファイルに移動後、設定ファイルの編集
cd pukiwiki_1.4.7_notb_utf8 vim pukiwiki.ini.php
- 管理者の名前の変更
#$modifier = 'anonymous'; $modifier = 'riceplanting'; # 管理者名を変更
- サイトを変更
#$modifierlink = 'http://pukiwiki.example.com/'; $modifierlink = 'http://pukiwiki.hogehoge.com/'; # 自分のサイトに変更
- 管理者パスワードの変更
md5で暗号化されたパスワードを生成
[]$ echo -n 'sample_password' | md5sum #sample_password を md5 で暗号化 e15d45d5e4030015e668ba8f863569ce -
生成したパスワードを使って管理者パスワードの変更
#$adminpass = '{x-php-md5}!'; $adminpass = '{x-php-md5}' . 'e15d45d5e4030015e668ba8f863569ce'; #暗号化したパスワードを入力
パーミッションの確認
パーミッションを適せん変更していく
(777) ディレクトリの権限変更
- attach
- backup
- cache
- counter
- diff
- trackback
- wiki
chmod 777 attach/ backup/ cache/ counter/ diff/ trackback/ wiki/
(666) ファイルの権限変更 cache/
- autolink.dat
- entities.dat
- recent.dat
- *.ref
- *.rel
cache ディレクトリ移動後
chmod 666 *.dat *.ref *.rel
(666) ファイルの権限変更 wiki/
- *.txt
wiki ディレクトリ移動後
chmod 666 *.txt
動作確認
ブラウザでアクセスしてエラーが出てないか確認。
http://pukiwiki.hogehoge.com/pukiwiki-1.4.7_notb_utf8/
あまりにもディレクトリ名が拙いので
mv pukiwiki-1.4.7_notb_utf8/ wiki/
こんな感じでインストール作業完了かな?
logwatch
logwatch はさまざまなログを収集・整形し、メール送信してくれる。
めっちゃ便利ですやん。
早速インストールする
yum install logwatch
動作確認をする
logwatch --print
logwatch のメール送信先を変更する
デフォルトでは root 宛になってるらしい
logwatch からメール送信の動作確認をする
logwatch --mailto foo@example.com
logwatch のメール送信先設定を変更する
- /etc/logwatch/conf/logwatch.conf
Mailto=foo@example.com
メールサーバ構築
ハマったところをメモ。
こちらを参考にしました
CentOS 6 - SSL証明書を作成する : Server World
CentOS6.2 でメールサーバーを構築した - 俺の成長日記
さくらVPSのCentOS 6.3にメールサーバ Postfix/Dovecotをインストール - 酒と泪とRubyとRailsと
自己証明書を作成
証明書の作成自体は参考にさせて貰ったページ通りに進めたら問題なく作成完了。
なぜ、証明書が必要なのぜ?
肝心の、なぜ証明書が必要なのかがいまいち理解していないという・・・ナンテコッタイ
SMTPサーバ構築
基本的に参考ページ通りに進めたら出来たんじゃなかろうか
saslauthd (SMTP-Auth) の設定
- /etc/sasl2/smtpd.conf
/etc/rc.d/init.d/saslauthd start chkconfig saslauthd on
POP/IMAPサーバ構築
- /etc/dovecot/conf.d/10-ssl.conf
- /etc/dovecot/conf.d/10-auth.conf
- /etc/dovecot/conf.d/10-master.conf
- /etc/dovecot/conf.d/10-mail.conf
- /etc/dovecot/dovecot.conf
service postfix start chkconfig postfix on service dovecot start chkconfig dovecot on
と、設定自体はここまで順調かなと思ってたんです。ここまでは。
ハマった箇所
メールクライアントでの設定
Mozilla thunderbird で新規アカウントを作成しようとしたら、
「アカウントを見つけられませんでした」と出る。何がダメなのや!と悩む
ポートが開いていない
nmap を使ってポートスキャンをしてみる。ポートが閉じてました(:D)rz
iptables の設定
iptables... ややこしい子ッ!
ここがすごく参考になりました。
iptablesの設定
参考ページを元に、該当ポートを開ける。
なのに、未だに「アカウントを見つけられませんでした」と出る。
postfix を再起動をしてみる
iptables の設定の変更を何回も試し、その度に iptables を再起動はしてたんです。
何度やってもダメだったので、試しに postfix を再起動してみたら繋がりました。
何がダメだったんだろう。
もしや postfix の設定変更してから再起動してなかったんだろか・・・