オーバーライド

オーバーライドとはなんぞ

「オーバーライド」とは、継承クラスにおいて、親クラスのメソッドを上書きする仕組みの事をいいます。

親クラスのメソッドに追加機能を持たせたい場合、または親クラスのメソッドの機能を殺したい場合などに使用します。

何かの時に継承元のメソッドを書き換えたい時があるんだろう。うん、きっと。何かの時に。

オーバーライドってどうするの?

継承クラス、子クラスで継承元の上書きしたいメソッドと同じ名前のメソッドを作ればOK

継承クラスでオーバーライドした場合

継承元クラス、親クラス よりも先に 継承クラス、子クラスを見に行く。

php で書くとこんな感じらし

継承元、親クラス
  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で乗り切れる気がしなくなってくると。

継承でも同じなんじゃね?

と思ったら、どうもそこら辺はよく出来てるらしい。
きたない。さすが継承きたない。

php で書くとこうなるらし

親クラス、スーパークラス

  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 オーバーライド しちゃいなよ。 次回へ続く。続いたらいいな

pukiwiki のちょっとした変更

pukiwiki をインストールして、便利そうなコマンドなどなどメモってます。
よく使うページのショートカットなんぞを左のメニューに表示させたくて、ちょっといじってみる。

たいしたことはしていない。

pukiwiki のレイアウト変更

インストールしたpukiwiki のディレクトリ名は wiki とします。
トップページの書き出しはcatbody()が担っているっぽい

wiki/lib/pukiwiki.php

129 // Output
130 catbody($title, $page, $body);
131 exit;

catbody()はpukiwikiのユーザ関数みたい
設置位置は wiki/lib/html.php

wiki/skin/pukiwiki.sin.php

grepとかで探してみると、ビューのようなものはこのファイルっぽい

トップページのソースから左のメニューバーのdivタグはmenubarというらし
直接編集する

173    <div id="menubar">
174     <h5>menu</h5>
175     <li>
176      <a title="php (0m)" href="ここにURL">php</a>
177     </li>
178    </div>

こんな感じで、左のメニューによく使うページのショートカットが貼れました。
pukiwiki の中身を見るのさえも一苦労という。
勉強大事や!

phpMyAdmin のインストール

phpMyAdminをインストールしてみます

動作環境

phpMyAdmin のダウンロード

参照:phpMyAdmin プロジェクト日本語トップページ - SourceForge.JP

例の如く、wget でダウンロードできなかったので、とりあえず windows上で、LinuxphpMyAdmin をダウンロード。現時点での最新版。
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でアップロードの流れが一般的らしい。

ローカルで解凍 ==> 設定 ==> FTPで設置サーバーへ転送 ==> パーミッションの確認



今回はお勉強の為、下記の流れで設定してみる。*1

サーバ側で解答 ==> 設定 ==> パーミッションの確認

動作環境
pukiwiki のバージョン

安定最新版の utf-8 にしてみることに。特にこだわりはなかった。

Pukiwikiのダウンロード

本当はダウンロードから全部 Linux 上でやりたかったんだけど、wget コマンドでダウンロードに失敗したので、windows からダウンロード。
wget コマンドの使い方も怪しい...

pukiwiki-1.4.7_notb_utf8.tar.gz

ダウンロードしたら、FTPでサーバにアップロード。ここから Linux 上で設定

設定

圧縮ファイルの展開

解凍先のディレクトリに移動して、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/

こんな感じでインストール作業完了かな?

*1:エラーが出たときは、文字コード・改行コードも調べてみるとよさそう
  文字コードutf-8」, 改行コード「LF」

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と

自己証明書を作成

証明書の作成自体は参考にさせて貰ったページ通りに進めたら問題なく作成完了。

なぜ、証明書が必要なのぜ?

肝心の、なぜ証明書が必要なのかがいまいち理解していないという・・・ナンテコッタイ

なりすまし、データ改ざんなど、防止の為

多分だけど、誰でもメールを閲覧できる状態を回避する為に必要なんじゃなかろうかと

make server.key
openssl rsa -in server.key -out server.key
make server.csr
openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 3650
chmod 400 server.*

SMTPサーバ構築

基本的に参考ページ通りに進めたら出来たんじゃなかろうか

Postfix の設定
saslauthd (SMTP-Auth) の設定
  • /etc/sasl2/smtpd.conf
/etc/rc.d/init.d/saslauthd start
chkconfig saslauthd on

POP/IMAPサーバ構築

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 の設定変更してから再起動してなかったんだろか・・・

メール送信でのSMTP認証に失敗

やっと出来たひゃっほう!と思いメールをテスト送信しようとする。
SMTP認証に失敗しましたと出る。調べる。悩む。発見する。

  • STMPのパスワード
saslpasswd2 -u mail.example.com user_name
  • 設定の確認
sasldblistusers2
  • 認証DBの所有権変更
chgrp postfix /etc/sasldb2 

メール送受信の確認をする

無事、メールの送受信ができることを確認

間違いなく、もう1回やったらハマりそう(:D)rz
iptables 周りはとてもあやしい。Postfix の設定も非常にあやしい・・・!