dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

GD::Graph で日本語表示

2007-02-12 02:02:28 | perl
グラフを描くのに便利な perl の GD::Graph ですが、gd-2.0.33 で日本語を表示させようとしてうまくいきませんでした。

いろいろ調べていたら、教えて!gooで、gd-2.0.28 で日本語表示ができたという情報をみつけたので、早速 gd-2.0.28 をインストール。

ソースは以下の URL で取得して、普通に configure、make、make install でインストール。
http://www.boutell.com/gd/http/gd-2.0.28.tar.gz

gd-2.0.33 では日本語が表示できませんでしたが、gd-2.0.28 では問題なく表示できました。

ちなみに折れ線グラフで各線のタイトルを日本語で表示するのに以下のようにしました。

GD::Text->font_path("/usr/share/fonts/ja/TrueType/");
$graph->set_legend_font("kochi-gothic.ttf", 10);
for (my $i = 0; $i < @akw; $i++) {
$akw[$i] = Encode::encode('utf-8', $akw[$i]);
}
$graph->set_legend(@akw);

script タグで json

2007-02-10 23:24:25 | emacs
サーバと通信すると、同一のドメインのサーバに限定されてしまいますが、script タグなら他ドメインのサーバの JavaScript を読み込むことができます。
動的に script タグを生成して JSON 形式のデータを読み込めば、ドメインを意識せずに ajax を実現できます。

script タグで script オブジェクトを生成しておいて、
<script id="..."></script>
動的に script タグを生成して、この script オブジェクトを新しい script オブジェクトに置換します。

var new_script = document.createElement("script");
new_script.id = script_id;
var script.parentNode.insertBefore(new_script, script);
script.parentNode.removeChild(script);
script = news_script;
script.src = url;

サーバが返すデータは以下のような JavaScript の代入文です。
data = ...;

データに日本語などマルチバイトの文字が含まれる場合には、これらの文字列を uXXXX のように Unicode の文字コードにエンコードしておくと文字化けしません。

それから、script.src = url を実行してから実際にサーバのデータを読み込むには少し時間がかかります。
Firefox の場合には script に onload イベントを指定することができますが、IE の場合には onload イベントが使えないようです。
そのため IE ならデータがダウンロードされたかをチェックする関数を作成して、データがダウンロードされたら次の処理を実行するようにする必要があります。
それにはサーバから返される json オブジェクトが、リクエストしたデータと一致しているかをチェックできるようにしとくとよいでしょう。

setTimeout("wait_json()", interval);

function wait_json() {
if (json データがダウンロードされていたら) {
{次の処理};
}
else {
setTimeout('wait_json()', interval);
}
}

iffame で読み込まれた html を参照する方法

2007-02-03 23:46:29 | emacs
iframe で読み込まれた html を親ページの JavaScript で参照するには、contentWindow を使います。


<iframe id="iframe_id" src="child.html"></ifrmae>

上記のタグで child.html を読み込んでいる場合、親ページから child.html のソースは以下のようにして参照します。

document.getElementById("iframe_id").contentWindow.document.body.innerHTML