[XAMPP] Surface Pro 2に開発環境を作ろう!

せっかくのSurface Pro 2なので、いろいろな開発環境を入れておこうと思います。いずれも、セットアップと、Hello,Worldまでね。

最初はXAMPP。
X(クロスプラットフォーム)でA(Apache)/M(MySQL)/P(PHP)/P(Perl)を一括してインストールしてくれるパッケージです。
インストールするだけで、Webサーバとプログラムの連携設定までしてくれます。サーバ起動停止管理ツールもあってこりゃあ楽だ。

日本語版ページはこちら。

XMAPP
http://www.apachefriends.org/jp/xampp.html

Windows版のページはこちら。

XMAPP for Windows
http://www.apachefriends.org/jp/xampp-windows.html

今回はzip版でインストールしました。ダウンロードした後、zip内の「xampp」フォルダをそのまま「C:\xampp」に展開すれば完了です。フォルダ内のxampp-control.exeを起動します。
20131230_XMAPP_1

XAMPPコントロールパネルのServicesからApacheをStart。
20131230_XMAPP_3
起動後、Adminを押すと、Apache管理画面が開きます。

20131230_XMAPP_2

これでもうローカルでApache動いてるわけですね。簡単。リンクから、Phpinfo()とPerlInfo()も確認しておきましょう。


MySQLも起動してみます。XAMPPコントロールパネルのServicesからMySQLを起動。

20131230_XMAPP_4

mysqld.exeの起動で、Windowsからセキュリティの重要な警告が出ると思いますのでプライベートネットワーク上の通信を許可します。

インストール時点ではrootパスワードが未設定なので、設定しておいてください。
こちらがくわしいです。

AdminWeb 管理者アカウントのパスワード設定
http://www.adminweb.jp/xampp/mysql/index2.html

MySQL Admin起動。rootパスワード設定した場合は、ログイン画面が出ると思いますので
ID:root / PW:設定したパスワード でログインしてください。

20131230_XMAPP_5

MySQLまでこんな簡単に起動完了しました。

適当にテーブル作ってみます。最初から用意されているtestデータベースに作ってもいいですが、せっかくなのでデータベースも新しいのを作成しましょう。

DBOnlineサイトに、良い解説があります。

DBOnline データベースの作成
http://www.dbonline.jp/phpmyadmin/database/index1.html

 

家アイコンを押してホーム画面を表示して、データベースタブを選択。
DB名は、DBOnlineの例に合わせてPersonalとしておきます。
20131230_XMAPP_6
Personalデータベースを選択してテーブルを作成。テーブル名は適当に「pokemon」とでもしておきます。カラムはvarchar(255)「name」とvarchar(255)「voice」の2カラムで
nameをプライマリキーにします。テーブルの照合順序にutf8_general_ci指定しておいてください。
20131230_XMAPP_7
画面では見切れてますが、最後のほうにMIME タイプ/ブラウザ変換機能/変換オプションって項目があります。これら、実は今、初めて見ました。なんかWebアプリ作るには便利そうな雰囲気の機能ですね。後で調べてみよう。
SQLタブから、「show create table pokemon」を実行すると、テーブルCREATE文が確認できます。こんな感じでした。
CREATE TABLE `pokemon` (
`name` varchar(255) NOT NULL,
`voice` varchar(255) NOT NULL,
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
テーブルに値を入れます。
20131230_XMAPP_8
入りました。
20131230_XMAPP_9
簡単な開発だけなら、phpMyAdminだけで十分ですが、DBを本格的に使うのであれば
MySQLクライアントアプリ(MySQL WorkbenchやHeidiSQL)を入れましょう。これは、またいずれ。

DBテーブル準備できたので、PHPからDBに接続して、テーブル内容を読み込んでみます。
作成するファイルのフォルダは、XAMPPフォルダと別にしておきたいので
httpd-xampp.confにフォルダ指定追加します。
    <IfModule alias_module>
                :
        Alias /xamppWork "D:/xamppWork/"
    <Directory "D:/xamppWork">
    Require all granted
    </Directory>
    <IfModule alias_module>
ちなみにDドライブはSDカードです。
DBに接続して、先ほどのテーブルを読み込むphpを書きます。
hello.php
<html>
<head>
<title>Hello,Pokemon</title>
</head>
<body>
<?php

$connect = mysql_connect('localhost','root','password');

if (!$connect) {
   die('データベースサーバ接続失敗'.mysql_error());
}

$database = mysql_select_db('personal',$connect);

if (!$database) {
   die('データベース選択失敗'.mysql_error());
}

mysql_set_charset('utf8');

$result = mysql_query("SELECT name,voice FROM pokemon order by name");
if (!$result) {
    die('SELECT失敗'.mysql_error());
}
while ($record = mysql_fetch_assoc($result)) {
    print('<p>');
    print('「こんにちは、'.$record['name'].'!」');
    print('「'.$record['voice'].'!」');
    print('</p>');
}
$close = mysql_close($connect);
?>
</body>
</html>
実行してみる。
20131230_XMAPP_10
見事に文字化け。
見直してみたら、PHPファイルをS-JISで作成してました。UTF-8で保存しなおして再実行。
20131230_XMAPP_11
あいさつ成功。DBの値が取れています。
だた、「Deprecated: mysql_connect():」って言われていますね。PHP5.5だと、DB接続には、PDO(PHP Data Object)を使えってことらしいです。
接続をPDOにしてみます。
hello_pdo.php
<html>
<head>
<title>Hello,Pokemon</title>
</head>
<body>
<?php

$dsn = 'mysql:dbname=personal;host=localhost';
try{
    $dbh= new PDO($dsn,'root','password');
    $dbh->query('SET NAMES utf8');
    $sql = 'SELECT name,voice FROM pokemon order by name';
    foreach ($dbh->query($sql) as $record ){
        print('<p>');
        print('「こんにちは、'.$record['name'].'!」');
        print('「'.$record['voice'].'!」');
        print('</p>');
    }
} catch (PDOException $e) {
    die('データベースエラー'.$e->getMessage());
}

$connect = null;

?>
</body>
</html>
20131230_XMAPP_12
同じ出力が得られました。警告も消えてます。
文字化け防止の「SET NAMES utf8」に関しては、設定方法としては、あまりよろしくないらしい。なのだけれど、どうすればいいのかよくわからなかったのでこのまま。

もうひとつの「P」、Perlからも接続してみます。
CGIの動作を有効にするために、httpd-xampp.confに、「Options ExecCGI」を追加。
Alias /xamppWork "D:/xamppWork/"
<Directory "D:/xamppWork">
Options  ExecCGI
Require all granted
</Directory>
perlを書く。
hello.pl
#!C:/xampp/perl/bin/perl

use DBI;

print <<END;
Content-type: text/html

<html>
<head>
<title>Hello,PerlPokemon!</title>
</head>
<body>
END

$database = "personal";
$host = "localhost";

$dsn = "DBI:mysql:database=$database;host=$host";
$dbh = DBI->connect($dsn,"root","password");
$dbh->do("set names utf8");

$sth = $dbh->prepare('SELECT name,voice FROM pokemon ORDER BY name');

$sth->execute;

$num_rows = $sth->rows;

for($i = 0;$i < $num_rows; $i++) {
    @record = $sth->fetchrow_array;
    print "<p>";
    print "「こんにちは、$record[0]!」";
    print "「$record[1]!」";
    print "</p>";
}

$sth->finish;

$dbh->disconnect;

print <<END;
</body>
</html>
END
ブラウザからだと、500番エラーしかわからないので、エラー確認するためにはコマンドプロンプトから「C:\xampp\perl\bin>perl d:\xamppWork\hello.cgi」のように直接動作させてみるのがいいです。
そうして実行させてみると、「libmysql_.dll」モジュールがないと言われた。
20131230_XMAPP_13
エラーメッセージも出ている。
    install_driver(mysql) failed: Can't load 'C:/xampp/perl/vendor/lib/auto/DBD/mysq
    l/mysql.dll' for module DBD::mysql: load_file:指定されたモジュールが見つかりませ
    ん。 at C:/xampp/perl/lib/DynaLoader.pm line 190.
    at (eval 4) line 3.
    Compilation failed in require at (eval 4) line 3.
    Perhaps a required shared library or dll isn't installed where expected
    at d:\xamppWork\hello.cgi line 14.

うーん、めんどくさそうだな。libMySQL.dllで検索すると、ダウンロードできるサイトがあったので、ダウンロードして、libMySQL.dll を libMySQL_.dllにリネームして、XAMPPのPerlのMySQL関連のフォルダ(C:\xampp\perl\vendor\lib\auto\DBD\mysql)にコピー。

20131230_XMAPP_14
動いた。いいのかなこれで?グダグダですが、動くとこまで持ってきたので、ひとまずはこれで。
Perlは以前(まだcgi全盛の数年前のことですが)日本語文字化けで苦労した覚えがあったのですけども、PHP同様の、「SET NAMES utf8」だけで解決しちゃうのですね。

XAMPPに関してはここまでです!