※ パクレゼルヴではWeb開発エンジニアを大募集中!詳細はこちら

Archive

Archive for 2010/4

うごくひと2。(初投稿)  

2010/4/30 金曜日 18:09:36

はじめまして!今年から新卒で入社したつっしーです。
のびーにょさんの後輩になります。
早く業務に慣れて活躍できるようになるのが目標ですが、会社のプログラムは、学生時代に僕が触ってきたプログラムと比べて、とても複雑・・・早く慣れたいなぁ。

今、「うごくひと2」という携帯アクセス解析ツールについて調べています。
うごくひと2は、通常版を使う場合、解析対象ページに

<img src="**********?u=********&amp;guid=ON&amp;ut=*&amp;h=********" alt="携帯アクセス解析" height="1" width="1" />

このコードを追加するだけなのですが、今回は上級版を使おうと思います。
まず、通常版コードのURLとパラメータを正規表現を使って抽出し、serialize関数を使ってシリアル化します。

//url抽出
$tag_regex = '/<img \s[^/>]*?src\s*=["\'](([^\"]*)[^>]*)[/]/i';
preg_match($tag_regex,$_POST['bic_analytics'], $matches);
//urlのみ取得
$url_regex = '/http[^\?]*/';
preg_match($url_regex,$matches[2],$matcheurl);

$param_bic = array();
$param_bic[url] = $matcheurl[0];
//URLを分解して配列で返す
$strtest = parse_url($matches[2]);
//パラメータ取得
foreach($strtest as $key => $var){
	if($key == 'query'){
		$keyword = explode('&amp;', $var);
		foreach($keyword as $vval){
			$bic = explode('=',$vval);
			if($bic[0] != 'guid'){
				$param_bic[$bic[0]] = $bic[1];
			}
		}
	}
}
$bic_analytics = serialize($param_bic);

正規表現で通常版コードの中の必要な部分を抽出してシリアル化してます。
URLのパラメータ抽出も正規表現で抽出しようかと思いましたが、parse_url関数を使ったほうがいいよ、という助言をいただいたので使っています、実際そのほうが簡単でした。

$param_bicの中はこうなってます。

Array
(
[url] => ************
[u] => *******
[ut] => *
[h] => ******
)

これをserializeするとこうなります。

a:4:{s:3:"url";s:1:"************";s:1:"u";s:1:"*******";s:*:"ut";
s:1:"*";s:1:"h";s:1:******";}

これをunserializeしたら元に戻ります。
この各要素を、上級版コードのURLに入れていきます

$ret = $_POST['bic_analytics'];
//unserializeして元の配列に戻す。
$arrBic = unserialize($ret);

//配列の要素をURLに入れる。
$UH2url  = $arrBic['url'].'?u='.$arrBic['u'].'&amp;h='.$arrBic['h'].'&amp;ut='.$arrBic['ut'].'&amp;guid=ON&amp;qM=';
$UH2url .= urlencode(isset($_SERVER['HTTP_REFERER'])?$_SERVER['HTTP_REFERER']:'').'|Az|'.(int)($_SERVER['SERVER_PORT']);
$UH2url .= '|'.urlencode($_SERVER['HTTP_HOST']).'|'.urlencode($_SERVER['REQUEST_URI']);
$UH2url .= '|H|&amp;ch=UTF-8&amp;sb='.urlencode('[page title]');
print '<img src="'.$UH2url.'" alt="携帯アクセス解析" width="1" height="1" border="0" />';

こんな感じで上級版コードを作ります。

まだまだ未熟ですが、今後もよろしくお願いします。

つっしー PHP

カラーコード、カラーネームのバリデーション  

2010/4/30 金曜日 17:14:35

久しぶりの投稿です。
HNはチョコボールでしたがMoriMoriMoriMoriに変えます。
無意味にCamelCaseで。

管理画面でdivブロックのタイトル背景色なんかを設定する項目で、
入力項目に正しいカラーネーム、カラーコードが入力されているかどうかをチェックする
バリデーションの関数を紹介します。

// 有効なカラーネーム(147色)もしくはカラーコードかどうかチェック
function checkColor($str, $name)
{
	if($str == ''){
		return '';
	}
	// カラーネーム配列(147色)
	$arrColorName = array('aliceblue','antiquewhite','aqua','aquamarine','azure','beige','bisque','black','blanchedalmond','blue','blueviolet','brass','brown','burlywood','cadetblue','chartreuse','chocolate','coolcopper','copper','coral','cornflower','cornflowerblue','cornsilk','crimson','cyan','darkblue','darkbrown','darkcyan','darkgoldenrod','darkgray','darkgreen','darkkhaki','darkmagenta','darkolivegreen','darkorange','darkorchid','darkred','darksalmon','darkseagreen','darkslateblue','darkslategray','darkturquoise','darkviolet','deeppink','deepskyblue','dimgray','dodgerblue','feldsper','firebrick','floralwhite','forestgreen','fuchsia','gainsboro','ghostwhite','gold','goldenrod','gray','green','greenyellow','honeydew','hotpink','indianred','indigo','ivory','khaki','lavender','lavenderblush','lawngreen','lemonchiffon','lightblue','lightcoral','lightcyan','lightgoldenrodyellow','lightgreen','lightgrey','lightpink','lightsalmon','lightseagreen','lightskyblue','lightslategray','lightsteelblue','lightyellow','lime','limegreen','linen','magenta','maroon','mediumaquamarine','mediumblue','mediumorchid','mediumpurple','mediumseagreen','mediumslateblue','mediumspringgreen','mediumturquoise','mediumvioletred','midnightblue','mintcream','mistyrose','moccasin','navajowhite','navy','oldlace','olive','olivedrab','orange','orangered','orchid','palegoldenrod','palegreen','paleturquoise','palevioletred','papayawhip','peachpuff','peru','pink','plum','powderblue','purple','red','richblue','rosybrown','royalblue','saddlebrown','salmon','sandybrown','seagreen','seashell','sienna','silver','skyblue','slateblue','slategray','snow','springgreen','steelblue','tan','teal','thistle','tomato','turquoise','violet','wheat','white','whitesmoke','yellow','yellowgreen');

	// 精査用に小文字に統一
	$str = strtolower($str);
	if(!preg_match("/^[0-9a-f]{6}$/",$str) && !preg_match("/^[0-9a-f]{3}$/",$str) && !in_array($str, $arrColorName)){
		return $name.'のカラー指定が不正です。<br />';
	}
	return '';
}

データベースへの登録の際、カラムには、カラーネームの場合はそのまま入れ、
カラーコードの場合は、「#ffcc33」のように先頭に#を付けて登録してあげたほうが良いかと思います。
なぜなら、出力の度にカラーコードの場合は#を付ける、
といった判定をする処理を入れるのはパフォーマンスが悪いからです。
微々たる差異ですが。

出力の際のコーディング(ベタ書き)です。

if($title['bgcolor'] == ''){
	echo '<div style="text-align:center;">'
}else{
	echo '<div style="text-align:center;background-color:'.$title['bgcolor'].';">';
}
echo 'ブロックタイトル';

XHTMLでは16進数のカラーコードの英字は小文字で指定した方が良いので、
XHTML前提で利用する場合、「FFCCCC」のように入力された場合は強制的に
「#ffcccc」のように小文字にして(#もつけて)登録してあげてもいいかもしれません。
また、入力欄にカラーコードの場合、#つきで入力されても通るようにしてあげるとさらに親切かと。

fontタグのcolor属性の値やbodyタグのtext属性の値等は、
3桁の16進数での表記は当然ダメですよ!

■ダメな例

<body text="#000">
<font color="#fff">

ついでに書きますが、XHTMLでの属性checkedの誤った書き方。

<input type="radio" checked />

属性=”属性値”という書き方が基本なので、

<input type="radio" checked="checked" />

と書きましょう!

以上、MoriMoriMoriMoriMoriMoriでした。

MoriMoriMoriMori HTMLとか, MySQL, PHP, データベース

今流行のbit.lyを使ってみる  

2010/4/20 火曜日 15:48:53

相変わらずtwitterが流行ってますね。
認知率は9割にも及ぶけど登録率は1割程度という悲しい現状。
投稿文字数が140文字という制限のなか、長ったらしいURLを記述するのは厳しいこと。
なので、bit.lyを使ったURL短縮サービスの利用がよく見られます。

ということで、JSONを使って動的に短縮URLを取得して、tweetさせるページに飛ばしてあげるサンプル。

<script type="text/javascript">//< ![CDATA[
function tweet() {
	bitly = 'http://api.bit.ly/shorten'
		+ '?version=2.0.1&format=json&callback=callback'
		+ '&login=' + 【loginID】
		+ '&apiKey=' + 【apiKey】 + '&longUrl=';
	var script = document.createElement('script');
	script.type = 'text/javascript';
	script.src = bitly + encodeURIComponent(location.href) ;
	document.body.appendChild(script);
}
function callback(bitlyResponse) {
	var url = 'http://twitter.com/home/?status='
		+ encodeURIComponent(
		'コメント' + ' ' + bitlyResponse.results[location.href]['shortUrl']
		);
	window.open(url);
}
//]]>
</script>

<input type="button" onclick="tweet()" value="ついーと"/>

callback関数の「window.open(url);」を「location.href=url」にすると同じページで開かれるようになります。
また、bit.lyのAPIを使う場合、別途登録が必要になります。

次は・・twitterAPIを使っての投稿・・かなぁ。
\e

下音タヌキ PHP

画像認証(CAPTCHA)  

2010/4/16 金曜日 20:42:19

仕事で必要だったので画像認証(CAPTCHA)とか簡単に使えるスクリプトないかなーと探してました

色々あったんですが、ライセンスがどうとか色々言われそうだったので作ってみました。

と、言ってもサンプルコピペに近いですけど。

PEARにText_CAPTCHAってのがあったのでそれ使ってやってみます。

PHPはGDとttfをサポートしていないと使えないので注意してね!

まずPEARインストールでText_CAPTCHAを取得
依存関係の奴も全部

pear install  -a Text_CAPTCHA

ってやったら

Failed to download pear/Text_CAPTCHA within preferred state "stable", latest release is version 0.4.0, stability "alpha", use "channel://pear.php.net/Text_CAPTCHA-0.4.0" to install
install failed

とかって怒られたので

pear install -a channel://pear.php.net/Text_CAPTCHA-0.4.0

で取得
alphaバージョンとかbetaバージョンは普通にインストールできないので、バージョン番号まで入れろって事です

で、phpをファイルを以下のような感じで作ると

< ?php
require_once ("Text/CAPTCHA.php");
$CAPTCHA = Text_Captcha::factory('Image');
//locate .ttfとかやって適当にフォントファイルのパスを見つけて指定してあげてね!
//ちゃんとあるフォントファイル指定してあげてね!
$CAPTCHA->init(200, 70, null, array(
	'font_size' => 22,
	'font_path' => '/usr/share/fonts/japanese/TrueType/',
	'font_file' => 'sazanami-mincho.ttf'
	)
);
$img = $CAPTCHA->getCAPTCHAAsPNG();
//セッションに保存するとかしてね!
$_SESSION['captcha_pass'] = $CAPTCHA->getPhrase();
header('Content-type: image/png');
echo $img;
exit;

ってファイルを作ってやってそのファイルにアクセスしてみる

すると以下のような画像ができるはず!

20100213070928

セッションに保存したフレーズを次のページに遷移するときに、ユーザーが入力した値と比べて
きちんと認証されているか確認してね!

セッションに保存したフレーズは1回できちんと消すようにしないとだめだよ!

セッションにフレーズが保存されていない場合の処理も書かないと、認証スルーするかもしれないから注意だよ!
とかとか、適当にできるっぽいです。

のびーにょ PHP, Tips

mod_rewriteでGETパラメータ名を変更する  

2010/4/16 金曜日 20:22:56

mod_rewriteのお話

旧システムから新システムの以降など、システムの仕様が変わる時でも古いURLを引き継ぎたい場合に役に立つ小技です。

問題1

GETパラメータの名前aaaをbbbに変更したい場合はどのようにすれば良いか?

ついつい以下のように設定してしまうかと思いますが、うまく動きません。

RewriteRule filename.html\?aaa=(.*) filename.html?bbb=$1 [L]

RewriteCondを使い、QUERY_STRINGの条件を指定すると、うまく動きます。

RewriteCond %{QUERY_STRING}     aaa=(.+)
RewriteRule filename.html filename.html?bbb=%1 [L]

%1で、RewriteCondでマッチしたパターンを取得できる。

問題2

GETパラメータの名前aaaをbbbに変更したいが、aaa以外のパラメータはそのまま残したい場合はどのようにすれば良いか?

解答1

QSAをつける。

RewriteCond %{QUERY_STRING}     aaa=(.+)
RewriteRule filename.html filename.html?bbb=%1 [L,QSA]

解答2

以下の場合、aaaのみbbbに書き換える事ができる。

RewriteCond %{QUERY_STRING}     ^(.*)aaa=(.+)$
RewriteRule filename.html filename.html?%1bbb=%2 [L]

オマケ

『上記試してみましたが、うまく動きません!』という場合

上から順に評価されるので、こんな事しているとうまく動かない。

#ファイルが存在する場合はそれを表示する
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.* - [L]
# ↑ファイルが存在した時点で、上記が評価されて終わってしまう。

#パラメータ名を書き換える。
RewriteCond %{QUERY_STRING}     ^(.*)aaa=(.+)$
RewriteRule filename.html filename.html?%1bbb=%2 [L]

順番を変更する事でうまく動く。

#パラメータ名を書き換える。
RewriteCond %{QUERY_STRING}     ^(.*)aaa=(.+)$
RewriteRule filename.html filename.html?%1bbb=%2 [L]
#↑先に評価される。

#ファイルが存在する場合はそれを表示する
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.* - [L]

そんな感じで、お役に立てれば幸いです。

マカー Apache, Tips