読者です 読者をやめる 読者になる 読者になる

Arantium Maestum

プログラミング、囲碁、読書の話題

Clojure Web Development勉強 - Devcards(その1)最低限の設定

CSSをいじりたおす根気がなかった・・・ ということで話題を変えてFigwheelの作者でもあるBruce Haumanが作ったツールであるDevcardsについて書く。 Devcardsとは DevcardsはClojureScript+Reactで作ったコンポーネントの動作を試すための環境を提供するツー…

Clojure Web Development勉強 - Garden(その3)lein-gardenとfigwheelでgarden/CSS自動コンパイル&ロード

前々々回のfigwheelによるCSS自動ロードと前回のlein-gardenによるgarden→CSS自動コンパイルを合わせると、gardenデータ構造をcljファイルに記述・変更すると即時にブラウザで表示が更新されるような環境が出来上がる。 project.clj leiningen及びlein-garde…

Clojure Web Development勉強 - Garden(その2)lein-gardenでCSSをオートコンパイル

前回紹介したワークフローだとCSSをednで定義できるのはいいが、二つほど問題があった。 変更の度にいちいちlein runでCSSをコンパイルする必要がある -main関数をCSSコンパイルのために使っていた lein-gardenはこの二つの問題を同時に解決する、gardenコン…

Clojure Web Development勉強 - Garden(その1)最低限の設定でCSSをコンパイルしてみる

前回に続いてCSSの話。 Reagent/Hiccupを使ってHTML/DOMをedn形式で定義しているのだから、できればCSSも同じくednで定義したい!という末期症状な人間のために、gardenというライブラリが存在している。 github.com Hiccupと同じように、Clojureのデータ構…

Clojure Web Development勉強 - FigwheelでCSS Auto-Loading

Single Page Applicationで複雑かつ洗練されたGUIを実装するためには、一般的にHTMLで定義されている文書のコンテンツだけではなく、CSSで定義されているスタイルをどうコントロールするかも非常に重要なポイントになる。 JavaScriptで直接DOMにコンポーネン…

Clojure Web Development勉強 - ReactチュートリアルをReagentでやってみる(その5)

ReactチュートリアルのShowing the Movesから最後のImplementing Time Travelまで。 Showing the Moves https://facebook.github.io/react/tutorial/tutorial.html#showing-the-moves 前回作成したhistoryデータを使って過去の動きを表示するようにする。 Ja…

Clojure Web Development勉強 - ReactチュートリアルをReagentでやってみる(その4)

最後までやるつもりだったのだが、長くなったので今回はStoring a Historyだけ。 https://facebook.github.io/react/tutorial/tutorial.html#storing-a-history これまでReactチュートリアルでは、まずSquareを状態を持ったコンポーネントとして実装し、その…

Clojure Web Development勉強 - ReactチュートリアルをReagentでやってみる(その3)

公式チュートリアルのFunctional ComponentsからDeclaring a Winnerまで。 Functional Components 前回散々JavaScript版が明示的じゃない、ボイラープレートが多いと煽っていたが、実際にはJSでも純粋関数的に書くとより簡潔になる: function Square(props)…

Clojure Web Development勉強 - ReactチュートリアルをReagentでやってみる(その2)

React公式チュートリアルを進める。今回はPassing Data Through PropsからLifting State Upまで。 Passing Data Through Props https://facebook.github.io/react/tutorial/tutorial.html#passing-data-through-props 親コンポーネント(つまり呼び出し側の…

Clojure Web Development勉強 - ReactチュートリアルをReagentでやってみる(その1)

Reactの公式ページに基本概念などの説明のためのチュートリアルがある: facebook.github.io これをClojureScript/Reagentでやっていきたい。 最終的な成果物は簡単な○×ゲーム。 HTMLやCSS、そしてReact Componentの大枠はすでに出来上がっていて、チュート…

Clojure Web Development勉強 - Reagent(その3)状態の管理

Reagentでは、Hiccup構文を使ったコンポーネント関数とReagent Atomを使って、複雑な状態を持つクライアントサイド・アプリケーションを作成できる。 前回の例ではコードをなるべく単純に留めるために、トップレベルでReagent Atomを定義し、各コンポーネン…

Clojure Web Development勉強 - Reagent(その2)Reagent Atom

さて、Reagentの二大要素の二つ目であるReagent Atomについて。 Reagentでは、コンポーネントの可変な状態を保持するために特殊なAtomを用意している。 と言っても概念・機能は通常のClojureのAtomとほとんど同じで、Immutableなデータ構造へのポインタのよ…

Clojure Web Development勉強 - Reagent(その1)概要とHiccup構文

ReactのClojureScript WrapperであるReagentライブラリについて。 前回書いたとおり、ClojureScriptには有名なReact Wrapperが三つある。Om/Om-Next、Quiescent、そしてこのReagentである。 最初の二つの特徴を非常にざっくりと要約するなら: Om/Om-Nextは…

Clojure Web Development勉強 - Reactあれこれ

Facebookが提供するJavaScriptライブラリであるReactについていろいろと書こうと思う。 まず、私自身がReactについて調べていた時に大変参考になった記事を三つ挙げる: qiita.com mizchi.hatenablog.com qiita.com 本記事と前後してこれらも読めば、Reactに…

Clojure Web Development勉強 - ClojureScript(その4)figwheelの最小限設定

Figwheelは素晴らしい。FigwheelはClojureScriptを使うことで得る大きな喜びの一つだ。 と過剰に思われる売り込みで始める。しかし、個人的には全く誇張している意識はない。 Figwheelはwebsocketを使って、ソースファイルの変更を自動的にブラウザに反映さ…

Clojure Web Development勉強 - ClojureScript(その3)cljsbuildオプションあれこれ

cljsbuildには様々なオプションがある。なんでこんなにあるの?と言いたくなるくらいある。 個人的に使いそうだなぁと思うものを抜粋すると: :cljsbuild { :builds { :main { :source-paths ["src-cljs"] :compiler { :optimizations :whitespace :output-t…

Clojure Web Development勉強 - ClojureScript(その2)cljsbuildでコンパイル

Clojureビルドツールあれこれ Clojureビルドツール界隈ではleiningenが圧倒的シェアを誇っておりそこにbootが食らいついている、というような状況になっている。 私はbootは使ったことはないが、leiningenにはいつも非常にお世話になっている。project.cljに…

Clojure Web Development勉強 - Clojurescript(その1)cljs.jarでコンパイル

一旦サーバサイドを離れて、フロントエンドの開発を進めてみる。 フロントエンドについては以前から少し試していて、拙いながらも渋谷のLisp.Meetupでもライブコーディングしながらプレゼンしたことがある。その時はClojurescriptからFigwheel、Reagent、d3.…

Clojure機械学習勉強 - Gorilla REPLと線形回帰 (その2)

昨日のコードを2点修正: 前回は独立変数を一つだけ用意したが、今回は二つ。さらに、今後独立変数の数の増減はX値と母数のθ値だけアップデートすれば、他のコードは変更なしで機能するようリファクタした。 core.matrixの実装を、標準実装のndarray、vector…

Clojure機械学習勉強 - Gorilla REPLと線形回帰

まあ何も言わずこのGorilla-replのOnline Viewerを見てくれ。 Gorilla REPL viewer コードの常であるが、「どうやって正しく計算するか」よりも「どうやって正しく読み手にコードの意図を伝えるか」が最も難しかった。 一番腐心したところの割には、正直あま…

Clojure機械学習勉強 - core.matrix(その1)

前置き Clojure Advent Calendarで機械学習ネタで記事を書くことを宣言してしまった。どうしよう。 C++、Python、Matlab\Octaveあたりではちょこちょこと(業務も含めて)機械学習はやったことがあるが、Clojureでは「JVMだし数値計算はしたくないよねー」と…

Clojure Web Development勉強 - Hiccup (その2) XSSの恐怖

なにやら五島勉のようなタイトルをつけて恐縮だが、Hiccupでも良く指摘される重大な問題として、自動的に文字列をエスケープしないことによるXSS脆弱性の導入がある。 クロスサイトスクリプティング - Wikipedia つまり、今まで紹介してきたコードにもあるよ…

Clojure Web Development勉強 - Hiccup (その1)

今まで愚直にHTMLタグを文字列として書いてきたが、読むほうも辛かったと思うが書くほうはもっと辛かった。 まあ、ただこの時点では大して動的な機能もなく(唯一あったのはフォームから受け取った文字列を表示するくらい(ただしこれが「くらい」というには…

Clojure Web Development勉強 - Compojure (その2)

ちょっと前回の説明で書いていなかったことを補足。 Compojureで使ったdefroutesマクロとGETやnot-foundといった個別のルート作成マクロ・関数の引数と戻り値について。 まず、GETやnot-foundは普通に関数を返す。返された関数のシグネチャは当然「リクエス…

Clojure Web Development勉強 - Compojure (その1)

さて、Ringに続いてClojure Web Developmentでメジャーなライブラリ/フレームワークであるCompojureを使ってみる。 ちなみにここらへんも含めてCompojureに関しては@_ayato_pさんにいろいろご教授いただいた。あとウェブ開発の資料も大変参考にさせていただ…

Clojure Web Development勉強 - Ring (その5) ルーティング

というわけでついにルーティング。 そもそもルーティングとは? 今まではどのリンクを踏んでも同じコンテンツしか見えないという「お前htmlメモ帳に直打ちしてftpでアップロードしてた頃のサイトの方がよっぽど動的なんだけどどうなの?」と煽られてしまうよ…

Clojure Web Development勉強 - Ring (その4) モジュール化とGET/POST Form

次回はルーティングだと言ったな、あれは嘘だ。 その前に、まず今まで書いたコードを handler.clj (responseを実際に返す関数群) middleware.clj (handlerをラップしてログを取ったりする機能を実装する関数群) core.clj (それ以外。main関数っぽいのも…

Clojure Web Development勉強 - Ring (その3) ResponseとHandler

いろんなresponseの作成を助ける関数群のring.util.responseを少し使ってみる。 gist.github.com 前回handlerと読んでいた関数をplain-textと改名し、それに加えてhtmlを返すhtml関数、404を返すnot-found関数、そしてhttp://www.google.comにリダイレクトす…

Clojure Web Development勉強 - Ring (その2) コード詳解

とりあえず前回張ったコードの説明をしておく。 gist.github.com 「詳解も何もそのまんまだろうが(怒」と言われたら「その通りですハハーッ(平伏」と言うしかないのだが、まあ自分のアウトプット&備忘録を兼ねて。 まずproject.clj。超簡単。というかlein…

Clojure Web Development勉強 - Ring (その1)

Clojureで囲碁対局サイトを作ってみたい - Arantium Maestum でも書いた通り、中規模ウェブアプリ的なものを開発してみたい。そのためのライブラリについて、色々と覚書をメモっておく。 Clojureでウェブ開発する場合、サーバサイドの根幹はほぼ必ずringとい…

Clojureで囲碁対局サイトを作ってみたい

Clojureで中規模なWebアプリ開発を個人プロジェクトとしてやってみたい。中規模のイメージとしてはTODOアプリ以上、eコマースサイト(これって死語?)未満。 というわけで、囲碁対局サイトを作ってみようと思う。 データベースは当然として、ユーザ認証、ウ…

Clojureでゴールドベルク、なビデオ

www.youtube.com 不覚にもちょっと感動してしまった。と同時に「やりたいことやられちゃった」感もあり。そうだよね、Overtoneやってたらとりあえず対位法が一つの到達点だよね。 githubにちゃんとコードが載ってる。 github.com まずはこのコードをきっちり…

Clojure/Overtoneで遊んでみる

SICPばかりでもなんなので、Clojureで音楽が作れるっぽいOvertoneライブラリと戯れてみる。 Overtoneプロジェクト: github.com 参考にさせていただいたブログ: Overtone: Clojureで音楽を書こう : サルノオボエガキ とりあえずdependenciesを足して、イン…

SICPの勉強 問題2.30~32

2.30 木構造のデータ(nestしたリスト)の全ての葉ノードを二乗する関数: (defn square-tree [tree] (cond (empty? tree) () (seq? (first tree)) (cons (square-tree (first tree)) (square-tree (rest tree))) :else (cons (sq (first tree)) (square-tre…

SICPの勉強 問題2.27~28

2.27 リストの要素を逆順にするだけでなく、そのリストに含まれる全てのリストも同時に逆にする関数: (defn deep-reverse [x] (if (not (seq? x)) x (loop [items x result ()] (if (empty? items) result (recur (rest items) (cons (deep-reverse (first …

SICPの勉強 問題2.23

リストの要素全てに副作用ありの関数を適用していく関数(戻り値はnil): (defn for-each [f items] (if (empty? items) nil (do (f (first items)) (for-each f (rest items))))) そういえばこの関数に関してyoutubeのコメント欄でものすごいツッコマれて…

SICPの勉強 問題2.20~21

2.20 引数のリストの先頭の要素が奇数なら奇数の要素のみ全て、偶数なら偶数の要素のみ全てのリストを返す関数: (defn same-parity [x & xs] (letfn [(p? [n] (= (rem x 2) (rem n 2))) (f [items] (cond (empty? items) nil (p? (first items)) (cons (fir…

SICPの勉強 問題2.17~18

題意的に再帰を使って組み上げていくのがポイントなのだと思うが、やっぱり面倒くさい。 この章で作り上げていくmapやreduceといった抽象的にリストを捉えられる関数の偉大さを実感出来るのが最大の収穫だろうか。 2.17 リストの最後の要素を取り出す関数: …

SICPの勉強 問題2.7~11

2.7 (defn make-interval [a b] [a b]) (defn upper-bound [c] (first c)) (defn lower-bound [c] (last c)) 2.8 (defn sub-interval [x y] (max-interval (- (upper-bound x) (lower-bound y)) (- (lower-bound x) (upper-bound y)))) 2.10 (defn div-inter…

SICPの勉強 問題2.4~6

2.4 cons, car, cdrをclosureを使って作成: (defn cons [x y] (fn [m] (m x y))) (defn car [z] (z (fn [p q] p))) (defn cdr [z] (z (fn [p q] q))) 2.5 自然数に限定してcons, car, cdrを2と3の積を使って表す。 (defn cons [x y] (loop [x x y y r 1] (c…

SICPの勉強 問題2.2

線のデータを定義。 (defn make-segment [start-point end-point] [start-point end-point]) (defn start-segment [segment] (first segment)) (defn end-segment [segment] (last segment)) その前提となる点のデータを定義。 (defn make-point [x y] [x y]…

SICPの勉強 問題2.1

有理数のデータタイプがマイナスな場合は分子の方に必ず負号がくるように修正する。 まずは元のmake-rat関数をclojureで書く: (defn gcd [a b] (let [c (rem a b)] (if (zero? c) b (recur b c)))) (defn make-rat [n d] (let [g (gcd n d)] [(/ n g) (/ d …

SICPの勉強 Lecture 2B-2

www.youtube.com あと、この講義の終わりの方でcons-cellをclosureのみで作るコードが提示される。cons-cellがあればlinked listが作れて、複雑なデータ構造を組み上げていくことができる(遅いので実装上は使わないが)。データ構造すら、closureを持つproc…

SICPの勉強 Lecture 2B-1

www.youtube.com 37:40からの質問への答えがすごい。 Q: What does this "delayed decision through abstraction layers" do to the maxim of "do your design before any of your code"? A: Well that's someone's axiom, and I bet that's the axiom of so…

SICPの勉強 問題1.46

SICP1.3.4の問題1.46を解いてみる。 iterative-improveの定義。これは再帰で書くのがすごくしっくりくる。 (defn iterative-improve [good-enough? improve] (fn [guess] (if (good-enough? guess) guess (recur (improve guess))))) iterative-improveを使…

SICPの勉強 問題1.45

SICP1.3.4の問題1.45を解いてみる。 average-dampとfixed-pointを使って任意のx、nにおけるxのn乗根の開方を求める。 average-dampを一回かけるだけの場合、y -> x/y3までは大丈夫だが y -> x/y4だと収束しない。 とりあえずaverage-dampを任意の回数繰り返…

SICPの勉強 問題1.41~44

SICP1.3.4の問題1.41、42、43そして44を解いてみる。 1.41問 引数1の関数を取り、その関数を倍掛けするdouble関数: (defn double [f] (fn [x] (f (f x)))) 問題文に出てくる(((double (double double)) inc) 5)について、パッと見だと5+8で13かな?と思っ…

SICPの勉強 問題1.40

SICP1.3.4の問題1.40を解いてみる。 x3 + ax2 + bx + c = 0の解をNewton's Methodで解く関数を作成する。 とりあえずNewton's Methodの実装: (defn deriv [g] (let [dx 0.00001] (fn [x] (/ (- (g (+ x dx)) (g x)) dx)))) (defn newton-transform [g] (fn …

SICPの勉強 問題1.38~39

SICP1.3.3の問題1.38と1.39を解いてみる。 1.38問はネイピア数から2引いた数を近似するもの。 1, 2, 1, 1, 4, 1, 1, 6, 1, 1, 8, ...というめんどくさい数列をdの関数としてcont-fracに入れる。 (defn d [x] (if (= 2 (rem x 3)) (* 2 (inc (quot x 3))) 1)…

SICPの勉強 問題1.37

SICP1.3.3の問題1.37を解いてみる。 recursive process: (defn cont-frac [n d k] (letfn [(rec [i] (if (= i k) (/ (n i) (d i)) (/ (n i) (+ (d i) (rec (inc i))))))] (rec 1))) iterative process: (defn cont-frac [n d k] (loop [i k result 0] (if (z…