Clojure覚書 ネストしたベクターをネストしたリストにする
; (vec2list [* [+ 2 3 [+ 1 2]] 4]) -> '(* (+ 2 3 (+ 1 2)) 4) (defn vec2list [v] (let [l (apply list v)] (for [val l] (if (vector? val) (vec2list val) val))))
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
- 作者: Ryan Baldwin
- 出版社/メーカー: Packt Publishing
- 発売日: 2015/02/24
- メディア: ペーパーバック
- この商品を含むブログを見る
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)))
- 作者: Stuart Halloway and Aaron Bedra,川合史朗
- 出版社/メーカー: オーム社
- 発売日: 2013/04/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (9件) を見る
どの言語にするか思案中……
現在入門書をいくつか購入して目を通している。
OCaml、Ruby、Common Lisp、Clojure、と今更ながらのRubyも混じっているけど、買ったのでとりあえず全部に目は通しておきたい。時間かかりそうだけど。
オンラインのドキュメントで大丈夫そうなのとしてPython(Dive Into Python 3)にも目を通す予定。
とはいえ、随分昔の知識と合わせてみても、やはり言語仕様自体が簡単な印象だから時間はあまりかからない予定。
これらに加えて慣れているもの、使ったことがあるもの、学習したことがあるものとして、PHP、JavaScript、TypeScript、Go、Scalaなどがある(Javaは少しだけさわり、Haskellは本を一読した程度)。
PHP、JavaScriptは仕事で使っているので特に対象とはしないとして、さて、どの言語をメインに据えて勉強していこう。
目的としてはデータの収集(Web、テキスト、DB等を対象)と解析。
あとは割りとヘビーな分岐数の組合せ最適化とか。
大量のメモリを消費する可能性が大。
うっかりPCのメモリを使い潰さないようにするにはJVMで動くものがいいだろうか。
そうなるとClojure、Scala辺りが候補になりそう。
とはいえ。VMを立ち上げてそこでテストをするようにすればどの言語でも問題無いといえる。
ある程度の速度も欲しい。
体感的にはGoは速かった気がする。
OCaml、Common Lisp辺りもコンパイルするものだから、速度的には期待できそうな気がする。
Clojure、ScalaはJVMが頑張ってくれるのでこれも良い。
JVM上で動く言語に関しては、JRubyやJythonなどという選択肢もあるが、最新付近の言語仕様に追いついているものではない。どうせなら言語の最新のバージョンを対象としたいのでやめておきたい。
自然言語処理をする必要も出てくるだろう。
が、ココらへんの知識はないので、形態素解析ライブラリが呼びやすいもの、くらいの認識で。
テストをしやすいこと(これはアプリ設計の問題のほうが大きいが)、リファクタリングをしやすいこと、拡張がしやすいこと、それらを含め、気持ちの上での障害も少なく書くことがストレスにならないこと。
これに該当するものとしてどの言語をピックアップするかは、各言語の習得状況に大きく依存するだろうけど。
今の段階では、Ruby、Python、Go、Scala辺りだろうか。
型システムが便利なOcamlも良さそうではある(デバッグが簡単そう)。
さて、どうしよう。
- 作者: M.D. Conrad Barski,川合史朗
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/02/23
- メディア: 大型本
- 購入: 1人 クリック: 18回
- この商品を含むブログ (19件) を見る
- 作者: Rubyサポーターズ,すがわらまさのり,寺田玄太郎,三村益隆,近藤宇智朗,橋立友宏,関口亮一
- 出版社/メーカー: 技術評論社
- 発売日: 2013/08/10
- メディア: 大型本
- この商品を含むブログ (16件) を見る
- 作者: Stuart Halloway and Aaron Bedra,川合史朗
- 出版社/メーカー: オーム社
- 発売日: 2013/04/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (9件) を見る
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]