プログラム

VHDLと乗算

メモ。
というか、最近書いてなかったのですっかり頭から抜けていたので。

VHDL記述において、乗算は

c <= a * b

と書ける訳だが*1、冒頭のパッケージ呼び出しで

library IEEE;
use IEEE.std_logic_1164.alluse IEEE.std_logic_unsigned.ALL; -- ココが下と違う

としてしまうと1つの乗算に対してFPGA内の3つの乗算機を使用する様に論理合成される。
一方、

library IEEE;
use IEEE.std_logic_1164.alluse IEEE.std_logic_signed.ALL; -- ココが上と違う

とすると1つの乗算機が利用される。
std_logic_vectorを符号付きのバスとみるか否かで分かれる。ということ。

*1:FPGAの中にDPSや乗算機はいるが...

prototype.jsのTemplateクラスが便利

今更ながら使ってみて便利なことに気づく。

<ul>
<div id=list></div>
</uL>

の様なHTMLがあったときに、JavaScript側から、

// prototype.jsはこの前で読まれているとして...
var listdata = [{"date":"2008/4/14", "title":"今日買った本"}, {"date":"2008/4/13", "title":"ラーメン"}];
var template = new Template("<li>#{date} - #{title}</li>");
liststr = "";
for(var i=0; i<listdata.length; i++){
liststr += template.evaluate(listdata[i]);
}
$('list').innerHTML = liststr;

などとやってやると、次の様に処理される。

<ul>
<div id=list>
<li>2008/4/14 - 今日買った本</li>
<li>2008/4/13 - ラーメン</li>
</div>
</uL>

つまり、Templateクラスのインスタンスを作る際に渡された文字列のテンプレート中の変数名と連想配列のキーを照合して、連想配列の値にテンプレートの変数の箇所を置換してくれる。

このライブラリにはまだまだ使ってない機能が山の様にあるので、早く押さえたいところです。

JavaScriptを使って画像 etc…をドラッグ&ドロップ

珍しくちゃんと9時というすばらしい時間に起きた。
昨日相談された件について、ささやかに協力できればと書いてみた。
一応、話は聞いているのでやりたいことのイメージは目の前にお寿司がくるくる回る中聞いたので、そんなにずれてはいないとは思うのだが。
とりあえず動く様になったので公開。

http://feeddown.com/jsdd/
(追記)下は、スクリーンショット。押しても動きません。
f:id:hideack:20080412124120p:image

使ったのはscript.aculo.usと、prototype.jsぐらいです。
script.aculo.usprototype.jsに依存して同梱されているので、実質手でダウンロードしたのはscript.aculo.usのみ。
以下、ほぼ特定人物宛のみのメッセージになるので、私のこのblog初、「続きを読む」を使います....。

以下、簡単に現状のメモを残しておきます。

  • サーバーサイドにアクセスはしていませんので、ソースはブラウズした際に見えるものがすべてです。
  • ピンの位置は初回ロード時に乱数で設定しています。
    • ソースをみてわかる通りコンストラクタで設定した箇所にピンがおかれます。
  • 2秒毎に乱数を振ってアイコンをモノクロ/カラーの切り替えをしています。
    • 本来は各ピンが持つ情報に従ってサーバーサイドに問い合わせをし、この切り替えを行うはずです。(間隔は知らないけど)
  • 保存ボタンを押すとピン数毎ループをまわして位置を表示します。
    • 本来は各ピンの位置を回収した後、サーバーサイドに投げて位置を保管させるはずです。
  • ピンの位置も現状はサンプルなのでドラッグ&ドロップできる様にしていますが、固定にすることも簡単にできる様に書いたつもりです。

最後に大事なことを。
これは、あくまでもWebアプリを書くのを本業としない人間が書いたものです。
専門にされている人が書くともっと違うかもしれません....。ご了承ください。

google map

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

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

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

紹介された時に配信された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 ファイルをロードする必要があります。・・・

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

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でも説明で「〜のフォルダ」と表示はされるのだけど、具体的にどこですか?状態だったので非常に助かった。

「インストーラーに特殊フォルダを使う」