#clojure log - Sep 30 2011

The Joy of Clojure
Main Clojure site
Google Group
IRC
List of all logged dates

0:00 Zolrath: Hm I'm trying to use Google Closure like JQuery and I don't know if that's a good idea

0:00 amalloy: cark: you can only adjust reflection warnings around top-level forms, because they are compiled as a unit

0:00 cark: amalloy: that's unfortunate =(

0:01 my problem is with proxy-super

0:01 it always gives warnings

0:01 so i need to expand it to proxy-call-with-super

0:01 and manually anotate it

0:01 Zolrath: Trying to figure out a way to easily do things like $("li:last") but I can't find a way to select the last occurance of a given element in goog.dom, everything Ive found that seems like it would.. doesn't

0:01 cark: while i really don't care about performances for this part

0:03 there is some kind of a barrier which prevent macros to propagate type hints

0:03 i'm guessing there is some good reason for that

0:03 but it's annoying

0:05 amalloy: cark: there is no such barrier

0:08 cark: well there is

0:08 trying to make a short example

0:09 actually you're right... maybe my earlier tests were bad

0:10 or it changed at some point

0:12 well then it begs the question, why is the "this" captured symbol not annotated in a proxy declaration ?

0:16 brehaut: https://plus.google.com/115094562986465477143/posts/Di6RwCNKCrf another reason lein (ok and cake) are great

1:50 amalloy: so for some f which takes a while to compute, (memoize f) may result in f being called multiple times for the same args, as different threads each look in the cache, see nothing there, and compute f. is this perceived as a problem?

1:52 companion_cube: it would be more efficient to waitt for the first thread that began computing the value

1:52 maiss then you have to know that some thread is computing it

1:52 but then*

1:54 cemerick: making it so that f returned a future that contains the result for a given set of parameters gets around that cleanly.

2:06 amcnamara: Raynes: how's meet clojure coming along these days?

2:08 amalloy: anyway, if anyone is interested in that, https://gist.github.com/1252810 is a solution that avoids that problem (trading it for a slightly slower fast-path)

3:10 mindbender1: please, In a (let [foo (baz)] foo) does the foo get the value of baz immediate eval or is eval delayed until foo is called outside []?

3:11 cark: immediate

3:11 mindbender1: cark: ok thanks

3:11 how are you today?

3:12 cark: im' fine, how about you ?

3:12 mindbender1: I'm fine thank you... you guys are being of much help

3:13 cark: =)

3:14 you can use delay and force if you need delayed evaluation

3:14 mindbender1: how would I rewrite the let?

3:16 cark: ,(let [a (delay (+ 1 2))] @a)

3:16 clojurebot: 3

3:16 cark: or

3:17 ,(let [a (delay (+ 1 2))] (force a))

3:17 clojurebot: 3

3:18 cark: you can also start the computation directly with futures

3:21 mindbender1: ok thanks

3:28 cark: grrr there is absolutely no way to have good looking text rendering with swing >>

4:04 Fossi: ,find

4:04 clojurebot: #<core$find clojure.core$find@594d1d>

4:04 Fossi: #find

5:01 Blkt: good day everyone

7:31 markc: ,(+ 1 2)

7:31 clojurebot: 3

7:34 gfredericks: can gen-class create vararg methods?

7:34 clgv: ,(ns-publics *ns*)

7:34 clojurebot: {}

7:35 clgv: &(ns-publics *ns*)

7:35 lazybot: java.lang.SecurityException: You tripped the alarm! ns-publics is bad!

7:36 clgv: ,(ns-publics 'clojure.core)

7:36 clojurebot: {sorted-map #'clojure.core/sorted-map, read-line #'clojure.core/read-line, re-pattern #'clojure.core/re-pattern, keyword? #'clojure.core/keyword?, unchecked-inc-int #'clojure.core/unchecked-inc-int, ...}

7:37 clgv: When doing a (ns-publics *ns*) I get #<ClassCastException java.lang.ClassCastException: clojure.lang.Var cannot be cast to clojure.lang.IObj>

7:37 gfredericks: clgv: any context?

7:37 you just fire up a repl and that's what happens?

7:37 clgv: gfredericks: I start CCW's REPL for a file

7:38 gfredericks: okay then I don't know what's going on :)

7:49 clgv: hm yeah. in normal repl it just works.

7:50 really strange. might be some problem with nrepl

7:50 hm lol. it works in another file, but files in that one reproducable

7:56 ok a related question to ##(doc defn)

7:56 lazybot: ⇒ "Macro ([name doc-string? attr-map? [params*] body] [name doc-string? attr-map? ([params*] body) + attr-map?]); Same as (def name (fn [params* ] exprs*)) or (def name (fn ([params* ] exprs*)+)) with any doc-string or attrs added to the var metadata"

7:57 clgv: that means I can define a fucntion like (defn f {:meta-attr :fn} [x] (inc)) right?

7:57 s/(defn f {:meta-attr :fn} [x] (inc))/(defn f {:meta-attr :fn} [x] (inc x))

8:03 oh right using metadata {:type :something} in a defn causes the problem

8:23 dbushenko: hi all!

8:24 how to sort a clojure vector?

8:24 Raynes: &(sort [4 2 1 3])

8:24 lazybot: ⇒ (1 2 3 4)

8:25 Raynes: &(sort-by - [3 2 1 4])

8:25 lazybot: ⇒ (4 3 2 1)

8:26 clgv: or if it has to be a vector again: ##(vec (sort [3 1 4 2]))

8:26 lazybot: ⇒ [1 2 3 4]

8:27 Raynes: (but it probably doesn't, so don't bother changing it back unless it actually *needs* to be a vector)

8:27 dbushenko: thank you guys!

8:27 but what if the vector looks like this:

8:28 [[:a 1] [:b 3] [:c 2]]

8:28 probably I should use sort-by?

8:28 clgv: &(sort-by first [[:a 1] [:b 3] [:c 2]])

8:28 lazybot: ⇒ ([:a 1] [:b 3] [:c 2])

8:28 Raynes: It'll sort properly ##(sort [[:b 3] [:c 2] [:a 1]])

8:28 lazybot: ⇒ ([:a 1] [:b 3] [:c 2])

8:28 clgv: &(sort-by second [[:a 1] [:b 3] [:c 2]])

8:28 lazybot: ⇒ ([:a 1] [:c 2] [:b 3])

8:28 dbushenko: great! thanks!

8:29 Raynes: clgv: We're a team, you know.

8:29 <3

8:29 clgv: lol^^

8:29 well. had to wait for lein uberjar ;)

8:43 dbushenko: is there a way to change the order of (sort-by second my-vector) ?

8:48 gfredericks: dbushenko: the argument order? just gotta define your own function

8:49 dbushenko: if you do that alot you can create a helper: (defn reverse-args [f] #(apply f (reverse %&)))

8:49 dbushenko: oh, great! thanks!

9:08 clgv: dbushenko: just in case you are using -> there is also ->> and hence maybe no need to reverse arg order

9:09 dbushenko: clgv, thanks!

9:16 TimMc: ,(class (sort [1 2 3]))

9:16 clojurebot: clojure.lang.ArraySeq

9:17 TimMc: ,(class (vec (sort [1 2 3])))

9:17 clojurebot: clojure.lang.PersistentVector

9:17 clgv: ,(class (sort (range 1000)))

9:17 clojurebot: clojure.lang.ArraySeq

9:17 clgv: ,(class (sort (range 100000)))

9:17 clojurebot: clojure.lang.ArraySeq

9:17 clgv: ,(clojure-version)

9:17 clojurebot: "1.3.0-master-SNAPSHOT"

9:18 clgv: &(class (sort (range 1000)))

9:18 lazybot: ⇒ clojure.lang.ArraySeq

9:18 clgv: &(clojure-version)

9:18 lazybot: ⇒ "1.2.0"

9:18 TimMc: Oh, that's handy.

9:39 `fogus: seancorfield: Did you have a draft of a documentation plan for 1.4? If so then I'd love to get that up on the wiki. (I recall that you mentioned you'd take a stab at it, but if my memory is bad then please smack me)

9:52 Blafasel: Any documentation for math.combinatorics? The old github repository gives a 404, the new contrib build (0.0.1) seems to be just a binary blob..

9:52 How do you guys explore things like this?

9:52 stuartsierra: Blafasel: Read the source!

9:53 Blafasel: Yeah.. Where is it?

9:53 fdaoud: wtfm?

9:53 stuartsierra: https://github.com/clojure/math.combinatorics/blob/master/src/main/clojure/clojure/math/combinatorics.clj

9:54 Blafasel: stuartsierra: Thanks.. I searched clojure.org (ended up in a dead end on the page on the old contrib library) and the new 'where did contrib go' page, which only links to the build status / artifact on maven, as far as I can see.

9:54 Appreciated!

9:56 thorwil_: what happens if you use libraries that depend on varying versions of clojure?

9:57 i'm considering to try clojure 1.3 with appengine-magic's beta branch

9:58 but do moustache and hiccup actually play along with 1.3?

9:58 stuartsierra: thorwil_: If you're using a Maven-based dependency resolution (Lein, Cake) it will resolve to the version you declare.

9:58 Obviously the library has to be compatible with that version of Clojure.

10:02 thorwil_: so hiccup should be fine: http://groups.google.com/group/ring-clojure/browse_thread/thread/d833d6741e1a8d32

10:05 fdaoud: can't wait for that book to come out! :)

10:21 clgv: Can I limit the number of threads that is used for agents?

10:28 cark: when using send, it's already limited

10:28 gfredericks: is it impossible to generate a vararg function with gen-class?

10:32 clgv: no. I mean the total amount of threads that my programm is able to use?

10:33 cark: you need to use threadpools then i guess

10:33 don't know how to hook the agents into your own thread pool

10:33 clgv: well agents already do have their threadpool ;)

10:34 cark: you're the reflecgtion wizard, i guess you'll patch that just like you want it =)

10:34 dpritchett_: Anyone know of a nice github-style open source repo browser I can set up to serve read access to my local repos?

10:35 clgv: lol, in that case something in the language is preferable.

10:35 dpritchett_: I can even consider switching SCMs if the solution is good enough

10:35 clgv: you cant always use as many threads as processors are there, since others are using that machine too, and there is an agreement on how much are allowed to use

10:36 cark: i don't think there's any facility on the clojure side of things to do what you want

10:36 clgv: but why not? it's not that uncommon...

10:36 cark: but the java implementation of agents might have some puggable stuff, you'd need to check the source

10:37 hey i don't know !

10:37 clgv: I think it's a pretty straight forward use case

10:39 * gfredericks cannot figure out where gen-class is defined

10:39 cark: https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Agent.java

10:40 looks like pretty final to me

10:40 clgv: I am already overthere ;)

10:41 damn thats true.

10:53 hmm even in 1.3 it's the same :/

11:04 cemerick: Looks like dev.clojure.org/jira is having issues?

11:06 clgv: hmm ThreadPoolExecutor has methods to change the number of Threads used, so it's no java problem but something missing in the clojure implementation of agents

11:06 fdaoud: that's what jira is for - issues\

11:06 j/k ;)

11:06 cemerick: fdaoud: well done :-P

11:06 clgv: fdaoud: lol!

11:06 fdaoud: it's Friday :-)

11:27 zerokarmaleft: greetings, programs.

11:37 technomancy: clojurebot: do you believe in the users?

11:37 clojurebot: It's greek to me.

11:37 fdaoud: clojurebot: parlez-vous francais?

11:37 clojurebot: No entiendo

11:38 fdaoud: clojurebot: who is Rich Hickey?

11:38 clojurebot: is_rhickey_a_minor_god is yes

11:38 foodoo: french != spanish(?)

11:38 fdaoud: clojurebot: what is Lisp?

11:38 clojurebot: lisp is the red pill

11:38 fdaoud: man, they thought of *everything*

11:38 foodoo: clojurebot: what is the blue pill?

11:38 clojurebot: No entiendo

11:39 fdaoud: clojurebot: what is Java?

11:39 clojurebot: http://java.sun.com/docs/books/tutorial/java/index.html

11:39 fdaoud: clojurebot: what is Cobol?

11:39 clojurebot: The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offence. -- Dijkstra

11:39 foodoo: clojurebot: (world-dominion)

11:39 clojurebot: No entiendo

11:39 fdaoud: clojurebot: what is Object-Oriented Programming?

11:39 clojurebot: http://www.math.chalmers.se/~rjmh/Papers/whyfp.pdf

11:39 fdaoud: love it :D

11:40 foodoo: clojurebot: are you an AI?

11:40 clojurebot: Huh?

11:40 foodoo: that reaction seems pretty human to me

11:40 fdaoud: clojurebot: what do you have to say about women?

11:40 clojurebot: women are just jealous, since lisp has nice curves. -- Chousuke

11:41 fdaoud: clojurebot: what do you have to say about religion?

11:41 clojurebot: I don't understand.

11:41 clgv: clojurebot: what is the blue pill?

11:41 clojurebot: blue pill is viagra

11:41 fdaoud: clojurebot: what do you have to say about politics?

11:41 clojurebot: I don't understand.

11:41 gtrak: clojurebot, java?

11:41 clojurebot:

11:41 foodoo: clojurebot: what do you have to say about Java?

11:41 clojurebot:

11:41 fdaoud: clojurebot: what is Scheme?

11:41 foodoo: dammit, two fools, same thought :D

11:41 clojurebot: scheme is Scheme is like a ball of snow. You can add any amount of snow to it and it still looks like snow. Moreover, snow is cleaner than mud.

11:42 gtrak: clojurebot, lisp?

11:42 clojurebot: "Like DNA, such a language [Lisp] does not go out of style." - Paul Graham, ANSI Common Lisp

11:42 foodoo: clojurebot: recursion

11:42 clojurebot: I don't understand.

11:42 foodoo: a clojurebot that doesn't understand recursion. That's bad

11:42 gtrak: clojurebot, recursion is recursion

11:42 clojurebot: Alles klar

11:42 gtrak: clojurebot, recursion

11:42 clojurebot: recursion is recursion

11:43 fdaoud: clojurebot, John McCarthy?

11:43 clojurebot: Gabh mo leithscéal?

11:43 foodoo: ah, so he's an AI after all :)

11:43 fdaoud: Huh?

11:43 clojurebot: who is John McCarthy?

11:43 clojurebot: It's greek to me.

11:43 fdaoud: disappointed!

11:43 gfredericks: fdaoud: you can teach him things

11:44 fdaoud: gfredericks: really? cool, show me

11:44 gfredericks: clojurebot: John McCarthy is nobody of note.

11:44 clojurebot: Ok.

11:44 gfredericks: clojurebot: who is John McCarthy?

11:44 clojurebot: John McCarthy is nobody of note.

11:44 clgv: lol what??

11:44 lazybot: clgv: Definitely not.

11:44 foodoo: clojurebot: NP == P?

11:44 clojurebot: hiccup is http://tinyurl.com/426og7n

11:44 clgv: does clojurebot hate that many questions???

11:44 lazybot: clgv: Oh, absolutely.

11:45 fdaoud: clojurebot: without John McCarthy we would not be here today.

11:45 clojurebot: John McCarthy is nobody of note.

11:45 fdaoud: clojurebot: John McCarthy is someone without whom we would not be here today.

11:45 clojurebot: c'est bon!

11:45 gfredericks: fdaoud: I think you have to format it as 'X is Y'

11:45 foodoo: clojurebot: Are macros good?

11:45 clojurebot: Barking spiders!

11:45 fdaoud: clojurebot: who is John McCarthy?

11:45 clojurebot: John McCarthy is nobody of note.

11:45 foodoo: how mysterious...

11:45 fdaoud: can't override I guess

11:45 gfredericks: clojurebot: who is John McCarthy?

11:45 foodoo: he's fooling around with us :D

11:45 clojurebot: John McCarthy is nobody of note.

11:45 gfredericks: clojurebot: who is John McCarthy?

11:45 clojurebot: John McCarthy is someone without whom we would not be here today.

11:46 gfredericks: clojurebot accepts multiple thruths

11:46 truths

11:46 foodoo: clojurebot: where is here?

11:46 clojurebot: Pardon?

11:46 gtrak: clojurebot, do you exist?

11:46 clojurebot: It's greek to me.

11:46 foodoo: clojurebot: What is the solution to all problems?

11:46 clojurebot: excusez-moi

11:47 gfredericks: clojurebot: what is the answer to the great question of life, the universe, and everything?

11:47 clojurebot: tufflax: there was a question somewhere in there, the answer is no

11:47 fdaoud: clojurebot: Francais is Le langage de l'amour

11:47 clojurebot: Ik begrijp

11:47 fdaoud: clojurebot: what is Francais?

11:47 clojurebot: Francais is Le langage de l'amour

11:47 foodoo: clojurebot: goto hell

11:47 clojurebot: Hello, mcoffbyone

11:47 fdaoud: bwahaha

11:47 foodoo: i don't get that one

11:47 clojurebot: hell

11:47 fdaoud: got you there

11:47 clojurebot: BUENOS DING DONG DIDDLY DIOS, fRaUline foodoo

11:48 foodoo: clojurebot: goto

11:48 clojurebot: I don't understand.

11:48 fdaoud: clojurebot: how sad are we, really?

11:48 clojurebot: I don't understand.

11:48 foodoo: clojurebot: why is 1 true and 0 false?

11:48 clojurebot: Gabh mo leithscéal?

11:48 foodoo: clojurebot: you are disgressing

11:48 clojurebot: Gabh mo leithscéal?

11:49 foodoo: seems like there's a knot in his tongue now

11:49 clojurebot: ()

11:49 clojurebot: () is awesome

11:49 foodoo: clojurebot: xml

11:49 clojurebot: xml is like violence; if it's not working, you're not using enough of it.

11:49 foodoo: wohooho

11:49 clgv: lol

11:49 clojurebot: cloud computing

11:49 clojurebot: Huh?

11:50 foodoo: clojurebot: Microsoft

11:50 clojurebot: I don't understand.

11:50 gfredericks: clojurebot: java

11:50 clojurebot:

11:50 foodoo: is that a cup?

11:50 fdaoud: Java logo

11:50 gfredericks: clojurebot: scala

11:50 clojurebot: Unfortunately the standard idiom of consuming an infinite/unbounded resource as a stream can be problematic unless you're really careful -- seen in #scala

11:50 foodoo: computing itself can be problematic ;)

11:51 gfredericks: unless you're really careful

11:51 fdaoud: foodoo: http://bp2.blogger.com/_DV4mNdm8j8Q/SIHBlsbtFAI/AAAAAAAAANc/qpphGzkZSPU/s1600-h/322px-java-logo.svg-1

11:51 clojurebot: ruby

11:51 clojurebot: Chunky bacon!

11:51 fdaoud: clojurebot: groovy

11:51 clojurebot: It's greek to me.

11:51 foodoo: fdaoud: thanks. But I know what the java logo looks like. But in this terminal you can hardly make it out ;)

11:51 clgv: clojurebot: c++

11:51 clojurebot: :negative/num-1 + :positive/num-1 = :zero/zero

11:51 fdaoud: foodoo: ok :)

11:52 clgv: clojurebot: c#

11:52 clojurebot: Gabh mo leithscéal?

11:52 clgv: clojurebot: .net

11:52 clojurebot: Gabh mo leithscéal?

11:52 foodoo: clojurebot: BASIC

11:52 clojurebot: Pardon?

11:52 foodoo: clojurebot: )(

11:52 fdaoud: ,(repeatedly #(+ 40 2))

11:52 clojurebot: Excuse me?

11:52 (42 42 42 42 42 ...)

11:52 clgv: clojurebot: C#

11:52 clojurebot: Excuse me?

11:52 foodoo: clojurebot: )(

11:52 clojurebot: No entiendo

11:52 gtrak: clojurebot, ()

11:52 clojurebot: () is awesome

11:53 gtrak: clojurebot, (damn)

11:53 foodoo: clojurebot: json

11:53 clojurebot: I don't understand.

11:53 http://dakrone.github.com/cheshire/

11:53 foodoo: clojurebot: UNIX

11:53 clojurebot: it's a UNIX system! I know this!

11:53 foodoo: clojurebot: iteration

11:53 clojurebot: amac: So it's a seq of connections? And what do you do with them? I understand what disjoined sets look like, but the representation and iteration is where I run into trouble.

11:56 pjstadig: clojurebot: suddenly

11:56 clojurebot: BOT FIGHT!!!!!111

11:57 pjstadig: clojurebot: suddenly

11:57 clojurebot: CLABANGO!

12:00 * gfredericks looks into scripting jruby from clojure

12:01 clgv: &(println "Clojurebot: take this!")

12:01 lazybot: ⇒ Clojurebot: take this! nil

12:02 clgv: hm damn that worked a while ago ;)

12:02 gfredericks: ,(println "&(println \"Clojurebot: I'm sorry, I didn't mean it. Friends?\")")

12:02 clojurebot: &(println "Clojurebot: I'm sorry, I didn't mean it. Friends?")

12:02 lazybot: ⇒ Clojurebot: I'm sorry, I didn't mean it. Friends? nil

12:02 clgv: &(println "clojurebot: json")

12:02 lazybot: ⇒ clojurebot: json nil

12:02 clgv: harrharr^^

12:09 crazyFox: hi. i'd like to use clojure.math.numeric-tower in a leiningen project. on http://dev.clojure.org it says this project is awaiting releases. does that mean i cant use it as it is?

12:22 gfredericks: isn't it weird that library releases aren't published with something like a commit-id? So that e.g. you could put the hash in your project.clj and validate the jars as they're downloaded?

12:29 dnolen: awesome post http://sritchie.github.com/2011/09/29/getting-creative-with-mapreduce.html

12:39 duck1123: Does anyone know what I can do if lein marg is extracting all of my ;; comments, but none of my docstrings?

12:41 pyr: duck1123: there's an open issue for that

12:42 duck1123: marginalia is broken in that regard

12:44 duck1123: I thought I had read that it was fixed, guess not

13:00 kzar: Can anyone recommend a library to generate HMAC-SHA-512s?

13:04 crazyFox: the slamhound plugin from technomancy is a really handy thing. though the project didnt move since may. is there a later/better version?

13:11 duck1123: kzar: you could always use the java libs

13:12 kzar: duck1123: Yea exactly, I've done no Java though so I wasn't sure which library was best to use

13:12 technomancy: crazyFox: the easy parts all got finished. =)

13:12 TimMc: kzar: Java standard libs should do it.

13:12 technomancy: pretty-printing is hard to do right though

13:12 gfredericks: technomancy: is it expected for lein to break under gcj 1.5?

13:13 (no big deal if so)

13:13 technomancy: gfredericks: I'm not aware of any clojure code that works under gcj

13:13 duck1123: kzar: http://download.oracle.com/javase/6/docs/api/java/security/MessageDigest.html

13:13 gfredericks: technomancy: very good :)

13:14 I figured that was the case

13:14 TimMc: ,(java.security.MessageDigest/getInstance "MD5")

13:14 clojurebot: #<Delegate MD5 Message Digest from SUN, <initialized>

13:14 >

13:14 TimMc: ,(java.security.MessageDigest/getInstance "SHA512")

13:14 clojurebot: #<RuntimeException java.lang.RuntimeException: java.security.NoSuchAlgorithmException: SHA512 MessageDigest not available>

13:14 technomancy: gfredericks: IIUC gcj is pretty skooky

13:15 TimMc: ,(java.security.MessageDigest/getInstance "SHA-512")

13:15 clojurebot: #<Delegate SHA-512 Message Digest from SUN, <initialized>

13:15 >

13:15 TimMc: kzar: ^

13:15 kzar: duck1123, TimMc: Thanks

13:17 crazyFox: technomancy: is was not rly meant as a criticism... just wasnt sure if anybody had taken it (even) further

13:17 gfredericks: technomancy: but that's what my fresh install of debian comes with

13:17 technomancy: which is so much not your fault it's not even hilarious

13:17 * gfredericks waits for `sudo apt-get install maven2`

13:18 fdaoud: cemerick: just got a note from amazon saying your book is delayed..

13:18 technomancy: gfredericks: heh. there's talk on the debian-java-maintainers list to drop gcj as the default soon. the only reason it's there now is that openjdk isn't so hot on MIPS or some such.

13:18 cemerick: fdaoud: hah, that it is :-|

13:18 gfredericks: technomancy: what? They're willing to break all of my MIPS laptops??

13:18 lazybot: gfredericks: What are you, crazy? Of course not!

13:18 kzar: Is it possible to stop Enlive wrapping <body> and <html> tags around templates / snippets?

13:19 gfredericks: lazybot: phew

13:19 fdaoud: cemerick: are you guys still writing?

13:19 cemerick: fdaoud: Everything's "done", it's an editing game at this point.

13:20 technomancy: gfredericks: oh noes!

13:20 fdaoud: cemerick: oh ok. no problem then. it's normal to take 2-3 months from "done writing" to "in print".

13:21 cemerick: fdaoud: No, there's no real problem. I think O'Reilly had some optimistic timetable in mind (as did we).

13:21 S11001001: gfredericks: got a bunch of yeeloong lemotes do you?

13:21 or lemote yeeloongs

13:22 cemerick: I never had any clue just how demanding writing a book would be.

13:22 fdaoud: cemerick: I sent in my final chapter end of July, book came out end of October.

13:22 cemerick: fdaoud: which is your book?

13:22 fdaoud: cemerick: http://www.amazon.com/Stripes-Development-Pragmatic-Programmers/dp/1934356212

13:23 cemerick: Nice. I like the cover and tagline. :-)

13:23 fdaoud: cemerick: thanks! I am happy with the positive reviews :)

13:24 cemerick: 5 stars out of 14 — nice!

13:24 kzar: dnolen: Do you know if this ever got sorted out? http://goo.gl/CO7jJ

13:25 fdaoud: cemerick: made all the hard work worthwhile :)

13:25 cemerick: fdaoud: https://twitter.com/#!/cemerick/statuses/119825104346677248

13:26 ;-0

13:26 ;-)

13:26 fdaoud: cemerick: I knew it would be hard work, I knew it would be even harder than I thought, and then it was even harder than *that*

13:26 cemerick: fdaoud: agreed.

13:27 fdaoud: cemerick: that's funny! well, since having been through writing a book, I do pay more attention to books and especially giving positive feedback to the authors of the good ones.

13:27 cemerick: Trying to do it on top of two other full time jobs was…questionable.

13:30 fdaoud: cemerick: on the other hand I've been extremely annoyed with some early-access books I've purchased from Manning and 3 years later the final book still has not been finished.

13:30 cemerick: yeah, I can imagine that's frustrating.

13:30 Ironically, I don't really buy programming books.

13:31 (let's keep that between us and the other 300 people here)

13:32 fdaoud: cemerick: that's ok, I make up your average by buying 2-3 books/month ;)

13:34 crazyFox: am i right that slamhound doesnt pick up usages of functions that were defined in the same project (but different namespace)?

13:34 fdaoud: cemerick: how was it working with co-authors? I was alone. Did you just have to write your part and let the publisher coordinate everything?

13:41 technomancy: crazyFox: it should pick those up

13:48 cemerick: Anyone here an HTTP protocol expert?

13:49 TimMc: Yeah, I use a browser like every day.

13:49 :-)

13:49 cemerick: sweet, I need some googling assistance. :-P

13:50 TimMc: haha

13:50 What's the question?

13:51 technomancy: TimMc: 408

13:51 cemerick: nevermind — was just trying to clarify whether multiple headers of the same type were actually in the spec, or merely allowed via convention

13:57 kencausey: depends on the header I believe

13:58 cemerick: kencausey: Yeah; accept and cache-control seem to explicitly allow for it; others, perhaps not.

13:59 enquora: considering moving a node.js web app server/proxy to jvm. server-sent event and websocket support required. my understanding is that ring/compojure is unsuitable. correct?

13:59 cemerick: I was just checking as to whether it's a known pattern.

14:00 kencausey: See Section 4.2 of RFC 2616

14:00 gtrak: enquora, see clj-socketio

14:00 https://github.com/ibdknox/clj-socketio

14:01 and http://socket.io/

14:01 cemerick: kencausey: Thank you. :-) How did I miss that last paragraph…

14:02 gtrak: enquora, or http://cometd.org/documentation/cometd-java

14:02 kencausey: cemerick: You just didn't get lucky with a search for multiple like I did ;)

14:02 cemerick: That's a long way of saying, multiples of the same header have set semantics for their values.

14:03 (insofar as the comma-delimitation already implies set semantics)

14:03 enquora: gtrak: which means knocking together routing, authentication support on my own, it appears. looking at aleph

14:04 gtrak: enquora, ah, does aleph and websockets work together?

14:05 enquora: I'm just looking at it, but it decouples request from response, so it appears

14:05 gtrak: enquora, i think that's necessity when you're talking async, yes?

14:05 enquora: pretty much

14:06 don't want to reinvent the wheel here, and working from socket support up seems just that. Prefer using clojure to scala, too, if possible ;-)

14:06 gtrak: ibdknox would probably know about it, but he's not around right now

14:07 enquora, socket.io != socket

14:12 enquora: gtrak: so it doesn't. socket.io looks a little thin on the ground for my purposes, though. need a full http stack that can be exposed to the 'net. That seems to mean using netty in the jvm world.

14:12 gtrak: what's the issue there?

14:12 enquora: where?

14:12 clojurebot: where is log

14:12 gtrak: there's a socket.io-netty already built

14:13 https://github.com/ibdknox/socket.io-netty

14:13 enquora: ah, k. the issue then would be documentation ;-)

14:14 gtrak: yea, all the stuff is pretty fresh, it looks like it hasn't been touched since August 1

14:14 enquora: looking for something of an ecosystem, too. most mental energy is going into radical revamping of datastore and html client.

14:15 gtrak: i think the tech isn't mature enough for that yet

14:15 enquora: yeah. just exploring. there are Scala options, but I'm much less keen on the language

14:16 gtrak: if I get around to working on it, I'd be willing to spend some brain cells on improving stuff

14:16 curious about aleph though, didn't know it was an option

14:16 enquora: *might* be

14:17 I'm comfortable enough in lisp to hack with it a bit right away. scala and assembly (er java) not so much

14:17 gtrak: clojure should be able to operate with any scala stuff, too

14:19 enquora: that's one of the reasons for moving the entire stack to the jvm. we're committed to it already through lucene and elasticsearch. growing tired of a hodgepodge of deployment environments.

14:19 gtrak: jvm's hot stuff

14:20 enquora: just discovered akka, and that seems to resolve the app reliability issues

14:25 kzar: With enlive how do I use a snippet from inside a template? As it's a function I've tried just calling it but that gives me an array-map of the structure instead of HTML

14:27 `fogus: We need a contrib adoption drive.

14:31 technomancy: `fogus: I just stripped contrib out of our project at work; the only things that didn't have replacements were to-byte-array, delete-file-recursively, defalias, and throwf

14:31 gtrak: ibdknox, what do you think of aleph for websockets? did you look at it?

14:31 technomancy: `fogus: modulo transitive deps of course.

14:32 ibdknox: gtrak: yep, back when I was building typewire I wanted to use aleph, but it was about 4 orders of magnitude slower than all my other tests

14:32 gtrak: it has improved significantly since then :)

14:32 gtrak: enquora, ^^

14:33 kzar: Ah figured it out (apply str (emit* (snippet-name "args")))

14:36 enquora: ibdknox: my need is for an app proxy to mediate between multiple datastores and sources, and rich html offline/online clients. server-sent events and websockets part of picture. Only recently returned to jvm, but netty seems to be only viable http stack. correct? need to use existing libs for routing authentication etc

14:38 ibdknox: enquora: if you intend to have long standing connections, i.e. websockets, then yes, you definitely want to be on top of netty

14:38 which is what aleph is built on

14:38 I would point out, however, dealing with websockets is a royal pain

14:39 and I suggest you consider for a bit whether or not you really need them, or if a simple polling strategy makes more sense

14:39 enquora: we really need them

14:39 ibdknox: okidoke

14:39 enquora: polling - 1999 called and it wants its protocol back

14:40 we need live updates of changes to persistently connected html clients

14:40 ibdknox: hah, sure, but it's the only solution that works consistently

14:40 in any case

14:40 what kind of load are you looking at?

14:40 enquora: tiny at the moment, but not willing to go with a hacked architecture if not necessary

14:40 and it isn't

14:41 hundreds of clients connected

14:41 not thousands or more

14:41 ibdknox: oh, aleph will breeze through that

14:41 I was looking at millions

14:41 enquora: don't want to be in a position next year where we can't handle thousands, though

14:42 ibdknox: shouldn't be an issue :)

14:43 enquora: orders of magnitude less performance doesn't sound encouraging

14:43 ibdknox: aleph could handle 5k back when I was actively screwing around with it

14:43 enquora: and, want to be ready to deploy on ARM servers next year

14:43 ibdknox: enquora: that was 6 months ago

14:43 enquora: much lower horsepower

14:44 will take a look at it

14:44 have just discovered it

14:44 ibdknox: the other option is writing against netty directly

14:44 it's a pain

14:44 enquora: yes

14:44 ibdknox: for an example,

14:44 you can look at my socket.io-netty

14:44 enquora: have enough pain moving backend and clients already

14:44 trying to minimize mental load ;-)

14:45 ibdknox: https://github.com/ibdknox/socket.io-netty

14:45 enquora: that may mean keeping the middleware on node.js or python for the moment :-)

14:45 ibdknox: if you don't mind having a node server

14:45 that will be by far the easiest solution

14:45 enquora: I *do* mind having a node server

14:46 but it is probably the easiest

14:46 ibdknox: why?

14:46 clojurebot: ibdknox: because you can't handle the truth!

14:46 kjeldahl: ibdknow: Sorry for busting in, but I just logged on. Any pointers for settuping up a websockets server, sharing a port with a traditional noir server?

14:46 ibdknow=ibdknox *sigh*

14:47 ibdknox: kjedahl: I should probably write a simple tutorial for using a noir handler with aleph :)

14:47 enquora: ibdknox: just as background, coming from erlang environment for this stuff, but library support becoming a problem. can't be writing every support function from scratch :-(

14:47 * kjeldahl drools

14:48 ibdknox: kjeldahl: basically you just use (server/gen-handler) and then use aleph's (wrap-ring-handler)

14:48 then you can run noir on top of netty :)

14:48 amalloy: kjeldahl: you can usually tab-complete usernames

14:48 kjeldahl: amalloy: Thanks, now I know! Works in ERC also...

14:48 ibdknox: enquora: so make the node server completely stupid and only handle connections. Have a queue that tells it what to do :)

14:49 kjeldahl: ibdknox: Thanks, I'll start reading..

14:49 ibdknox: enquora: but yeah, I dropped node too

14:50 enquora: ibdknox: trying to avoid a middleware queue, but it may be necessary

14:51 gtrak: you guys heard of chloe? http://www.trottercashion.com/2011/06/13/introducing-chloe.html

14:51 enquora: I know I'm in the java ecosystem now, but I'd really like to *cut* complexity ;-)

14:51 ibdknox: enquora: my experience shows that the performance characteristics of a websocket server are *entirely* different than normal web servers, we needed to separate them for scaling reasons

14:52 gtrak: chloe's a middle-man erlang server for websockets

14:52 enquora: ibdknox: it may be so. Given my current small scale, I'd prefer to factor that one out later

14:53 ibdknox: enquora: kjeldahl's question is pertinent to you too then. You can write your websocket code in aleph and just wrap noir to handle all your normal web traffic. Should work nicely :)

14:54 enquora: I was listening

14:54 ibdknox: gtrak: that wouldn't work for something that essentially streams data back and forth

14:55 gtrak: huh?

14:55 ibdknox: gtrak: having written some of this stuff from the ground up, I'm leary of things that say they will magically handle all this stuff :)

14:55 gtrak: what's it mean to stream data back and forth?

14:55 ibdknox: gtrak: to get information *back* to your server, your server receives a post request from the Chloe server

14:55 gtrak: yes

14:55 ibdknox: let's say I'm sending position information from the client to the server, updating once per second

14:56 chloe will be sending posts at an extreme rate with 100 users

14:57 dealing with an http post will incur a much higher overhead than just decoding the websocket format

14:57 gtrak: ah, perhaps, I'm sure there's optimization that could be made there

14:58 like just sockets instead of http requests

14:58 ibdknox: yeah

14:59 for many though, the way that works is probably fine :)

14:59 gtrak: it's much better to do it all in a single jvm

15:00 ibdknox: yeah

15:01 gtrak: but he made chloe to get people quickly up and running with websockets

15:01 `fogus: There is a plan for this

15:01 ibdknox: which is awesome, because it really is a pain in the ass

15:01 `fogus: a plan for what?

15:01 `fogus: this

15:02 TimMc: heh

15:02 ibdknox: lol

15:02 "this" in the cljs sense? :)

15:02 TimMc: sounds like it

15:05 ibdknox: TimMc: it was a drive-by planning

15:05 * `fogus on phone

15:07 enquora: ibdknox: our problem is that users work mainly offline. They are connected every few days to submit data and retrieve it. We're really hamstrung by the constraints of connectionless messaging at the moment. I'll admit, though, I have only a general grasp of the architectural implications at the moment

15:07 ibdknox: enquora: so why are websockets necessary?

15:08 enquora: I should add that the time users remain online is extremely variable. From an operational perspective, we need a way to keep their attention while processing data, sending out messages, etc

15:09 ibdknox: enquora: unless the resolution of new data sends is < 30s polling is by far a better solution

15:09 enquora: We have a need to communicate state changes back to browsers

15:09 we have mobile users to content with

15:09 on cell connections where every bit counts

15:09 as does latency

15:10 yes, the resolution of new data sends can easily be less than 30s

15:10 we need soft realtime

15:10 ibdknox: righto

15:10 at that point you're "streaming" and wss makes sense

15:10 keep in mind

15:10 proxies are going to screw with you

15:10 enquora: yes

15:11 that's already a problem with hotel wifi :-(

15:11 ibdknox: well, with the number of users you're talking about at this point, you shouldn't run into any real infrastructure problems

15:11 my use cases were a bit ridiculous originally

15:12 we were broadcasting per character typing

15:12 which means a message every 70 or so milliseconds

15:12 enquora: concern is that we've already put user inquires on hold with ten times as many client users

15:12 until this feels comfortable

15:12 ibdknox: you can scale horizontally without issue

15:13 fwiw a single box with socket.io-netty handles > 100k actives without issue

15:13 enquora: that's a nice concept in theory ;-) ...

15:14 `fogus: OK. That was fun. https://gist.github.com/1254701

15:14 enquora: need quorum-based multi data-center storage settled down first, to make that viable. It's nearly in hand. and that's what's led us back to the jvm

15:16 dnolen: `fogus: remind me again why ClojureScript needs access to JS this?

15:16 `fogus: Interop?

15:17 dnolen: `fogus: I'm sure I'm missing something, but I can't think of when this would be necessary, even for interop.

15:18 ibdknox: dnolen: jquery?

15:18 gfredericks: dnolen: jquery events pass the target as this I think...

15:20 `fogus: You would never have the need to use a cljs function as a method?

15:20 dnolen: ibdknox: gfredericks: so only as convenience? If so I think there need to be some thought as to whether it should be banished. Like + coercing objects to strings and concatenating them (we need unchecked-add)

15:20 enquora: ibdknox: is netty unique in the jvm ecosystem? everything else that's at all high-level seems to be oriented to servlets, which seems pretty much stuck in the 90s

15:21 ibdknox: enquora: netty is pretty low level, in the same way that node is low level. It's a NIO networking package

15:21 enquora: k

15:23 `fogus: dnolen: Are you serious?

15:23 gfredericks: dnolen: what about that example qualifies as "convenience"?

15:23 how else would you get an event target from a jquery handler?

15:23 `fogus: If you have a better way then I'm all for it

15:24 dnolen: gfredericks: event.target, I stopped using this to access the target like 5 years ago

15:24 gfredericks: dnolen: okay, so bad example. But it's conceivable that a JS API could require that you use this to access something

15:24 dnolen: even better you can extend Event, add ILookup and destructure the target out.

15:24 gfredericks: show me

15:25 I've looked at lot of them.

15:25 ibdknox: dnolen: fogus's example of using a cljs function on an object

15:25 gfredericks: dnolen: show you an existing one? or construct a hypothetical?

15:25 dnolen: ibdknox: grafting fns onto Objects is not something that is a part of APIs

15:26 ibdknox: dnolen: no, but it's a case where this is necessary

15:26 dnolen: gfredericks: not hypothetical, something that people really need.

15:26 ibdknox: unless our stance is, we just don't care

15:26 dnolen: what I take issue w/ is including something w/ bad semantics

15:27 gfredericks: dnolen: so you'd say the best interop strategy is not to allow anything until there's a concrete use-case?

15:27 dnolen: it is one of the worst parts about JavaScript

15:27 `fogus: dnolen: bad semantics? this?

15:27 dnolen: `fogus: yes, it's JavaScript's dynamic binding, but we already have that.

15:28 so we'll have a language w/ two forms of dynamic binding

15:28 `fogus: dnolen: A js library will not care if we pass a cljs function into it

15:29 ibdknox: dnolen: sure it's crappy, but it's a reality of JS as a language that such a thing is not just supported, but widely used

15:29 dnolen: is there an example in CLJ proper where we disallow you to do something you could do in Java?

15:29 dnolen: `fogus: js libraries don't bind this, they expect you to do that yourself, and there's little reason to from the context of ClojureScript.

15:29 ibdknox: that's a very long list

15:29 gfredericks: I suppose if an edge case comes up that requires this, you could always write a helper function in javascript to pass in this as an explicit first arg?

15:30 ibdknox: I've been trying to make vararg methods with gen-class and I'm betting it's not possible

15:30 ibdknox: was that an explicit decision, though?

15:30 dnolen: ibdknox: no inheritance, no real multiple constructors on types, no mutable locals outside of types, etc etc

15:30 gfredericks: dnolen: gen-class has inheritance...

15:32 dnolen: again, I'm not saying we shouldn't do it. But I think we should come up a good long list of why it's a bad idea first.

15:32 `fogus: dnolen: The interop allows all of that

15:32 gfredericks: does js/this accomplish access to this?

15:32 `fogus: dnolen: The ClojureScript source code is that big long list.

15:33 dnolen: `fogus: ? do you need js/this there?

15:33 `fogus: gfredericks: js/this is an error

15:33 dnolen: There is no js/thus

15:33 gfredericks: okay. so if it were added, js/this would be the syntax

15:34 `fogus: this even

15:34 dnolen: `fogus: sorry, then what were you saying in your last point, ClojureScript is what big long list?

15:34 `fogus: The only ways to get at this is through a hack and an explicit scope

15:35 dnolen: The existence of CLJS is the long list of reasons that JS is bad.

15:35 zakwilson: Is there a list or a site showing library compatability with 1.3?

15:35 dnolen: `fogus: I know that. So what does "this" add?

15:35 gtrak: someone needs to give marick a hug

15:35 ibdknox: gtrak: ?

15:36 `fogus: Even in Clojure the interop forms allow things that allow the host semantics to bleed through

15:36 gtrak: he's wailing on clojure for bad reasons I think

15:36 ibdknox: link?

15:36 clojurebot: your link is dead

15:36 gtrak: http://www.exampler.com/blog/2011/09/29/my-clojure-problem/

15:37 TimMc: `fogus: Looks reasonable.

15:37 What is this-as?

15:38 macro, or special form?

15:38 `fogus: macro

15:39 ibdknox: gtrak: to be fair, I agree with him about a number of things. I was in charge of a community of 6 million developers for a while, right now we're not doing it right.I hoped to talk a bit about it at the Conj

15:40 TimMc: ?

15:40 gtrak: I do too, but I feel like he wants it to be a better ruby... its niche is a really dynamic language that's still fast

15:40 TimMc: ibdknox: Rather, what project?

15:40 ibdknox: TimMc: C# and VB

15:41 dnolen: `fogus: for sure. just wanted to bring the point up. Yeah if you want to monkey-patch some existing object / prototype then yeah I can see how access to "this" would be useful.

15:41 `fogus: dnolen: I'm not trying to dismiss you, I respect your opinions on this (no pun). It would be very helpful if you could comment on CLJS-26

15:41 dnolen: `fogus: haha, I didn't think that you were :)

15:41 `fogus: dnolen: the extend-object! is still a questionable addition. it's not guaranteed to stay

15:42 gtrak: ibdknox, yea, I agree the community wants to be a bunch of elite guys

15:42 dnolen: gtrak: ibdknox: huh, who are these fabled "elite" people?

15:42 gtrak: hell, rich already argued about this with yegge

15:43 ibdknox: well, I didn't agree with Yegge either lol

15:43 gtrak: well you know, people that are willing to learn a lisp and care about speed

15:43 TimMc: I can't tell what that guy is on about.

15:43 ibdknox: he wants the opposite extreme

15:44 `fogus: I didn't see the Strangeloop talk, but as far as I know neither did Mr. Marick

15:46 But he has some skin in the TDD/Agile game, so I suppose it makes sense that he might not like that Clojure's creator is skeptical about it

15:47 dnolen: ibdknox: do you have any simple improvements in mind? (community-wise)

15:48 ibdknox: dnolen: redoing clojure.org would make a huge difference

15:48 trptcolin: "simple" - i see what you did there :)

15:48 ibdknox: haha

15:48 dnolen: :D unintentional! I'm one of the brain-washed, Marick was right! NOOOOO!

15:49 trptcolin: lol

15:49 ibdknox: hahaha

15:49 :p

15:49 dnolen: my issues are primarily around the experience of getting started with Clojure

15:50 dnolen: ibdknox: yeah there's much to be desired there, especially now that we're at 1.3.0 and ClojureScript is out in the wild.

15:50 ibdknox: dnolen: there's a lot we need to do to onboard people, some of it is very simple, some of it isn't

15:50 and there are some people who are helping out immensely, especially on here

15:51 but you average dev doesn't use IRC

15:51 your*

15:51 gtrak: well, what would be a clear goal for the community? I'd hate to see clojure turn into a blub language

15:52 ibdknox: gtrak: let's talk about it at the Conj :) By then I'll have things to show

15:53 gtrak: I'll be there for sure

15:53 ibdknox: I have lots of exciting things in the works :)

15:54 `fogus: ibdknox: I doubt that any solid entry in the way of getting started would be rejected

15:56 It's a worthy goal

15:56 I wish that I had a great idea to solve it, believe me I would have by now

15:56 trptcolin: this is the thing i really want: http://dev.clojure.org/display/design/CLJ+Launcher

15:56 `fogus: trptcolin: Me too

15:57 I know Russ and he's still motivated to do it

15:57 trptcolin: awesome

16:00 * `fogus sad panda

16:02 Blafasel: Some feedback from a guy that started with clojure a couple days ago:

16:03 - the google hits are crap (you often end up on outdated pages, on outdated repositories etc.. Dead github repos)

16:03 - the contrib move now is confusing (but probably not only for new guys and I understand that's brand new and work in progress)

16:05 - the website could use some love especially around the api section. Example: I didn't understand letfn until I googled for examples. A simple example instead of the KNF derived syntax would've gone a long way

16:06 dnolen: `fogus: ?

16:06 Blafasel: The good parts: 4clojure is immensively helpful to get started, the SO community is really active (so a search with site:stackoverflow.com is mostly a good idea) and the people in here were invaluable.

16:07 `fogus: dnolen: Just the Marick thing. It's unfortunate.

16:08 dnolen: `fogus: It hard for me to find anything resembling a rational line of thinking. His points are very ... "feeling" oriented. Nothing wrong w/ that, but make it's difficult to see understand his viewpoint.

16:09 gtrak: I think he fears that the community is hostile to TDD and agile, and will tend to mirror Rich's opinions, plus he throws in that clojure prefers speed sometimes. I think they're separate issues and he shoudln't conflate them like that.

16:11 `fogus: dnolen: The guy has spent a long time thinking about and practicing TDD and Agile, so it makes sense that he's stung. I can't say for sure what RH said at Strangeloop, but in person I've never heard him press his views on me. Hell, I wrote a documentation app and a contracts programming API. I doubt those will make it into Clojure any timer soon.

16:12 dnolen: `fogus: yup. I've pointed out that he's trying to infer from tweets what almost everyone responded to w/ glowing reviews - especially from people who don't give two hoots about Clojure.

16:12 `fogus: gtrak: It's natural that there are some people who would mimic RH, but there are also people in the Clojure community who were skeptical of TDD/Agile before they met Clojure. Likewise, there are those who adhere to TDD/Agile who do not feel rejected by Clojure/core

16:12 thorwil: it almost looks like a negative person cult performed due to expecting there to be a person cult

16:13 gtrak: yea... that's why it needs to be addressed

16:14 dnolen: sage advice, https://twitter.com/vicentebosch/status/119867016839573504

16:14 `fogus: gtrak: Not sure how it might be addressed. I'm not sure that my anecdotes would help

16:15 gtrak: maybe picking apart his various concerns and coming up with some kind of community vision we can point back to

16:15 wink: is there any common/default/tried-and-true database solution vor noir web apps?

16:16 dnolen: gtrak: sounds tiresome and in the end probably not effective. Better to put resources into making Clojure easier for newcomers ;)

16:18 gtrak: well, for example, look at python's site: "Python is a programming language that lets you work more quickly and integrate your systems more effectively. You can learn to use Python and see almost immediate gains in productivity and lower maintenance costs." , our little description is a bit tl;dr

16:21 wink: to chime in what Blafasel said (and I've also been doing clojure only for 2 weeks): I find it immenseley annoying to not have/find working snippets of certain stuff

16:21 I'm not new to programming, not even to functional programming, just to lisp-y stuff

16:21 dnolen: wink: is clojuredocs.org not useful?

16:21 hugod: google often lands you at rich's github repos and gh-pages - just taking those down might help

16:22 wink: dnolen: didn't know it. I'll investigate :)

16:22 * dnolen wishes he could destroy all Clojure information on the web pre Clojure 1.2.0

16:22 wink: one example: I got some map via read-json and it took me a while to get something like: "give me the :name of every item in this vector", like a foreach() :P

16:23 it was easy, in the end, but for some languages it would be one click away in the docs. with an example

16:23 Blafasel: wink: Same

16:24 wink: or trying to write my own integer? for lack of finding it

16:24 but all in all, it's tremendously fun :)

16:24 and I can't give enough praise to leiningen

16:24 dnolen: wink: http://clojuredocs.org/clojure_contrib/clojure.contrib.json/read-json

16:24 gtrak: wink, well you know, in some langs a lot of the complexity is in the object model or syntax, in clojure it's about finding what func you need, there are some good books already

16:24 Blafasel: I'm used to F# (which tends to lend itself to the functional parts, but might lead to overuse of -> and ->> I guess), but here I was lost for lots of things.

16:25 It _is_ a lot of fun.

16:25 pjstadig: `fogus: i was at strange loop, and i like many other people thought that what rich said was well worth hearing, however...

16:25 wink: Blafasel: ah well, at least in contrast to scala I can search for syntax constructs and not -> ::> :) or whatever symbol :P

16:25 dnolen: I'm really going to dig into that page :)

16:25 pjstadig: i think that some of the shots he took at TDD and/or agile were directed at strawmen

16:25 gtrak: pjstadig, yea some people took those comments way too seriously

16:26 wink: gtrak: yep, not gotten any book yet

16:26 pjstadig: and frankly the shots at TDD and/or agile were orthogonal to his points, and unnecessary for the presentation

16:26 imho

16:26 gtrak: wink, I like joy of clojure, there's another that came out recently

16:27 or maybe it's not out yet

16:27 trptcolin: pjstadig: agreed; perhaps a bit complecting :) i was there too, didn't find anything offensive"

16:27 but clearly there were some jabs at testing/type systems/category theory

16:28 which is fine

16:28 dnolen: pjstadig: I disagree. People look for ways of guaranteeing correctness. The usefulness of TDD and types are well established. But in current practice they occlude perhaps deeper ways to get at correctness. To not address them would have weakened the argument.

16:29 pjstadig: particularly the tests-as-guardrails and firing-the-pistol-every-hundred-yards comments were directed at mischaracterizations of agile methodology (or at least my conception of them)

16:29 gtrak: dnolen, I like the way you said that, too bad rich didn't say it like that

16:29 he also jabbed at pattern matching ;-)

16:30 pjstadig: dnolen: i don't see how they occlude deeper ways to get at correctness

16:30 dnolen: No idea is not worth jabbing. This touchy feely crap has got to stop.

16:30 gtrak: dnolen, unfortunately people don't work this way

16:30 maybe even some good coders

16:31 so i think marick a victim of that misunderstanding, too

16:32 seancorfield: pjstadig: i think he was taking shots at folks who use agile / scrum / sprints poorly - same with TDD

16:32 gtrak: yes, i was just reading marick's blog posts on the subject

16:32 pjstadig: seancorfield: i don't think that's how it came across

16:32 maybe i'll need to rewatch the video

16:32 seancorfield: it came across differently to different people i suspect :)

16:32 gtrak: pjstadig, seancorfield, the room laughed hard, a few people tweeted distaste

16:33 trptcolin: dnolen: i agree w/ that. but that means jabs at rich for giving those jabs are ok too, right? :)

16:33 seancorfield: i'm on various xp / tdd / software craft mailing lists and the zealotry of (some) xp / tdd goes beyond religion

16:33 melipone: What's "->>" in clojure? sorry for interrupting but I need an answer

16:33 dnolen: trptcolin: of course. I wish the language panel had gone on longer!

16:33 TimMc: melipone: It's a "threading macro"

16:33 pjstadig: dnolen: yes!

16:33 foodoo: melipone: (doc ->>)

16:33 TimMc: melipone: Not to be confused with Threads

16:33 melipone: meaning?

16:34 Bronsa: ,(doc ->>)

16:34 trptcolin: haha, yeah, Dean was upset that he accidentally cut it off early

16:34 clojurebot: "([x form] [x form & more]); Threads the expr through the forms. Inserts x as the last item in the first form, making a list of it if it is not a list already. If there are more forms, inserts the first form as the last item in second form, etc."

16:34 TimMc: gimme a sec

16:34 foodoo: there are good examples in the full disclojure videos on Vimeo

16:34 for ->>

16:34 seancorfield: trptcolin: i was upset that the language panel was 20 minutes short!!

16:34 TimMc: ,(macroexpand-1 '(->> 4 (f b) (c) d (e h i)))

16:34 clojurebot: (clojure.core/->> (clojure.core/->> 4 (f b)) (c) d (e h i))

16:35 TimMc: Haha, never mind that one.

16:35 melipone: ha, it's like apply it seems to me

16:35 pjstadig: well for my part i'm not too upset about the whole thing, i think rich was mistaken in some of his comments, but i think on the whole it was valuable information

16:35 TimMc: melipone: http://clojuredocs.org/clojure_core/clojure.core/-%3E%3E

16:35 When in doubt, clojuredocs.org

16:35 pjstadig: i do think there tends to be too much hero worship of rich, not to say that he's not a bright guy with good things to say

16:36 wink: pjstadig: ever seen a language community without that?

16:36 TimMc: Java

16:36 wink: (ok, besides c++)

16:36 seancorfield: if TDD is applied well, it's more about evolving the design - but a lot of people claim they're doing TDD when they're not - and it's those people who rich was parodying (in my opinion)

16:36 michaelr525`: rich is my hero! ;)

16:36 melipone: thanks!

16:37 seancorfield: i was actually disappointed that dean's heresies talk didn't take sharper shots at various topics

16:37 foodoo: sorry for my ignorance: What is TDD?

16:37 wink: Tests first

16:37 Bronsa: test driven development

16:37 foodoo: ah

16:37 seancorfield: i thought that was a very "safe" presentation :(

16:38 with clojure i think there's a tendency to use the repl to do what some people do with tdd

16:38 wink: seancorfield: sounds like you know these yearly "the state of django" at pycon :P

16:38 seancorfield: oh?

16:38 * seancorfield has never used python

16:38 wink: it's basically an educated rant about what's wrong

16:38 seancorfield: ah...

16:39 wink: and people sometimes get all upset

16:39 while the core team highly appreciates it

16:39 seancorfield: there should be no sacred cows

16:41 `fogus: Please read and comment on the relevant locations. http://dev.clojure.org/display/design/Release.Next+Planning

16:41 (relevant locations being mailing list, page comments, and clojure-dev

16:42 cemerick: so I missed the TDD chatterings, eh?

16:43 TimMc: Count yourself lucky.

16:44 pjstadig: Release.Next == 1.4?

16:44 gtrak: Java doesn't have hero worship b/c it's ill-conceived :-)

16:44 pjstadig: what about a 1.3.1 release to address the quick hits that didn't get into 1.3?

16:46 michaelr525`: quick hits?

16:47 pjstadig: documentation changes and bug fixes that we're pretty much ready, but didn't get into 1.3

16:51 michaelr525: pjstadig: why they didn't get there?

16:51 amalloy: michaelr525: 1.3 was taking too long, they wanted to get it out the door

16:52 michaelr525: cool

16:53 well, if I were involved I would probably just be eager to do the interesting stuff..

16:54 like developing new features and such

16:54 pjstadig: michaelr525: right i believe most of these have patches already

16:56 michaelr525: i wonder what motivates the core developers to do their work. i'm pretty sure they are not there for fixing documentation.. hehe :)

16:56 Blafasel: Newbie at it again: (concat a b c) results in '(( 1 2 3 4 5 )' if I println it. (interleave a b c) results in '( 1 2 3 4 5 )' when output. What's the difference? What's the (( here?

16:56 TimMc: michaelr525: I like doing doc work, actually.

16:56 amalloy: Blafasel: i think that is false. provide a concrete a, b, c that produce that behavior

16:57 dnolen: ,(concat '(1 2 3) '(4 5 6))

16:57 clojurebot: (1 2 3 4 5 ...)

16:57 michaelr525: TimMc: you're involved in development of clojure?

16:57 dnolen: (interleave '(1 2 3) '(4 5 6))

16:57 TimMc: ,(let [a [1 2] b [3 4] c [5 6]] ((juxt concat interleave) a b c))

16:57 clojurebot: [(1 2 3 4 5 ...) (1 3 5 2 4 ...)]

16:57 TimMc: michaelr525: Nope.

16:58 Just noting that not everyone hates doing doc.

16:59 michaelr525: TimMc: you must join the core team then!

16:59 TimMc: Or get my CA in.

16:59 michaelr525: joking..

17:00 CA?

17:00 clojurebot: CA is Contributor Agreement: http://clojure.org/contributing

17:00 michaelr525: clojurebot: thanks robot

17:00 clojurebot: thanks for your suggestion, but as usual it is irrelevant

17:00 gtrak: ha

17:00 TimMc: >_<

17:00 pjstadig: michaelr525: i think this is part of the (perception) problem...that only Clojure/core has super cow powers and everyone else is on the outside

17:01 part of that may just be marketing and communication

17:01 or maybe it is true

17:02 Blafasel: Looking at ProjectEuler's problem number 11 (.. so - early) and my solution looks totally bloated. Probably still caught in the 'use everything that's new in this language to you' effect.

17:03 michaelr525: pjstadig: well that's how it works in human societies. the great thing with open source is you don't have to join you can always fork..

17:03 foodoo: do (transient) and (persistent!) only exist for performance reasons or are there situations where using them is also more elegant?

17:03 gtrak: michaelr525, in practice, that's a terrible idea

17:03 technomancy: foodoo: the former

17:03 TimMc: pjstadig: It certainly doesn't help that I have to find a printer, print the PDF, find a suitable writing implement (!), write actual words on a piece of paper, find stamps and envelopes, write more words, find a mailbox, and drop it in.

17:04 When most of my contributions would be little doc tweaks, it is hard to justify that.

17:04 jkkramer: there must be a web app that lets you sign & mail pdfs

17:04 TimMc: I would have to find it. >_<

17:05 jkkramer: at least it doesn't involve navigating the physical world

17:05 TimMc: And I don't know if Core would accept the equivalent of a fax.

17:05 I mean, imagine if Wikipedia required a CA...

17:07 gtrak: wikipedia is bigger and moves faster than a language implementation

17:10 michaelr525: gtrak: i think it's not such a terrible idea.. if you want to influence you have to act and though I'm not going to dive into google to look for examples I think there are such cases when people that wanted to change forked the code and made something that later was accepted as the better option... hmm gcc->egcs is a good example i think

17:10 gtrak: michaelr525, yea, those guys were really hostile though

17:11 i guess I mean to say, don't fork unless you're going to win

17:11 michaelr525: they were hostile?

17:11 gtrak: yea, the gcc guys

17:11 michaelr525: hehe

17:11 pjstadig: forking is a nuclear option

17:11 jcromartie: who wants to fork?

17:11 gtrak: nobody

17:11 jcromartie: and why?

17:11 ok

17:12 pjstadig: i'd prefer for people to play nice with each other

17:13 michaelr525: sometimes it's a question of ability rather than will :

17:27 amalloy: Blafasel: i put together a quick solution for euler 11, if you're interested

17:27 https://gist.github.com/1255015 or i can have a look at yours

17:33 foodoo: Is there some good document explaining good indenting style for clojure?

17:33 gtrak: same as lisp

17:33 amalloy: $googe mumble scheme style

17:34 $google mumble scheme style

17:34 lazybot: [Riastradh's Lisp Style Rules - mumble.net main page] http://mumble.net/~campbell/scheme/style.txt

17:34 foodoo: s/clojure/lisp/

17:34 lazybot: <foodoo> Is there some good document explaining good indenting style for lisp?

17:34 foodoo: thanks

17:34 duck1123: I always follow the rule, take whatever emacs gives you

17:35 amalloy: duck1123: indeed. there are a couple things it could do better, though

17:35 eg, try ((juxt + -) 10 <newline> 5) - 5 goes in a place that seems definitely wrong

17:36 duck1123: Well, I have a rather large list of things that are counted as defs

17:36 amalloy: duck1123: using clojure-defun-indents?

17:36 wink: hm, counterclockwise does things that appear a bit weird at times

17:37 duck1123: define-clojure-indent is what I have

17:37 amalloy: duck1123: try M-x customize-var clojure-defun-indents

17:37 foodoo: duck1123: That would mean, I need to switch to Emacs from Vim ;)

17:37 amalloy: i added that in 1.7 or so and i love it. much easier than defining that crap yourself

17:38 duck1123: very nice. I'll switch over

17:39 foodoo: amalloy: You are from the 4clojure team, right? Is there a way to see if the people I follow do code golfing? Because when I look at their solutions I'd like to know if their solutions are made for elegance or shortness

17:40 amalloy: duck1123: the other indentation thing i think emacs does atrociously is https://gist.github.com/1255043

17:41 here sam should line up with when, not bar; but the introduction of baz causes it to get confused

17:41 duck1123: agreed. I find I end up inserting too many line breaks just to make it look normal

17:41 amalloy: foodoo: not really. i'm susprised it's ever hard to tell, though?

17:43 foodoo: amalloy: Sometimes. But that could also mean that the users try to be clever instead of idomatic and clean

17:45 amalloy: But even if they do code golfing, there is usually something I can learn from the solutions :)

17:46 amalloy: foodoo: i learn a lot from people trying to cram the most amount of logic into the least amount of code

17:46 foodoo: amalloy: But I'm also interested in developing a good coding style in the lispy world

18:11 seancorfield: i like the focus of Clojure 1.4 (documentation around core and contrib) :)

18:12 dnolen: agreed

18:12 and errors

18:13 ibdknox: did I miss that statement?

18:13 seancorfield: yes, although stack traces are more of an issue imo

18:13 ibdknox: seancorfield: I dunno, just look at some of these:

18:13 ,(doc bound-fn)

18:13 clojurebot: "([& fntail]); Returns a function defined by the given fntail, which will install the same bindings in effect as in the thread at the time bound-fn was called. This may be used to define a helper function which runs on a different thread, but needs the same bindings in place."

18:13 dnolen: seancorfield: I take it you haven't looked at 1.3 stacktraces yet?

18:14 seancorfield: i use 1.3 all the time :)

18:14 dnolen: seancorfield: no Java stuff, and unmunged

18:14 seancorfield: oh, were the stack traces worse in 1.2?

18:14 ibdknox: lol

18:14 technomancy: clj-stacktrace is still a lot nicer

18:14 especially the alignment, though the coloring helps too

18:15 dnolen: seancorfield: haha, 1.2 stack traces would have terrified you then.

18:16 zerokarmaleft: dnolen: but they were only 20+ levels deep!

18:16 seancorfield: mostly, for me, clojure exceptions escape into non-clojure calling code so there's not much clojure can do to help me there :)

18:16 dnolen: seancorfield: ah then you would have preferred the old way.

18:16 seancorfield: the whole thing needs knobs.

18:17 ibdknox_: and objects that we can inspect and do useful things with :)

18:17 seancorfield: i guess i could look at the root of the exception chain and call a clojure fn to pretty print the stacktrace instead...

18:17 i'm already calling all sorts of clojure stuff from non-clojure code :)

18:19 gtrak: at some point you can't escape from needing to know java and the jvm

18:19 ibdknox_: unless you're in CLJS ;) then you just need to know JS... damn

18:20 gtrak: yes, actually, it's not terribly hard to debug as I thought it would be, and I don't know any js at all

18:22 the hardest part of clojurescript is reading the closure api code

18:23 ibdknox_: heh

18:23 use pinot ;)

18:23 gtrak: pinot?

18:23 ibdknox_: github.com/ibdknox/pinot

18:23 http://github.com/ibdknox/pinot

18:24 gtrak: ah, you're adding canvas stuff

18:25 ibdknox_: over the past little bit yes

18:25 gtrak: i was working on a little game engine using google's api's

18:25 ibdknox_: ah :)

18:25 don't use seqs, it'll be too slow :-p

18:25 gtrak: i was trying to figure out how to remove a rectangle and got stuck

18:25 ibdknox_: remove a rectangle?

18:25 gtrak: yea, you know the graphics.createRect or whatever?

18:26 ibdknox_: I just wrote my own, since I was porting over some stuff I did for the node knockout

18:26 gtrak: node.js does graphics?

18:27 ibdknox_: it could, but no, I wrote a game :) http://wrench-labs.nko2.nodeknockout.com/

18:27 gtrak: ah yea, I played that

18:27 super easy :-)

18:27 ibdknox_: I know

18:27 lol

18:27 didn't get to play test it much :( haha

18:28 gtrak: is that all canvas then?

18:28 ibdknox_: yessir

18:29 gtrak: I'll take a look at pinot then, no use reinventing wheels

18:31 but you've hard-coded the looping intervals

18:31 ibdknox_: hm?

18:31 you should be using animation frame to handle the render loop

18:31 and 10 ms is pretty standard for the update loop

18:32 gtrak: so the update is asynchronous to the draw?

18:32 I'm used to doing it all in frames

18:32 ibdknox_: yep, you need it to be to ensure consistency

18:32 otherwise a game would play differently every time

18:33 gtrak: ibdknox, how so?

18:34 ibdknox_: gtrak: http://gameclosure.com/2011/04/11/deterministic-delta-tee-in-js-games/

18:34 gtrak: only if it takes longer than a frame to do stuff, yes?

18:34 i'm completely new to js, btw

18:35 ibdknox_: no worries, I just thought that was a better explanation than I could give here :)

18:35 gtrak: yea, np, I mean, I'm used to C++ thinking for game stuff

18:37 so does the browser interrupt execution to handle a timer?

18:38 ibdknox_: I'm actually not sure how that happens. I know with the more recent versions it's extremely complex now

18:38 kjeldahl: ibdknox_ Great link, thanks!

18:38 ibdknox_: like request animation frame operates outside of the rules of normal timers

18:39 and monitors screen refresh rate

18:39 gtrak: sure, but you always can believe js is a single thread, yes? so the old school interrupt model of saving the stack is a decent analogy?

18:39 ibdknox_: yeah

18:40 except for animationframe I think

18:40 lol

18:40 gtrak: ha

18:40 wonderful

18:40 brehaut: and web workers

18:40 ibdknox_: I won't claim to know a ton about this part of JS myself, though, so I could be making it up :)

18:40 that was the first game I had written

18:41 gtrak: well, are there any js forums with good snr?

18:41 brehaut: the rules around when animationFrame, timeouts, intervals and web worker/socket events enter JS are all different, and i think differ between browsers too

18:43 gtrak: also is there any progress on dealing with cljs libs? what's the modern way?

18:44 ibdknox_: well

18:44 if you use cljs-watch

18:44 crazyFox: what could be the reason that 'lein search clj-stacktrace' doesnt show version 0.2.3 even though i can see it on clojars.org?

18:44 ibdknox_: you can just do it like you do with any lein project

18:44 add [pinot "0.1.1-SNAPSHOT"] to your project.clj and roll with it :)

18:45 gtrak: wait, huh?

18:45 cljs uses project.clj?

18:45 ibdknox_: I usually create leiningen projects for them because there's some server showing the page

18:46 gtrak: does the compiler care about what subdirectory stuff is in or can I do what I want there?

18:47 thinking I could just pull in the git repo and hack away

18:48 ibdknox_: any dir is fine

19:05 symbole: I can't find a good example of gen-class outside a namespace declaration. I do (gen-class :name "foo.Bar"). When I try to (compile 'foo.Bar), it says that fool/Bar_int.class foo/Bar.clj is not in the classpath.

19:08 Blafasel: ,(doc pr)

19:08 clojurebot: "([] [x] [x & more]); Prints the object(s) to the output stream that is the current value of *out*. Prints the object(s), separated by spaces if there is more than one. By default, pr and prn print in a way that objects can be read by the reader"

19:08 Blafasel: ,(doc print)

19:08 clojurebot: "([& more]); Prints the object(s) to the output stream that is the current value of *out*. print and println produce output for human consumption."

19:09 ibdknox_: ,(pr ["hey" "how" "are" "you"])

19:09 clojurebot: ["hey" "how" "are" "you"]

19:09 ibdknox_: ,(print ["hey" "how" "are" "you"])

19:09 clojurebot: [hey how are you]

19:19 jli: I think I'm gonna do a "best of Hacker News" thing that polls the site continuously and just sends you the best stories at the end of the week

19:19 there's cool stuff on it, but usually only a couple a day. but they move off the page within a day or two, so you have to read it every day to not miss stuff

19:22 this must already exist... oh well

19:25 ibdknox_: jli: As long as it always grabs anything with ibdknox in it, sounds like it'd be a winner ;)

19:26 jli: ibdknox_: but of course :)

19:26 ibdknox_: I know there was such a thing

19:26 crazyFox: technomancy: are you around?

19:27 ibdknox_: but now I can't find it

19:33 crazyFox: could anybody help me with slamhound? when i run 'lein slamhound <my/namespace>' it fails to find some symbol defined in an other file (same project) and throws an exception. i dunno what i can do ^^

19:37 symbole: crazyFox: What's the exact error?

19:39 crazyFox: (after a lot of warnings about earmuffed vars) it says "Exception in thread "main" java.lang.RuntimeException: java.lang.Exception: Couldn't resolve layout-step, got as far as ..."

19:40 symbole: you're running it from the root of your project?

19:40 crazyFox: yea

19:41 symbole: Can you dump the whole thing somewhere?

19:43 crazyFox: symbole: error message from leiningen: http://pastebin.com/Pby7GHB8

19:46 symbole: project.clj and directory tree: http://pastebin.com/T9X2XWML

19:46 symbole: Firewall is blocking it. Grrrr! Try this please http://paste2.org/

19:46 TimMc: or github

19:47 ~gist

19:47 clojurebot: Excuse me?

19:47 TimMc: ~paste

19:47 clojurebot: paste is http://gist.github.com/

19:48 dnolen: ClojureScript stacktraces from Browser REPL - sweet

19:49 crazyFox: symbole: its all here http://paste2.org/p/1682074

19:50 symbole: crazyFox: Are you using Clojure 1.3?

19:50 crazyFox: yes

19:52 konr: What's the cheapest way to host a clojure web app?

19:52 zodiak: konr heroku

19:53 TimMc: home server

19:53 ibdknox_: cheapest?

19:53 elastic beanstalk is *way* cheaper than heroku

19:53 zodiak: heroku is free, how do you get cheaper ?

19:54 ibdknox_: heroku is free for one dyno

19:54 konr: yeah, I don't to spend lots of money in a web forum, nor mix it with my personal data

19:54 thanks zodiak!

19:54 zodiak: de nada

19:54 konr: ibdknox_: elastic beanstalk! I'll take a look! Thanks :)

19:54 ibdknox_: as is elastic beanstalk

19:54 the minute you want anything more than that though... :)

19:56 konr: if you wanna do heroku here's a tutorial: http://thecomputersarewinning.com/post/clojure-heroku-noir-mongo

19:56 seancorfield: clojure.contrib.duck-streams - that's in contrib 1.2.0 but not listed in the modules here: https://github.com/clojure/clojure-contrib/tree/master/modules

19:56 what was it? where did it go? or was it deprecated?

19:57 konr: ibdknox_: thanks!

19:57 ibdknox_: seancorfield: I think part of it was pulled into java.io, and the rest disappeared? People are often looking for it though

19:58 crazyFox: symbole: is clojure 1.3 a problem?

19:59 TimMc: ibdknox_: Would you say Heroku or EB is easier to get started with?

19:59 ibdknox_: TimMc: roughly equivalent, Heroku is probably a bit less of a pain to sign up with

19:59 TimMc: k

19:59 ibdknox_: the heroku workflow is beautiful too :)

20:00 seancorfield: yeah, +1 for heroku

20:00 ibdknox_: The only problem is it can get a little expensive

20:00 on an AWS box I can run 20 sites if I wanted

20:00 for heroku, each one is a separate dyno and costs me money individually

20:01 seancorfield: right, as you scale up, you usually have to move off heroku to aws or rackspace cloud or something

20:01 konr: I think I'll stick with EB, then

20:02 seancorfield: clojure.contrib.pprint became... clojure.pprint, right?

20:02 gfredericks: either that or they have suspiciously similar names and functionality

20:04 seancorfield: ooh, where did clojure.contrib.shell and clojure.contrib.shell-out go?

20:04 * seancorfield is updating wiki documentation to help folks migrate to 1.3

20:04 ibdknox_: seancorfield: clojure.java.shell

20:04 seancorfield: thanx!

20:06 i removed all the contrib stuff from http://dev.clojure.org/display/community/Libraries because it was horribly out of date (stuart sierra sanctioned the removal)

20:07 there were a lot of c.c.* namespaces i'd never heard of and can't find documented anywhere so i assume those vanished even before 1.2.0 came out...

20:08 ibdknox_: predates me, so I'm not sure :)

20:08 dnolen: seancorfield: yes about pprint

20:09 konr: What's the best way to check out existing software? Clojars?

20:09 dnolen: konr: checkout? or use?

20:09 ibdknox_: konr: what are you looking for?

20:09 konr: dnolen, ibdknox_ I want to check out for existing forum software in clojure

20:10 seancorfield: ibdknox_: clojure.contrib.apply-macro and clojure.contrib.condt for example... never made it into contrib 1.2.0

20:10 ibdknox_: I don't think there is any

20:10 seancorfield: ah, I see

20:10 seancorfield: konr: there are very few full-fledged web applications available in clojure yet - just lots of tools for building such things

20:11 dnolen: tx for the confirm on pprint

20:11 glob157-1: Any good way to build publication quality charts from in canter?

20:12 dnolen: seancorfield: you mean full fledged open-source web applications, there are closed source ones.

20:12 ibdknox_: yeah

20:12 dnolen: konr: some stuff on github

20:12 ibdknox_: there aren't many prepackaged solutions for clojure

20:13 only thing I can think of is cowblog

20:13 https://github.com/briancarper/cow-blog

20:14 seancorfield: dnolen: oh? what full fledged web apps are built in clojure?

20:14 ibdknox_: seancorfield: www.typewire.io

20:14 :)

20:15 seancorfield: heh, i meant downloadable products, not websites

20:15 ibdknox_: hm web apps = downloadable?

20:15 gmail is a web app

20:15 seancorfield: desikiss.com, lovingbbw.com, latinromantico.com, deafsinglesmeet.com and vietvibe.com have a fair bit of clojure behind them too :)

20:16 downloadable... you download the app and install it to run on your own web/app server... wordpress, django, joomla are the sorts of things i mean

20:17 ibdknox_: ahh, I see

20:17 seancorfield: phpbb

20:17 ibdknox_: cow blog is it, as far as I know :)

20:17 seancorfield: cfml (coldfusion) has a bunch of downloadable web apps (mostly free open source) but nothing as polished as some of the php stuff

20:18 i'd be surprised if clojure saw much take up in that area - i don't get the impression that sort of development is common amongst java / scala / clojure type developers...

20:19 ibdknox_: those systems are usually very, very painful to work with

20:19 once upon a time ago I worked on a number of drupal and joomla sites *shudder*

20:19 dnolen: seancorfield: tho I don't see anything preventing such things. I didn't totally hate the Django model.

20:20 seancorfield: true, and i'd love to see more of it out there... i've been championing that cause in the cfml community for years (without a huge amount of success)

20:23 ibdknox_: django is a framework though, not a complete end to end solution

20:23 robermann: ,((fn [] '( + 1 2)))

20:23 clojurebot: (+ 1 2)

20:23 robermann: ,(((fn [] '( + 1 2))))

20:23 clojurebot: #<ClassCastException java.lang.ClassCastException: clojure.lang.PersistentList cannot be cast to clojure.lang.IFn>

20:23 robermann: Can I run ((fn [] '( + 1 2))) ?

20:24 I mean; how can I evaluate dinamically a '(+ 1 2) without using eval?

20:26 gfredericks: robermann: what's the purpose

20:27 obviously if it was the expression (+ 1 2) you were trying to evaluate you'd just put it there; it's not clear what you're after

20:27 robermann: I resolved this problem using eval: http://4clojure.com/problem/121

20:27 but I "tripped the alarm!"

20:27 gfredericks: ah hah

20:27 robermann: :)

20:27 gfredericks: I think the key here is that the set of possible functions is restricted

20:28 you don't have to deal with arbitrary clojure code, just the pieces specified in the problem

20:28 robermann: yep - but here eval is not listed: http://4clojure.com/directions

20:28 gfredericks: so what you want is a function that takes a list as input, looks at it, and decides what to do

20:29 I'm not sure what you mean by it not being mentioned in the directions

20:30 robermann: They say that "to use "def" or switch namespaces" is not allowed - I thought using eval was permitted :)

20:30 seancorfield: 4clojure questions used to explicitly state which functions you couldn't use in the solution - i'd imagine eval is disallowed for safety reasons (so you can't execute malicious code and take down the service)

20:30 gfredericks: and certainly it violates the spirit of that particular problem

20:30 robermann: yes, I can see

20:30 dnolen: ibdknox: true, though it has those too.

20:31 robermann: mm so, given an input list like '(+ 1 2) I should be able to evaluate it right?

20:32 and of course ('(+ 1 2)) does not work

20:33 mmm here 2:30 am maybe too tired :D

20:37 seancorfield: robermann: it's asking you to write a function that takes an expression and returns a function that evaluates, when given a map of argument values

20:38 so (f '(+ a 2)) would return some function, call it g, that when called like this (g {:a 4}) would return 6

20:40 the returned function has to recursively walk the expression and evaluate it by inspecting the code and supporting just + - * / numbers and lookup of variables

20:40 does that help?

20:41 robermann: yes I wrote http://pastebin.com/Z19GM8Sd but I'm stuck with that eval

20:41 so I should execute that symbol browsing the list

20:42 I mean, decoding all the + - etc

20:42 TimMc: Look it up in a map.

20:42 robermann: ok, I think I understood your advice

20:42 TimMc: If you weren't restricted by the sandbox, you would use resolve. :-)

20:42 robermann: thank you all :)

20:49 seancorfield: you're basically writing an interpreter for a small subset of lisp :)

20:51 TimMc: Yeah, this reminds me quite strongly of PL class at Northeastern.

20:51 whatchamacallit, a metacircular evaluator

20:52 robermann: yes - my first step towards a new Clojure 2.0 ! :)

20:54 * TimMc writes a new LISP that uses Windows-1252 smart quotes instead of parens.

20:57 robermann: so men - good hacking and good night/morning

20:57 see you

20:58 seancorfield: of course now i had to go and solve the problem myself because i couldn't focus on my work until i had!

20:58 4clojure is quite a bit slicker since i last played

20:59 amalloy: seancorfield: a lot of pending improvements just waiting to be deployed, too

20:59 robermann: I know - and it causes addiction too

20:59 so... no, really I have to go to bed :D

20:59 bye

21:00 seancorfield: lol, g'nite robermann

21:00 amalloy: the ajaxy stuff around running the code is very slick - nice work

21:00 (to whoever wrote that part)

21:01 amalloy: seancorfield: a transient contributor, i think, who we haven't seen since. it's definitely nice to be open-source

21:02 seancorfield: sigh... i last played when there were 65 problems

21:02 i might have to waste a weekend catching up :)

21:03 amalloy: seancorfield: more than a weekend. there are some tough problems now

21:04 seancorfield: no... must... not... get... distracted...!

21:21 jli: hm

21:22 I'm running a ring webapp with a gzip middleware

21:22 and using apache as a proxy in front of it, so I can hide the random port I'm running jetty on

21:23 accessing jetty directly is close to instant, while through apache, there seems to be a weird ~15s timeout

21:23 and disabling the gzip middleware in ring fixes it. any ideas?

21:26 looking at the tcpdump, there's a Keep-Alive timeout of 15s, which is the time it takes to load

21:27 TimMc: Can you muck with the timeout?

21:27 (for diagnosis)

21:30 jli: what would I learn?

21:30 TimMc: Whether it is a coincidence. :-)

21:30 jli: pretty sure not - it's 15s plus some millis in the tcpdump timestamp

21:35 hm. I wonder if apache is gzipping it again or something...

21:36 ah ha!

21:38 the original length of the file is 79k. gzipped, it's only 22k. when using the gzip middleware + apache proxy, the Content-Length is 79k.

21:38 the browser must be waiting for the "rest" of the data

21:39 amalloy: jli: ooc what gzip middleware are you using?

21:40 the problem you're having sounds like one i ran into when i was writing my own gzip middleware

21:40 jli: org.clojars.mikejs/ring-gzip-middleware

21:40 the version perhaps should have tipped me off

21:40 0.1.0-SNAPSHOT

21:41 amalloy: jli: i think that's the base i used to write my own

21:42 you might try out [amalloy/ring-gzip-middleware "0.1.0"]

21:42 which has two improvements over mikejs: i fixed the content-length issue by dissoc'ing out the content-length when gziping; and i don't load the whole reponse into memory before gzipping. instead i stream it on another thread

21:44 oh, i even forked his repo. good for me

21:44 jli: ah, sweet

21:44 amalloy: https://github.com/amalloy/ring-gzip-middleware/commit/533a08

21:44 jli: would ring take it?

21:45 amalloy: jli: like, make it a part of ring proper? perhaps, but who cares

21:46 jli: amalloy: can you remind me how http works? is Content-Length only necessary when using keep-alive? how does the client know it has all the data - the tcp connection closes?

21:47 amalloy: jli: i don't know the full answer to that question. but i think when ring doesn't know the full length it specifies Transfer-Encoding: Chunked

21:48 then it sends a bunch of blocks, "this chunk is N bytes, here they are"

21:48 the last chunk is of zero length, perhaps?

21:49 jli: amalloy: ah, I do see "Transfer-Encoding: chunked" with the response ending in "0" for my index.html, with no Content-Length

21:50 and for my big javascript file, I see the *incorrect* Content-Length (it's the length of the original file)

21:50 but then it looks like the tcp connection closes right after, so the browser puts up with it and displays what it has, I guess

21:50 hm.

21:51 amalloy: but apache won't put up with that while proxying? plausible, i suppose

21:52 jli: when going through the apache proxy, I see Keep-Alive headers

21:52 so I think the tcp connection stays open until it finally times out 15s later

21:52 amalloy: i see

21:52 jli: at which point the page loads correctly

21:52 amalloy: anyway: use my fork, problem solved?

21:52 jli: yeah, I think so :)

21:56 amalloy: jli: fwiw, 4clojure uses it to gzip all its content and hasn't had trouble. so it's at least a little battle-tested

21:58 jli: amalloy: sweet. I think the bug is unambiguously caused by the gzip middleware keeping the incorrect Content-Length, right? i just wasn't noticing before because keep-alive wasn't in play.

21:59 how did you notice the bug?

21:59 amalloy: i don't remember. it was months ago

21:59 probably the same way you did

21:59 jli: oh, maybe because you realized you couldn't know if you were streaming it?

21:59 amalloy: oh, of course

22:01 jli: heh

22:01 cool.

22:02 amalloy: i wonder why i cared so much about not reading the whole thing into memory at once

22:03 jli: amalloy: do you no longer think it matters?

22:04 amalloy: *shrug* i still think it's "right" not to read it all

22:07 oh right, i was going on a performance binge, improving page load/render speed for 4clojure

22:08 and we were serving up, uncached and unzipped, like 1MB of javascript

22:08 * gfredericks imagines the project manager at 4clojure Inc getting worked up about arbitrary aspects of the product

22:08 amalloy: so i zipped it, and attached headers/meta to avoid retransferring if nothing has changed

22:11 gfredericks: that actually happens

22:12 gfredericks: amalloy: he's under pressure to put something good on the monthly report that the CIO will glance at?

22:13 amalloy: gfredericks: whiny users tell him they wish 4clojure.com redirected to www.4clojure.com instead of transparently serving the same content

22:13 gfredericks: how does that inconvenience anybody?

22:13 I guess stuff could get indexed twice...

22:14 amalloy: gfredericks: broswer doesn't know the cookies/passwords are the same

22:14 gfredericks: oh and that

22:14 why doesn't technology just work?

22:14 doesn't it know what it should do?

22:14 jli: DWIM!

22:14 amalloy: so a couple days ago i made the webserver multi-host-aware, and while i was at it said to not serve cookies at all if the host is static.4clojure.com

22:15 these changes not yet deployed, though :P

22:15 * gfredericks fires off some angry tweets blasting 4clojure

22:15 jli: amalloy: true hilarity. using your gzip middleware, Content-Length isn't there anymore. BUT I think Apache has the same bug. using the apache proxy, I see the same incorrect Content-Length header

22:16 or maybe I'm wrong. double-checking

22:16 amalloy: huhhhh, how can it?

22:16 apache doesn't even have a guess as to what content-length to serve, it's just delegating

22:17 jli: no, I'm wrong. seems like it's still using the old library somehow? grr

22:20 jayunit100: hahahahahahah

22:21 gfredericks: ,(println "&(println \"hahahahahahah\")")

22:22 clojurebot: &(println "hahahahahahah")

22:22 lazybot: ⇒ hahahahahahah nil

22:27 jayunit100: @gfredricks whats the comma do

22:28 gfredericks: gets clojurebot's attention

22:28 he likes commas

22:28 jayunit100: oooo ok lol

22:51 jli: amalloy_: ack, just blew 30 minutes on this. didn't run "lein clean", so I guess I was still using the /old/ ring.middleware.gzip :/

22:52 0.5 hours down, 9,999.5 left to go :)

22:56 amcnamara: we just updated 4clojure with a new look (and small fixes to ranking and solutions pages), would love some feedback

22:56 everyone ^

22:57 * gfredericks just failed problem 7 on his first try

22:58 jli: did the logo change recently?

23:00 dnolen: cemerick: you're being nice, but I think Marick is indeed trolling. On multiple fronts.

23:01 cemerick: heh

23:01 I don't know. But then, I try to give everyone the benefit of the doubt, especially online.

23:02 trptcolin: and here i thought rich was trolling w/ the whole driving-into-the-guardrails thing :)

23:02 cemerick: trptcolin: oh, Rich was *definitely* trolling ;-)

23:02 I think that was pretty explicit.

23:02 But I think the point is, that should be OK — it's his keynote, after all.

23:03 trptcolin: fair

23:03 cemerick: It'd be a horrible thing to have to live in a PR cocoon in order to build a "successful" community/language.

23:03 It's certainly not required: I remember witnessing all sorts of mayhem anytime Guido talked down FP.

23:04 And there, he actually *kept stuff out of the language*, preventing people from doing certain things. I don't think Rich is going to pull X from Clojure, because he happens to not like TDD or whatever.

23:05 jli: elementary 4clojure problem taught me something. didn't expect (= [:a :b :c] '(:a :b :c))

23:05 dnolen: cemerick: trptcolin: trolling and criticism are not the same. Criticism attacks an idea, we can all stay rational. Marick attacks people w/ an idea, there's no rational response.

23:05 cemerick: Anyway…I'm writing up a comment. Hopefully Brian will be less stressed once the real video is out, etc.

23:06 trptcolin: dnolen: c'mon, that metaphor?

23:06 i'm all for rational criticism

23:06 and funny metaphors

23:06 dnolen: "The dodgy attitudes come from the Clojure core, especially Rich Hickey himself, I’m sad to say."

23:06 that's a hard line to justify.

23:06 cemerick: dnolen: If you self-identify with a particular idea, then criticism of it is viewed as criticism of you. The "recipient" doesn't (can't) distinguish the two.

23:07 amcnamara: since when does the core team have dodgy attitudes?

23:07 ibdknox: hm

23:07 trptcolin: yeah, i'm not defending marick's sound bites. i'm just saying i felt like rich was trying to get a rise out of people

23:07 gfredericks: cemerick: as someone who self-identifies with lots of ideas, I take offense at that personal attack!

23:07 ibdknox: things were a little heated lately I think

23:08 * gfredericks tries to figure out if his joke made sense or not

23:08 trptcolin: some of it was reasonable, some purely funny metaphor

23:08 cemerick: ibdknox: Indeed. I don't think using twitter as the main vehicle of discourse helped much, either.

23:08 trptcolin: +1

23:08 ibdknox: not at all.

23:09 dnolen: trptcolin: I would agree w/o you - except Marick be naming names - not cool.

23:09 ibdknox: cemerick: I kept out of it, because I don't think a lot of the way discussion has been happening lately has been effective. The Conj will be *very* interesting.

23:09 amalloy: jli: yes, new logo is part of (indeed most of) the new look

23:10 cark: whatwhat ? there's a new clojure logo ?

23:10 cemerick: There's a little drama at every language/community-specific conf.

23:10 jli: cemerick: yes. it's really unfortunate people try to squish coherent thoughts into 140chars. I don't think it's possible.

23:11 cark: not clojure itself, http://4clojure.org

23:11 cemerick: jli: Human nature. We'll try to squish coherent thought into smoke signals, too. :-)

23:11 ibdknox: cemerick: yes, but I'm hoping something good comes out of it. :)

23:11 jli: not... enough... bits... :(

23:11 trptcolin: dnolen: yeah, not how i would've approached it; though i'm not as married to agile/tdd

23:13 danlarkin: I have a question which is entirely unrelated to drama

23:13 jli: YES!

23:13 danlarkin: cons : list :: ? : hashmap

23:13 the cons cell, I should say

23:14 jli: you mean, what's the underlying data structure?

23:14 cemerick: lists aren't made of conses, so I'm not sure what to put in ?

23:14 danlarkin: jli: I suppose... more like what's the most simplistic reduction

23:15 dnolen: ,(conj {} '[foo bar])

23:15 danlarkin: cemerick: this is kind of a "let's pretend they are" situation

23:15 clojurebot: {foo bar}

23:15 dnolen: there is no cons, only conj

23:15 trptcolin: ,(type (first {:a "b"}))

23:15 clojurebot: clojure.lang.MapEntry

23:15 cemerick: danlarkin: then, as dnolen demonstrated, entries

23:15 dnolen: conj : ?

23:16 jli: cemerick: what do you mean lists aren't made of conses?

23:16 scgilardi: and MapEntries print as two-element vectors and two-element vectors can be auto-converted to map entries as needed.

23:16 cemerick: jli: They aren't. They are in other lisps; not so in Clojure.

23:17 * gfredericks wants to know what clojure lists are made of

23:17 trptcolin: rainbows and unicorns!!!

23:17 sorry couldn't resist

23:17 gfredericks: is (cons 'foo []) a cons?

23:17 cemerick: a head object, and a tail list

23:17 danlarkin: yes, I suppose MapEntry fits in the question mark slot

23:17 dnolen: ,(type (cons 1 nil))

23:17 clojurebot: clojure.lang.PersistentList

23:18 dnolen: ,(type (cons 1 ())

23:18 clojurebot: #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: EOF while reading>

23:18 gfredericks: cemerick: I do not know the difference between that and a cons

23:18 dnolen: ,(type (cons 1 ()))

23:18 clojurebot: clojure.lang.Cons

23:18 * danlarkin looks up MapEntry.java

23:18 jli: cemerick: are you talking about what users should think about, vs. implementation details?

23:19 cemerick: jli: one shouldn't generally think about conses *or* lists. Think of collections and seqs.

23:19 The latter are abstractions. The former are impementations.

23:20 jli: cemerick: right, yeah. but I'm talking about implementation :)

23:20 or, interested in knowing about

23:20 ibdknox: cemerick: I hear you're visiting us in san fran soon?

23:20 cemerick: jli: well, lists aren't made of conses :-)

23:20 trptcolin: amalloy: i like the new 4clojure look. haven't visited in awhile; especially like the not-yet-solved-at-the-top view

23:21 cemerick: cons == clojure.lang.Cons

23:21 amalloy: trptcolin: yeah, that's new as of...monday?

23:21 jli: cemerick: gack, so what are they made of then?

23:21 cemerick: clojure.lang.PersistentList never uses it

23:21 danlarkin: and for everyone's edification, clojure.lang.MapEntry has two ivars, final Object _key and final Object _val.... makes perfect sense!

23:21 cemerick: jli: a head object, and a tail list

23:21 trptcolin: oh really? i seriously haven't been in months; picked a great time to come back!

23:22 cemerick: ibdknox: yeah, seancorfield recruited me (tbatchelli did earlier as well) :-)

23:22 Java One, talk there on Tuesday, then you guys on Thursday.

23:22 It'll be…interesting ;-)

23:23 Especially since the thursday talk's content isn't implemented completely, nevermind prepared fully.

23:23 ibdknox: cemerick: haha, well if you need anything, let me know. I'd be happy to help.

23:23 jli: cemerick: why's that functionally different from cons? because cons have 2 pointers to arbitrary things, and so aren't necessarily well-formed lists?

23:23 gfredericks: cemerick: so by 'conses' you were simply referring to the class by that name?

23:23 dnolen: anyone know what abedra's gonna talk about at the Script Bowl?

23:23 gfredericks: jli: PersistentList has two privates: _first and _rest

23:23 dnolen: ,(cons 1 (lazy-seq nil))

23:23 clojurebot: (1)

23:24 dnolen: ,(type (cons 1 (lazy-seq nil)))

23:24 clojurebot: clojure.lang.Cons

23:24 cemerick: gfredericks: well, yes; those are what `cons` return

23:24 dnolen: ,(type (cons 1 (list 2 3)))

23:24 clojurebot: clojure.lang.Cons

23:25 gfredericks: cemerick: I've always thought of "a cons" in the noun sense as an abstractish data structure consisting of a pair, which is most often an object and a list

23:25 cemerick: jli: IIRC, using conses directly made the lazy sequence abstraction less lazy.

23:25 dnolen: ,(type (conj 1 (list 2 3)))

23:25 clojurebot: #<ClassCastException java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IPersistentCollection>

23:25 cemerick: There's a wiki page about that somewhere, I think.

23:25 dnolen: ,(type (conj (list 2 3) 1))

23:25 clojurebot: clojure.lang.PersistentList

23:26 cemerick: ibdknox: Thanks. Things should go smoothly. We'll see how quickly I tame the ClojureScript… ;-)

23:26 dnolen: cemerick: ClojureScript is very tameable - initial thoughts?

23:26 cemerick: gfredericks: well, clojure conses are never any pair; the tail must be a seq.

23:27 Not being able to create a dotted pair is probably already a bridge too far if you're really married to the cons concept.

23:28 dnolen: gfredericks: tho if you want dotted pairs, there's always core.logic

23:29 jli: dnolen: I've done some little things with clojurescript - it's fun! I can pretend to be a web programmer now :)

23:29 ibdknox: web programming sucks ;)

23:30 jli: dnolen: but I feel like without really knowing javascript, I'm probably creating a ton of memory leaks. like with event handlers. I guess I should be removing them from the dom elements if I remove the dom elements?

23:31 dnolen: jli: leaks mostly problematic in ancient browsers like IE6

23:31 cemerick: dnolen: I don't see any blockers for what I'm doing, though I'm off the beaten track (if such a thing exists yet).

23:31 dnolen: jli: if you abstract over google events, you're probably ok

23:31 jli: dnolen: oh, so event handlers on removed dom elements get GC'd?

23:31 ibdknox: jli: most libraries prevent that from happening now

23:31 cemerick: It is a definitely bummer that cljs isn't available from a repo yet though; that is a pain.

23:32 jli: cemerick: what do you mean?

23:32 ibdknox: cemerick: I tried

23:32 cemerick: I may offer to fix that; I thought I saw an issue for that.

23:32 ibdknox: oh?

23:32 dnolen: cemerick: well … I wonder how serious rhickey is about no releases for CLJS

23:33 cemerick: dnolen: Is there a link for such a statement?

23:33 dnolen: #strangeloop

23:33 cemerick: ah

23:33 technomancy: having to set $CLOJURESCRIPT_HOME makes me cringe and think of hadoop a bit =\

23:33 cemerick: I will aim to disabuse him of that notion, then.

23:33 dnolen: I know's he's pissed about Clojure releases

23:33 ibdknox: cemerick: I couldn't ever figure out what was going on, but it never worked consistently. I even started tearing the compiler apart to figure out what was breaking. For some reason it would stop being able to compile and read core.cljs

23:33 cemerick: ./bootstrap.sh, the new autoconf

23:34 ibdknox: I haven't tried lately

23:34 maybe I'll give it another go

23:34 technomancy: cemerick: careful; autoconf is very nearly in "don't even joke about it" territory =)

23:34 cemerick: technomancy: in a good or bad way?

23:34 I assume the latter

23:34 dnolen: technomancy: you getting on the CLJS bandwagon now?!

23:35 cemerick: dnolen: the actual release process, or the community extracurriculars?

23:35 technomancy: dnolen: not sure, but probably at some point now that I work for a company that does web apps =)

23:35 dnolen: technomancy: figured!

23:36 cemerick: ibdknox: so you tried to bundle it up and use it 'headless'?

23:36 dnolen: cemerick: I think he's unhappy with people waiting around for official releases. He seemed more interested in the Google Closure model.

23:36 ibdknox: cemerick: https://github.com/ibdknox/noir-cljs

23:37 cemerick: essentially, yes

23:38 cemerick: dnolen: the "send out a tarball from svn" model, that is?

23:38 dnolen: cemerick: no - everyone just works off HEAD model.

23:39 cemerick: heh, yeah

23:39 technomancy: that's the slime model

23:39 dnolen: technomancy: but slime doesn't maintain a matrix of dependant libs right?

23:39 Google Closure does

23:39 technomancy: it actually worked out ok for them as long as everything that interacted with slime was in the repo

23:39 dnolen: you can veto commits

23:39 ibdknox: why not just do point releases all the time?

23:40 technomancy: dnolen: slime has the elisp client and swank servers for various CL implementations all in the same repo in lockstep

23:40 ibdknox: is there a way to specify latest in a maven dep?

23:40 dnolen: technomancy: but not Clojure :P grrr

23:40 cemerick: ibdknox: every commit => release to central? Clojure v1.4.833?

23:40 That might actually work.

23:40 technomancy: dnolen: yeah, but I'm not sure I would want that even if they changed their mind about not caring about clojure

23:41 dnolen: technomancy: why not?

23:41 technomancy: dnolen: I like stable releases

23:42 and I don't want to have to scramble to immediately support a change in swank-clojure just because they decided to make a change on the elisp side

23:42 dnolen: technomancy: I do too. But I think you're pretty good about staying up to date, being in charge of a essential build tool and all.

23:42 danlarkin: working from HEAD or whatever only gets yo so far

23:42 dnolen: most devs aren't

23:42 danlarkin: eventually you need to ship, and get backported bugfixes or whatever

23:42 dnolen: the tension is the psychology of … I won't upgrade till the next big point release.

23:42 danlarkin: and that can't happen with everybody-works-from-HEAD model

23:42 technomancy: dnolen: also most of the changes to slime head recently come with no actual upside

23:43 dnolen: technomancy: but that's really relevant. eventually some commit will come in that you want, and the gap is now a gulf.

23:44 not really relevant I mean.

23:44 technomancy: dnolen: true, though that's much more likely to happen in a project that's as young as clojurescript vs something as mature as slime

23:45 cemerick: I remember when there was hesitation about putting out a 1.0 to begin with.

23:45 dnolen: technomancy: "mature" but just cuz you're mature doesn't mean you can predict events like Clojure. It's sad we can't be brought in to the fold.

23:45 cemerick: I think it's hard to argue that things would be as they are today if drops from HEAD were the path taken.

23:46 cark: clojure and cl are very different beasts

23:46 technomancy: it would have to be a pretty badass feature to convince me to use CVS un-ironically

23:47 dnolen: I suppose be open to it, I'm just not inclined to spend the effort myself.

23:47 dnolen: technomancy: of course. (wow, I don't think I knew SLIME was still on CVS, WTF)

23:47 cemerick: ibdknox: so that cljs-compiler-jar artifact is something you published?

23:47 ibdknox: cemerick: yeah

23:48 trptcolin: i'm totally OH'ing technomancy

23:48 cemerick: Let us now all say about SLIME: WTF.

23:48 dnolen: cemerick: bridge too far man.

23:48 cemerick: lol

23:48 I have to let my emacs hate out of the cage every now and then ;-)

23:48 technomancy: dnolen: pretty sure it's the last thing I actually directly use that's still in CVS

23:48 now that I switched off screen to tmux

23:49 maybe bash?

23:50 cemerick: Though I was nearly convinced at strangeloop to give it another try sometime soon.

23:50 technomancy: relevant: http://memegenerator.net/instance/7741684

23:50 * technomancy pokes at his ears

23:50 technomancy: what

23:50 danlarkin: oooooh that's a good one

23:51 cemerick: yeah, that's classic

23:52 ibdknox: do you remember what the concrete error/failure was?

23:53 (oh please, let the cljs compiler not require a src dir)

23:54 dnolen: cemerick: you still need that stuff. resolving namespaces and all that. worth it IMO.

23:55 chouser: wow, the stars are all out on #clojure on a Friday night.

23:55 clojurebot: this is not IRC, this is #clojure. We aspire to better than that.

23:55 chouser: technomancy: congrats on the new gig

23:55 cemerick: dnolen: not for what I'm doing. But I need to shut up until I actually dig in properly.

23:56 chouser: And along comes Polaris! ;-)

23:56 technomancy: chouser: thanks!

23:56 ibdknox: haha

23:56 technomancy: new gig?

23:56 technomancy: ibdknox: starting at Heroku next week

23:57 ibdknox: cemerick: it stopped loading core.cljs, past that I don't remember. I'll try again tomorrow :)

23:57 sweet!

23:57 technomancy: my girlfriend works for salesforce :)

23:57 technomancy: ibdknox: cool. never worked for a >50 company before

23:57 sounds like heroku is pretty independent in practice though

23:58 ibdknox: that's my understanding as well

23:58 so hopefully it won't be too bad ;)

23:58 dnolen: technomancy: the future of Clojure deployment … at your fingertips.

Logging service provided by n01se.net