Clojure, LuminusのCSRF対策

最近は「Clojure Web Development」を読んでひととおりのLuminus周りの使い方を学習中。
ただ「Clojure Web Development」で使用しているフレームワークのバージョンではCSRF対策はデフォルトでオフにはなっているみたいで、その辺りの記述が抜けている。
(指示されているバージョンで学習を進めれば問題はないと思う)
その辺の対処は
http://www.luminusweb.net/docs/security.md
を参考にして、 {% csrf-field %} タグをテンプレート中に入れて対処。

または、同ページにある wrap-defaults 周りを参考にして機能を切るか。
その場合は
http://www.luminusweb.net/docs/services.md#csrf
を参考にして、ルートによって選択的にCSRF対策を有効にするのが良いと思います。

Clojure Web Development Essentials

Clojure Web Development Essentials

Clojureでやってみたことの覚書1 - デバッグ

・以下のようにして、REPL上でスタックトレースを表示。

(pst *e)

Clojure/LeiningenのREPLで詳細なスタックトレースを見る - Qiita

・tools.trace でトレース。
clojure/tools.trace · GitHub

・以下のような形のデータがassocに渡ってくるところがあったので、

([:20140908-180000 :20140908-140000] [:20140908-192000 :20140908-140000])
; これを連想配列に変換するには以下のようにする。
(apply hash-map (flatten '([:20140908-180000 :20140908-140000] [:20140908-192000 :20140908-140000])))
;; -> {:20140908-180000 :20140908-140000, :20140908-192000 :20140908-140000}

期待する連想配列の形になるように対症療法(該当箇所を以下のassoc'に置き換え)。

(defn- assoc' [a b c]
  (let
    [a' (if (map? a) nodes (apply hash-map (flatten a)))]
    (assoc a' b c)))


プログラミングClojure 第2版

プログラミングClojure 第2版

Clojure

仕事ではしばらくずっとPHPのままだろうけど、プライベートで色々と遊ぶ言語としてClojureがいいんじゃないかな、と考えています。
LISP言語はずいぶんと古い言語のはずだけど新鮮に感じます。
括弧の数にファーストインプレッションでやられて敬遠してたけど、触ってみるとなかなか面白い。
Clojureは括弧の種類が増えているのでこれも良い)

IDEはLight Tableが良さそうです。
Light Table
Sublime TextにもREPL拡張はあるけど、Light Tableの方はREPLとシームレスに繋がるのがいい感じです。

どの言語にするか思案中……

現在入門書をいくつか購入して目を通している。
OCamlRubyCommon LispClojure、と今更ながらのRubyも混じっているけど、買ったのでとりあえず全部に目は通しておきたい。時間かかりそうだけど。

オンラインのドキュメントで大丈夫そうなのとしてPython(Dive Into Python 3)にも目を通す予定。
とはいえ、随分昔の知識と合わせてみても、やはり言語仕様自体が簡単な印象だから時間はあまりかからない予定。

これらに加えて慣れているもの、使ったことがあるもの、学習したことがあるものとして、PHPJavaScript、TypeScript、Go、Scalaなどがある(Javaは少しだけさわり、Haskellは本を一読した程度)。

PHPJavaScriptは仕事で使っているので特に対象とはしないとして、さて、どの言語をメインに据えて勉強していこう。
目的としてはデータの収集(Web、テキスト、DB等を対象)と解析。
あとは割りとヘビーな分岐数の組合せ最適化とか。

大量のメモリを消費する可能性が大。
うっかりPCのメモリを使い潰さないようにするにはJVMで動くものがいいだろうか。
そうなるとClojureScala辺りが候補になりそう。
とはいえ。VMを立ち上げてそこでテストをするようにすればどの言語でも問題無いといえる。

ある程度の速度も欲しい。
体感的にはGoは速かった気がする。
OCamlCommon Lisp辺りもコンパイルするものだから、速度的には期待できそうな気がする。
ClojureScalaJVMが頑張ってくれるのでこれも良い。

JVM上で動く言語に関しては、JRubyJythonなどという選択肢もあるが、最新付近の言語仕様に追いついているものではない。どうせなら言語の最新のバージョンを対象としたいのでやめておきたい。

自然言語処理をする必要も出てくるだろう。
が、ココらへんの知識はないので、形態素解析ライブラリが呼びやすいもの、くらいの認識で。

テストをしやすいこと(これはアプリ設計の問題のほうが大きいが)、リファクタリングをしやすいこと、拡張がしやすいこと、それらを含め、気持ちの上での障害も少なく書くことがストレスにならないこと。
これに該当するものとしてどの言語をピックアップするかは、各言語の習得状況に大きく依存するだろうけど。
今の段階では、RubyPython、Go、Scala辺りだろうか。
型システムが便利なOcamlも良さそうではある(デバッグが簡単そう)。

さて、どうしよう。

Land of Lisp

Land of Lisp

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)

プログラミングClojure 第2版

プログラミングClojure 第2版

PhpStorm 7

あまりに便利すぎて買ってしまった。
というかNetBeansがどうにも開発マシン(メモリをあまり積んでないため)では重すぎるし、Sublime Text 2ではデフォルトでは対応していない文字コードのソースを扱っている(しかもHTMLテンプレートやPHPソースで文字コードは別々)のをプラグインで対応しているが挙動が時々不安定だったりで。
PhpStorm 7で今のところ目を引いたのは、

  • 当たり前に動くコード補完
  • 当たり前に動く定義へのジャンプ
  • SSHターミナル
  • デプロイ(単体アップロードも同期も)

これだけでも十分すぎるほど便利。

ショートカットはこちらを参考に。
http://qiita.com/crifff/items/bbdf850f0d90ad16415a

Ctrl+Shift+A
とりあえずこれさえ覚えておけば、機能を探してアクセスできるみたい。

Goのスライス

Goのスライスの利用イメージは、以下のようにして覚えている。

package main

import "fmt"

func main() {
    p := []int{1, 2, 3, 4, 5, 6}
    fmt.Println("p[0:1],p[1:4], p[4:6] ==", p[0:0+1], p[1:1+3], p[4:4+2])
}

結果は以下。

p[0:1],p[1:4], p[4:6] == [1] [2 3 4] [5 6]

http://play.golang.org/p/18QvTCOFP6