プログラム

Really Simple History

ajaxで画面の一部を更新する際、通常だとブラウザの「戻る」でユーザが所望する画面遷移が実現できないことがあるのだけれど、このライブラリを利用すると問題を解決することができる。

Really Simple History (RSH): Ajax history and bookmarking library
http://code.google.com/p/reallysimplehistory/

使い方は、ソースをダウンロードするとサンプルがついているのでソースを読めばわかりやすい。
このライブラリに関してprototype.jsと併用する際に生じる問題を以前調べていたのだけど、すっかり忘れていたのでメモ。
rsh.js中でJSONを利用するために付与されているjson2007.jsというソースがついているのだけれど、prototype.jsを利用する場合はこれが不要になるが、以下の記述をrsh.jsの履歴管理用のインスタンスを作る際に加えてオーバーライドしておく。

// 付属のjson2007.jsを利用する場合
//window.dhtmlHistory.create();
// prototype.jsを利用する場合
window.dhtmlHistory.create({
toJSON: function(o) {
return Object.toJSON(o);
}
, fromJSON: function(s) {
return s.evalJSON();
}
});
// 後は使い方は同じ
var yourListener = function(newLocation, historyData) {
// (戻る・進むボタン押下時処理記述)
}
window.onload = function() {
dhtmlHistory.initialize();
dhtmlHistory.addListener(yourListener);
};

本当、すぐ忘れる様になってしまった。
そして何かあるとblogを検索するとキーワードや解決策が見つかる様になってしまった。

<参照>
Really Simple HistoryでAJAXにブックマーク機能と履歴機能を付加する - Builder ZDNet Japan
http://builder.japan.zdnet.com/news/story/0,3800079086,20368617-2,00.htm

Rubyで複素数

リファレンスはruby-lang.orgのComplexクラスを参照。
リファレンスを見ればことは足りるのだけど、一応メモとして残しておく。

利用にはcomplexライブラリをrequireする

>> require 'complex'
=> true

複素数を定義する場合はコンストラクタで引数に実部、虚部を与える。

>> a = Complex.new(1,1) # 1+j
=> Complex(1, 1)
>> b = Complex.new(1,-1) # 1-j
=> Complex(1, -1)

また各メソッドで作られた複素数の実部、虚部、共役複素数が得られる。

>> b.real
=> 1
>> b.image
=> -1
>> b.conjugate
=> Complex(1, 1)

加減乗除はそのままでOK

>> a-b
=> Complex(0, 2) # 2j
>> a * b
=> Complex(2, 0) # 2

絶対値はabsメソッドで得られる

>> a.abs
=> 1.4142135623731  # ルート2の値

角度はargメソッドで得られる。得られる偏角(アーギュメント)の値はラジアン

>> a.arg
=> 0.785398163397448
>> 360 * a.arg / (2.0 * Math::PI) #ラジアン→度
=> 45.0

こんなところだろうか。
どうも信号処理系の仕事をするとどうしても複素数が必要になってしまうのでメモとして残しておく。
数宇Bバンザイ。*1
当初はExcelの上で無理やり計算していたのだけど、結局Rubyのシェル(irb)上で計算していく方がわかりやすかったりするので…。

*1:私はまだ数学Bに複素数が残っていた世代。最近はベクトルだけになってしまっている。

符号ビットを頭に詰める話

続けてVHDLの話。
例えば符号付き4bitの値を符号付き8bitに広げる場合、

signal data : std_logic_vector(3 downto 0);
signal data2 : std_logic_vector(7 downto 0);
process(....)
variable tmp : std_logic_vector(7 downto 0);
begin
tmp := data(3) & data(3) & data(3) & data(3) & data;   # 変数代入
data2 <= tmp * tmp;  # 信号代入
-- (省略)
end process;

というのが、一案、詰めるビットが多い場合はこうも書けるなぁ。と。

process(...)
variable tmp : std_logic_vector(7 downto 0);
begin
if data(3) = '1' then
tmp := X"F" & data;
else
tmp := X"0" & data;
end if;
data2 <= tmp * tmp;
-- (省略)
end process;

見た目のわかりやすさもあるから、どちらがよいだろう。
詰める符号ビットの数が多い場合は下の書き方だろうなぁ。上の書き方だと見たまんま。というのもあるが。

奥が深い。

コマンドラインでJavaプログラムを実行する際のプロキシ指定

JavaでHTTPコネクション(net.HttpClientとか)を利用したコマンドラインプログラムを実行する際、実行する環境から外部サーバ等へのアクセスがHTTPの場合プロキシの設定が必要な場合がある。
プログラム中で設定してもよいのだけど、特に設定をしていなかった場合はjavaコマンドの引数でシステムプロパティを直接設定してやればよい。

  • システムプロパティ
    • プロキシサーバのホスト名設定 : http.proxyHost
    • プロキシサーバのポート番号 : http.proxyPort

たとえば、利用中のプロキシホスト名が"myproxy"でポート番号が8080でwebgetというクラスファイルを実行したい場合は、

$ java -Dhttp.proxyHost=myproxy -Dhttp.proxyPort=8080 webget

といった具合でよい。
あまりに久しぶりにJavaを触っていなかった*1ので最近リプレイスした仕事用PCにSDKが入っていなくてびっくりしてしまった。(親機の方には入っていたけど)

*1:Hadoopも動かすのにはJREでよいし、Hadoop Streamingで使っていたのでJavaプログラムそのものを触る必要がなかったのだ...

HadoopでSlaveの構成がヘテロな場合

Hadoopのクラスタを組んで、Slaveが全て同じスペックではなく、数台スペックが異なるマシンが含まれていた場合。
たとえば、そのスペックの異なる数台のマシンのスペックが高く(搭載コア数が多い)優先的にタスクを割り当てることはできるのだろうか?あるいは、割り当てるタスク数をそのスペックの高いマシンには多く割り当てる様にする。とか。

mapred-site.xmlのmapred.map.tasksの数を変えるだけだとCPUコア単位でなくマシン単位でジョブが均等に割り付けられてしまうのだが…。
この辺りの情報がネットから見つけられない。*1

*1:検索スキルが足りないという話もある...

MacOSでJavaSDKのバージョンを切り替える

すぐにネットで方法が見つけられた。

JDK5 と JDK6 の切り替えは Java Preferences ユーティリティで
どの JDK を使うかをユーザー単位で設定するにはアプリケーション>ユーティリティ>Java Preferences を使います。Java SE 6 を一番上に持って行きます。
Mac OS X で Java SE 6 を使う : JDK6 をデフォルトに設定する - Masaki Katakai's Weblog

訳あって自分のMacBookJDKのバージョンを切り替える必要があったのだけど、これで万事解決。

Nabaztagと戯れる。の補足。

Nabaztagと戯れる(その1)で書いた記事にコメントを頂いたので補足。

このときの書き方は非常にまずくて自分で書いたNabaztagの制御用APIにアクセスするラップクラスを載せていなかったのでこのままでは実行できません。
まず、ここではPEARのHTTP_Clientを使っているので、もし現在インストールされていなければインストールが必要です。
未インストールの場合は次の様に入力すればOKになります。

$ pear install --alldeps HTTP_Client

で、前回requireしていた"Nabaztag.php"は、以下の様な内容でした。
やっていることは...全然たいしたことはしていなくて、Nabaztagの公開されているAPIにHTTPでアクセスを行うという内容です。
いま思えば、わざわざHTTP_Client使わなくてもいいんじゃない?という気もするけど...。(GETしてるだけだし...)

ともあれ、下のソースを参照できる場所に置いてもらって以前の記事のソースを実行すれば、側にいるウサギが喋る。か、ポッドキャストを再生するはずです。
ちなみにserialとtokenには、http://my.violet.net/からログインして、割り当てられているシリアルナンバーとトークンナンバーを入力すればOKです。
それぞれのナンバーは、操作したいNabaztagで、登録アプリの設定→エコシステムのタブを選択で表示されます。
f:id:hideack:20091031012319j:image
あと、大変に重要な事ですが、これNabaztagを買ったときの勢いで書いてそれっきりなので、エラーも何もみていません。
日本語しかウサギにしゃべらせられません。等々いろいろありますが、あらかじめご了承くださいませ。
NabaztagAPIは他にもいろいろあるので多少まともにすべく、手を加えたいところです。
あいかわらず大雑把ですがご参考まで。

[]2009/11/8 掲載時のコピペミスで一部削れていた点を修正

<?php
require_once("HTTP/Client.php");
// Nabaztag.php
class Nabaztag
{
private $serial;
private $token;
private $httpclient;
// --- Nabaztag Web APIの位置
private $api;
private $streamapi;
function __set($name, $value){
switch($name){
case "serial":	$this->serial = $value;	break;
case "token":	$this->token  = $value;	break;
default: break;
}
}
public function __construct(){
$this->httpclient =& new Http_Client();
$this->api       = "http://api.nabaztag.com/vl/FR/api.jsp?sn=%s&token=%s&";
$this->streamapi = "http://api.nabaztag.com/vl/FR/api_stream.jsp?sn=%s&token=%s&";
}
public function say($message){
$message = urlencode($message);
$command = sprintf(
$this->api."voice=JP-Tamura&tts=%s",
$this->serial,
$this->token,
$message
);
$this->httpclient->get($command);
}
public function playMp3($list){
$command = sprintf(
$this->streamapi."urlList=%s",
$this->serial,
$this->token,
$list
);
$this->httpclient->get($command);
}
}
?>

Amazon SimpleDBと戯れる – 概要と設定

Amazon Web Services Blogを読んだので試しにamazon SimpleDB (http://aws.amazon.com/simpledb/)を利用してみた。1Gbyteまでであれば利用無料。
特徴は...

  • AmazonS3等のサービスと同様に設計されているのですぐに利用可能で且つスケーラブルとなっている
  • 現在のところベータサービス
  • データベースの考え方
    • テーブルに該当するものをSimple DBでは"domain"と呼ぶ (スプレッドシートのテーブルの様なもの)
    • ドメインの中には単数および複数の"item"が存在する (テーブルの"行"に相当)
    • 1つの"item"は単数あるいは複数の"attribute"を持つ (テーブルの"列"に相当)
    • "attribute"は複数の"value"を持つ (テーブルの各セル内の情報に相当, RDBと異なり複数の値を入れることができる)

f:id:hideack:20091004185306p:image
利用の開始前には、登録をしておく必要があるのでAWSのアカウントは必須。
アカウントを持っていれば、Amazon Simple DBのページを開いて画面右側にある"Sing Up For Amazon SimpleDB"というリンクをクリックして開設手続きをする。
f:id:hideack:20091004181642j:image

昨日の日付

<?php
$date = date("Ymd", strtotime('yesterday'));
?>

好き嫌いが分かれるところ。

PHPでインターネットソケット

結局、cURLでコーディングしたので使わなかったのだけど、こちらもメモとして。

<?php
$fp = fsockopen("www.yahoo.co.jp", 80, $errno, $errstr, 30);
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: www.yahoo.co.jp\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
?>

む。リファレンスままになってしまった。