goo blog サービス終了のお知らせ 

ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

PHPのZend FrameworkをEclipseで使う その1:zendインストール

2010-12-15 17:17:41 | PHP

PHPのZend FrameworkをEclipseで使うことを考える。
その手順。2回に分けて説明する予定。
今日は、Zendフレームワークのインストールまで。

(1)Apacheのインストール

(2)PHPのインストール

(3)Zendをダウンロード
ここ   
Latest Release of ZF
http://framework.zend.com/download/current/

の「Zend Framework 1.11.1 Full」のZIPをダウンロードした。
(ちょっと下のほうに、小さくある)

(4)ZIPファイルを解凍する。

(5)それを、どこでもいいんだけど、どっかにおく。
 (解凍したZendFramework-1.11.1というフォルダ名をZendFrameworkにして、「C:Program Files」の下に置いた)

(6)PHPのphp.iniの
; Windows: "path1;path2"
include_path = ".;C:Program FilesZendFrameworklibrary"
と、include_pathを設定する(設定先:(5)のフォルダの下のlibrary)

(7)Apacheのconfフォルダの下にある、httpd.confに対して、

LoadModule rewrite_module modules/mod_rewrite.so

のコメントをはずす。さらに、

<Directory "C:Program FilesApache Software FoundationApache2.2htdocs">
AllowOverride All
</Directory>


(上記< > は、本当は半角)を追加


(8)Apacheのhtdocsフォルダの下に、zendtest.phpというファイルを作り、


<?php
require_once 'Zend/Version.php';
echo Zend_Version::VERSION;

(上記< > は、本当は半角)を追加
と書いて、保存する。

(9)ブラウザで、http://localhost/zendtest.php をアクセスする

1.11.1

のように、バージョン名が表示されればOK!



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

FPDFとjapanese.phpでUTF-8の文字を出力するには?

2010-08-27 14:21:37 | PHP

 まえに、PHPで、FPDFとjapanese.phpを使ってPDFを出力するってことを書いたけど、
 あれだと、UTF-8で出力できない(SHIFT-JISで出力)

 そのわけは、japanese.phpで、フォント指定する際、AddSJISFontにおいて、以下のように
function AddSJISFont($family='SJIS')
{
	//Add SJIS font with proportional Latin
	$name='KozMinPro-Regular-Acro';
	$cw=$GLOBALS['SJIS_widths'];
	$CMap='90msp-RKSJ-H';
	$registry=array('ordering'=>'Japan1','supplement'=>2);
	$this->AddCIDFonts($family,$name,$cw,$CMap,$registry);
}

(上記 < >は、本当は半角)

$CMap='90msp-RKSJ-H';

と指定しているから。

 CMapとは、文字コードとフォントの字形の対応をとるマップ(対応表)のことで、
 それが、RKSJ、すなわち、ローマンかなSJIS用と指定してある。
 なので、SJISになる。
 これを、UTF-8用にすると、UTF-8で出力できる(が、実は、・・・この続きはあとで書く)

 このRKSJなどについて、詳しくは、

CID-Keyedフォント
http://www.screen.co.jp/ga_product/sento/products/new0.html


にかいてある(「83pv-RKSJのお話」のところ)

 なので、出力方法は2とおり。
 1つは、UTF-8をSJISに変換して出力
 他方は、UTF-8をUnicodeのCMAPを使って出力する。

 以下、2とおりについて説明する。




■UTF-8をSJISに変換して出力

 この方法は、お手軽にできる。出力時にmb_convert_encodingするだけ。
 こんなかんじ。

<?php
require('japanese.php');

$pdf=new PDF_Japanese();
$pdf->AddSJISFont();
$pdf->Open();
$pdf->AddPage();
$pdf->SetFont('SJIS','',18);
$pdf->Write(8,mb_convert_encoding("かきくけこ","SJIS","UTF-8"));
$pdf->Output();
?>

(上記 < >は、本当は半角)

ただ、これを保存するとき、UTF-8で保存することになると思うけど、
「BOM付きUTF-8」で保存すると、PDFが出力できない(エラーになる)

「BOMつきUTF-8」は、メモ帳でUTF-8を保存すると、そうなる。
メモ帳では見えないが、ファイルの頭にUTF-8を示す文字が入っていて
(これがBOM。美乳とかとおなじようなもの)
これでUTF-8と判断しやすくなるんだけど、
PDF書き出しの場合、このBOMがファイルの先頭に入って、エラーになってしまう。

そこで、UTF-8書き出しを、BOMなしにする。
TeraPadだと、UTF-8Nにする。
eclipseだと、はじめから、BOMなしで保存するからOK

ただし、欠点として、SJISにない、UTF-8の文字は出力できない。




■UTF-8をUnicodeのCMAPを使って出力する

SJISにない、UTF-8の文字を出力するには、UTF-8のCMapを使えば・・・
となるけど、UTF-8のCMapに対応してないみたいなので(エラーになる)
UTF-16のCMAPを使って出力する。

そのため、修正箇所は2箇所

(1)japanese.phpで、UTF-16のCMap用関数を作成
(2)書き出すときにはUTF-8からUTF-16に変換して出力

この件について、以下のサイトが詳しく書いてある。
SHIFT_JISに無い文字をFPDFで表示する :【PHP】
http://winofsql.jp/sh/html/pdf_unicode1.htm

以下、上記のサイトをもとに、説明する。


(1)japanese.phpで、UTF-16のCMap用関数を作成
japanese.phpに、以下の関数を追加する。
function AddUniJISFont($font='MS-Mincho',$family='UniJIS')   
{   
    //Add SJIS font with proportional Latin   
    $name=$font;   
    $cw=$GLOBALS['SJIS_widths'];   
    $CMap='UniJIS-UTF16-H';   
    $registry=array('ordering'=>'Japan1','supplement'=>2);   
    $this->AddCIDFonts($family,$name,$cw,$CMap,$registry);   
}  

(上記 < >は、本当は半角)

$CMap='UniJIS-UTF16-H';が違うだけ。
'UniJIS-UTF16-H'が、UTF-16のCMap。
(このソースは、上記リンクサイトの丸写しです)。

(2)書き出すときにはUTF-8からUTF-16に変換して出力
そして、書き出すときは、こんなかんじ。

<?php

require('japanese.php');

$pdf=new PDF_Japanese();
$pdf->AddUniJISFont();
$pdf->Open();
$pdf->AddPage();
$pdf->SetFont('UniJIS','',18);
$pdf->Write(8,mb_convert_encoding("あいうえお","unicode","utf-8"));
$pdf->Output();
?>

(上記 < >は、本当は半角)

AddUniJISFontを使い、SetFontでUniJISを指定している。
そして、mb_convert_encodingで、unicode(UTF-16)に変換している。
このとき、上記「UTF-8をSJISに変換して出力」でも書いたけど、
このファイルを「BOMなしの」UTF-8で保存すること
(BOMつきにすると、エラーになる)




うんなかんじで、うまくできるとおもう


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHPのアクセスカウンタ、つくってみた

2010-08-13 14:48:39 | PHP

 人にいわれて気づいた、
 かんたんなPHPのアクセスカウンタがないと・・・

 なんで作ってみた。

 こんなかんじ。
<?php

//**********************************************//
//	ここを書き換えると、好きなイメージに	//
//**********************************************//
$ipath = "img/";	//	イメージのパス、最後に/をつけてね
$itype = "gif";		//	gifとかjpgとか、拡張子を"."「なし」で
//**********************************************//
//	ここまで				//
//**********************************************//

	//	カウンタファイル名作成
	$fname = $_GET['fname'];
	if ( $fname == "" )
	{
		$fname = "counter";
	}
	$fname = $fname . ".dat";

	//	カウンタの数取得
	$inf = fopen ( $fname , "r");
	if ( $inf == false )
		$count = 0;
	else
	{
		$count = fgets($inf);
		fclose($inf);
	}

	//	カウントアップ(今見た分)
	$count ++;

	//	カウンタ書き出し
	$outf = fopen ( $fname , "w");
	fwrite($outf,$count);
	fclose($outf);

	//	表示
	//	数字のファイルが存在しないときは、
	//	文字で表示する
	$ret = chgImg($count,$ipath,"gif");
	if ($ret	==	"" )
		echo $count;
	else
		echo $ret;

//******************************************************//
//							//
//	カウンターをイメージファイルのタグに変換	//
//							//
//******************************************************//
function chgImg($count,$ipath,$itype)
{
	//	カウントを文字に置き換え
	$chkword = strval($count);
	$len = strlen($chkword);
	$ret = "";

	//	1文字ずつチェック
	for($pos = 0 ; $pos < $len ; $pos++)
	{
		$chk = substr($chkword,$pos,1);
		$chkfname = $ipath . $chk . "." . $itype;
			//	ファイルなければ、""を返す
		if ( file_exists($chkfname)	==	false)
		{
			return "";
		}
		else
		{
			//	数字のイメージファイルに変換
			$ret = $ret . '<IMG SRC="' . $chkfname . '">';
		}
	}

	return $ret;
}	

?>

< >の全角を、半角にして、htdocsのトップにテキトーな名前(拡張子.php)う
つけて保存、アクセスするとカウントする。




 その際、imgというフォルダを(htdocsの下に)つくり、そこに0.gif~9.gifを置くと、
イメージで表示される。

  イメージの置き場所を変えたい場合は、$ipathを、
  GIF以外の形式にしたい場合は、$itypeを

いじると変えられる。





 また、HTMLファイルから使いたい場合は、iframeで入れられる

 たとえば、このPHPがcount.phpだとすると、

<iframe src="count.php" height=40 width=100 frameborder=0 scrolling=no>
</iframe>

を使いたいところに入れる。






さらに、ページごとに切り分けたい場合、引数fnameを変えると切り分けられる。

  count.php?fname=count1

とすると、count1.datファイルにそのページへアクセスした人の数がはいり、

  count.php?fname=count2

とすると、count2.datファイルにそのページへアクセスした人の数がはいり、

なので、fnameを切り分けることによって、カウントできる




こんなかんじ


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHPからPDF出力

2010-08-11 15:11:37 | PHP

 PHPからPDF出力することを考える。
 これには、FPDFというのがあるようだ。




■ダウンロード&インストール

 ここ http://www.fpdf.org/

ここのDownloadsをクリックして、

・はじめにでてくる国旗のところは無視して
 (よーく見て!それは、マニュアルのダウンロードです)

 下にある1.6のZIPをダウンロード
 解凍したら、

   fpdf.phpファイルと
   fontフォルダ

 を、Apacheのhtdocsの下(つまり、他のPHPファイルのいるところと同じフォルダ)にコピーします。
 (fontフォルダは、フォルダごとコピーしてください)




■HelloWorldをPDFで出力するまで

 そしたら今度は、さっきのサイトの「Tutorials」をクリック。「Tutorial 1」にある、


<?php
require('fpdf.php');

$pdf=new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
$pdf->Cell(40,10,'Hello World!');
$pdf->Output();
?>

(< >は、本当は半角)を、なんか適当なファイル名(たとえば、test.php)にして、同じくhtdocsの下に保存する。

 で、その保存したファイル(test.php)をアクセスすると(http://127.0.0.1/test.php)、Hello Worldがでてきます(PDFで)




■日本語にするには?

 上記のまま、日本語にいれても出てきませんが、日本語化してくださった奇特な方がいらっしゃるようです。

Japanese support
http://www.fpdf.org/phorum/read.php?f=1&i=7977&t=7977


に書かれているjapanese.zipをダウンロードし、解凍してでてきた

   japanese.php
   ex.php

を同じくhtdocsの下にコピー。ex.phpのほうがサンプルなので、それをアクセスすると(http://127.0.0.1/ex.php)日本語がでてくる。(日本語出力には、japanese.phpをインクルードする必要がある。そこからfpdf.phpを呼び出している)




すげー。日本語でてる。PDFで・・・



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHP5.2で、Extensionを入れると、Apacheが立ち上がらなくなる

2010-03-30 13:40:44 | PHP

 ってことがおきた。PHPをコマンドプロンプトから実行しても、PHPが立ち上がらない。

 ちなみに組み合わせは
  PHP5.2
  Apache2.2

 この対応、以下のようにするとうまくいくみたい。

(1)PHPを5.3にあげる
  なにも、問題なく動いた。

(2)Extensionをインストールするとき、左側の+をクリックすると、
   入れるExtentionが選べる。必要なものだけ選択していれる
   (MySQL、MySQLiだけ選択していれたらうまくいった)


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHP5.2で、phpinfo()しても、ちゃんと表示されない(文字が表示される)

2010-03-29 10:40:22 | PHP

通常、PHPでは、

<?php phpinfo(); ?>

(< > は、本当は半角)

とだけ書いたファイルを用意し、そのファイルをブラウザで表示すると
(つまり、上記の1行を書いたファイルをindex.phpに保存し、http://127.0.0.1/index.phpをアクセスすると)
PHPの情報が書かれた画面が表示される。

ところが、上記の1行がそのまま表示されるケースがあるようだ。

(Apacheを再起動していないと、そのように表示されるが、
 Apacheを再起動してもなお、表示されることがある)

その場合のチェック方法

※apache2.2の場合。




・Apacheのconfフォルダにある、httpd.confを確認。
 エディタで開いて、PHPという言葉があるか?
 なかったら、なぜかしら、設定が失敗している(原因不明)
 なので、以下の2つを修正する。

(1)httpd.confの修正

httpd.confファイルの最後に、以下の2行を追加


PHPIniDir "C:/Program Files/PHP/"
LoadModule php5_module "C:/Program Files/PHP/php5apache2_2.dll"


もちろん、C:/Program Files/以外にPHPをインストールしたなら、そのフォルダにしてくれ。

(2)mime.typesの修正

おなじconfフォルダ内にある、mime.typesファイルを開き、一番最後に以下の2行を追加


application/x-httpd-php php
application/x-httpd-php-source phps


(3)再起動

これで、再度、phpinfoを開いてみてください。ちゃんとみえましたか?




ちゃんとインストーラーが設定してくれれば、さらに、DirectoryIndexを探して、
DirectoryIndex index.html index.htm index.php
のように、最後にindex.phpをつけてくれるのですが、これをやらなくても動きます。




  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

サーバーか、クライアントか・・グラフはどちらで描画すべき?

2008-02-10 12:47:46 | PHP

っていう話題がここ
サーバーサイドとクライアントサイド、グラフはどちらで描画すべきか?
http://opentechpress.jp/developer/article.pl?sid=08/02/08/0054212&pagenum=1

に載っている。

ちなみに、そこに載っているライブラリ。

  サーバー:libchart
http://naku.dohcrew.com/libchart/pages/introduction/


  クライアント:Webfx Charting
http://webfx.eae.net/dhtml/chart/chart.html



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHPでソケット間通信(クライアント側)

2008-01-18 18:17:06 | PHP

ここのブログ
phpのソケット通信
http://runaway.air-nifty.com/tubuyaki/2006/01/php_db51.html

を参考に、PHPでのソケット間通信をテストしてみました。

内容は、ローカル(127.0.0.1)のHTTPサーバーにアクセスし、Content-length分データを読み込み、データ部分を表示するというものです。

プログラムは、こんなかんじ
<?php
	$sock = fsockopen( '127.0.0.1', 80, $errono, $errmsg, 30 );
	$out = "GET / HTTP/1.1¥nHost: 127.0.0.1¥n¥n";

	//データ送信
	fputs($sock, $out);

	//データ受信
	$c =fread($sock, 1);
	$header = "";
	while ( strpos($header,"¥n¥n") === false )
	{
		if ( $c	!=	"¥r")
		{		
	  		$header .= $c;
		}
  		$c = fread($sock, 1);
	}

	//受信データを改行で分割
	$hline = array();
	$hline = split("¥n",$header);

	//	Content-Lengthを探し、データ長取得
	$datalen = 0;
	for($i = 0 ; $i < count($hline) ; $i++)
	{
		$lenpos = strpos($hline[$i],"Content-Length:");
		if ( $lenpos !== false )
		{
			$datalen = intval(substr($hline[$i],strlen("Content-Length:")));
			break;
		}
	}

	//	データがあれば読み込む
	if ( $datalen	>	0 )
	{
  		$data = fread($sock, $datalen);
	}

	//	読み込み内容を返す
	echo($data);

	fclose($sock);

?>

(上記< > ¥は、本当は半角です)


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHPにおける、共通部分の一部だけ違うという場合の実現法とメリットデメリット

2007-10-25 21:31:28 | PHP

 PHPで、複数の画面において、共通部分があれば、includeにして、呼び出すということが考えられる。ただ、このとき、一部分だけ違うということがある。
 この場合、考えられる対応は3つ

・そのinclude元を直接修正する
・includeファイルをコピー、コピーしたものを修正して、それを参照する
・includeがクラスなら、それを継承する。継承したものを修正し、それを参照

 以下、それぞれのメリットデメリットを書いてみたいと思います。




(1)そのinclude元を直接修正する
 include元のファイルにたいして、if文を追加して、もし、あるときならば、一部分かえるように、プログラムを修正する。

 この方法は、後日、他の人が修正しようとした場合、そのソースを参照するので、修正が分かるというメリットはあるけど、同時に修正している場合、競合が起こる可能性がある。

 とくに、フリーソフトをこのように修正した場合、後日そのソフトがバージョンアップすると、追加した部分を、新しいバージョンにも追加しないといけなくなる。




(2)includeファイルをコピー、コピーしたものを修正して、それを参照する

 include元のファイルをコピーしてきて、そのコピーしたものを参照するように書き換える。さらに、コピーしたものに、変えたい内容を修正する。

 この方法だと、バージョンアップしても、参照するのは、コピーしたファイルのほうだから影響はない・・・こともあるけど、コピーしていたファイルが、さらに何かをincludeしていて、そのinclude元が書き換えられて不整合ということもありえる。

 また、みんなが、好き勝手にコピーしてしまうと、今、どこで何が更新されているのか分からなくなってしまう。




・includeがクラスなら、それを継承する。継承したものを修正し、それを参照

 PHPならクラスが出来るので、こういう話もある得る。
 が、これは、クラスになっていて、適切なメソッドに分かれていないとできない。
 また、(2)同様みんなが、好き勝手に継承しまくってしまうと、今、どこでどーなっているのか分からなくなってしまう。




ってなかんじですかね(^^)



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHPで、ファイルのダウンロードをさせるには?

2007-10-03 16:06:25 | PHP

 たとえば、PHPで、ボタンをクリック、あるいはアンカータグをクリックされたら、CSVファイルを保存するダイアログが出て、保存できるようにするなどという場合があるかと思う。

 その場合、たとえば、アンカータグで、
<A HREF="http://127.0.0.1/outcsv.php">CSV出力</A>
(実際は< >は、半角)

と書かれた場合、outcsv.phpは、どうやって書くかというお話。




■方針

 バイナリーで送ることにすれば、ふつう、保存するかどうかのダイアログが出て、保存できるので、バイナリーで送ることにします。Content-Dispositionを指定すると、ファイル名が指定できるので、そうしましょう。




■ソース

 ソースはこんなかんじ
<?php
header("Content-Type: application/octed-stream");
header("Content-Disposition: inline; filename=neagari071003.csv");
?>
"No","証券コード","市場","会社名"
"1","3114","大証2部","(株)プロジェ・ホールディングス"
"2","8519","東証1部","ポケットカード(株)"
"3","2122","マザーズ","(株)インタースペース"
"4","3237","マザーズ","(株)イントランス"
"5","6634","JASDAQ","(株)ネットインデックス"

(上記< > ¥は、本当は半角)
これを、outcsv.phpに書きます。今回は、内容を、No以下直接書いていますが、実際には、PHPでデータベースを検索してとか、いろいろして書き出すと思います。
大切なのは、headerの2行です。




■注意など

 なお、<?php(<は本当は半角)を、ファイルの先頭に書かないとエラーになるような気がする(いろいろやってみた結果)。
Content-Dispositionのinlineは、attachmentに変えてもOK。その後のファイル名neagari071003.csvは好きなファイル名にしてOK

こんなかんじです。



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHP5.2.4を入れたら、おおGDとmySQLiとかがない!

2007-09-17 16:20:55 | PHP


Apache2.2.4を入れた後、PHP5.2.4をWindows Vistaに入れたら、
PHPがインストール中に、Apacheのセットアップをしてくれるので
(そのため、confのフォルダがどこにあるか聞かれるが。。)、

すぐに、PHPは動かせて、phpinfoは表示できた。

でもねでもね。。。

あれー。extフォルダないしい。。。
php_mysql.dll,php_mysqli.dllないしい。。
GDを入れたいのに、extensionって書いてあるところないしい(>_<!)

というので、GDとmySQLを動作させるまでに、やったこと。




■GD,mySQli等エクステンション共通

php.iniファイルの中、

extension_dir ="C:¥PHP¥ext"
(¥は、本当は小文字)

のように、extension_dirのところに、extensionのパスを指定し、
その後、そこに指定したフォルダがなければ、作成する。
(今回はextフォルダを作成する)




■GDのインストール

 上記「GD,mySQli等エクステンション共通」を行った後で、

ここ http://blog.thepimp.net/misc/gd/php_gd2-5.2-TS.zip

をダウンロードして、zipファイルの中に入っているphp_gd2.dllを
上記extension_dir(つまり"C:¥PHP¥ext")にいれました。
(上記のphp_gd2.dllについては、ここに書いてある)

そしたら、php.iniファイルの中にある、
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;

あたりのところに、

extension=php_gd2.dll

と書いて、Apache再起動




■mysql,mysqliのインストール

Download Connector/PHP
http://dev.mysql.com/downloads/connector/php/

から、

mysqli extension (PHP 5.2.0)
for MySQL Server 5.0.27 (~800k)



mysql extension (PHP 5.2.0)
for MySQL Server 5.0.27

をダウンロード、解凍すると(ほかのファイルも入っているけど)
php_mysql.dll(ないしはphp_mysqli.dll)がでてくるので、
それを、上記extension_dir(つまり"C:¥PHP¥ext")にいれました。
そしたら、php.iniファイルの中にある、
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;

あたりのところに、

extension=php_mysql.dll
extension=php_mysqli.dll

と書いて、Apache再起動




つまり、
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
のところは、

extension=php_gd2.dll
extension=php_mysql.dll
extension=php_mysqli.dll

と3行増えます



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

多角形があるとき、指定された点が多角形に含まれているかを判断するPHPプログラム。

2007-03-11 21:39:20 | PHP

 以前、複数の自由に書いた図形の交わっているところを求める方法というのを書いたとき、


小問1:多角形(ポリゴン)があるとき、その多角形に指定された点が含まれているか


というのに


(あ)まず、指定された多角形を書き、色を塗る(青にしましょうか)
   →背景は白とします。

(い)指定された点を取ってくる(getPixel()で)

(う)(あ)で塗った色だったら、入ってる、背景の色だったら、入ってない


というものを書きましたけど、そーいうことをするPHPプログラムを書いてみました。

こんなかんじ




■仕様
http://127.0.0.1/area_check.php?wh=250,250&point=0,0,200,0,100,100&chk=100,200,100,50

のように、

whに、幅と高さをカンマ付きで指定し、

pointで、その範囲の点を、x1,y1,x2,y2,x3,y3。。。のように、カンマでくぎって、XYの点を順次指定していき(例の場合は、(0,0),(200,0),(100,100)の3点を指定している=3角形)

chkで、調べる点をx1,y1,x2,y2,x3,y3。。。のように、カンマでくぎって、XYの点を順次指定していく(例の場合は、(100,200),(100,50)の2点をチェックしている)

と、結果として以下のようなカタチ
<?xml version="1.0" encoding="UTF-8" ?> 
<inout>
<item>
  <x>100</x> 
  <y>200</y> 
  <result>0</result> 
</item>
<item>
  <x>100</x> 
  <y>50</y> 
  <result>1</result> 
</item>
</inout>

(上記< > ¥は、本当は半角)

resultが0なら入ってない、それ以外なら入ってる
(実際には1になると思うけど)とする。

なお、環境として、サーバー側にはGDが入っているとする。




■ソース

 ソースはこんなかんじ
<?php

	// check
	$image	= area_set($_GET["wh"],$_GET["point"]);
	$chk_arr = explode(",",$_GET["chk"]);
	for($i = 0 ; $i * 2 < count($chk_arr) ; $i ++ )
	{
		$ret[$i] = inout($image,$chk_arr[$i*2]. "," .$chk_arr[$i*2+1]);
	}
	imagedestroy($image);

	//result out
	header("Content-type: text/xml");
	print('<?xml version="1.0" encoding="UTF-8" ?>'."¥n");
	print("<inout>"."¥n");
	for($i = 0 ; $i * 2 < count($chk_arr) ; $i ++ )
	{
		print("<item>¥n");
		print("<x>".$chk_arr[$i*2]."</x>"."¥n");
		print("<y>".$chk_arr[$i*2+1]."</y>"."¥n");
		print("<result>".$ret[$i]."</result>"."¥n");
		print("</item>¥n");
	}
	print("</inout>"."¥n");

function area_set($width_hight,$point)
{
	$wh  	=	explode(",",$width_hight);
	$width	=	$wh[0];
	$hight	=	$wh[1];
	$area 	=	explode(",",$point);

	// create image
	$image = imagecreate($width, $hight);


	// set colors
	$bg  = imagecolorallocate($image, 0, 0, 0);
	$bg  = imagecolortransparent ($image ,$bg);
	$blue = imagecolorallocate($image, 0, 0, 255);

	// draw a polygon
	imagefilledpolygon($image, $area, count($area)/2 , $blue);

	return	$image;
}

function inout($image,$chk)
{
	$xy  	=	explode(",",$chk);
	$x	=	$xy[0];
	$y	=	$xy[1];
	
	//	get Blue Color
	$rgb = imagecolorat($image, $x, $y);

	return	$rgb;
}
?> 

(上記< > ¥は、本当は半角)

上記関数の
  function area_set($width_hight,$point)
で、指定範囲をセットしています(青くしています)
  function inout($image,$chk)
で、範囲内に入っているかどうかを、チェックしています。




  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHPアクセラレータで一番高速なのはどれがが、載ってる!

2006-11-04 22:50:54 | PHP

アンチウィルスソフトの一番とか、Windowsへの負荷かけ一番とか、いろんな一番をしらべている?GIGAZINE,今度はPHPアクセラレーターの1番だそうです。

ここ
PHPアクセラレータで一番高速なのはどれか?
http://gigazine.net/index.php?/news/comments/20061103_php_accelerator/


PHPアクセラレータとは(以下斜体は上記記事より引用)

実行されたPHPスクリプトの中間形式にコンパイルされたデータをキャッシュディレクトリに保存することで、以後同じファイルに対してアクセスがあった時に、そのキャッシュファイルを利用することで高速化する

というもので、順位は...(実はGIGAZINEにはリンク先しかなく、
ここに順位が出てるんだけど。。なので、以下の斜体は、そこからの引用=表の一部のみ)

製品ゲイン
XCache194.88%
APC192.06%
eAccelerator163.62%

(以下省略、くわしくは、ここ参照)

とのこと。
インストール、入手方法などは、上記のGIGAZINEの記事にあるようです。

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHPやPerlでExcelを読み書きするまとめ

2006-10-25 10:26:34 | PHP

 サーバーがWindowsであれば、IISのASP(アクティブサーバーページのほう)でExcelのオブジェクトをCreateして、操作できるし、
 サーバーでJavaが使えれば、POIJExcelApiでできる。

じゃ、レンタルサーバーみたいな、
   サーバーのOSがLinuxでPerlとPHPしか使えない場合は??
   でもExcelを読み書きしたい場合は?

というので、調べてみたメモメモ
(メモなので、本当にできるかどうかは、確かめていません。)




■Perlの場合
よみ:Spreadsheet-ParseExcel-0.2603
  http://search.cpan.org/~kwitknr/Spreadsheet-ParseExcel-0.2603/ParseExcel.pm

かき:Spreadsheet::WriteExcel

参考サイト
  Spreadsheet::WriteExcel - Perl で Excel ファイルを出力
  Spreadsheet::WriteExcel = Perl で Excel 出力
  Spreadsheet::WriteExcel = Perl で Excel 出力(2)



■PHPの場合
読み:Spreadsheet_Excel_Reader(SourceForge)
http://sourceforge.net/projects/phpexcelreader/

書き:Spreadsheet_Excel_Writer(PEAR版)
   PHP Class版もある。

参考サイト:
  PHPでExcelファイルの入出力
(真っ白になる場合は、エンコードをUTF8に)
  Excelファイル形式でのデータダウンロード(PEAR版)



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PHPでLocationをPOSTで行うようなこと(=POSTで他サイトを呼び出す)をしてみる

2006-02-21 02:47:40 | PHP

 PHPの場合、Locationで他のサイトを呼び出す場合、GETであれば、URLに引数を書いていくだけですから、簡単にできますよね。

たとえば、

<?
header("Location:http://search.yahoo.co.jp/search?p=%A5%A6%A5%A3%A5%EA%A5%A2%A5%E0%A4%CE%A4%A4%A4%BF%A4%BA%A4%E9&fr=top&src=top¥n¥n");
?>

って書くと(ただし、 上記全角の< > ¥ は実際には半角)
ウィリアムのいたずらというのをYAHOOで検索した状態のものが出てくる。

 では、POSTはどーやるの??

 と思って調べたら、なんか、なさそうだったので、ソケット使って作っちゃいました。

 関数にしました。

 ちなみに、ソケット部分は、

ここのサイト 「ソケットの使い方」
http://phpspot.net/php/pg%83%5C%83P%83b%83g%82%CC%8Eg%82%A2%82%A9%82%BD.html

にインスパイヤされました(このサイトはgetの例を示してる)




で、プログラムは、こんなかんじ。
<?php

$host = "127.0.0.1";
$port = 80;
$path = "/cgi-bin/formsend.cgi";
$msg = "abcd=123";

echo Header_Cut(Location_Post($host,$port,$path,$msg));

//==============================================//
//	Postで送信する	 			//
//	$host ホスト名				//
//	$port ポート番号			//
//	$path ホストのHomeからのパス(/で始まる)	//
//	$msg  送信内容				//
//	返り値:ヘッダーつきデータ		//
//==============================================//
function Location_Post($host,$port,$path,$msg)
{
	$fp = fsockopen ($host, $port, $errno, $errstr, 30);
	if (!$fp) 
	{
		return "error1";
	}

	// 読み書きのタイムアウト設定
	socket_set_timeout($fp, 2);

	//	送信
	fputs ($fp, "POST ". $path ." HTTP/1.0¥r¥n");
	fputs ($fp, "Connection: close¥r¥n");
	fputs ($fp, "Host: ". $host ."¥r¥n");
	fputs ($fp, "Content-length: " . strlen($msg) ."¥r¥n¥r¥n");
	fputs ($fp, $msg);

	//	受信
	$buf = "";
	while (!feof($fp))
	{
		$buf = $buf . fgets($fp,128);
	}

	//	返り値の作成
	$outdata = $buf;

	// ソケットがタイムアウトしたかどうか調べる
	$stat = socket_get_status($fp);
	if ($stat["timed_out"])
	{
		$outdata =  "error2";
	}

	// ソケットを閉じる
	fclose ($fp);
	return $outdata;
}

//==============================================//
//	ヘッダーをきる	 			//
//	$buf  :ヘッダーつきデータ		//
//	返り値:ヘッダをカットした本文		//
//==============================================//
function Header_Cut($buf)
{
		//¥r¥n改行の場合
	$outdata = strstr($buf,"¥r¥n¥r¥n");
	if ( $outdata == FALSE )
	{
		//¥n改行の場合
		$outdata = strstr($buf,"¥n¥n");
	}
	return $outdata;
}
?> 

(上記全角の< > ¥ は実際には半角)

 上の、Location_Post($host,$port,$path,$msg)っていう関数が、それにあたります。
引数の内容は関数の上のコメントを、値の入れ方は、さらにその上を見てください。

で、このままだと、HTTP 1.0なんとかかんとか。。って、ヘッダーがついた状態でかえってきてしまうので、そこから、本文だけを取り出す関数Header_Cutも作りました。

 Location_Postの返り値をいれると、ヘッダーだけ、切り取って、返してくれます。

 ちなみに、ヘッダーは、改行2個でおわり、そのあとがコンテンツになるほうにきまっているので、改行2個の場所を探しています。

 Get型もこれを応用してできる(さっきのサイトと、上記の関数をあわせるとできる)。

 で、そーすると、どういうふうに便利かについては、また今度、気が向いたら、書きます。


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする