#clojure log - Jun 11 2013

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

0:01 futile: It's like, the people who discovered all these cool things you can do with a homoiconic language just couldn't get over the novelty of it all, and decided to standardize using them in real programs.

0:01 Sure, fine, recursion is cool. But it's confusing too, so stop using it now that you're not in CS class anymore.

0:02 etc etc

0:02 ok done

0:02 Hey, what do you guys think of ClojureScript?

0:03 apricots: futile: great but the whole compilation in java land is sluggish

0:03 Intensity: Hi. I'm wondering how I can create a hash map on the fly without using flatten: (apply hash-map (flatten (map (fn [k] [k (inc k)]) (range 6))))

0:04 xeqi: &(into {} (for [k (range 6)] [k (inc k)]))

0:04 lazybot: ⇒ {0 1, 1 2, 2 3, 3 4, 4 5, 5 6}

0:04 Intensity: xeqi: Cool, thanks much!

0:05 amalloy: i recommend xeqi's approach, but you could also just throw away the flatten and replace map with mapcat, Intensity

0:07 futile: ,(doc dec)

0:07 clojurebot: "([x]); Returns a number one less than num. Does not auto-promote longs, will throw on overflow. See also: dec'"

0:07 futile: I think that can be shortened to "Returns a number less one."

0:08 More poetic, more concise, and just as correct.

0:12 ivaraase1: futile: had a second look at test2 BTW. seems pretty cool

0:13 futile: ivaraase1: thanks

0:14 I'm hoping to regain some lost morale soon, and finally finish the spec and make some cool extensions.

0:14 I made a pretty stupid mistake announcing it before it was completely done.

0:14 Especially in the presence of some people who took it personally.

0:17 tomjack: on the list?

0:17 futile: I can think of no good reason that we have 4 different incompatible testing libs which mostly do the same thing.

0:17 tomjack: yeah

0:18 I can think of one really bad reason though.

0:18 Prid.e

0:18 *Pride.

0:20 When I had to delete several thousand lines of my own code, it really helped me get past my pride and focus on being productive rather than being selfish.

0:21 Okay, morale is back. Kinda. (Mostly just as a variation of being annoyed.)

0:23 ivaraase1: futile: same thing being a journalist. you delete more than you write, and often have to cut your favourite sources short, so we're indoctrinated with the "kill your darlings" philosophy

0:23 futile: ivaraase1: yay! so I'm not crazy after all :)

0:24 ivaraase1: well, to be fair, I'm somewhat crazy

0:24 futile: You really just can't take things personally in this business.

0:24 ivaraase1: 10/10/20 weekends do something with your sanity :P

0:24 futile: Code is code, doesn't matter who wrote it, doesn't matter who came up with the idea. Good code is good, and bad code is bad, that's all.

0:24 ivaraase1: so you're a coder and a journalist?

0:25 ivaraase1: well I'm stepping down as editor in chief and probably pursuing DSP, so yeah

0:25 at least programming has semi-sane hours

0:26 futile: ivaraase1: :)

0:27 ivaraase1: futile: and you?

0:27 futile: I don't know what half the stuff you said is, but it sounds neat.

0:27 I'm not a journalist, no :P

0:27 ivaraase1: futile: lucky :P

0:27 futile: I just work on a small commercial website for a living.

0:28 I'm pretty glad that it's written in Clojure.

0:28 Most of my career was Ruby or Python or ObjC or whatever. Finally I found a language I can work with easily.

0:28 I don't know if that says more about me, or about Clojure, or about Ruby :)

0:28 (Ruby being the main one I used.)

0:29 ivaraase1: yeah. our newsaper is mostly a Java shop. trying to sneak in a bit of Clojure here and there

0:29 futile: Exciting!

0:29 One day hopefully it'll be 0% java and 100% Clojure, then you'll be able to party.

0:29 ivaraase1: oh I long for that day

0:29 most of our internals are Spring apps

0:30 also some custom publishing system, somewhat unstable, but doesn't need to do much. (it basically typesets text to a given template and generates XML)

0:31 futile: Sounds scary.

0:33 ivaraase1: it is. not as bad as geologist code, though. that stuff is truly horrible

0:33 futile: How do you know?

0:34 ivaraase1: because I transferred from petroleum science this semester.

0:35 futile: Oh I see.

0:36 ivaraase1: I mean, you can't really blame them. people hardly get any training in Java or Matlab

0:37 futile: Most of the things you're saying, I don't understand :)

0:38 But I'm good at smiling and nodding :)

0:38 callen: ivaraase1: Spring apps? you poor bastard.

0:39 ivaraase1: callen: the failover strategy is to reboot the system via ssh :(

0:42 futile: tbaldridge: ha

0:43 re mailing list

0:43 bbloom: why would you want to split finding tests out of the Runner role?

0:44 bbloom: the one reason you mentioned seems like it's not a common- or strong-enough need to merit the complexity it would need

0:45 bbloom: futile: parallel test runs?

0:45 futile: bbloom: you could do that with the setup we have now.

0:45 bbloom: i dunno

0:46 futile: bbloom: https://github.com/evanescence/test2-autorunner/blob/master/src/test2_autorunner/core.clj

0:46 bbloom: i just think it's weird that the runner takes a predicate instead of a list of tests

0:46 s/parallel/distributed/ ? :-)

0:46 futile: just imagine that instead of doing (map run-test-fn test-fns), it did them with pmap

0:46 bbloom: it used to take a seq of test-fns and that was all.

0:46 bbloom: but then I wanted to write test2-autorunner

0:47 bbloom: and realized, I need some way to reload all the test files and find new tests in them and run those too

0:48 bbloom: hence now it takes a reporter (so it can run the tests several times and pass the results to it each time), a list of namespaces to only look in (or nil for the whole project), and a matcher function to optionally filter tests out

0:48 bbloom: which I think is a good compromise that enables very flexible runners.

0:48 bbloom: *shrug* i'm probably the wrong guy to get feedback from, since i personally don't give a shit about test runners at all

0:48 futile: bbloom: The problem I still see with Runners is that you can't compose them easily.

0:48 bbloom: ffffffff

0:48 I'm literally the only guy interested in fixing this stupid problem.

0:49 bbloom: lol sorry man, but please, keep on fighting the good fight

0:49 if you make something cool, i'll use it

0:49 futile: Really I just wish Jay Marick Micah and Stuart just worked together on this lib in the first place.

0:49 * futile sighs

0:49 bbloom: i use test frameworks b/c they are convenient

0:50 tbaldridge: futile: I think that would be a futile endevor. They all have very very different points of view on how things should be done

0:50 futile: (demoralize futile)

0:50 bbloom: but really, most of my test code is shell scripts that return 0 or 1

0:50 i like smaller components with test suites that are fast enough to run in their entirety

0:50 tbaldridge: futile: one other point, people don't use Ring because we all agreed it was the right way to do it. One guy built it, and eventually everyone saw the light of day

0:50 bbloom: i like code that is pure enough to allow arbitrary execution of small parts w/ some test values

0:50 tbaldridge: build it, and they will come

0:51 futile: You know, the discussion with people on this subject has taken way more time than writing the thing itself would have.

0:51 bbloom: i generally write (comment ……………) in my code and eval forms when shit changes

0:51 futile: tbaldridge: that was my plan

0:51 bbloom: i almost never run my test suites, even when i have them, relying on CI to tell me when i've fucked up

0:51 but i'm a crazy person

0:51 sooo ignore me

0:51 arohner: futile: actually, from reading the spec today, I thought the runner is still too high-level to build real abstraction on

0:51 futile: tbaldridge: the only reason I keep talking about it is cuz (1) im afraid to get fixtures wrong, and (2) marick keeps pressuring me to "open up discussion"

0:52 arohner: oh?

0:52 arohner: IMO, you should be talking about data and protocols

0:52 one sec while I get it open again

0:52 bbloom: personally, i think `git diff` is the best test framework ever

0:52 i like to ./do-some-shit > expected.json or whatever

0:53 then git diff, manually eyeball it, and then git add if it's good or git checkout if it's bad

0:53 arohner: futile: I don't understand why the runner needs to take ns-syms and matcher-fn

0:53 it seems too high-level

0:53 also, I like the split between discovering and running that other people have mentioned

0:53 bbloom: but i'm way off topic & not being productive, so go back to ignoring me

0:54 arohner: if you want to take the WWRichDo approach, define a bunch of protocols with like one or two functions in them, each doing as little as possible

0:54 futile: arohner: it used to take a seq of test-fns and that was all. but then I wanted to write test2-autorunner and realized, I need some way to reload all the test files and find new tests in them and run those too.

0:54 arohner: hence now it takes a reporter (so it can run the tests several times and pass the results to it each time), a list of namespaces to only look in (or nil for the whole project), and a matcher function to optionally filter tests out

0:54 arohner: which I think is a good compromise that enables very flexible runners.

0:55 arohner: futile: when designing protocols, fuck compromise. find the smallest abstraction that works in the general case

0:55 you can build your runner on top of that

0:55 futile: arohner: I've been wary of protocols, when I saw this: https://github.com/slagyr/speclj/blob/master/src/speclj/reporting.clj#L10-L31

0:56 arohner: "protocols"

0:56 whether you actually use defprotocol or not is a separate issue

0:56 futile: oh you don't mean defprotocol do you

0:56 ah

0:56 then i dont understand

0:57 arohner: I'm talking protocol in the IETF sense

0:57 in the abstract sense

0:57 as a way to communicate

0:57 futile: oh like HTTP

0:57 arohner: but I think your runner signature is too specific

0:57 futile: I agree

0:57 I just don't know how to make it better

0:57 arohner: I'd make it (runner reporter seq-of-test-fns)

0:58 then Discoverer is a separate thing

0:58 futile: I'm actually not smart, all I'm really good at is getting smart people to talk to each other and come up with cool things

0:58 arohner: I've been threatening to write a test framework for a while

0:59 futile: arohner: ok then help me write this one

0:59 i like this idea

0:59 tomjack: I heard reporter and was worried

0:59 (reporter test-results)

0:59 OK! :)

0:59 futile: tomjack: no comprendo

0:59 arohner: so once you have (runner reporter seq-of-fns), make Discovery a separate thing

0:59 bbloom: futile: also drop the er

0:59 arohner: (discover ???) returns a seq of test-fns

1:00 then you can drop (defn ^:test) as part of the spec

1:00 bbloom: define, assert, discover, execute, report

1:00 arohner: but the "standard discoverer", built on top of it can search for all (defn ^:test ..)

1:00 futile: arohner: so then its just a single Discoverer's idea of test definitions?

1:00 arohner: right

1:00 futile: arohner: but that seems like an excessive abstraction

1:00 arohner: then if I want to discover tests over the internet or whatever, I can do it

1:00 futile: nobody would ever want them defined any other way, right?

1:01 callen: I was discussing testing libraries with Segfault the other day. What's the goal with Test2 in terms of improving upon what already exists? That isn't clear to me from the spec, IRC, or mailing list conversations.

1:01 arohner: why would you assume that?

1:01 test.generative creates new test cases

1:01 clojure.test requires defns

1:01 midje doesn't use functions at all

1:01 (or it didn't, until 1.5/1.6)

1:02 quickcheck style tools invent new test cases after examining code, without having named defns

1:02 futile: arohner: because assertions need to be inside test-fns, so that they can be wrapped and have something to give its assertion-results to

1:02 callen: basically,

1:02 callen: the existing tools are so completely incompatible, but I want to mix and match tools

1:02 arohner: futile: requiring defns is a big limiting assumption

1:03 futile: callen: the goal of test2 is to let me do that. It just lets me use Jay's (expect) function with Micah's nestable (describe) macro, and lein-difftest for reporting

1:03 arohner: well the real heart of it is assertions

1:03 arohner: and assertions *must* be side-effecty in how they create assertion-results

1:03 arohner: that's fine, but they don't have to be defns

1:04 futile: arohner: but they have to be run in the context of something that can be wrapped with an (atom [])

1:04 arohner: huh?

1:04 futile: hold on hold on

1:05 arohner: Once the Discoverer finds tests, he passes them to the Runner, who needs to be able to run them as a group of assertions.

1:05 Right?

1:05 arohner: right

1:06 futile: And the group of assertions should probably be required to be run in the context of arbitrary code, right?

1:06 arohner: right

1:06 futile: So I can do (expect empty? (foo)) (side-effecty-code!) (expect-not empty? (foo))

1:07 Which means, each group of assertions needs to be an opaque ball of executable code.

1:07 Which is perfect as a defn.

1:07 No?

1:07 clojurebot: no is tufflax: there was a question somewhere in there, the answer

1:07 arohner: it's perfect as an fn, not a defn

1:07 futile: Oh.

1:08 tomjack: should the default discoverer check fn metadata in addition to var metadata?

1:08 guess it doesn't matter

1:08 arohner: tomjack: exactly!

1:08 tomjack: you'll either have a macro or if you're pointless you can (def ^:test ...)

1:09 cbp```: callen: have you made any progress in the rethinkdb stuff? Sorry for the hiatus but i got caught up in finding a job :(. After wednesday I'm free as a bird though and ready to continue where we left off.

1:09 cbp`: O god backqotes

1:09 futile: I'm imagining one guy's test suite being totally locked into one discoverer, not being able to swap them out once the suite is written.

1:09 arohner: why?

1:09 callen: cbp`: no, I'm caught up in the same thing

1:09 clojurebot: Why is startup slow is busy compiling the `for` macroexpansion

1:10 arohner: futile: fn rather than defn allows something like test.generative or quickcheck to build a bunch of test fns on the fly

1:10 callen: cbp`: it's still out there though.

1:10 futile: arohner: once all your tests are written with one thing, you can't easily swap them.

1:10 callen: cbp`: incidentally, Tokutek did some work on Mongo that makes it better.

1:10 futile: arohner: but then again you're right.

1:10 arohner: that's what it would have done anyway with the ^:test idea

1:10 Okay I'm sold arohner.

1:11 cbp`: callen: Oh? how so?

1:11 callen: do you have a link?

1:11 futile: arohner: oh but this breaks an autorunner.

1:11 arohner: why?

1:11 clojurebot: arohner: because you can't handle the truth!

1:11 callen: cbp`: https://github.com/bitemyapp/revise

1:12 futile: arohner: the runner gets a seq of tests to run, right?

1:12 cbp`: callen: I meant for what Tokutek did

1:12 futile: arohner: well, if you create a new test while the autorunner is running, the runner won't see them until you restart the autorunner, since he's already been given a list of tests tor un

1:13 arohner: futile: meh. autorunners can be built on top of this

1:13 callen: cbp`: https://github.com/Tokutek/mongo made it ACID

1:13 cbp`: it's sweet.

1:14 futile: arohner: how?

1:14 i can't imagine it

1:14 arohner: reporting for any autorunner is going to be special, because there's not a single report time

1:14 futile: arohner: i'd hate to limit such a widely used (and useful!) feature so quickly

1:15 arohner: so the autorunner would call (runner ...) many times while it's alive

1:15 futile: arohner: so the autorunner would really be a discoverer then?

1:15 arohner: (while-not (time-to-die?) (runner (find-changed-files)))

1:15 futile: arohner: such that (-> (discover ...) (run) (report))

1:16 arohner: but who would contain that code you just wrote?

1:16 arohner: contain?

1:16 cbp`: ooh i see

1:16 futile: arohner: where would that code be? in which role?

1:17 arohner: in the auto-runner library?

1:17 futile: arohner: i mean in the spec

1:17 arohner: it's not a part of the spec, it's a library that uses the spec

1:17 there should be no implementation code in the spec

1:17 futile: arohner: this is hard. hold on.

1:18 arohner: given your suggestion, the core of the lib glues all the roles together like this: (report-tests (run-tests (discover-tests))) right?

1:18 arohner: yeah

1:19 futile: And the auto-runner would be a custom run-tests funtion?

1:19 If so, the discovering would have already been done. All run-tests does is turn a pre-generated list of tests into something the reporter can use.

1:19 arohner: (while-not (time-to-die?) (report (runner (find-changed-files)))

1:19 it'd run in a loop

1:19 futile: arohner: in which case, he can re-run them any amount of times he wants, but he can't find new tests, because that role has been done

1:20 arohner: why are you assuming "done"?

1:20 futile: arohner: because the code I wrote would live in test2.core/main, which glues the parts together

1:20 and the code you write lives in test2-autorunner.core/runner

1:20 but they have conflicting roles.

1:20 you can't see this?

1:20 arohner: no

1:21 I think you're assuming too much implementation

1:21 a good spec should have no implementation code

1:21 futile: yeah maybe.

1:21 but im really thinking you're just crazy

1:21 (no offense)

1:21 arohner: *shrug*

1:22 futile: seriously, can a third party just take a glance at the last 2 minutes and see who's crazy?

1:22 arohner: I'm tired, so I've gotta run. but let's talk tomorrow

1:22 futile: yeah that works too

1:22 cya

1:22 * futile sighs

1:23 futile: i do like the idea, i just dont see how it works along with the concept of an auto-runner.

1:23 which is a pretty important concept.

1:23 some core function has to glue all the roles together, which means there has to be some implementation that goes hand in hand with the spec

1:32 im ready to give up

1:32 everything sucks. screw it all.

1:33 tomjack: don't give up

1:39 magnars: I now have to (require 'clojure.repl) in nrepl before I get docs and such. Any ideas why that happened now?

1:53 cbp`: magnars: https://groups.google.com/forum/?fromgroups#!topic/clojuredev-users/j5cJvl2KsEE I believe that's what you're looking for

1:53 magnars: cbp`: most kind, thank you

1:59 callen: cbp`: next question becomes, is the answer to just use Toku's version of Mongo or keep pushing onward with the RethinkDB client?

1:59 muhoo: this may seem like a dumb question, but is there any way in cheshire or similar, to generate javascript, not json with {\"stuff\"} but just reglar js, like {"stuff"} ?

2:00 callen: muhoo: not unless you hacked it up I think, cheshire is valid JSON and SMILE only AFAIK

2:01 muhoo: hmm. maybe i could (.replace .... if only i could figure out how to esacape the \'s

2:03 amalloy: muhoo: why would you want to?

2:04 muhoo: long story, but i'm dealing with a web service that wants urlencoded javascript, not json :-/

2:18 tomjack: I don't understand

2:18 "{\"foo\": \"bar\"}" looks both like JSON and JS to me

2:20 (and {\"stuff\"} and {"stuff"} look like neither..)

2:23 muhoo: tomjack: {"foo": "bar"} is OK. {\"foo\": \"bar\"} is not

2:23 tomjack: you mean "{\\\"foo\\\": \\\"bar\\\"}"?

2:24 muhoo: no, i mean less leaning toothpicks, not more

2:24 tomjack: please exhibit the two strings as clojure strings

2:24 Raynes: ENGLISH MOTHERF**KER, DO YOU SPEAK IT?

2:25 muhoo: Raynes: and i will strike down with furious anger...

2:25 Raynes: We're here all week folks.

2:27 tomjack: &(println "{\"foo\": \"bar\"}")

2:27 lazybot: ⇒ {"foo": "bar"} nil

2:27 tomjack: &(println "{\\\"foo\\\": \\\"bar\\\"}")

2:27 lazybot: ⇒ {\"foo\": \"bar\"} nil

2:27 tomjack: am I confused?

2:28 muhoo: tomjack: ah, i see. what i'm seeing in the repl is not what's there

2:29 i'll dig into it a bit more. this may be a non-problem

2:29 tomjack: it's called JSON for a reason :)

2:53 muhoo: yep, there was a problem, but it wasn't json. thanks.

3:16 borkdude: I have 1.5 hours to spend about Clojure in front of a classroom of students blank on the subject. How do I get the most out of it in this time? It's a one time thing only

3:16 They like dojo style

3:16 Any tips are welcome.

3:18 matko: what is dojo style?

3:21 borkdude: matko programming together

3:24 callen: borkdude: pair programming?

3:24 borkdude: with each other or you?

3:25 borkdude: callen I actually don't know what the official definition of dojo is, but they like interactive sessions

3:26 matko: perhaps set up a list of unit tests, have the class collaborate to make them all succeed?

3:26 callen: borkdude: koan style might work well for them.

3:27 borkdude: callen I was thinking maybe introduce clojure slide by slide in the style of The Reasoned Schemer and then let them do koans?

3:28 callen: I don't think reasoned schemer is a good idea.

3:28 Ember-: simple introduction to the syntax etc, then let them get their hands dirty

3:28 show constantly stuff via REPL

3:28 typing into REPL something tells them 100% more than showing a slide

3:29 borkdude: Ember- yeah, good idea (also it will save me time making all those slides)

3:30 Ember-: of course you should plan ahead what you will show

3:30 borkdude: Ember- naturally

3:30 Ember-: but REPL allows you to give quick answers to questions :)

3:30 I've taught Javascript like that

3:30 made some slides to support that but it was a lecture

3:30 borkdude: Ember- it is actually what I have been doing in my 6-episode course mainly, but this is only a one time thing, that makes it a bit difficult

3:31 Ember-: if you'd be doing lecture thing would be a bit different

3:31 but with dojo you really should start creating something

3:32 but if they really have *no* experience in clojure and you have 1.5h to do this then dojo in overall might be a bit too much for them

3:32 borkdude: Ember- I think I might introduce them to datastructures and some higher order functions and then let them try to make a tictactoe game n by n instead of 3 by 3 as a final exercise

3:32 Ember-: if done like a real coding dojo

3:32 yeah, definetly show them the datastructures

3:33 you *might* mention macros, but don't get too deep :)

3:33 borkdude: Ember- I even skipped macros in my normal course this year

3:33 Ember- but that was also because I had too many guest lecturers ;)

3:33 Ember-: macros might be a good thing to say anyway, since you're bound to be asked "why all these parenthesis" question

3:34 and then you'll dive into the this whole code is data and data is code thing

3:34 ...which they will not understand by the way

3:34 :)

3:34 amalloy: yeah, the answer to that question, in a 90-minute session is "because of good reasons i can't get across in 90 minutes"

3:35 if you like, you can also note that there aren't really more delimiters than other languages except when doing math; the parens just move

3:35 Ember-: amalloy: yeah, although that point will miss the mark

3:35 all they see are the parenthesis

3:35 borkdude: amalloy also I can say, if your function ends like this )))]))}))}) it's a sign the function is too big ;)

3:36 callen: borkdude: looks like JS

3:36 Ember-: everyone creates functions like that in the beginning with Clojure :)

3:36 borkdude: the real difficult thing is: get across 'why clojure' and show this in 90 minutes

3:37 Ember-: yup

3:37 imho you can tell them:

3:37 1) data manipulation power

3:37 2) REPL

3:37 3) immutability and...

3:37 4) concurrency

3:37 and if they get excited then go to the whole macro and homoiconicity thingy

3:38 but those four should sink deep if they've ever done stuff like that

3:38 and assuming they've done programming before they should have

3:39 borkdude: Ember- do you know a nice example of concurrency to fit in the 90 minutes?

3:39 Ember-: borkdude: use refs and STM

3:39 borkdude: Ember- in what use case.

3:40 Ember-: anything :) Like, keeping blog comments in memory

3:40 borkdude: Ember- I tend to use atoms for it

3:40 Ember-: just throw maps into a ref holding a vector

3:40 borkdude: yup, atoms are fine for simple operations

3:41 but you could do stuff like "first find a comment in the comment tree, then after we've found it apply a new reply to that comment"

3:41 which basically needs first finding the right place and then updating it

3:41 which needs transactions

3:41 borkdude: Ember- that is an update-in on an atom if it's a nested structure

3:41 Ember-: if you know _where_ to update ;)

3:41 borkdude: (if the atom contains a ...)

3:42 Ember- ah

3:42 Ember-: if you have the path for the update-in then yes atom is fine

3:43 borkdude: Ember- what about (swap! myatom update-in (calculate-path @myatom) foo msg)… hmm… how would this look with refs?

3:43 Ember-: but anyway, that's a pretty simple scenario but still complex enough to get their heads dizzy thinking about all this in an imperative world

3:43 borkdude: Ember- you're right that you need a transaction for it

3:43 Ember-: you can mention about performance and so forth

3:43 and how immutability helps this

3:44 this should shut some C fanatics up :D

3:44 (I have nothing against C btw, C just doesn't really encourage immutable data structures ;P )

3:45 but anyway, hope this gave you some ideas

3:45 borkdude: Ember- sure, thanks. I will make something of it

3:45 Ember-: need to go to a code review now

3:45 borkdude: It was basically what I already had in mind, but there's too much to tell

3:46 so maybe I should keep it basic and let them exercise with the basic parts

3:46 first 20 minutes: helicopter overview of the main things for clojure

3:47 and then the basic stuff + exercises

3:48 ok, I'm off

4:46 ddellacosta: is there a way to determine what version of Clojurescript my code is getting compiled with?

4:46 using cljsbuild

4:47 Fender: Hi, maybe someone here has an idea: I want to deploy my app to a cloud instance, but I will deploy often so I'd prefer to deploy the JAR (and not the uberjar). How would I obtain all the necessary dependencies using leiningen so that I can put them in the cloud instance class path?

4:47 Or is there another way to do it?

4:48 ah and I dont want to set up leiningen and JDK just to get the dependency management

4:48 dmi3y: Fender: sounds like you need osgi

4:48 ddellacosta: Fender: well, there goes what I was about to say...haha

4:49 Fender: OSGI looks a little arcane for me, I only remember it from old eclipse times

4:50 actually, I don't even need a dependency management at all because I can get lein at home to get all dependencies

4:50 so my idea would be just to assemble all lein JARs as in lein v1 (I think it was a"lib" or "deps" directory) and just copy them in the class path on the cloud instance

4:52 clgv: Fender: you can use pallet to upload alll those files

4:52 Fender: so I can copy all dependencies at once (dont need to change them so often) and then just copy my "lein jar"

4:52 I will take a look at that

4:55 pallet seems to solve a lot more problems than I have :)

4:56 is there no "lein put-all-deps-in-one-dir"?

4:57 ddellacosta: I mean, lein essentially does that via maven, in your local repo

4:57 I'm always just poking around in my .m2/repository directory

4:58 Fender: hmm, I could do it manually

4:58 but I was hoping to avoid that

4:59 mpenet: there is a :local-repo key you can add to your project.clj to do that I think

4:59 check the sample.project.clj file on leinigen repo, might give you a hint

4:59 ddellacosta: yep neat

4:59 https://github.com/technomancy/leiningen/blob/master/sample.project.clj#L247

5:00 Fender: hmm, this only seems to change the local repo ".m2" to another location

5:01 somehow I think I am overlooking something big time

5:01 mpenet: you probably shouldnt try to do that anyway

5:02 Fender: is there a "better way"?

5:02 mpenet: .m2 is fine, and if you need to bundle it all together for whatever reason (deploys), just uberjar the whole thing

5:02 ddellacosta: Fender: what is your objection to the uberjar?

5:03 Fender: the problem is that creating and deploying the uberjar takes some time

5:03 like a few minutes

5:03 and doing th same for the jar would take maybe 20 secs

5:03 ddellacosta: hmm, you need something more instantaneous? I mean, I'm not sure how you could leverage lein for that, unless you install an instance on the server

5:03 Fender: I suppose

5:03 ddellacosta: but, you could do an lein install locally, and then rsync your .m2 directory to the server

5:04 …or something along those lines.

5:04 Fender: hmm

5:04 so the JAR is 3.5MB and the uberjar is 32.5 MB

5:05 I think compilation time is about the same

5:05 maybe I should just upgrade my upspeed :)

5:05 ddellacosta: and how are you deploying the jar on the server? knowing that could make it easier to suggest alternatives

5:05 haha, or that

5:05 Fender: right now I use scp

5:05 so manually

5:05 ddellacosta: sorry, I mean, is it running under jetty or something?

5:05 Fender: actually via bash script

5:05 nope, OpenJDK

5:06 ddellacosta: or just java --jar or whatever?

5:06 Fender: yep

5:06 ddellacosta: okay

5:06 yah, then, if you could install the dependencies once, then you could just upload that jar and re-start your script I assume

5:06 Fender: exactly

5:07 ddellacosta: but you'll need leiningen on the server I believe, if you don't have an uberjar (…I think is how it would work)

5:07 Fender: this avoids all the arcane cloud config stuff

5:07 like if i'd use pallet or whatever deploy mechanism

5:07 hmm

5:07 ddellacosta: I mean, on the other hand you may save yourself some pain by dealing with the arcane cloud stuff, just to get going. I understand your objections but it may be the path of least resistance.

5:07 and could give you more leverage later.

5:08 Fender: true

5:08 I always tend to do that, when I really see that it is necessary

5:08 right now I feel it would take me a few days

5:08 and there are always awkward errors where you have to browse stack exchange to get a solution :)

5:09 ddellacosta: just a note, I may be wrong about needing leiningen on the server, I'm thinking that if you are running it as a jar, and your other jars are on your classpath, maybe you're golden

5:09 Fender: I think the class path is "generated" via lein because it knows all the dependencies

5:09 so it kind of concats all the library locations and calls it "classpath"

5:10 ddellacosta: yes, I have to admit I've been lazy (so far) about finding out the mechanisms behind lein/maven.

5:10 Fender: #2

5:10 ddellacosta: not a Java person, not that that's an excuse.

5:10 more to learn...

5:10 Fender: that's basically saying that lein is really cool and does it's job :)

5:10 ddellacosta: yah, good point...haha

5:10 Fender: now I am afraid of having to it manually :)

5:11 ddellacosta: alright, back to wrangling CLJS for me…good luck Fender.

5:11 Fender: thanks a lot!

5:12 sorry but I jave no clue about CLJS :)

5:12 ddellacosta: naw, no worries…I'm learning through trial and error. heh

5:36 Fender: the solution (which I still need to try) is to extract the project.clj (via "jar -xvf <file> project.clj", then lein deps, and then create the classpath with "lein classpath"

5:40 or maybe I can just run the jar file via lein?

6:07 clgv: Fender: you can also just run a script gathering all jars in your directory to create the classpath

8:38 jcromartie: Can I use ClojureScript without precompiling?

8:39 i.e. can I load .cljs from the browser?

8:39 clgv: jcromartie: afair no

8:40 you'd need a javascript hosted cljs compiler

8:40 or selfhosted^^

9:01 ghit: Hey guys! I've completed a few clojure tutorials but I never feel like I know a language until I've coded something. Any ideas on an intro project?

9:04 vijaykiran: ghit: depends on what you want - I usually write a small web app

9:05 clgv: ghit: write a local search algorithm for the traveling salesman problem ;)

9:07 llasram: Project Euler problems are fun

9:08 AimHere: If you're biologically minded or like your stringses, there's also Rosalind these days

9:09 ghit: Thanks a lot guys

9:10 By the way, is there any gold standard HTTP library for clojure

9:10 llasram: AimHere: Huh, wasn't aware of that one. Looks funducational

9:10 ghit: https://github.com/dakrone/clj-http

9:10 AimHere: Slurp is my one stop shop for all my http needs ;)

9:11 llasram: Hah, but yeah -- for just reading from HTTP URLs, the Java standard library + Clojure clojure.java.io wrappers works just fine

9:21 futile: Good morning.

9:31 Which one of these do you like better, the mapcat or the list comprehension? https://github.com/evanescence/test2/commit/5a38efaddf1dd66224144c8703552f259deae3e0

9:51 clgv: what do you use for html parsing? I use clj-tagsoup a long while ago

9:54 mpenet: laser seems nice

9:56 I also used jsoup directly in the past, it's not so bad

10:08 dnolen: Functional Programming Is A Scam!, new blog post http://swannodette.github.io/2013/06/10/porting-notchs-minecraft-demo-to-clojurescript/

10:12 ucb: dnolen: nice!

10:16 dnolen: ucb: thx!

10:21 supersym: clgv: I like tagsoup too... ideal for consolidation of old web projects

10:22 kmicu: Functional Programming Is a Scam Monad!

10:27 supersym: lein doesnt follow the Java each org.component.project element to their own directory convention, using lein new, should I mv src/org.component.project to their own directories afterwards?

10:28 people seem to use different methods, but from what I understood, the JVM likes it split up like src/org/component/project (company even)

10:30 boostrapping a new luminus project with lein and then moving files to new directories (from src/org.company.project to src/org/company/project) although namespaces still the same, seems to break it

10:30 java.lang.IllegalArgumentException: No implementation of method: :make-reader of protocol: #'clojure.java.io/IOFactory found for class: nil

10:32 (using lein run and http-kit as server to fire up the app)

10:33 silly me... classpath probably ><

10:38 and hardcoded paths.. obviously

10:47 xeqi: the wrong file name being generated sounds like a luminus template problem.

11:07 llasram: Doesn't Leiningen in general just create filenames with `.` in them if you create a project name with `.` in it?

11:09 vijaykiran: llasram: no, if you say foo.bar the "main" namespace is foo.bar so you get src/foo/bar.clj

11:10 llasram: Yep, I totally should have just tried it vs FUDing about

11:10 clojurebot: Titim gan éirí ort.

11:12 rasputnik: hey all, is there an idiomatic way to convert a java enum to a keyword?

11:13 ie. i'm pulling VM info out of vsphere as a seq of maps, and seeing : :power-state #<VirtualMachinePowerState poweredOn> , just want that to be :power-state :poweredOn

11:13 clgv: rasputnik: maybe via the toString method of the enum if that results in something usable. like (keyword (str my-enum-value))

11:13 rasputnik: clgv: ta, I'd tried just a (keyword ..) call but that results in :power-state nil. let me try that.

11:13 clgv: rasputnik: you can also shoot for name-spaced keyword by adding the class name as keyword namespace

11:15 rasputnik: clgv yup, (keyword (str …)) works great, ta. i'll RTFM on that namespace thing

11:16 clgv: rasputnik: just use the two-argument version: (keyword namespace symbol)

11:16 (keyword (-> my-enum-value class .getFullName), (str my-enum-value))

11:18 rasputnik: clgv: thanks, there's a chance i'll need to convert back so that way looks a bit cleaner

11:19 clgv: rasputnik: it's also clearer in case of name clashed from different enum types

11:20 rasputnik: clgv: nice. this is the first bit of java interop i've done, so far so good

11:24 ah hometime.

11:24 cheers again.

11:37 paultag: Hey Clojurians. Anyone have a "killer app" for Clojure? I need (at least) one as example (not cool libs, cool end-user apps)

11:37 that are Free, as well (so no lighttable!)

11:38 technomancy: paultag: there was that android p2p social network that was pretty slick

11:38 paultag: oh, hey technomancy!

11:38 technomancy: paultag: greetings

11:38 paultag: technomancy: anything for GNU/Linux? We were talking about the Debian clojure work again

11:39 technomancy: there's not much targeted towards end users

11:39 depending on how you define it, riemann might qualify

11:39 possibly incanter

11:39 mpenet: prismatic ?

11:40 paultag: whoh, prismatic is Clojure?

11:40 mpenet: well free but not open

11:40 technomancy: paultag: oh, definitely overtone

11:40 mpenet: paultag: yes it is

11:40 paultag: technomancy: overtone's a lib

11:40 technomancy: hm; I thought they were adding a frontend, but maybe it's not ready yet

11:40 paultag: mpenet: Oh, I thought you were talking about the prismatic running the lightpack thing that got kickstarted

11:41 I was about to say, I thought that was C

11:41 mpenet: paultag: no the newsreading thingy

11:41 paultag: yep, ack

11:41 alas, not packageable

11:41 Riemann would be interesting, but again, more of a lib-type stuff.

11:41 technomancy: it's an application, but you kind of have to stretch the "end-user" part

11:42 paultag: Clojure would be so perfect for UI work, such a shame there aren't any GTK apps that use agents to manage the GUI

11:42 technomancy: something that would be nice to have apt-gettable without the person knowing lisp / clojure

11:42 (save for configs, at most)

11:42 technomancy: hrm, well when you phrase it that way I can't think of anything

11:43 paultag: :\

11:43 TimMc: technomancy: Oh wow, http://nightweb.net/ ? That looks super cool.

11:43 I've been wanting to write something like that.

11:49 paultag: man, that sucks.

11:49 oich: how do I mutate a map? (doto (.getRequestContext dispatch) (.put "blah" "blah"))) complains that there is no put method. There is no setRequestContext.

11:50 requestcontext is Map<String,Object>

11:50 egghead: lol dnolen "While this exercise might seem only like a bit of fun, it really isn’t." I misread and missed the word 'only'

11:50 while this might seem fun, it isn't

11:51 cool post http://swannodette.github.io/2013/06/10/porting-notchs-minecraft-demo-to-clojurescript/

11:51 gfredericks: oich: that's weird.

11:51 oich: I assume you get the same thing for (.put (.getRequestContext dispatch) "blah" "blah")? and that (instance? java.util.Map (.getRequestContext dispatch)) is true?

11:54 oich: gfredericks (instance? java.util.Map ..) is true. The class name is ...RequestContext$MapView.

11:56 oops. sorry. I mismatched parens in doto. put works.

11:57 gfredericks: yay the parens are always right

11:59 otfrom: afternoon all

11:59 anyone out there use data.csv?

11:59 gfredericks: I do

12:00 ~anyone

12:00 clojurebot: anyone is anybody

12:00 gfredericks: ~anybody

12:00 otfrom: I'm having trouble with unexpected whitespace at the end of a line (as listed here http://dev.clojure.org/jira/browse/DCSV-6) and I'm wondering if I'm being stupid and missing a trick

12:00 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 ..."

12:00 otfrom: clojurebot: you are absolutely right

12:00 clojurebot: Huh?

12:01 otfrom: gfredericks: have you had the trailing whitespace problem?

12:02 gfredericks: otfrom: no; this is just for reading, correct?

12:02 otfrom: correct

12:02 Using read-csv

12:02 technomancy: paultag: so riemann is actually a network server that can be used without clojure

12:02 gfredericks: otfrom: in fact that test case does not fail for me

12:03 technomancy: there are client libs for many other languages

12:03 paultag: technomancy: algernon just convinced me I'm wrong

12:03 gfredericks: otfrom: I'm on 0.1.2

12:03 paultag: technomancy: so, yeah! We also came up with a few others, I'm happy again :)

12:03 technomancy: oh, what else?

12:03 * devn_ gives algernon some flowers

12:03 otfrom: gfredericks: so am I [org.clojure/data.csv "0.1.2"]

12:04 * algernon sniffs said flowers and goes back to eating cheese, like a clever (and hungry) little mouse.

12:04 babilen: technomancy: We gathered riemann and semira so far, are looking forward to lighttable (if it ever sees the light of open source)

12:04 technomancy: algernon: so you'd describe yourself more as a squeak user?

12:04 otfrom: (csv/read-csv (java.io.StringReader. "\"a\" " ))

12:04 Exception CSV error (unexpected character: ) clojure.data.csv/read-quoted-cell (csv.clj:36)

12:04 paultag: == babilen

12:05 gfredericks: otfrom: ah right -- when I pass the string directly it's okay

12:05 algernon: technomancy: not really, no. I squeak, but do not Squeak. :)

12:05 gfredericks: otfrom: oh scratch that

12:06 I didn't notice we were putting quotes in there; being dense

12:06 otfrom: gfredericks: so does it fail for you too or no?

12:06 gfredericks: otfrom: so given that this is a reported issue I don't understand your "I'm wondering if I'm being stupid and missing a trick"

12:06 yes it does fail

12:06 are you asking for a workaround?

12:07 * technomancy basically only works on dev tools; those mythical "end users" are a mysterious bunch

12:08 otfrom: wasn't sure if it was a spurious report or not as I didn't see any response

12:09 so I was just making sure I wasn't misusing the api before diving into a workaround

12:09 gfredericks: not that I know of. I'm not an expert on the CSV spec though; it might be that that's not valid CSV

12:09 and as such wouldn't be treated as a bug

12:10 I'd check that out first

12:11 otfrom: will do

12:14 tomjack: "However, the RFC didn't say what to do when white spaces appear outside the quoted value." :(

12:14 "The more common but technically less satisfactory solution is to rely on human intervention"

12:14 http://en.wikipedia.org/wiki/Comma-separated_values#Lack_of_a_standard

12:17 gfredericks: I assume "human intervention" means mechanical turk

12:17 hiredman: "interns"

12:18 gfredericks: human intern-vention

12:20 justin_smith: ,(intern 'sandbox 'x 0)

12:20 clojurebot: #<Exception java.lang.Exception: SANBOX DENIED>

12:20 justin_smith: they won't even let interns play in the sandbox :(

12:25 * arrdem frolics in the intern sandbox

12:26 otfrom: I wouldn't wish looking for invalid characters in a 2.2GB csv file on anyone

12:26 ;-)

12:26 gfredericks: otfrom: "big data"

12:27 otfrom: not quite yet

12:27 arrdem: !karma "big data"

12:36 gfredericks: $karma big data

12:36 lazybot: big has karma 0.

12:36 gfredericks: $karma big-data

12:36 lazybot: big-data has karma 0.

12:41 jonasen: otfrom: maybe we should add an :ignore-whitespace to data.csv?

12:42 otfrom: :ignore-extra-whitespace-on-quoted-fields ;-)

12:43 jonasen: or maybe just {:trim true}

12:50 racycle: hi, i'am trying to create a map with the key as the index from a collection: example: [1 2 3] => {0 1, 1 2, 2 3}

12:50 i' come up with this (map (fn [[k v]] (hash-map k v)) (map-indexed vector [1 2 3 4 5]))

12:50 Anderkent: ,(into {} (map-indexed vector [1 2 3 4 5]))

12:50 racycle: but i'm not proud of it, and i have to think there's a more idiomatic way

12:50 clojurebot: {0 1, 1 2, 2 3, 3 4, 4 5}

12:50 racycle: that works

12:51 thanks

12:51 Anderkent: no problem

12:52 llasram: racycle: BTW, why do you want this?

12:52 racycle: i wanted to keep track of their order

12:53 clgv: zipmap

12:53 llasram: racycle: Vectors are already associative w/ the index as key: ##[(get [:a :b :c] 1) (assoc [:a :b :c] 1 :d)]

12:53 lazybot: ⇒ [:b [:a :d :c]]

12:53 clgv: &(zipmap (range (count [1 2 3])) [1 2 3])

12:53 lazybot: ⇒ {2 3, 1 2, 0 1}

12:55 racycle: i know they're associative, but they're going to be reordered and i wanted to keep track of their order

12:55 the items in the vector are going to be filtered and sorted so i wanted the map to keep track of their original order

12:55 llasram: Ah, I see

13:08 otfrom: once again clojure-csv from davidsantiago comes to the rescue https://github.com/davidsantiago/clojure-csv

13:08 I think I just need to adopt that lib and bring it up to date

13:11 technomancy: what, to reflect all the recent developments in the revised CSV-2012 standard? =)

13:15 bbloom: CSV was on of those things that was just so damn simple and obvious that the software community couldn't be trusted with it

13:29 gfredericks: technomancy: they added comma separated objects

13:31 technomancy: comma-separated quagmires

13:32 gfredericks: CSA: comma-separated agriculture

13:48 otfrom: pfft, you do know that CSV stands for Character Separated Values

13:48 I mean, really, commas?

13:50 bbloom: otfrom: character separated is probably more accurate, thanks to an old Excel i18n bug that used periods instead of commas in french speaking territories

13:58 gfredericks: the characters were dressed in frilly old-fangled costumes, for it was a period piece.

13:59 rasmusto: I prefer CRLFSV

14:04 otfrom: rasmusto: how do you separate your records?

14:08 gfredericks: probably an LFCR

14:09 TimMc: bbloom: Haha, that's fantastic.

14:10 I can see it now: Refactor -> Lift constant -> ","

14:27 dobry-den: clojure is the king of the Sinatra-esque all-in-one-file webapp.

14:27 clojurebot: Roger.

14:27 futile: And look, we didn't even need magic to do it!

14:27 dobry-den: hiccup for html, garden for css. it's just not even fair.

14:32 gfredericks: oh this garden thing sounds promising

14:32 dobry-den: gfredericks: it's amazing using clojure datastructures for everything. everything becomes obvious.

14:33 mthvedt: ~clojure

14:33 clojurebot: you're probably doing things wrong

14:34 gfredericks: dobry-den: yeah there was an obvious need for that for a while. just a tricksy thing to get right I assume

14:34 futile: garden looks neat.

14:36 tomjack: I do not like that it goes straight from sugar to css strings

14:36 dobry-den: mthvedt: at least if it's simple/obvious, it's trivial to refactor when you find out you did it wrong :)

14:37 plenty of code at work is done wrong but nobody really understands how it works anymore

14:38 mthvedt: dorby-den: actually i was trying to see if clojurebot picked up what you said earlier.

14:38 dobry-den: haha, cool. i see

14:38 rasmusto: otfrom: separate records w/ crs, items w/ lfs

14:44 futile: I've been working on making the test2 SPEC shorter and easier to read.

14:44 Here it is so far: https://github.com/evanescence/test2/blob/master/SPEC.md

14:48 supersym: lt

14:49 oops

15:06 gfredericks: tomjack: presumably that's changeable without API breakage?

15:06 tomjack: presumably

15:07 any intermediate representation like I was thinking seems.. like a lot of work

15:08 noncom: hi am trying to connect jvisualvm to a clojure environment run from ccw

15:08 but jvisualvm does not see it

15:09 there is a recipe from sun to add a Jmx-related command-line param. So i add it and i can kinda manually connect. but what i connect to does not seem like my program because it is very plain.

15:09 looks like i connect to the ccw repl then

15:09 so how do i connect to an actual running app?

15:11 timsgardner: is *ns* always the namespace at the top of the stack?

15:12 gfredericks: *ns* isn't often read at runtime I don't think

15:12 much more useful at compile-time, e.g. macro-expansion-time

15:13 amalloy: gfredericks: *ns* is generally either 'user or 'clojure.core at runtime

15:14 xpe: why does this not work: (map #({1 %}) [1 2 3]) but this does: (map #(hash-map 1 %) [1 2 3])

15:15 jeremyheiler: There's also in-ns which sets *ns*.

15:15 hiredman: '#({1 %})

15:15 ,'#({1 %})

15:15 clojurebot: (fn* [p1__29#] ({1 p1__29#}))

15:15 futile: xpe: the first one calls a function {} with no args

15:15 xpe: the second one calls a functino hash-map with 2 args

15:15 xpe: calling the function {} with no args will probably produce an error

15:15 ,({})

15:15 clojurebot: #<ArityException clojure.lang.ArityException: Wrong number of args (0) passed to: PersistentArrayMap>

15:16 futile: But maps can be used as functions with 1 arg.

15:16 ,({:a :b} :a)

15:16 clojurebot: :b

15:16 futile: xpe: hence in #() it's easiest to use hash-map like you have

15:16 xpe: futile: that makes sense, thanks

15:17 futile: xpe: #() is always a call, with the first thing being the callable-thing, that's the easiest way to look at it

15:17 gfredericks: timsgardner: the other thing you might use it for is setting it for a call to eval: (binding [*ns* ...] (eval ...))

15:17 xpe: ,(map (fn [x] {1 x}) [1 2 3])

15:17 clojurebot: ({1 1} {1 2} {1 3})

15:17 futile: Yeah I just do that sometimes too.

15:17 jeremyheiler: xpe, consider macroexpanding your example ##(macroexpand-1 '(map #({:a %}) (range 10)))

15:17 lazybot: ⇒ (map (fn* [p1__11278#] ({:a p1__11278#})) (range 10))

15:18 xpe: futile: there is still something not quite right. my rule of thumb is that #() is exactly like (fn [x] …) but clearly my understanding is not spot on

15:18 tomjack: &'(map #({:a %}) (range 10))

15:18 lazybot: ⇒ (map (fn* [p1__11288#] ({:a p1__11288#})) (range 10))

15:19 xpe: ,(map (fn [x] ({1 x})) [1 2 3])

15:19 clojurebot: #<ArityException clojure.lang.ArityException: Wrong number of args (0) passed to: PersistentArrayMap>

15:19 hyPiRion: xpe: no, it's equivalent to (fn [x] ( ...))

15:19 futile: xpe: it's more like (fn [x] (...))

15:19 bbloom: yeah you don't even need to macro expand

15:19 ,#()

15:19 clojurebot: #<sandbox$eval174$fn__175 sandbox$eval174$fn__175@c054cf>

15:19 bbloom: ,'#()

15:19 clojurebot: (fn* [] ())

15:19 bbloom: ,'#(%)

15:19 clojurebot: (fn* [p1__232#] (p1__232#))

15:19 bbloom: ,'#(apply % %&)

15:19 clojurebot: (fn* [p1__261# & rest__262#] (apply p1__261# rest__262#))

15:20 futile: Okay, gotta write some extensions for test2 now.

15:20 hyPiRion: ,(macroexpand-1 '(-> [$] #()))

15:20 clojurebot: (fn* [$] [] ())

15:20 jeremyheiler: bbloom: hmm good point :-)

15:20 xpe: hyPiRion jeremyheiler futile ok, I got it know thanks

15:32 timsgardner: gfredericks: was away, thanks for the tip!

15:41 Eivo: hello

15:42 how can i handle file uploads with compjure?

15:46 wrap-multipart-params

15:46 i see

15:47 is it possible to read incomming file by chunks and drop connection of file is too large? Can't trust content-length

15:47 s/of/if/

15:49 gfredericks: Eivo: does wrap-multipart-params slurp it all up eagerly?

15:52 Eivo: gfredericks: not sure

15:53 gfredericks: I assume it's either giving you a string or an InputStream

15:53 Apage43: Eivo: wrap-multipart-params will have consumed the entire thing by the time it passes the request to the handler *but*

15:53 you can also give it a store function, which receives an InputStream and the multipart header for each file

15:53 at that point it has not consumed the whole thing yet

15:54 you could throw an exception from there to reject it

15:55 https://github.com/ring-clojure/ring/blob/master/ring-core/src/ring/middleware/multipart_params.clj

15:55 i always just go look at the implementation =P

15:55 Eivo: Apage43: thanks

16:01 i'm not sure if i need multiparm tho, i'm building restful api and it's time to implement file uploading

16:01 https://www.dropbox.com/developers/core/docs#files-POST look how dropbox do it

16:02 https://www.dropbox.com/developers/core/docs#files_put more descriptive

16:02 they just threat body of request as file

16:04 sorry, can't think properly due drowsyness, thank you guys

16:20 cbp`: datastructures for everything sounds nice till you have to hire a frontend engineer :P

16:22 bbloom: cbp`: please elaborate

16:38 justin_smith: I have a java object that crashes swank when it gets printed - other than being very careful not to put it anywhere where it would print as a result, how do I ensure it never gets printed out?

16:38 llasram: justin_smith: Switch to nrepl.el?

16:39 justin_smith: oh, would nrepl not do that?

16:39 I mean the contents of my jpeg would still fill the repl with mega lines of noise, but I guess that is better than crashing

16:40 cbp`: bbloom: I don't think the gains from using macros in html/sql outweigh the fact that almost no one knows clojure. Nor they should to work on those ends

16:40 llasram: justin_smith: I haven't had that class of isssue with nrepl.el, but on the other hand I haven't tried it lately

16:41 justin_smith: You could also implement `print-method` and/or `print-dup` for the Java type in question

16:41 justin_smith: thanks for the tip, trying it

16:41 futile: Going to make test2 self-hosting.

16:42 bbloom: cbp`: ok, but i'm not sure that has anything to do with the philosophy of pervasive usage of inert values. id' much rather give a json data blob per view to designers than some arbitrary ORM OOP explosion waiting to happen

16:43 rasmusto: bbloom: ORMOOP sounds scary

16:43 bbloom: rasmusto: it is.

16:43 ORM? OMG.

16:43 rasmusto: ORM, oops!

16:46 cbp`: bloom: Yeah my qualm is with macros and not values I guess :P

16:46 mpenet: also you don't have to use macros necessarily for html/sql

16:46 some lib don't and are working just fine

16:47 pjstadig`: macros are necessary and sufficient

16:48 bbloom: pjstadig`: necessary and sufficent for what?

16:48 mpenet: depends on the context

16:48 pjstadig`: everything

16:48 macro all the things

16:48 mpenet: :)

16:48 futile: technomancy: blast! your idea doesn't work so easily with destructuring: https://github.com/evanescence/test2/blob/master/src/test2/run.clj#L39

16:48 bbloom: ok, not being serious. got it.

16:48 pjstadig`: bbloom: hehe

16:48 bbloom: don't you know me by now?

16:48 jkj: how do i: { :foo ["bar" "baz"] :a "b" } => [:foo "bar" :foo "bar" :a "b"]

16:48 futile: I end up getting a keyword-like string instead, like ":runner"

16:49 pjstadig`: i'm the channel clown who swoops in with a joke at random times :)

16:49 bbloom: pjstadig`: i only pay attention to IRC with like 1/4th of my brain power when i'm slacking off

16:49 jkj: oops.. baz

16:49 futile: Anyone know of a way to get keyword-destructuring in -main that works with cmd line args (which are strings like ":foo")?

16:50 pjstadig`: futile: you would do something like {:strings ["foo"]}, but only if the string didn't have a colon in the front

16:50 futile: pjstadig`: are you sure you quote the strings?

16:50 pjstadig`: err

16:51 {:string [foo]}

16:51 futile: Because this is what I had before:

16:51 {:strs [-runner -reporter]}

16:51 justin_smith: OK, nrepl is much better, 80 pages of garbage text, but the repl below that is still usable

16:51 futile: Which was actually really pretty in the Clojure side of things.

16:51 pjstadig`: haha or that

16:51 futile: But the convention for lein things is to use :runner or :reporter

16:51 So I'm trying to get it to do that.

16:51 pjstadig`: i think you'd just have to parse the keyword

16:51 futile: :'(

16:51 Destructuring was a really cool way to do this.

16:52 pjstadig`: futile: what does lein do?

16:52 futile: pjstadig`: you're not familiar with leiningen?

16:52 pjstadig`: oh I think you said you were new to Clojure the other day, right?

16:53 pjstadig`: use leiningen for clojure stuff, it's super easy

16:53 tomjack: what core lein tasks even take keyword args?

16:53 `lein deps :tree` doesn't exactly count

16:53 futile: tomjack: technomancy told me most lein things do, and it's the way to move forward

16:54 tomjack: and he wrote lein so I'm pretty sure he gets to decide that :)

16:54 tomjack: I believe it, I'm asking which core tasks do it

16:54 futile: o

16:54 uh

16:55 pjstadig`: futile: haha. no. i've been using clojure since like 2009. what I meant was "go look at the leiningen code, it's on the internets"

16:55 futile: pjstadig`: oh

16:55 pjstadig`: touche :)

16:55 pjstadig`: :)

16:55 tomjack: oh repl

16:55 kinda

16:56 futile: Hm, I think I have a better way.

16:56 Just create a new map by mapping the vals with load-string, then do destructuring on the keywords :)

16:57 Not as simple as this, but hey, whatever.

16:57 mpenet: tomjack: lein test takes keywords too

16:57 tomjack: whoa I never noticed load-reader or load-string

16:57 I think you want read-string though

16:58 futile: Given [":foo" "A" ":bar" "B"], what's the best/coolest/cleanest/awesomest way to get {:foo "A" :bar "B"} ?

16:58 pjstadig`: loading is for code

16:58 tomjack: mpenet: thanks, looks like there is a (map read-string) in there

16:59 pjstadig`: you would probably want is clojure.edn/read-string

16:59 futile: Maybe I do but probably not. And if so, then later.

16:59 tomjack: the "A" will read as a symbol

16:59 which I think is correct for your use case

16:59 since the option values are namespaced symbols pointing to vars?

16:59 futile: tomjack: Not on every thing though, no.

17:00 Actually maybe, yeah.

17:00 tomjack: ,(apply hash-map (map read-string [":foo" "A" ":bar" "B"]))

17:01 clojurebot: {:foo A, :bar B}

17:01 futile: Don't even need apply hash-map with destructuring :)

17:03 tomjack: ,(->> [":add" "+" ":subtract" "-"] (map read-string) (map #(%1 %2) (cycle [identity resolve])) (apply hash-map))

17:03 clojurebot: {:subtract #'clojure.core/-, :add #'clojure.core/+}

17:03 tomjack: hmm

17:05 futile: ,(let [{:keys [foo bar]} [:foo 'a :bar 'b]] (prn foo bar))

17:05 clojurebot: nil nil\n

17:06 futile: ,(let [{:keys [foo bar]} [:foo 'a :bar 'b]] [foo bar])

17:06 clojurebot: [nil nil]

17:06 futile: I'm confused.

17:06 tomjack: &(let [[& {:keys [foo bar]}] [:foo 'a :bar 'b]] [foo bar])

17:06 lazybot: ⇒ [a b]

17:06 futile: Oh right.

17:06 :)

17:07 tomjack: http://stackoverflow.com/a/16602869/1306817

17:08 futile: Thanks tomjack

17:11 So technically when I pass `lein whatever :foo a :bar b` I get [':foo 'a ':bar 'b], all symbols

17:11 Oh.

17:13 tomjack: eval is a noop on keywords, so dually so is quote

17:13 s/noop/identity/

17:14 futile: Right. What I almost want is (map load-string opts)

17:14 tomjack: read-string, not load-string, I'm pretty sure

17:14 futile: Well that just gives me a symbol, not a keyword.

17:14 Right?

17:14 tomjack: &(class (read-string ":foo"))

17:14 lazybot: ⇒ clojure.lang.Keyword

17:14 futile: Oh. Man.

17:15 You were right all along.

17:15 * futile is crazy.

17:16 tomjack: I don't suppose people should be allowed to do `lein test2 ":runner foo"` right

17:16 (cus read-string will just return :runner and drop the foo)

17:16 futile: Right.

17:16 I don't know what crazy error I saw before, but this was one big cluster of me misreading my errors.

17:17 Solved.

17:19 tomjack: https://github.com/evanescence/test2/blob/master/src/test2/run.clj#L40 :)

17:21 dsop: is there anyo good combination to replace lein-swnak + slimv on vim

17:21 Glenjamin_: i believe fireplace is the latest vim clojure environemnt

17:21 dsop: kk thx

17:22 i\ll check it out

17:24 futile: I used to use vim. Then I took an arrow in the knee.

17:25 tomjack: futile: cool

17:27 futile: tomjack: thanks :)

17:27 for your help

17:30 tomjack: :pending? is weirdly consistent :)

17:31 futile: tomjack: that's an odd remark

17:31 tomjack: it always bugs me when I write `:throw-exceptions? true` or whatever and it's actually `:throw-exceptions true` because grr

17:31 but hadn't noticed that common ^:foo style is inconsistent in this regard

17:32 futile: tomjack: hehe

17:32 tomjack: (but really, I would rather write ^:pending, despite the inconsistency)

17:32 futile: Just released new version of test2 and test2-autorunner.

17:33 The default reporter needs some work admittedly.

17:33 But it works, it's fully usable for writing tests.

17:33 tomjack: Hm, I thought I made the key of test-results :pending? and the var-metadata key :pending

17:34 tomjack: they should be different, but it's admittedly a little confusing.

17:34 tomjack: fixed the spec, thanks for pointing that out :)

17:34 tomjack: https://github.com/evanescence/test2/blob/master/src/test2/api/runners.clj#L10

17:35 futile: tomjack: fixed that file, thanks for pointing that out :D

17:35 blast, new release needed now.

17:36 tomjack: heh

17:37 futile: okay, just released new versions :)

17:38 btw this is what that whole if-and thing was meant to clean up: https://github.com/evanescence/test2/blob/master/src/test2/api/runners.clj#L13-L15

17:39 arohner: can someone remind me what the syntax is to get the local variables in a macro is?

17:40 tomjack: (keys &env)

17:40 (on the jvm)

17:40 arohner: thanks

17:42 tomjack: futile: what if e.g. linear-runner was named just linear, and the :runner arg supplied test2.default.runner as a default ns for unqualified symbols, for `lein test2 :runner linear`?

17:43 also are you interested in patches for async tests? thinking I may give test2 a shot for playing around with that

17:43 or it could be a separate library I guess and more verbose than `:runner async` :)

17:44 ..really it must be a separate library at this point

17:47 futile: tomjack: hmm..

17:49 tomjack: as for unqualified syms having a default of test2, not sure that's a common enough use-case

17:49 tomjack: mostly people will have custom runners etc just live in :aliases in project.cls, they wont usually type it on the cmd line i bet

17:49 tomjack: yeah, makes sense

17:49 futile: tomjack: and yes im very interested in patches and such

17:49 tomjack: ignore my async question, it doesn't make sense

17:50 futile: tomjack: yeah try making a custom runner that runs them simultaneously, that'd be a neat extension

17:50 tomjack: I was thinking a callback-based async runner and async-run-test-fn could go in test2 but I don't like that at all

17:50 I'm more interested in test-fns that are themselves async

17:50 i.e. that may make assertions after returning

17:50 futile: tomjack: within them? that sounds odd

17:51 tomjack: yeah it's pointless on the jvm but necessary for js

17:51 futile: tomjack: oh, for testing async code?

17:51 tomjack: hmm, i never thought of that use-case.

17:52 bbloom: futile: oh boy. you're in for a rabbit hole!

17:52 futile: bbloom: never!

17:53 im not gonna touch that problem.

17:53 its probably hard enough with existing testing libs, let alone one thats just starting out

17:53 bbloom: futile: at minimal, you should consider timeouts

17:53 futile: and timing in general

17:53 the results schema should include timing data

17:53 futile: insert joke here about any of the other meanings of time out

17:53 bbloom: ah yes, very good point. i remember seeing that in test.generative

17:54 Most of the SPEC is finalized in the sense that it won't change, although things may be added to it (mainly for reporting), which is thankfully fully backwards-compatible.

17:54 bbloom: futile: if you have one test that gets stuck in an infinite loop, you don't want to fail the whole test suite

17:54 futile: There's one more thing we *may* need to change about the spec, namely allowing runners to know about "around-all"-style fixtures

17:55 bbloom: futile: is SPEC some acronym that i don't know about? why do you keep capitalizing it?

17:55 futile: bbloom: i cant see any way the test suite can reasonably move past an infinite loop inside a test

17:55 bbloom: because im dumb

17:55 spec. there.

17:55 :)

17:55 bbloom: futile: timeouts.

17:55 futile: bbloom: timeouts exist in java? hmm.

17:55 never heard of it til now.

17:55 (btw ive never used java before and im new to clojure)

17:56 (sorry for not disclosing that up front)

17:56 kwertii: Is it possible to (easily) do a prepared statement like ["SELECT * FROM foo WHERE id IN ?" [1 2 3]] with java.jdbc?

17:57 bbloom: futile: java has a full concurrency model. so yes, it has timeouts

17:57 futile: it's a feature of a runner for whether or not it supports timeouts, but the results format needs to support it

17:59 futile: bbloom: very good point.

18:00 tomjack: ultimately I wonder if the interface should be a channel of assertion-results

18:00 futile: tomjack: Hmm. What problems does that solve?

18:01 bbloom: futile: incremental reporting?

18:01 tomjack: makes async tests possible without replacing chunks of test2, and allows implementing sync tests in terms of the one async interface

18:01 also would mean the barebones interface is no longer simple for sync tests..

18:01 futile: bbloom, tomjack: I was thinking of the spec enforcing lazy-sequences being given to the reporter for that reason.

18:01 I think that might solve these things.

18:03 mthvedt: futile: what do you mean by enforcing? will seqs be required to be lazy?

18:03 tomjack: actually the interface could be the same from the user's perspective since you've got that ref in there :)

18:04 futile: mthvedt: I'm wondering if it should

18:04 tomjack: it's an atom now

18:04 mthvedt: futile: requiring a seq be lazy seems nonfunctional

18:05 tomjack: I should say "reference"

18:05 futile: tomjack: oh

18:08 tomjack: if I need a custom asserter, I also have to rewrite test2.expect?

18:09 rasmusto: is/should there be an as->> macro? I find as-> hard to use when I'm using ->> threading

18:10 bbloom: (doc as->)

18:10 clojurebot: "([expr name & forms]); Binds name to expr, evaluates the first form in the lexical context of that binding, then binds name to that result, repeating for each successive form, returning the result of the last form."

18:10 bbloom: rasmusto: hmmm maybe?

18:10 i didn't realize that as-> actually also does threading, i thought it just assigned a name

18:11 rasmusto: ,(-> 2 (as-> myval (+ 3 myval)))

18:11 clojurebot: 5

18:11 rasmusto: ,(->> 2 (as-> myval (+ 3 myval)))

18:11 clojurebot: #<Exception java.lang.Exception: Unsupported binding form: (+ 3 myval)>

18:11 futile: tomjack: I'm hoping to move more of it into a set of common functions in test2.api.asserters

18:11 rasmusto: the 2 gets threaded as the last form in the as->, so it doesn't get bound

18:11 tomjack: it doesn't do threading

18:11 bbloom: tomjack: ok yeah that's what i thought

18:12 i think the -> part of as-> is just b/c there wasn't anything better to put there :-P

18:12 tomjack: rasmusto: you want ([name ...forms... expr])?

18:13 bbloom: it's basically (unthread-current-value-as x …)

18:13 tomjack: maybe it should be <-as

18:13 bbloom: eh.

18:14 tomjack: the similarity to -> looks nice when used together

18:16 rasmusto: yeah, something like that

18:17 (->> 2 (as->> myval (+ 3 myval))), where as->> takes the 2 as the last arg, yeah

18:18 maybe it's tough because "forms" could be arbitrarily long

18:20 -><-

18:20 tomjack: I wonder how evil this is https://www.refheap.com/0dae77a177a0ec49a8ab74348

18:21 er, https://www.refheap.com/a67de769d2dde8640d4e05de5

18:22 (stale [x] succeed)..

18:22 rasmusto: well it's a macro so

18:23 (defmacro as->> [name & args] (let [forms (butlast args) expr (last args)] `(as-> ~expr ~name ~@forms))) ?

18:26 rasmusto: tomjack: I'll check it out

18:30 tomjack: maybe that's what flip should mean in clojure

18:31 rasmusto: tomjack: what's that?

18:31 tomjack: (defn flip [f] (fn ... ([a b c] (f c a b)) ...))

18:31 patchwork: Hmm… has anyone had issues pushing to clojars with lein-clojars using the latest lein?

18:32 tomjack: probably not

18:32 (patchwork: ..not responding to you)

18:32 rasmusto: tomjack: ah, I've used a "rotate" function on sequences a few times

18:32 I dunno what use cases something like that would have

18:33 besides my terrible code

18:33 (not saying that flip is terrible)

18:33 tomjack: oh good name

18:34 (lens/update-in f [:args] rotate) if we had a lens on fnargs

18:34 futile: Trying lein-push out.

18:35 rasmusto: ,(concat (drop 2 [1 2 3]) (take 2 [1 2 3]))

18:35 clojurebot: (3 1 2)

18:35 rasmusto: ,(concat (take-last 2 [1 2 3]) (drop-last 2 [1 2 3]))

18:35 clojurebot: (2 3 1)

18:36 patchwork: Suddenly it looks like lein is putting the jar in target/provided/*.jar

18:36 but lein-clojars expects it to be in /target/*.jar

18:36 WTF?

18:36 rasmusto: I guess I should modulo "2" with count of the collection or something

18:36 amalloy: rasmusto, tomjack: when i was new to clojure i wrote https://github.com/amalloy/hot-potato, which is a way to fiddle with parameter ordering, eg via flipping and rotating

18:36 tomjack: grr, I want (vector? (comp (comp #(mod % (count a-vector)) inc) a-vector))

18:37 amalloy: i don't really ever use it, but it's probably interesting reading

18:37 tomjack: rather (vector? (comp a-vector (comp #(mod % (count a-vector)) inc)))

18:37 futile: Dang. lein-clojars looks in ./target/ for the jar, not ./target/provided/ where it really is.

18:37 patchwork: futile: That is what I'm saying

18:37 tomjack: (comp a-vector #(mod % (count a-vector)) inc) ?

18:37 rasmusto: amalloy: cool, I'll give it a read

18:37 amalloy: patchwork: the announcement for latest lein said that it moved the target/ dir

18:37 futile: patchwork: oh hey, you're doing the same thing as me!

18:38 amalloy: and that you can go back to the previous behavior if you want. i'd say, read the patch notes

18:38 futile: patchwork: which makes sense since I started doing it when I saw you say it.

18:38 tomjack: amalloy: cool

18:38 patchwork: amalloy: Sure, but that breaks lein-clojars

18:38 tomjack: I had something a bit like that but I don't like referring to args by index

18:38 patchwork: Alright, I'll read the patch notes...

18:39 futile: patchwork: yeah I'll read too.

18:39 tomjack: considered something like (reorder map [f coll] [coll f]) but then I just threw my hands up

18:39 futile: I'm running into the problem of wondering how to test my testing lib.

18:40 patchwork: Has clojars become deprecated?

18:40 futile: I half want to start writing tests using the lib itself.

18:40 But that means I either have to port the old tests, or start running 2 side-by-side test suites.

18:40 And porting the old tests means not being able to verify that the tests even run anymore.

18:40 Hmph.

18:40 amalloy: patchwork: i don't know what lein-clojars is, but lein has had built-in deploy-to-clojars functionality since 2.0

18:40 futile: Hmm

18:40 amalloy: oh!

18:41 amalloy: oh but dont you need to sign with gpg or something for that to work?

18:41 amalloy: since I don't want to deal with gpg, I just do lein do pom, jar, and scp...

18:41 patchwork: amalloy: Got it. Been using lein-clojars since the lein 1.0 days

18:41 amalloy: generally, it's not phil's problem if some random plugin breaks because it was depending on the implementation-defined file layout

18:41 patchwork: didn't realize it had been deprecated

18:41 rasmusto: pomjarscp sounds like a flavor of sorbet

18:42 amalloy: futile: i did that for ages. i recommend at least trying the gpg route

18:42 futile: amalloy: k, will try. thx

18:42 bbl

18:42 amalloy: you don't have to sign your jars, either, but you do need to use gpg to encrypt your clojars credentials, so at that point you might as well just sign the jars

18:43 patchwork: Did clojars get hacked or something? That seems like a lot of new security...

18:44 r0bgleeson: patchwork: i don't know but other OSS package managers have been hacked where a signed package would have helped

18:54 amalloy: patchwork: it didn't, as far as phil was able to determine

18:54 signing jars is something he was already strongly urging people to do, before the latest rubygems fiascos

18:55 and it's still just as optional as it was before that, but it's recommended

18:55 patchwork: amalloy: Got it

18:55 It is good practice

18:55 maybe this will finally motivate me to get gpg set up

18:58 technomancy: patchwork: the hosting provider clojars uses got compromised, but we have no evidence that the VPS instance hosting clojars itself was infiltrated

18:58 but rubygems.org got hacked not too long ago and they are feeling the pain of not having bothered to do signing

18:58 npm had a huge password leak not that long ago

18:59 so far we've been lucky

18:59 patchwork: technomancy: Got it, good to know

18:59 technomancy: best not to assume we'll continue to be lucky =)

18:59 callen: technomancy: npm was pretty incompetently setup.

18:59 technomancy: callen: granted

18:59 patchwork: GPG it is!

19:00 technomancy: callen: I had no idea linode used coldfusion; it's depressing how you can do everything right yourself and still get bitten by others' screw-ups.

19:00 s/depressing/sobering/

19:02 SegFaultAX: CFM was a joke when it came out. The only company of note that used it (that I'm aware of) was MySpace. I basically hadn't heard anything /at all/ about it for the last couple of years and now I'm hearing about it all over.

19:02 Is it making a comeback or something?

19:02 technomancy: I don't think so

19:02 SegFaultAX: Well, that's maybe an over statement. I've seen a number of banks use it.

19:02 technomancy: my university used it back in 04 but I think they've escaped

19:03 SegFaultAX: I'm pretty sure seancorfield is also a CFM hacker.

19:03 Or at least he's tweeted about it.

19:03 callen: technomancy: facebook is PHP. *shrug

19:03 r0bgleeson: not anymore

19:04 i bet a lot of PHP has been replaced

19:04 SegFaultAX: r0bgleeson: After the amount of time they've spent on HH and HHVM? I doubt it.

19:05 r0bgleeson: yeah, HHVM is interesting, but from what I've heard (this is just chats over beer) a lot of facebook has moved over to services & the frontend is just PHP

19:05 SegFaultAX: r0bgleeson: If you're talking about backend services then yea, its been that way for a while.

19:06 r0bgleeson: But they still have tens of millions of lines of PHP in prod.

19:07 tomjack: holy crap

19:08 callen: Facebook might be the winners of "most impressively engineered ball of spaghetti" award.

19:08 r0bgleeson: lol

19:08 SegFaultAX: callen: It ain't easy building one of the most highly visited sites on the planet.

19:09 seancorfield: SegFaultAX: CFML? yup, been doing a lot of that over the last decade alongside everything else...

19:09 r0bgleeson: yeah. that's what makes it more remarkable.

19:09 they did that in PHP

19:09 and in started on PHP3/4 probably?

19:09 SegFaultAX: r0bgleeson: Except they had to build a transpiler and a VM to make it work. :)

19:09 r0bgleeson: crazy

19:09 SegFaultAX: rodnaph_: That's arguably not /just/ PHP anymore.

19:10 nightfly: what is it transcompiled to?

19:10 r0bgleeson: C++

19:10 they've decided to build a VM instead now

19:10 supersym: fb uses erlang too, backend anyway

19:10 SegFaultAX: For chat

19:10 supersym: oh k

19:11 SegFaultAX: supersym: Not surprising since the most popular jabber server is Erlang.

19:11 supersym: yes that would make it a lot easier :)

19:12 seancorfield: Adobe has had a very poor record with security since they took over ColdFusion from Macromedia... but I don't use that, I use Railo instead

19:13 r0bgleeson: Macromedia

19:13 flashblack to the past

19:13 SegFaultAX: seancorfield: Are you like one of those COBOL developers that can charge whatever they want for their services since theres like 10 peole still alive who actually /know/ COBOL... but with CFML

19:13 seancorfield: Railo is a JBoss community project that provides a fast free open source implementation of CFML https://issues.jboss.org/browse/RAILO - and hasn't had the security leaks that ColdFusion has suffered

19:13 callen: SegFaultAX: of course not, it's even harder when you exercise very little engineering discipline.

19:13 seancorfield: r0bgleeson: I was Macromedia's Senior IT Architect for six years... go figure :)

19:14 callen: SegFaultAX: I used to port COBOL...I didn't get paid much ;_;

19:14 seancorfield: I ported COBOL compilers :)

19:14 r0bgleeson: seancorfield: cool, you built some cool stuff i played around with as a teen

19:14 iirc, fireworks

19:14 callen: seancorfield: yeah, that's essentially what I was doing. At the tools level.

19:14 seancorfield: I did most of my work on the data side though.

19:14 seancorfield: I was never in the product division, although I did do some work on the AS3 compiler / runtime test suite

19:14 callen: seancorfield: I'm pretty sure I was getting billed out at $200/hour at the time.

19:15 SegFaultAX: seancorfield: Oh man, I fricken /loved/ Flash 4/5/MX

19:15 seancorfield: I ported Microfocus COBOL to the SPARC chipset (it became Sun COBOL 1.0 :)

19:15 callen: I think the highest I got was $175/hr for CFML stuff

19:16 SegFaultAX: seancorfield: Contract or ft?

19:16 seancorfield: But, yeah, back to security, Adobe has had a number of very high profile exploits for ColdFusion, mostly around 3rd party software they've integrated and not locked down properly (such as file uploaders)

19:16 callen: SegFaultAX: http://izbicki.me/blog/hlearns-code-is-shorter-and-clearer-than-wekas

19:16 seancorfield: SegFaultAX: contract! I wish I could make $175/hr FT! :)

19:17 callen: SegFaultAX: lol, Etsy implemented another monitoring stack. No wonder they need 100+ engineers.

19:17 seancorfield: And ColdFusion was never designed properly for shared hosting setups :(

19:17 callen: you can get rid of the last bit

19:17 SegFaultAX: seancorfield: Heh, that's why I asked. 175 isn't bad, but not particularly higher. I would have figured you could get whatever you wanted. Don't imagine there are many people bidding on CFML jobs.

19:17 callen: "ColdFusion was never designed properly"

19:17 SegFaultAX: callen: I know, haha. I saw that.

19:17 seancorfield: Railo is much better there since it leverages the Java web app security stuff (which ColdFusion instead works really hard to circumvent)

19:18 SegFaultAX: seancorfield: Adobe CFML still active?

19:18 seancorfield: SegFaultAX: most CFML contractors get $50/hr if they're lucky...

19:18 SegFaultAX: callen: In their blog, they said they have > 250k metrics. Just wow.

19:18 seancorfield: SegFaultAX: Yeah, Adobe released v10.0 a year or so back with v11.0 coming late this year or early next

19:18 callen: SegFaultAX: variables?

19:18 supersym: earlier this week, while doing a little pentesting, was a cf10 server actually... read 9/10 admins havent even patched for the latest breach :S

19:19 papachan: somebdoy change #clojure channel to #coldfusion

19:19 supersym: 'nuf said

19:19 callen: SegFaultAX: I'm not sure I believe them that they're digesting or leveraging that.

19:19 seancorfield: hahaha... there is a ##coldfusion chanel if you ever want to discuss it in the proper place!

19:19 SegFaultAX: callen: Seriously. That's fucking insane.

19:19 callen: SegFaultAX: sounds like data masturbation to me.

19:19 "LOOK AT HOW BIG OUR BIG DATA IS"

19:19 (we're so sophisticated. srsly)

19:19 SegFaultAX: seancorfield: We should get lunch. I'd love to pick your brain :)

19:20 callen: SegFaultAX: he's a nice guy. He won't harm you.

19:20 seancorfield: are you still doing those meetups in SF?

19:25 seancorfield: indeed, although I was too busy with work to make the last one

19:26 next SF meetup is Aug 1st, next dojo is... june 25, next san mateo meetup is june 20

19:27 then july 18 in san mateo, dojo in SF july 23

19:27 SegFaultAX: where are you based? same for you callen ?

19:27 SegFaultAX: seancorfield: He's in MV, I'm in the east bay.

19:28 callen: seancorfield: I went to one of the meetups at weatherbill, I brought the other biker dude and got peoples' Emacs+Clojure setups working.

19:28 seancorfield: mostly by cheating and having them clone my dotfiles repo. lol.

19:28 SegFaultAX: seancorfield: Familiar with Walnut Creek/Lafayette area?

19:29 seancorfield: I'm in Castro Valley so, yeah, you're just 680 from me

19:30 callen: I think I remember - that was ages ago!! We've been in the new Climate offices on 3rd St for *ages*

19:30 callen: seancorfield: I've been putzing around for ages. *shrug*

19:30 SegFaultAX: seancorfield: In SF?

19:30 callen: SegFaultAX: I was converting more souls to the Church of Emacs.

19:31 SegFaultAX: you willl conveeerrrrt....

19:31 seancorfield: well, my contact details are on http://corfield.org/resume if you wanna hang out some time...

19:31 Bay Area meetups: http://www.meetup.com/The-Bay-Area-Clojure-User-Group/

19:33 callen: seancorfield: how familiar are you with the request/thread semantics of Jetty vs. Aleph/Httpkit?

19:34 ztellman: callen: what do you need to know?

19:34 callen: oh dear, the wizard of oz is here.

19:35 grabbing code, h/o

19:35 ztellman: https://github.com/bitemyapp/neubite/blob/master/src/neubite/middleware.clj Pretty sure this only works due to request per thread in a standard Jetty container

19:35 ztellman: how do I make this play nice with the other children if I'm looking at a thread worker pool + async such as I think Aleph does?

19:36 is the setup/takedown middleware enough?

19:36 seancorfield: callen: heh, i'll happily defer to someone who knows...

19:36 callen: I've been dying for somebody that would know the answer to this *_*

19:37 ztellman: callen: I can't speak to http-kit, since last time I talked to the author he seemed skeptical that thread affinity was useful

19:37 * callen expectantly waits for the other shoe to drop

19:38 ztellman: sorry, got pulled away for a sec

19:38 callen: np

19:38 I've been bugging people about this for at least a couple of weeks.

19:38 ask Raynes :P

19:39 SegFaultAX: Ugh, I feel bad. I accidentally revived a post in the mailinglist from 2008 because I misclicked. :(

19:40 And now people are responding to it even though I deleted it.

19:40 ztellman: so if you buy all the way into my world of code, bindings are conveyed by pipelines if you add :with-bindings? to the options

19:40 callen: SegFaultAX: mailing lists are so wonderful like that

19:40 ztellman: you can get a similar mechanism using bound-fn around any callbacks you register in the original context

19:41 callen: ztellman: bound-fn was the main solution I was eyeballing.

19:41 ztellman: thought clojure's bound-fn is needlessly slow

19:41 though*

19:41 callen: ztellman: I feel like I should double-check libnoir isn't guilty of the same flaw.

19:41 I'm not sure my time scale for "slow" is the same as yours ;)

19:41 ztellman: https://github.com/ztellman/potemkin/blob/master/src/potemkin/macros.clj#L56

19:42 tomjack: does that one also work synchronously?

19:42 I mean with a synchronous executor

19:42 or did I misremmeber that problem

19:43 ztellman: tomjack: the issue with synchronous executors is when you throw transactions into the mix

19:43 the actual behavior seems to have shifted a bit since I reported the problem, it happens with all transactions now

19:43 tomjack: I see

19:44 ztellman: binding conveyance with agents et al was kind of broken, the last time I checked, it never cleans up

19:44 tomjack: oh right

19:44 amalloy: btw, ztellman, you don't actually need the ~' in https://github.com/ztellman/potemkin/blob/master/src/potemkin/macros.clj#L73 and similar places. the compiler just looks at (= (name sym) '&), and namespaces get ignored

19:44 tomjack: I was confused because I thought bound-fn was using hacks to be fast

19:44 but it's the private one

19:44 ztellman: so the bindings that are conveyed just kind of stick around in whatever thread pool it executes in

19:45 tomjack: yeah, the private one has poor hygiene

19:45 amalloy: since when? I got in the habit of doing that a while back, I could swear it complained to me

19:45 amalloy: ztellman: i'm sure as far back as 1.3, and i think 1.2; 1.1 and below is outside my experience

19:45 ztellman: tomjack: fast-bound-fn actually restores the original threadlocal context

19:46 callen: that's pretty sweet.

19:46 ztellman: amalloy: TIL

19:46 amalloy: it seems a little strange, until you realize the compiler is doing the same thing in, eg, deftype and reify: `(reify Foo (blah [this#] this#)) works fine, even though it's actually (my.ns/blah [this#] this#)

19:47 tomjack: I'm guessing core.async's binding conveyance must be even slower

19:47 ztellman: tomjack: I haven't been following it too closely, I couldn't say

19:47 amalloy: (i, too, used ~'& for a long time, just assuming that it would break otherwise)

19:48 callen: ztellman: anyway, thanks for poking at my question. Much appreciated.

19:51 ztellman: callen: short answer is: don't do asynchronous stuff unless you have to

19:52 callen: ztellman: oh yeah, that's the answer I'd settled on, but I've got bound-fn slotted in the back of my head if I feel like coming up with a more robust solution.

19:59 patchwork: Alright, I set up gpg according to the lein docs (encrypted and decrypted some messages) but now when I run % lein deploy I get this:

19:59 gpg: can't query passphrase in batch mode

19:59 batch mode?

19:59 How do I deploy without batch mode?

20:00 technomancy: patchwork: typically the passphrase is handled by gpg-agent

20:01 unfortunately I don't know much about setting it up; it just works out of the box on debian

20:01 but there's a `lein help gpg` guide that might have some good pointers

20:01 patchwork: technomancy: I went through the guide

20:01 Are you saying I can't use % lein deploy without gpg-agent?

20:02 technomancy: patchwork: no, just that IME gpg-agent is the easiest way

20:02 are you on OS X?

20:02 patchwork: technomancy: Yeah

20:03 Everything is set up according to the docs, but I still get gpg: can't query passphrase in batch mode

20:03 bummer

20:03 I tried to install gpg-agent

20:03 technomancy: do you have a credentials.clj.gpg file?

20:04 patchwork: but brew installs gpg-agent 2.0 and gpg 1.4

20:04 technomancy: we have --batch mode specified for reading credentials, but not for signing jars

20:04 patchwork: technomancy: Yeah

20:04 I made the credentials.clj.gpg using gpg

20:04 (encrypted it I mean)

20:04 technomancy: ok... you do not want to use credentials.clj.gpg without gpg-agent

20:04 because then you would have to enter your passphrase for every dependency resolution run

20:05 but you can still use gpg for signing without using it for creds

20:05 patchwork: technomancy: Aha… really? So how do I specify credentials without using credentials.clj.gpg?

20:05 technomancy: do you have full-disk encryption?

20:05 patchwork: technomancy: NO

20:06 *No

20:06 (did not mean to yell!)

20:06 technomancy: heh

20:06 ok, so you should not store your credentials unless you either set up full disk encryption or gpg-agent

20:06 Raynes: Installing gpg stuff with brew is blech.

20:06 technomancy: but until you get that figured out you can just enter your password when you deploy

20:06 patchwork: I encrypted the credentials with gpg so shouldn't that be enough?

20:07 technomancy: patchwork: the problem is that gpg-encrypted credentials are read for every dependency resolution

20:07 right now lein doesn't have a separate for deploy creds vs fetch creds

20:07 patchwork: Sure, but it should still work right?

20:07 Raynes: http://macgpg.sourceforge.net/

20:07 patchwork: If I want to enter my passphrase every time?

20:08 technomancy: patchwork: no, because we have the creds decrypted with --batch

20:08 patchwork: technomancy: I understand what you are saying, but in principle it should still work

20:08 Okay

20:08 technomancy: which assumes gpg-agent is set up

20:08 patchwork: So gpg-agent is required then

20:08 technomancy: in your case entering your clojars password when doing the deploy is probably your best bet

20:08 better the entering your passphrase every time you launch lein repl

20:09 we should probably have separate files for deploy-only creds

20:09 patchwork: Possibly you can clarify in the setup that people should be using gpg-agent, it makes it seem like that is optional

20:10 I don't mind entering my passphrase

20:10 technomancy: it's optional, just not for credentials.clj.gpg

20:10 if you are using full-disk encryption then credentials.clj.gpg isn't necessary

20:10 patchwork: technomancy: Hmm… so either full-disk encryption or gpg-agent is required

20:10 technomancy: or if you enter your clojars creds on each deploy

20:11 patchwork: Hmm… that is a step backwards from the lein-clojars approach

20:11 where I could just say % lein push and it worked

20:12 technomancy: well... if your OS has good SSH support but not good GPG support, sure

20:12 patchwork: So basically I should be using linux then?

20:12 That seems like an extreme fix for my issue : )

20:13 technomancy: or windows, where it's a pain either way =)

20:13 anyway, secret storage is orthogonal to signing

20:13 using gpg to sign artifacts is not bad even without the agent, because deploys don't happen that often

20:15 but yeah, not many of the lein contributors use OS X, so we don't have a lot of people feeling that particular pain point

20:15 Raynes: tomjack: Are you tomoj?

20:15 patchwork: Didn't realize

20:15 I get the impression many clojure devs use OSX

20:15 At least, all the ones I've met do

20:16 Raynes: tomjack: amalloy and I are having a debate about whether you are the same person as him at the work.

20:16 technomancy: I hacked out initial support that assumed gpg just worked everywhere like it does on debian an there was a pretty huge backlash initially =\

20:16 Raynes: at work*

20:16 patchwork: So this is basically an experimental feature

20:16 tomjack: yep that's me

20:16 technomancy: patchwork: well the initial backlash was about an earlier rev that made a lot more assumptions

20:17 patchwork: my advice would be to punt on secret storage for now

20:17 getting gpg working just for signing is a great first step

20:18 patchwork: Okay, I guess I didn't see the part that just shows how to sign

20:18 the tutorial goes through setting up lein with gpg

20:18 to use them in conjunction

20:18 technomancy: hm; yeah we should probably clarify the distinction there

20:18 it's just coincidental that they both use gpg

20:18 patchwork: How do I sign a jar with gpg?

20:18 technomancy: the secret storage stuff should really be replaced with os-specific functionality, but that requires JNI

20:18 tomjack: .i le lojbo me mi cu morsi

20:19 technomancy: patchwork: `lein deploy clojars` should do it

20:19 patchwork: Yeah, doesn't seem to work yet

20:19 technomancy: hrm

20:19 patchwork: technomancy: Okay, so I just take out the .clj.gpg file and lein deploy clojars will work?

20:19 I see

20:19 What do I put for a value for the :creds key?

20:19 technomancy: patchwork: if you leave it out you should get prompted

20:19 try that first

20:20 SegFaultAX: Raynes: I really like the image you selected for Laser. :D

20:20 Raynes: technomancy ^

20:20 tomjack: Raynes: also tomoj.la expired..

20:20 Raynes: He suggested it iirc.

20:21 technomancy: <3

20:21 * seancorfield thinks we should club together and buy technomancy a Mac and make him get it all working there so he can document it for the rest of us :)

20:21 tomjack: now I'm at tomjack.co

20:21 SegFaultAX: Well both of you <3

20:21 Raynes: seancorfield: Windows machine.

20:21 technomancy: seancorfield: they don't pay me enough

20:21 Raynes: I think Windows is much worse off.

20:21 patchwork: It failed with ReasonPhrase: forbidden

20:21 seancorfield: oh, that would just be mean

20:21 Raynes: seancorfield: I thought you were the advocate for "Meh, Clojure on Windows ain't hard."

20:21 patchwork: after asking for my GPG passphrase twice

20:21 and my clojars creds once

20:22 Wow, can't even deploy anymore!

20:22 Raynes: patchwork: You should reformat your harddrive and reinstall your operating system.

20:22 patchwork: This is going to be a problem

20:22 seancorfield: Raynes: that's so... but i still wouldn't inflict it on technomancy - at least mac os x is vaguely *nix-like :)

20:22 technomancy: patchwork: typo with the clojars password?

20:22 hyPiRion: Raynes: Clojure on Windows ain't hard. Just install a linux distro, then you're ready to go

20:22 technomancy: patchwork: have you done HTTP-based deploys before?

20:23 patchwork: technomancy: I have been doing deploys to clojars for almost two years now

20:23 using the lein-clojars plugin

20:23 Not a typo, just happened again

20:23 technomancy: patchwork: ok, so you can disable the signing just to rule it out

20:23 patchwork: Okay

20:23 technomancy: patchwork: :repositories {"clojars" {:url "https://clojars.org/repo" :sign-releases false}} I think

20:24 I think ReasonPhrase forbidden means clojars rejected your password but that's one way to make sure

20:25 patchwork: No, still asked me for my gpg passphrase

20:25 Wow

20:25 technomancy: so... the gpg guide doesn't actually cover credentials.clj.gpg

20:26 patchwork: https://github.com/technomancy/leiningen/blob/stable/doc/DEPLOY.md

20:26 Alright, have to go

20:26 justin_smith: aside, it is a great time for us all to be learning gpg

20:26 technomancy: right; I meant `lein help gpg` specifically

20:27 but yeah, I'll review the deploy guide too

20:27 justin_smith: if the rubygems breakin wasn't enough, prism is a nice object lesson in how you can never trust any system ever

20:28 hyPiRion: although you can trust one system over another

20:31 technomancy: http://tinyurl.com/lw8mnmw

20:31 callen: technomancy: I spent many of my earlier years hacking with X-Files or Star Trek TNG in the background.

20:32 technomancy: callen: I have a treat for you: http://sttngfashion.tumblr.com/

20:32 provided you haven't already read it

20:34 callen: technomancy: I have not seen this before

20:34 technomancy: consider it a gift

20:34 callen: technomancy: I'm already cracking up.

20:36 technomancy: "Then we have what appears to be two competing outfits, battling for supremacy on Dr. Brahms’ body. Will it be the surgical scrubs? Or the Days Inn bedspread? WHO WILL TRIUMPH?"

20:39 seancorfield: hmm, patchwork has gone... i was going to recommend the gpgtools for mac os x since that seemed the easiest way to get gpg-agent up and running...

20:47 noonian: homebrew has a formula for gpg-agent also

21:13 SegFaultAX: What are some good Clojure task/work queues. Something like Sidekiq/Redis/Celery in Ruby/Python. I've had a play with technomancy's Die Roboter, but it's unmaintained at this point.

21:15 trptcolin: SegFaultAX: i'd recommend a real message queue for anything serious. something like RabbitMQ, HornetQ, or others similar

21:15 using Redis as a message queue in production can be pretty scary

21:17 both rabbit & hornet have some pretty good-looking client libraries around them; i've only interop-ed w/ the java client libraries myself

21:28 seangrove: SegFaultAX: We're using resque right now, until we're fully migrated away from our legacy ruby workers

21:28 MongoCongo is supposed to be quite good if you're using MongoDB already

21:29 Ultimately we'll likely move to kestrel/storm

21:29 tomjack: dnolen: I'm don't really feel good about ties anymore. I sort of wonder if I really want to be able to implement my own binder types (putting chunks of syntax and semantics into types instead of big separate syntax and semantics relations), but I think that probably just indicates that I haven't figured out how to use the simple primitives yet, so I'm going to keep playing with just tie

21:29 Raynes: seangrove: You mean congomongo

21:29 ?

21:29 seangrove: Raynes: presumably :)

21:29 tomjack: in separate work I need a notion of definitional equality sort of analogous to the set example I gave for ties, it's either an abuse of unification or you need custom types which unify by definitional equality

21:29 seangrove: Ah, that doesn't look right at all

21:29 tomjack: the latter seems probably wrong, so I'm guessing ties with a set is an abuse of unification

21:30 seangrove: Just looks like a mongodb access layer

21:34 SegFaultAX Raynes: I meant https://github.com/circleci/congomongo-mq in this case, actually

21:37 callen: seangrove: use-case?

21:37 seangrove: SegFaultAX asked for task/work queues

21:38 callen: oh right.

21:38 seangrove: kestrel/storm are probably way overpowered for what he wants though.

21:39 seangrove: likey, yeah

21:57 callen: dsantiago: http://i.imgur.com/f7A12FW.jpg on the way home from the shelter.

21:58 ddellacosta: callen, cute! nice dog.

21:59 anyone know why fixtures aren't working w/clojurescript.test?

21:59 callen: ddellacosta: not my dog. pffft, I wish.

21:59 ddellacosta: I'm just nuts about pitbulls.

22:00 trptcolin: ddellacosta: yeah, i shaved that yak a bit, had a partial patch at one point

22:00 i should have reported it, sorry cemerick... it's to do with namespace munging

22:01 lemme dig up the workaround i was using

22:01 ddellacosta: trptcolin: so, not fully functional yet huh? I'm on 0.0.5-SNAPSHOT, and the fixtures I've registered just don't get called

22:01 trptcolin: cool, that'd be super helpful--thanks!

22:01 trptcolin: it's just the outer sugar that doesn't work as i recall

22:01 ddellacosta: trptcolin: huh, okay…so, something like calling register-fixture! directly will work perhaps?

22:01 trptcolin: that sounds familiar

22:02 ddellacosta: lemme give that a shot real quick

22:02 trptcolin: [i've since moved over to specljs, hence the bad memory and lack of patch-finishing]

22:03 ddellacosta: trptcolin: ah, okay…I'm still figuring out a good CLJS testing workflow, I'll have to check out specljs too

22:03 it's still mighty rough around the edges

22:04 trptcolin: ddellacosta: keep in mind i'm not sales-pitching it, yet; specljs has 2 particularly rough edges with spurious cljs warnings that we need to track down

22:05 ddellacosta: trptcolin: gotcha. Yeah, I suspect most everything is at a similar stage in CLJS, we are still in the early days of fine-tuning the tooling it would seem

22:05 trptcolin: yeah, something like (register-fixtures! ns-name :each fixture-name) is what i was using to work around

22:05 yep

22:06 ddellacosta: building out an actual production app has really exposed the missing bits, and given me more incentive to contribute

22:06 CLJS has so much potential, we just need to clean up some of this to make it easier to get going.

22:06 but I digress.

22:08 trptcolin: excellent, that last bit did it--thanks so much!

22:08 trptcolin: sure thing

22:10 yeah, and if you or anyone want to patch that, it's probably not a huge time sink - definitely ns munging tripping clojurescript.test up - my holdup was not fully understanding when nses actually *should* be munged, or really how to even use one or two of the features in clojure[script].test

22:11 ddellacosta: yeah, in fact, just looking at that now--I'll see if I can't get it working and post a patch

22:13 trptcolin: cool, yeah, looking at https://github.com/cemerick/clojurescript.test/blob/master/src/cemerick/cljs/test.clj - it was test-ns-hooks that i had no idea what they were

22:13 ddellacosta: I know that at some other place he talks about, if that is set, fixtures won't run, but I haven't read through all of it yet

22:35 tomjack: it would be really nice to be able to get a channel for a core.logic goal run

22:36 I always end up doing (distinct (l/run 1000 [x] (g x))) and it takes like a minute and then there's like 3 answers

22:36 if I could watch the answers come out I could just kill it when I'm satisfied

22:36 and presumably you could then pause execution and resume

22:41 futile: Let's do this.

22:43 trptcolin: thanks for reply, it's pretty awesome.

22:44 trptcolin: futile: my pleasure

22:45 futile: Yeah, what does "you're welcome" even mean, anyway? Welcome to what, or where?

22:45 And "any time" isn't really true. Not 3am I'm willing to bet.

22:46 trptcolin: probably not

22:46 futile: And "sure thing".. you can't promise that, what if you're stuck in traffic? Not so sure then.

22:46 trptcolin: whelp

22:46 futile: Language is weird.

22:47 ... but I love to digress.

22:53 Feeling torn about morals, is this project a wrong thing to do?

22:53 I mean, on one hand, it's a legitimately useful thing, and we would all benefit from it.

22:55 On the other hand, it's almost like spitting on the volunteered hard work of several individuals who are rightly insulted, offended, and hurt by it.

22:55 Why do all the projects I ever work on turn into exactly that dilemma? ...

22:55 ToxicFrog: Which project is this?

22:56 seancorfield: No project is the "wrong" thing to do. But don't take it personally if folks don't beat down your door to help.

22:56 futile: test2

22:56 seancorfield: not at all what I'm taking personally

22:56 seancorfield: I just meant it as general life advice :)

22:56 futile: Oh, good advice.

22:57 I'm questioning this project's existence from a moral perspective.

22:57 seancorfield: I've built tons of OSS projects over the years. Many have been met with indifference. Some have "taken off" big time. A few have been met with open hostility.

22:57 futile: Should it exist? I'd love to use it, and I'm pretty sure many people would benefit from it a lot too.

22:57 seancorfield: Scratching a personal itch is always good practice, in terms of producing OSS :)

22:58 callen: futile: the fuck are you talking about?

22:58 futile: callen: ...?

22:58 seancorfield: I think the SPEC part is a great idea. I think our tooling around test frameworks is pretty awful and a common results spec would be really valuable.

22:58 callen: futile: I mean, I'm skeptical of test2, but why would it be the wrong thing to do?

22:59 seancorfield is not the best example to follow in OSS, he's got more saintly patience than any of us. cf. the trolling we subjected him to with clj-time recently.

22:59 futile: seancorfield: right, that's what's implied by the spec. But it's also what's so hurtful to the authors of midje and speclj and expectations.

22:59 seancorfield: futile: it's not hurtful to say there's no commonality in test reporting :)

22:59 futile: seancorfield: you wrote clj-time? cool, thx bruh

22:59 callen: futile: with regards to expectations, it looks pretty cool, but I'm not surprised it doesn't have PRs or issues either.

22:59 seancorfield: callen: I'm so thick skinned, I don't even remember...

22:59 callen: seancorfield: the mixed plurals/singulars.

23:00 futile: seancorfield: "our tooling around test frameworks is pretty awful" is hurtful to those who wrote it with good intentions

23:00 callen: I think we've got a good bag of tools for testing, but there's a particular design niche of testing libraries that I think is under-served in Clojure.

23:00 futile: callen: TBH I thought it was dead considering all the tutorials were 3-year-old blog posts

23:00 seancorfield: futile: Oh no, I can't claim clj-time - I took it over from the original author and now I've managed to get Michael Klishin involved which is a big help for me!

23:00 callen: the real secret to OSS is Tom Sawyer.

23:00 futile: seancorfield: oh then un-thd

23:00 *un-thx

23:00 callen: what a terrible song

23:00 callen: futile: I was making a literary reference.

23:01 seancorfield: I didn't write java.jdbc either. I took that over from Stephen Gilardo. Although 0.3.0 is pretty much a complete rewrite...

23:01 futile: callen: what a terrible name for a book

23:01 seancorfield: I did write fw1-clj but no one uses that...

23:01 futile: jk

23:01 seancorfield: !

23:01 seancorfield: that's what got me into this trouble in the first place!

23:02 seancorfield: By tooling around test frameworks, I mean the displaying of results and the integration into IDEs etc...

23:02 callen: accessibility, marketing, and usefulness define a lot of what makes an open source project popular.

23:02 seancorfield: FW/1 for CFML is very popular :) That's why I ported it to Clojure...

23:02 futile: seancorfield: I decided to try rewriting my test suite to rely on a real running Postgres database, and when i used speclj's autorunner, it was out of open connections after like 3 re-runs

23:03 seancorfield: and i was using clojure.java.jdbc!

23:03 callen: futile: your postgres instance was misconfigured.

23:03 futile: seancorfield: turns out it was speclj's auto-runner's fault, it runs all tests in a new thread every time you change something

23:03 callen: and you weren't harvesting old connections.

23:04 futile: callen: i spent *hours* trying to debug that and everyone said my PG config was fine and my usage of JDBC was fine.

23:04 callen: futile: I spent hours trying to get you to check your PG config and read the docs to begin with.

23:05 seancorfield: sounds like you weren't closing a connection that you had opened... so i suspect you were opening the connection in one thread and using it in another?

23:06 callen: seancorfield: he just kept spawning new threads and wasn't harvesting anything.

23:06 seancorfield: I'd have to look at your exact setup again to see what was wrong... And actually try it out with speclj I guess...

23:07 futile: seancorfield: I'm not sure that's worth it at this point.

23:07 FWIW this is how Speclj's auto-runner works: https://github.com/slagyr/speclj/blob/master/src/speclj/run/vigilant.clj#L60-L68

23:08 Micah told me earlier today that it creates a new thread every second, and if you save some file with changes, it'll re-run related tests in a new thread.

23:08 That's all I know.

23:08 callen: I wonder if there's a way to make the connections persistent and reused across threads?

23:08 futile: Well what I'm wondering now is, how would that work with Jetty+Ring? Doesn't that spin up a new thread for every request?

23:09 Seems like Jetty+Ring+PG means having a blocked DB after 5 seconds of running.

23:09 callen: futile: yes, all this time Clojure API servers and web apps have been totally broken all this and we just hadn't noticed

23:09 noonian: it re-uses threads from a thread pool I think

23:09 callen: futile: thank you for pointing this out, I'll go warn everybody.

23:09 futile: callen: Good idea.

23:10 callen: noonian: it does but not in the way an async framework does.

23:10 futile: start with the mountains and hills.

23:10 callen: it works fine.

23:10 futile: Yes, I admit, I forgot that people use Ring+Jetty+PG.

23:10 callen: Ring + Jetty + PG works fine

23:10 noonian: callen: don't most async frameworks run in a single thread and just simulate multi-threading?

23:10 callen: noonian: only dumb ones.

23:10 futile: Which points to either me still using the stuff wrong, or speclj messing it up.

23:10 callen: noonian: one of them is named Node.js

23:10 futile: it's speclj that's the fuckup here.

23:11 futile: Are you so sure it wasn't me?

23:11 callen: futile: Ring + jetty works fine with DB connections and connection pooling.

23:11 noonian: callen: yes

23:11 futile: Did you look at that link?

23:11 callen: futile: I mean, I'm open to it being your fuck up too. I'd call that high odds possibility.

23:11 but you're here and the creator of speclj isn't, so he gets the mud.

23:11 futile: :P

23:11 * callen crosses legs and goes back to sipping tea

23:11 futile: You have such a way with words.

23:11 A terrible one.

23:12 Not sure I can really take your moral advise seriously :P

23:12 *ADVICE! not advise. WOW what a typo!!

23:13 callen: futile: http://www.eclipse.org/jetty/documentation/current/jndi-datasource-examples.html

23:13 futile: I'm excellent with words, you just don't like how I use them.

23:14 futile: I don't like it because I'm right and you're wrong.

23:14 callen: at'll be the day.

23:14 anyway the point of the above Jetty link

23:15 futile: Don't mess with me cowboy, or you'll realize you're dealing with a ninja, alright rockstar?

23:15 callen: was to highlight that DB connection pooling has been a thing with Jetty for bloody ages.

23:15 futile: Oh man yesss, I got all 3 in one sentence.

23:15 ah, kthx

23:15 kthx, kthx indeed.

23:15 callen: and that one of the blessed libraries is bonecp, which is what I recommend to people in here.

23:15 futile: yes, yes you have. twice.

23:15 seancorfield: fwiw, we use c3p0 at world singles (with mysql)

23:15 callen: a separate thread pool is maintained for both request handling and db connections in this case.

23:16 seancorfield: bonecp would be a quick and easy swap. You should test query latency with each if you ever get the itch.

23:16 futile: seancorfield: do you guys have any (expect) assertions at the top-level of any file, outside of some function?

23:16 seancorfield: we may well... although "it ain't broke" right now :)

23:17 callen: seancorfield: http://jolbox.com/index.html?page=http://jolbox.com/benchmarks.html these benchmarks make c3p0 look kinda silly, but I'm a startup kid so I break things all the time anyway.

23:17 seancorfield: yes, all our expect's are top-level - that's how Expectations works

23:17 futile: ffff

23:17 callen: seancorfield: oh you do use Expectations?

23:17 futile: okay thats actually not bad.

23:17 callen: so it does have users. hah.

23:17 futile: yeah he switched from clojure.test to it

23:17 you should read that blog post

23:17 * futile did his homework

23:17 callen: I'll probably keep using c.t

23:17 seancorfield: (given some-expr (expect f1 v1 f2 v2)) is the other format

23:17 futile: personally i do prefer (expect) function better, although i hate its magicalness

23:18 callen: I have some ideas on how I want to pimp out c.t a bit, but it's not a high value use of my time just yet.

23:18 speaking of

23:18 futile: Me, the user, has to guess how it works. Sometimes it compares values literally, sometimes it treats the first arg as a test-function

23:18 But what if the first arg is a MAP?

23:18 WHO KNOWS.

23:18 (Maps act as functions)

23:18 seancorfield: attaching everything to JVM shutdown is kinda weird... but while i'm developing, i use C-c , with expectations-mode to run tests whenever I want

23:19 it seems to me (expect) is very very intuitive

23:19 it does exactly what i expect (groan!)

23:19 futile: seancorfield: have you not run into that question then?

23:19 seancorfield: (expect value expr)

23:19 (expect exception expr)

23:19 (expect test-fn expr)

23:19 futile: but maps are test-fns

23:19 callen: the joys of IFn.

23:19 seancorfield: those all ready very cleanly

23:20 futile: (expect {:foo :bar} :foo) should this pass or fail!?

23:20 NOBODY KNOWS.

23:20 (I mean except those who tried it.)

23:20 <-- I'm with that guy.

23:21 (on this one.)

23:23 callen: futile: it's obviously a truthiness test.

23:23 futile: ...

23:24 It'd have been solved by just doing (expect= value expr), (expect test-fn expr), (expect-error Exception expr)

23:24 seancorfield: oh, sorry, was reading something... it should fail (of course) otherwise it wouldn't be very intuitive

23:24 futile: seancorfield: and how does it know it should fail if Map implements IFn? thats the question that scares me

23:25 or to generalize it could have just been (expect = a b), (expect empty? []), (expect (throws? Exception) expr)

23:25 Nothing wrong with an explicit = in there like htat

23:25 TimMc: No, you could always use a wrapper: (expect (is value) expr), where `is` is (partial partial =).

23:25 callen: I don't think expect requires the use of throws?

23:25 futile: But then again I'm an arrogant jerk and know-it-all so never mind.

23:25 TimMc: Midje does this.

23:26 seancorfield: futile: have you actually _read_ the Expectations documentation?

23:27 futile: Tried to.

23:27 callen: seancorfield: he doesn't read docs, we've established this.

23:27 futile: Got pretty far I thought.

23:27 Guess not far enough.

23:27 callen: seancorfield: he didn't like the postgres documentation which is some of the most thorough of any OSS project.

23:27 futile: Like I said, ignore me.

23:27 callen: futile: you need to buy a printer

23:27 futile: Do what callen does.

23:27 callen: futile: print out the documentation to the software you use, throw out all your magazines, and put the docs in your bathroom.

23:27 futile: then you'll have no excuses.

23:28 futile: callen: ok

23:28 seancorfield: tbh, i think the expectations documentation is some of the clearest i've seen for a testing framework - great progression of examples from obvious intro to advanced scenarios

23:28 futile: in all seriousness, just ignore me.

23:28 I'm arrogant and rude and ignorant.

23:28 seancorfield: and we find expectations to be extremely easy to use at world singles

23:28 callen: futile: please stop talking about yourself.

23:28 futile: callen: and self-centered!

23:28 callen: futile: it's just as tedious when it's negative as when it's positive.

23:29 futile: done

23:29 * futile zips lips

23:29 callen: seancorfield: I was impressed by expectations examples, but I prefer defn oriented testing libraries.

23:29 seancorfield: futile: what do you do for a living? and how long have you been working in the industry? i'm curious as to your background... and i haven't gotten around to googling you yet :)

23:29 callen: seancorfield: do you stay strictly within the confines of "unit testing" in your usage of expectations?

23:30 futile: callen: tell him i cant answer that

23:30 cuz of ur rules

23:30 callen: futile: still tedious.

23:30 futile: fffff

23:30 callen: seancorfield: if not, how do you handle exercising the greater scopes of the stack?

23:30 futile: seancorfield: ok, typing the quickest one I can, so callen won't yell at me

23:30 callen: seancorfield: I'm a fan of API testing, which is why I ask.

23:30 how is it I become the bad guy?

23:31 bbloom: don't answer that.

23:31 seancorfield: callen: we use Expectations for BDD/TDD moreso than "unit testing"

23:31 futile: callen: who said the bad guy is the one who yells at people?

23:31 devn: heh, https://github.com/rplevy/swiss-arrows is pretty rad

23:31 futile: callen: in this case you'd be right for it. i.e. the good guy

23:31 callen: devn: been watching the -?> conversation?

23:31 devn: callen: actually no

23:31 what's up with that?

23:31 callen: devn: you should be. hit up the mailing list. They're talking about salvaging threading macros from contrib.

23:31 devn: i just love the naming -- "the diamond wand"

23:32 callen: devn: I tried to get people to call -> the winchester for ages.

23:32 no dice.

23:32 devn: callen: we've had this discussion :)

23:32 futile: seancorfield: its so hard to cut out all the boring parts of my background. oh man. this is hard.

23:32 callen: devn: yes.

23:32 seancorfield: callen: for example, we used Expectations to test-drive the development of a REST API we built (in another language)

23:32 callen: futile: Do you work as a programmer? If so, how long? Any specialty?

23:32 futile: it's easy to make it compact. Follow the above format.

23:32 futile: seancorfield: 1) i do Clojure for a living. 2) i have been in the industry either 3 or 5 years.

23:32 callen: seancorfield: well that's API testing.

23:33 seancorfield: futile: is this you? http://blog.8thlight.com/steven-degutis/archive.html

23:33 futile: shhhhhiiiiii

23:33 yes.

23:33 but dont judge me, i was young and naive!

23:33 (... 5 months ago)

23:33 seancorfield: callen: well, that's just one example of how we BDD/TDD stuff

23:33 devn: chouser and jclaggett rewrote every single clojure macro to match cond->>

23:34 seancorfield: but i suppose that's very API-focused

23:34 devn: it was very interesting to see code written that way

23:34 futile: i admit, i did Ruby for a living for 2 years :'(

23:34 devn: it was very imperative looking

23:34 but entirely functional

23:34 futile: IM SORRY OK!?

23:34 devn: futile: *shrug* nothing to be sorry for

23:34 futile: devn: >:|

23:34 callen: futile: the sidebar stuff isn't high-value. Most people here are on their nth language.

23:34 devn: i still do ruby. there are a lot of people who need ruby work done.

23:35 callen: futile: very few people here outside of Raynes got to make their (paying portion) career 100% Clojure.

23:35 futile: if i lose this Clojure job and have no options but Ruby again, I might quit this career entirely.

23:35 callen: futile: this isn't #haskell, the self-flagellation for lack of loyalty to the cause is a waste of time.

23:35 devn: heh

23:35 futile: callen: no, its because i always hated OOP. always.

23:35 callen: futile: that's melodramatic and stupid. Have you ever worked a truly shitty job like working in a factory?

23:35 futile: so much unnecessary complexity!

23:35 ITS JUST DATA AND FUNCTIONS PPL!!

23:35 devn: hate is a bit strong

23:35 futile: yes, yes it is.

23:35 callen: yes.

23:36 callen: I've worked third shift in a factory actually

23:36 callen: I've delivered pizzas for years too.

23:36 callen: futile: then you should know better than to say coding in Ruby merits quitting programming.

23:36 futile: callen: I think I liked those jobs better, despite the lack of pay

23:36 callen: you clearly don't have to support anybody but yourself.

23:36 futile: i have a wife and 4 kids

23:36 but factory jobs round these parts pay well

23:36 * callen rolls eyes

23:36 devn: i dont think ill participate in this discussion anymore because i think it's counter-productive. if you're writing ruby you know as well as anyone that there is interesting ruby code being written. get off your high horse, please and thank you.

23:37 futile: hey look over there

23:37 * futile goes awy

23:37 callen: Use whatever works. Ruby is fine for what it's usually used to accomplish.

23:37 so is Python, etc.

23:37 futile: devn: thats the thing. i can honestly say i really dislike probably all ruby code ive seen.

23:37 callen: I don't "favor" Ruby and Python, but they're hardly sinful.

23:37 futile: not enough to turn down a ruby job, no. ia dmit.

23:37 devn: futile: then you aren't well read

23:37 futile: but now that ive used clojure for this long, i really dont wanna go back

23:37 seancorfield: i sympathize - i dislike ruby's syntax and therefore nearly all ruby code... it's a personal preference thing...

23:38 futile: its not about its syntax. syntax is nice, but its basically nothing

23:38 callen: I find the way Ruby is written to be more problematic than Ruby itself.

23:38 futile: design is the problem.

23:38 callen: I have a similar relationship with Java incidentally.

23:38 futile: everyone does terrible, terrible things with ruby and python and etc

23:38 callen: you clearly haven't done any CL or Perl.

23:38 "terrible, terrible things" takes on a new meaning there.

23:38 futile: seriously. class after class after class to do JUST ONE THING.

23:38 mthvedt: the worst thing about those languages is the feeling they're entitled to do terrible things

23:39 * devn sighs

23:39 futile: oh! i got it.

23:39 over-complexity.

23:39 callen: I'd like to think this channel is above the 5 minutes of hate thing.

23:39 futile: those languages breed it like rabbits.

23:39 callen: can we not hate on other tools people use and enjoy

23:39 noonian: in perl its often a badge of honor

23:39 devn: dudes, you can write good code in any language. that's *your* job.

23:39 callen: and focus on being productive?

23:39 futile: callen: yes.

23:39 seancorfield: so futile, i see a series of articles of yours on the 8th light site but when i click thru to your bio on the team page, it's a 404 and you're not listed on the team roster... i gather you moved on from 8th light fairly recently?

23:39 futile: starting now.

23:39 devn: quit blaming languages and write better code

23:39 * futile is going back.

23:39 futile: seancorfield: they fired me about 7 months ago

23:39 its ok, i got a new gig.

23:40 callen: futile: how old are you?

23:40 devn: resistance is futile

23:40 futile: (inc devn)

23:40 lazybot: ⇒ 7

23:40 futile: callen: im ashamed to answer that

23:40 devn: so dont

23:40 futile: *too

23:40 devn: it is immaterial

23:40 seancorfield: devn: i agree with "good code in any language" - i have to agree with that... i've written a lot of CFML over the last decade :)

23:40 callen: why would age be a matter of shame?

23:40 mthvedt: callen: there is value in metadiscussion. also, i don't understand the purpose of the age question

23:40 futile: callen: because im old enough to know better than to say this much stupidity in 10 minutes on IRC

23:41 callen: futile: I'm just trying to mentally place where you are in life/career.

23:41 futile: callen: its enough to know im married with 4 kids

23:41 27

23:41 * futile cant stop acting like an idiot... sh*t, help.

23:41 callen: futile: where in the country are you? I'm in the bay area.

23:41 devn: seancorfield: ive seen some crazy ruby that is deeply functional. it is crazy as far as ruby is concerned, but it's ruby all the same. anyone who says "X language is pure garbage!" in modern times is likely full of piss and vinegar, mostly the former.

23:41 seancorfield: well, perhaps luckily for me - or others in this conversation - i have to go help my wife feed the cats... but i'll be back :)

23:41 * futile is taking a 5 minute break to avoid saying more stupid things.

23:42 seancorfield: devn: i gave a preso at a conference last month that showed how to do JS-style prototype inheritance, Clojure-style infinite lazy sequences, etc in CFML - you can write really nice, expressive, high-level code in all sorts of unexpected languages!

23:42 devn: the preferences i have in clojure are *subtle*

23:42 seancorfield: exactly

23:43 seancorfield: biab

23:43 futile: Okay serious mode.

23:43 callen: devn: I've found cause to use FP in JS a fair bit, although I don't compare with nolen on that front.

23:43 futile: You can tell from the proper punctuation, spelling, and capitalization.

23:43 callen: futile: so what part of the country are you in? As I said I'm in the bay area.

23:43 futile: callen: I'm near Chicago.

23:44 Not close enough to get a job there, though, commute is too long.

23:44 devn: callen: FP in JS is strangely normal in my experience.

23:44 futile: So yes, I'm one of the luckiest guys in the world.

23:44 I have a full-time Clojure job and I get to work from home.

23:44 callen: devn: I just ignore prototypes and abuse partial application and scheme'ish FP.

23:44 devn: callen: yeah, it's kind of obvious, no?

23:44 underscore + anything = good times

23:44 callen: devn: uhm, you'd think, but I was sort of a rare bird among the JS'ers I know.

23:45 devn: yeah _.js is critical.

23:45 devn: callen: i was programming with some backbone folks and nearly everyone on my team got into FP through underscore

23:45 they immediately began to recognize clojure stuff i was showing them

23:45 group-by? no problem.

23:45 callen: devn: I stay far afield of backbone these days. AngularJS has done a really good job of gift-wrapping that "scale" of web app.

23:45 devn: yeah, i like angular myself

23:46 callen: devn: such that I default to Angular once I hit a certain level of complexity.

23:46 devn: just saying -- they were very open after seeing underscore in practice

23:46 futile: I added _.js to Zephyros, it didn't help much.

23:46 Any of you guys on OS X?

23:46 Raynes: futile: You have a full time job bitching about Clojure test frameworks?

23:46 Are they hiring?

23:46 devn: once we worked through a few semi-complex data problems with underscore they never wanted to go back

23:46 callen: Raynes: <3

23:46 devn: lol

23:46 futile: Raynes: if I can get us making more money, sure.

23:47 callen: devn: if the alternative is spaghetti, yeah.

23:47 futile: OSX anyone?

23:47 devn: futile: dude, you're starting to gain a reputation. that's well within your rights, but seriously, try to keep things positive in this channel. that's how this channel has been for ages, and i think everyone would like to keep it that way.

23:47 callen: devn: only thing that isn't nice about doing FP in JS is that there's a lot of });

23:47 Raynes: Underscore is the bee's knees, its legs, and its arms.

23:47 callen: which is sort of a given.

23:47 Raynes: I didn't know you did any JS.

23:47 brehaut: ~anyone

23:47 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 ..."

23:47 futile: devn: I'm terribly sorry for dragging it down with negativity. I apoligize to everyone here and hope we can move on and let the past be in the past.

23:48 Raynes: callen: I've been known to write JS on occasion. See: refheap.

23:48 Of course, refheap's js doesn't use underscore.

23:48 devn: futile: no need to apologize, just try and keep it moving in the direction of joy

23:48 callen: Raynes: oh right duh. Sorry.

23:48 Raynes: But my boss is using it for something at work.

23:48 futile: devn: And can you dec me enough to get my reputation gone plz?

23:48 Raynes: And it seems really nice.

23:48 devn: nah

23:48 callen: devn: joy? wrong programming language. :P

23:48 devn: (inc futile)

23:48 lazybot: ⇒ 2

23:48 futile: I wish I had my anonymity back.

23:48 callen: Raynes: it's a good way of wrapping common-case collection processing in something more or less FP'ish in JS.

23:49 futile: devn: joy, one of the fruits!

23:49 devn: so what are we talking about now?

23:49 how you don't like things?

23:49 callen: devn: _.js

23:49 all underscore all the time.

23:49 futile: Anyone on OSX?

23:49 callen: ~anyone

23:49 brehaut: ~anyone

23:49 futile: I got a gift for anyone who's on OSX.

23:49 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 ..."

23:49 devn: futile: are you trolling, or?

23:49 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 ..."

23:49 futile: https://github.com/mattgemmell/zephyros

23:49 brehaut: callen: o/

23:50 callen: brehaut: o/

23:50 * callen bro-fives

23:50 futile: The only sane WM I've found for OSX. Ever.

23:50 devn: futile: ill give it a look, but there's danger in believing in window managers

23:50 futile: Try it with this dotfiles: https://github.com/evanescence/dotfiles/blob/master/home/.zephyros.coffee

23:51 devn: like I said, the only sane one I've found for OSX.

23:51 brehaut: full screen emacs for life

23:51 Raynes: futile: No.

23:51 futile: Raynes: k.

23:51 Look, gifts don't have to be accepted.

23:51 Take it or leave it. Your call.

23:51 devn: i've seen strong swimmers and mighty sailors descend into wild OCD configuration-fits over OSX WMs

23:51 futile: This one is different.

23:51 devn: i write code in my OS

23:51 futile: It's grid-based, which makes it really really awesome.

23:52 devn: it's weird. i'm productive without bells and whistles.

23:52 whodathunk?

23:52 futile: In other words, since it's grid-based, you never have to edit the thing. It Just Works(tm).

23:52 I've been using the same config since I wrote the WM about 4 months ago.

23:52 devn: futile: this tiles native windows?

23:52 callen: I'm pretty happy with my vanilla Xmonad, which I get to use because I'm not an Apple sharecropper.

23:52 futile: devn: yes.

23:53 callen: I used to use OS X though and swap between it and Linux. I got tired of doing without Xmonad though.

23:53 devn: futile: how the hell is that possible and why isn't xmonad dipping into that pool?

23:53 futile: devn: read the source, I wrote it to be as easy to read as possible.

23:53 brehaut: callen: brian mckenna has written an OS X backend for xmonad

23:53 devn: (which sucks)

23:53 futile: A friend of mine told me.. hold on let me quote him verbatim.

23:53 devn: brian mckenna is a brilliant dude, but osxmonad is broken

23:53 ...deeply broken.

23:53 callen: ^^ yeah.

23:54 futile: "overall this is 100% the best window manipulator i've touched for osx, it's almost as great as xmonad was back in the day"

23:54 callen: I tried to make it work, it didn't, so meh.

23:54 Raynes: devn: In that I couldn't get it to run, yes.

23:54 devn: I recompiled like 10 times, cabal hell twice

23:54 i tried really hard

23:54 but that shit is totally broken

23:54 futile: Anyway, that's all I'll say. This thing is serious. It's real. It's good. It's worth a look. And it's free, a gift from me to you all.

23:54 Nobody else knows about it but you guys. It's our secret.

23:54 devn: do i need to sudo to use it?

23:54 futile: No.

23:55 devn: lol i was kidding

23:55 futile: I can't tell humor anymore.

23:55 devn: it just sounds too good to be true.

23:55 so naturally...

23:55 futile: you need a "Quickstart"

23:56 Raynes: He didn't write it.

23:56 devn: oh, well there's that.

23:56 Raynes: I misread the "since I wrote it" comment too.

23:56 He meant since he wrote his config.

23:56 devn: oh, heh

23:56 Raynes: But forming sentences that make sense is difficult.

23:56 I have that problem too.

23:56 futile: Raynes: I did write it.

23:56 Raynes: Look at the commits.

23:56 Raynes: wat

23:56 You're Matt Gemmell?

23:56 devn: i are wanting to make a zephyros that are a working?

23:56 futile: No.

23:56 devn: are you a help guy?

23:56 futile: No.

23:57 Raynes: You're making no sense, sir.

23:57 futile: I wrote it and got a really inflated ego and gave it to someone else so I could deflate my ego.

23:57 devn: you're on the very edge of my ignore, dude

23:57 futile: Not that there was any reason to get an inflated ego. Having 100 starts the first week after being announced on HN isn't a big deal.

23:57 callen: devn: which is impressive, given that I'm not on it.

23:58 devn: callen: heh

23:58 Raynes: I don't much care for /ignore.

23:58 futile: devn: I have no idea why you'd say that. Maybe you think I'm trolling.

23:58 Raynes: I have the ability to just not listen to people.

23:58 devn: Raynes: i dont either, but there's a threshold sometimes

23:58 some trolls are too damn good

23:58 futile: I just find this app super useful and wanted to share that with you.

23:58 Raynes: There was a time when I thought about /ignoring callen.

23:58 devn: futile: it sounds like you're bad mouthing the author

23:58 futile: Seriously, I'm not tro-- oh never mind.

23:59 devn: look at the commits. They don't lie.

23:59 https://github.com/mattgemmell/zephyros/commits/master

23:59 callen: Raynes: but you learned to wuv me.

23:59 Raynes: Had I done that, we wouldn't have shared our magical moments on the Santa Monica pier, devn.

23:59 * futile sighs

23:59 devn: Raynes: speaking of which, ill be in SF in the next few weeks. hopefully we can meet up

23:59 callen: devn: he's not in SF.

23:59 Raynes: I'm nowhere near SF.

23:59 callen: devn: but I'm in the bay area.

23:59 devn: i know this :)

23:59 futile: This is the most confusing night I have had in a while.

23:59 devn: ill rent a car and visit

23:59 callen: devn: you could meet me. There's at least 3 or 4 people in here who can attest to my not being an axe murderer.

Logging service provided by n01se.net