fleet (clojureによるテンプレートシステム)

また久しぶりにclojureをいじり始めた。またWebシステムの実装に用いる予定。どうやってJSPやASPのように動的にWebページを生成するのが良いのか、最近の流行を少し調べてみた。

結果として、自分にはfleetが現状良さそうという結論に達した。若干悩んだ点と調べて分かったことのメモ。

  • fleet-nsでテンプレートを生成するときに、引数で指定したディレクトリにあるファイルを 走査して、それぞれのテンプレートファイルに対応するテンプレート関数が作られる。例えば、post.html.fleetというファイルが存在すれば、postという関数が、(同じく引数で指定した名前空間に)作られる。
  • post関数の内部(つまり、テンプレートファイルの中)では、dataという名前でテンプレート関数への実引数を参照できる。すなわち、<(:hoge data)>とpost.html.fleetに記述すれば、このテンプレート関数が実行されるときに、実引数として渡されたmapにあるhogeキーの値を出力する。

more…

SolrをJSONで使うときにはまったことのメモ

Apache Solrの検索機能を試してみた。自作Lispアプリからdrakmaを使用してJSONによりデータを追加しようとした。

結論からすると、Solrは、JSONの文字列は、シングルクオートではなく、ダブルクオートでないとエラーになる。


自分の調べた範囲では、JSONとしてはシングルクオートでもダブルクオートでも文字列としてvalidである(らしい)ので、これはSolr側の問題であると思う。


Parenscriptを使用して文字列を作ると、シングルクオートで囲われてしまう。代わりに、CL-JSONを使用することにした。こちらはなかなか使い方が難しかったが、


(defun get-insert-answer-json (id uid qid ans)
  (with-output-to-string (stream)
     (json:with-object (stream)
       (json:as-object-member (:add stream)
(json:with-object (stream)
  (json:encode-object-member "doc"
     `((id . ,id) (uid_i . ,uid) (tp_i . 2 ...

more…

MySQL + cl-mysql によるPrepared Statement

あまり詳しく調査はしていないが、clsqlでもMySQLでのPrepared Statementはそれほどうまく動作しないらしい。それで、cl-mysqlでもできないか調べてみた。

Prepared Statementには2種類の実装方法がある。動的、静的とそれぞれ呼ばれている。最近のMySQLは静的Prepared Statementを実装している。ここを参照。それでPrepared StatementでSQLを実行し、結果を返す関数は次のように実装できた。


(defun with-prepared-statement (st &rest arg)
  (cl-mysql:query (format nil "PREPARE stmt1 FROM '~a';" st))
  (let ((syms (loop for x from 1 to (length arg)
for sym = (gensym)
collect sym)))
    (loop for param in syms ...

more…

Android アプリ開発メモ

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…

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…