Eclipseで.tplの設定

EclipseSmartyのテンプレートファイル拡張子tplをhtmlファイルとして関連付ける方法です。

メニューバーから「ウィンドウ」→「設定」→「一般」→「コンテンツタイプ」→「テキスト」→「HTML」まで行くと下の「ファイルの関連付け」ボックスにHTMLに関連付ける拡張子の一覧が表示されるので、「追加」から「.tql」を関連付けてあげる。

MySQLによる完全外部結合

MySQLでは、FULL OUTER JOINが使えないので、UNIONで複数のSELECT文のデータの取得を行い、その結果を結合して1つのデータとして取得します。

以下の2つのテーブルに対して完全外部結合を行います。

fruits1 (テーブル名)

id name
1 リンゴ
2 オレンジ
4 バナナ

fruits2 (テーブル名)

id name
1 グレープ
3 モモ
4 イチゴ
5 マスカット
外部結合を使う方法
select f1.id, f1.name, f2.id, f2.name from fruits1 f1 left join fruits2 f2 on f1.id=f2.id 
union 
select f1.id, f1.name, f2.id, f2.name from fruits1 f1 right join fruits2 f2 on f1.id=f2.id
結果
id name id name
1 リンゴ 1 グレープ
2 オレンジ NULL NULL
4 バナナ 4 イチゴ
NULL NULL 3 モモ
NULL NULL 5 マスカット

ホストOSからゲストOSにSSHでアクセスする

VMware PlayerにインストールしたUbuntuにopensshサーバーの設定を行い、ホストOSからSSHで接続してリモート操作を行えるようにするための設定方法。

以下の環境で設定を行いました。
ホストOS : windows7
ゲストOS : ubuntu11.10
SSHターミナルソフト : TeraTarm

opensshのインストール (Ubuntuでの作業)

端末を起動して以下のコマンドを実行します。

$sudo apt-get update
$sudo apt-get install openssh-server

続いてSSHのモジュールもインストールします。

$sudo apt-get install ssh

opensshのコンフィグファイルの設定 (Ubuntuでの作業)

以下のコマンドでコンフィグファイルを開いて設定の変更をします。

$ sudo nano /etc/ssh/sshd_config

最初の接続方法としてID、PASSWORDの入力方式とするため以下の様に修正します。
PasswordAuthenticationはパスワード認証を許可するかどうかの設定。

#PasswordAuthentication yes (コメントを解除する)
↓
PasswordAuthentication yes

configの設定を変更した後は内容を適用させる為、以下のコマンドを実行します。

$sudo invoke-rc.d ssh reload

TeraTermの設定 (Windowsでの作業)

TeraTermを起動すると以下のダイアログが表示されるので、ホストにUbuntuのIPを入力して、SSHバージョンをSSH2に設定して「OK」をクリック。
UbuntuIPアドレスの確認方法はUbuntuの端末に「ifconfig」と実行して、「inetアドレス」に記述されている数字です。

続いて以下のダイアログが表示するのでユーザー名とパスフレーズをそれぞれ入力して、「プレインテキストを使う」にチェックをして「OK」をクリック。

以下の様に接続されていれば成功です。

これでクライアント(Windows)からUbuntuのサーバーに接続してリモート操作が出来る環境にはなりましたが、パスワードの認証だけではセキュリティ的にもあまりよろしくないので、公開鍵認証で接続する環境を設定します。
公開鍵認証とは何かというと、クライアントで秘密鍵と公開鍵を生成し、公開鍵の方をサーバーに登録することで、クライアントの秘密鍵とサーバーの公開鍵で照合を行い接続を認証するシステムです。

公開鍵と秘密鍵の作成 (Windowsでの作業)

TeraTermのメニューから「設定」→「SSH鍵生成」をクリック。

基本的にはデフォルトでチェックが入っている「RSA」を選択し、「生成」をクリックします。「公開鍵の保存」と「秘密鍵の保存」ボタンがアクティブになるので任意の場所に保存します。

「id_rsa」と「id_rsa.pub」の二つのファイルが出来ます。
「id_rsa」は秘密鍵なのでそのままクライアント側に保存。
「id_rsa.pub」は公開鍵で、こっちをサーバに登録します。

opensshに公開鍵を設定 (Ubuntuでの作業)

先程クライアント側で生成した公開鍵をUbuntuホームフォルダに転送します。
続いて以下のコマンドを実行します。

$sudo mkdir .ssh(.ssh/ディレクトリがまだ作成されていない場合はこのコマンドを実行して作成します。)
$sudo cat id_rsa.pub>>.ssh/authorized_keys

これで公開鍵を「.sshディレクトリ内の「authorized_keys」ファイルに追記しています。

opensshのコンフィグファイルの設定(Ubuntuでの作業)

以下のコマンドでコンフィグファイルを開き設定を変更します。

$sudo nano /etc/ssh/sshd_config

以下の様に設定の変更を行います。

PermitRootLogin no (root ログイン許可)
ChallengeResponseAuthentication no (チャレンジ・レスポンス認証)
PasswordAuthentication no (パスワード認証)
UsePAM no (PAM の使用)

コンフィグの設定をしたら内容を適用させます。

$sudo invoke-rc.d ssh reload

そして再起動をしておく。

$ sudo /etc/init.d/ssh restart 

TeraTarmから鍵認証でアクセスする (Windowsでの作業)

まずは先程のPassword方式ではアクセスできないようになっているか確認します。

設定が反映されてPassword方式ではアクセスできないようになっています。

次に鍵認証でアクセスできるか確認します。
先程の画面から「ユーザー名」、「パスフレーズ」を入力して「RSA/DSA鍵を使う」にチェックを入れて、「秘密鍵」ボタンをクリックしてください。
ダイアログから秘密鍵「id_rsa」を選択して「OK」をクリック。
問題がなければこれで無事にアクセスできるようになっています。

PHPで数値かどうかのチェック

ユーザーから入力された値が10進整数値かどうかのチェックにis_numeric()関数を使用してはいけません。
is_numeric()関数は数字または数値形式の文字列であるかどうかを調べる関数なので、16進数や浮動小数点数の形式であってもtrueを返します。
例えば「0xFF」や「12.34」や「+1」という値が入力されてもtrueを返してしまいます。

なので数値チェックを行うのは正規表現を使用するのがいいかなと思います。

preg_match("/^[0-9]+$/", $num)

というか数値チェックに限らず、ある程度の入力チェックであれば正規表現での記述で十分なんじゃないかなと思います。

でもあんまり長くなると今度は可読性が悪くなるのかな。

XAMPPにZend Framworkをインストール

事前の環境として
●XAMPP Version 1.7.3
●XAMPPのドキュメントルート「C:\xampp\htdocs」
●Zend FramworkのWebアプリケーションのドキュメントルートは「C:\xampp\htdocs\zend」と設定しています

Zend Framworkのインストール

以下のサイトから「Zend Framework 1.11.11 Full」のzip版をダウンロードします。
http://framework.zend.com/download/latest

ダウンロードしたZIPを展開します。ディレクトリ名にバージョン情報があるので削除して「ZendFramework」とします。
今回展開した場所は「C:\xampp\ZendFramework」としました。
(全部のファイルを移動しなくても「ZendFramework-1.11.1」直下の「library」だけでもよいです。)

Zend Framworkライブラリへのパスを通す

php.iniを編集してZend Framworkライブラリを読み込むように設定します。

変更前
include_path = ".;\xampp\php\PEAR"

変更後
include_path = ".;\xampp\php\PEAR.;C:\xampp\ZendFramework\library"

Apacheの設定

Zend Frameworkでは、URL変換にmod_rewriteモジュールを使用するため、mod_rewriteを使えるように設定します。
※XAMPP 1.7.3ではhttpd.confの設定は特に必要ありませんでした。
C:\xampp\apache\conf\httpd.conf

変更前
#LoadModule rewrite_module modules/mod_rewrite.so

変更後(#を削除してコメントアウトを解除するだけ)
LoadModule rewrite_module modules/mod_rewrite.so

ドキュメントルートを設定以下に設定

DocumentRoot "/xampp/htdocs"

この後に設定するドキュメントフォルダ内の.htaccessの設定を有効にするため以下の様に設定します。

<Directory "/xampp/htdocs">
    AllowOverride All
</Directory>

Webアプリケーションのルートを「C:\xampp\htdocs\zend」とするので、そのディレクトリ内に.htaccessファイルを作成して、以下の内容を記述します。

RewriteEngine on
RewriteBase /
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

これで拡張子がjs、ico、gif、jpg、pngcss以外のリクエストは全てフロントコントローラ(index.php)に渡されるようになります。

php.iniの設定を変更した場合は、Apacheを再起動しないと設定が反映されないのでApacheを再起動します。

Zend Frameworkの動作確認

ドキュメントルート「C:\xampp\htdocs\zend」にindex.phpを作成し、以下のスクリプトを記述します。

<?php
	require_once'Zend/Version.php';
	echo Zend_Version::VERSION;
?>

ブラウザのURLにhttp://localhost/zend/index.phpを入力してZend Frameworkのバージョンが表示すればこれでインストールと設定は完了です。

VMware PlayerでLAMP環境構築(2)

前回VMware Playerで仮想環境を作って、その中にLinuxのUbuntu11.10をインストールしました。今回はApacheMySQLPHPをインストールしたいと思います。

taskselでLAMP環境構築

ApacheMySQLPHPを個別にインストールすることもできるのですが、taskselを使用すれば一括でインストールできます。

LAMP serverのインストール

まずは端末を起動して、以下のコマンドを実行してtaskselをインストールします。

# sudo -s
# apt-get install tasksel

以下のダイアログが表示するので「LAMP server」にチェックして「TAB」キーで<了解>に移動して「Enter」キーを押します。(移動は「矢印」キー、選択は「Space」キー。)

MySQLのrootのパスワードが求められるので入力します。
以上で「LAMP server」のインストールは完了です。

Apacheの動作確認

まず、インストール直後はApachePHPを認識しないので、以下のコマンドを実行してApacheの再起動をしておきます。

# service apache2 restart

次にFirefoxを立ち上げて、アドレスバーにhttp://localhostを打ち込むと「It works!」が表示されることを確認します。

UbuntuのtaskselでLAMPサーバーをセットアップした直後のドキュメントルートは、"/var/www"になっています。
Apacheドキュメントルート(/var/www/)の所有者をrootから自分のユーザー名に変更しておきます。

# chown -R [ユーザー名] /var/www/

chownコマンドは、オプションスイッチ "-R" を付けて、ディレクトリを指定して実行すると、そのディレクトリを含めて、以下のディレクトリとファイルの全ての所有者、所有グループを一気に変更することができます。

PHPの動作確認

動作確認用ファイルとしてエディタを開いて以下のPHPファイルを作成します。

<?php phpinfo(); ?>

このファイルを「phpinfo.php」と名前を付けて「var/www」のディレクトリに保存します。
FirefoxのURLに「http://localhost/phpinfo.php」と入力します。以下の画面が表示されるのを確認します。


MySQLの動作確認とphpMyAdminの設定

以下のコマンドを実行し、phpMyAdminをインストールします。

# apt-get install phpmyadmin

途中で設定を聞かれるので「apache2」を選択します。

次に「phpmyadmin のデータベースを dbconfig-common で設定しますか?」と聞かれるので<はい>を選択。

次にパスワードの作成を求められるのでパスワードを入力します。
以上の処理が完了すれば以下のコマンドを実行してApacheを再起動します。

# service apache2 restart

再起動させてからFirefoxのURLに「http://localhost/phpmyadmin」と入力します。以下の画面が表示されます。

最後にexitコマンドを実行してrootから抜けておきます。

# exit

MySQLでのトランザクション

まず前提としてトランザクションの処理を行う時は、テーブルのストレートエンジンをInnoDBに設定します。
(MySQLのデフォルトはMyISAMになっています。)
以下のサンプルはINSERT文を実行して、処理が成功すればコミット、失敗すればロールバックを行っています。

<?php
	//データベース接続
	$conn = mysql_connect('localhost', 'root', '');
	if (!$conn) {
		die("データベース接続失敗");
	}
	//データベース選択
	mysql_select_db('test') or die("データベース選択失敗");
	//文字コード指定
	mysql_set_charset('utf8');
	
	//オートコミットを0に設定
	$sql = "SET AUTOCOMMIT = 0";
	mysql_query($sql);
	
	//トランザクション開始
	$sql = "BEGIN";
	mysql_query($sql);
	
	//INSERT文発行
	$sql = "INSERT INTO test(name) VALUES('test')";
	$res = mysql_query($sql);
	
	if ($res) {
		//成功時はコミットする
		$sql = "COMMIT";
		mysql_query($sql, $conn);
		echo "コミットしました";
	} else {
		//失敗時はロールバックする
		$sql = "ROLLBACK";
		mysql_query($sql, $conn);
		echo "ロールバックしました";
	}
	
	//mysql切断
	mysql_close($conn);
?>

最初にAUTOCOMMITを0にして機能をオフに設定します。デフォルトではAUTOCOMMITの機能はオンになっているので、オンのままだとINSERT、UPDATE、DELETEを実行するとCOMMITする前でもデータは確定されてしまいます。なのでまず最初にAUTOCOMMITの機能をオフにしてからトランザクションを開始します。