新しいブログに移動しました。
9ensanのLifeHack
こちらの記事も必要に応じて新しいブログに移動させる予定です。
今後ともよろしくお願い致します。

HOME

UbuntuのApacheでmod_rewriteを有効にする方法

  • 2009.03.20 (金) 14:39
  • 設定

UbuntuにLAMP環境を構築して色々と試しているとあることに気がつきました。

 

mod_rewriteが有効になっていない!!

 

ということでmod_rewriteを有効にしました

まず、

1
sudo a2enmod rewrite

コマンドを実行してmod_rewriteを有効化します。

次に「/etc/apache2/sites-enabled」の中のconfファイルのmod_rewriteを有効にしたい環境の「AllowOverride」をAllに変更する

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Listen 8080
 
<VirtualHost *:8080>
    ServerAdmin webmaster@localhost
 
    DocumentRoot /home/hashizume/work/www/
    <Directory /home/hashizume/work/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow FROM all
    </Directory>
 
    ErrorLog /var/log/apache2/error.log
 
    # Possible values include: DEBUG, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn
 
    CustomLog /var/log/apache2/access.log combined
 
</VirtualHost>

(9行目の部分ね

で、apacheの再起動を行うと。

1
sudo /etc/init.d/apache2 restart

これで、mod_rewriteの有効化は完了です。

対象の環境で本当にmod_rewriteが有効になっているか確かめたらばっちりでした

 

PHP応用 コンタクトフォームの作成 入力チェックの追加

  • 2009.03.16 (月) 20:19
  • PHP

回、作成したコンタクトフォームに入力チェックを追加しましょう。

入力チェックの追加

前回のままでは、名前、メールアドレス、内容どれも空のままでも送信できてしまいます。

なので各項目に以下のようなチェック内容を付加するようにします。

  • 名前
    1.入力必須
    2.20文字以内
  • メールアドレス
    1.入力必須
    2.メールアドレスとして正しいこと
  • 内容
    1.入力必須

上記内容を前回のプログラムに機能追加します。

「confirm.php」を以下のように修正しました。

 ソース:confirm.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
<?php
	$contactname = $_POST["contactname"];
	$contactmail = $_POST["contactmail"];
	$contents    = $_POST["contents"];
	//入力チェック
	$errormsg = array();
	//名前
	if ($contactname == null) {
		$errormsg[] = "名前を入力してください。";
	}
	if (mb_strlen($contactname) > 20) {
		$errormsg[] = "名前は20文字以内で入力して下さい。";
	}
	//メール
	if ($contactmail == null) {
		$errormsg[] = "メールを入力してください。";
	}
	$ret = preg_match("/^[a-zA-Z0-9_\.\-]+?@[A-Za-z0-9_\.\-]+$/", $contactmail);
	if (!$ret) {
		$errormsg[] = "メールを正しい形式で入力して下さい。";
	}
	//内容
	if ($contents == null) {
		$errormsg[] = "内容を入力して下さい。";
	}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="ja">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>コンタクトフォーム</title>
	<style TYPE="text/css">
	<!--
		H1 {
			color: red;
			font-size: 18pt;
		}
		#contact-form th {
			background-color: #9bdbea;
			padding: 10px 20px;
		}
		#contact-form td {
			background-color: #f7f7ef;
			padding: 10px 20px;
		}
		#contact-form td input {
			width: 400px;
		}
		#contact-form td textarea {
			width: 400px;
		}
		form {
			display: inline;
		}
		#errmsg {
			background-color:#E7D3D6;
			border:3px solid #A55952;
			color:#944121;
			font-size:12px;
			margin:10px;
			padding:10px;
			text-align:left;
			width:400px;
		}
	-->
	</style>
</head>
<body>
<h1>コンタクトフォーム</h1>
<?php if (count($errormsg) > 0): ?>
<div id="errmsg">
<?php foreach ($errormsg as $msg): ?><?=$msg?><br />
<?php endforeach; ?>
</div>
<form action="./confirm.php" method="post">
    <table id="contact-form" border="1" cellpadding="0" cellspacing="0">
        <tr>
            <th>
                名前
            </th>
            <td>
                <input type="text" name="contactname" value="<?= $contactname ?>" />
            </td>
        </tr>
        <tr>
            <th>
                メールアドレス
            </th>
            <td>
                <input type="text" name="contactmail" value="<?= $contactmail ?>" />
            </td>
        </tr>
        <tr>
            <th>
                内容
            </th>
            <td>
                <textarea name="contents" rows="10"><?= $contents ?></textarea>
            </td>
        </tr>
        <tr>
            <th colspan="2">
                <input type="submit" value="入力">
            </th>
        </tr>
    </table>
</form>
<?php else: ?>
<table id="contact-form" border="1" cellpadding="0" cellspacing="0">
	<tr>
		<th>
			名前
		</th>
		<td>
			<?= $contactname ?>
		</td>
	</tr>
	<tr>
		<th>
			メールアドレス
		</th>
		<td>
			<?= $contactmail ?>
		</td>
	</tr>
	<tr>
		<th>
			内容
		</th>
		<td>
			<?= $contents ?>
		</td>
	</tr>
	<tr>
		<th colspan="2">
			<form action="./end.php" method="post">
				<input type="hidden" name="contactname" value="<?= $contactname ?>">
				<input type="hidden" name="contactmail" value="<?= $contactmail ?>">
				<input type="hidden" name="contents" value="<?= $contents ?>">
				<input type="submit" value="送信" />
			</form>
			<form action="./input.php" method="post">
				<input type="hidden" name="contactname" value="<?= $contactname ?>">
				<input type="hidden" name="contactmail" value="<?= $contactmail ?>">
				<input type="hidden" name="contents" value="<?= $contents ?>">
				<input type="submit" value="内容修正" />
			</form>
		</th>
	</tr>
</table>
<?php endif; ?>
</body>
</html>

これで、入力チェックを行うことができます。

不正な入力値を除いて、正しく入力されている場合のみ最後の送信まで行えます。

例えば、未入力で入力ボタンを押下すると

contactform02-01

このように、入力エラーとなり先に進むことができなくなります。

変更した後のデモは「こちら」から確認できます

今回で入力チェックを行うことができました。

 

プログラムの考察

ここまでで、コンタクトフォームとしての機能は満たしました。

ですが、プログラムとしてはどうでしょうか?

  • 「input.php」
  • 「confirm.php」
  • 「end.php」

何か無駄な点とプログラムとしてわかりづらい点があります。

  1.  input.phpとconfirm.phpの中に同じHTMLの記述がある
  2. confirm.phpの中に入力チェックである業務ロジックと画面表示部分であるHTMLのロジックが混在していてプログラムがメンテナンスしづらい
  3. end.phpの中にメール送信部分と、送信完了画面のHTMLのロジックが混在していてプログラムのメンテナンスしづらい

簡単にプログラムのまずい部分をあげただけでも3つもでてきました。

これくらいの小さなプログラムだったらこれでもいいかもしれませんが、もっと大規模プログラムだったらどうでしょうか?

メンテナンス出来ないとんでもないプログラムが出来上がると思います。

 

では、どうすればよいでしょうか?

最低、画面表示部分業務ロジック部分は最低限分ける必要があると思います。

 e794bbe99da2e981b7e7a7bb

では、その業務ロジックと画面表示部分を分離させる設計方法はどのようにしたら便利になり、ソースコードのメンテナンス性が向上するでしょうか?

ここでソフトウェアの設計手法の一つでMVCモデルというものを紹介したいと思います。

どのようなものかというと

処理の中核を担う「Model」、表示・出力を司る「View」、入力を受け取ってその内容に応じてViewとModelを制御する「Controller」の3要素の組み合わせでシステムを実装する方式

です。

入力はまず、全ての処理を制御するContorollerに処理を委譲します。

Controllerが入力の内容から、適したModelを呼び出し、その結果に応じて必要なViewを表示するように実装します。

今回ならControllerが入力チェックを行うModelを呼び出しその結果に応じて、確認画面を表示するViewを呼び出すかまたは、入力画面のViewを呼び出すように実装されます。

 

そのような処理を書きますが、毎回、毎回、同様の処理を記述するのはばからしいのでフレームワークというものが先人の知恵で作られています。

 

フレームワークとは、開発する際に頻繁に必要とされる汎用的な機能をまとめてあるアプリケーションのことです。

 

次回は、PHPでのMVCフレームワークで私がよく使用しているCodeIgniterというフレームワークについて勉強していきたいと思います。

PHP応用 cURLを利用したスパイダーツールを作ってみよう。

  • 2009.03.15 (日) 20:11
  • PHP

PHPのcURLを利用したスパイダーツールを作ってみようと思います

ここで紹介するプログラムは、色々な文献を参考に作っていますが、相手のサイトへかかる負荷を考えたプログラムになっていないものもたくさんあります

データをクロールする相手サイトのことも考えて利用するようにしてください。

ずは、簡単にデータを取得するプログラムを作りたいと思います。

データを取得することができないと何も始まらないからです。

では、

php-spider-01

この有名サイトからロゴマークを取得するプログラムを作ってみます。

 cURLを使用するためにパッケージが足りないので追加します。

1
sudo apt-get install php5-curl

これでcURL関数が使えるようになります。

 コマンドラインPHPを実行するフレームワークもどきをつくりました。

php-spider-02

フォルダ構成はこんな感じです。

で、重要な、「httpget.php」と「curl.php」を説明します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php
/**
 * cURLクラス
 *
 * cURLを使用してファイルを取得する
 *
 * @access public
 * @author Masaru Hashizume <hashizume@m.email.ne.jp>
 * @copyright Copyright (c) 2009, Masaru Hashizume
 * @version 1.00
 * @since 2009/02/24
 */
class Curl {
 
	/**
	 * cURLハンドラー
	 */
	private $curl_handler = null;
 
	/**
	 *
	 * コンストラクタ
	 *
	 * @access public
	 * @return void
	 */
	public function __construct()
	{
		$this->curl_handler = curl_init();
	}
 
	/**
	 *
	 * デストラクタ
	 *
	 * @access public
	 * @return void
	 */
	public function __destruct()
	{
		curl_close($this->curl_handler);
	}
 
	/**
	 *
	 * HTTP GETで引数で指定したURLのデータを取得する
	 *
	 * @access public
	 * @param  string URL
	 * @return mixed
	 */
	public function get($url)
	{
		//入力値のチェック
		if (!$url) { return false; }
 
		//cURLのオプション設定
		curl_setopt($this->curl_handler, CURLOPT_URL, $url);
		curl_setopt($this->curl_handler, CURLOPT_HEADER, false);
		curl_setopt($this->curl_handler, CURLOPT_RETURNTRANSFER, true);
 
		//URL情報取得
		$data = curl_exec($this->curl_handler);
		return $data;
	}
 
}
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
/**
 *
 * HTTP GETメソッドでデータを取得しファイルに保存する
 *
 * @access public
 * @author Masaru Hashizume <hashizume@veryposi.info>
 * @copyright Copyright (c) 2009, Masaru Hashizume
 * @version 1.00
 * @since 2009/03/15
 */
 
$url = $param[0];
//正規表現によるファイル名の抽出
$reg = ".*\/(.*?)$";
mb_ereg_search_init($url, $reg, "ms");
$filename = mb_ereg_search_regs();
//データの取得
$curl = new Curl();
//ファイルへのデータの保存
file_put_contents($filename[1], $curl->get($url));
?>

コマンドを実行すると

1
php cli.php httpget http://k.yimg.jp/images/top/sp/logo.gif

 php-spider-03

 「logo.gif」が作成されます。

logo

これがダウンロードされたロゴです。

これでHTTPのGETリクエストでファイルを取得することができました

今回使ったプログラム一式:cli

スクリーンキャプチャソフト EasyShot

  • 2009.03.15 (日) 10:23
  • ソフトウェア

ログを書いている時に、必要になってくるソフトがスクリーンキャプチャソフトです。

私が使っているスクリーンキャプチャソフトは「EasyShot」というソフトです。

某ソフトダウンロードサイト「Vect〇r」では「WinShot」というスクリーンキャプチャソフトがとても人気があるけれど使い勝手はEasyShotの方が上だと思います。

  • キャプチャ イメージの印刷、保存、クリップボード、メール送信、FTP 転送が可能
  • フルスクリーン、ウィンドウ、クライアント、任意の矩形範囲をキャプチャ可能
  • マウスカーソル、メニュー、ツールバーも含めてキャプチャ
  • 不定形ウィンドウも正確にキャプチャ
  • キャプチャと同時にイメージの伸縮や反転、及びテキストや画像の埋め込み
  • スケジュール機能で自動実行
  • ホット キー操作から指定時間遅れてキャプチャする遅延キャプチャ
  • ファイル保存後に指定アプリケーションで自動オープン
  • ホット キーやオペレーションなどを多彩にカスタマイズ可能
  • フォーマットは BMP/JPEG/PNG/GIF に対応。透過(PNG/GIF)もOK

などなど、機能的にはすぐれていると思います。

月額125円からのレンタルサーバ
easyshot
無制限機能盛りだくさんのレンタルサーバー

プレビューを見ながらキャプチャした画像を印刷、や保存、クリップボード、メール、FTPを選択することができます。

なかなか使い勝手のよいソフトです

ダウンロードはこちら「EasyShot」からできますので試してみてください。

アイデアプロセッサ Frieve Editor

  • 2009.03.15 (日) 09:03
  • ソフトウェア

近はやっているアイデアマップ、それをパソコン上で実現するソフトが有料、無料を問わずたくさんあります。

最も優れているソフトは、「iMaindMap」だと思います。パソコン上で本当のアイデアマップが作成できます。

でも、このソフトは有料で誰もが簡単に使えないところが残念なところです

 

そこで今回おすすめしたいソフトが「Frieve Editor」です

iMaindMapのように本格的なマインドマップを作成することはできないですが、アイデアをまとめるのに最適な機能は全て持っていると思います。

機能紹介映像を見てもらえたらすごさがわかると思います。

オススメ!!レンタルサーバー

月額1,050円で高機能・安心レンタルサーバー

これを一度使いだしたら、他のソフトを使ってアイデアをまとめることはもうできません。

一度使ってみてください

ダウンロード先は、こちら 「Frieve Editor」です。

お薦めのレンタルサーバー
広告
お薦めの書籍
HOME