プログラミングClojure 第2版 p236の誤植

タイトルの通りです.

先に結論

$ lein noir new projectname

ではなくて

$ lein new noir projectname

試行錯誤の記録

現在の環境ならば

$ lein plugin install lein-noir 1.2.0

を実行しようとする時点でおそらくうまく行かない. ~/.lein/profiles.cljを作成して, 設定ファイルに

{:user {:plugins [[lein-noir "1.2.0"]]}}

と書いてからやるとうまく行くらしいんだけど, 怒られたのか, それともうまくいったのかよくわからない(多分ダメそう)な感じに

$ lein plugin install lein-noir 1.2.0
Retrieving lein-noir/lein-noir/1.2.0/lein-noir-1.2.0.pom from clojars
Retrieving org/clojure/clojure/1.2.1/clojure-1.2.1.jar from central
Retrieving lein-noir/lein-noir/1.2.0/lein-noir-1.2.0.jar from clojars
The plugin task has been removed.
 
Please see the upgrade guide for instructions on how to use the user profile to
specify plugins instead: https://github.com/technomancy/leiningen/wiki/Upgrading

ほかにも, noirを使おうとするプロジェクトのproject.cljのdependenciesに

[noir "1.2.0"]

を追加してlein depsするといろいろ落としてくるけど,

Retrieving noir/noir/1.2.0/noir-1.2.0.jar from clojars
WARNING!!! version ranges found for:
[noir "1.2.0"] -> [org.clojure/clojure "[1.3.0,1.3.0],[1.2.1,1.2.1]"]
Consider using [noir "1.2.0" :exclusions [org.clojure/clojure]].

なんかこう言われる. ので:exclusionsのあたりを追記してlein depsすると何も出力しない.
とりあえずインストールできたと仮定して,

lein plugin install lein-noir 1.2.0

を再度実行. すると,

$ lein noir new clojurebreaker
Warning: *project-dir* not declared dynamic and thus is not dynamically rebindable, but its name suggests otherwise. Please either indicate ^:dynamic *project-dir* or change the name. (leiningen/noir/new.clj:5)
Warning: *project* not declared dynamic and thus is not dynamically rebindable, but its name suggests otherwise. Please either indicate ^:dynamic *project* or change the name. (leiningen/noir/new.clj:5)
Warning: *dirs* not declared dynamic and thus is not dynamically rebindable, but its name suggests otherwise. Please either indicate ^:dynamic *dirs* or change the name. (leiningen/noir/new.clj:5)
Create and manage noir projects.

Subtasks available:
new     

Run `lein help noir $SUBTASK` for subtask details.

Arguments: ([new])

といわれる. 正直良くわからなくなってしまったのでGoogle先生に聞いてみると,

【Lisp】プログラミング言語 Clojure #3【JVM】

191 :デフォルトの名無しさん:2014/02/14(金) 20:03:15.49 .net
プログラミングClojure第二版の10.4の

lein noir new clojurebreaker

って

lein new noir clojurebreaker

の間違いじゃね?

とのことなので, やってみる.

$ lein new noir clojurebreaker
Generating a lovely new Noir project named clojurebreaker...

できた.

ほかにも

このclojurebreakerは完全に新しいディレクトを作るべきなのか, それともすでにあるclojurebreakerのディレクトリ内に作るべきなのかとかわからないし, このページの下半分だけすっごく不親切.
どうやら, 今まで使ってきたclojurebreakerプロジェクトとは別に, noirを使ってできたprojectにコード類は移植するってことらしい.

ただ, lein-noir自体が今では開発が終わってしまっていることは本の訳注にもあるし, 実質参考にならないページだと言っていいのかもしれない.

追記

noirのバージョンが, 1.2.0だとlein runで例外を吐く.
lein new noir projectnameしたときにproject.cljに書いてあった1.3.0-beta3でないとダメみたい.

更に追記
Retrieving noir/noir/1.2.0/noir-1.2.0.jar from clojars
WARNING!!! version ranges found for:
[noir "1.2.0"] -> [org.clojure/clojure "[1.3.0,1.3.0],[1.2.1,1.2.1]"]
Consider using [noir "1.2.0" :exclusions [org.clojure/clojure]].

どう見てもclojureのバージョンについての警告なのになぜかnoirのバージョンで怒られているものだと勘違いしていた
まあ, だからどうということでもないけど

Clojureのmapのちょっとした気付き

mapってリストを複数受け取れたんだなって

知らなかった

user=> (doc map)
-------------------------
clojure.core/map
([f coll] [f c1 c2] [f c1 c2 c3] [f c1 c2 c3 & colls])
  Returns a lazy sequence consisting of the result of applying f to the
  set of first items of each coll, followed by applying f to the set
  of second items in each coll, until any one of the colls is
  exhausted.  Any remaining items in other colls are ignored. Function
  f should accept number-of-colls arguments.
nil
user=> (map + [1 2 3] [2 3 4] [3 4 5] [4 5 6])
(10 14 18)
-------------------------

複数のリストの同じ位置の要素に, それぞれ関数を適用した結果のリスト(あやしい日本語)を返していることがわかる

渡したリストの長さが違う場合

user=> (map + [1 3] [2])
(3)
user=> (map + [1 3] [2 3 4])
(3 6)

短い方に合わせられている

Clojureでx::xsとか[X|Y]みたいなやつ

何したか

F#では, リストをx::xsみたいに先頭とそれ以外に分けれるっぽい
Prologも[X|Y]みたいにできた気がする
Clojureでもできないかと思ってしらべた

(defn f [[x & xs]]
  (str x "::" xs))
(f [1 2 3]) ; -> "1::(2 3)"

どうなるのか

関数fの引数にリストを渡すと, 分配束縛によってxにfirst, xsにrestが入る.

感想

関数の引数としてしか機能しないし, 予期しない制限多そう
ほかにはletつかうとか?

追伸

こっそりClojure始めたので今後書いていきたい

日記

何も書かずに1ヶ月経ちそうなので近況整理?的な事をしてみる

身内用マイクラサーバーを建てた

身内用に今使ってるVPS(さくらVPS CPU:1core Memory:1G HDD:100G)で, Minecraftサーバーを建てた
ただ, このサーバーの性能じゃきついらしく, 地上ではスムーズに走れない, 定期的に止まる落ちる, と言った有り様
でも, 上のプランに変えるようなお金もないし, そもそもプラン変更したらいろいろの移行がめんどくさいのでやれないしやらない

Clojureが気になる

Lispの方言でJVM, .NET(!)で動くプログラミング言語Clojureが面白そうだなあというだけ
android開発もできたりするらしい

貧すれば鈍す

お金がないのでやめておこうということがそれなりに多い
・デスクトップPCのHDDの寿命が来そう
・ノートPC
・VPS
・本
・ゲーセン頻度(今でもたまに行ってはいる)
・カンファやるってよ→場所は?→遠い…→やめる
でも, バイトと学校と生活を両立する自信がないのでやってない(ちなみにVPSは奨学金由来の生活費から)
ちょっと気分を変えるために外でノートPCもって課題やらプログラミングやらを〜とか,
iOS, Android触ってみたいなあとか(これはMonacaを使えばある程度実現出来る)とか,

なくても生きてはいけるけど, 自由度不足を感じるなという感じ

あんまりちゃんと活動できてない

前回の記事から1ヶ月たつけどとくにあれ移行herokuで何かしたとかない
感想としては, 目的がないので何をやっても結果に結びつかない
3年前は音ゲー作ろうとか言ってたはずなんだけど
自分の中でも興味を失ったのか, なんなのかよくわからない
成果「物」はないけど, なんだかんだRuby触ったりとかで, 何もしてないわけではないのもよくわからない

herokuのチュートリアルで躓いた話

heroku の Getting Started with Ruby on Heroku の Run the app locallyにて

そもそもpostgresqlが入ってなかったので,

sudo apt-get install postgresql

でインストールした.

gem install pg 

でgemをインストール

bundle install

してからの〜

bundle exec rake db:create db:migrate

すると〜〜〜

PG::InsufficientPrivilege: ERROR:  permission denied to create database
: CREATE DATABASE "ruby-getting-started_development" ENCODING = 'unicode'

(´・_・`)となった. 権限がないとな. では付与じゃ.

$ sudo -u postgres psql -d postgres
could not change directory to "(ワークディレクトリ)": 許可がありません
psql (9.3.5)
Type "help" for help.

postgres=# alter role "自分の名前" with createdb;
ALTER ROLE
postgres=# q
$ bundle exec rake db:create db:migrate
== 20140707111715 CreateWidgets: migrating ====================================
-- create_table(:widgets)
   -> 0.0380s
== 20140707111715 CreateWidgets: migrated (0.0382s) ===========================

やったぜ