プログラム

google map

最近、眠りが浅い。
日が変わってから寝て夜中に数度目が覚めて、その上早く起きるという非健康的な早起き。

今日も目が覚めてしまったので折角なので効率的に使おうということでgoogle map APIを使って遊んでみた。
一度使ってみたかったというのもあったので。
あと、折角だから自作のフィードリーダが回収してきたあちこちのblogやニュースサイト等々のデータを使ってみようということで、百式の中の方*1が書かれているblogのidea*ideaで紹介された「夜カフェ」の記事データからピンを打ってみた。

下のURLで表示されるはずです。
妙に重いのと引っ張ってきたスタイルシートが微妙なので綺麗に表示されなかったり、なんで地図上の吹き出しで記事が出ないでブラウザの下の方に突如出るのか?などなどいろいろありますが、まだまだ修行中の身ですのでご承知くださいませ。
idea*ideaの夜カフェまとめをgoogle mapで。

紹介された時に配信されたRSSはフィードリーダのデータはデータベースに入っているので、そこから夜カフェの記事を抽出して、更に住所が綺麗に抜けて且つ、google map APIに住所を投げてそのままピンが打てたものだけが表示されています。
google map APIについては全く知らなかったのですが、予想以上に簡単に使えて驚き....。

素敵なAPIと、何より、素敵なカフェの紹介と、もちろん多々興味深い記事を毎回書いてくださっている百式管理人の方に感謝。

*1:紹介が難しい...

google map(その2)

今朝書いたプログラムがIEで動いて無いじゃん。ってことで修正を試みる。
Firefoxだと問題ないのだけどなぁ。と悩んでいたら解決策発見。

<script src="http://maps.google.com/maps?file=api&v=2&key=(鍵情報)" type="text/javascript" charset="utf-8"></script>

としなければならいのだそうだ。タグの最後のcharset="utf-8"がポイントらしい。
参照元は下。

・・・http://maps.google.com/maps 呼び出し時に charset="utf-8" をつけて Google Maps API を呼び出すとき Javascript ファイルをロードする必要があります。・・・
IE で Google Maps API がエラーになる問題に対処する方法 - seclanのほえほえルーム

無事解決。
なんだかなぁ。

idea*ideaの夜カフェまとめをgoogle mapで。

JavaScriptでオブジェクトの有無の判定

Firefoxの場合、JavaScriptのオブジェクトがあるか無いかを "if(obj){ 〜 } else{ 〜 }"の様な書き方で判定させようとするとエラーとなってしまって困っていた。
いろいろ調べると次の様に書くと判定できるらしい。

if(!!obj){
// オブジェクトは存在
}
else{
// オブジェクトは存在しない
}

正しい使い方なのかは、イマイチ不明。
AjaxでDOMの一部を更新した際に更新した範囲に任意の名前のノードが存在するか判定させるのに使ったのだが、こちらの使い方も微妙。。。
下の様な感じ。

<!-- 更新前 -->
<div id="result">
</div>

これが、何かボタンを押すと更新されて...

<!-- 更新後 -->
<div id="result">
<div id="exp-313">foo</div>
<div id="exp-992">bar</div>
</div>

となって、更にJavaScriptで <div id="exp-312"> はありますか?と探す様なもの。
先の判定方法に従って今はこの様な感じなのだけど...

var sample_ary = new Array("exp-312");
for (var i=0; i < sample_ary.length; i++) {
if(!!$(sample_ary[i])){                      // prototype.jsを使ってます.
alert(sample_ary[i] + "はあります。);
}
}

また調べてわかったら更新・追記...。

クローラー

お勉強用フィードリーダのためにレンタルサーバーの上でcronを設定して動かしてるフィードクローラの巡回時間が段々長くなってきてレンタルサーバーの規定違反になりつつある...。
なので、フィードの更新間隔に応じて巡回頻度を変える様にした。
ちなみに現在登録しているフィードの更新頻度をグラフにすると以下の様な感じになった。
f:id:hideack:20080320181306j:image
更新頻度を数えるプログラムを書いて、フィード毎に更新頻度に応じて巡回頻度を5段階に分けて設定してあげる様にした。
一応、規定違反回避。
世間一般のフィードとかアンテナ用のクローラーってどうやって巡回してるのだろうと、ふと思う。
純朴に回ってる訳じゃないんだろうな。何か効率いい回り方とかやっているに違いない。。。

あぁ、今住んでる家が夏、普通の室温で維持されるなら家で運用するのだけどなぁ。
あと、keynoteでグラフが意外と簡単にかけることに感動した。

JavaScriptでオーバーロード

うーん。修行不足を実感。
prototype.jsを使ってJavaScriptで下の様な感じのプログラムを書いてしまった。

var Car = Class.create();
Car.prototype = {
initialize : function(){
this.oil = 50;
},
chargeOil : function(){
this.oil += 50;
},
chargeOil : function(order){
this.oil += order;
},
showStatus : function(){
alert("Oil=" + this.oil);
}
};
window.onload = function() {
mycar = new Car();
mycar.chargeOil();
mycar.showStatus();
}

Java等々の言い方で言うとchageOilメソッドをオーバーロードの乗りで実装してしまったという訳。
これを実行したとき、頭では"100"と表示してほしかったところなのだけど、実行すると次の様に表示される。
f:id:hideack:20080317230534p:image
希望する動きにならない。次に次の様に書いてみる。

var Car = Class.create();
Car.prototype = {
initialize : function(){
this.oil = 50;
},
chargeOil : function(order){
if(arguments.length == 0){
this.oil += 50;
}
else if(arguments.length == 1){
this.oil += order;
}
},
showStatus : function(){
alert("Oil=" + this.oil);
}
};
window.onload = function() {
mycar = new Car();
mycar.chargeOil();
mycar.showStatus();
}

こうすると実行結果は次の様になる。
f:id:hideack:20080317230457p:image
JavaScriptでは...

  • 関数はオブジェクト。メソッドは関数のオブジェクトが納められたもの。
    • なので先の前者の例では、引数で1つ与えられている方が引数無しの定義を上書きした(ってことでいいのかな...。)
    • そのため引数無しのメソッドを実行した場合、"50 + Nan = Nan"になった(で、いいんかいな。)
  • JavaScriptで関数が呼ばれた場合、引数がargumentsオブジェクトに自動的に格納される。
    • argumentsオブジェクトはlength, calleeプロパティを持つ。
      • lengthプロパティを使うことで引数別の切り分けができる。

Javascriptでのオブジェクト(連想配列)

var Car = Class.create();
Car.prototype = {
initialize : function(){
},
test : function(){
alert("bar");
},
};

prototype.jsを呼んだ上で、上のJavascriptを実行すると、FirefoxはパスしてIEはコケル。
原因は以下の箇所。

   test : function(){
alert("bar");
},  // ←ここの ","があるとIEはNG

IEもIE7とかだとどうなるのかは未調査。IE6だとエラーに。
PerlPHPとかで連想配列の変数定義するとき、

<?php
$sample = array(
"foo" => "bar",
"hoge" => "zzz",
);
?>

と、最後に","をよく加えていますが。ともかく、ブラウザによって違うんですねぇ。

数ヶ月前も全く同じ間違いをして悩んだ気がする。
学習してない。怖い怖い。

VisualStudioで作成するインストーラーで指定可能なフォルダの一覧

このサイトにまとめてあって助かったので、ここでもメモ。
インストーラーで特殊な場所に任意のファイルを置きたい場合に使えます。
VisualStudioでも説明で「〜のフォルダ」と表示はされるのだけど、具体的にどこですか?状態だったので非常に助かった。

「インストーラーに特殊フォルダを使う」
http://element.dip.jp/~hm/memo/windevelop/instfolder/index.html

Ethna_MailSenderにSJISのテンプレートを渡してしまうと…。

以下の箇所で止まる。ループから抜けられないみたいだが、中までは追っていない。
いや、ちゃんとテンプレートをEUC-JPで渡せよ。って話です。はい。

<?php // 色づけ用
// class/Ethna_MailSender.php (2007-04-19 14:59:38版?)
function _parse($mail)
{
(中略)
$header[$i][] = preg_replace('/([^\x00-\x7f]+)/e', "Ethna_Util::encode_MIME('$1')", $value);  // ここから抜けられない
}
?>

うーん。

あと、ソース自体が今は多少変更あるみたいですが、こことは関係ないはず。*1
でも、やっぱりテンプレートの文字コードをちゃんとあわせい!という話な気もする。いや、気じゃなくてそうだ。

*1:〜はず。というところがポイントである

AIR Beta3

AIR Beta3が出ていたのでいれてみるとまたいろいろ動かなくなる。
例によってアプリケーションディスクリプタファイルの仕様が変更されている様だ。

invalid application descriptor: application filename must have a non-empty value.

とか表示されるし。
いろいろ調べてみたところ、

が主立ったところか。直してみたらとりあえず動く様にはなったが、まだ目的のプログラムは動かない。起動はするのだが。
参考にしたページはここ
その中で紹介されていたアプリケーションディスクリプタファイルをそのまま掲載。

<?xml version="1.0" encoding="utf-8" ?>
<application xmlns="http://ns.adobe.com/air/application/1.0.M6">
<id>com.example.ExampleApplication</id>
<name>Example Co. Example Application 1.0</name>
<version>1.0</version>
<filename>Example Application</filename>
<description>This is a sample AIR application.</description>
<copyright>(c) 2007 Example Co., Inc.</copyright>
<initialWindow>
<content>〜.swf</content>
<title>Example Application</title>
<systemChrome>standard</systemChrome>
<transparent>false</transparent>
<visible>true</visible>
</initialWindow>
</application>

今日はここまでかなぁ。

YAML

PHPYAMLを読み込ませたかったので調べたら次のライブラリが簡単で便利だったので紹介。

"spyc"
a simple php yaml class

Spyc is a YAML loader/dumper written in PHP. Given a YAML document, Spyc will return an array which you can use however you see fit. Given an array, Spyc will return a string which contains a YAML document built from your data.

http://spyc.sourceforge.net/

使い方は非常に単純でsourceforgeからダウンロードしたtar.gzの中にspyc.php, yaml-dump.php, yaml-load.php といったファイルがあるのでそれらを自分が呼び出せる位置に置く。
ここでは、スクリプトの下のspycディレクトリに置いたとします。

<?php
require_once("spyc/spyc.php");
$yaml = Spyc::YAMLLoad('sample.yaml');
?>

これで、sample.yamlの内容(構造)が$yamlで表現されます。
上の例は解析だけだったけど、逆にYAMLを出力することもできる。便利だ。

これを使って何を企んでるのかというと、任意のYAMLを解析してその出力結果をハードウェア設計の方に利用しようかと。
ある程度動くところまで書けたので今日はここで終わり。