Archives for 6月2015

書籍「江戸時代の暮らし方」が今読むと意外と示唆に富んでた

図書館にて偶然出会った「江戸時代の暮らし方」という本。

表紙にあるように、大人から子供まで万人におすすめできる書籍に出会ったという感じ。まあ、子供までといっても、漢字にふりがながついているわけではないので、小学校高学年向きかな。

この本、歴史的史実に基づいたというところを再重要視する人からすると、疑問が出る部分もあるかもしれない。というのも、本の挿絵で、いろいろと現代社会にあるアイテムが登場するからだ。

歴史について学べるというよりは、歴史を著者のなかで消化した上で、現代人にわかりやすいメタファーで紹介してくれている本というほうが紹介としていいと思う。

例えば、将軍さまの1日なんてのは、実際どうであったかどうかは知りようがないが、こういう1日もきっとあっただろうと推測できる。朝早く、夕方には仕事が終わってしまう。そのあとは、いろいろな自分のための時間に割いていたらしい。

町人の1日と比較すると、これまた興味深く、電気のない時代には1日の終わりも早い。こういうのを見ていると、今の電気全盛、IT全盛の行き方はなんかおかしく思えてくる。

1日のはじまりや終わりを告げる時刻について、各自時計を持っているわけではない当時、お寺も時報の役割の側面もあったりして、今の時代のお寺よりもいろいろと人々の生活に寄り添っていたのだろう。とか。

図書館の児童書コーナーには置いてきたものがいろいろあるかもしれない。

Read More

Compojure/Ringのmiddlewareについて

ClojureでWebアプリを作っていて、よくわからないもやもやした概念の一つはmiddlewareでしょう。

概念なので、どういうものかがわかってしまえば、関数のスタイルということがわかり、悩むこともなくなります。

middlewareは、handlerを受け取り、引数が一つの関数を返します。

その返す関数というのが、リクエストを受け取り、handlerを返す関数です。

つまり、もっともシンプルなmiddlewareというのはこんなものです。

(defn hoge-middleware [handler]
  (fn [request]
    (println request)
    (handler request)))

handlerにrequestを適用させると、handlerが返ります。

ちなみに、requestというのは、ringの仕様に沿ったハッシュマップです。

ということで、middlewareは、こんな感じで、handlerを延々と渡していくことで利用が可能というわけです。

(def app
  (-> (routes (routes-a routes-b)
      middleware-a
      middleware-b
      middleware-c))

とてもシンプルな考え方で素晴らしいと思いました。

Read More

ClojureのImmutantでWebサーバ起動時に外部からのアクセスを制限/解放するには?

ClojureのWebアプリケーションフレームワークLuminusでは、2.0からImmutantというサーバ関連のライブラリが使われています。

Immutantは、Webサーバの他に、スケジューラやメッセージングといったライブラリも含んだJBOSS関係のClojure向けライブラリです。

僕はWebサーバ、そしてバッチ処理用に使っています。

で、これが、アプリケーションをちょろっと書いてサーバ起動して、ローカルで見るとちゃんとHTMLが表示されるんですが、ローカルLAN内の他のPCからだと見ることができません。

不思議ですね。(よくあるWebアプリケーションフレームワークって、すぐにポート指定したら見れたりするでしょ)

原因はここを見ると書いてあります。

immutant.web

options can be a map or kwargs, with these valid keys [default]:

:host The interface bind address [“localhost”]
:port The port listening for requests [8080]
:path Maps the handler to a prefix of the url path [“/”]
:virtual-host Virtual host name[s] (a String or a List of Strings) [nil]
:dispatch? Invoke handlers in worker thread pool [true]
Note the web server only binds to the loopback interface, by default. To expose your handler to the network, set :host to an external IP address, or use “0.0.0.0” to bind it to all interfaces.

つまり、 Luminus上で、4000番ポート、他のPCからも接続可能な状態でホストを指定して起動するには、

(defn -main
  [& args]
  (.addShutdownHook (Runtime/getRuntime) (Thread. stop-server))
  (start-server (concat ["port" 4000 "host" "0.0.0.0"] args))
  (timbre/info "server started on port:" (:port @server)))

と指定すればいいことがわかりました。

ここ、最初ちょっとした詰まりポイントかもです。

Read More