<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress/2.3.3" -->
<rss version="0.92">
<channel>
	<title>MT312 &#187; 2007 &#187; 5 月</title>
	<link>http://www.mt312.com</link>
	<description></description>
	<lastBuildDate>Sun, 13 Jul 2008 21:49:58 +0000</lastBuildDate>
	<docs>http://backend.userland.com/rss092</docs>
	<language>ja</language>
	
	<item>
		<title>携帯特有の注意点</title>
		<description>ホスト名
携帯はホスト名が頻繁に変わってしまいます。
またホスト名の後半でキャリア判別すると失敗する場合があり、信用できません。正確に携帯判別するには各社サイトに掲載されているIPリストと照合する必要があります。
Content-Lengthを付ける
DoCoMoはContent-Lengthがないと表示できない場合があります。
「接続先のサーバーは現在ご利用できません」
リダイレクトは避ける
正しく処理されなかったり、エラーになる機種があります。
「無効なデータを受信しました」
POST後の二重投稿防止ボタン
[html]

  投稿完了しました
  

[/html]
POST後にこれを踏むと二重投稿を防ぐ事ができます。
GETでは駄目。
&#60;input&#62;フィールド内で改行を入力
PCブラウザでは改行できなくても携帯ではできてしまいます。
&#60;textarea&#62;フィールド内の改行コード
&#60;textarea&#62;フィールドに文章を出力する場合は改行コードをCRLFにする。
LFでは改行されません。
istyle属性
istyle="1" 全角かな
istyle="2" 半角カナ
istyle="3" 半角英字
istyle="4" 半角数字

パスワード入力欄&#60;input　type=&#34;password&#34;&#62;はDoCoMoはistyleが無視されて半角数字モードになりますが、AUでは付けていないと全角モードになるのでここにもistyleを付けておく。最近のSoftBank携帯はistyleに対応しているようです。
まとめ
携帯の機能はよりPCに近づいています。
この記事も、すぐに当てにならなくなるかもしれませんので、参考程度に。 </description>
		<link>http://www.mt312.com/php/42/</link>
			</item>
	<item>
		<title>処理速度最適化法</title>
		<description>いろいろ纏めようと思っていたんですが、すでに分かりやすいサイトが沢山あります。

PHP最適化tipsまとめサイト
基礎構文処理速度のあれこれ
require VS require_once
実際に計測してみた所、試行回数が少なかったせいか、あまり差は見られませんでした。
（未読ファイルの読み込みに関して）
一度しか読まないのが分かっていればrequire_onceを使うメリットはないと思います。
速度は気にせず以下で使い分ければOK。

複数回読まれる可能性があるが、一度しか読む必要がない。require_once
それ以外。require
== VS ===
型を含めて比較する後者の方が若干速い。
パスワードなど外部データと比較する場合にセキュリティーホールとなる可能性があるので、理由がない限り===を常用する。
is_hoge() VS ===
[php]
if(is_null($var)) {}
if($var===null) {}
[/php]
後者が速い。
count($array)>0 VS (bool)$array
配列に要素があるかどうかの判別。
後者が速い。
array_merge() VS +演算子
array_mergeは連結後に数字キーを振り直すので、連想配列の場合は+演算子を使った方が速い。
[php]
$a = array('a'=>1, 'b'=>2);
$b = array('a'=>3, 'c'=>4);

// array_merge($a, $b) == $b + $a;
[/php]
バージョン分岐
PHPのメジャーバージョンで分岐したい場合はversion_compare()を使うより各バージョン特有の定数を調べるのが良い。
[php]
// PHP_VERSIONの一文字目を調べるより速い
$isPHP5 = defined('E_STRICT');
[/php]
is_file() VS file_exists()
file_exists()はディレクトリも含まれるので、ファイルの有無を調べたいだけならis_file()の方が高速。
文字列連結速度
[php]
$str = $str1.$str2;
$str = "$str1$str2";
$str = "{$str1}{$str2}";
[/php]
上から順に高速。 
splitは使うな
文字列を分割して配列を作成する場合、splitは遅いので避ける。 
正規表現分割は、 preg_split (PHP 3.0.9, 4, 5)
固定文字分割は、 explode (PHP 3, 4, 5)
分割して一部分だけ取得したい場合は、分割数を制限する3番目のlimit引数を付けておきます。 特にループ内で繰り返し使う場合、全分割するより時間を短縮できます。 
[php]
$str ...</description>
		<link>http://www.mt312.com/php/41/</link>
			</item>
	<item>
		<title>コメントスパム対策法</title>
		<description>近年スパム被害が増えています。
誰でも投稿できるブログや掲示板も狙われています。
ここでは手間のかからない、簡単な対処法をいくつか紹介します。

	主な対処法

	禁止ワードを設定
	日本語が使えない環境からの投稿を拒否
	半角英数字のみの投稿を拒否
	投稿できるURLの数を制限
	プロキシサーバ経由の投稿を拒否
	リファラーを参照してフォームを経由したか判断
	フォームを表示してから投稿するまでの許容時間を設定する
	ダミー項目を作り入力があった場合に拒否
	フォームを解析されない様に、ロボットを排除
	データ送信先を頻繁に変更
	Captcha画像認証



検索ロボットを排除
[html]



[/html]
ロボットを完全に排除するのは難しい様ですが、少しは効果があると思います。googlebotのsnippetは検索結果に表示される該当ページからの抜粋です。これがある方がクリック率が高まるそうです。これを削除(nosnippet)するとキャッシュも削除されます。

Googleページ削除
リファラーからフォームを経由したか調べる
[php]
$from = $_SERVER['HTTP_REFERER'];
$host = $_SERVER['HTTP_HOST'];
if(!stristr($from, $host)) {
  print '不正なリファラーです。';
}
[/php]
リファラーを持たない環境は結構あります。ノートン等のセキュリティソフトによって隠蔽されている可能性もあります。ドコモなど一部携帯でアウト。
逆引き不可能なIPアドレスを拒否
[php]
$ip = $_SERVER['REMOTE_ADDR'];
$host = getHostByAddr($ip);
if($ip==$host) {
  print '逆引き不可能なIPアドレスです。';
}

// これでも可能
if(!preg_match('/[a-z]/', $host)) {
  print '逆引き不可能なIPアドレスです。';
}
[/php]
プロキシ経由を拒否
プロキシ特有の環境変数とホスト名を調べる方法です。
環境変数を吐かない匿名プロキシもあって、すべてを検出できる訳ではありません。
他にはプロキシリストを作成したり、ポートスキャンする方法もあります。
[php]
$systems = $_SERVER + $_ENV;

$ip = $systems['REMOTE_ADDR'];
$host = getHostByAddr($ip);
// ドコモの携帯はproxyが存在するので注意
// anonym=anonymous,anonymizer
// prox=proxy,proxify
$proxhost = preg_match(
'/anonym&#124;cache&#124;delegate&#124;firewall&#124;gateway&#124;httpd&#124;keeper&#124;prox&#124;squid&#124;via&#124;www/',
$host);

$bools = array(
  isset($systems['HTTP_CLIENT_IP']),
  isset($systems['HTTP_FORWARDED']),
  isset($systems['HTTP_MAX_FORWARS']),
  isset($systems['HTTP_PROXY_CONNECTION']),
  isset($systems['HTTP_SP_HOST']),
  ...</description>
		<link>http://www.mt312.com/php/40/</link>
			</item>
	<item>
		<title>Amazon Web Service</title>
		<description>Amazon Web Service(AWS)を使うと、Amazonで検索した商品データを自分のサイトに載せる事ができます。商品データはXML形式で返されますので、これをPHPで解析してHTMLに成型します。

	このサービスを利用するには登録が必要です。

	商品広告で収入を得る為のアソシエイト登録
	AWSを利用する為のSubscription Idの取得



商品検索方法
http://xml-jp.amznxslt.com/onca/xml3?local=jp
このアドレスに検索用のパラメータを連結させて問い合わせします。


オプションパラメータ


f=
XSLTを適用する場合はそのURL
f=xmlとするとそのままXMLを取得できます。


locale=
国コード 日本はjp


type=
lite 簡易版
heavy 完全版


t=
アソシエイトID


dev-t=
Subscription Id （デベロッパトークン）


page=
結果が複数ページに渡る場合のページ数


mode=
検索する商品のジャンル


和書
books-jp


洋書
books-us


音楽
music-jp


音楽クラシック
classical-jp


DVD
dvd-jp


ビデオ
vhs-jp


エレクトロニクス
electronics-jp


ソフトウェア
software-jp


ゲーム
videogames-jp


ASINSearch=
商品固有のASIN(Amazon Standard Item Number)コード、もしくは書籍に付いているISBNコードを指定。 カンマ（,）で区切って複数指定可能


KeywordSearch=
検索単語


これ以外にも詳細な検索が行えるパラメータがいくつかあります。
XMLを解析する
アマゾンから返ってきたXMLは、PHP標準のDOM関数を使って自力で解析しても良いのですが、構造が複雑になると少々大変です。そこで、PEARのXML_Serializerパッケージに含まれているXML_Unserializerクラスを使います。これを使えば、XMLテキストを瞬時に連想配列にしてくれますので、後で好きな様にHTMLに加工できます。

（注） PEARがない場合、まずPEARを導入して下さい。
http://pear.php.net/package/XML_Serializer
[php]
// XML_Unserializerクラスの読み込み
require 'XML/Unserializer.php';

class AWS_QueryString {
  var $_params;

  function AWS_QueryString($token, $assoc,　$type = 'heavy', $format = 'xml',
$locale = 'jp') {
    $this->_params = array();
    // 基本データだけ入れておく
    $this->add('dev-t', $token);
  ...</description>
		<link>http://www.mt312.com/php/39/</link>
			</item>
	<item>
		<title>テンプレートエンジンについて</title>
		<description>PHPにテンプレートエンジンは必要か？
この話題はPHP users-mlでも取り上げられました。

PHPはSSIの様にHTML内に埋め込んで使う事ができます。では、テンプレートエンジンが使われているのは何故でしょうか。いずれにせよ、他人のスクリプトを使う場合、デザイン部分だけ独立している方が使いやすいですね。

Smarty
HTML_Template_IT
テンプレートエンジンの魅力
それは、ロジックとデザインの完全な分離です。PHPを知らなくても容易にデザインを変更できるようになります。高機能なテンプレートエンジンでは、表組みや日付のフォーマット変更、文章の要約処理、文字コードの変更まで行う事ができます。

	以下に該当する場合、テンプレートエンジンは特に威力を発揮します。

	デザイン担当者がスクリプトを全く知らない場合。
	ロジックよりデザインを先行して作成する場合。
	複雑なデザインの場合。



PHPタグを上手に使おう
テンプレートエンジンは必要ないと判断した場合でも、作り方次第で上手くデザインを分離させられます。まず、PHPを含むデザインファイルは.phpとせず.htmとしておき、PHPでincludeして使うようにします。これでブラウザでデザインを確認しやすくなります。そして、どこでもPHPが書けてしまう事に甘えずに、スクリプトのみのファイルで極力データを加工しておきます。

※.htmとして良いのは画面への出力部分を極力抽出した場合に限ります。と言うのは、直接アクセスされた場合に中身が丸見えになってしまうからです。関数定義を含めるのも避けましょう。

結果データは &#60;h1&#62;&#60;?echo $arr["title"] ?&#62;&#60;/h1&#62; の様にHTMLに埋め込みます。ところが直接ブラウザで見るとデータが消えてしまっているのが分かります。これはテンプレートエンジンを使わない場合は仕方がありません。PHPタグ&#60;??&#62;はブラウザには表示されません。これが気に入らない場合はテンプレートエンジンを導入しましょう。
デザインを崩してしまう書き方

属性内のクォーテーション
&#60;a href=&#34;&#60;?echo $arr[&#34;url&#34;] ?&#62;&#34;&#62;url&#60;/a&#62; → &#34;&#62;url
これは「'」を使えば回避できます。
&#60;a href=&#34;&#60;?echo $arr['url'] ?&#62;&#34;&#62;url&#60;/a&#62; → url

比較やオブジェクトで使う &#34;&#62;&#34;
&#60;? if($n&#62;=10){ ?&#62; → =10){ ?&#62;
&#60;?echo $obj-&#62;value ?&#62; → value ?&#62;
これらは最近のWEB作成ソフトでは上手く解釈してくれますが、ブラウザでも確認できた方がより便利です。そこで、属性内のクォーテーションと&#34;&#62;&#34;は使わないようにします。テンプレート内で使う変数は予め連想配列にしておき、ループが必要な場合はそれを配列に溜めます。ループにはforeachを活用します。連想配列はクォーテーションを使うので、extract($hash);でキー文字列の変数に変換します。
[php]
< ? foreach($hashes as $hash){extract($hash); ?>
< ?echo $title ?>
written by < ?echo $name ?> on < ?echo date('m/d H:i', $timestamp) ?>
< ?echo $message ?>
 </description>
		<link>http://www.mt312.com/php/38/</link>
			</item>
	<item>
		<title>クラスとメソッドの動的使用</title>
		<description>PHPでは大胆な事ができます。
インスタンスメソッドを呼ぶ
[php]
class ClassA {
  function method() {
    print 'method';
  }
}

// 大文字小文字は区別しない
$className = 'classa';
$methodName = 'method';
$obj = new $className();// new ClassA();
$obj->$methodName();// $obj->method();
[/php]
staticメソッドを呼ぶ
インスタンスメソッドと若干異なります。
[php]
class ClassA {
  function method() {
    print 'method';
  }
}

// 大文字小文字は区別しない
$className = 'classa';
$methodName = 'method';
$className::$methodName();// parse error
eval("$className::$methodName();");// evalを使えばOK
call_user_func(array($className, $methodName));// こちらがベスト
[/php]
まとめ
いずれも非常に便利です。
クラス名や関数名を文字列で登録しておくだけで実行できます。
GDのバージョンによって、画像処理関数を切り替えたい時にも使えます。
又、登録モード、削除モード、検索モードなど、モード毎に1つの関数を呼ぶ便利な使い方もできます。わざわざ、if(登録モードなら)なんて分岐せずに済みますね。 </description>
		<link>http://www.mt312.com/php/37/</link>
			</item>
	<item>
		<title>メソッドのオーバーロード</title>
		<description>PHP4ではメソッドのオーバーライドは出来るが、オーバーロードは出来ない。
[php]
class Parent {
  function ride() {
    print 'p_ride';
  }
  function load() {
    print 'p_load';
  }
}
class Child extends Parent {
  function ride() {
    print 'c_ride';
  }
  function load($i) {
    print 'c_load';
  ...</description>
		<link>http://www.mt312.com/php/36/</link>
			</item>
	<item>
		<title>コンストラクタの呼ばれ方</title>
		<description>PHP4では、コンストラクタの扱いに注意が必要。
単独クラスの場合
[php]
class ClassA {
  function ClassA() {
    print 'ClassA';
  }
  function ClassA($arg) {
    print "ClassA with $arg";
  }
}

// Fatal error : Cannot redeclare classa()
[/php]
オーバーロードの項目で述べた様に、コンストラクタも複数定義できません。
よって、引数のデフォルト値を使う事で対応可能です。
[php]
class ClassA {
  function ClassA($arg='') {
    print "ClassA with $arg";
  }
}
// どちらもOK
$obj = ...</description>
		<link>http://www.mt312.com/php/35/</link>
			</item>
	<item>
		<title>変数の参照 (call by reference)</title>
		<description>変数の代入
PHPでは通常、変数の代入はコピー（クローン）が渡されます。
（PHP5ではインスタンスは参照渡し）
[php]
$var1 = 1;
$var2 = $var1;
$var1 += 10;
$var2 += 20;

// VAR1:11 VAR2:21
print "VAR1:$var1 VAR2:$var2";
[/php]
$var1、$var2、それぞれ独立しています。
参照の代入
参照を代入するには、参照演算子=&#38;を使います。
[php]
$var1 = 1;
$var2 =& $var1;
$var1 += 10;
$var2 += 20;

// VAR1:31 VAR2:31
print "VAR1:$var1 VAR2:$var2";
[/php]
さっきとは違い、出力文で$var1と$var2が同じである事が分かります。これは、2行目で変数$var1の参照を代入している為です。参照とは変数が持っているアドレス（実際のデータへの住所）の事です。2行目の代入により、$var2が$var1を参照しているのではなく、2つは同じデータを参照しているのです。
[php]
$var1 = 1;
$var2 =& $var1;
$var1 += 10;
$var2 += 20;

// 参照元の変数削除
unset($var1);
// 31
print $var2;
[/php]
$var1を削除したのに、$var2は残っています。var2はvar1と同じ場所にデータを持つ、別名（エイリアス）の変数と捕らえる事ができます。参照の削除とは、変数名と実際のデータの関係性を破棄することにすぎません。つまり、以下は参照渡しになりません。
[php]
$var = 100;
$ref =& $var;

// エラー
$ref =& 200;

function test() {
  return 200;
}
// 無効な参照渡し
$ref =& ...</description>
		<link>http://www.mt312.com/php/34/</link>
			</item>
	<item>
		<title>写メール掲示板 IMG-BBS+</title>
		<description>機能
携帯からも操作しやすい軽快な画像掲示板です。主な機能は無料版IMG-BBSと共通します。
詳細は無料版のこちらのページをご覧下さい。
有料版の特徴

	構成

	XHTML 1.0 Strict
	PHP5対応 （記述方法はPHP4式）
	テンプレートエンジン未使用 （テンプレートは画面毎にバラけています。）


	返信機能

	返信記事への返信に対応
	階層を把握しやすいツリー表示機能


	管理者機能

	記事の修正と削除
	デフォルトの表示モード変更


	携帯用

	記事検索に対応
	画像リンクに画像サイズを表示
	写メールによる画像投稿の返信に対応
	写メール投稿のアドレス認証不要


	その他

	騙り防止用トリップ表示
	ホスト名から算出したID表示
	メールアドレスが公開されないメールフォーム機能
	アクセスカウンター （別途ダウンロード）



推奨環境
PHP4.3以上推奨。
マルチバイト関数が有効になっている事。
セーフモードではお使いになれません。
サンプル
PC用サンプル 携帯用サンプル


購入方法
\5,460（消費税260円込）
必ず利用規約をご覧下さい。
メールフォームにて注文を受け付けています。
事前に無料版IMG-BBSにて動作検証をお願い致します。
口座への入金を確認後に正規スクリプトをメールにてお渡し致します。
写メール投稿手順
投稿手順は無料版とは異なります。

	投稿フォームの「画像添付」にチェックを入れ記事を登録する。 
	「コチラ」をクリックしてメールを作成して送信する。
	暫くしてから「受信ボタン」を押して記事を完成させる。 

使用方法

	解凍したファイルを全てアップロード。
	dataディレクトリと中のディレクトリの権限を757or707に変更。
	転送先のindex.phpへアクセス。

更新履歴


2007/11/03
書き出し機能削除、キャッシュ機能追加


2007/10/29
タグの制限を緩和してYouTubeタグなどの複数属性に対応


2007/09/21
端末番号設定追加


2007/09/16
サムネイル加工設定追加、URL送信フォーム追加


2007/09/05
削除確認画面追加、顔文字パレット追加


2007/08/06
トリップ機能追加、UA投稿拒否設定追加


2007/07/13
写メール投稿大幅変更、発言ランク追加、管理者承認機能削除


2007/07/09
ID表示追加、携帯のメニュー追加


2007/04/14
管理者承認機能追加


2007/04/04
写メールの複数枚画像を一度にファイル化


2007/03/16
メールフォーム追加、EXIF画像の幅を取得


2007/03/13
RSS用スタイルシート追加


2007/02/18
トップページ書き出し機能追加、タグ有効化


2006/12/28
環境設定追加


2006/11/12
リリース

 </description>
		<link>http://www.mt312.com/script/15/</link>
			</item>
</channel>
</rss>
