Hatena::ブログ(Diary)

すにぺっと

2011-04-02

node.jsでレスポンスに画像を返したい

| 11:34 | node.jsでレスポンスに画像を返したいを含むブックマーク

ちょっと悩んだので。

ローカルにある画像を読んでレスポンスで画像を返したかったけど、

なんかダウンロードされちゃってうまくいかなかった。


こうやったら画像がレスポンスでかえされた。

単純にヘッダを指定すればOK.

var express = require('express');
var fs = require('fs');

var app = express.createServer();

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'haml');
  app.use(express.bodyDecoder());
  app.use(express.methodOverride());
  app.use(express.cookieDecoder());
  app.use(app.router);
  app.use(express.staticProvider(__dirname + '/public'));
});


app.get('/', function(req, res){
    var buf = fs.readFileSync('test.jpg');
    res.send(buf, { 'Content-Type': 'image/jpeg' }, 200);
});

app.listen(3000);

画像読込みの非同期版はこう

    fs.readFile('test.jpg',function(err,data){
			      res.send(data, { 'Content-Type': 'image/jpeg' }, 200);
			  });

※環境

node.js v0.4.2

express

clojureプログラミング入門-5 Javaの呼び出し

| 10:06 | clojureプログラミング入門-5 Javaの呼び出しを含むブックマーク

今日はclojureからJavaを呼び出す方法。


Javaの呼び出し

clojureから簡単にJavaへアクセスできる。

user=>  (new java.util.Random) ;1
#<Random java.util.Random@802b249>
user=> (def rnd (new java.util.Random))  ;2
#'user/rnd
user=> (. rnd nextInt) ;3
-257542786
ser=> (. rnd nextInt 10) ;4
5
user=> (. Math PI)  ;5
3.141592653589793

1.javaオブジェクト生成

2.varにjavaオブジェクトを保存

3.javaメソッドへのアクセスは.で呼び出し

4.引数つき

5.staticフィールドにアクセス


clojureは自動でjava.langをインポートしている。

明示的にimportするためには

user=>  (import '(java.util Random Locale)
	       '(java.text MessageFormat))
java.text.MessageFormat

簡単だ。


糖衣構文

次は糖衣構文。

簡単にJavaへアクセスするための手段が用意されている。

次は等価

(new Random)
(Random .)

次も等価

(. Math PI)
Math/PI

staticフィールド、staticメソッドはClassname/memberと書ける。


これも同じ

(. rnd nextInt)
(.nextInt rnd)  ;.のあとはスペースつけちゃダメ

間接参照を繰り返すときのは通常こうやって書くが、

user=> (.getLocation (.getCodeSource (.getProtectionDomain (.getClass '(1,2)))))
#<URL file:/usr/local/Cellar/clojure/1.2.0/clojure.jar>

糖衣構文だとこう。

user=> (.. '(1 2) getClass getProtectionDomain getCodeSource getLocation)
#<URL file:/usr/local/Cellar/clojure/1.2.0/clojure.jar>

なんども間接参照をする場合はこう書くと便利。


なるべくjava呼び出しは、clojureの糖衣構文を使うべきとのこと。

(Wigget . "red")
Math/PI
(System/currentTimeMills)
(.nextInt rnd)
(.. person getAddress getZipCode)


javaのコレクションを使う

clojureのコレクションはjavaのコレクションをほぼ置き換え可能とのこと。

なるべくならclojureのほうを使うほうがいいとのことで、ここは軽く流そう。

user=> (make-array String 10) ;1
#<String[] [Ljava.lang.String;@3e0d1329>
user=>  (to-array ["apple" "orange" "banana"]) ;2
#<Object[] [Ljava.lang.Object;@1a7244ca>

1.java配列を作成

2.Object配列作成

ここでつくった配列はamapとかareduceとか使うといろいろできるみたい。

これは別の部分で解説してる。


便利な関数

user=> (map .toUpperCase ["test" "msg"]) ;1
java.lang.Exception: Unable to resolve symbol: .toUpperCase in this context (NO_SOURCE_FILE:12)
user=> (map (memfn toUpperCase) ["test" "msg"]) ;2
("TEST" "MSG")
user=> (map #(.toUpperCase %)["test" "msg"])    ;3
("TEST" "MSG")
user=> (instance? Integer 10) ;4
true
user=> (format "%s is %d years old." "taro" 20) ;5
"taro is 20 years old."

1.clojureでは関数引数で渡せるが、javaでは無理。

2.javaメソッドclojure関数に渡したい場合、memfnマクロを使う。

3.もしくは無名関数

4.インスタンスの型を調べる

5.文字列や数値のフォーマットを行う


JavaBeanをclojureのマップに変換するのも可能。

user=> (import '(java.security MessageDigest))
java.security.MessageDigest
user=> (bean (MessageDigest/getInstance "SHA"))
{:provider #<Sun SUN version 1.6>, :digestLength 20, :class java.security.MessageDigest$Delegate, :algorithm "SHA"}
user=> (:digestLength (bean(MessageDigest/getInstance "SHA")))
20


プログラミングClojure
プログラミングClojure
posted with amazlet at 11.03.31
Stuart Halloway
オーム社
売り上げランキング: 174593

JxckJxck 2011/04/04 07:52 static(旧staticProvider)ミドルウエアは単純な静的コンテンツの配信をやってくれるはずです。この設定では public 以下のファイルを拡張子に応じたヘッダをつけて配信をしてくれるので、 public/test.jpg なら /test.jpg で取れるとおもいます。もし何か処理を足すのであれば別ですが、単純な配信ならこれでいけるとおもいますよ : )

sy-2010sy-2010 2011/04/05 00:01 あ、それでも簡単にいけますね。今後はblob形式でdbにいれようかとおもってるのでそのためのことも考え。。って感じでやってみました。