2016年2月25日木曜日

Redmineでクリックすると値が加算されるフィールドを作る

Redmineのカスタムフィールドを使用して、値をクリックすると+1されるフィールドなんてものを作ってみました。早い話が「いいね!」ボタンです。

Wiki Extensionにはvoteがあるのでいいね!が使えますが、チケットにはありません。
 チケットでもやりたくなりいろいろ考えたところ、カスタムフィールドのURLリンク機能を使い、そこにJavascriptを直接記述する、という方法を見つけました。
我ながらなかなかイカス方法と思います。

・環境
Redmine 2.6.5(bitnami)

・設定

(Redmine管理者)
REST APIを有効に。
カスタムフィールドを作成し、整数、初期値0とする。ここでは「いいね!」という名前にしておく。
(プロジェクト担当者)
使うプロジェクトでこのカスタムフィールドを使うように設定。

・jsでのプログラム

下記プログラムを作成。
なお、cfid="1"とありますが、これはカスタムフィールドのIDです。作成したカスタムフィールドのIDに置き換えてください。
あとパスも環境に合わせて直してください。


javascript:
cfid="1";
var keyreq=new XMLHttpRequest();
keyreq.open("GET", "/redmine/my/account", true);
keyreq.onreadystatechange=function(){
        if(keyreq.readyState == 4 && keyreq.status == 200) {
                keyres = keyreq.responseText;
                var key = "";
                result = keyres.match(/\<pre id\=\'api-access-key\'.*\>([0-9a-zA-Z]*)\<\/pre\>/);
                if(result != null){
                        key = result[1];
                }else{
                        alert("ng");
                        return;
                }

                var rreq=new XMLHttpRequest();

                rreq.open("GET", "/redmine/issues/%id%.xml?format=xml&key=" + key, true);
                rreq.onreadystatechange=function(){
                        if(rreq.readyState == 4 && rreq.status == 200){
                                var xml = rreq.responseXML;
                                var value = %value%;
                                cfs = xml.getElementsByTagName("custom_field");
                                for (i = 0; i < cfs.length; i ++) {
if (cfs[i].getAttribute("id") == cfid) {
value = parseInt(cfs[i].getElementsByTagName("value")[0].textContent, 10);
}
                                }

                                var req=new XMLHttpRequest();
                                req.onreadystatechange=function(){
if (req.readyState == 4) {
location.reload()
}
                                };
                                req.open('PUT',"/redmine/issues/" + %id% + ".xml?format=xml&key=" + key);
                                req.setRequestHeader("content-type","application/xml");
                                req.send('<?xml version="1.0" encoding="UTF-8" ?>\n<issue><custom_fields type="array"><custom_field id="' + cfid + '"><value>' + (value + 1).toString(10) + '</value></custom_field></custom_fields></issue>');
                        }
                };
                rreq.send("");

        }
};
keyreq.send("");




これを、一行に直し、カスタムフィールドのリンクURLに設定する。

・動作原理
カスタムフィールドにはリンクを設定できるが、そこにjavascriptのコードが直接書けるようだ。
そこで、カスタムフィールドの更新のコードを入れることでクリックすると更新することが可能になる。

下記3回のアクセスを行っている。
1. keyを取得するために個人設定のページにアクセス
2. 元の値を取るためにGETアクセス(これをしないとチケットを開いてからしばらくたってクリックすると古い値+1で更新してしまう可能性がある)
3. カスタムフィールドの値を更新するためにPUTアクセス

URLリンク欄って結構長いコードも書けるようで驚き。
・免責
最近のRedmineでどうなっているかは不明。
また、プラグインを入れればいいじゃん、というご意見もごもっとも。

※コードはこちらを利用して変換して貼り付け。


2015年7月9日木曜日

Redmine + Backlogs の残り時間の集計表示をGreasemonkeyスクリプトで

要約

Redmine+Backlogs は便利だけど、あるスプリント内の担当者ごとの残り時間の合計がどこにも表示されないのが不便だよね、と思い、Greasemonkeyで手抜き解決した、というお話。


2015年4月25日土曜日

ブロックパズルの解法

ご無沙汰です。
色々あって技術的な研究から離れていましたが、
一旦落ち着きましたので戻ってまいりました。

リハビリを兼ねて久々にLimboを触りました。

たまたまガチャガチャで木のパズルを手に入れました。
下記のように、完成形は3x3x3の立方体になります。
ばらすとひとつづきの木のブロックになりますが、中にゴムひもが通っていて、回すことができます。2または3ブロックおきに曲がり角があります。



手で少しいじってみましたが、すぐに諦め、計算機で解法を求めることにしました。
(手でやるのも面白そうです。意外と色がヒントになりそうです)

3または2このブロックがつながっていて、関節で必ずどちらかの方向にカーブしなければなりません。すべての関節でカーブした結果、立方体に収まっていればOKとなります。
データ構造は意外と単純で、
連続ブロック数 x 節の数
で表されてしまいます。
ブロックの色は考慮しません。
曲がる方向は上下左右の4通り。これが関節数分の組み合わせが発生します。
関節数はこのパズルでは16あったので、4 ^ 16  の組み合わせになります。
40億通りくらい?
(こんなの手で解けるのでしょうか。)

※コードは割愛

ループを単純に回して、総当りさせてみました。
環境はi5 のCPUのWindowsノートパソコン上のACME-SACです。

解かせてみると試した環境では総当りに10時間くらいかかりそうです。
一晩動かしたら気づけば解けていました。(バグによりやりなおして3晩ほどかかりましたが、、、)
検算として実際のパズルに結果を適用すると完成!当たり前とはいえちょっとうれしい。

パフォーマンスですが、ACME-SACの環境(ほぼWindows上のemuと同じでしょうね)では1または2コアをだいたい専有し、全体の2,30%を使うようでした。
シーケンシャルに試していましたが、並行にするだけで結構早くなりそうな予感です。

ただ、それでもすべてのコアを使えないかもしれません。
その場合はemuを複数立ち上げ、分散してやるとフルに活用できるのではないかと
期待しています。

今回はそこまでは手が回りませんでしたが、久々のLimboは楽しかったです。
グリッド試そうかな。
 Goもやらないとな、、、

さて、このパズルプログラミングの題材としては結構適していると思いました。
ループを使ったり、多次元配列をつかったり、言語の機能が色々と試せます。
各試行は独立しているので並行処理もさせやすいです。
新人研修のネタにいいかも。

2012年7月21日土曜日

picoscopeがいい感じでアップデート

手軽なオシロスコープ、picoscopeのソフトウェアがアップデートされていました。
http://www.picotech.com/

いつのまにか日本語対応もちゃんとしているようで、すばらしい。

驚いたのが、シリアルデコードがRS-232Cに対応している点です。
かなり欲しかった機能なので期待大です。

やってみました。


すばらしい使い勝手の良さです。
この例では信号レベルは3.3Vですね。
abcdeとシリアルターミナルで打ち込んで.みました。
トリガーを適当にかけておくと波形が取り込まれ、シリアルとして解釈してくれます。
スレッショルドはトリガーのスレッショルドと連動してくれるので楽。
ボーレートを選べばいきなりデコードしてくれました。
その他の細かい設定も出来るようです。

すごいねこれ。
2chあればtx/rx取れる。
ロジックアナライザいらないじゃん。

2012年5月2日水曜日

flucard でinfernoを動かす

flucard
http://www.flu-card.com/jp/
というSDカードがあります。
これ自身が無線APとなり、デジタルカメラに入れっぱなしでもネットワーク経由で
画像を取り出せるという便利グッヅです。

なお、中身はlinuxであり、telnetでアクセスできたりと
いろいろできるようで、ちょっと前に話題になっていました。
ものすごい熱を発するのでカメラに入れるのはちょっと躊躇してしまいますが、
最小のLinuxマシンとして興味が湧いたので購入しました。

Telnetでログインできることを確認できたので、本題です。
arm-linuxあるところにinfernoあり、ということで、
infernoのポーティングです。
文鎮化が怖いので、 native infernoのポーティングは出来ませんが、
hosted infernoなら行けそう。

目標は、flucardでinfernoを動かし、styxでマウントして
画像を取り出すことです。

・ビルド環境構築

Qemu上のarm-linuxでセルフビルド(あるいみクロスビルド?)を行いました。
Qemuの環境構築については
http://inferno-hell.blogspot.jp/2011/10/qemuarm.html
http://inferno-hell.blogspot.jp/2012/04/lenny-no.html
 あたりを参照。
特に変更は無いはず。

infernoビルドに必要なソフトウェアをapt-getでインストールし、
infernoのソースツリーを持ってきます。
詳細は
http://inferno-hell.blogspot.jp/2011/10/wm.html
このへん。

ーーーこっから嘘情報ーーー
ただし、ソースツリーはtrunkではなく2009年あたりのIPv6対応前のものとします。
hg clone https://inferno-os.googlecode.com/hg/
hg update a682517fc1ec
IPv6対応にすると、host osがv6に対応していないためか、ネットワークアクセス時にエラーとなるようです。
このリビジョンの根拠は、infernoのipv6対応に関するissueが193にあり、日付から、
これより前のリビジョンで当たりをつけました。

最新のツリーとは若干ビルド方法が異なり、
mkconfig編集
パス通す
Linux/arm/bin,lib ディレクトリをそれぞれ作成(無いとエラーになる)
./makemk.sh実行
mk CONF=emu-g install (mk mkdirsはしない)
といった感じでした。
ーーーここまでーーー

ーーー追加ーーー
mkの前に、ipv6のOFFのための作業がいります。
emu/Linux/emu-gを編集し、
ipif6-posixをipif-posixに変更します。
で、./makemk.sh; mk mkdirs; mk CONF=emu-g install
としてビルド。
ーーーここまでーーー

Linux/arm/bin/emu-gが出来上がります。
ldd emu-gでこのプログラムが必要としているライブラリを確認し、
/lib以下の該当ファイルをとっておきます。

・flucardにinferno環境構築

flucardをパソコンに取り付け、infernoのファイルを配置します。

/sd/
  emu-g    ... inferno本体
  lib/         ... ライブラリをおいておく
  inferno/  ... infernoのルート。qemuからもってくのが面倒だったのでOSXから持っていった
  mkln.sh   ... ライブラリのリンクを貼るスクリプトを作成

こんな感じで配置をします。
mkln.shの中身は

#!/bin/sh
ln -s /mnt/sd/lib/ld-linux.so.3 /lib/
ln -s /mnt/sd/lib/libgcc_s.so.1 /lib/
ln -s /mnt/sd/lib/libpthread.so.0 /lib/
ln -s /mnt/sd/lib/libc.so.6 /lib/
ln -s /mnt/sd/lib/libm.so.6 /lib/

といったところ。sd/lib以下のファイルのリンクを/libに張ります。

・flucard上でinferno 起動

flucardをカードリーダーにさして電源を投入するとAPになります。
パソコンでそのAPに接続し、
192.168.1.1にtelnetログインします。
/mnt/sdにSDカードの内容が見えます。
cd /mnt/sd
./mkln.sh
./emu-g -r inferno
でinfernoが立ち上がります。

infernoのシェルで、
bind -c '#U*' /n/local
listen -A tcp!*!1024 {export /&}
と実行します。1024はとりあえずのポート番号で値はなんでもいいです。
これでflucardのSDの中身がstyxで公開されました。

・パソコン側のinfernoの操作

flucardのAPにつながっているパソコンでinfernoを立ち上げます。
絵を扱うのでwm/wmを起動しておきます。

シェルにて
mount -A tcp!192.168.1.1!1024 /mnt
とすると/mntにflucardがマウントされます。
/mnt/n/local/mnt/sd/
にSDカードが見えます。
この中の画像ファイルを探し、

wm/view ファイル名(小文字に直す)

としてやると、画像が表示できます。lsするとファイル名は大文字ですが、そのままだとviewが画像と思ってくれないので、小文字で指定します。





styxで無線経由で画像を取り出せるとは、胸が熱くなります。



ところで、flucardにはウェブインターフェースがあるから、
ウェブ経由で画像を取り出せばいいじゃん、という意見もあるかと思いますが、
まったくそのとおりなのです。
flucardにinfernoいらないじゃん。


charonで192.168.1.1に接続。
残念ながらcharonでは直接画像は表示できませんでしたが、
画像のダウンロードは可能でした。


ところで、画像の縮小表示ってどうやるんだろうね。

AVRでCFタイプのLANカードを制御しようと思ったが

AVR関連で面白いネタを見つけました。

AVRで動かすWebサーバ

というページなのですが、AVRにPCカードタイプのLANカードをさして
サーバーを立てるという試みです。
感銘を受けたため、 自分も真似することにしました。
手元に各種CF/PCMCIAのカードがあったので、機材には困りません。
調べてみると、どれもNE2000互換のカードばかりで、参照元ページとは制御が異なりそうです。

まずはPCカードの基本について書籍で学び、
AVRのピン割り当てを考えました。
Arduinoベースなのでピンアサインはいろいろ悩みました。

で、ピン配置も決まり、そろそろ配線するか、という段になり、
リード線をカードにさしこもうとしたところ、、、





ぬう、リード線がささらない、、、

完。


2012年4月30日月曜日

Lennyのサポート切れ対策

Debian Lennyがサポート切れになり、移行しなければならなくなりましたが、
組み込み系ではいまだにLennyが使われていると思われます。
しばらくはだましだまし使っていこうと思います。

apt-get が使えないのを何とかすれば何とかなりそうです。
/etc/apt/sources.listを書き換えて、apt-get updateしてやればよさそうです。
 (apt-get install debian-archive-keyring もいるの?)

・intel

deb http://archive.debian.org/debian lenny main contrib non-free


・arm(armel)

deb http://archive.debian.org/debian lenny main

こんな感じでいけました。

# お、ブログの編集画面が使いづらくなっていますな。


2012年3月16日金曜日

音楽プレーヤーをさくっと作成

AVRでSDカードの読み書きが出来るようになりました。

ポイントは

  • 5Vで動作させると面倒なので、2.7-3.6Vで駆動(信号線のレベルをSDに合わせる必要があるため)
  • 配線はサンプルスケッチの説明どおり
  • ATmega168Pでは容量不足か?ATmega328Pだと動いた


調子に乗って音声データをSDカードに入れて、それをPWMで
音にしてみました。
しょぼしょぼですが音楽プレーヤーの完成です。



動作の様子はこちら。

http://www.youtube.com/watch?v=UsRMV_p-O_8

思っていたより音が綺麗で笑えます。

PWMの出力はほぼそのままスピーカーに入れています。
一応手元の抵抗とコンデンサをつないでRCフィルター的な接続をしてみましたが、
意味はあるかわかりません。

電源は3VのACアダプタです。電圧が微妙なのは3.3Vが売り切れていたからだったりします。
スケッチを書き込むときは3V駆動ではだめなようで、
5V(USBから給電が簡単)にします。
動かすときはまた3Vに切り替えます。
まちがえて5Vを入れてしまったこともありますが、SDカードは壊れなかったようです。

まずはスペック。
音声データはモノラル8bit PCMで、サンプリングレート8000Hzとしました。
曲はビートルズのLove me do。ちなみに、オリジナルアルバムではなく、アンソロジーのテイクだったりします。
MP3データをaudacityでフォーマット変換しwavにしておきます。
ファイル名は決めうちで、wavファイルをSDカードのルートにおきます。
SDカードを取り付けた状態で電源を投入すると曲が再生されます。
終わったら停止します。つまり、1曲しか再生できずリピートもしません。
PWMはDigital9(pin15)を利用しています。
変な信号で機材を壊しては困るので、壊れても惜しくないスピーカーをつなぎます。
アクティブスピーカーじゃないと音が小さすぎるかも。

PWM周波数がデフォルトで500Hz弱と音声再生には使えない値なので、周波数は変更の必要があります。
方法はhttp://www.arduino.cc/playground/Main/TimerPWMCheatsheetを参考にしました。

これらを踏まえて、スケッチを作成しました。
ベースにしたのはサンプルのSD->DumpFileです。
読みとったデータをシリアル出力するところを書き換えて、PWMに出すようにしました。
サンプリング周波数はタイマーを使わず、delayで作っています。


  1. SDから1byte読む
  2. PWMでデータを出力
  3. delay(!!ダサい)


といった感じですね。なのでサンプリング周波数はてきとーです。
delay値は耳で聞いて決めました。めちゃくちゃですね。

そのうちちゃんとするとして、ひとまず音が出て楽しかったので勇み足で
ブログを書いたのでした。

スケッチは以下のようになりました。
簡単に出来てしまいました。


/*
SD card file dump

This example shows how to read a file from the SD card using the
SD library and send it over the serial port.

The circuit:
* SD card attached to SPI bus as follows:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4

created 22 December 2010

This example code is in the public domain.

*/

#include

// On the Ethernet Shield, CS is pin 4. Note that even if it's not
// used as the CS pin, the hardware CS pin (10 on most Arduino boards,
// 53 on the Mega) must be left as an output or the SD library
// functions will not work.
const int chipSelect = 4;
int sndPin = 9;

void setup()
{
Serial.begin(9600);
Serial.print("Initializing SD card...");
// make sure that the default chip select pin is set to
// output, even if you don't use it:
pinMode(10, OUTPUT);

// see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
// don't do anything more:
return;
}
Serial.println("card initialized.");

// pwm frequency is set to 31khz
TCCR1B = TCCR1B & 0b11111000 | 0x01;


// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
//File dataFile = SD.open("datalog.txt");
File dataFile = SD.open("test.wav");

//File outFile = SD.open("out.txt", FILE_WRITE);

// if the file is available, write to it:
if (dataFile) {
while (dataFile.available()) {
//Serial.write(dataFile.read());
//outFile.write(dataFile.read());
analogWrite(sndPin, dataFile.read());
//delay(1);
delayMicroseconds(80);
}
dataFile.close();
//outFile.close();
}
// if the file isn't open, pop up an error:
else {
Serial.println("error opening datalog.txt");
}
}

void loop()
{
}

2012年3月12日月曜日

Japaninoのブートローダー、fuseの復旧

引き続きAVRをいじっています。
本業が忙しいのでほそぼそですが。

現在SDカードをSPIモードでアクセスを試みています。
ディレクトリを読めたのでまずはOK。この件についてはそのうち。

ブレッドボード上にArduinoもどきを作っていますが、
リファレンス機として、大人の科学付録のJapaninoもたまに使っています。
が、てきとーにfuseビットを書き換えてしまい、
sketchを書き込めなくなってしまいました。
復旧方法を調べたのですが、まとまっていなかったので、
記録しておきます。

1. 機材

JTAGICE MKIIを使ってISP書き込みを行いました。
普通にISPライターを使えば良いのですが、たまたま手元にあったので、
オーバースペックですがISPライターがわりに使いました。

接続は、
jtagiceの凸となっているコネクタを、

1 3 5 7 9
2 4 6 8 10


というピン配列とすると、
AVR側(DIPの168のピン番号)とは


1: SCK(pin19 = D13)
2: GND
3: MISO(pin18 = D12)
4: Vcc
6: RESET(pin1)
9: MOSI(pin17 = D11)
※ほかのピンは放置


と接続します。
Japaninoの場合は、黒いピンソケットのD11-13, RESET, +5V, GNDを使いました。
別にICSPソケットは付けなくてもよさそうです。
リード線で結べばOK。



jtagiceをパソコンと接続し、japaninoをパソコンのUSBポートに接続したら
準備OK。
パソコン側ではAVR studioで書き込みを行います。


2. 情報のありか


さて、問題はどのブートローダーを書き込むのか、fuseビット等はどうするのか、
という情報ですが、
ウェブを探してもどうにも見つかりませんでした。

結局、大人の科学のサポートページからダウンロードできる、
開発環境にヒントがありました。

arduino-0018/hardware/arduino/boards.txt

というファイルがありました。中には、


japanino.name=Gakken Japanino(学研 大人の科学 ジャパニーノ)

japanino.upload.protocol=stk500
japanino.upload.maximum_size=14336
japanino.upload.speed=19200

japanino.bootloader.low_fuses=0xe2
japanino.bootloader.high_fuses=0xdd
japanino.bootloader.extended_fuses=0x00
japanino.bootloader.path=lilypad
japanino.bootloader.file=LilyPadBOOT_168.hex
japanino.bootloader.unlock_bits=0x3F
japanino.bootloader.lock_bits=0x0F

japanino.build.mcu=atmega168
japanino.build.f_cpu=8000000L
japanino.build.core=arduino


てなことが書かれていました。
つまり、ブートローダーはLilypad用のを使い、
fuseビットはL:e2, H:dd, Ex:00で、ロックビットは0fにしろ、ってことですね。

ブートローダーはサブディレクトリの

bootloaders/lilypad/LilyPadBOOT_168.hex

がそれっぽいですね。
ブートローダー書き込み、fuseビット書き込み、ロックビット書き込み、
という順番で作業を行いました。
できたっぽいです。
なお、fuseビットのextendedは読み込み直すとf8になり、
ロックビットはcfに見えますが、未使用のビットが1に見えるらしいので
正常に書き込めています。

で、動作確認はsketchのサンプルから適当に選び、
シリアルで書き込みます。
jtagiceは外さないとダメっぽいです。
サンプルはfadeあたりがわかりやすいですかね。



GNDとD9をLEDと抵抗(2-300Ωくらい?)で直列に結べば、ぼあーっとLEDが点滅する。
ワニ口クリップが意外と便利。


3. 外部クロックに対応


デフォルトのfuseビットには問題があり、
内蔵クロックで動作するらしいです。
せっかくjapaninoには水晶が乗っているので
これを使用することにします。

単にfuseビットのloをe2からe6にするだけみたいです。
一応動作はしましたが、
外部発振器が使われているかどうかは見た目ではわかりませんね。

2012年1月4日水曜日

投稿にゴミが付く

なんかbloggerの投稿にゴミが付く。
http://www.blogger.com/img/blank.gif
とかいう文字列が勝手に書き込まれて困る。

既知の問題かも。

Blogger Problem: http://www.blogger.com/img/blank.gif Appearing

確かに、リンクを貼ったときに出現する。なにこれ。

AVRをいじる

ニコニコ動画をみていて、

ブレッドボードでArduinoを作ってみた

というのを見つけました。
まさかこんなに簡単にAVRが動かせるとは思わなかったので、
さっそく部品を購入し、動画の通りに試してみました。

材料:
秋月電子の通販ですべてそろった。3000円くらいですかね。

組み立て方法は動画のとおりなので割愛。
ピンの数え間違えさえしなければ問題ないと思われます。
動画ではライターを使わないでROMの書き込みを行なっていたが、
たまたまライターが手に入ったので、そこはライターを使って楽をしました。
周辺回路はそれほど複雑ではないが、それでも結構手間取りました。
乱暴な言い方をすると、AVRは電源さえ繋げば動くように見えます。知らなかった。
まあ電源周りが難しいのですが。

その他参考動画:

【マイコン編 1回】 零からの電子工作 第36回:前編 回路の準備
ライターの接続と、開発環境の入手の参考に。

【マイコン編 2回】 零からの電子工作 第37回:初めての書き込み
Hello worldともいえるLED点滅プログラムの書き込みを。

やったこと:
・LED点滅のプログラムをCで書いて書きこむ
・Arduinoのブートローダーを書きこんで、スケッチを動かしてみる

動画の説明通りなので特にコメントはありませんが、
ちょっとハマった点があります。
winavrというツールチェーンは名前が変更になり、avr toolchainに
なったようです。
avr studioの新しいバージョンではwinavrの方は認識してくれないようなので、
avr toolchainが必須となります。

米粒程のAVRマイコン・・・ 使ってみたい
こちらのサイトで直リンクが紹介されていたので、それを使用。

あと、配線ミスしてシリアル(FTDIのシリアルUSB変換経由)が使えないということもありました。
ピンはちゃんと数えましょう、ということで。

さらに、protothreadsも試してみました。
マルチスレッド風にプログラミングできます。
それほどコードサイズは増加しないように見えるので、
導入の検討の価値はありかと思います。
プログラムサイズは使わなかったときに比べて206 -> 394 bytesといった感じ。
OSを動かすのはちょっと厳しいかも、という感触です(根拠は無い)。

2012年1月3日火曜日

ARToolkitを試す

今更ながら、ARが気になったので、ARToolkitを試してみました。
参考にしたサイトは、
工学ナビ - 「攻殻機動隊」「電脳コイル」の世界を実現! - ARToolKitを使った拡張現実感プログラミング

です。
そのまま真似しました。
カメラの性能がいまいちで、ピントがなかなか合わないのですが、
それでもうまくいきました。

ただ、使ったコンパイラのバージョンが異なるので、それによる違いだけメモしておきます。
windows 7 (64bit)上のVC2008 expressを利用しました。
program files(x86)/Microsoft Visual Studio 9.0/VC
がインストールディレクトリにあたるようです。

ただビルドするだけではDebugになっているので、説明とあわないようです。
構成をreleaseにしてやると、説明通りの実行ファイルができました。

2011年10月28日金曜日

QEMUでarm環境、そして



QEMUでARMをエミュレートしてLinuxを動かしてみました。

ARMのQEMUにDebianをnetinstallする
http://blog.kmckk.com/archives/2233167.html

を参考にインストールを試みましたが、インストーラーが途中で止まったので断念。

ビルド済みのユーザーランドを探しました(あ~あ)。

http://people.debian.org/~aurel32/qemu/armel/

にありました。debian lenny, squeezeがあるみたいです。
armel(EABI?)となっているやつじゃないとまずそうなので注意が要りそうです。

ダウンロードして、
qemu-system-arm -redir tcp:2222::22 -m 128 -M versatilepb -kernel vmlinuz-2.6.26-2-versatile -initrd initrd.img-2.6.26-2-versatile -hda debian_lenny_armel_standard.qcow2 -append "root=/dev/sda1"

であっさり起動。
redirオプションで外からSSHでつなげるようにしておいた。

で、infernoを動かしてみたところ、色が変になった。

2011年10月22日土曜日

フレームバッファでwm

フレームバッファでwmを表示させることができました(表示のみで、タッチパネルからのインプットはまだ)。
インストールガイド通りですが、感動。
Inferno 関係の人はパッケージングもビシっとするからすばらしい。

・環境
armadillo 440 液晶モデル相当。

OS:debianインストール済み。
ネットワーク:有線

・導入

足りないパッケージをapt-getでインストール

x-window-system-core
libxext-dev
gcc
make
mercurial

arm-gccコマンドがいるので、ln -s gcc arm-gccでリンク。

本流のOSを持ってくる。
cd /
hg clone https://inferno-os.googlecode.com/hg/

ひとまずそのままビルド
vi mkconfig
HOSTとTARGETとROOTを変更。
Linux/arm/binにパスを通す。
./makemk.sh
mk -s nuke mkdirs install
mk install

とりあえずarmで動くinfernoが作られる。

次に、フレームバッファ対応のコードを持ってくる。

hg clone https://bitbucket.org/santucco/inferno-fb

この中の、inferno-os/emu/を本流のemuの下に上書きコピー。
Linux-fbのmkfileを編集しろとのことなので、
vi mkfile
TARGETをなんか選べとのことなので、
TARGET=t42
とか適当にしておいた。

Linux-fbの下でmk installでビルドできるとのこと。

・実行
emu-fb
でemu起動。
wm/wmを実行すると。。。



すばらしい。
入力を受け付けないので操作はできないのですが、

wm/wm wm/bounce

とすると



と、アプリが動きます。

ちなみに、タッチパネルの種類をTARGETで選んだ理由は、出力ではなくて、
入力の都合なのではないだろうか。
t42を選ぶと、キーボードが/dev/input/event0、マウスがevent2とか選ばれるようだ。
入力についてはこれから調査予定。
USBマウスをつないでみたけど、使えなかった。

9fansメーリングリストより

9fansに衝撃の投稿が。

infernoがandroidの上で動く。(nexus sとnook)
http://9fans.net/archive/2011/09/308

ソース等
https://bitbucket.org/floren/inferno/wiki/Home

スラッシュドットでも話題に
http://linux.slashdot.jp/story/11/09/25/0718249/%E3%82%A2%E3%83%B3%E3%83%89%E3%83%AD%E3%82%A4%E3%83%89%E6%90%BA%E5%B8%AF%E3%81%A7Inferno%E3%82%92%E8%B5%B7%E5%8B%95

過去の投稿で、inferno phoneの構想をねったが、
AndroidのdalvikをDisで置き換えるという発想は出来なかった。
どうやら電話も可能らしく、かなりの力の入れよう。
動作を紹介した動画もすばらしい。

armadilloでトライしようかと考え中。
だったが、どうもAndroidが落ちるので難航しそう。

なお、メーリングリストではその他に、wmをフレームバッファで動かす試みも
話題になっていた。
これが出来ればxがいらなくなり、
linuxカーネル + Dis という環境でいけるかも。
起動時間の予測は、ハイバネーションなしで、カーネル20秒 + Dis 5秒くらいかな。
まずは、fb + linux on armadilloを試してみる予定。

2011年6月28日火曜日

Cのコードを移植

特に有用な内容は無いです。

以前
Cでモジュールを書く
でCで書いたモジュールをLimboから呼び出す試みをしましたが、
Limboで書くより若干速いというメリットの他に、
既存のCのプログラムが移植しやすいというメリットが有るのではないかと思いました。

そこで、既存のCのコードをコンパイルできるか試してみました。

サンプルは
plan9のcatです。
Cと言っても、ansiではなく、ken ccのように見えるので、
plan9由来のコードが移植しやすいと判断しました。

plan9のコードからcat.cを見つけて、
中身を以前試したexample.cにコピーしたところ、
ビルド自体は通りました。
わりとそのまま行ける感じです。

ただ、ファイルシステムへのアクセス方法がよくわからず、
使えていませんが。

plan9のls.cを参考に、ディレクトリサーチを試みましたが、
dirreadが無いと怒られ頓挫(openはできたっぽい)。
ヘッダにはプロトタイプがあるのにね。

2011年6月21日火曜日

charonで日本語が潰れる問題をとりあえず回避

charonで日本語の入ったページを表示させると、
小さい文字が「NUL」になることがあります。
どうすればよいかよくわかっていませんが、
とりあえずの回避方法を見つけました。

/fonts/charonのなんとか.tiny.font となんとか.small.font
をまとめて消してしまうのです。
これでひとまず表示できました。

良い方法ではないと思うけど。

2011年6月16日木曜日

tclはいけるが、tkはだめ

tcl/tkが使えるか試してみました。
tclshでtclスクリプトが実行出来ることは確認できました。

しかし、wishでtkを呼び出すことはできませんでした。
windowが出てくれないのです。

なお、shからtkを呼び出すのに、

load tk
wid=${tk window 'window'}
tk $wid update

とかしてみましたが、やはりウィンドウが表示されませんでした。
tkがだめ?

charonの実力を探る

ふと気になって、charonがどのくらい使えるのか調べてみました。

ECMAScript

ECMAScript 2 に対応とのことなので、試してみました。

このへんの
Javascript入門ページのサンプルを実行してみたところ、
割といけました。
面白い。

特に引数に何も付けなくてもscriptは使えましたが、
ドキュメントによると、-doscripts 1 とか付けないとだめとなっていたので動かない場合はオプションに注意、ということで。

なお、alertはポップアップではなく、コンソールに出るようで。

ログインできるページ

今まで駄目だと諦めていたgmailにログインできることがわかりました。
ユーザー名、パスワード入力後エラーページが表示されますが、
その後もしつこくgmailをクリックすると、basic htmlにて
メールの表示ができました。
なんとメールの送信も可能です。

amazonもログイン可能でした。ただ、検索はできないようで。
怖いので購入は試していません。

mixiも行けました。mixiはほぼすべての機能が使えるのではないかと。

駄目だったのは、dropbox, evernote, twitter, facebookと、今流行りの
ウェブサービス。

2011年6月13日月曜日

AVR32 でROMライター無しの開発環境構築

無関係のAVR32の話題を。

最近LAN対応の小さいシステムとして、AVR32とH8をいじっています。
H8の方はtoppers+tinetであれば公式ドキュメントが完全に説明して
くれているのでなんとでもなりそうですが、
AVR32の方はなかなか大変でしょうね。
開発環境をインストールしたあと結構途方にくれるきがします。

TCP/IPをやりたい場合はlwipを使うのが良さそうですね。
ここではlwipの導入方法は説明せず(というか昔のことなのでやり方忘れた)、
ROM Writer無しで開発できる環境を作る方法について書き残しておこうかと思います。

本来こういったリソースの少ない開発ではボードとICEとセットで使い、
ICE経由でファームウェアを書き込むのが普通なのでしょうが、
このボードの場合はUSBをもち、PCと接続すると本体自身が
デバッガになるという機能があります。
デバッガになるためにはその機能を持つブートローダーを入れる必要があります。
Flashの先頭にはそのブートローダを書きこんでおきます。
後半はあけておき、PCから自由にファームウェアを入れることができます。
ファームウェア側にも変更が必要で、ブートローダーの分ずれたアドレスに
コードが 配置されるようにしなければなりません。

・環境

EVK1100。
どうやら最初からブートローダーが書きこまれているという話。
もし書きこまれていなければ、初回はやはりWriterが必要で、一度bootloaderを
書きこむ必要がある。
ブートローダーはDFUブートローダーと呼ばれています。

開発環境はAVR32 studioとそれに対応したコンパイラ。
DFUブートローダーを利用してファーム書き込みを行う場合は、
PC側にDFUのドライバが必要。
それはFLIP3というソフトウェアが必要となります。

ドキュメントは
「AVR UC3 USB DFU Bootloader」という名前のPDFがあります。
これを読めばすべて書かれているはずです。

・ビルド

trampolineという仕組みを含めてビルドします。
ドキュメントの「Adding or Removing the Trampoline」に書かれているとおりです。
たぶん。

・DFUブートローダーで起動

DFUブートローダーモードで起動するには、
スティックを押しながら電源を投入します。
電源はPCからのUSB給電がよいでしょう。
PCではEVK1100はDFUとして見えます。
Windowsであればデバイスマネージャーで見えるはずです。

初回はドライバのインストールが促されます。
予めFlip3をインストールしてあれば、Flip3のインストールディレクトリのUSBディレクトリ以下にドライバがあるはずです。

・AVR32 studioからDFUを使うように登録

AVR32のtargetというペインで、DFUを登録します。
これもドキュメントのとおりです。

・fusesの保存

targetを右クリックして、read fusesでファイルにfusesの内容を
保存しておきます。
そのファイルを開くとGUIでfusesをいじれますが、GPの値に注目してください。
0x7になっているかもしれません(ビット0x4が立っている。立っていないケースも有るかも。このビットはユーザーの書き込んだファームを実行するかどうかのフラグ)。
ファームを書きこむ際には、このビットを落とす必要があるので、
もし0x7とかになっていたら、0x3に直して保存しておいてください。

fusesはファームを書き込むときに使います。

・ファームウェアの書き込み

以降の手順はファームウェアを変更するたびに行います。

targetで右クリックし、programを選びます。
(runとかdebugからは実行できないのが残念)
ファームは、debug/〇〇.elfとかrelease/〇〇.elfとか
elfファイルです。

注意点としては、書きこむ前にflashの消去を行う必要があることです。
書きこむ画面で、unlock and erase のチェックボックスをチェックして下さい。

書き込みが終わったら、次にfusesの書き込みが要ります。
どうやらファームを書き込んだりfusesを読み込むと勝手にfusesが書き換わるようで、
ユーザーが書き込んだファームを実行するためには書き換えが必須です。

targetを右クリックしてprogram fusesを実行します。
保存しておいたfusesを選んで書きこんでください。

以上で、ファームウェアの書き込みが完了です。
ROMに書きこまれたので、電源を切ってもファームは残ります。

・実行

再起動するとユーザーフォームが立ち上がります。

以降は、

ビルド→DFUモードで再起動→ファームの書き込み→fusesの書き込み→再起動

という流れで作業を行います。
面倒ですね。

・まとめ

ほとんど公式のドキュメントに書かれているとおりですが、
Flashの消去を忘れない、ファーム書き込みの時にfusesも書きこむのを忘れない、
という注意点があります。