.




うぇブログ2
最新エントリ
トップ :  PHPメモ : 

(1) 2 3 4 ... 10 »

2007/12/25
カテゴリ : PHPメモ

執筆者: itoh (6:40 pm)
うそーんな仕様。というかバグ。

http://php.net/serialize
引用:

Marek Soldt
21-Nov-2007 09:50
serialize() and unserialize() behave a bit crazy if you try to work with bigger strings (100kb of size). It helps to divide the string parts to array:



とりあえず、手元のWindows用PHP4.3.11とFHEL4のPHP4では再現した。

つーか、100Kどころか60Kそこそこで発露。ありえねー。

でも単純に100Kほど文字列をシリアライズしてもならないんだよ。
CSVで60Kほどのをセッションに保とうとして失敗した。途中でブツっと切れるんです。あー


ちがった。

セッションに保存できないのは、DB使っててセッション用のField定義がtextだからだ。だから60K=textの65000文字付近で切れるんだ・・・。すんません>PHP

itohさんのブログを読む | コメント (0) | トラックバック数 (0) | 閲覧数 (10552)
2007/09/06
カテゴリ : PHPメモ

執筆者: itoh (12:19 pm)
UTF-8のカタカナの正規表現
http://www.itt-web.net/xeblog/index/action_xeblog_details.1/blog_id.459.html

がコメントをもらってたとおり、ひらがなを一部含んでたので、書き直し。
itohさんのブログを読む | コメント (1) | トラックバック数 (0) | 閲覧数 (36782)
2007/08/29
カテゴリ : PHPメモ

執筆者: itoh (10:26 pm)
環境によるんだろうけど、初めて出たのでメモ。

[ethna-users:0588] Windows版PHPとqmailでEthna_MailSenderから送信できず

あたりの議論とも組み合わせて。

上鍵さんの言うPHPのmail()のできの悪さって言うのも影響してる。
http://blog.poyo.jp/archives.php/id-1139994430


で、Ethna_MailSenderは、送信する直前で
<?php
       // 改行コードを CRLF に
        if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
            $body = str_replace("\n", "\r\n", $body);
        }
        $header_line = str_replace("\n", "\r\n", $header_line);

ってやってるんだけど、
引用:

$ dpkg --list|grep qmail
ii qmail 1.03-14 Secure, reliable, efficient, simple mail tra
ii qmail-src 1.03-24 Source only package for building qmail binar
ii vchkpw 3.1.2-9 Virtual POP-domains and users for qmail

な環境では、余計なお世話になってて、
$header_line = str_replace("\n", "\r\n", $header_line);
をコメントアウトしないとExtraHeaderがダブル改行されてしまって、あふれる。

うーん。どうしたもんかな。原因がわからないからMLにもよく投げられん。
itohさんのブログを読む | コメント (0) | トラックバック数 (0) | 閲覧数 (6751)
2007/06/19
カテゴリ : PHPメモ

執筆者: itoh (10:09 am)
$_SERVER['DOCUMENT_ROOT']使うときって、最後に"/"が付いているのが普通と思いますか?


どうも、ApacheのDocumentRootを抜き出しているだけなので、/が付いてたり付いてなかったり。Confに拠るのね。

ということで、自分ルール「/は着いてないものとする」
itohさんのブログを読む | コメント (0) | トラックバック数 (0) | 閲覧数 (9972)
2007/05/21
カテゴリ : PHPメモ

執筆者: itoh (1:18 pm)
PHPerがどういう反応するのかなーっていう気もするけど。


そろそろPHPに関して一言いっとくかに対して。


私は、数年前にPHPで初めてプログラムに触れ、その楽しさを知ったものだ。そして、ホームページ作成業者として、PHPでちいさな企業ホームページをちまちまと多々作り垂れている。そのほとんどは月額3000円未満のレンタルサーバだ。



とりあえずインストール。必要なものだけロード
dankogai氏の言う「ライブラリ」がどのレベルのライブラリなのかは不明だが。

PHPコアを拡張する様々なライブラリが欲しければ、設定ファイルphp.iniでロードさせればいいし、なんならスクリプト中でロードさせることもできる。後者は実際にどこまで使われているかは別として。



Webアプリを作るためだけの言語
がPHPなのだからしょうがない。といいつつも、コマンドラインでも使えないことはない。ワンライナーが欲しければ、php -r でどうぞ。
Webアプリを作るためだけなのだから、「Webアプリで作ったクラスや関数がちょっとコマンドラインでも使えればうれしいよね。」くらいのおまけ的気持ちで。




呪文にはマニュアルで対抗
呪文を知らなければ、魔法の書を使えばいい。PHPはマニュアルが充実してると思う。ブラウザの「配列の逆順ソートってarsortだっけ?」と思ったらブラウザのロケーションバーから

php.net/arsort

と入力してみて欲しい。
PHPの配列に関する関数ってなんかいろいろあったよね。って思えば、同じく

php.net/array

とすると、配列に関する関数一覧に飛ぶ。呪文なんて覚える必要全くなし。私は未だにstr_replaceの引数の順番すらあやしいときがある。

この協力も含めてPHPを評価して欲しい。



バージョンの変化は意外と少ない

実際にホームページ製作をしていて、PHP4とPHP5の違いで悩まされたことはほとんど無い。「仕様が激しく違うじゃないか!!」と言われても実際にそんなバージョンごとで異なる仕様の部分なんて使わないんだからしょうがない。だからPHP5は未だに普及しない。私も基本的には使わない。だからPHP4は4.4.6なんて未だに出る。



言語で言語を拡張できない?

すみません。そのとおりです。しかし、実用上で困ったことはありません。



MVCって何ですか?

ここ2年ほど出ている様々なPHPフレームワークって言うのはMVCモデルじゃないのか?
Ethna
Maple
Zend Framework

大規模Webアプリケーションにおいて、Viewしか任されて無いから、Vだけ・・・ということならそうなんでしょう。




総括

どこまでも実用的なのがPHP。そこにプログラム言語の美しさやあるべき姿を求められても困る。

PHPは「今そこにあるから」使うだけで、じゃあそこにPerlがあれば私はPerlを使っただろう。しかし、CPANのインストールはレンタルサーバではできないし、エラーが起こった際も「Internal Server Error」だけではにっちもさっちも。


PHPは良くも悪くも踏み台。

私はそこから入ってJavaScriptを覚えようという気になったし、SQLも勉強した。PHPがなければこんな楽しい仕事があるとは思えなかったし。


だから、新しいものが作りたいなと思ったDHHはRuby on Railsを作ったんだろう。

言語的にPHPに未来があるかと言われたら、おおきな?だが、PHPからプログラムに入って「おもしろい」と感じた人がどれだけ多いか。それはPerlよりも多いのではないかと。ことによると、JavaScriptよりも多いのではないかと思っている。

だから、
そろそろPHPに関して一言いっとくか
引用:

だから、PHPに対して正しいスタンスは、「使うにとどめる」というものだと思う。「作る」までやりたかったら、他をあたるべきだろう。

は大いに同意。
itohさんのブログを読む | コメント (6) | トラックバック数 (0) | 閲覧数 (11816)
2007/04/27
カテゴリ : PHPメモ

執筆者: itoh (5:09 pm)
COOKIEは配列を収められないので、文字列にして保存するのだけど、COOKIEには4kbの壁がある。

そこで、再帰処理を使って4Kまで落とす。
<?php
class Xanhte_Cookie
{
	// key:value|key1:value1|...を配列にスル
	function unserialize($cookie_value_str, $max_size=4000)
	{
		$ret = unserialize($cookie_value_str);

		if (strlen($ret)>$max_size){
			// 大きい時は、一つ外して収める
			$cookie_value_array = $this->serialize($cookie_value_str);
			krsort($cookie_value_array);
			array_pop($cookie_value_array);
			return $this->unserialize($this->serialize($cookie_value_array), $max_size);
		}
		
		return $ret;
	}
	
	/*
	array("key"=>"value", "key1"=>"value1"... を:と|で文字列にする
	*/
	function serialize($cookie_array, $max_size=4000)
	{
		$ret = serialize($cookie_array);
		if (strlen($ret) > $max_size){
			krsort($cookie_array);
			array_pop($cookie_array);
			return $this->serialize($cookie_array);
		}
		
		return $ret;
	}
}


$var = array();
for($i=0; $i<=300; $i++){
	$var[] =  array(1);
		't' => 1177658101,
		'o' => array(1,2,3),
	);
}

$xc = new Xanhte_Cookie();
$sel =  $xc->serialize($var);
echo strlen($sel);


ただ、再帰は100回を越えると
引用:

Fatal error: Maximum function nesting level of '100' reached, aborting!

となるので注意。
itohさんのブログを読む | コメント (1) | トラックバック数 (0) | 閲覧数 (13495)
2007/04/21
カテゴリ : PHPメモ

執筆者: itoh (4:27 pm)
このサイトをXOOPSCubeにしました。

メインメニューのテンプレートが無くなっちゃった・・・。
itohさんのブログを読む | コメント (0) | トラックバック数 (0) | 閲覧数 (6654)
2007/04/11
カテゴリ : PHPメモ

執筆者: itoh (9:27 pm)
地域メッシュと言うのがあります。

Wikipediaによると
引用:

地域メッシュ(ちいきメッシュ)とは、統計に利用するために、緯度・経度に基づいて地域をほぼ同じ大きさの網の目(メッシュ)に分けたものである。メッシュを識別するためのコードを地域メッシュコードと言う。


で、このデータは割と色々なところで統計情報とかに使われている。
メッシュに対して、人口とかあれやこれやの社会情報データが割り振られているわけです。


仕事で、地図とメッシュ(に与えられた)情報の相関をアレコレとすることになり、調査しました。ようするに、メッシュコード←→緯度・経度の変換がやりたい。


ちなみに、GoogleMapなどで与えられている緯度・経度は、世界測地系(新測地系)で、メッシュコードは日本測地系(旧測地系)で与えられている。これの変換は実は地域ごとに微妙なゆがみがあって一律ではないのだけど、近似的には、

日本測地系(旧測地系) + (緯度+12秒/経度-12秒) = 世界測地系(新測地系)

となる(らしい)。
http://www.gsi.go.jp/LAW/G2000/img/g2000-r.gif






メッシュの定義については、下記を参考
http://www.sinfonica.or.jp/catlog/annai/mesh/mimginfo.htm

で、変換については
http://www.green.pref.tokushima.jp/database/meshselect.htm
のJavaScriptを見て計算式を色々と試してみた。上記のは3次メッシュまでしか対応していないので4次メッシュまでPHPで作った。
<?php
function to_lat_long($meshcode)
{
	$mesh = sscanf($meshcode, "%2d%2d%1d%1d%1d%1d%1d");
	if (count($mesh)<7){
		echo "invalid meshcode.";
		return 0;
	}
	
	$I = $mesh[0]*2400 + $mesh[2]*300 + $mesh[4]*30;
	$K = $mesh[1]*3600 + $mesh[3]*450 + $mesh[5]*45;
	
	$I = array(
		intval($I/3600),
		intval(($I%3600)/60),
		$I - intval($I/3600)*3600 - intval(($I%3600)/60)*60
		);
	
	$K = array(
		intval($K/3600) + 100,
		intval(($K%3600)/60),
		$K - intval($K/3600)*3600 - intval(($K%3600)/60)*60
		);
	
	if ($mesh[6]==3 || $mesh[6]==4){
		$I[2]+=15;
	}
	if ($mesh[6]==2 || $mesh[6]==4){
		$K[2]+=23;
	}
	
	
	return array($I, $K);
}


function to_mesh_code($ido=array(),$keido=array())
{
	$meshcode = '';

	if (count($ido)<3 || count($keido)<3){
		echo "invalid params";
		return 0;
	}
	
	$I = $latitude = $ido[0]*3600 + $ido[1]*60 + $ido[2];
	$K = $longitude = ($keido[0]-100)*3600 + $keido[1]*60 + $keido[2];
	
	$meshcode = sprintf("%d%d%d%d%d%d",
						substr(intval($I/2400+100), 1,2) ,
						substr(intval($K/3600+100), 1,2) ,
						intval(($I%2400)/300),
						intval(($K%3600)/450),
						intval((($I%2400)%300)/30),
						intval((($K%3600)%450)/45)
						);
	// 4次メッシュ
	list($i, $k) = to_lat_long($meshcode);
	$i_4 = $I - $i[0]*3600 - $i[1]*60 - $i[2];
	$k_4 = $K - ($k[0]-100)*3600 - $k[1]*60 - $k[2];
	if ($i_4>=15){
		$mesh_4 = ($k_4>=23) ? 4 : 3;
	} else {
		$mesh_4 = ($k_4>=23) ? 2 : 1;
	}
	
	return $meshcode.$mesh_4 ;
}


if (isset($_GET['to_mesh'])){
	$meshcode =  to_mesh_code($_GET['latitude'],$_GET['longitude']);
	$lat_0 = $_GET['latitude'][0];
	$lat_1 = $_GET['latitude'][1];
	$lat_2 = $_GET['latitude'][2];
	$long_0 = $_GET['longitude'][0];
	$long_1 = $_GET['longitude'][1];
	$long_2 = $_GET['longitude'][2];
}

if (isset($_GET['to_lat_long'])){
	$meshcode = $_GET['meshcode'];
	list($lat, $long) = to_lat_long($_GET['meshcode']);
	$lat_0 = $lat[0];
	$lat_1 = $lat[1];
	$lat_2 = $lat[2];
	$long_0 = $long[0];
	$long_1 = $long[1];
	$long_2 = $long[2];
}
?>
<form action="./meshcode.php">
<center>
緯度:
<input type="text" size="3" name="latitude[0]" value="<?=$lat_0?>">度
<input type="text" size="3" name="latitude[1]" value="<?=$lat_1?>">分
<input type="text" size="8" name="latitude[2]" value="<?=$lat_2?>">秒<br>
経度:
<input type="text" size="3" name="longitude[0]" value="<?=$long_0?>">度
<input type="text" size="3" name="longitude[1]" value="<?=$long_1?>">分
<input type="text" size="8" name="longitude[2]" value="<?=$long_2?>">秒
<br><br>
<input type="submit" name="to_mesh" value="メッシュコードへ">&nbsp;
<br><br><br>
メッシュコード:
<input type="text" size="18" name="meshcode" value="<?=$meshcode?>"><br><br>
<input type="submit" name="to_lat_long" value="緯度経度へ"><br><br>
</center>
</form>

コード見れば分かるが、このままで公開すると危険なので使う場合は自分のローカルPCだけでやるように。
itohさんのブログを読む | コメント (5) | トラックバック数 (0) | 閲覧数 (46788)
2007/04/04
カテゴリ : PHPメモ

執筆者: itoh (4:43 pm)
ようやく読んだ

自分なりのまとめ


ファクトリー・パターン 

⇒ オブジェクトを生成する時に使う。
単にクラスをnewするだけだと、能がないので。引数を変えてやることで、色々と色々な振る舞いを付け加えられる。



シングルトン・パターン

⇒ リソース管理。
ファイルポインタや、DBコネクションなどの使いまわしたいリソースは、オブジェクトでカプセル化してやるとよい。そのオブジェクトは二度と作りたくないのでこのパターンで一つを使いまわす。



オブザーバー・パターン

⇒ ロガー
あるオブジェクトに何かをしたときに、「ついでに」何かをさせたい時にこのパターンを実装させておく。この場合、登録したオブザーバは呼び出し元に作用させない。


コマンド・チェーン・パターン

⇒ 仮想的にメソッドを追加する
PHPにおいて、メソッドの追加は後入れできない。
このパターンを実装させておくと、(もちろん、メソッドの呼び出し方法は通常のPHPのそれとは違うけど)仮想的なメソッドのコールができる。


ストラテジー・パターン

⇒ あとでメソッドの処理を変更
プラグアンドプレイ。メソッドの処理内容をクラスに含ませない。なんか、DIっぽいなー。ってDI使ったことないし良く知らないけど。




あぁ、こりゃ面白いやデザインパターン。
itohさんのブログを読む | コメント (5) | トラックバック数 (0) | 閲覧数 (6194)
2007/04/02
カテゴリ : PHPメモ

執筆者: itoh (2:47 pm)
Excelなどでよく使われる日付形式
引用:
2007/4/1 12:34:56

というのを、っていうUnixtimestampの値にするやつをPHPワンライナーで実現しようと思ったわけです。・・・が、いくつもの罠が待ち構えていました。@PHP4.4.4


ま、普通に考えてこんな感じかな?と。
<?php
var_dump(call_user_func_array("mktime", sscanf("2007-4-1 12:34:56", "%6$4d-%4$2d-%5$2d %1$2d:%2$2d:%3$2d")));
?>

sscanfで順序の並び替え付きの文字列解析をして、コールバックで引数にしてmktimeを呼び出すというごく単純なもの。



しかし、これが動かない。

なんでじゃー?と思い、
<?php
var_dump(sscanf("2007-4-1 12:34:56", "%6$4d-%4$2d-%5$2d %1$2d:%2$2d:%3$2d"));
?>

してみると、
引用:

array(8) {
[0]=>
NULL
[1]=>
NULL
[2]=>
int(12)
[3]=>
int(34)
[4]=>
int(56)
[5]=>
int(4)
[7]=>
int(2007)
[6]=>
int(1)
}

とか出る。

sscanfは並べ替え付にすると最初の2つがなぜかNULLが詰まってしまうようだ・・・。

itohさんのブログを読む | コメント (3) | トラックバック数 (0) | 閲覧数 (8507)

(1) 2 3 4 ... 10 »



 





メインメニュー

カテゴリ一覧

Google Adsense

うぇブログ カレンダー


XoopsCube Ring
Amethyst Blue - BULLETIN


.