#clojure log - Dec 15 2011

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

0:11 wolfjb: clojure-contrib seems to be only at 1.2.0 while clojure is at 1.3.0, am I missing something?

0:11 * wolfjb is a n00b

0:12 TimMc: wolfjb: contrib is dead

0:12 clojurebot: What happened to contrib?

0:12 clojurebot: Titim gan éirí ort.

0:12 TimMc: clojurebot: What happened to clojure.contrib?

0:12 clojurebot: excusez-moi

0:12 TimMc: terrible bot

0:13 wolfjb: ah, so I don't need it then?

0:14 TimMc: wolfjb: Right, just pick up what you need as individual packages. http://dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Go

0:14 Unfortunately, not everything made the transition -- some were already not being maintained. That's part of the reason for the splitting, I think.

0:15 wolfjb: ok, thanks!

0:15 that explains a lot

0:16 alexbaranosky: does anyone know if the shortcircuiting threading operators made it into a new contrib library? -?> -?>> etc

0:17 cemerick: core.incubator

0:17 alexbaranosky: cemerick, thanks

0:18 wolfjb: well, shucks, contrib.except isn't maintained

0:18 :(

0:22 TimMc: What did you want from there?

0:22 wolfjb: throw-if

0:25 TimMc: wolfjb: Looks like a pretty small lib. I bet it could easily be maintained as 1.2 and 1.3 compatible.

0:26 wolfjb: I wouldn't know how to do it, but I'd be happy to help

0:26 I've done lisp in the past and this is my first foray into clojure

0:27 I wonder, though, if it would be superseded by Slingshot ?

0:30 hmm... nevermind, Slingshot seems to be try/catch on steroids or something cool like that

0:32 TimMc: slingshot?

0:32 clojurebot: slingshot is the successor to clojure.contrib.condition: https://github.com/scgilardi/slingshot

0:32 TimMc: OK, clojurebot, I guess you're not so terrible.

0:33 Raynes: I removed clojail from our copy and called eval in the client-side handler and now it's a glorified JS REPL. :-P

0:33 one that round-trips through a server for no reason

0:40 wolfjb: I keep getting a warning about *classpath* not declared dynamic, but when I add the "fix" to project.clj (ala ^:dynamic *classpath*) then lein compile throws an illegal argument exception No value supplied for key: *classpath*

0:40 why is that?

0:48 ok, nevermind again. lein upgrade seems to have fixed it

0:49 as well as adding an exclusion for org.clojure/clojure for swank-clojure

1:34 mindbender: why are the ritz devs do hard to reach?

1:34 *so

2:00 pyr: mindbender: you'll find them in pallet

2:01 #pallet i mean

2:01 but this is the wrong TZ

2:01 mindbender: pyr: thanks. what TZ will be appropriate

3:40 Blkt: good morning everyone

3:42 kral: 'morning

3:42 are clojure.contrib deprecated?

3:43 pyr: yes

3:43 it is now split in several support libraries

3:43 http://dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Go

3:44 kral: pyr: ty

3:44 pyr: this is only valid for clojure 1.3 and later releases

3:45 kral: sure

3:47 pyr: that and the integer changes make up for most of the work adapting stuff to clojure 1.3

3:52 kral: i'm going to start with 1.3 so is not a great issue for me, i think

3:57 pyr: if you're going from scratch, definitely go with 1.3

3:58 you'll find some issues in your dependency chain

3:58 but no showstoppers

4:12 kral: ty for assistance pyr

4:12 pyr: np

4:25 mindbender: in the book growing object oriented software, can CI servers do the work of end to end testing. And is the authors idea of a walking skeleton analogous to a hello world program?

4:27 clgv: mindbender: I don't know the book. But to me it's almost sure that a "hello world program" can't be analogous to "continous integration tests" or "testing in general".

4:28 to me "hello world program" means "here I show you a few basics of that programming language. you can compare it to the examples you know from other languages."

4:29 mindbender: clgv: the end-to-end testing as talked about in the book is about automating deployment. while the context of hello-world program is more like a POC where you show mysql works with clojure and swing

4:30 the book is a very interesting read maybe you should google it up to have an idea

4:30 clgv: mindbender: if any allegedly advanced concept is analogous to a "hello world program" it's certainly not advanced and not of much use ;)

4:31 * clgv hits google with it

4:31 mindbender: I was hoping clojure could provide us with a similar model of building software

4:32 clgv: mindbender: there is support for testing which surely can be done automatically and integrated within hudson or similar CI-software. I dont know if the latter integration already has a good clojure wrapper

4:33 mindbender: yes there is support but not one well documented like this one in terms of pulling the pieces together

4:34 clgv: there some different libraries for testing with clojure. the built-in one is clojure.test

4:35 there is also "midje" and "lazytest" - you should be able to find usage examples on their github pages or via google

4:36 I did test with clojure.test since that was described in one of the books I read on clojure

4:42 mindbender: clgv: look at this question: http://stackoverflow.com/questions/3127194/proper-continuous-integration-and-continuous-deployment-with-git-and-heroku. These are the kind of things I'm intersted in knowing about and more. If you read this book you will also get the idea of the walking skeleton for which I will like to see examples of skeletal frameworks we can take advantage of and customize rather than having to reinvent the wheel

4:44 clgv: mindbender: in general you can use every java library there is to avoid reinventing the wheel in clojure. in some cases you might benefit from building a clojure layer in front of the lib for better clojure-like syntax.

4:44 so you can extend your search to java libs and frameworks

4:45 mindbender: clgv: what about frameworks

4:46 clgv: java ones I meant. Hudson (or its new fork name) is a solution for CI

4:46 for example.

4:49 pyr: mindbender: FYI a mix of jenkins + midje + pallet does the trick for end-to-end automation

4:50 mindbender: pyr: that's a head-start towards where I want to be... checking it out

4:51 clgv: pyr: ah right. pallet for deployment?

6:09 pyr: clgv: yes

6:09 clgv: deployment and C&C

8:05 jheander: good morning!

8:06 what's the current take on automatic re-testing on clojure today?

8:06 is lazytest alive/active?

8:07 G0SUB: jheander: I don't think so.

8:08 jheander: clojure.test, test.generative & midje are the good options at the moment.

8:09 jheander: is there any way to set up automatic re-testing of changed files with clojure.test? I like the very simple structure of clojure.test, but would like to reduce the cycle times

8:37 kephale: amalloy_: two functions that could be useful in ordered.set: set (replace a member with a new member at the same position) and index (what is the index of this member)

8:54 pyr: hi #clojure

8:55 if i want to build a jar with multiple classes that have a -main

8:55 how do I go about it

8:55 clgv: ,(println "hi pyr")

8:55 clojurebot: hi pyr

8:55 pyr: now that's a warm welcome

8:56 clgv: java -jar Your.jar ClassOne

8:56 that should work afaik

8:56 pyr: it doesn't seem to

8:56 i use my namespace path as the class

8:56 maybe i should explicitly name the class

8:56 (I get NoClassDefFound exceptions)

8:57 kotarak: java -cp your.jar ClassOne maybe?

8:57 pyr: i tried this

8:58 ok, i have to specify :aot

8:58 clgv: kotarak: ah right. my error.

8:58 kotarak: pyr: you actually AOT-compiled your namespace

8:59 pyr: i works with :aot set to my namespaces

9:40 AWizzArd: I would like to serve static content with moustache. Is there a more idiomatic way to do this then (app ["html" "file.html"] my-handler) (defn my-handler [req] (ring.util.response/resource-response "/web/html/file.html")) ?

9:40 then --> than

9:44 kotarak: AWizzArd: you can use any ring handler, now? (app ["html"] ring/static-content-handler-I-forgot-then-name-of)

9:45 s/now/no/

10:08 gtrak`: wasn't there a clojure library that did more than just the libvirt java bindings?

10:09 ah, I found it, vmfest

10:38 TimMc: &(reify Object (getClass [_] Long))

10:38 lazybot: java.lang.IllegalArgumentException: Can't define method not in interfaces: getClass

10:38 TimMc: Not the best error message...

10:38 The problem is actually that getClass is final.

10:40 I so don't feel like filing a Jirum for this.

10:41 mefesto: is there a way to have hiccup output html using indentation?

10:42 hiccup pprint just for readability of output while developing

10:43 ordnungswidrig: Class of (defn foo!) and (defn foo_BANG_) is identical. Does this lead to any problems?

10:46 TimMc: ordnungswidrig: It isn't double-underscore for the second?

10:46 ordnungswidrig: TimMc: it'd tought it was but it's foo_BANG_

10:47 not to bad but a wonder

10:48 TimMc: &(apply = (map munge ["!" "_BANG_"]))

10:48 lazybot: ⇒ true

10:48 TimMc: ew

10:50 &(apply = (map munge ["-" "_"]))

10:50 lazybot: ⇒ true

10:51 TimMc: I guess it's too late to change that.

10:53 ordnungswidrig: TimMc: yes, I think it is.

10:53 I just wondered if they will be problems because of that, e.g. when AOTing

10:58 TimMc: I'm having trouble figuring out a place it would matter.

10:58 &(map munge ["A+B" "A_PLUS_B"])

10:58 lazybot: ⇒ ("A_PLUS_B" "A_PLUS_B")

10:58 TimMc: there we go

11:03 I guess as long as you aren't in the habit of using UPPER_CASE var names you're good.

11:04 fn names, specifically

11:08 jcromartie: h

11:08 hi

11:08 what's the state of the art with Clojure FizzBuzz? :)

11:08 I'm in the mood

11:09 gtrak`: jcromartie, try counting with lambdas

11:10 http://en.wikipedia.org/wiki/Church_encoding

11:12 jcromartie: gtrak`: Church numerals are bad for code golf

11:12 TimMc: clojure.core/fizzbuzz

11:12 It used to be in contrib.

11:14 jcromartie: http://web.archive.org/web/20090602074545/http://www.cliff.biffle.org/esoterica/hq9plus.html

11:15 jcromartie: hah, hilarious

11:16 AWizzArd: ~seen cgrand

11:16 clojurebot: cgrand was last seen joining #clojure, 32992 minutes ago

11:16 TimMc: jcromartie: And of course, the object-oriented version: http://www.dangermouse.net/esoteric/hq9plusplus.html (which is the first one I learned about)

11:16 AWizzArd: ~(/ 32992 60 24.0)

11:16 clojurebot: eg, https://github.com/clojure/tools.logging is the new version of clojure.contrib.logging

11:21 TimMc: ,(/ 32992 60 24.0)

11:21 clojurebot: 22.91111111111111

11:26 jcromartie: (defn fb[ns](doseq[w(map(fn[n](keep(fn[[d x]](when(zero?(mod n d))x)){1 n 2"fizz"3"buzz"}))ns)](apply println w)))

11:26 that's my best golfing so far

11:28 TimMc: argh, don't remove spaces

11:28 jcromartie: TimMc: I thought that was the whole point

11:31 I mean if we're talking fizz buzz code golf here

11:37 TimMc: I prefer to count forms.

11:37 #(+ 1 2) is 4 forms

11:37 (or is it 5?)

11:39 Borkdude: does anyone know if this is possible in emacs? http://superuser.com/questions/368341/emacs-two-frames-for-one-file-seemless-scrolling

11:40 TimMc: Split screen with yoked scrolling>

11:40 interesting question

11:40 cemerick: Is it true that package.el is included in Emacs 24?

11:40 (but was not in 23, that is?)

11:40 Borkdude: oh fuck, I just meant "buffers" instead of "frames"

11:41 TimMc: Borkdude: Actually, you mean windows.

11:41 1 file, 1 buffer, 2 windows.

11:41 Borkdude: ah yes, hm.

11:42 raek: cemerick: yes

11:42 cemerick: thanks

11:42 jcromartie: Borkdude: there's follow mode

11:43 answered :)


11:43 Borkdude: jcromartie: great :)

11:44 cemerick: I'm surprised there's not emacs stack exchange site.

11:45 Borkdude: jcromartie: will do

11:45 cemerick: me as well

11:45 jcromartie: can only accept after so many minutes

12:22 devn: cemerick: yes it's true, but IIRC the package.el that is included doesn't support multiple package sources

12:22 so if you want marmalade I think you'll need a fresher version

12:24 raek: really?

12:25 cemerick: I *think* I was able to use marmalade without a problem?

12:25 raek: I know that the version from ELPA did not have multiple repo support

12:26 hiredman: cemerick: it seems like you are much more likely to get a reliable answer about emacs questions from #emacs

12:58 bartek1: hello, is there a function f that to this: (f [2] [2 3]) -> [2 3 3] ?

12:59 sorry

12:59 -> [2 2 3]

13:01 Bronsa: ,(apply conj [2] [2 3])

13:01 clojurebot: [2 2 3]

13:01 raek: ,(into [2] [2 3])

13:01 clojurebot: [2 2 3]

13:01 bartek1: thanks :)

13:01 Bronsa: thanks clojurebot

13:01 TimMc: into *might* be faster

13:02 I don't know if conj with multiple additions uses transients.

13:06 compmstr: Does anyone know why (apply + (map * a b)) is roughly 5x slower than doing the same thing with loop/recur?

13:06 technomancy_: laziness overhead prolly?

13:06 compmstr: I tried putting lazyness into the loop version, ran just a little slower

13:06 raek: allocations for the cons cells?

13:08 hiredman: compmstr: the loop version also most likely inlines * and +

13:08 technomancy_: oh, of course

13:08 HOFing + is going to kill perf

13:09 compmstr: what does HOFing mean?

13:09 hiredman: (reduce #(+ % %2) (map #(* % %2) a b)) may also be faster

13:09 technomancy_: higher-order-functioning

13:09 compmstr: ah

13:11 hiredman: if you pretend clojure is a lisp2 for certain functions you get better performance

13:12 compmstr: hmm, still roughly 5x slower with reduce/map using the lambdas

13:12 hiredman: compmstr: most likely the allocation overhead then

13:12 compmstr: It may well be the allocation of the list from map though, since the loop version just uses an accumulator

13:12 thanks

13:15 Scriptor: morning

13:17 duck1123: does anyone know what it will take to get clout to match paths like "/keywords/:name.:format" again? The new version broke a lot of my old code

13:19 hiredman: duck1123: https://github.com/weavejester/clout/commit/affbad08765a7debe4f034ba4e20e2185fd89637

13:23 amalloy: on 1.3, isn't the difference that loop/recur can work entirely with primitives? when you use map/reduce you have to box them and unbox every time you want to do math

13:24 (technomancy_, hiredman, compmstr)

13:24 duck1123: hiredman: I'm not sure I follow, are you suggesting I undo that commit?

13:25 compmstr: amalloy: I'm not sure, does nth do boxing? That's what I use to access the elements of the seq

13:26 hiredman: compmstr: generally function calls all box

13:27 and numbers in collections are also always boxed (there are some vectors that can hold primitives)

13:28 dnolen: compmstr: numbers are always boxed as they are passed into functions, unless the function takes primitives, or you have already coerced the arguments to primitives for the inlineable fns (like +)

13:28 compmstr: inlining is not possible (yet) w/ higher order usage.

13:28 compmstr: ah, ok

13:29 dnolen: (+ 1 2), is inlineable and arg are primitive in Clojure 1.3

13:29 clojurebot: *suffusion of yellow*

13:29 hiredman: if you have a (+ a b) and the compiler can tell that a and b are both longs, it well replace it with an ladd

13:29 (jvm long add instruction)

13:29 dnolen: (map + [1 2]), 1 and 2 are boxed in the collection, + is not inlineable

13:30 hiredman: which is much faster than the normal function call path

13:30 compmstr: That makes a lot of sense now, thanks

13:30 dnolen: compmstr: so as far as why loop/recur is so much faster than map, it's not that map is slow, and I think the JVM can even optimize those allocations well. it's that w/ loop recur JVM can just magically inline everything.

13:30 hiredman: Var.getRawRoot + IFn.invoke + Numbers.add + ladd

13:31 dnolen: the clojure compiler can magically inline everything (which does wonders for the jvm too)

13:32 dnolen: compmstr: it's illustrative to compare the same type of operations in Scala - the numbers for higher order ops on collections are pretty similar.

13:32 hiredman: Clojure inlines, the JVM inlines.

13:32 hiredman: sure

13:32 dnolen: hiredman: yes

13:32 I meant to agree

13:32 hiredman: alright

13:32 :)

13:34 dnolen: can't they leverage the type system to help them do stream fusion like haskell?

13:35 dnolen: hiredman: I suppose they could, but I haven't seen anything like that yet.

13:35 hiredman: maybe I just have optimizations like stream fusions just tired too much to static typing in my mind

13:56 technomancy: http://p.hagelb.org/github-userid-percentile.html

13:59 tsdh: Hi. Can anyone explain why my function errors with "nth not supported"? Code & error at http://pastebin.com/7NSji1rn

13:59 Line 38 is actually the line with the (defn ...

14:00 hiredman: nth not supported on this type: TreeImpl

14:00 you are calling nth on an instance of TreeImpl somewhere, and TreeImpl doesn't have the right interfaces/methods to support nth

14:02 tsdh: hiredman: Yeah, but its a varargs list, so I'd expect the arg after & to be a list where the destructuring form [t] takes the first element of the list. See my second call where it actually does exactly that, but it works only the first time.

14:03 hiredman: tsdh: recur doesn't do destructuring

14:03 well, I should say, recur doesn't do varargs

14:03 amalloy: right. the third arg is a seq

14:04 hiredman: if x is bound to a list, when you recur and rebind x you should pass an x

14:04 er a list

14:04 mrevil: I'm exposing a clojure API via REST, and I'm trying to do some input validation, how do I check if something is of type String, or is enumerable?

14:05 hiredman: (doc string?)

14:05 amalloy: (this is not actually true, but:) the compiler transforms (snoc a b c d) into (snoc a b [c d]). it doesn't do that when recurring, because you're supposed to know how many args you're passing

14:05 clojurebot: "([x]); Return true if x is a String"

14:05 tsdh: hiredman, amalloy: Indeed. Changing to (recur ... [nt]) does the trick...

14:06 amalloy: using & [x] for an optional arg defaulting to nil is kinda gross anyway. i mean, it's convenient, but it's evil

14:07 tsdh: amalloy: Yeah, but my function is actually a macro expansion, and the macro would become pretty hard if I supported many the complete defn interface with overloading...

14:09 amalloy: (a) i don't really buy that, (b) it's already apparently hard enough that you had to ask in #clojure and wrap multiple things in vectors for no "obvious" reason

14:09 but of course (c) you can write whatever code you want without worrying about my opinion

14:11 TimMc: technomancy: percentile... as in, what percent of the github employees have had accounts longer than the given ID has?

14:11 technomancy: TimMc: right-o

14:12 the great thing about your github id percentile score is that even though it starts at 100 it can only go down over time.

14:14 tsdh: amalloy: (a) Maybe I'm missing something, but don't I need to get my macro args as "name & args" and then test each and every component in args for its type to determine if an optional docstring is given and so forth? (b) the macro is pretty easy, it's just that the expansion looked correct to me, (c) I appreciate your opinions.

14:16 amalloy: tsdh: i can't answer (a) without knowing what your macro actually is. but you might be interested in tools.macro/name-with-attributes to parse out the docstring &c

14:17 technomancy: whaaaaa? surely it can go up if they fire someone who joined after you

14:17 tsdh: amalloy: I'll check that, thanks.

14:17 technomancy: amalloy: oh, derp. yes.

14:18 amalloy: technomancy: time to make that a heroku app, btw

14:18 technomancy: amalloy: awesome; let me know how it goes

14:18 noir?

14:18 clojurebot: noir is great

14:18 technomancy: clojurebot: that's just your opinion bro

14:18 clojurebot: bartj: it's not broken. Unless you know the performance hit there is actually a problem, I'd recommend leaving it alone.

14:18 technomancy: wise words.

14:20 amalloy: technomancy: heroku just...sent me an activation link in an email, except it's not actually an http link? i have to copy/paste this to my browser, really?

14:20 cemerick: Raynes: What is the canonical clojail repo? Raynes/clojail points to the one under cogniitivedissonance, but flatland/clojail has the latest commits…

14:20 amalloy: cemerick: flatland

14:20 technomancy: amalloy: not our fault your MUA sucks. =)

14:20 amalloy: technomancy: no! the other links in the email are real links!

14:21 technomancy: oh; we send out HTML email by default? =(

14:21 amalloy: yes

14:21 technomancy: dang it

14:21 amalloy: and all but that one link are wrapped in <a>

14:21 my MUA does suck though

14:21 in your defense

14:22 technomancy: if you forward me the email I'll raise it on the DX team

14:22 noncom: hello, friends! a newb question follows: i want to use eclipse counterclockwise to code with clojure. however the ccw eclipse plugin is still about clojure 1.2. it is known to me that much has changed in version 1.3. so do i lose much if i use the ccw plugin and clojure 1.2 with it?

14:22 pjstadig: (percentile "pjstadig") ; => 49

14:22 technomancy: we have a few guys who are paid to obsess about that kind of stuff

14:22 pjstadig: is that good or bad?

14:23 technomancy: pjstadig: neither?

14:23 it's median

14:23 pjstadig: i'm average?

14:23 on average people think they're above average

14:24 cemerick: amalloy: thanks; might want to start dropping repos or something ;-) /cc Raynes

14:25 technomancy: cemerick: but that won't help Clojure win on the github languages high-score board

14:25 cemerick: amalloy: I actually use & [x] all the time :-P

14:25 amalloy: cemerick: so do i. like i said it's easy, but it's evil :P

14:25 cemerick: technomancy: you're right, I'm optimizing for the wrong things again

14:25 noncom: guys, am i losing much if i program with clojure 1.2 instead of 1.3?

14:27 amalloy: noncom: seancorfield sheds a single tear every time someone uses 1.2. but your tear will be a drop in the bucket, so...

14:27 pjstadig: noncom: if you need much of what is in 1.3, then yes. if not, then no

14:28 technomancy: noncom: only if you want insane speed out of numeric ops

14:29 TimMc: noncom: If you don't have a compelling reason to use 1.2, go with 1.3 -- especially if you are writing something other people might want to use.

14:30 dnolen: noncom: I would not program in 1.2 unless there's some library that hasn't been ported that you need.

14:31 duck1123: even if you're going 1.2, still stay away from monolithic contrib

14:32 noncom: yeah, i have made a little research and going with 1.2 seemed like evil after that. to bad that the clojure plugin for my favorite ide is not updated (((

14:33 you confirm what it seemed.

14:35 dnolen: noncom: it seems like ccw might work w/ 1.3 from the notes on the project page - have you tried it?

14:36 cemerick: ccw works with any version Clojure project, 1.1 - 1.4.0-SNAPSHOT.

14:37 I think it still defaults projects to 1.2, but there's no reason to stay with that default if you care otherwise.

14:37 ccw itself is implemented using Clojure 1.2, but that doesn't affect what version of Clojure *you* can use.

14:38 noncom: ^^

14:39 noncom: wow, i have not tried putting 1.3 inside, the directions are too vague and i am too incompetent to dig in eclipse internals

14:41 cemerick: eclipse internals?

14:41 noncom: how did you create your project?

14:41 Raynes: cemerick: What are you using clojail for?

14:41 cemerick: Raynes: Nothing, just wanted the link correct for the book.

14:42 Raynes: Okay, why are you linking to it from your book then? :P

14:42 noncom: cemerick: i use the File->New->Other->Clojure->Clojure Project wizard.

14:42 TimMc: Raynes: Every book should link to Clojail.

14:43 cemerick: Raynes: A footnote talking about how network REPLs have not authentication or authorization controls.

14:43 s/not/no

14:44 Raynes: cemerick: Hot.

14:44 cemerick: noncom: OK, so ccw added Clojure 1.2 jars to your project's build path.

14:45 You just need to get Clojure 1.3, and replace the 1.2 references with ones to the 1.3 jar.

14:46 Raynes: Whoa.

14:46 I think it just set in that clojail is going to be linked in a book.

14:46 noncom: cemerick: wow, i did not think of that because of them telling about problems with nREPL whatever it is

14:46 TimMc: Raynes: Don't move that repo!

14:46 Raynes: Never.

14:46 cemerick: noncom: What problems with nREPL?

14:49 noncom: cemerick: facepalm to me, i admit i was not very descreet

14:50 cemerick: no worries — give things a roll upgrading to Clojure 1.3, and if there are any problems, either ping me here, or send a msg to the ccw ML.

14:50 noncom: i have just checked the installed software section and it says nREPL 0.0.5

14:50 cemerick: Yup, that's ok. :-)

14:54 Raynes: even worse are old repos linked in search engines

14:54 :-P

14:54 ddg points to Raynes/clojail

14:54 FWIW

14:54 Raynes: cemerick: I just need to add links.

14:54 The cogdis repo can go, I think.

14:55 cemerick: I'd add a final commit that rm's everything but a single link in a README.

14:55 makes it hard to miss, i.e. https://github.com/cemerick/nREPL

14:57 tsdh: amalloy: You were right. It wasn't that hard to teach my macro working with overloaded argument lists. ;-)

14:58 noncom: cemerick: thank you and other people for helping! i guess it is that stereotype, that i am coming from the oop world, that weights on me, paralyzing in fear when standing in front of anything that mentions 'functional', rendering me faint and helpless. and many other programmers too. however, i feel functional programming as something very attractive and incresingly significant in today and in future. thank good people for sharing!

15:00 cemerick: noncom: I take it you're 1.3-ready now. :-)

15:00 Spread the good word. ;-)

15:06 amalloy: hooray for heroku: http://electric-sunrise-7335.herokuapp.com/technomancy

15:06 technomancy: amalloy: oh man... I was literally going to do that right after lunch.

15:07 hilarious

15:07 amalloy: <technomancy> amalloy: awesome; let me know how it goes

15:07 <amalloy, secretly> ;; challenge accepted, bro

15:11 raek: what does it measure?

15:11 amalloy: raek: http://p.hagelb.org/github-userid-percentile.html - it was my first heroku app so i just got up something barebones

15:12 cemerick: great, more metrics for me to suck at

15:12 amalloy: cemerick: i bet you're in better shape than i am

15:13 TimMc: 76 for me

15:14 raek: so it's like a (non-linear) mesure of how early you joined github?

15:14 TimMc: raek: what percent of github employees have an account older than yours

15:14 amalloy: TimMc: i've got an embarrassing 87%

15:15 raek: fwiw, just updated the app with a description

15:15 raek: 81% for me...

15:16 amalloy: c'mon, there's gotta be someone newer than me

15:17 technomancy: amalloy: needs some styling and a splash page; collab me and I'll see about adding that after noms.

15:17 amalloy: technomancy: yeah, i hate webdev. https://github.com/amalloy/github-percentile is all yours if you want it to be pretty

15:18 if you want collab rights of some kind on heroku, i don't know what that means

15:19 technomancy: $ heroku sharing:add phil.hagelberg@heroku.com

15:19 but I can just go through pull requests

15:20 that's like the one common thing I haven't added to lein-heroku yet

15:21 tmciver: 92. Ha! Beat that!

15:21 Raynes: amalloy: org/members will probably only return members up to 30.

15:21 noncom: cemerick: yeah, i will!))) tomorrow i guess, it is too late here. i will see sweet dreams about clojure and other lisps! and prolog.

15:22 haha)

15:22 Raynes: I haven't added lazy seqifying yet.

15:23 technomancy: Raynes: actually gives me 55, which I think is right

15:24 mindbender: It's just so problematic getting swank-clojure or ritz to work with emacs.. now I'm getting the famous (cl-assertion-failed (keywordp module)).. I can't remember how I resolved it the last time. Can someone please tell me how to get rid of all slime on my emacs and start a clean slate

15:24 or better how to control this multitudinal versions of slime

15:31 sorry here is a backtrace https://gist.github.com/1482742

15:33 cemerick: mindbender: AFAIK, you're mostly hosed if you're trying to run multiple revs of SLIME and/or maintain SLIME for CL and Clojure simultaneously.

15:34 mindbender: cemerick: yes I think that's my problem actually at times you need to work with a different version of slime for different projects and in the end they conflict

15:34 technomancy: cemerick: is correct.

15:35 mindbender: I am still at odds how to control this many slime

15:35 technomancy: it's possible to do if you only use M-x clojure-jack-in for clojure and don't load the CL-compatible version into an instance until you need it, but clojure and CL in the same emacs process isn't going to work.

15:36 amalloy: (edit: i learned how to pick less-crappy domain names for heroku, so if anyone wants to play with the github-percentile stuff it's now at http://github-percentile.herokuapp.com/YOURGITHUBUSERNAME)

15:59 technomancy: cools

15:59 semperos: I've written a custom appender for log4j in Clojure (based on http://corfield.org/blog/post.cfm/clojure-and-log4j), let's say in a file appender.clj

16:00 I have a Swing GUI, whose code lives in a file gui.clj

16:00 I want my appender to append logs to a JTextArea, but I'm having trouble figuring out how to "set" my target JTextArea in my appender, so it's .append method prints to the component

16:01 any thoughts?

16:05 thorwil: hi! i need a list of booleans, one for each item in ks, on whether it matches one in feeds. what i have now seems kinda complicated: (map #(-> (some #{%} feeds) nil? not) ks)

16:08 TimMc: Raynes: o you know if there is an existing utility for lazy-seqifying chunked lists?

16:08 Raynes: TimMc: No idea.

16:08 semperos: nm, was just complicated my namespace dependencies...

16:08 TimMc: Raynes: If not, that would be a nice utility to extract from your GitHub API seqifier.

16:08 ok

16:10 amalloy: TimMc: i know alex baranosky's fork of useful has that

16:10 i don't remember if i added it to useful as well

16:11 TimMc: https://github.com/flatland/useful/blob/develop/src/useful/seq.clj#L176

16:16 _ulises: what's the correct way of doing thread-local bindings? I've tried both with binding and with-redefs (http://pastebin.com/TWTk9Yr9) but no joy. I'm using clojure 1.3.

16:16 Bronsa: _ulises: you have to define it first

16:17 (def ^:dynamic *self*)

16:17 _ulises: Bronsa: yes, sorry, *self* was defined exactly like that

16:17 forgot to include it

16:19 Bronsa: http://pastebin.com/WFVUqY54 same thing (*self* was declared with ^{:dynamic true} before)

16:19 raek: _ulises: btw, with-redefs is not thread-local

16:19 _ulises: oh

16:20 raek: 'binding' introduces a thread-local mutable variant of a var.

16:20 in your case you start another thread, so it will not see that binding

16:20 _ulises: indeed

16:21 so I'm wondering how I can make that thread see the binding

16:21 perhaps I just don't understand anything at all

16:21 and should just become a shoemaker or something

16:21 raek: what do you want to use this for?

16:21 _ulises: (not that shoemaking is any easier)

16:22 I'm writing a small actors lib. to get acquainted with agents

16:22 and I'd like to spawn actors and have their name bound to *self*

16:22 raek: alright, similarly to *agent* in clojure?

16:23 _ulises: eep

16:23 is *agent* bound to the current agent?

16:23 raek: yup

16:23 _ulises: current = the one running

16:23 well, that does it for me then

16:24 raek: in case you wanted to implement something like that yourself, you could just move the binding call to within the thread body

16:24 _ulises: yes, but in the real case I want to define actors by providing a fun and nothing else

16:24 so I don't want to expose that

16:24 raek: (.start (Thread. #(binding [*self* ...] ...code here...)))

16:25 the var can be both :dynamic and :private

16:25 _ulises: alternatively I could define the interface to the fun to be something like [name ...] and have the fun return the handler (another fun) and then just use a (let...)

16:25 :private?

16:26 TimMc: amalloy_: I don't know if that's quite what's needed.

16:26 raek: a var marked as private will not be pulled into another person's namespace when that person uses 'use'

16:27 _ulises: oh, cool

16:27 raek: and you will get an error if you try to access it from outside the namespace it was defined in

16:27 _ulises: ah, that's very good, thanks!

16:27 raek: (it can be circumvented, however)

16:27 Bronsa: @#'trick

16:28 raek: (defn- foo ...) = (defn ^{:private true} foo ...) = (defn ^:private foo ...)

16:28 _ulises: nice

16:28 I think I'll stop trying to bind *self* because it's just not working

16:28 :(

16:29 raek: (defn spawn [f] (let [pid (make-new-pid)] (.start (Thread. #(binding [*self* pid] (f))))))

16:29 _ulises: you should be able to do something like that

16:30 _ulises: hum, does make sense

16:30 want to see the rest of the code? I think I'm messing up in the way I init the agents

16:30 raek: _ulises: oh, also revaluate all the code that uses *self* after making it dynamic

16:30 _ulises: what do you mean "revaluate"? recompile?

16:30 raek: yes

16:30 _ulises: ah, yes, always do that

16:31 just to be sure

16:31 aaah

16:31 right, I know where I'm messing up

16:31 (I think)

16:31 raek: what was it?

16:32 _ulises: one sec. making a small example

16:33 no, that wasn't it :/

16:34 no idea what's going on now

16:34 :D

16:34 raek: what does the code look like?

16:34 _ulises: let me paste it

16:36 raek: http://pastebin.com/QTYzMr1C

16:36 I can walk you through it if it's too messy :/

16:36 ignore the macros handle and handle-named, I'm not using them

16:37 raek: are you sure *actors* should be dynamic?

16:37 _ulises: no, that one shouldn't

16:37 my bad

16:38 raek: it doesn't make much sense to have a thread-local value for the atom of the map of all actors

16:39 _ulises: indeed not

16:39 Borkdude: what mode in emacs to show long sentences with an arrow on the side continuing on the next line?

16:41 raek: _ulises: in spawn, why do you send to the agent and then wait for it? couldn't you just initialize the agent with the desired value instead of nil?

16:41 _ulises: I could I suppose

16:41 technomancy: does C-c C-d C-p work from slime for anyone else?

16:42 raek: hrm, maybe you do want the "initial function" to be run inside the agent

16:43 _ulises: ideally initting an actor should take that long?

16:43 technomancy: what is that supposed to do? it just asked me "Package:" in the minibuffer

16:43 raek: _ulises: actors and agents are not exactly the same thing. an agent is more like an atom, but where the state is updated with the function later on some other thread

16:43 technomancy: _ulises: if you give it a namespace, does it give an error?

16:43 _ulises: raek: yes, I'm just using agents as a way of spawning threads, etc.

16:44 raek: _ulises: then you can just use 'future' or 'future-call'

16:44 _ulises: technomancy: yup, plenty errors

16:44 technomancy: _ulises: ok, same here

16:44 raek: if you don't need the managed state and the function queue

16:44 y3di: anyone know what the C irc channel is?

16:44 _ulises: technomancy: mind you, perhaps my setup is not like yours?

16:45 raek: hum, not sure how that would work? with futures I mean

16:45 technomancy: _ulises: if you use M-x clojure-jack-in then there's not much variation between individual user setups these days.

16:45 though somehow cemerick was able to get it to work

16:45 _ulises: technomancy: but I don't, I'm still with clojure-mode and slime-connect

16:45 technomancy: _ulises: oh, interesting. good to know.

16:45 clojurebot: excusez-moi

16:45 technomancy: apparently cemerick's Emacs prowess is formidable.

16:45 _ulises: raek: as in, with futures, once you've calculated the value, it's cached?

16:46 raek: _ulises: to be more precise: all 'future' does is to spawn a thread and run som code in it. it sounded like that was all you needed from agents

16:46 cemerick: technomancy: what are we talking about?

16:46 TimMc: Borkdude: That's what my Emacs does already.

16:46 Raynes: cemerick: He just said your prowess is formidable. Don't look into it.

16:46 _ulises: raek: yes, but I want to have the option of re-running the computation on a new message

16:46 technomancy: cemerick: I can't get the slime-apropos-package command working; I had assumed it was only implemented in the CL swank server, but apparently you got it working. =)

16:46 _ulises: raek: so, the pong actor should react to :ping messages forever

16:46 Borkdude: TimMc: normally my emacs does that as well, but now the line just runs from the screen

16:46 raek: _ulises: yes, you can wait for the return value to be computed by using deref. once it is done, deref will always return the same thing

16:47 _ulises: raek: yeah, so a future might not be what I want, since messages may contain payloads and the response of the actor may depend on the payload

16:47 cemerick: Raynes: Part of my persona is that I suck at emacs though.

16:47 raek: _ulises: 'future' does not give you a message queue and a loop, which I think you need

16:47 TimMc: Borkdude: Check your modes, anything weird?

16:47 _ulises: raek: indeed

16:47 TimMc: <- not actually an Emacs expert

16:48 raek: _ulises: but with actors you send data, not functions, so agents might not be a perfect fit after all

16:49 _ulises: raek: indeed, again, this is just an excuse to use agents and do something with them

16:49 technomancy: cemerick: you wouldn't happen to remember which versions of everything you were using when you got it working, would you?

16:49 _ulises: raek: right now the handler in an agent handles the message and returns itself

16:49 raek: so the state of the agent is the handler itself

16:50 raek: so instead of making a tail recursive call to "the next handler", you return it

16:50 technomancy: cemerick: never mind; I see that it works in Emacs 23 but not 24.

16:50 _ulises: raek: indeed

16:50 raek: that's what receive does

16:50 cemerick: technomancy: oh, you're referring to the stuff in the chapter?

16:50 technomancy: cemerick: right

16:51 cemerick: 90% of the Emacs content there is from Brian. :-P

16:51 technomancy: aha

16:51 cemerick: don't worry about it; I'll explain everything in my email

16:51 cemerick: yes, good :-)

16:52 so it's expected that that doesn't work?

16:53 in v24, that is?

16:53 technomancy: FSVO expected

16:53 as of five minutes ago, it is now a known bug. =)

16:56 _ulises: raek: any more thoughts? is it insane what I'm doing?

16:56 cemerick: technomancy: will it be fixed within 6 weeks? :-P

16:57 raek: _ulises: no, I think it makes sense :-)

16:57 technomancy: cemerick: with any luck it'll be fixed before the release of Emacs 24

16:57 drewr: with clojurescript, are you supposed to be able to pass args to *main-cli-fn*?

16:57 _ulises: raek: ah, cool, thanks :)

16:57 drewr: all I get is nil

16:57 technomancy: but probably worth omitting it from the book to be on the safe side

16:57 _ulises: I'll see if I can just carry on with *agent* and not worry about *self*

16:57 raek: I think it would be good to hide the fact that agents are used in the implementation

16:58 _ulises: those where my thoughts

16:58 but I just cannot make the whole binding *self* thing to work

16:58 :/

16:58 cemerick: technomancy: exactly why I was asking :-)

16:59 Interesting, conjure has 187 (!) watchers.

16:59 I had no idea it had so much interest.

17:00 brehaut: thats the rails like right?

17:00 raek: _ulises: you need to call binding in every funtion you send to an agent

17:00 cemerick: brehaut: yeah, you mentioned it in your 'brief overview'

17:00 _ulises: ugh

17:01 brehaut: cemerick: hah i did too

17:01 raek: _ulises: the effects of 'binding' happens completely at runtime and only applies to the expression within the (binding [] ...) form

17:01 _ulises: hum, ok, so I'll have to hide that in the receive fn or something along those lines

17:02 and somehow pass the name during spawn

17:02 brehaut: cemerick: http://news.ycombinator.com/item?id=822366 lol

17:02 _ulises: ideally, I should be able to bind *self* to the actual agent instead of to the name of the actor

17:02 but oh well

17:03 raek: so if you want to run some function f in agent a with *self* bound to pid, you need to do (let [a ..., f ..., pid ...] (send a (fn [state] (binding [*self* pid] (f state)))))

17:03 cemerick: brehaut: omg the metaprogramming

17:04 fryguy: alright, i'm going to ask a silly question. I'm going to do some stuff with clojure, and I'm a vim user. Am I missing out on a lot by just using slimv and related plugins as opposed to slime/emacs?

17:04 _ulises: raek: yes, so the binding has to come inside the receive fn which creates the actor's handler

17:04 cemerick: what's that site that tracks usage of various clojure libraries?

17:05 brehaut: clojuresphere?

17:05 http://news.ycombinator.com/item?id=822366

17:05 samnit

17:05 http://clojuresphere.herokuapp.com/

17:05 TimMc: fryguy: Does that setup give you structural editing of s-expressions?

17:06 fryguy: TimMc: i'm not sure. I'm still doing some reading and researching before I dive in.

17:06 cemerick: brehaut: thanks

17:06 I'm going to /quit, return with a new nick, and ask all the noob questions I've had on my mind. :-P

17:06 brehaut: lol

17:07 cemerick: OK, so conjure has 2 usages according to clojuresphere. That lines up more with my expectations.

17:07 Raynes: clojuresphere is weird.

17:08 brehaut: cemerick: my educated (?) guess at why its got so many watchers is that its pretty old (2009?) and is a rails-like which is many peoples default for 'i want web programming'

17:08 Raynes: I don't like it anymore. I wanted to make it use tentacles instead of clj-github, but it uses some strange v2-only API call that doesn't exist in the v3 API.

17:08 cemerick: I usually stalls out on me after a couple of queries.

17:08 _ulises: raek: I reverted the change you suggested to spawn, I remember now why I had it; turns out that if I init the agent straight to (apply f args) then the ping actor tries to send a ping to the pong agent and that is not done in the context of an agent, so *agent* is nil

17:08 (that'd be my explanation)

17:08 Raynes: I don't like websites that don't use the latest versions of my libraries and such.

17:09 cemerick: brehaut: last commit was this past september *shrug*

17:09 brehaut: cemerick: sorry, i didnt mean its out of date, just that its existed for a long while

17:09 cemerick: ah, right

17:10 Raynes: You are a fickle beast.

17:10 :-D

17:10 Raynes: :>

17:10 brehaut: cemerick: even some of my crappy projects on github have watchers, i think just because they have existed for a long time ;)

17:10 Raynes: brehaut: Stop looking at amalloy_'s repository list.

17:10 brehaut: ?

17:11 Raynes: ^

17:11 Raynes: Failed attempt at humor, I think. I thought you said "even some of the crappy" instead of "my crappy", which would have made my comment more amusing than it actually was.

17:11 brehaut: aha

17:12 cemerick: red bull can make you deaf‽

17:12 cemerick: That shit'll mess you up.

17:12 brehaut: yeah i was aware of that at least

17:12 i thought it was just heart trouble

17:12 'just'

17:13 TimMc: fryguy: Emacs' paredit-mode allows you to do things like turn (let [x 5] (when a x)) into (when a (let [x 5] x)) in a single command -- that's an extreme example of structural editing.

17:14 cemerick: brehaut: it's damn effective if you're planning on not sleeping tho.

17:14 brehaut: cemerick: lol. a big pot of chemex coffee is my sleep deprevation aid of choice

17:14 cemerick: chemex?

17:15 I gag @ coffee.

17:15 brehaut: its a pour over filter cofffee pot

17:15 Raynes: I've been drinking sugar free redbull and monster much more often than I'd like.

17:15 TimMc: I go with 87% dark chocolate.

17:15 fryguy: TimMc: i'm not so sure i'm concerned about pure code editing. It's more the other niceties that I feel like I might be missing out on. I guess I'm in a situation where I should just try the vim stuff and see if I like it.

17:15 TimMc: and Daft Punk

17:15 technomancy: brehaut: in Indonesia Red Bull has nicotine in it

17:15 brehaut: technomancy: fark

17:15 fryguy: also, what? red bull can make you deaf? source?

17:16 i drink a lot of redbull

17:16 Raynes: Surely he was kidding.

17:16 technomancy: mmm... chemex

17:16 * brehaut <3 chemex

17:16 TimMc: fryguy: If you're way more familiar with vim, go for it.

17:16 technomancy: fryguy: whatever you do don't let screwing with your editor get in the way of learning clojure

17:17 Raynes: What he said.

17:17 technomancy: if you want to experiment once you're comfy with the basics that's fine

17:17 Borkdude: ah: "toggle-truncate-lines" is what I wanted

17:17 _ulises: raek: I don't think the binding to *self* will work unless the agent has as state a closure over its name

17:17 fryguy: TimMc: i'm WAY more familiar with vim than emacs. technomancy, i'm agree with what you say. I was more curious as to whether SLIME was *that* much better than alternatives that it is worth considering

17:17 TimMc: fryguy: Yeah, technomancy has a good point -- learn one thing at a time. :-/

17:17 Raynes: fryguy: I am an avid Emacs user, but I did an editor experiment recently. I spent 2 weeks with Vim exclusively. Things went just fine. I like Emacs more, but if you're already familiar with Vim, there is no reason to not use it unless you just want to learn Emacs.

17:18 brehaut: technomancy: i got to try some panama geisha coffee through a chemex at my local café recently. it was amazing

17:18 cemerick: fryguy: what, I'm not authoritative enough for you? ;-) https://twitter.com/#!/cemerick/statuses/147438804800782336

17:18 TimMc: I still don't use SLIME.

17:18 fryguy: Raynes: perfect. that's just the answer I was looking for

17:18 technomancy: fryguy: I'd actually rate paredit as equal or superior to slime in terms of productivity boost.

17:18 Raynes: I repeat, as an avid Emacs user, I am also fond of Vim after using it for a while, though I like it less than Emacs (because I'm Raynes).

17:18 There is also a paredit for Vim. The keybindings are pretty convoluted, but it is usable (and of course, customizable).

17:18 technomancy: especially when measured by win:setup-pain ratio

17:19 fryguy: if anything makes you switch to Emacs, it should be vimscript, not Clojure. =)

17:19 fryguy: paredit and structural editing stuff sounds really nice, but I think my overall existing speed with vim, plus surround.vim, plus finding suitable plugins to do things _like_ paredit means I'm more interested in "the other things", like connecting to a running session, debugging, etc.

17:20 Borkdude: Emacs vs Vi learning curve: http://bc.tech.coop/blog/060302.html

17:20 Raynes: fryguy: Like I said, there is a paredit for Vim as well.

17:20 fryguy: Raynes: right

17:20 Raynes: Not as complete as the Emacs version, I wouldn't think, but usable and helpful.

17:20 raek: _ulises: sure, you can either store it in the state or in the closure of the actual function that is applied inside the agent (which, if I understand you correctly, you build with receive)

17:21 _ulises: raek: indeed. I also thought that perhaps the agent should have a state something like {:name name :handler fn}

17:21 technomancy: brehaut: the places around here that have chemex are great because the baristas can tell when you're interested and go on and on about the process, the specific characteristics of the bean, etc.

17:21 brehaut: technomancy: thats excellent :)

17:21 technomancy: id love to work at my local roastery/café but sadly they have no public Wifi

17:22 _ulises: raek: but right now if the handler does something like (! actor msg *agent*) and the handler is along the lines of (receive {:foo (fn[sender] (! sender :gotcha))}) then it's all good

17:22 technomancy: brehaut: no 3G?

17:22 oh, kiwi telcos are awful with their caps and such, right?

17:22 brehaut: technomancy: in new zealand? i'd be selling my kidneys before the week was out

17:22 technomancy: ouch =(

17:23 brehaut: yup :(

17:23 technomancy: i can get 50megs a month for $6 bucks, and/or pay through the nose

17:23 what in the hell kind of cap is 50 megs?

17:24 i might as well train up a saint bernard to operate a usb disk and send all my packets as batch jobs

17:24 technomancy: that's actually interesting since nobody in the US is interested in taking your money unless it's USD30+/mo

17:24 jodaro: the "no porn on your phone" cap

17:24 technomancy: I wonder how many IRC channels you could follow on 50 MB/mo

17:24 TimMc: Pfft, not this one. :-P

17:24 _ulises: and I thought that 3G in the UK was bad. Right now I have 15GB for £15 (approx. 20-22 USD)

17:25 jodaro: TimMc: beat me to it

17:25 technomancy: Raynes: how big is lazybot's log for the last month uncompressed?

17:25 Raynes: technomancy: For what channel?

17:25 technomancy: I was thinking this one

17:26 brehaut: theres just not enough competition in NZ for cellphones to not be insane

17:26 accel: is there a clojure smtp server?

17:26 I want to roll my own email server that does some weird things

17:26 for handling spam

17:26 jodaro: the java mail stuff might have that

17:26 accel: in particular; implementign somethign like hashcash in clojure

17:27 Raynes: technomancy: http://www.raynes.me/logs/irc.freenode.net/clojure/ Break out the calculator.

17:27 technomancy: Raynes: cool; thanks

17:27 Raynes: I'd actually tell you, but I suck at bash.

17:28 technomancy: dude

17:28 brehaut: baha the entire history (minus a couple of bot outages) of #burningwheel is 5.4 meg

17:28 technomancy: rectangle-kill

17:28 jodaro: A: No, the JavaMail API package does not include any mail servers.

17:28 or not

17:28 technomancy: 1.7 MB

17:28 I imagine the overhead of IRC might add a bit to that, but the ballpark number is good

17:28 jodaro: accel: http://code.google.com/p/subethasmtp/

17:29 technomancy: anyway, I'd pay $6/mo for 3G on my phone if it could co-exist with a prepaid voice plan.

17:29 even at 50MB

17:29 brehaut: technomancy: whats a prepaid voice plan?

17:29 hiredman: my log #clojure is 139mb

17:29 my of #clojure

17:29 damn it

17:30 technomancy: brehaut: I dump USD100 onto my SIM; each call is billed at $0.05/min, and then six months later I top it off again.

17:30 brehaut: technomancy: wow. $0.05/min? how much are SMS?

17:30 technomancy: same, I think

17:30 TimMc: Better write them quickly, then. :-P

17:30 wastrel: http://24.media.tumblr.com/tumblr_lw5xr6GefR1qb15g0o1_500.jpg

17:30 technomancy: hehe

17:31 brehaut: can't tell; is that high or low for you?

17:31 brehaut: technomancy: exceedingly low

17:32 technomancy: i think my calls are either $1.00 or $1.50 a minute

17:32 technomancy: holy smokes

17:32 brehaut: technomancy: SMS is 20c a pop

17:32 TimMc: technomancy: What carrier do you use?

17:32 technomancy: before that I was using SIP on my 3G data plan, which was $0.015

17:32 TimMc: t-mobile

17:33 it may be 10c for out going and 5c for incoming, but I don't really make any outgoing calls.

17:33 apart from voip anyway

17:34 Vinzent: has somebody used clojure with oracle?

17:34 TimMc: Almost certainly.

17:35 Vinzent: i mean, as a scripting language, for writing stored procedures

17:36 Raynes: ~anybody

17:36 clojurebot: No entiendo

17:36 Raynes: Oh my God.

17:36 technomancy: weavejester: it appears "I was thinking about factoring a lot of $X out into a small library" is your catchphrase.

17:36 ~anyone

17:36 clojurebot: Just a heads up, you're more likely to get some help if you ask the question you really want the answer to, instead of "does anyone ..."

17:36 Raynes: That's the one thing that I use with clojurebot.

17:36 Oh.

17:36 Duh.

17:36 technomancy: heh

17:36 weavejester: weavejester: Hahaha

17:36 Uh

17:36 technomancy: Hahaha

17:36 Now I'm laughing at myself for some reason

17:36 Raynes: weavejester: Talking to yourself again?

17:37 weavejester: Raynes: Apparently so!

17:37 technomancy: "Oh man... I think I need to factor this out into a separate library." / "Sounds like a job for ... weavejester!"

17:37 just need a costume and/or theme song. =)

17:37 jodaro: or medication

17:37 technomancy: hahahah

17:37 weavejester: did you end up using lein-sub for ring?

17:38 weavejester: My only problem now is that "ring-server" sounds like "ring-serve"... I think I need to rename "ring-serve"

17:38 technomancy: Yep

17:38 technomancy: weavejester: how's that working out for you?

17:38 weavejester: technomancy: Testing is easier, but I don't think it handles interdependent submodules very well when pushing.

17:39 technomancy: weavejester: pushing to clojars?

17:39 weavejester: technomancy: Yeah. It seems to read all the project files first, and then execute the subtasks

17:39 So if foo.A depends on foo.B

17:39 Then even if you specify the submodules as [foo.B foo.A]

17:39 It fails to push, because it tries to resolve both project.clj files before pushing.

17:40 technomancy: tries to resolve them remotely?

17:40 maybe a round of install across the board before pushing, or would that have the same effect?

17:40 weavejester: Yeah, so... ring-servlet depends on ring-core for example.

17:40 Vinzent: I know, but I don't have "a question". I just winder if someone has any experience in making such thing work and can point me to a relevant article or just say is that ok or not

17:41 weavejester: So I update all the versions to 1.0.0, but no matter how I arrange it, it doesn't seem to work.

17:41 ring-servlet complains that ring-core 1.0.0 doesn't exist, even if ring-core 1.0.0 is scheduled to be pushed first.

17:41 technomancy: tricky

17:42 seems like you'd almost want to perform the install task immediately after reading projects

17:43 weavejester: Yeah... it seems from the source code that it does do that...

17:44 But maybe the laziness of map and reduce are playing tricks here.

17:44 Since reduce has an slightly unintuitive evaluation order

17:45 technomancy: ah, yeah could be a bug

17:45 easy bug to overlook since getting it right once means that you won't notice future breakage

17:46 weavejester: Let me double-check that I didn't just do something wrong

17:46 Well... I'll do it later. No hurry.

17:46 Raynes: Oh man.

17:46 clojure.template is awesome.

17:47 weavejester: Anyone have any good suggestions for the name of a library designed to start Ring servers in a REPL like SLIME?

17:47 clojure.template?

17:47 clojurebot: clojurebot is not a benchmarking platform

17:47 Raynes: http://clojure.github.com/clojure/clojure.template-api.html

17:48 weavejester: Oh, I see

17:48 technomancy: ring-toss

17:48 weavejester: Huh...

17:48 That's a good suggestion :)

17:48 Raynes: wedding-ring

17:49 weavejester: I like ring-toss. It's kinda like throwing up a quick ring server

17:49 Although I don't know what I'd call the function that runs the server :)

17:49 Raynes: toss

17:49 weavejester: Currently (serve handler)

17:50 Raynes: (toss handler)

17:50 weavejester: Well, I'm British, so I'd rather avoid the term "toss" :)

17:51 Raynes: Makes sense.

17:51 TimMc: heh

17:51 Raynes: You guys say crap like "He was a right tosser!"

17:51 weavejester: Yeah

17:51 technomancy: hah; nice

17:52 weavejester: I actually like the (serve blah) syntax...

17:52 But ring.util.server seems the best name for, well, running a Ring server.

17:52 samaaron: Raynes: mind your language ;-)

17:52 weavejester: Maybe (run blah) ...

17:52 ring-run...

17:53 Raynes: (not -derogatory

17:53 (not-derogatory-toss blah)

17:53 weavejester: Haha

17:53 samaaron: ring-toss just sounds wrong on soooo many levels

17:54 TimMc: How many levels?

17:54 weavejester: I think I might go with ring-run

17:54 technomancy: ring-hurl? no wait...

17:54 weavejester: (hurl bad-sushi)

17:54 TimMc: This reminds me of the condition system naming stuff.

17:54 weavejester: Who was it who said...

17:54 Raynes: samaaron: Go play with overtone.

17:54 weavejester: "There are only 2 hard problems in computer science: cache expiration and naming things"

17:55 samaaron: Raynes: I have been. I'm about to go to bed now

17:55 weavejester: that's not quite right

17:55 "There are only 2 hard problems in computer science: cache expiration, naming things and off-by-one errors"

17:56 weavejester: samaaron: I was quoting... someone... I think :)

17:56 samaaron: hehehe

17:56 quoting someone off the internet hey?

17:56 technomancy: two hard problems: naming thiconcurrencyngs and

17:56 samaaron: hahahaha

17:57 weavejester: Oh

17:57 http://martinfowler.com/bliki/TwoHardThings.html

17:57 Looks like the off-by-one is an official extension :)

17:58 I still haven't figured out what to call my defmigration library I'm going to base on ragtime...

17:58 samaaron: night night

17:58 weavejester: I guess I should write the ragtime leiningen plugin first

17:58 night

18:08 cemerick: weavejester: Is there an official way to produce a clojure.xml stuffs from hiccup stuffs?

18:08 If not, would you be interested in a patch containing one?

18:08 weavejester: cemerick: I have a branch for it... let me try and find it...

18:09 https://github.com/weavejester/hiccup/tree/refactor

18:09 But it's not finished.

18:09 cemerick: I wrote one in anger earlier this week because I wanted to mess about with hiccup in an app that uses enlive everywhere else.

18:09 clojurebot: hiccup is both https://github.com/weavejester/hiccup and http://tinyurl.com/426og7n

18:10 weavejester: cemerick: could I take a look at your code?

18:12 I've been thinking about combining enlive and hiccup

18:12 cemerick: weavejester: https://gist.github.com/2a64e0067c960ea86354

18:12 I've not cared enough about the problems to bother fixing them yet.

18:13 weavejester: I have a version here that should work: https://github.com/weavejester/hiccup/blob/refactor/src/hiccup/compiler.clj

18:13 That compiles Hiccup code directly into clojure.xml

18:13 cemerick: Yeah, I was looking

18:13 weavejester: I haven't started on the renderer that will convert that into a string

18:14 I was thinking of releasing the current Hiccup as Hiccup 1.0.0, and then using the refactor as 2.0.0

18:14 cemerick: That seems very sane.

18:14 weavejester: Not sure if 2.0 will be as fast as 1.0, but it should be more modular

18:14 cemerick: Have you ever benchmarked hiccup vs. enlive?

18:14 weavejester: And you could plug in rendering engines that create indented HTML

18:15 cemerick: Real men use XSLT to pretty-print XML and HTML. :-P

18:15 TimMc: By the way, I forked enlive to add a switch for outputting HTML-style self-closing tags like <link>.

18:15 weavejester: cemerick: I think I did a while ago. It really depends on how optimized the Hiccup code is. Hiccup can be very fast, because it compiles.

18:16 So (html [:p {} x]) => (str "<p>" x "</p>")

18:16 TimMc: https://github.com/timmc/enlive Gonna see if cgrand will take a pull request. :-)

18:17 cemerick: Now that I properly appreciate hiccup, what I really want is to be able to provide hiccup-style bits as input to e.g. enlive/content and such. That should be pretty easy.

18:18 TimMc: Are those tags still self-closing in html5?

18:18 TimMc: Yeah.

18:18 weavejester: Well, the current Hiccup engine is geared up around creating strings, and it's a bit of a mess. Not very clear code.

18:18 TimMc: and the W3C validator gets angry at Enlive's default output.

18:18 weavejester: The refactor is a lot cleaner, but currently only renders to clojure.xml format.

18:19 cemerick: I recall Christophe saying that the big win for him in optimizing for enlive 1.0 was to never produce strings at all. I presume that's what you're aiming for with this new compilation?

18:20 or, to never produce new strings, I should say

18:21 hrm, yup, seems like it

18:23 weavejester: amazingly, that little function I gisted is working well enough in the corner of my app that's using hiccup. Looking at your new compiler, I presume it's going to break any second now?

18:24 weavejester: cemerick: No idea... it's been a while since I looked at it. It might be that my refactor was 95% clean-up.

18:24 brehaut: weavejester, cemerick: i think it would be fantastic if enlive and hiccup were better friends. doesnt seem like they need to be mutually exclusive

18:24 weavejester: cemerick: The current Hiccup code I'm not happy with...

18:25 brehaut: My theory was that I could use enlive to insert components into pages

18:26 Like... Say you had a library that handled authentication and logins

18:26 You could have some middleware that used enlive to insert a login box into your page.

18:27 brehaut: weavejester: i agree

18:27 weavejester: I kinda think that there isn't enough vertical separation in web-apps

18:28 cemerick: weavejester: That makes a lot of sense to me.

18:28 guns: lang

18:28 weavejester: MVC is kinda separating out horizontal layers

18:28 guns: oops

18:28 weavejester: But you can only go so far with that approach

18:28 cemerick: Enlive seems to be at its best in defining the broad structure of pages, and hiccup seems at its best populating them.

18:28 weavejester: If your web app size doubles, you can't add more layers

18:29 cemerick: Yeah

18:29 cemerick: or, producing the content to populate them

18:29 brehaut: weavejester: another middleware i would liek to get around to implementing is something akin to typogrify for django

18:29 cemerick: selectors are badass

18:29 weavejester: I figure that Hiccup+Enlive is a good idea because originally I thought it was a terrible idea :)

18:29 brehaut: lol

18:29 weavejester: I thought the same about Ring until I tried it.

18:29 Funny as that sounds now.

18:30 cemerick: same here

18:30 I've been down on hiccup for, oh, years. Now I'm absolutely convinced a union is ideal.

18:31 weavejester: It's on my todo list, but that's kinda long :)

18:31 If anyone else wants to take a look at the refactor branch, it should be a lot clearer than the master branch of Hiccupe

18:32 brehaut: weavejester: how far away do you think 1.0.0 of compojure is? im going to update my ring post for ring 1 and clj 1.3, and id like to cover compojure 1.0 at the same time

18:33 weavejester: brehaut: If no-one reports any issues, I'm going to turn 1.0.0-RC1 into 1.0.0 this weekend. Maybe tomorrow night.

18:33 brehaut: weavejester: excellent :) i guess i better get editing

18:35 cemerick: brehaut: ping me with that url when you're done :-)

18:35 brehaut: weavejester: one other question; i havent looked at compojure in a while, but does it have reversable urls ?

18:35 cemerick: ok :)

18:37 weavejester: brehaut: Could you clarify what you mean?

18:37 Like, if you have "/foo/:id" and {:id 10}, can you turn it into "/foo/10"

18:37 Or are you saying can a handler tell which function is called by which route?

18:39 jkkramer: weavejester: is that hiccup refactoring faster, or just cleaner code?

18:39 brehaut: weavejester: in django you can 'reverse' a url route; ie provide the name of the route, and the components to fill in the gaps and it gives you back a url

18:40 weavejester: yeah, like that example

18:40 weavejester: jkkramer: Cleaner, and it compiles clojure.xml before strings

18:40 jkkramer: weavejester: btw, after having recently tried to grok the hiccup source, it does look much cleaner and easier to understand

18:41 weavejester: brehaut: No, but I've been meaning to add it. Noir has something like it, but its just a search-and-replace. I think I can make something a bit more robust...

18:42 I haven't hugely thought about it, though.

18:42 brehaut: weavejester: ah sure. i know moustache doesnt have it (and i expect it would be pretty challenging to add)

18:42 but i do miss it from django

18:42 weavejester: You'd have to name the route, though

18:42 jkkramer: weavejester: somewhat related, I discovered recently that hiccup was a significant bottleneck when generating a page with ~400KB of HTML. I replaced it with my own hack that does more aggressive macro-time string combination, trading off flexibility. it ended up being like 10x faster

18:43 weavejester: So... (def foo "/foo/:id") (GET foo [id] ...)

18:43 brehaut: weavejester: i wonder if its actually suitable for meta data

18:43 weavejester: jkkramer: Did you try optimizing the hiccup code for speed?

18:44 jkkramer: For instance, [:em {} x] is faster than [:em x], because in the latter case it doesn't know if x is a map or not.

18:44 jkkramer: weavejester: a little. i reached a point where i was replacing hiccup structures with literal strings and wrote my hack

18:45 weavejester: jkkramer: In theory, removing the ambiguity from Hiccup structures should be the same as literal strings.

18:45 jkkramer: Did you use defhtml as well?

18:45 jkkramer: weavejester: i'll play with it some and see if i can come up with simple test cases to demonstrate the issues

18:45 weavejester: jkkramer: Okay

18:46 amalloy: weavejester: oh, does defhtml expose some kind of metadata about what kind of thing it returns?

18:46 jkkramer: weavejester: no, just (html) and (html5)

18:46 weavejester: amalloy: No, it's just a string.

18:47 amalloy: It's like (defn ~name ~args (html (do ~@body)))

18:47 jkkramer: if that's the case, i don't think it would help my situation much

18:48 weavejester: jkkramer: So all your functions returned strings?

18:48 amalloy: fair enough. seemed like since you were talking about removing ambiguity, you might expose a special-defn that lets hiccup know what kind of thing is returned, thus removing embiguity

18:49 jkkramer: weavejester: insofar as (html …) was able to return strings -- loops and such notwithstanding. my hack tries hard to turn things into literal strings, rather than runtime-generated ones

18:49 weavejester: amalloy: That might be possible, but isn't implemented.

18:50 jkkramer: Hiccup tries to convert things into literal strings when it can

18:50 jkkramer: So (html [:p "foo"]) is the same as "<p>foo</p>"

18:50 jkkramer: And (html [:p {} x]) is the same as (str "<p>" x "</p>")

18:50 amalloy: yeah, i remember being really impressed when i saw that in the source

18:51 weavejester: The source isn't that nice, though. Hence the refactor.

18:51 jkkramer: weavejester: i was having issues getting that to work fully. maybe it's due to me leaving out the attr maps

18:51 amalloy: i've been at lunch, didn't know a refactor was coming

18:51 weavejester: amalloy: Well, eventually. When I get around to it :)

18:53 jkkramer: If the attr maps are left out, then: (html [:p x]) becomes (if (map? x) (str "<p " (render-attrs x) "></p>") (str "<p>" x "</p>"))

18:53 jkkramer: weavejester: k. i will experiment. thanks for the pointer

18:54 amalloy: it seems pretty unlikely that the map? test is any kind of bottleneck at all though, compared to the rest of what's going on

18:55 and it's not like the uncertainty bubbles up: the result of (html [:p x]) is known to be a string

19:01 technomancy: amalloy: quick once-over of github-percentile before I deploy?

19:02 * technomancy is mildly embarrassed by how long it took him to figure out that the ring params map uses string keys instead of keywords

19:02 Raynes: TimMc: Who is it that is so gungho about getting rid of hiccup in trycljs?

19:03 amalloy: sure, one sec while i pull, technomancy

19:03 Raynes: TimMc: "all that hiccup is going to give me hiccups". What could possible the benefit of using enlive to replace such a small hiccup code base? Feeling smug about having rewritten a portion of a project?

19:03 :p

19:04 amalloy: technomancy: a lot of exceptions about lacking favicon.ico, but otherwise looks great

19:04 technomancy: amalloy: oh good call

19:04 amalloy: actually, let me turn the "longer than X has" into a link to their github profile

19:05 technomancy: of course

19:05 Raynes: amalloy: I'll get 4clojure prepared to deploy to heroku when I update it to 1.3 and move it to noir.

19:05 Which I should start soon.

19:05 Like possibly tonight soon.

19:07 TimMc: Oh, it was you.

19:07 TimMc: So yeah, I'd definitely like to hear the rationale for that that isn't "it's giving me hiccups".

19:07 Enlive is giving me hives.

19:10 Turtl3boi: semperos?

19:10 semperos can you show me how to get started with making GUIs in Clojure

19:15 weavejester: technomancy: wrap-keyword-params turns those strings into keywords

19:15 technomancy: weavejester: oh good call

19:16 weavejester: technomancy: By default, url-encoded parameter names can include any character, so can't be keywords by default

19:16 technomancy: ah, makes sense

19:19 now with 50% more shine: http://github-percentile.herokuapp.com/

19:26 weavejester: (html (doctype :html5) ...) is the same as (html5 ...)

19:27 technomancy: weavejester: ah cool; I was just cribbing from abedra's sample app

19:28 weavejester: There are a few tricks, like [:div {:id "results"} ...] is the same as [:div#results ...]

19:28 brehaut: my github %ile is lame

19:28 weavejester: Mine is 52% apparently

19:28 I'm almost average :)

19:28 brehaut: 70%

19:29 extremely tardy

19:29 weavejester: [:h1 {:class "content"} ] is [:h1.content]

19:29 technomancy: weavejester: do classes and ids compose?

19:30 weavejester: Oh, and (compojure.handler/site your-handler) adds a bunch of useful middleware like wrap-params

19:30 technomancy: Yes, but I believe the id has to come first

19:30 So [:div#foo.bar]

19:30 brehaut: weavejester: thats something to ensure round trips with enlive

19:30 weavejester: No reason for that other than the regex was written that way

19:31 brehaut: Oh right

19:31 brehaut: i imagine it'll be piece of cake, i think the selector syntax is the same as the element shorthand, but it'd be a bit stink if it wasnt

19:31 technomancy: weavejester: good stuff

19:32 mabes: is their a macro like defnk that will assert required keys in option maps? (to prevent against typos, etc..) Just looking for prior art in-case I don't have to write my own...

19:43 gfredericks: mabes: wouldn't required keys normally get changed into proper arguments?

19:44 mabes: gfredericks: I prefer named arguments for functions with more than 3 arguments

19:45 gfredericks: having a lot of arguments may be a code smell itself I suppose

19:49 gfredericks: in any case I've never heard of such a thing. It sounds like it could be rather complex in the most general case. Maybe all I mean by that is nesting.

19:50 it just occured to me that in the cases where you're passing in a literal map, you could use the macro to check at compile-time...

19:50 that would bring the disadvantage of all your functions being macros though, which is of course terrible

19:51 clojurebot: which is of course terrible

19:51 clojurebot: Ik begrijp

20:12 TimMc: Raynes: I like my HTML to be HTML, and my code to be code. Also, something about complecting.

20:12 So there.

20:13 Raynes: TimMc: I guess. If you really want to rewrite trivial Hiccup, be my guest.

20:16 cemerick: TimMc: You're not wrong — except when you need HTML to be data, in which case clojure.xml is a cumbersome notation at best.

20:24 brehaut: i dont think weve seen some of the really cool things you can do with enlive really get talked about

20:24 yet

20:26 cemerick: I think that's true for about 114 different Clojure libraries / abstractions / etc.

20:26 brehaut: hah definately :)

20:26 i think enlive has one big clear win though: stop emphasising deftemplate to new users

20:26 id rather add a ring middleware that calls emit*

20:37 scgilardi: ~botsnack

20:37 clojurebot: Thanks! Can I have chocolate next time

20:40 sritchie_: Raynes, here's a lein-newnew template for noir: https://github.com/sritchie/noir-template

20:41 I'm going to pass it over to ibdknox so he can work his wonders

20:43 hiredman: ~ping

20:43 clojurebot: PONG!

20:49 Raynes: sritchie_: https://github.com/Raynes/lein-noir

20:50 sritchie_: cool, this one is meant to become a pinot-oriented template

20:50 Raynes: We planned on releasing it along with the next noir version.

20:51 sritchie_: this one should probably exclusively target pinot, then

21:02 Raynes: Did prxml get moved somewhere?

21:03 amalloy: Raynes: got moved to "don't use it; use data.xml; oh wait that will never be released"

21:03 brehaut: amalloy: is data.xml that dire?

21:03 Raynes: amalloy: That's unfortunate, since we need it or something like it for 4clojure. Any ideas?

21:04 amalloy: brehaut: no, it's totally working except for whitespace formatting, and has been for months

21:04 Raynes: chouser: Release that. Now.

21:05 amalloy: but hudson won't release it with a test failure; chouser and i can't repro the failure locally; and reasonably enough chouser doesn't want to remove valid tests

21:05 brehaut: oh :(

21:07 amalloy: and fliebel asked on clj-dev about helping with data.xml. i was like, "maybe we need some namespace help?" and there was a flurry of messages about how data.xml needs to be the be-all/end-all of xml processes, supporting 100% high-fidelity round-tripping to xml-text including the N different ways you can specify namespaces

21:08 Raynes: amalloy: So we can like, use it? I mean, I'll release it myself if we can use it.

21:09 amalloy: Raynes: a number of people have already done that. i think ninjudd has a release

21:09 http://clojars.org/org.clojars.ninjudd/data.xml

21:09 Raynes: Works for me.

21:09 amalloy: Fork it, rename it, release it, make it your own. ;)

21:10 amalloy: that's not a bad idea

21:10 Raynes: It really isn't.

21:11 Without prxml and people being nuts about data.xml, there isn't really an xml generation story for Clojure right now.

21:11 amalloy: thread is at http://groups.google.com/group/clojure-dev/browse_thread/thread/dff8e406b7502a0b/0997aaf57a2d4c75?show_docid=0997aaf57a2d4c75 btw, if anyone wants to read up on the history

21:14 Raynes: "I just want to clarify a non-technical point: I have no particular

21:14 interest in being the owner (whatever that means) of data.xml." -- chouser

21:14 That newline there was unintentional.

21:15 amalloy: Raynes: i'm not going to take ownership of the project, which i assume is your implied suggestion. i don't understand 2/3 of the code in that file

21:16 Raynes: Wasn't implying that, no.

21:17 cemerick: amalloy: to be fair, all the issues and hidden corners are legit. I remember the same misery happening when lxml in python-land was being beaten around.

21:18 A metric ton of tools depend upon particular serializations of a given XML model; there's no way to get it half-right.

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

21:19 Raynes: \_/ <-- empty care cup. /me just needs a little trivial xml. ;)

21:20 amalloy: cemerick: only if you're actually targeting those tools. i'm more interested in producing xhtml that renders in browsers and works in pom.xml files, and i suspect most data.xml users are too

21:20 cemerick: heh

21:21 amalloy: which is why the storm of "data.xml needs to do X in order to be useful" comments don't really interest me at all

21:21 cemerick: well, trivial xml is trivial to generate; maybe Raynes/trivial-xml is needed.

21:21 Raynes: The day I write a low level XML generation library is the day I start wearing a tie and using Netbeans.

21:22 cemerick: amalloy: That's fair, but I wouldn't expect the contrib process to produce partial solutions.

21:23 If it did habitually, then its usefulness is significantly diminished IMO.

21:23 Raynes: I'm pleasantly surprised when the contrib process produces anything at all.

21:25 cemerick: Raynes: waitaminute, no one should be more cynical than me.

21:28 brehaut: i copied prxml from core into necessary evil and put my own hacks into it to make it do what was needed for xmlrpc :P

21:28 Raynes is cynical beyond his years

21:30 cemerick: s'ok, I'm optimistic shy of my years, so we balance each other out.

21:31 hrm, that rhetorical inversion didn't quite work

21:32 Raynes: cemerick: Is your lein dependency tree thingy available anywhere?

21:33 cemerick: [com.cemerick/pomegranate "0.0.2"]

21:33 Raynes: Oh.

21:33 cemerick: A plugin isn't possible because of arcane conflicts between aether and lein 1.x maven-ant-tasks

21:33 thus, 2.0-only

21:34 hrm, actually, it may be possible

21:34 though I don't know that I'd bother

21:34 Raynes: Man. Why does every maven command I ever use result in 10 thousand plugins being downloaded?

21:35 ls

21:35 Note to self: IRC is not a terminal.

21:35 brehaut: Raynes: its the maven way

21:39 amalloy: Raynes: each plugin has four interfaces and one line of code

21:39 Raynes: I figured as much.

21:39 brehaut: and of course, each plugin uses a different xml applicaiton, and thus needs subtly different parser

21:40 Raynes: And data.xml is not high-fidelity enough to be appropriate.

21:40 amalloy: brb guys, gotta slit my wrists

21:40 Raynes: Take your time.

21:43 brehaut: amalloy: vertical works better than horizontal

21:44 amalloy: brehaut: not if i'm just doing it for attention

21:44 brehaut: amalloy: these days you can just grow a really long fringe and listen to poor quality pop rock

21:45 amalloy: "fringe". you crazy englishers

21:45 Raynes: And by poor quality pop rock, he means anything I listen to.

21:45 brehaut: Raynes: you arent yet 20, your _expected_ to listen to crap

21:46 except you are allowed to understand it

21:46 Raynes: And you're over 20, and thus expected to differentiate between 'your' and 'you're'.

21:46 brehaut: baha

21:47 :(

21:47 amalloy: Raynes: i'm glad to see someone give brehaut the beatdown he deserves grammar-wise

21:48 brehaut: amalloy: i thinkg you mean 'grammaur'

21:48 you cant just go dropping the 'u's from english words because you cant be bothered typing them

21:50 amalloy: s/bothered/arsed

21:53 cemerick: holy crap, this channel turns into proggit after hours these days ;-)

21:53 brehaut: hahah

21:53 Raynes: cemerick: Only today.

21:53 brehaut: is that better or worse than turning into HN ?

21:53 Raynes: Christmas is nigh.

21:53 cemerick: unknown

21:53 I've actually been trolling around reddit some lately.

21:53 classin' it up, y'know?

21:54 brehaut: haha

22:26 symbole: I've created a project with a log4j.properties in src/. I then launch a REPL using clojure-jack-in, and use clojure.tools.logging to fire off a bunch of log messages. I don't see any of my log messages printed to the log files. What could be the problem here?

22:28 lancepantz: symbole: you also need to have log4j as a dependency

22:29 symbole: [log4j "1.2.15" :exclusions [javax.mail/mail javax.jms/jms com.sun.jdmk/jmxtools com.sun.jmx/jmxri]]


22:29 add that to your :dependencies

22:33 symbole: lancepantz: Thanks! That worked.

22:33 lancepantz: symbole: you're welcome

22:33 symbole: This should be documented somewhere.

22:34 lancepantz: i remember having to deal with it a couple of years ago, don't remember how i figured it out

22:34 but the point is that the log engine is pluggable

22:35 symbole: Looking at the POM file of clojure.tools.logging, I can see why I'd need to bring it in.

22:35 woohoo_erc: Greetings! Any Emacs user experience weird/inconsistent behaviour by ParEdit, especially for brackets []?

22:36 symbole: Maybe I'll shoot an email to the developers. Thanks again.

22:51 wolfjb: Do I need :aot? my project isn't building as far as I can tell

22:53 lancepantz: wolfjb: can you be more specific?

22:54 wolfjb: well, my project.clj doesn't have :aot in it, but when I run lein compile I get the message No namespaces to :aot compile listed in project.clj

22:54 lancepantz: wolfjb: no need to compile

22:54 wolfjb: oh

23:02 technomancy_: i should probably suppress that message for everything but direct invocations of the compile task

23:03 but I can't think of a good way to distinguish between direct invocations and indirect

23:03 wolfjb: well, and as a n00b, it is a bit confusing, but I don't know how to help

23:04 technomancy_: maybe suppress it altogether

23:04 lancepantz: technomancy_: could you check the command line args?

23:05 technomancy_: lancepantz: yeah, but if you said "lein test, compile", the indirect compile from test wouldn't still pick it up from *command-line-arguments*

23:07 alexbaranosky: is there something wrong with this attempt at using core.incubator from my project.clj? [org.clojure/core.incubator "0.1.1"]

23:09 cemerick: lancepantz: FYI, log4j 1.12.16 doesn't have those absurd dependencies you need to exclude in 1.12.15.

23:10 amalloy: alexbaranosky: that version isn't released

23:10 lancepantz: ah cool, thanks cemerick, i'll bump it up