逆ジオコーディングとかよくあるカレンダークラスとか

少し前にgoogleが逆ジオコーディングどうのこうのと書いていたが(その後ほったらかし)、別にこれ以外にも逆ジオコード系のAPIはいっぱいあるのね。
調査不足でした…orz

というか、検索したらすぐに出てくるし。


まぁ、そういうわけで適当に見つけた「いまココ!の逆ジオコーディングAPI:試験中」と、
松田惇さんのまとめている↓ここの中から、「ReFITS Lab 逆ジオコーディングサービス」を使って住所取得PHPクラスを作ってみた。

http://blog.asial.co.jp/457


前回まで試していたのは「InvGeoCoder」というのだったのだが、これがレスポンスが悪い。
使わせてもらっといて文句を言うのも失礼だが、遅いし、返ってこないこと多いしであまり使い物にならなかった。


まず、「いまココ!の逆ジオコーディングAPI:試験中」だが、
説明にもある通り、

高速化実現のためのアルゴリズムにより、初めて参照されるデータのみ非常に遅いですが、2回目以降からは瞬時に情報を取得できます。これは、このAPIの利用のされ方が無作為に緯度経度を渡されるのではなく、同じ内容を何度も参照される事を前提としているからです。

とのこと。
そのとおり、最初は遅かった。でも次は早かった。


わがままなので最初も早いのが良い!ということで「ReFITS Lab 逆ジオコーディングサービス」を使ってクラスを作ってみたのだ。
完璧な正確性はないが(そんなのはどこにもないと思うし)、早いし、ようやく満足できるものになった。
これは、都道府県だとか市区郡だとかに分かれてレスポンスを出してくれるところもうれしい。
出力形態もJSONP, PHPシリアライズ,XMLがあるのがいいですね。

ところで…

最近、とあるサービスを作って、その使用ログを取っておいて、解析できるようにしよーと思っていたので、ビューワーを作ってみたのだが、負荷的な部分はいかがなものかと思ってしまう。。。
ログ自体は、日単位でXMLファイルを書き出すように作ってあって、ビューワーで解析する期間を設定してその期間のXMLファイルを読みにいくようにしてあるのだが、
解析させる期間の設定を長く持たせると、その分たくさんのXMLファイルを読みにいくわけで、やっぱりサーバにはそれなりの仕事になるのであろうと思うのだけれど…
ログとかどういう風にためて、どういう風に ビューさせるのがよいのか、効率的なのを知りたいものだ。


いかんせん、独学でプログラムを勉強して来たのでそういう部分がよくわからないことが多い。
運用しているものなので、「とりあえず止まってから考えればいいや」という分けにもいかないし…


正直、大規模サイトのトラフィックの分散とかにもかなり興味がある。
具体的にサイト構築どうなってるの?とか。まぁ、今の自分が聞いてもなかなか理解できないことが多いんだろうなぁ。

もう少し、地道に勉強します。

簡単な「カレンダー生成PHPクラス」を作る

ビューワー用に作ってみた、「カレンダー生成PHPクラス」。
日付に簡単にリンクを貼れるようにしてみた。

<?php
class calendar{
	
	var $year;
	var $mon;
	var $today;
	var $daylink_url;
	var $daylink_target;
	var $last_day;//月の最後の日付
	
	function calendar($year, $mon, $today){
		$this->year = $year;
		$this->mon = $mon;
		$this->today = $today;
		
		for($day = 1; checkdate($this->mon, $day, $this->year); $day++){
			$this->last_day = $day;
		}
	}
	
	function setURL($day, $url, $target){
		$this->daylink_url[$day] = $url;
		if($target){
			$this->daylink_target[$day] = " target=\"".$target."\"";
		}
	}
	
	function printCalendar(){
		echo "<table id=\"calendar-".$this->year."-".$this->mon."\" class=\"calendar-table\">\n";
		$weektop = date(w, mktime(0,0,0,$this->mon,1,$this->year));//指定月の1日の曜日を数値で取得
		for($i = 0 ; $i < $weektop ; $i++){//日付が始まる前の空白
			echo "<td> </td>\n";
		}
		
		for($day = 1; checkdate($this->mon, $day, $this->year); $day++){
			if($this->daylink_url[$day]){//リンクURLがあったら<a>追加
				$day_str = "<a href=\"".$this->daylink_url[$day]."\"".$this->daylink_target[$day].">".$day."</a>";
			}else{
				$day_str = $day;
			}
			
			if($this->today == $day){//今日の日付なら<div>追加
				$day_str = "<div id=\"calendar-today\">".$day_str."</div>";
			}
			
			if(($day+$weektop)%7 == 1){
				echo "<tr>\n<td id=\"calendar-".$day."\" class=\"calendar-sunday\">".$day_str."</td>\n"; //日曜日
			} else if(($day+$weektop)%7 == 0){
				echo "<td id=\"calendar-".$day."\" class=\"calendar-saturday\">".$day_str."</td>\n</tr>\n"; //土曜日
			} else {
				echo "<td id=\"calendar-".$day."\" class=\"calendar-weekdays\">".$day_str."</td>\n";//その他
			}
		}
		
		$weekend = date(w, mktime(0,0,0,$this->mon,$day,$this->year));//指定月最終日$dayは1プラスされて1月なら32になっている
		if($weekend !=0){//もし32が日曜日すなわち0ならそれで終了
			for($i =0 ; $i < 7-$i ;$i++){//0以外は空白が必要
				echo "<td> </td>";
			}
		}
		echo "</tr></table>";
	}
}
?>

サーバがPHP4なので、こんな感じ。というか5の環境が(あまり)ないので5で書く癖がつかないんだなぁ。いかん。

<?php
$calendar = new calendar($year, $mon, $today);//newする
$calendar->setURL($day, "index.php", "_blank");//日付にリンク追加
$calendar->printCalendar();//カレンダーアウトプット
?>

こんなかんじでアウトプット。
基本テーブルで、タグにclassとかidとかついてるのでcssで飾る。


これ以外にも、さっきの解析用に指定期間のxmlを読みにいってまとまった配列でかえすクラスとか書いたけどどうでもいいな。