2010年3月25日木曜日

秋月 LED電光掲示板キットを動かしてみる

電源入れてみただけ、の次は、用意されている環境で動かしてみる。

・秋月 USB-シリアル変換ケーブルのドライバインストール
Windows Vista (Home Premium, 32bit)だけど大丈夫だよね?と思いながら。大丈夫でした。Windows Updateに探しに行ったまま5分10分くらい帰ってこなかったけど。

・ハンブルソフトからソフトウェア一式最新版ダウンロード、インストール
キットの開発元ハンブルソフトのサイトからソフトウェア一式をいただいてくる。
http://www.humblesoft.com/j405board/denkowDisp1/download.html

・ファーム書いてみる
ハンブルソフトのH8フラッシュ・ライターでファーム"v62D16M105.mot"を書いてみる。

なんか失敗って言われました。5分くらい悩んで、USB-シリアル変換ケーブルをUSBハブ経由ではなくPCに直接接続して、解決。あるよねーこういうこと。あるある。
僕のPC(SONY VAIO type S VGN-SZ94S)にはUSBコネクタが2個しかないのでちょっとつらい。

・DenkowDispを使ってみる
ファーム書き込みがシリアル通信でできたというところで問題は無いと思いつつ、とりあえず動作確認。マニュアルに書いてある(キット付属CDに同梱されている)アプリに比べてずいぶん多機能になってる。

・Htermでファームを書いてみる
Htermはルネサス謹製の通信ソフトで、ターゲットにモニタプログラムを書き込んでデバッグができる。ファームの書き込みもできる。
キットについてきたHtermはかなり前のもので、試したけど起動できなかった(正確には起動しても一瞬で終了してしまう)。

ルネサスのサイトから最新版をいただいてきて、起動。問題無くファームの書き込みもできた。書き込み中、キャンセルボタンがついたダイアログは表示されるけど、プログレスバーがみたいなのが表示されないのでちょっと不安になる。

ちまちま調べてると、この「モニタプログラム+Hterm」の組み合わせが思ってたより強力なツールみたい。初学者が勉強するに当たって、開発環境が充実しているってのは良いですね。

とりあえず今日はここまで。

2010年3月23日火曜日

秋月 LED電光掲示板キット買ってきた

LED電光掲示板キット(完成品)
http://akizukidenshi.com/catalog/g/gK-01041/

24W級スイッチングACアダプター5V4A
http://akizukidenshi.com/catalog/g/gM-00025/

USB・シリアル変換ケーブル(延長ケーブル付)
http://akizukidenshi.com/catalog/g/gM-00721/

しめてジャスト1万円。

今日はとりあえず電源つないでサンプルが動作することを確認しただけ。

100323-000207_320x240

ひさしぶりに秋葉原行ったけど、表通り(中央通り)に飲食店増えたなー。

2010年3月16日火曜日

秋月 LED電光掲示板キット

組込みの勉強でもするべかな、と思って個人的に買おうかと思ってちょっと前にチェックしてみたら在庫切れだった。それからしばらく在庫切れ状態が続いてたんだけど、今日ふとまた見てみたら、完成品になって帰ってきてた。

http://akizukidenshi.com/catalog/g/gK-01041/

これは…、「買い」か?

2010年1月27日水曜日

SDK for FeliCa & Adobe AIR / Adobe Flash

Sony Japan | SDK for FeliCa & Adobe® AIR® / Adobe® Flash® | ICS-DAF/B010J S010J
http://www.sony.co.jp/Products/felica/pdt/adb.html

いつの間にか、こんなステキなものがリリースされてた。FeliCaを使ったAIR / Flashアプリが作成できるSDK。

無償ダウンロードできるのは「Basic」版で、かなり制限されていそうなのは確か。Felicaカードにはアクセスできないのかな。検知はできるらしいけど。あとモバイルFeliCaのフリー領域は平文通信できるみたい。僕おサイフケータイ持ってないけど。

とりあえずダウンロードしてみた。Flex SDKでどうやって使うかだな。

2010年1月23日土曜日

経路探索をWSH(JScript)で書く

人生を書き換える者すらいた。: 人材獲得作戦・4 試験問題ほか
http://okajima.air-nifty.com/b/2010/01/post-abc6.html

先週あたり、はてブ界隈でもちょっとにぎわっていたようで、今さらながら答えてみました。詳細は上記元記事参照。

結局、制限時間の3時間はちょっと越えたかな…。途中に別件が挟まったから正確な時間はわからないけど。経路探索はダイクストラ法を卒研で使ったので、今回の問題の解法もまあまあイメージできたんだけど、さすがにこれは遅いよなぁ。

最初Cで書き始めて、ほぼ書きあがったところでPCに実行環境が整ってないことに気づいてWSH(JScript)に書き換えたりした。最初からこっちで書いてたら2時間ちょいくらいで書けてたかもね。それでも遅いことに変わりはないけど。

せっかくだからソース晒すぜ。もともとCで書いてたことと、WSH+JScriptの書き方よく知らないってのもあってかなりグダグダ。

<?xml version="1.0" encoding="Shift_JIS" standalone="yes" ?>
<package>
<job id="ShortestPath">
<?job error="True" debug="True" ?>
<object id="objFs" progid="Scripting.FileSystemObject" />
<script language="JavaScript">
<![CDATA[
// Map Size
var MAP_SIZE_X = 32; // Map Size(横)
var MAP_SIZE_Y = 16; // Map Size(縦)

// Map Status
var MAPST_START = 0x80; // "S": Start
var MAPST_GOAL = 0x40; // "G": Goal
var MAPST_WALL = 0x20; // "*": Wall
var MAPST_FOOTPRINT = 0x10; // "$": FootPrint

var DIST_MAX = 0xFFFF; // Startからの距離、初期値

var buf = new Array(MAP_SIZE_X);

var Map = new Array(MAP_SIZE_X); // Map Data
var DistFromStart = new Array(MAP_SIZE_X); // Startからの距離

var myx, myy, goal, goalx, goaly;

// 2次元配列作成
for(i=0; i<MAP_SIZE_X; ++i) {
Map[i] = new Array(MAP_SIZE_Y);
DistFromStart[i] = new Array(MAP_SIZE_Y);
}

// FileからMap Dataの読み込み
var objTs = objFs.OpenTextFile("map.txt", 1, false);

myy = 0;
do {
buf=objTs.ReadLine();
WScript.Echo(buf); // Map Data表示

for(myx=0; myx<buf.length; ++myx) {
if(buf.charAt(myx) == "S") {
Map[myx][myy] = MAPST_START;
} else if(buf.charAt(myx) == "G") {
Map[myx][myy] = MAPST_GOAL;
} else if(buf.charAt(myx) == " ") {
Map[myx][myy] = 0x00;
// } else if(buf.charAt(myx) == "*") {
} else {
Map[myx][myy] = MAPST_WALL;
}
}
if(myy+1 > MAP_SIZE_Y) break;
++myy;
}while(!objTs.AtEndOfStream);

objTs.Close();

// Startからの距離配列を初期化
for(myx=0; myx<MAP_SIZE_X; ++myx) {
for(myy=0; myy<MAP_SIZE_Y; ++myy) {
if(Map[myx][myy] == MAPST_START) {
DistFromStart[myx][myy] = 0; // Start位置
} else {
DistFromStart[myx][myy] = DIST_MAX; // Start以外は未知、無限遠と仮定
}
}
}

while(1) {

for(myx=0; myx<MAP_SIZE_X; ++myx) {
for(myy=0; myy<MAP_SIZE_Y; ++myy) {
if(DistFromStart[myx][myy] != DIST_MAX) {
// 到達可能であれば足を伸ばす
// 上
if(myy > 0) {
if((Map[myx][myy-1] & MAPST_GOAL)) {
// Goalにぶつかった時点で最短のはず
DistFromStart[myx][myy-1] = DistFromStart[myx][myy] + 1;
goalx = myx;
goaly = myy-1;
goal = 1;
} else if((Map[myx][myy-1] & (MAPST_START | MAPST_WALL)) == 0x00) {
if(DistFromStart[myx][myy-1] > (DistFromStart[myx][myy] + 1)) {
// 最短距離を更新する
DistFromStart[myx][myy-1] = DistFromStart[myx][myy] + 1;
}
}
}

// 右
if(myx < MAP_SIZE_X) {
if(Map[myx+1][myy] & MAPST_GOAL) {
// Goalにぶつかった時点で最短のはず
DistFromStart[myx+1][myy] = DistFromStart[myx][myy] + 1;
goalx = myx+1;
goaly = myy;
goal = 1;
} else if((Map[myx+1][myy] & (MAPST_START | MAPST_WALL)) == 0x00) {
if(DistFromStart[myx+1][myy] > (DistFromStart[myx][myy] + 1)) {
// 最短距離を更新する
DistFromStart[myx+1][myy] = DistFromStart[myx][myy] + 1;
}
}
}

// 下
if(myy < MAP_SIZE_Y) {
if(Map[myx][myy+1] & MAPST_GOAL) {
// Goalにぶつかった時点で最短のはず
DistFromStart[myx][myy+1] = DistFromStart[myx][myy] + 1;
goalx = myx;
goaly = myy+1;
goal = 1;
} else if((Map[myx][myy+1] & (MAPST_START | MAPST_WALL)) == 0x00) {
if(DistFromStart[myx][myy+1] > (DistFromStart[myx][myy] + 1)) {
// 最短距離を更新する
DistFromStart[myx][myy+1] = DistFromStart[myx][myy] + 1;
}
}
}

// 左
if(myx > 0) {
if(Map[myx-1][myy] & MAPST_GOAL) {
// Goalにぶつかった時点で最短のはず
DistFromStart[myx-1][myy] = DistFromStart[myx][myy] + 1;
goalx = myx-1;
goaly = myy;
goal = 1;
} else if((Map[myx-1][myy] & (MAPST_START | MAPST_WALL)) == 0x00) {
if(DistFromStart[myx-1][myy] > (DistFromStart[myx][myy] + 1)) {
// 最短距離を更新する
DistFromStart[myx-1][myy] = DistFromStart[myx][myy] + 1;
}
}
}
}
if(goal == 1) break;
}
if(goal == 1) break;
}
if(goal == 1) break;
}

// Goalから足跡を逆にたどっていく
myx = goalx;
myy = goaly;
while(1) {
// 上
if(myy > 1) {
if(Map[myx][myy-1] == MAPST_START) break; // 逆探索終了
if(DistFromStart[myx][myy-1] == (DistFromStart[myx][myy] - 1)) {
Map[myx][myy-1] = MAPST_FOOTPRINT;
myy = myy-1;
continue;
}
}

// 右
if(myx < MAP_SIZE_X) {
if(Map[myx+1][myy] == MAPST_START) break; // 逆探索終了
if(DistFromStart[myx+1][myy] == (DistFromStart[myx][myy] - 1)) {
Map[myx+1][myy] = MAPST_FOOTPRINT;
myx = myx+1;
continue;
}
}

// 下
if(myy < MAP_SIZE_Y) {
if(Map[myx][myy+1] == MAPST_START) break; // 逆探索終了
if(DistFromStart[myx][myy+1] == (DistFromStart[myx][myy] - 1)) {
Map[myx][myy+1] = MAPST_FOOTPRINT;
myy = myy+1;
continue;
}
}

// 左
if(myx > 1) {
if(Map[myx-1][myy] == MAPST_START) break; // 逆探索終了
if(DistFromStart[myx-1][myy] == (DistFromStart[myx][myy] - 1)) {
Map[myx-1][myy] = MAPST_FOOTPRINT;
myx = myx-1;
continue;
}
}

break; // ここに来るのはおかしい
}

// 最短ルートを載せて結果表示
for(myy=0; myy<MAP_SIZE_Y; ++myy) {
buf = "";
for(myx=0; myx<MAP_SIZE_X; ++myx) {

if(Map[myx][myy] == MAPST_START) {
buf += "S";
} else if(Map[myx][myy] == MAPST_GOAL) {
buf += "G";
} else if(Map[myx][myy] == MAPST_WALL) {
buf += "*";
} else if(Map[myx][myy] == MAPST_FOOTPRINT) {
buf += "$";
} else {
buf += " ";
}
}
WScript.Echo(buf);
}

]]>
</script>
</job>
</package>

JScriptソースを適当な名前("ShortestPath.wsf"とか)で保存、入力マップファイル"map.txt"も同じフォルダに入れておく。そしておもむろにコマンドプロンプトから"cscript ShortestPath.wsf"。

入力ファイル"map.txt"はこんな感じ。

**************************
*S* * *
* * * * ************* *
* * * ************ *
* * *
************** ***********
* *
** ***********************
* * G *
* * *********** * *
* * ******* * *
* * *
**************************

すると、出力される結果はこう。

**************************
*S* * $$$ *
*$* *$$*$ ************* *
*$* $$* $$$************ *
*$$$$* $$$$$ *
**************$***********
* $$$$$$$$$$$$$ *
**$***********************
* $$$$$*$$$$$$$$$$$$$$G *
* * $$$ *********** * *
* * ******* * *
* * *
**************************

この試験問題に取り組んでわかったことは、「もっとコード書こうぜ、俺」ってことかなー。この程度のボリュームのソースでも、胡散臭さがぷんぷんするもんな。もう長いこと、組み込み(言語はC)でメンテナンス程度しかコードいじってない。

ま、ちょっとこれきっかけでプログラミング熱が高まってきたので、よしとしよう。よしでお願いします。

2009年7月17日金曜日

Flex 3 SDK単体ではFlexチャートコンポーネントが使えない

ちょいとBarChartを使ってみたいなと思って

Adobe Flex 3 ヘルプ
http://livedocs.adobe.com/flex/3_jp/html/help.html?content=charts_types_03.html

のサンプルコードをコンパイルしてみたんだけど

エラー: 型が見つからないか、コンパイル時定数ではありません : BarChart。

と言われてしまった。

結論から言うと、Flex 3 Builder PROのライセンスが必要ってことかな。「バージョン別機能比較」表の「データの視覚化 - チャート用コンポーネント」がこれに当たる項目なんだと思う。

Adobe - Flex 3:アップグレード情報
http://www.adobe.com/jp/products/flex/upgrade/

ちなみに"Axiis"というオープンソースのFlex用Data Visualization Frameworkがあるらしい。気が向いたら試してみよう。

MOONGIFT: » Flexを使ったデータビジュアライザ「Axiis」:オープンソースを毎日紹介
http://www.moongift.jp/2009/06/axiis/

2009年5月14日木曜日

2000年製ノートPCにXubuntuをインストールしてみた

DynaBook SS 3410ってノートPCが家で用途もなく寝てて、最近やっとちょっとLinuxでも使ってみようかと思って試しにインストールしてみました。

とはいえDynaBook SS 3410のスペックは

  • Intel Celeron 400MHz
  • RAM 64MB (192MBに増設済)
  • HDD 6GB (40GBに増設済)
  • OS Windows 98 SE (Windows 2000 SP4にアップグレードだったかクリーンインストール済)

というもの。特にRAMがきつい。Windows 2000はこれでも結構使えるんだけど。

調べてみると、Ubuntuのデスクトップ環境(GNOME)をXfceに置き換えたXubuntuというのが、結構低スペックなマシンでもまともに動くらしい、と。

Xubuntu Home Page | Xubuntu
http://www.xubuntu.org/

あともうひとつ問題があって、このPC、CDドライブは内蔵でなく、しかも手元に外付けCDドライブが無い。

どうしようかな、と思ったんだけど、結論から言うとWindowsからAlchol 52%でLiveCD(Desktop版)のisoファイルをマウントして、インストーラから普通にインストールできた。(1回目はインストーラを起動してもウンともスンとも言わなかったけどマウントし直したりなんかしてるうちに起動した)

今ってWindowsのファイルシステム上にインストールしてデュアルブートとかできるんすね…どんどん敷居が低くなってきてるなぁ。

ちなみにWubiのほう(単体)も試してみてたんだけどこっちは何回起動してもウンともスンとも言わなかった。

窓の杜 - 【REVIEW】全自動で「Ubuntu」をインストールして手軽にLinuxを体験できる「Wubi」
http://www.forest.impress.co.jp/article/2008/11/28/wubi.html

ということであっけなくインストールできたんだけど、ちょっと使い物にならないくらい遅い…。このくらいのRAMでも結構サクサク動くらしい話がブログ界隈で見られるのに。

"Windowsのファイルシステム上にインストール"ってのが良くないのかな?ちゃんとパーティション切ってやればまた違ってくるのかも。

あと画面サイズが800x600になってて、本来の解像度1024x768が選べない。まあこれを調べる以前に遅くて使い物にならないので今は絶賛放置中。気が向いたらパーティション切ってインストールしてみるかも。

今は現在のメインマシンにandLinuxを導入中。