quicklisp + mysql メモ

自分用のメモ。

quicklispでmysqlに接続するには、cl-msyqlというパッケージかclsqlを使う。cl-mysqlはまだprepared statementが実装されていなさそう(嘘かも)。なのでclsqlを使う。

(ql:quickload "clsql")ではuffi(lispからC関数を呼び出すためのライブラリ?)やmysqlへの接続用ダイナミックライブラリを作るのにCコンパイラとmakeが必要。それとmysql.hが無いと、clsqlに含まれているclsql_mysql.cのコンパイルができない(これはdb-mysqlディレクトリにclsql_mysql.soが存在するかで確認する)。しかし、これらのコンパイルに失敗しても(ql:quickload "clsql")自体はエラーを出力しないようだ。実際にclsql:connectをするときにエラーになる。とにかく原因追求が大変だった。

more…

[Android] ImageViewのsetImageResourceでの描画処理

ボタンが押されたときのonClickハンドラで、何回もImageView#setImageResourceを呼び出しても、画像は更新されなかった。調べてみたら、onClickのハンドラが抜けてUIスレッドに制御が渡らないと描画されないらしい。それで、結局次のようにして解決した。まず、Runnableを実装するImageControlクラスを作成する。


public class ImageControl implements Runnable{
private ImageView iv;
private int num = 0;
ImageControl(ImageView v){ iv = v; }

@Override
public void run() {
iv.setImageResource(image[num]);

if (num >= 48){
num = 0;
}else{
num++;
iv.postDelayed(this, 10);
}
}
}

上記で、image配列はあらかじめ用意されているリソース。numが0-48の間は、postDelayedを呼び出すことで ...

more…

jQuery.ajax関数のsuccessコールバック内でHTTPリダイレクトか否かを判定する方法


jQueryの$.ajaxのsuccessコールバックを使用している。サーバ側で、ステータスコード2XXで通常の応答をする場合と、3XXでリダイレクトする場合がある。しかし、successコールバックは、リダイレクトか否かを区別できない。リダイレクトである場合は、リダイレクトされたページのデータがsuccessコールバックの第一引数に渡ってくるからである。これは、ajaxが使用するXMLHttpRequestの動作に由来するようだ。動作を図にすると次のような感じになる。

 

調べてみたところ、ここに同じような質問があり、hackではあるが、リダイレクトされたページだけに含まれるデータの存在をsuccessコールバックで確認することで、リダイレクトか否かを判定するというアイディアがあった。この方法だと、あらかじめリダイレクト後のページの情報を知っている必要があるが、今回の場合は十分だった。ほかにも、カスタムヘッダを送り返し、それを確認してwindow.locationでクライアント側で別ページに移動するというアイディアもあった。

more…

Webサーバのパフォーマンス比較

node.js(+express)とClozureCL(+hunchentoot)の速度を比較してみた。

node.jsの環境
$ node -v
v0.2.4

node.jsのプログラム(関係する部分だけ)

app.get('/hello', function(req, res){
res.render('hello.ejs');
    });

単にファイルからデータを返すだけ。abの結果:

This is ApacheBench, Version 1.3d <$Revision: 1.73 $> apache-1.3
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech ...

more…

Xilinx Flashコンフィグレーション

自分のメモ。

回路
Slave Serialモード。XCF32クロックを接続。

ソフトウェア
ISEプロジェクトにELFファイルを追加すると、bitファイルにELFが埋め込まれる。Generate Programming Fileのプロパティで圧縮オプションを有効にする。iMPACTで、Create PROM Fileでbitからmcsファイルを生成。できたmcsファイルをxcf32pにアサインしてProgram。

more…

ボールペン

三菱のjetstreamというボールペンを使ってみて、確かに異常になめらかなのだけれど、なめらかすぎて書きにくいようにも感じる。ZEBRAのsurariの方が自分には書きやすいように感じた。抵抗感が適度。それに、surariの方が安い。また、同じ0.5mmでもsurariの方が線が細い。

more…

MicroBlaze + IPコア(続き)

Create or Import Peripheralで生成されるuser_logic.vhdでは、データバスがstd_logic_vector(0 to 31)で宣言されている。これはMSBがbit0でLSBがbit31となるというMicroBlazeの仕様のため。http://www.vhdl-online.de/tutorial/englisch/t_58.htm#pgfId-1016798を読んで分かったのは、VHDLでインスタンスを宣言するときの配列ポートは、ビット番号ではなく、ビット並びの順番で接続されるということ。

more…

XPS IPコアでのVerilogモジュールの使用

EDKで自作IPコアの使用を試している。Create or Import Peripheralを使用し、VHDLでuser_logic.vhdを作成する。user_logic.vhdからVerilogで記述された回路を使用したい。PAOファイルにVerilogファイルを記述したり、MPDファイルにVerilogも使用する設定の記述などを行ったが、どうやってもISEでコンパイルできなかった。

結局、IPコアとして埋め込むのはあきらめて、MicroBlazeのxmpがISEでトップレベルファイルになっていたのをやめて、MicroBlazeのstubファイルをトップレベルにし、普通にISEプロジェクトにVerilogのファイルを追加したらOKになった。

後日記


上記の方法でまたおかしくなってしまったのが、もう一度挑戦したら、最初に試みた方法でできるようになった。ただし、verilogのソースを変更したときは、implementationフォルダにあるngcファイルと、その中のcacheフォルダにあるファイルを削除してからgenerate netlistしないと、変更が反映されない。

more…

PLB slave single

plbv46_slave_singleの自分用のメモ

ARD: Address Range Definition。アドレスデコードとチップセレクト信号を生成する。
C_ARD_ADDR_RANGE_ARRAY, C_ARD_NUM_CE_ARRAYは、VHDLのunconstrained arrayとして定義される。これら二つの配列のそれぞれ対応するインデックスのアドレスとチップセレクトが結び付けられる。

C_ARD_ADDR_RANGE_ARRAY: 2データで1ペア。それぞれ、ベースアドレスハイアドレス。このアドレスは、バイトアドレスで指定する。ブロックサイズ(ハイアドレス-ベースドレス+1)は2の累乗でないといけない。ベースアドレスは、ブロックサイズの倍数のアドレスでないといけない。

C_ARD_NUM_CE_ARRAY: それぞれのアドレススペースで必要なチップセレクトの数を指定する。それぞれの値は2の累乗でないといけない。各アドレススペースは、少なくとも1つのチップセレクトがないといけない。各アドレススペースは、チップセレクトの数で分割される。

結局これらの配列の値は、Create or Import Peripheralでテンプレートを生成すると、一応genericで定義されるが、実際はXPSでインスタンスを作るときに決まる。

more…

C to Verilog (2)

合成の問題(?)について
C to Verilogを試していると、メモリの制御信号がDon't Careになってしまうことがあると分かった。いろいろ入力となるCプログラムを変えてみたら、どうやらforループの中にcontinueがあるとうまくいかないらしい、ということが分かった。ひょっとしたらbreakもだめなのかな?

メモリ(RAM)の使用について
C to Verilogでは、ポインタはRAMとして生成され、テストベンチの中にはRAMの宣言もある。このRAMはポート数は可変のようだが、タイミングは固定されてしまっている。つまり、同期書き込み、非同期読み出しのメモリでないと、期待したタイミングとずれてしまう。そして、Xilinxの場合、BRAMは同期読み出しである。したがって、C to Verilogで生成されたプログラムを使用する場合は、BRAMは使用できない。その代わりに、分散RAMを使用する。これであればdual-portメモリもOK。でも、dual-port設定時にC to Verilogで生成されるRAMのモジュールは、Write Enable信号が2つある。分散RAMは、書き込みは1ポートだけしか使えない ...

more…