Clojureの基礎〜名前空間〜
「Clojureの基礎〜正規表現を扱う〜 - oknknicの日記」に引き続き、基礎メモ。
名前空間についてメモ。
現在の名前空間の切替:in-ns
(必要なら名前空間が新規作成される)
(REPL起動時のデフォルト名前空間は「user」)
(in-ns 'my-name-space) ;なお、新規作成された名前空間では、 ;Java の java.lang パッケージは自動的に import されているが、 ;clojure.core は use されていないので、 clojure.core を use する。 (clojure.core/use 'clojure.core)
Clojureライブラリのロード:require
(require 'clojure.xml) ;現在の名前空間に別名を作成 (require '[clojure.xml :as xml])
現在の名前空間に読み込み:refer
(refer 'clojure.xml)
require+refer:use
(use 'clojure.string)
Javaパッケージのインポート:import
;(import '(パッケージ クラス名1 クラス名2 ...)) (import '(java.io InputStream File))
現在の名前空間(*ns*)の設定+use+require+import:nsマクロ
(ns my-name-space (:use [hiccup.core] [clojure.java.io :only (writer)]) (:require [clojure.string :as str]) (:import (java.lang.File)))
名前空間のpublic varsの一覧
(dir clojure.xml)
引数のシンボルを現在の名前空間で解決した結果
; 例:Stringの名前解決 (resolve 'String)
ネームスペース関連の関数検索
(find-doc "ns-")
参考
- 作者: Stuart Halloway and Aaron Bedra,川合史朗
- 出版社/メーカー: オーム社
- 発売日: 2013/04/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (11件) を見る
Clojureの基礎〜正規表現を扱う〜
「Colojureの基礎〜状態を扱う〜 - oknknicの日記」に引き続き、基礎メモ。
正規表現の扱い方についてメモ。
clojure.string - Clojure v1.5 (stable)
正規表現置換:clojure.string/replace
(doc clojure.string/replace) (clojure.string/replace "<hoge><hage>" #"<(\w*)>" "{$1}") ;-> "{hoge}{hage}"
(参考)一覧表示
(dir clojure.string)
Ring周りについて頭を整理 その2〜Ringを生で使ってみる〜
「Ring周りについて頭を整理 - oknknicの日記」に引き続き、Ring理解ネタ。
今回はRingを生で使ってみることで、理解を深める。
HelloWorld
- プロジェクト(通常)の新規作成
lein new hello-ring
- project.clj の編集
(defproject hello-ring "1.0.0-SNAPSHOT" :description "FIXME: write" :dependencies [[org.clojure/clojure "1.5.1"] [ring/ring-core "1.2.0"] [ring/ring-jetty-adapter "1.2.0"]])
- core.clj の編集
(ns hello-ring.core) ;ハンドラの定義 (defn handler [request] {:status 200 ;レスポンスコード :headers {"Content-Type" "text/html"} ;レスポンスヘッダ :body "Hello World"}) ;レスポンスボディ(String or ISeq or File or InputStream)
- 起動(REPLから)
cd hello-ring lein repl (use 'ring.adapter.jetty) ;jettyアダプタの読み込み (use 'hello-ring.core) (run-jetty handler {:port 3000}) ;上記で定義したハンドラを指定して、jettyを起動
- 接続確認
- 起動(Ringプラグインから)
- project.clj に以下を追記
:plugins [[lein-ring "0.8.5"]] :ring {:handler hello-ring.core/handler} ;ハンドラを指定
-
- 起動
lein ring server
リクエストの中身を見てみる
- core.clj
(ns hello-ring.core (use [clojure.string :only (join)])) (defn handler [request] {:status 200 :headers {"Content-Type" "text/html"} :body (join "<br/>" ["[server-port]" (:server-port request) "[server-name]" (:server-name request) "[remote-addr]" (:remote-addr request) "[uri]" (:uri request) "[query-string]" (:query-string request) "[scheme]" (:scheme request) "[request-method]" (:request-method request) "[content-type]" (:content-type request) "[content-length]" (:content-length request) "[character-encoding]" (:character-encoding request) "[headers request]" (:headers request) "[body]" (:body request)])}) ;もちろんこんな書き方もできる ;(map ; #(str "[" % "]" "<br/>" (% request) "<br/>") ; (keys request))
レスポンス生成関数を使ってみる
- response関数(基本的な200番のレスポンスを生成)
(ns hello-ring.core (:use ring.util.response)) (defn handler [request] (response "Hello ring")) ;以下のレスポンスが生成される ;{:status 200 ; :headers {} ; :body "Hello ring"}
- content-type関数(コンテンツタイプの設定)
(ns hello-ring.core (:use ring.util.response)) (defn handler [request] (-> (response "Hello World") (content-type "text/plain"))) ;以下のレスポンスが生成される ;{:status 200 ; :headers {"Content-Type" "text/plain"} ; :body "Hello ring"}
- redirect関数
(ns hello-ring.core (:use ring.util.response)) (defn handler [request] (redirect "http://www.google.com")) ;以下のレスポンスが生成される(googleのホームページへリダイレクトされる) ;{:status 302 ; :headers {"Location" "http://www.google.com"} ; :body ""}
その他関数(file-response等)や詳細情報は下記を参照のこと。
ミドルウェアをかましてみる
- wrap-params(パラメータマップを生成するミドルウェア。キーは「:params」)
(ns hello-ring.core (:use ring.util.response ring.middleware.params)) (defn handler [request] (response (str (:params request)))) (def middleware-applied-handler (wrap-params handler)) ;引数のハンドラにミドルウェア(ここではwrap-params)をかました新規ハンドラを生成
- project.clj のハンドラ指定部分を以下のとおり変更
:ring {:handler hello-ring.core/middleware-applied-handler}
- 確認
Colojureの基礎〜状態を扱う〜
「Clojureの基礎 〜プロトコル・データ型・レコード〜 - oknknicの日記」に引き続き、基礎メモ。
状態の扱い方についてメモ。
状態を扱うオブジェクト
ref
エージェント
- 概要
- 参照の更新(非同期):
- send (ref における commute に似ている。戻り値はエージェントである(非同期なので処理結果はこの時点では判らないため))
- send-off (必要に応じて別のスレッドプールが割り当てられる版の send。つまり、ブロックしない)
- 参照の更新エラーのロールバック:
- clear-agent-errors (エージェントの更新で一度でもエラーが発生すると、そのエージェントは読み出し不可になる。この関数で、エラー発生前の状態に戻すことができる)
- 同期化
- await (現在のスレッドあるいはエージェントからsendされたアクションがすべて完了するまで、現在のスレッドをブロック)
- await-for (await のタイムアウト指定版)
束縛(var)
ルート束縛
- defやdefnの呼び出しで束縛した場合
- メタデータ「:dynamic」が付与された場合はダイナミックスコープをもつ
- 任意のスレッドからアクセス可能である
スレッドローカルな束縛
- bindingマクロで束縛した場合
- ダイナミックスコープをもつ
- スレッドローカル(bindingを実行したスレッドにおいて、binding本体の実行を抜けるまでの間、そのスレッド内の任意の場所からのみ参照可能)
- letの構造に似ているが、letとの違いはダイナミックスコープである点である
(補足)動的束縛によるAOP的な実装
- bindingによって、その実行内部における任意の束縛を置き換え可能である
- 例えば以下の用に、呼び出し先の内部で呼び出している関数を書き換えるようなコードを記述できる
(defn ^:dynamic mylogic [] (何らか処理)) (defn ^:dynamic mymain [] (mylogic)) (defn -main [] (binding [mylogic #(do (開始ログ出力) (mylogic) (終了ログ出力))] (mymain)))
参考
- 作者: Stuart Halloway and Aaron Bedra,川合史朗
- 出版社/メーカー: オーム社
- 発売日: 2013/04/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (11件) を見る
Clojureの基礎 〜プロトコル・データ型・レコード〜
今更ながら、Clojureの基礎メモ。
今回は独自型定義周りを。
データ型
参考
- 作者: Stuart Halloway and Aaron Bedra,川合史朗
- 出版社/メーカー: オーム社
- 発売日: 2013/04/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (11件) を見る
Ring周りについて頭を整理
「Clojure(Compojure)で作成したWEBアプリをGlassFishにデプロイ - oknknicの日記」に続き、ClojureによるWebアプリネタ。
デファクトである Ring について、頭を整理しておく。
Ring
- PythonのWSGIやRubyのRackにインスパイアされたWebアプリケーションライブラリ
- HTTPの詳細を抽象化するユニファイドAPIを提供
- Ringを用いて記述されたClojure Web Applicationは、Java Servlet へコンパイルできる
- war ファイルへのパッケージングもできる
- 多彩なミドルウェア(後述)が提供される
構成
- アダプタ:リクエストをClojureのmapにマッピングし、ハンドラに渡す
- ハンドラ:Webアプリケーションを定義する。リクエストを受け取り、レスポンスを返す
- ミドルウェア:ハンドラに機能を加える高階関数
リクエストの流れ:クライアント -> アダプタ -> ミドルウェア -> ハンドラ
レスポンスの流れ:ハンドラ -> ミドルウェア -> アダプタ -> クライアント
参考
Clojure Programming: Practical Lisp for the Java World (English Edition)
- 作者: Chas Emerick,Brian Carper,Christophe Grand
- 出版社/メーカー: O'Reilly Media
- 発売日: 2012/03/30
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
Clojure in Action: Elegant Applications on the JVM
- 作者: Amit Rathore
- 出版社/メーカー: Manning Publications
- 発売日: 2011/11/20
- メディア: ペーパーバック
- クリック: 24回
- この商品を含むブログ (2件) を見る
Clojure(Compojure)で作成したWEBアプリをGlassFishにデプロイ
「ClojureでのWEBアプリ開発にあたって、各種ライブラリのメモ - oknknicの日記」の続き(?)。
Clojure(Compojure)で作成したWEBアプリをGlassFishにデプロイしてみたのでメモ。
Compojureプロジェクトの新規作成、warの生成
lein new compojure myapplication cd myapplication lein ring uberwar
GlassFishにデプロイ
1. GlassFish Server Open Source Edition(Windows版) 4.0 (Java EE7 対応)のダウンロード・インストール
http://dlc.sun.com.edgesuite.net/glassfish/4.0/release/glassfish-4.0-windows.exe
(インストールディレクトリは「C:\glassfish4」)
2. コンソール画面接続確認
http://localhost:4848
3. warのデプロイ
cp target\myapplication.war C:\glassfish4\glassfish\domains\domain1\autodeploy\myapplication.war
- > 同ディレクトリに「myapplication.war_deployed」というファイルが作成されればOK
(あるいは、上記WEB画面の「Applications」メニューからDeployできる)
4. デプロイしたアプリへの接続
http://localhost:8080/myapplication
https://localhost:8181/myapplication
(URLは、上記WEB画面の「Applications」メニューのLaunchリンク押下で確認可能)