開発日記/2008年の日記
2008/12/07
GoogleAPIよりGDownloadUrlを使って、サイト内のドキュメントにアクセスしていた部分が、つい先日いきなりエラーを出すようになった。
GDownloadUrlは、読み込み元サイトと同じドメインのリソースにしかアクセスできないという制約があったらしいのですが、知らずに使っていました。幸い自サイト内のリソースにしかアクセスはしていなかったので、これまで問題はなかったのですが、リソースの指定URLは「http://」で始まる絶対パスでした。
今回出るようになったエラー部分に対して、指定を相対パスに変えてやったら、ちゃんと動作するようになりました。他にも爆弾を抱えていそうで、ちょっと怖いです。
2008/11/17
Google Maps APIに仕様変更があったらしく、管理サイトで地図が正しく動いていないという事態が発生していました。
原因となっていたのは下のコードです。
//mapは地図のオブジェクト
map.setMapType(G_SATELLITE_TYPE);
これは地図を衛星写真に切り替える部分なのですが、「G_SATELLITE_TYPE」という定数の名称が「G_SATELLITE_MAP」に変更されたそうです。定数の名前を勝手に変えないでほしいところですが、サービスを間借りしている立場としては大きな声も出せないですね。社会インフラになりそうでならないGoogle Mapsの気まぐれな変更にちょっと当惑しました。ちなみにノーマル地図とハイブリッド地図の定数もそれぞれ「G_NORMAL_MAP」「G_HYBRID_MAP」になっていました。
http://code.google.com/intl/ja/apis/maps/documentation/reference.html#GMapType
他にも地図のタイプはいろいろあるみたいですね。ドラゴンクエスト3のマップを追加しちゃう人もいるのでしょうか。
それにしてもGoogle Mapsの仕様変更についていくには、どこにアンテナを張っていればいいものやら。
2008/11/10
最近、Google Maps APIを使ったお仕事をしていたときのメモ。
GClientGeocoderを使って住所地文字列から座標をひっぱってきて、それを元にマーカーを地図に立てるのに失敗しました。
for (i=0;i<ary.length;i++) {
geocoder.getLatLng(
ary[i].address, //住所文字列
function(point) {
if (point) {
addPointedMark(point.lat(), point.lng()); //マーカーを立てる関数
}
}
);
}
こんな感じでfor文の中でジオコーディング(getLatLng)してしまうと、Googleから座標が返ってくる前に、次のジオコーディングを始めようとしてしまいエラーの原因となっていました。
似たような事例の解決策を検索してみたら、「タイマーで待つ」みたいな実装が紹介されていて「なるほど。時間が解決してくれることではあるな。」と一瞬頷きそうになりましたが、固定秒待つという処理を考えたとき、固定秒を計算する術がないことに気がついたのでした。
while文のループとか、yield文とか、スレッド関係の話に思考が移りかけていきましたが、よくよく考えれば前の処理の終了時に呼び出される関数の中で次の処理を呼び出せばいいだけの話でした。
requestGeoCoder(0); //最初の処理
function requestGeoCoder(num) {
if (num>=ary.length) return; //終わったかどうかチェック
geocoder.getLatLng(
ary[num].address,
function(point) {
if (point) {
addPointedMark(point.lat(), point.lng());
}
requestGeoCoder(++num); //ここで次の処理
}
);
}
2008/8/22
昨日のメモについてのまとめ
PerlのWindows上での実行環境であるところのActivePerlには随分とお世話になっています。おかげさまで開発マシン上でWEBシステムの仮組ができています。
先日、メインのPCを買い替えまして、新たに開発環境を構築していたら、PerlのモジュールにImage::Magickが必要だったことを思い出し、ActivePerlのパッケージ管理ソフトであるPPMを使って、手軽にモジュールをインストールしようとしたところ、いろいろな変化に気がつきました。
まず、PPMのバージョンが4.02に上がってました。数字よりも、GUIがついたことに当惑しました。ちなみに「ppm-shell」で旧来のCUI対話型のインターフェイスでの操作も可能みたいです。
GUIでは、一覧にすべてのモジュールが示されています。でも、その中に目当ての「Image-Magick」がありません。perlのバージョンが5.8系から5.10系に上がっていたので、5.10系用のモジュールが用意されていないのかなと思いました。
そして、検索してみつけたのが、昨日のコマンドです。「bribes.org」さんありがとうとほっと一安心しながら開発に戻ります。すると今度は「DBD-mysql」のモジュールもないことに気がつきます。PPMのリストにもやはりありません。これはPPMについての自分の不勉強が問題だなと思って、いろいろなサイトで情報を集めました。そして、最終的に辿りついたのは、すべてPPMで完結している方法でした。
- PPMのコマンドを叩いて、GUIを立ち上げます。
- メニューから「Edit」-「Preference」でPPMの参照設定画面を出します。
- Repositoriesタブで、参照リポジトリ一覧を確認します。
- 必要なリポジトリを足せばいいのですが、Suggestedのセレクトボックスに必要そうなリポジトリは網羅されていました。
- bribes(Image::Magick用)とuwinnipeg(DBD::mysql用)を選択して、それぞれ「Add」ボタンで追加します。
- 「OK」ボタンで参照設定画面を閉じれば、モジュール一覧が更新されるので、通常の手順で必要なモジュールを追加します。
こんな簡単なことだったのに、数時間悩んでいた自分が情けないですね。なかなか日本語サイトで情報が得られなかったので、ここに書いておきます。
バージョンが上がって、どんどん便利になっていくので、気を抜くとすぐにはついていけない時がありますね。
2008/8/21
ppmでImage::Magickが出てこなくて悩んだ結果たどりついた方法のメモ。
ppm install http://www.bribes.org/perl/ppm/Image-Magick.ppd