#clojure logs

2013-06-11

00:01futileIt'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.
00:01futileSure, fine, recursion is cool. But it's confusing too, so stop using it now that you're not in CS class anymore.
00:02futileetc etc
00:02futileok done
00:02futileHey, what do you guys think of ClojureScript?
00:03apricotsfutile: great but the whole compilation in java land is sluggish
00:03IntensityHi. 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))))
00:04xeqi&(into {} (for [k (range 6)] [k (inc k)]))
00:04lazybot⇒ {0 1, 1 2, 2 3, 3 4, 4 5, 5 6}
00:04Intensityxeqi: Cool, thanks much!
00:05amalloyi recommend xeqi's approach, but you could also just throw away the flatten and replace map with mapcat, Intensity
00:07futile,(doc dec)
00:07clojurebot"([x]); Returns a number one less than num. Does not auto-promote longs, will throw on overflow. See also: dec'"
00:07futileI think that can be shortened to "Returns a number less one."
00:08futileMore poetic, more concise, and just as correct.
00:12ivaraase1futile: had a second look at test2 BTW. seems pretty cool
00:13futileivaraase1: thanks
00:14futileI'm hoping to regain some lost morale soon, and finally finish the spec and make some cool extensions.
00:14futileI made a pretty stupid mistake announcing it before it was completely done.
00:14futileEspecially in the presence of some people who took it personally.
00:17tomjackon the list?
00:17futileI can think of no good reason that we have 4 different incompatible testing libs which mostly do the same thing.
00:17futiletomjack: yeah
00:18futileI can think of one really bad reason though.
00:18futilePrid.e
00:18futile*Pride.
00:20futileWhen 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.
00:21futileOkay, morale is back. Kinda. (Mostly just as a variation of being annoyed.)
00:23ivaraase1futile: 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
00:23futileivaraase1: yay! so I'm not crazy after all :)
00:24ivaraase1well, to be fair, I'm somewhat crazy
00:24futileYou really just can't take things personally in this business.
00:24ivaraase110/10/20 weekends do something with your sanity :P
00:24futileCode 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.
00:24futileivaraase1: so you're a coder and a journalist?
00:25ivaraase1well I'm stepping down as editor in chief and probably pursuing DSP, so yeah
00:25ivaraase1at least programming has semi-sane hours
00:26futileivaraase1: :)
00:27ivaraase1futile: and you?
00:27futileI don't know what half the stuff you said is, but it sounds neat.
00:27futileI'm not a journalist, no :P
00:27ivaraase1futile: lucky :P
00:27futileI just work on a small commercial website for a living.
00:28futileI'm pretty glad that it's written in Clojure.
00:28futileMost of my career was Ruby or Python or ObjC or whatever. Finally I found a language I can work with easily.
00:28futileI don't know if that says more about me, or about Clojure, or about Ruby :)
00:28futile(Ruby being the main one I used.)
00:29ivaraase1yeah. our newsaper is mostly a Java shop. trying to sneak in a bit of Clojure here and there
00:29futileExciting!
00:29futileOne day hopefully it'll be 0% java and 100% Clojure, then you'll be able to party.
00:29ivaraase1oh I long for that day
00:29ivaraase1most of our internals are Spring apps
00:30ivaraase1also some custom publishing system, somewhat unstable, but doesn't need to do much. (it basically typesets text to a given template and generates XML)
00:31futileSounds scary.
00:33ivaraase1it is. not as bad as geologist code, though. that stuff is truly horrible
00:33futileHow do you know?
00:34ivaraase1because I transferred from petroleum science this semester.
00:35futileOh I see.
00:36ivaraase1I mean, you can't really blame them. people hardly get any training in Java or Matlab
00:37futileMost of the things you're saying, I don't understand :)
00:38futileBut I'm good at smiling and nodding :)
00:38callenivaraase1: Spring apps? you poor bastard.
00:39ivaraase1callen: the failover strategy is to reboot the system via ssh :(
00:42futiletbaldridge: ha
00:43futilere mailing list
00:43futilebbloom: why would you want to split finding tests out of the Runner role?
00:44futilebbloom: the one reason you mentioned seems like it's not a common- or strong-enough need to merit the complexity it would need
00:45bbloomfutile: parallel test runs?
00:45futilebbloom: you could do that with the setup we have now.
00:45bbloomi dunno
00:46futilebbloom: https://github.com/evanescence/test2-autorunner/blob/master/src/test2_autorunner/core.clj
00:46bbloomi just think it's weird that the runner takes a predicate instead of a list of tests
00:46bblooms/parallel/distributed/ ? :-)
00:46futilejust imagine that instead of doing (map run-test-fn test-fns), it did them with pmap
00:46futilebbloom: it used to take a seq of test-fns and that was all.
00:46futilebbloom: but then I wanted to write test2-autorunner
00:47futilebbloom: and realized, I need some way to reload all the test files and find new tests in them and run those too
00:48futilebbloom: 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
00:48futilebbloom: which I think is a good compromise that enables very flexible runners.
00:48bbloom*shrug* i'm probably the wrong guy to get feedback from, since i personally don't give a shit about test runners at all
00:48futilebbloom: The problem I still see with Runners is that you can't compose them easily.
00:48futilebbloom: ffffffff
00:48futileI'm literally the only guy interested in fixing this stupid problem.
00:49bbloomlol sorry man, but please, keep on fighting the good fight
00:49bbloomif you make something cool, i'll use it
00:49futileReally I just wish Jay Marick Micah and Stuart just worked together on this lib in the first place.
00:49bbloomi use test frameworks b/c they are convenient
00:50tbaldridgefutile: I think that would be a futile endevor. They all have very very different points of view on how things should be done
00:50futile(demoralize futile)
00:50bbloombut really, most of my test code is shell scripts that return 0 or 1
00:50bbloomi like smaller components with test suites that are fast enough to run in their entirety
00:50tbaldridgefutile: 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
00:50bbloomi like code that is pure enough to allow arbitrary execution of small parts w/ some test values
00:50tbaldridgebuild it, and they will come
00:51futileYou know, the discussion with people on this subject has taken way more time than writing the thing itself would have.
00:51bbloomi generally write (comment ……………) in my code and eval forms when shit changes
00:51futiletbaldridge: that was my plan
00:51bbloomi almost never run my test suites, even when i have them, relying on CI to tell me when i've fucked up
00:51bbloombut i'm a crazy person
00:51bbloomsooo ignore me
00:51arohnerfutile: actually, from reading the spec today, I thought the runner is still too high-level to build real abstraction on
00:51futiletbaldridge: 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"
00:52futilearohner: oh?
00:52arohnerIMO, you should be talking about data and protocols
00:52arohnerone sec while I get it open again
00:52bbloompersonally, i think `git diff` is the best test framework ever
00:52bbloomi like to ./do-some-shit > expected.json or whatever
00:53bbloomthen git diff, manually eyeball it, and then git add if it's good or git checkout if it's bad
00:53arohnerfutile: I don't understand why the runner needs to take ns-syms and matcher-fn
00:53arohnerit seems too high-level
00:53arohneralso, I like the split between discovering and running that other people have mentioned
00:53bbloombut i'm way off topic & not being productive, so go back to ignoring me
00:54arohnerif 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
00:54futilearohner: 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.
00:54futilearohner: 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
00:54futilearohner: which I think is a good compromise that enables very flexible runners.
00:55arohnerfutile: when designing protocols, fuck compromise. find the smallest abstraction that works in the general case
00:55arohneryou can build your runner on top of that
00:55futilearohner: I've been wary of protocols, when I saw this: https://github.com/slagyr/speclj/blob/master/src/speclj/reporting.clj#L10-L31
00:56arohner"protocols"
00:56arohnerwhether you actually use defprotocol or not is a separate issue
00:56futileoh you don't mean defprotocol do you
00:56futileah
00:56futilethen i dont understand
00:57arohnerI'm talking protocol in the IETF sense
00:57arohnerin the abstract sense
00:57arohneras a way to communicate
00:57futileoh like HTTP
00:57arohnerbut I think your runner signature is too specific
00:57futileI agree
00:57futileI just don't know how to make it better
00:57arohnerI'd make it (runner reporter seq-of-test-fns)
00:58arohnerthen Discoverer is a separate thing
00:58futileI'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
00:58arohnerI've been threatening to write a test framework for a while
00:59futilearohner: ok then help me write this one
00:59futilei like this idea
00:59tomjackI heard reporter and was worried
00:59tomjack(reporter test-results)
00:59tomjackOK! :)
00:59futiletomjack: no comprendo
00:59arohnerso once you have (runner reporter seq-of-fns), make Discovery a separate thing
00:59bbloomfutile: also drop the er
00:59arohner(discover ???) returns a seq of test-fns
01:00arohnerthen you can drop (defn ^:test) as part of the spec
01:00bbloomdefine, assert, discover, execute, report
01:00arohnerbut the "standard discoverer", built on top of it can search for all (defn ^:test ..)
01:00futilearohner: so then its just a single Discoverer's idea of test definitions?
01:00arohnerright
01:00futilearohner: but that seems like an excessive abstraction
01:00arohnerthen if I want to discover tests over the internet or whatever, I can do it
01:00futilenobody would ever want them defined any other way, right?
01:01callenI 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.
01:01arohnerwhy would you assume that?
01:01arohnertest.generative creates new test cases
01:01arohnerclojure.test requires defns
01:01arohnermidje doesn't use functions at all
01:01arohner(or it didn't, until 1.5/1.6)
01:02arohnerquickcheck style tools invent new test cases after examining code, without having named defns
01:02futilearohner: because assertions need to be inside test-fns, so that they can be wrapped and have something to give its assertion-results to
01:02futilecallen: basically,
01:02futilecallen: the existing tools are so completely incompatible, but I want to mix and match tools
01:02arohnerfutile: requiring defns is a big limiting assumption
01:03futilecallen: 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
01:03futilearohner: well the real heart of it is assertions
01:03futilearohner: and assertions *must* be side-effecty in how they create assertion-results
01:03arohnerthat's fine, but they don't have to be defns
01:04futilearohner: but they have to be run in the context of something that can be wrapped with an (atom [])
01:04arohnerhuh?
01:04futilehold on hold on
01:05futilearohner: Once the Discoverer finds tests, he passes them to the Runner, who needs to be able to run them as a group of assertions.
01:05futileRight?
01:05arohnerright
01:06futileAnd the group of assertions should probably be required to be run in the context of arbitrary code, right?
01:06arohnerright
01:06futileSo I can do (expect empty? (foo)) (side-effecty-code!) (expect-not empty? (foo))
01:07futileWhich means, each group of assertions needs to be an opaque ball of executable code.
01:07futileWhich is perfect as a defn.
01:07futileNo?
01:07clojurebotno is tufflax: there was a question somewhere in there, the answer
01:07arohnerit's perfect as an fn, not a defn
01:07futileOh.
01:08tomjackshould the default discoverer check fn metadata in addition to var metadata?
01:08tomjackguess it doesn't matter
01:08arohnertomjack: exactly!
01:08tomjackyou'll either have a macro or if you're pointless you can (def ^:test ...)
01:09cbp```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.
01:09cbp`O god backqotes
01:09futileI'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.
01:09arohnerwhy?
01:09callencbp`: no, I'm caught up in the same thing
01:09clojurebotWhy is startup slow is busy compiling the `for` macroexpansion
01:10arohnerfutile: fn rather than defn allows something like test.generative or quickcheck to build a bunch of test fns on the fly
01:10callencbp`: it's still out there though.
01:10futilearohner: once all your tests are written with one thing, you can't easily swap them.
01:10callencbp`: incidentally, Tokutek did some work on Mongo that makes it better.
01:10futilearohner: but then again you're right.
01:10futilearohner: that's what it would have done anyway with the ^:test idea
01:10futileOkay I'm sold arohner.
01:11cbp`callen: Oh? how so?
01:11cbp`callen: do you have a link?
01:11futilearohner: oh but this breaks an autorunner.
01:11arohnerwhy?
01:11clojurebotarohner: because you can't handle the truth!
01:11callencbp`: https://github.com/bitemyapp/revise
01:12futilearohner: the runner gets a seq of tests to run, right?
01:12cbp`callen: I meant for what Tokutek did
01:12futilearohner: 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
01:13arohnerfutile: meh. autorunners can be built on top of this
01:13callencbp`: https://github.com/Tokutek/mongo made it ACID
01:13callencbp`: it's sweet.
01:14futilearohner: how?
01:14futilei can't imagine it
01:14arohnerreporting for any autorunner is going to be special, because there's not a single report time
01:14futilearohner: i'd hate to limit such a widely used (and useful!) feature so quickly
01:15arohnerso the autorunner would call (runner ...) many times while it's alive
01:15futilearohner: so the autorunner would really be a discoverer then?
01:15arohner(while-not (time-to-die?) (runner (find-changed-files)))
01:15futilearohner: such that (-> (discover ...) (run) (report))
01:16futilearohner: but who would contain that code you just wrote?
01:16arohnercontain?
01:16cbp`ooh i see
01:16futilearohner: where would that code be? in which role?
01:17arohnerin the auto-runner library?
01:17futilearohner: i mean in the spec
01:17arohnerit's not a part of the spec, it's a library that uses the spec
01:17arohnerthere should be no implementation code in the spec
01:17futilearohner: this is hard. hold on.
01:18futilearohner: given your suggestion, the core of the lib glues all the roles together like this: (report-tests (run-tests (discover-tests))) right?
01:18arohneryeah
01:19futileAnd the auto-runner would be a custom run-tests funtion?
01:19futileIf 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.
01:19arohner(while-not (time-to-die?) (report (runner (find-changed-files)))
01:19arohnerit'd run in a loop
01:19futilearohner: 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
01:20arohnerwhy are you assuming "done"?
01:20futilearohner: because the code I wrote would live in test2.core/main, which glues the parts together
01:20futileand the code you write lives in test2-autorunner.core/runner
01:20futilebut they have conflicting roles.
01:20futileyou can't see this?
01:20arohnerno
01:21arohnerI think you're assuming too much implementation
01:21arohnera good spec should have no implementation code
01:21futileyeah maybe.
01:21futilebut im really thinking you're just crazy
01:21futile(no offense)
01:21arohner*shrug*
01:22futileseriously, can a third party just take a glance at the last 2 minutes and see who's crazy?
01:22arohnerI'm tired, so I've gotta run. but let's talk tomorrow
01:22futileyeah that works too
01:22futilecya
01:23futilei do like the idea, i just dont see how it works along with the concept of an auto-runner.
01:23futilewhich is a pretty important concept.
01:23futilesome 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
01:32futileim ready to give up
01:32futileeverything sucks. screw it all.
01:33tomjackdon't give up
01:39magnarsI now have to (require 'clojure.repl) in nrepl before I get docs and such. Any ideas why that happened now?
01:53cbp`magnars: https://groups.google.com/forum/?fromgroups#!topic/clojuredev-users/j5cJvl2KsEE I believe that's what you're looking for
01:53magnarscbp`: most kind, thank you
01:59callencbp`: next question becomes, is the answer to just use Toku's version of Mongo or keep pushing onward with the RethinkDB client?
01:59muhoothis 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"} ?
02:00callenmuhoo: not unless you hacked it up I think, cheshire is valid JSON and SMILE only AFAIK
02:01muhoohmm. maybe i could (.replace .... if only i could figure out how to esacape the \'s
02:03amalloymuhoo: why would you want to?
02:04muhoolong story, but i'm dealing with a web service that wants urlencoded javascript, not json :-/
02:18tomjackI don't understand
02:18tomjack"{\"foo\": \"bar\"}" looks both like JSON and JS to me
02:20tomjack(and {\"stuff\"} and {"stuff"} look like neither..)
02:23muhootomjack: {"foo": "bar"} is OK. {\"foo\": \"bar\"} is not
02:23tomjackyou mean "{\\\"foo\\\": \\\"bar\\\"}"?
02:24muhoono, i mean less leaning toothpicks, not more
02:24tomjackplease exhibit the two strings as clojure strings
02:24RaynesENGLISH MOTHERF**KER, DO YOU SPEAK IT?
02:25muhooRaynes: and i will strike down with furious anger...
02:25RaynesWe're here all week folks.
02:27tomjack&(println "{\"foo\": \"bar\"}")
02:27lazybot⇒ {"foo": "bar"} nil
02:27tomjack&(println "{\\\"foo\\\": \\\"bar\\\"}")
02:27lazybot⇒ {\"foo\": \"bar\"} nil
02:27tomjackam I confused?
02:28muhootomjack: ah, i see. what i'm seeing in the repl is not what's there
02:29muhooi'll dig into it a bit more. this may be a non-problem
02:29tomjackit's called JSON for a reason :)
02:53muhooyep, there was a problem, but it wasn't json. thanks.
03:16borkdudeI 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
03:16borkdudeThey like dojo style
03:16borkdudeAny tips are welcome.
03:18matkowhat is dojo style?
03:21borkdudematko programming together
03:24callenborkdude: pair programming?
03:24callenborkdude: with each other or you?
03:25borkdudecallen I actually don't know what the official definition of dojo is, but they like interactive sessions
03:26matkoperhaps set up a list of unit tests, have the class collaborate to make them all succeed?
03:26callenborkdude: koan style might work well for them.
03:27borkdudecallen I was thinking maybe introduce clojure slide by slide in the style of The Reasoned Schemer and then let them do koans?
03:28callenI don't think reasoned schemer is a good idea.
03:28Ember-simple introduction to the syntax etc, then let them get their hands dirty
03:28Ember-show constantly stuff via REPL
03:28Ember-typing into REPL something tells them 100% more than showing a slide
03:29borkdudeEmber- yeah, good idea (also it will save me time making all those slides)
03:30Ember-of course you should plan ahead what you will show
03:30borkdudeEmber- naturally
03:30Ember-but REPL allows you to give quick answers to questions :)
03:30Ember-I've taught Javascript like that
03:30Ember-made some slides to support that but it was a lecture
03:30borkdudeEmber- 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
03:31Ember-if you'd be doing lecture thing would be a bit different
03:31Ember-but with dojo you really should start creating something
03:32Ember-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
03:32borkdudeEmber- 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
03:32Ember-if done like a real coding dojo
03:32Ember-yeah, definetly show them the datastructures
03:33Ember-you *might* mention macros, but don't get too deep :)
03:33borkdudeEmber- I even skipped macros in my normal course this year
03:33borkdudeEmber- but that was also because I had too many guest lecturers ;)
03:33Ember-macros might be a good thing to say anyway, since you're bound to be asked "why all these parenthesis" question
03:34Ember-and then you'll dive into the this whole code is data and data is code thing
03:34Ember-...which they will not understand by the way
03:34Ember-:)
03:34amalloyyeah, the answer to that question, in a 90-minute session is "because of good reasons i can't get across in 90 minutes"
03:35amalloyif you like, you can also note that there aren't really more delimiters than other languages except when doing math; the parens just move
03:35Ember-amalloy: yeah, although that point will miss the mark
03:35Ember-all they see are the parenthesis
03:35borkdudeamalloy also I can say, if your function ends like this )))]))}))}) it's a sign the function is too big ;)
03:36callenborkdude: looks like JS
03:36Ember-everyone creates functions like that in the beginning with Clojure :)
03:36borkdudethe real difficult thing is: get across 'why clojure' and show this in 90 minutes
03:37Ember-yup
03:37Ember-imho you can tell them:
03:37Ember-1) data manipulation power
03:37Ember-2) REPL
03:37Ember-3) immutability and...
03:37Ember-4) concurrency
03:37Ember-and if they get excited then go to the whole macro and homoiconicity thingy
03:38Ember-but those four should sink deep if they've ever done stuff like that
03:38Ember-and assuming they've done programming before they should have
03:39borkdudeEmber- do you know a nice example of concurrency to fit in the 90 minutes?
03:39Ember-borkdude: use refs and STM
03:39borkdudeEmber- in what use case.
03:40Ember-anything :) Like, keeping blog comments in memory
03:40borkdudeEmber- I tend to use atoms for it
03:40Ember-just throw maps into a ref holding a vector
03:40Ember-borkdude: yup, atoms are fine for simple operations
03:41Ember-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"
03:41Ember-which basically needs first finding the right place and then updating it
03:41Ember-which needs transactions
03:41borkdudeEmber- that is an update-in on an atom if it's a nested structure
03:41Ember-if you know _where_ to update ;)
03:41borkdude(if the atom contains a ...)
03:42borkdudeEmber- ah
03:42Ember-if you have the path for the update-in then yes atom is fine
03:43borkdudeEmber- what about (swap! myatom update-in (calculate-path @myatom) foo msg)… hmm… how would this look with refs?
03:43Ember-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
03:43borkdudeEmber- you're right that you need a transaction for it
03:43Ember-you can mention about performance and so forth
03:43Ember-and how immutability helps this
03:44Ember-this should shut some C fanatics up :D
03:44Ember-(I have nothing against C btw, C just doesn't really encourage immutable data structures ;P )
03:45Ember-but anyway, hope this gave you some ideas
03:45borkdudeEmber- sure, thanks. I will make something of it
03:45Ember-need to go to a code review now
03:45borkdudeIt was basically what I already had in mind, but there's too much to tell
03:46borkdudeso maybe I should keep it basic and let them exercise with the basic parts
03:46borkdudefirst 20 minutes: helicopter overview of the main things for clojure
03:47borkdudeand then the basic stuff + exercises
03:48borkdudeok, I'm off
04:46ddellacostais there a way to determine what version of Clojurescript my code is getting compiled with?
04:46ddellacostausing cljsbuild
04:47FenderHi, 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?
04:47FenderOr is there another way to do it?
04:48Fenderah and I dont want to set up leiningen and JDK just to get the dependency management
04:48dmi3yFender: sounds like you need osgi
04:48ddellacostaFender: well, there goes what I was about to say...haha
04:49FenderOSGI looks a little arcane for me, I only remember it from old eclipse times
04:50Fenderactually, I don't even need a dependency management at all because I can get lein at home to get all dependencies
04:50Fenderso 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
04:52clgvFender: you can use pallet to upload alll those files
04:52Fenderso I can copy all dependencies at once (dont need to change them so often) and then just copy my "lein jar"
04:52FenderI will take a look at that
04:55Fenderpallet seems to solve a lot more problems than I have :)
04:56Fenderis there no "lein put-all-deps-in-one-dir"?
04:57ddellacostaI mean, lein essentially does that via maven, in your local repo
04:57ddellacostaI'm always just poking around in my .m2/repository directory
04:58Fenderhmm, I could do it manually
04:58Fenderbut I was hoping to avoid that
04:59mpenetthere is a :local-repo key you can add to your project.clj to do that I think
04:59mpenetcheck the sample.project.clj file on leinigen repo, might give you a hint
04:59ddellacostayep neat
04:59ddellacostahttps://github.com/technomancy/leiningen/blob/master/sample.project.clj#L247
05:00Fenderhmm, this only seems to change the local repo ".m2" to another location
05:01Fendersomehow I think I am overlooking something big time
05:01mpenetyou probably shouldnt try to do that anyway
05:02Fenderis there a "better way"?
05:02mpenet.m2 is fine, and if you need to bundle it all together for whatever reason (deploys), just uberjar the whole thing
05:02ddellacostaFender: what is your objection to the uberjar?
05:03Fenderthe problem is that creating and deploying the uberjar takes some time
05:03Fenderlike a few minutes
05:03Fenderand doing th same for the jar would take maybe 20 secs
05:03ddellacostahmm, 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
05:03FenderI suppose
05:03ddellacostabut, you could do an lein install locally, and then rsync your .m2 directory to the server
05:04ddellacosta…or something along those lines.
05:04Fenderhmm
05:04Fenderso the JAR is 3.5MB and the uberjar is 32.5 MB
05:05FenderI think compilation time is about the same
05:05Fendermaybe I should just upgrade my upspeed :)
05:05ddellacostaand how are you deploying the jar on the server? knowing that could make it easier to suggest alternatives
05:05ddellacostahaha, or that
05:05Fenderright now I use scp
05:05Fenderso manually
05:05ddellacostasorry, I mean, is it running under jetty or something?
05:05Fenderactually via bash script
05:05Fendernope, OpenJDK
05:06ddellacostaor just java --jar or whatever?
05:06Fenderyep
05:06ddellacostaokay
05:06ddellacostayah, then, if you could install the dependencies once, then you could just upload that jar and re-start your script I assume
05:06Fenderexactly
05:07ddellacostabut you'll need leiningen on the server I believe, if you don't have an uberjar (…I think is how it would work)
05:07Fenderthis avoids all the arcane cloud config stuff
05:07Fenderlike if i'd use pallet or whatever deploy mechanism
05:07Fenderhmm
05:07ddellacostaI 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.
05:07ddellacostaand could give you more leverage later.
05:08Fendertrue
05:08FenderI always tend to do that, when I really see that it is necessary
05:08Fenderright now I feel it would take me a few days
05:08Fenderand there are always awkward errors where you have to browse stack exchange to get a solution :)
05:09ddellacostajust 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
05:09FenderI think the class path is "generated" via lein because it knows all the dependencies
05:09Fenderso it kind of concats all the library locations and calls it "classpath"
05:10ddellacostayes, I have to admit I've been lazy (so far) about finding out the mechanisms behind lein/maven.
05:10Fender#2
05:10ddellacostanot a Java person, not that that's an excuse.
05:10ddellacostamore to learn...
05:10Fenderthat's basically saying that lein is really cool and does it's job :)
05:10ddellacostayah, good point...haha
05:10Fendernow I am afraid of having to it manually :)
05:11ddellacostaalright, back to wrangling CLJS for me…good luck Fender.
05:11Fenderthanks a lot!
05:12Fendersorry but I jave no clue about CLJS :)
05:12ddellacostanaw, no worries…I'm learning through trial and error. heh
05:36Fenderthe 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"
05:40Fenderor maybe I can just run the jar file via lein?
06:07clgvFender: you can also just run a script gathering all jars in your directory to create the classpath
08:38jcromartieCan I use ClojureScript without precompiling?
08:39jcromartiei.e. can I load .cljs from the browser?
08:39clgvjcromartie: afair no
08:40clgvyou'd need a javascript hosted cljs compiler
08:40clgvor selfhosted^^
09:01ghitHey 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?
09:04vijaykiranghit: depends on what you want - I usually write a small web app
09:05clgvghit: write a local search algorithm for the traveling salesman problem ;)
09:07llasramProject Euler problems are fun
09:08AimHereIf you're biologically minded or like your stringses, there's also Rosalind these days
09:09ghitThanks a lot guys
09:10ghitBy the way, is there any gold standard HTTP library for clojure
09:10llasramAimHere: Huh, wasn't aware of that one. Looks funducational
09:10llasramghit: https://github.com/dakrone/clj-http
09:10AimHereSlurp is my one stop shop for all my http needs ;)
09:11llasramHah, but yeah -- for just reading from HTTP URLs, the Java standard library + Clojure clojure.java.io wrappers works just fine
09:21futileGood morning.
09:31futileWhich one of these do you like better, the mapcat or the list comprehension? https://github.com/evanescence/test2/commit/5a38efaddf1dd66224144c8703552f259deae3e0
09:51clgvwhat do you use for html parsing? I use clj-tagsoup a long while ago
09:54mpenetlaser seems nice
09:56mpenetI also used jsoup directly in the past, it's not so bad
10:08dnolenFunctional Programming Is A Scam!, new blog post http://swannodette.github.io/2013/06/10/porting-notchs-minecraft-demo-to-clojurescript/
10:12ucbdnolen: nice!
10:16dnolenucb: thx!
10:21supersymclgv: I like tagsoup too... ideal for consolidation of old web projects
10:22kmicuFunctional Programming Is a Scam Monad!
10:27supersymlein 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:28supersympeople seem to use different methods, but from what I understood, the JVM likes it split up like src/org/component/project (company even)
10:30supersymboostrapping 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:30supersymjava.lang.IllegalArgumentException: No implementation of method: :make-reader of protocol: #'clojure.java.io/IOFactory found for class: nil
10:32supersym(using lein run and http-kit as server to fire up the app)
10:33supersymsilly me... classpath probably ><
10:38supersymand hardcoded paths.. obviously
10:47xeqithe wrong file name being generated sounds like a luminus template problem.
11:07llasramDoesn't Leiningen in general just create filenames with `.` in them if you create a project name with `.` in it?
11:09vijaykiranllasram: no, if you say foo.bar the "main" namespace is foo.bar so you get src/foo/bar.clj
11:10llasramYep, I totally should have just tried it vs FUDing about
11:10clojurebotTitim gan éirí ort.
11:12rasputnikhey all, is there an idiomatic way to convert a java enum to a keyword?
11:13rasputnikie. 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:13clgvrasputnik: maybe via the toString method of the enum if that results in something usable. like (keyword (str my-enum-value))
11:13rasputnikclgv: ta, I'd tried just a (keyword ..) call but that results in :power-state nil. let me try that.
11:13clgvrasputnik: you can also shoot for name-spaced keyword by adding the class name as keyword namespace
11:15rasputnikclgv yup, (keyword (str …)) works great, ta. i'll RTFM on that namespace thing
11:16clgvrasputnik: just use the two-argument version: (keyword namespace symbol)
11:16clgv(keyword (-> my-enum-value class .getFullName), (str my-enum-value))
11:18rasputnikclgv: thanks, there's a chance i'll need to convert back so that way looks a bit cleaner
11:19clgvrasputnik: it's also clearer in case of name clashed from different enum types
11:20rasputnikclgv: nice. this is the first bit of java interop i've done, so far so good
11:24rasputnikah hometime.
11:24rasputnikcheers again.
11:37paultagHey Clojurians. Anyone have a "killer app" for Clojure? I need (at least) one as example (not cool libs, cool end-user apps)
11:37paultagthat are Free, as well (so no lighttable!)
11:38technomancypaultag: there was that android p2p social network that was pretty slick
11:38paultagoh, hey technomancy!
11:38technomancypaultag: greetings
11:38paultagtechnomancy: anything for GNU/Linux? We were talking about the Debian clojure work again
11:39technomancythere's not much targeted towards end users
11:39technomancydepending on how you define it, riemann might qualify
11:39technomancypossibly incanter
11:39mpenetprismatic ?
11:40paultagwhoh, prismatic is Clojure?
11:40mpenetwell free but not open
11:40technomancypaultag: oh, definitely overtone
11:40mpenetpaultag: yes it is
11:40paultagtechnomancy: overtone's a lib
11:40technomancyhm; I thought they were adding a frontend, but maybe it's not ready yet
11:40paultagmpenet: Oh, I thought you were talking about the prismatic running the lightpack thing that got kickstarted
11:41paultagI was about to say, I thought that was C
11:41mpenetpaultag: no the newsreading thingy
11:41paultagyep, ack
11:41paultagalas, not packageable
11:41paultagRiemann would be interesting, but again, more of a lib-type stuff.
11:41technomancyit's an application, but you kind of have to stretch the "end-user" part
11:42paultagClojure would be so perfect for UI work, such a shame there aren't any GTK apps that use agents to manage the GUI
11:42paultagtechnomancy: something that would be nice to have apt-gettable without the person knowing lisp / clojure
11:42paultag(save for configs, at most)
11:42technomancyhrm, well when you phrase it that way I can't think of anything
11:43paultag:\
11:43TimMctechnomancy: Oh wow, http://nightweb.net/ ? That looks super cool.
11:43TimMcI've been wanting to write something like that.
11:49paultagman, that sucks.
11:49oichhow do I mutate a map? (doto (.getRequestContext dispatch) (.put "blah" "blah"))) complains that there is no put method. There is no setRequestContext.
11:50oichrequestcontext is Map<String,Object>
11:50eggheadlol dnolen "While this exercise might seem only like a bit of fun, it really isn’t." I misread and missed the word 'only'
11:50eggheadwhile this might seem fun, it isn't
11:51eggheadcool post http://swannodette.github.io/2013/06/10/porting-notchs-minecraft-demo-to-clojurescript/
11:51gfredericksoich: that's weird.
11:51gfredericksoich: I assume you get the same thing for (.put (.getRequestContext dispatch) "blah" "blah")? and that (instance? java.util.Map (.getRequestContext dispatch)) is true?
11:54oichgfredericks (instance? java.util.Map ..) is true. The class name is ...RequestContext$MapView.
11:56oichoops. sorry. I mismatched parens in doto. put works.
11:57gfredericksyay the parens are always right
11:59otfromafternoon all
11:59otfromanyone out there use data.csv?
11:59gfredericksI do
12:00gfredericks~anyone
12:00clojurebotanyone is anybody
12:00gfredericks~anybody
12:00otfromI'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:00clojurebotJust 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:00otfromclojurebot: you are absolutely right
12:00clojurebotHuh?
12:01otfromgfredericks: have you had the trailing whitespace problem?
12:02gfredericksotfrom: no; this is just for reading, correct?
12:02otfromcorrect
12:02otfromUsing read-csv
12:02technomancypaultag: so riemann is actually a network server that can be used without clojure
12:02gfredericksotfrom: in fact that test case does not fail for me
12:03technomancythere are client libs for many other languages
12:03paultagtechnomancy: algernon just convinced me I'm wrong
12:03gfredericksotfrom: I'm on 0.1.2
12:03paultagtechnomancy: so, yeah! We also came up with a few others, I'm happy again :)
12:03technomancyoh, what else?
12:03otfromgfredericks: so am I [org.clojure/data.csv "0.1.2"]
12:04babilentechnomancy: We gathered riemann and semira so far, are looking forward to lighttable (if it ever sees the light of open source)
12:04technomancyalgernon: so you'd describe yourself more as a squeak user?
12:04otfrom(csv/read-csv (java.io.StringReader. "\"a\" " ))
12:04otfromException CSV error (unexpected character: ) clojure.data.csv/read-quoted-cell (csv.clj:36)
12:04paultag== babilen
12:05gfredericksotfrom: ah right -- when I pass the string directly it's okay
12:05algernontechnomancy: not really, no. I squeak, but do not Squeak. :)
12:05gfredericksotfrom: oh scratch that
12:06gfredericksI didn't notice we were putting quotes in there; being dense
12:06otfromgfredericks: so does it fail for you too or no?
12:06gfredericksotfrom: 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:06gfredericksyes it does fail
12:06gfredericksare you asking for a workaround?
12:08otfromwasn't sure if it was a spurious report or not as I didn't see any response
12:09otfromso I was just making sure I wasn't misusing the api before diving into a workaround
12:09gfredericksnot that I know of. I'm not an expert on the CSV spec though; it might be that that's not valid CSV
12:09gfredericksand as such wouldn't be treated as a bug
12:10gfredericksI'd check that out first
12:11otfromwill do
12:14tomjack"However, the RFC didn't say what to do when white spaces appear outside the quoted value." :(
12:14tomjack"The more common but technically less satisfactory solution is to rely on human intervention"
12:14tomjackhttp://en.wikipedia.org/wiki/Comma-separated_values#Lack_of_a_standard
12:17gfredericksI assume "human intervention" means mechanical turk
12:17hiredman"interns"
12:18gfrederickshuman intern-vention
12:20justin_smith,(intern 'sandbox 'x 0)
12:20clojurebot#<Exception java.lang.Exception: SANBOX DENIED>
12:20justin_smiththey won't even let interns play in the sandbox :(
12:26otfromI wouldn't wish looking for invalid characters in a 2.2GB csv file on anyone
12:26otfrom;-)
12:26gfredericksotfrom: "big data"
12:27otfromnot quite yet
12:27arrdem!karma "big data"
12:36gfredericks$karma big data
12:36lazybotbig has karma 0.
12:36gfredericks$karma big-data
12:36lazybotbig-data has karma 0.
12:41jonasenotfrom: maybe we should add an :ignore-whitespace to data.csv?
12:42otfrom:ignore-extra-whitespace-on-quoted-fields ;-)
12:43jonasenor maybe just {:trim true}
12:50racyclehi, 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:50racyclei' come up with this (map (fn [[k v]] (hash-map k v)) (map-indexed vector [1 2 3 4 5]))
12:50Anderkent,(into {} (map-indexed vector [1 2 3 4 5]))
12:50racyclebut i'm not proud of it, and i have to think there's a more idiomatic way
12:50clojurebot{0 1, 1 2, 2 3, 3 4, 4 5}
12:50racyclethat works
12:51racyclethanks
12:51Anderkentno problem
12:52llasramracycle: BTW, why do you want this?
12:52racyclei wanted to keep track of their order
12:53clgvzipmap
12:53llasramracycle: Vectors are already associative w/ the index as key: ##[(get [:a :b :c] 1) (assoc [:a :b :c] 1 :d)]
12:53lazybot⇒ [:b [:a :d :c]]
12:53clgv&(zipmap (range (count [1 2 3])) [1 2 3])
12:53lazybot⇒ {2 3, 1 2, 0 1}
12:55racyclei know they're associative, but they're going to be reordered and i wanted to keep track of their order
12:55racyclethe items in the vector are going to be filtered and sorted so i wanted the map to keep track of their original order
12:55llasramAh, I see
13:08otfromonce again clojure-csv from davidsantiago comes to the rescue https://github.com/davidsantiago/clojure-csv
13:08otfromI think I just need to adopt that lib and bring it up to date
13:11technomancywhat, to reflect all the recent developments in the revised CSV-2012 standard? =)
13:15bbloomCSV was on of those things that was just so damn simple and obvious that the software community couldn't be trusted with it
13:29gfrederickstechnomancy: they added comma separated objects
13:31technomancycomma-separated quagmires
13:32gfredericksCSA: comma-separated agriculture
13:48otfrompfft, you do know that CSV stands for Character Separated Values
13:48otfromI mean, really, commas?
13:50bbloomotfrom: character separated is probably more accurate, thanks to an old Excel i18n bug that used periods instead of commas in french speaking territories
13:58gfredericksthe characters were dressed in frilly old-fangled costumes, for it was a period piece.
13:59rasmustoI prefer CRLFSV
14:04otfromrasmusto: how do you separate your records?
14:08gfredericksprobably an LFCR
14:09TimMcbbloom: Haha, that's fantastic.
14:10TimMcI can see it now: Refactor -> Lift constant -> ","
14:27dobry-denclojure is the king of the Sinatra-esque all-in-one-file webapp.
14:27clojurebotRoger.
14:27futileAnd look, we didn't even need magic to do it!
14:27dobry-denhiccup for html, garden for css. it's just not even fair.
14:32gfredericksoh this garden thing sounds promising
14:32dobry-dengfredericks: it's amazing using clojure datastructures for everything. everything becomes obvious.
14:33mthvedt~clojure
14:33clojurebotyou're probably doing things wrong
14:34gfredericksdobry-den: yeah there was an obvious need for that for a while. just a tricksy thing to get right I assume
14:34futilegarden looks neat.
14:36tomjackI do not like that it goes straight from sugar to css strings
14:36dobry-denmthvedt: at least if it's simple/obvious, it's trivial to refactor when you find out you did it wrong :)
14:37dobry-denplenty of code at work is done wrong but nobody really understands how it works anymore
14:38mthvedtdorby-den: actually i was trying to see if clojurebot picked up what you said earlier.
14:38dobry-denhaha, cool. i see
14:38rasmustootfrom: separate records w/ crs, items w/ lfs
14:44futileI've been working on making the test2 SPEC shorter and easier to read.
14:44futileHere it is so far: https://github.com/evanescence/test2/blob/master/SPEC.md
14:48supersymlt
14:49supersymoops
15:06gfrederickstomjack: presumably that's changeable without API breakage?
15:06tomjackpresumably
15:07tomjackany intermediate representation like I was thinking seems.. like a lot of work
15:08noncomhi am trying to connect jvisualvm to a clojure environment run from ccw
15:08noncombut jvisualvm does not see it
15:09noncomthere 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:09noncomlooks like i connect to the ccw repl then
15:09noncomso how do i connect to an actual running app?
15:11timsgardneris *ns* always the namespace at the top of the stack?
15:12gfredericks*ns* isn't often read at runtime I don't think
15:12gfredericksmuch more useful at compile-time, e.g. macro-expansion-time
15:13amalloygfredericks: *ns* is generally either 'user or 'clojure.core at runtime
15:14xpewhy does this not work: (map #({1 %}) [1 2 3]) but this does: (map #(hash-map 1 %) [1 2 3])
15:15jeremyheilerThere's also in-ns which sets *ns*.
15:15hiredman'#({1 %})
15:15hiredman,'#({1 %})
15:15clojurebot(fn* [p1__29#] ({1 p1__29#}))
15:15futilexpe: the first one calls a function {} with no args
15:15futilexpe: the second one calls a functino hash-map with 2 args
15:15futilexpe: calling the function {} with no args will probably produce an error
15:15futile,({})
15:15clojurebot#<ArityException clojure.lang.ArityException: Wrong number of args (0) passed to: PersistentArrayMap>
15:16futileBut maps can be used as functions with 1 arg.
15:16futile,({:a :b} :a)
15:16clojurebot:b
15:16futilexpe: hence in #() it's easiest to use hash-map like you have
15:16xpefutile: that makes sense, thanks
15:17futilexpe: #() is always a call, with the first thing being the callable-thing, that's the easiest way to look at it
15:17gfrederickstimsgardner: the other thing you might use it for is setting it for a call to eval: (binding [*ns* ...] (eval ...))
15:17xpe,(map (fn [x] {1 x}) [1 2 3])
15:17clojurebot({1 1} {1 2} {1 3})
15:17futileYeah I just do that sometimes too.
15:17jeremyheilerxpe, consider macroexpanding your example ##(macroexpand-1 '(map #({:a %}) (range 10)))
15:17lazybot⇒ (map (fn* [p1__11278#] ({:a p1__11278#})) (range 10))
15:18xpefutile: 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:18tomjack&'(map #({:a %}) (range 10))
15:18lazybot⇒ (map (fn* [p1__11288#] ({:a p1__11288#})) (range 10))
15:19xpe,(map (fn [x] ({1 x})) [1 2 3])
15:19clojurebot#<ArityException clojure.lang.ArityException: Wrong number of args (0) passed to: PersistentArrayMap>
15:19hyPiRionxpe: no, it's equivalent to (fn [x] ( ...))
15:19futilexpe: it's more like (fn [x] (...))
15:19bbloomyeah you don't even need to macro expand
15:19bbloom,#()
15:19clojurebot#<sandbox$eval174$fn__175 sandbox$eval174$fn__175@c054cf>
15:19bbloom,'#()
15:19clojurebot(fn* [] ())
15:19bbloom,'#(%)
15:19clojurebot(fn* [p1__232#] (p1__232#))
15:19bbloom,'#(apply % %&)
15:19clojurebot(fn* [p1__261# & rest__262#] (apply p1__261# rest__262#))
15:20futileOkay, gotta write some extensions for test2 now.
15:20hyPiRion,(macroexpand-1 '(-> [$] #()))
15:20clojurebot(fn* [$] [] ())
15:20jeremyheilerbbloom: hmm good point :-)
15:20xpehyPiRion jeremyheiler futile ok, I got it know thanks
15:32timsgardnergfredericks: was away, thanks for the tip!
15:41Eivohello
15:42Eivohow can i handle file uploads with compjure?
15:46Eivo wrap-multipart-params
15:46Eivoi see
15:47Eivois it possible to read incomming file by chunks and drop connection of file is too large? Can't trust content-length
15:47Eivos/of/if/
15:49gfredericksEivo: does wrap-multipart-params slurp it all up eagerly?
15:52Eivogfredericks: not sure
15:53gfredericksI assume it's either giving you a string or an InputStream
15:53Apage43Eivo: wrap-multipart-params will have consumed the entire thing by the time it passes the request to the handler *but*
15:53Apage43you can also give it a store function, which receives an InputStream and the multipart header for each file
15:53Apage43at that point it has not consumed the whole thing yet
15:54Apage43you could throw an exception from there to reject it
15:55Apage43https://github.com/ring-clojure/ring/blob/master/ring-core/src/ring/middleware/multipart_params.clj
15:55Apage43i always just go look at the implementation =P
15:55EivoApage43: thanks
16:01Eivoi'm not sure if i need multiparm tho, i'm building restful api and it's time to implement file uploading
16:01Eivohttps://www.dropbox.com/developers/core/docs#files-POST look how dropbox do it
16:02Eivohttps://www.dropbox.com/developers/core/docs#files_put more descriptive
16:02Eivothey just threat body of request as file
16:04Eivosorry, can't think properly due drowsyness, thank you guys
16:20cbp`datastructures for everything sounds nice till you have to hire a frontend engineer :P
16:22bbloomcbp`: please elaborate
16:38justin_smithI 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:38llasramjustin_smith: Switch to nrepl.el?
16:39justin_smithoh, would nrepl not do that?
16:39justin_smithI 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:40cbp`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:40llasramjustin_smith: I haven't had that class of isssue with nrepl.el, but on the other hand I haven't tried it lately
16:41llasramjustin_smith: You could also implement `print-method` and/or `print-dup` for the Java type in question
16:41justin_smiththanks for the tip, trying it
16:41futileGoing to make test2 self-hosting.
16:42bbloomcbp`: 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:43rasmustobbloom: ORMOOP sounds scary
16:43bbloomrasmusto: it is.
16:43bbloomORM? OMG.
16:43rasmustoORM, oops!
16:46cbp`bloom: Yeah my qualm is with macros and not values I guess :P
16:46mpenetalso you don't have to use macros necessarily for html/sql
16:46mpenetsome lib don't and are working just fine
16:47pjstadig`macros are necessary and sufficient
16:48bbloompjstadig`: necessary and sufficent for what?
16:48mpenetdepends on the context
16:48pjstadig`everything
16:48pjstadig`macro all the things
16:48mpenet:)
16:48futiletechnomancy: blast! your idea doesn't work so easily with destructuring: https://github.com/evanescence/test2/blob/master/src/test2/run.clj#L39
16:48bbloomok, not being serious. got it.
16:48pjstadig`bbloom: hehe
16:48pjstadig`bbloom: don't you know me by now?
16:48jkjhow do i: { :foo ["bar" "baz"] :a "b" } => [:foo "bar" :foo "bar" :a "b"]
16:48futileI end up getting a keyword-like string instead, like ":runner"
16:49pjstadig`i'm the channel clown who swoops in with a joke at random times :)
16:49bbloompjstadig`: i only pay attention to IRC with like 1/4th of my brain power when i'm slacking off
16:49jkjoops.. baz
16:49futileAnyone know of a way to get keyword-destructuring in -main that works with cmd line args (which are strings like ":foo")?
16:50pjstadig`futile: you would do something like {:strings ["foo"]}, but only if the string didn't have a colon in the front
16:50futilepjstadig`: are you sure you quote the strings?
16:50pjstadig`err
16:51pjstadig`{:string [foo]}
16:51futileBecause this is what I had before:
16:51futile{:strs [-runner -reporter]}
16:51justin_smithOK, nrepl is much better, 80 pages of garbage text, but the repl below that is still usable
16:51futileWhich was actually really pretty in the Clojure side of things.
16:51pjstadig`haha or that
16:51futileBut the convention for lein things is to use :runner or :reporter
16:51futileSo I'm trying to get it to do that.
16:51pjstadig`i think you'd just have to parse the keyword
16:51futile:'(
16:51futileDestructuring was a really cool way to do this.
16:52pjstadig`futile: what does lein do?
16:52futilepjstadig`: you're not familiar with leiningen?
16:52futilepjstadig`: oh I think you said you were new to Clojure the other day, right?
16:53futilepjstadig`: use leiningen for clojure stuff, it's super easy
16:53tomjackwhat core lein tasks even take keyword args?
16:53tomjack`lein deps :tree` doesn't exactly count
16:53futiletomjack: technomancy told me most lein things do, and it's the way to move forward
16:54futiletomjack: and he wrote lein so I'm pretty sure he gets to decide that :)
16:54tomjackI believe it, I'm asking which core tasks do it
16:54futileo
16:54futileuh
16:55pjstadig`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:55futilepjstadig`: oh
16:55futilepjstadig`: touche :)
16:55pjstadig`:)
16:55tomjackoh repl
16:55tomjackkinda
16:56futileHm, I think I have a better way.
16:56futileJust create a new map by mapping the vals with load-string, then do destructuring on the keywords :)
16:57futileNot as simple as this, but hey, whatever.
16:57mpenettomjack: lein test takes keywords too
16:57tomjackwhoa I never noticed load-reader or load-string
16:57tomjackI think you want read-string though
16:58futileGiven [":foo" "A" ":bar" "B"], what's the best/coolest/cleanest/awesomest way to get {:foo "A" :bar "B"} ?
16:58pjstadig`loading is for code
16:58tomjackmpenet: thanks, looks like there is a (map read-string) in there
16:59pjstadig`you would probably want is clojure.edn/read-string
16:59futileMaybe I do but probably not. And if so, then later.
16:59tomjackthe "A" will read as a symbol
16:59tomjackwhich I think is correct for your use case
16:59tomjacksince the option values are namespaced symbols pointing to vars?
16:59futiletomjack: Not on every thing though, no.
17:00futileActually maybe, yeah.
17:00tomjack,(apply hash-map (map read-string [":foo" "A" ":bar" "B"]))
17:01clojurebot{:foo A, :bar B}
17:01futileDon't even need apply hash-map with destructuring :)
17:03tomjack,(->> [":add" "+" ":subtract" "-"] (map read-string) (map #(%1 %2) (cycle [identity resolve])) (apply hash-map))
17:03clojurebot{:subtract #'clojure.core/-, :add #'clojure.core/+}
17:03tomjackhmm
17:05futile,(let [{:keys [foo bar]} [:foo 'a :bar 'b]] (prn foo bar))
17:05clojurebotnil nil\n
17:06futile,(let [{:keys [foo bar]} [:foo 'a :bar 'b]] [foo bar])
17:06clojurebot[nil nil]
17:06futileI'm confused.
17:06tomjack&(let [[& {:keys [foo bar]}] [:foo 'a :bar 'b]] [foo bar])
17:06lazybot⇒ [a b]
17:06futileOh right.
17:06futile:)
17:07tomjackhttp://stackoverflow.com/a/16602869/1306817
17:08futileThanks tomjack
17:11futileSo technically when I pass `lein whatever :foo a :bar b` I get [':foo 'a ':bar 'b], all symbols
17:11futileOh.
17:13tomjackeval is a noop on keywords, so dually so is quote
17:13tomjacks/noop/identity/
17:14futileRight. What I almost want is (map load-string opts)
17:14tomjackread-string, not load-string, I'm pretty sure
17:14futileWell that just gives me a symbol, not a keyword.
17:14futileRight?
17:14tomjack&(class (read-string ":foo"))
17:14lazybot⇒ clojure.lang.Keyword
17:14futileOh. Man.
17:15futileYou were right all along.
17:16tomjackI don't suppose people should be allowed to do `lein test2 ":runner foo"` right
17:16tomjack(cus read-string will just return :runner and drop the foo)
17:16futileRight.
17:16futileI don't know what crazy error I saw before, but this was one big cluster of me misreading my errors.
17:17futileSolved.
17:19futiletomjack: https://github.com/evanescence/test2/blob/master/src/test2/run.clj#L40 :)
17:21dsopis there anyo good combination to replace lein-swnak + slimv on vim
17:21Glenjamin_i believe fireplace is the latest vim clojure environemnt
17:21dsopkk thx
17:22dsopi\ll check it out
17:24futileI used to use vim. Then I took an arrow in the knee.
17:25tomjackfutile: cool
17:27futiletomjack: thanks :)
17:27futilefor your help
17:30tomjack:pending? is weirdly consistent :)
17:31futiletomjack: that's an odd remark
17:31tomjackit always bugs me when I write `:throw-exceptions? true` or whatever and it's actually `:throw-exceptions true` because grr
17:31tomjackbut hadn't noticed that common ^:foo style is inconsistent in this regard
17:32futiletomjack: hehe
17:32tomjack(but really, I would rather write ^:pending, despite the inconsistency)
17:32futileJust released new version of test2 and test2-autorunner.
17:33futileThe default reporter needs some work admittedly.
17:33futileBut it works, it's fully usable for writing tests.
17:33futiletomjack: Hm, I thought I made the key of test-results :pending? and the var-metadata key :pending
17:34futiletomjack: they should be different, but it's admittedly a little confusing.
17:34futiletomjack: fixed the spec, thanks for pointing that out :)
17:34tomjackhttps://github.com/evanescence/test2/blob/master/src/test2/api/runners.clj#L10
17:35futiletomjack: fixed that file, thanks for pointing that out :D
17:35futileblast, new release needed now.
17:36tomjackheh
17:37futileokay, just released new versions :)
17:38futilebtw 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:39arohnercan someone remind me what the syntax is to get the local variables in a macro is?
17:40tomjack(keys &env)
17:40tomjack(on the jvm)
17:40arohnerthanks
17:42tomjackfutile: 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:43tomjackalso are you interested in patches for async tests? thinking I may give test2 a shot for playing around with that
17:43tomjackor it could be a separate library I guess and more verbose than `:runner async` :)
17:44tomjack..really it must be a separate library at this point
17:47futiletomjack: hmm..
17:49futiletomjack: as for unqualified syms having a default of test2, not sure that's a common enough use-case
17:49futiletomjack: 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:49tomjackyeah, makes sense
17:49futiletomjack: and yes im very interested in patches and such
17:49tomjackignore my async question, it doesn't make sense
17:50futiletomjack: yeah try making a custom runner that runs them simultaneously, that'd be a neat extension
17:50tomjackI 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:50tomjackI'm more interested in test-fns that are themselves async
17:50tomjacki.e. that may make assertions after returning
17:50futiletomjack: within them? that sounds odd
17:51tomjackyeah it's pointless on the jvm but necessary for js
17:51futiletomjack: oh, for testing async code?
17:51futiletomjack: hmm, i never thought of that use-case.
17:52bbloomfutile: oh boy. you're in for a rabbit hole!
17:52futilebbloom: never!
17:53futileim not gonna touch that problem.
17:53futileits probably hard enough with existing testing libs, let alone one thats just starting out
17:53bbloomfutile: at minimal, you should consider timeouts
17:53bbloomfutile: and timing in general
17:53bbloomthe results schema should include timing data
17:53futileinsert joke here about any of the other meanings of time out
17:53futilebbloom: ah yes, very good point. i remember seeing that in test.generative
17:54futileMost 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:54bbloomfutile: if you have one test that gets stuck in an infinite loop, you don't want to fail the whole test suite
17:54futileThere's one more thing we *may* need to change about the spec, namely allowing runners to know about "around-all"-style fixtures
17:55bbloomfutile: is SPEC some acronym that i don't know about? why do you keep capitalizing it?
17:55futilebbloom: i cant see any way the test suite can reasonably move past an infinite loop inside a test
17:55futilebbloom: because im dumb
17:55futilespec. there.
17:55futile:)
17:55bbloomfutile: timeouts.
17:55futilebbloom: timeouts exist in java? hmm.
17:55futilenever heard of it til now.
17:55futile(btw ive never used java before and im new to clojure)
17:56futile(sorry for not disclosing that up front)
17:56kwertiiIs it possible to (easily) do a prepared statement like ["SELECT * FROM foo WHERE id IN ?" [1 2 3]] with java.jdbc?
17:57bbloomfutile: java has a full concurrency model. so yes, it has timeouts
17:57bbloomfutile: it's a feature of a runner for whether or not it supports timeouts, but the results format needs to support it
17:59futilebbloom: very good point.
18:00tomjackultimately I wonder if the interface should be a channel of assertion-results
18:00futiletomjack: Hmm. What problems does that solve?
18:01bbloomfutile: incremental reporting?
18:01tomjackmakes async tests possible without replacing chunks of test2, and allows implementing sync tests in terms of the one async interface
18:01tomjackalso would mean the barebones interface is no longer simple for sync tests..
18:01futilebbloom, tomjack: I was thinking of the spec enforcing lazy-sequences being given to the reporter for that reason.
18:01futileI think that might solve these things.
18:03mthvedtfutile: what do you mean by enforcing? will seqs be required to be lazy?
18:03tomjackactually the interface could be the same from the user's perspective since you've got that ref in there :)
18:04futilemthvedt: I'm wondering if it should
18:04futiletomjack: it's an atom now
18:04mthvedtfutile: requiring a seq be lazy seems nonfunctional
18:05tomjackI should say "reference"
18:05futiletomjack: oh
18:08tomjackif I need a custom asserter, I also have to rewrite test2.expect?
18:09rasmustois/should there be an as->> macro? I find as-> hard to use when I'm using ->> threading
18:10bbloom(doc as->)
18:10clojurebot"([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:10bbloomrasmusto: hmmm maybe?
18:10bbloomi didn't realize that as-> actually also does threading, i thought it just assigned a name
18:11rasmusto,(-> 2 (as-> myval (+ 3 myval)))
18:11clojurebot5
18:11rasmusto,(->> 2 (as-> myval (+ 3 myval)))
18:11clojurebot#<Exception java.lang.Exception: Unsupported binding form: (+ 3 myval)>
18:11futiletomjack: I'm hoping to move more of it into a set of common functions in test2.api.asserters
18:11rasmustothe 2 gets threaded as the last form in the as->, so it doesn't get bound
18:11tomjackit doesn't do threading
18:11bbloomtomjack: ok yeah that's what i thought
18:12bbloomi think the -> part of as-> is just b/c there wasn't anything better to put there :-P
18:12tomjackrasmusto: you want ([name ...forms... expr])?
18:13bbloomit's basically (unthread-current-value-as x …)
18:13tomjackmaybe it should be <-as
18:13bbloomeh.
18:14tomjackthe similarity to -> looks nice when used together
18:16rasmustoyeah, something like that
18:17rasmusto(->> 2 (as->> myval (+ 3 myval))), where as->> takes the 2 as the last arg, yeah
18:18rasmustomaybe it's tough because "forms" could be arbitrarily long
18:20rasmusto-><-
18:20tomjackI wonder how evil this is https://www.refheap.com/0dae77a177a0ec49a8ab74348
18:21tomjacker, https://www.refheap.com/a67de769d2dde8640d4e05de5
18:22tomjack(stale [x] succeed)..
18:22tomjackrasmusto: well it's a macro so
18:23tomjack(defmacro as->> [name & args] (let [forms (butlast args) expr (last args)] `(as-> ~expr ~name ~@forms))) ?
18:26rasmustotomjack: I'll check it out
18:30tomjackmaybe that's what flip should mean in clojure
18:31rasmustotomjack: what's that?
18:31tomjack(defn flip [f] (fn ... ([a b c] (f c a b)) ...))
18:31patchworkHmm… has anyone had issues pushing to clojars with lein-clojars using the latest lein?
18:32tomjackprobably not
18:32tomjack(patchwork: ..not responding to you)
18:32rasmustotomjack: ah, I've used a "rotate" function on sequences a few times
18:32rasmustoI dunno what use cases something like that would have
18:33rasmustobesides my terrible code
18:33rasmusto(not saying that flip is terrible)
18:33tomjackoh good name
18:34tomjack(lens/update-in f [:args] rotate) if we had a lens on fnargs
18:34futileTrying lein-push out.
18:35rasmusto,(concat (drop 2 [1 2 3]) (take 2 [1 2 3]))
18:35clojurebot(3 1 2)
18:35rasmusto,(concat (take-last 2 [1 2 3]) (drop-last 2 [1 2 3]))
18:35clojurebot(2 3 1)
18:36patchworkSuddenly it looks like lein is putting the jar in target/provided/*.jar
18:36patchworkbut lein-clojars expects it to be in /target/*.jar
18:36patchworkWTF?
18:36rasmustoI guess I should modulo "2" with count of the collection or something
18:36amalloyrasmusto, 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:36tomjackgrr, I want (vector? (comp (comp #(mod % (count a-vector)) inc) a-vector))
18:37amalloyi don't really ever use it, but it's probably interesting reading
18:37tomjackrather (vector? (comp a-vector (comp #(mod % (count a-vector)) inc)))
18:37futileDang. lein-clojars looks in ./target/ for the jar, not ./target/provided/ where it really is.
18:37patchworkfutile: That is what I'm saying
18:37tomjack(comp a-vector #(mod % (count a-vector)) inc) ?
18:37rasmustoamalloy: cool, I'll give it a read
18:37amalloypatchwork: the announcement for latest lein said that it moved the target/ dir
18:37futilepatchwork: oh hey, you're doing the same thing as me!
18:38amalloyand that you can go back to the previous behavior if you want. i'd say, read the patch notes
18:38futilepatchwork: which makes sense since I started doing it when I saw you say it.
18:38tomjackamalloy: cool
18:38patchworkamalloy: Sure, but that breaks lein-clojars
18:38tomjackI had something a bit like that but I don't like referring to args by index
18:38patchworkAlright, I'll read the patch notes...
18:39futilepatchwork: yeah I'll read too.
18:39tomjackconsidered something like (reorder map [f coll] [coll f]) but then I just threw my hands up
18:39futileI'm running into the problem of wondering how to test my testing lib.
18:40patchworkHas clojars become deprecated?
18:40futileI half want to start writing tests using the lib itself.
18:40futileBut that means I either have to port the old tests, or start running 2 side-by-side test suites.
18:40futileAnd porting the old tests means not being able to verify that the tests even run anymore.
18:40futileHmph.
18:40amalloypatchwork: i don't know what lein-clojars is, but lein has had built-in deploy-to-clojars functionality since 2.0
18:40futileHmm
18:40futileamalloy: oh!
18:41futileamalloy: oh but dont you need to sign with gpg or something for that to work?
18:41futileamalloy: since I don't want to deal with gpg, I just do lein do pom, jar, and scp...
18:41patchworkamalloy: Got it. Been using lein-clojars since the lein 1.0 days
18:41amalloygenerally, it's not phil's problem if some random plugin breaks because it was depending on the implementation-defined file layout
18:41patchworkdidn't realize it had been deprecated
18:41rasmustopomjarscp sounds like a flavor of sorbet
18:42amalloyfutile: i did that for ages. i recommend at least trying the gpg route
18:42futileamalloy: k, will try. thx
18:42futilebbl
18:42amalloyyou 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:43patchworkDid clojars get hacked or something? That seems like a lot of new security...
18:44r0bgleesonpatchwork: i don't know but other OSS package managers have been hacked where a signed package would have helped
18:54amalloypatchwork: it didn't, as far as phil was able to determine
18:54amalloysigning jars is something he was already strongly urging people to do, before the latest rubygems fiascos
18:55amalloyand it's still just as optional as it was before that, but it's recommended
18:55patchworkamalloy: Got it
18:55patchworkIt is good practice
18:55patchworkmaybe this will finally motivate me to get gpg set up
18:58technomancypatchwork: the hosting provider clojars uses got compromised, but we have no evidence that the VPS instance hosting clojars itself was infiltrated
18:58technomancybut rubygems.org got hacked not too long ago and they are feeling the pain of not having bothered to do signing
18:58technomancynpm had a huge password leak not that long ago
18:59technomancyso far we've been lucky
18:59patchworktechnomancy: Got it, good to know
18:59technomancybest not to assume we'll continue to be lucky =)
18:59callentechnomancy: npm was pretty incompetently setup.
18:59technomancycallen: granted
18:59patchworkGPG it is!
19:00technomancycallen: 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:00technomancys/depressing/sobering/
19:02SegFaultAXCFM 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:02SegFaultAXIs it making a comeback or something?
19:02technomancyI don't think so
19:02SegFaultAXWell, that's maybe an over statement. I've seen a number of banks use it.
19:02technomancymy university used it back in 04 but I think they've escaped
19:03SegFaultAXI'm pretty sure seancorfield is also a CFM hacker.
19:03SegFaultAXOr at least he's tweeted about it.
19:03callentechnomancy: facebook is PHP. *shrug
19:03r0bgleesonnot anymore
19:04r0bgleesoni bet a lot of PHP has been replaced
19:04SegFaultAXr0bgleeson: After the amount of time they've spent on HH and HHVM? I doubt it.
19:05r0bgleesonyeah, 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:05SegFaultAXr0bgleeson: If you're talking about backend services then yea, its been that way for a while.
19:06SegFaultAXr0bgleeson: But they still have tens of millions of lines of PHP in prod.
19:07tomjackholy crap
19:08callenFacebook might be the winners of "most impressively engineered ball of spaghetti" award.
19:08r0bgleesonlol
19:08SegFaultAXcallen: It ain't easy building one of the most highly visited sites on the planet.
19:09seancorfieldSegFaultAX: CFML? yup, been doing a lot of that over the last decade alongside everything else...
19:09r0bgleesonyeah. that's what makes it more remarkable.
19:09r0bgleesonthey did that in PHP
19:09r0bgleesonand in started on PHP3/4 probably?
19:09SegFaultAXr0bgleeson: Except they had to build a transpiler and a VM to make it work. :)
19:09r0bgleesoncrazy
19:09SegFaultAXrodnaph_: That's arguably not /just/ PHP anymore.
19:10nightflywhat is it transcompiled to?
19:10r0bgleesonC++
19:10r0bgleesonthey've decided to build a VM instead now
19:10supersymfb uses erlang too, backend anyway
19:10SegFaultAXFor chat
19:10supersymoh k
19:11SegFaultAXsupersym: Not surprising since the most popular jabber server is Erlang.
19:11supersymyes that would make it a lot easier :)
19:12seancorfieldAdobe 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:13r0bgleesonMacromedia
19:13r0bgleesonflashblack to the past
19:13SegFaultAXseancorfield: 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:13seancorfieldRailo 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:13callenSegFaultAX: of course not, it's even harder when you exercise very little engineering discipline.
19:13seancorfieldr0bgleeson: I was Macromedia's Senior IT Architect for six years... go figure :)
19:14callenSegFaultAX: I used to port COBOL...I didn't get paid much ;_;
19:14seancorfieldI ported COBOL compilers :)
19:14r0bgleesonseancorfield: cool, you built some cool stuff i played around with as a teen
19:14r0bgleesoniirc, fireworks
19:14callenseancorfield: yeah, that's essentially what I was doing. At the tools level.
19:14callenseancorfield: I did most of my work on the data side though.
19:14seancorfieldI was never in the product division, although I did do some work on the AS3 compiler / runtime test suite
19:14callenseancorfield: I'm pretty sure I was getting billed out at $200/hour at the time.
19:15SegFaultAXseancorfield: Oh man, I fricken /loved/ Flash 4/5/MX
19:15seancorfieldI ported Microfocus COBOL to the SPARC chipset (it became Sun COBOL 1.0 :)
19:15seancorfieldcallen: I think the highest I got was $175/hr for CFML stuff
19:16SegFaultAXseancorfield: Contract or ft?
19:16seancorfieldBut, 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:16callenSegFaultAX: http://izbicki.me/blog/hlearns-code-is-shorter-and-clearer-than-wekas
19:16seancorfieldSegFaultAX: contract! I wish I could make $175/hr FT! :)
19:17callenSegFaultAX: lol, Etsy implemented another monitoring stack. No wonder they need 100+ engineers.
19:17seancorfieldAnd ColdFusion was never designed properly for shared hosting setups :(
19:17callenyou can get rid of the last bit
19:17SegFaultAXseancorfield: 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:17callen"ColdFusion was never designed properly"
19:17SegFaultAXcallen: I know, haha. I saw that.
19:17seancorfieldRailo is much better there since it leverages the Java web app security stuff (which ColdFusion instead works really hard to circumvent)
19:18SegFaultAXseancorfield: Adobe CFML still active?
19:18seancorfieldSegFaultAX: most CFML contractors get $50/hr if they're lucky...
19:18SegFaultAXcallen: In their blog, they said they have > 250k metrics. Just wow.
19:18seancorfieldSegFaultAX: Yeah, Adobe released v10.0 a year or so back with v11.0 coming late this year or early next
19:18callenSegFaultAX: variables?
19:18supersymearlier 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:19papachansomebdoy change #clojure channel to #coldfusion
19:19supersym'nuf said
19:19callenSegFaultAX: I'm not sure I believe them that they're digesting or leveraging that.
19:19seancorfieldhahaha... there is a ##coldfusion chanel if you ever want to discuss it in the proper place!
19:19SegFaultAXcallen: Seriously. That's fucking insane.
19:19callenSegFaultAX: sounds like data masturbation to me.
19:19callen"LOOK AT HOW BIG OUR BIG DATA IS"
19:19callen(we're so sophisticated. srsly)
19:19SegFaultAXseancorfield: We should get lunch. I'd love to pick your brain :)
19:20callenSegFaultAX: he's a nice guy. He won't harm you.
19:20callenseancorfield: are you still doing those meetups in SF?
19:25seancorfieldindeed, although I was too busy with work to make the last one
19:26seancorfieldnext SF meetup is Aug 1st, next dojo is... june 25, next san mateo meetup is june 20
19:27seancorfieldthen july 18 in san mateo, dojo in SF july 23
19:27seancorfieldSegFaultAX: where are you based? same for you callen ?
19:27SegFaultAXseancorfield: He's in MV, I'm in the east bay.
19:28callenseancorfield: I went to one of the meetups at weatherbill, I brought the other biker dude and got peoples' Emacs+Clojure setups working.
19:28callenseancorfield: mostly by cheating and having them clone my dotfiles repo. lol.
19:28SegFaultAXseancorfield: Familiar with Walnut Creek/Lafayette area?
19:29seancorfieldI'm in Castro Valley so, yeah, you're just 680 from me
19:30seancorfieldcallen: I think I remember - that was ages ago!! We've been in the new Climate offices on 3rd St for *ages*
19:30callenseancorfield: I've been putzing around for ages. *shrug*
19:30SegFaultAXseancorfield: In SF?
19:30callenSegFaultAX: I was converting more souls to the Church of Emacs.
19:31callenSegFaultAX: you willl conveeerrrrt....
19:31seancorfieldwell, my contact details are on http://corfield.org/resume if you wanna hang out some time...
19:31seancorfieldBay Area meetups: http://www.meetup.com/The-Bay-Area-Clojure-User-Group/
19:33callenseancorfield: how familiar are you with the request/thread semantics of Jetty vs. Aleph/Httpkit?
19:34ztellmancallen: what do you need to know?
19:34callenoh dear, the wizard of oz is here.
19:35callengrabbing code, h/o
19:35callenztellman: 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:35callenztellman: 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:36callenis the setup/takedown middleware enough?
19:36seancorfieldcallen: heh, i'll happily defer to someone who knows...
19:36callenI've been dying for somebody that would know the answer to this *_*
19:37ztellmancallen: I can't speak to http-kit, since last time I talked to the author he seemed skeptical that thread affinity was useful
19:38ztellmansorry, got pulled away for a sec
19:38callennp
19:38callenI've been bugging people about this for at least a couple of weeks.
19:38callenask Raynes :P
19:39SegFaultAXUgh, I feel bad. I accidentally revived a post in the mailinglist from 2008 because I misclicked. :(
19:40SegFaultAXAnd now people are responding to it even though I deleted it.
19:40ztellmanso 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:40callenSegFaultAX: mailing lists are so wonderful like that
19:40ztellmanyou can get a similar mechanism using bound-fn around any callbacks you register in the original context
19:41callenztellman: bound-fn was the main solution I was eyeballing.
19:41ztellmanthought clojure's bound-fn is needlessly slow
19:41ztellmanthough*
19:41callenztellman: I feel like I should double-check libnoir isn't guilty of the same flaw.
19:41callenI'm not sure my time scale for "slow" is the same as yours ;)
19:41ztellmanhttps://github.com/ztellman/potemkin/blob/master/src/potemkin/macros.clj#L56
19:42tomjackdoes that one also work synchronously?
19:42tomjackI mean with a synchronous executor
19:42tomjackor did I misremmeber that problem
19:43ztellmantomjack: the issue with synchronous executors is when you throw transactions into the mix
19:43ztellmanthe actual behavior seems to have shifted a bit since I reported the problem, it happens with all transactions now
19:43tomjackI see
19:44ztellmanbinding conveyance with agents et al was kind of broken, the last time I checked, it never cleans up
19:44tomjackoh right
19:44amalloybtw, 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:44tomjackI was confused because I thought bound-fn was using hacks to be fast
19:44tomjackbut it's the private one
19:44ztellmanso the bindings that are conveyed just kind of stick around in whatever thread pool it executes in
19:45ztellmantomjack: yeah, the private one has poor hygiene
19:45ztellmanamalloy: since when? I got in the habit of doing that a while back, I could swear it complained to me
19:45amalloyztellman: i'm sure as far back as 1.3, and i think 1.2; 1.1 and below is outside my experience
19:45ztellmantomjack: fast-bound-fn actually restores the original threadlocal context
19:46callenthat's pretty sweet.
19:46ztellmanamalloy: TIL
19:46amalloyit 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:47tomjackI'm guessing core.async's binding conveyance must be even slower
19:47ztellmantomjack: I haven't been following it too closely, I couldn't say
19:47amalloy(i, too, used ~'& for a long time, just assuming that it would break otherwise)
19:48callenztellman: anyway, thanks for poking at my question. Much appreciated.
19:51ztellmancallen: short answer is: don't do asynchronous stuff unless you have to
19:52callenztellman: 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:59patchworkAlright, 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:59patchworkgpg: can't query passphrase in batch mode
19:59patchworkbatch mode?
19:59patchworkHow do I deploy without batch mode?
20:00technomancypatchwork: typically the passphrase is handled by gpg-agent
20:01technomancyunfortunately I don't know much about setting it up; it just works out of the box on debian
20:01technomancybut there's a `lein help gpg` guide that might have some good pointers
20:01patchworktechnomancy: I went through the guide
20:01patchworkAre you saying I can't use % lein deploy without gpg-agent?
20:02technomancypatchwork: no, just that IME gpg-agent is the easiest way
20:02technomancyare you on OS X?
20:02patchworktechnomancy: Yeah
20:03patchworkEverything is set up according to the docs, but I still get gpg: can't query passphrase in batch mode
20:03patchworkbummer
20:03patchworkI tried to install gpg-agent
20:03technomancydo you have a credentials.clj.gpg file?
20:04patchworkbut brew installs gpg-agent 2.0 and gpg 1.4
20:04technomancywe have --batch mode specified for reading credentials, but not for signing jars
20:04patchworktechnomancy: Yeah
20:04patchworkI made the credentials.clj.gpg using gpg
20:04patchwork(encrypted it I mean)
20:04technomancyok... you do not want to use credentials.clj.gpg without gpg-agent
20:04technomancybecause then you would have to enter your passphrase for every dependency resolution run
20:05technomancybut you can still use gpg for signing without using it for creds
20:05patchworktechnomancy: Aha… really? So how do I specify credentials without using credentials.clj.gpg?
20:05technomancydo you have full-disk encryption?
20:05patchworktechnomancy: NO
20:06patchwork*No
20:06patchwork(did not mean to yell!)
20:06technomancyheh
20:06technomancyok, so you should not store your credentials unless you either set up full disk encryption or gpg-agent
20:06RaynesInstalling gpg stuff with brew is blech.
20:06technomancybut until you get that figured out you can just enter your password when you deploy
20:06patchworkI encrypted the credentials with gpg so shouldn't that be enough?
20:07technomancypatchwork: the problem is that gpg-encrypted credentials are read for every dependency resolution
20:07technomancyright now lein doesn't have a separate for deploy creds vs fetch creds
20:07patchworkSure, but it should still work right?
20:07Rayneshttp://macgpg.sourceforge.net/
20:07patchworkIf I want to enter my passphrase every time?
20:08technomancypatchwork: no, because we have the creds decrypted with --batch
20:08patchworktechnomancy: I understand what you are saying, but in principle it should still work
20:08patchworkOkay
20:08technomancywhich assumes gpg-agent is set up
20:08patchworkSo gpg-agent is required then
20:08technomancyin your case entering your clojars password when doing the deploy is probably your best bet
20:08technomancybetter the entering your passphrase every time you launch lein repl
20:09technomancywe should probably have separate files for deploy-only creds
20:09patchworkPossibly you can clarify in the setup that people should be using gpg-agent, it makes it seem like that is optional
20:10patchworkI don't mind entering my passphrase
20:10technomancyit's optional, just not for credentials.clj.gpg
20:10technomancyif you are using full-disk encryption then credentials.clj.gpg isn't necessary
20:10patchworktechnomancy: Hmm… so either full-disk encryption or gpg-agent is required
20:10technomancyor if you enter your clojars creds on each deploy
20:11patchworkHmm… that is a step backwards from the lein-clojars approach
20:11patchworkwhere I could just say % lein push and it worked
20:12technomancywell... if your OS has good SSH support but not good GPG support, sure
20:12patchworkSo basically I should be using linux then?
20:12patchworkThat seems like an extreme fix for my issue : )
20:13technomancyor windows, where it's a pain either way =)
20:13technomancyanyway, secret storage is orthogonal to signing
20:13technomancyusing gpg to sign artifacts is not bad even without the agent, because deploys don't happen that often
20:15technomancybut 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:15Raynestomjack: Are you tomoj?
20:15patchworkDidn't realize
20:15patchworkI get the impression many clojure devs use OSX
20:15patchworkAt least, all the ones I've met do
20:16Raynestomjack: amalloy and I are having a debate about whether you are the same person as him at the work.
20:16technomancyI hacked out initial support that assumed gpg just worked everywhere like it does on debian an there was a pretty huge backlash initially =\
20:16Raynesat work*
20:16patchworkSo this is basically an experimental feature
20:16tomjackyep that's me
20:16technomancypatchwork: well the initial backlash was about an earlier rev that made a lot more assumptions
20:17technomancypatchwork: my advice would be to punt on secret storage for now
20:17technomancygetting gpg working just for signing is a great first step
20:18patchworkOkay, I guess I didn't see the part that just shows how to sign
20:18patchworkthe tutorial goes through setting up lein with gpg
20:18patchworkto use them in conjunction
20:18technomancyhm; yeah we should probably clarify the distinction there
20:18technomancyit's just coincidental that they both use gpg
20:18patchworkHow do I sign a jar with gpg?
20:18technomancythe secret storage stuff should really be replaced with os-specific functionality, but that requires JNI
20:18tomjack.i le lojbo me mi cu morsi
20:19technomancypatchwork: `lein deploy clojars` should do it
20:19patchworkYeah, doesn't seem to work yet
20:19technomancyhrm
20:19patchworktechnomancy: Okay, so I just take out the .clj.gpg file and lein deploy clojars will work?
20:19patchworkI see
20:19patchworkWhat do I put for a value for the :creds key?
20:19technomancypatchwork: if you leave it out you should get prompted
20:19technomancytry that first
20:20SegFaultAXRaynes: I really like the image you selected for Laser. :D
20:20Raynestechnomancy ^
20:20tomjackRaynes: also tomoj.la expired..
20:20RaynesHe suggested it iirc.
20:21technomancy<3
20:21tomjacknow I'm at tomjack.co
20:21SegFaultAXWell both of you <3
20:21Raynesseancorfield: Windows machine.
20:21technomancyseancorfield: they don't pay me enough
20:21RaynesI think Windows is much worse off.
20:21patchworkIt failed with ReasonPhrase: forbidden
20:21seancorfieldoh, that would just be mean
20:21Raynesseancorfield: I thought you were the advocate for "Meh, Clojure on Windows ain't hard."
20:21patchworkafter asking for my GPG passphrase twice
20:21patchworkand my clojars creds once
20:22patchworkWow, can't even deploy anymore!
20:22Raynespatchwork: You should reformat your harddrive and reinstall your operating system.
20:22patchworkThis is going to be a problem
20:22seancorfieldRaynes: that's so... but i still wouldn't inflict it on technomancy - at least mac os x is vaguely *nix-like :)
20:22technomancypatchwork: typo with the clojars password?
20:22hyPiRionRaynes: Clojure on Windows ain't hard. Just install a linux distro, then you're ready to go
20:22technomancypatchwork: have you done HTTP-based deploys before?
20:23patchworktechnomancy: I have been doing deploys to clojars for almost two years now
20:23patchworkusing the lein-clojars plugin
20:23patchworkNot a typo, just happened again
20:23technomancypatchwork: ok, so you can disable the signing just to rule it out
20:23patchworkOkay
20:23technomancypatchwork: :repositories {"clojars" {:url "https://clojars.org/repo&quot; :sign-releases false}} I think
20:24technomancyI think ReasonPhrase forbidden means clojars rejected your password but that's one way to make sure
20:25patchworkNo, still asked me for my gpg passphrase
20:25patchworkWow
20:25technomancyso... the gpg guide doesn't actually cover credentials.clj.gpg
20:26patchworkhttps://github.com/technomancy/leiningen/blob/stable/doc/DEPLOY.md
20:26patchworkAlright, have to go
20:26justin_smithaside, it is a great time for us all to be learning gpg
20:26technomancyright; I meant `lein help gpg` specifically
20:27technomancybut yeah, I'll review the deploy guide too
20:27technomancyjustin_smith: if the rubygems breakin wasn't enough, prism is a nice object lesson in how you can never trust any system ever
20:28hyPiRionalthough you can trust one system over another
20:31technomancyhttp://tinyurl.com/lw8mnmw
20:31callentechnomancy: I spent many of my earlier years hacking with X-Files or Star Trek TNG in the background.
20:32technomancycallen: I have a treat for you: http://sttngfashion.tumblr.com/
20:32technomancyprovided you haven't already read it
20:34callentechnomancy: I have not seen this before
20:34technomancyconsider it a gift
20:34callentechnomancy: I'm already cracking up.
20:36technomancy"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:39seancorfieldhmm, 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:47noonianhomebrew has a formula for gpg-agent also
21:13SegFaultAXWhat 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:15trptcolinSegFaultAX: i'd recommend a real message queue for anything serious. something like RabbitMQ, HornetQ, or others similar
21:15trptcolinusing Redis as a message queue in production can be pretty scary
21:17trptcolinboth rabbit & hornet have some pretty good-looking client libraries around them; i've only interop-ed w/ the java client libraries myself
21:28seangroveSegFaultAX: We're using resque right now, until we're fully migrated away from our legacy ruby workers
21:28seangroveMongoCongo is supposed to be quite good if you're using MongoDB already
21:29seangroveUltimately we'll likely move to kestrel/storm
21:29tomjackdnolen: 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:29Raynesseangrove: You mean congomongo
21:29Raynes?
21:29seangroveRaynes: presumably :)
21:29tomjackin 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:29seangroveAh, that doesn't look right at all
21:29tomjackthe latter seems probably wrong, so I'm guessing ties with a set is an abuse of unification
21:30seangroveJust looks like a mongodb access layer
21:34seangroveSegFaultAX Raynes: I meant https://github.com/circleci/congomongo-mq in this case, actually
21:37callenseangrove: use-case?
21:37seangroveSegFaultAX asked for task/work queues
21:38callenoh right.
21:38callenseangrove: kestrel/storm are probably way overpowered for what he wants though.
21:39seangrovelikey, yeah
21:57callendsantiago: http://i.imgur.com/f7A12FW.jpg on the way home from the shelter.
21:58ddellacostacallen, cute! nice dog.
21:59ddellacostaanyone know why fixtures aren't working w/clojurescript.test?
21:59callenddellacosta: not my dog. pffft, I wish.
21:59callenddellacosta: I'm just nuts about pitbulls.
22:00trptcolinddellacosta: yeah, i shaved that yak a bit, had a partial patch at one point
22:00trptcolini should have reported it, sorry cemerick... it's to do with namespace munging
22:01trptcolinlemme dig up the workaround i was using
22:01ddellacostatrptcolin: 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:01ddellacostatrptcolin: cool, that'd be super helpful--thanks!
22:01trptcolinit's just the outer sugar that doesn't work as i recall
22:01ddellacostatrptcolin: huh, okay…so, something like calling register-fixture! directly will work perhaps?
22:01trptcolinthat sounds familiar
22:02ddellacostalemme give that a shot real quick
22:02trptcolin[i've since moved over to specljs, hence the bad memory and lack of patch-finishing]
22:03ddellacostatrptcolin: ah, okay…I'm still figuring out a good CLJS testing workflow, I'll have to check out specljs too
22:03ddellacostait's still mighty rough around the edges
22:04trptcolinddellacosta: 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:05ddellacostatrptcolin: 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:05trptcolinyeah, something like (register-fixtures! ns-name :each fixture-name) is what i was using to work around
22:05trptcolinyep
22:06ddellacostabuilding out an actual production app has really exposed the missing bits, and given me more incentive to contribute
22:06ddellacostaCLJS has so much potential, we just need to clean up some of this to make it easier to get going.
22:06ddellacostabut I digress.
22:08ddellacostatrptcolin: excellent, that last bit did it--thanks so much!
22:08trptcolinsure thing
22:10trptcolinyeah, 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:11ddellacostayeah, in fact, just looking at that now--I'll see if I can't get it working and post a patch
22:13trptcolincool, 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:13ddellacostaI 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:35tomjackit would be really nice to be able to get a channel for a core.logic goal run
22:36tomjackI 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:36tomjackif I could watch the answers come out I could just kill it when I'm satisfied
22:36tomjackand presumably you could then pause execution and resume
22:41futileLet's do this.
22:43futiletrptcolin: thanks for reply, it's pretty awesome.
22:44trptcolinfutile: my pleasure
22:45futileYeah, what does "you're welcome" even mean, anyway? Welcome to what, or where?
22:45futileAnd "any time" isn't really true. Not 3am I'm willing to bet.
22:46trptcolinprobably not
22:46futileAnd "sure thing".. you can't promise that, what if you're stuck in traffic? Not so sure then.
22:46trptcolinwhelp
22:46futileLanguage is weird.
22:47futile... but I love to digress.
22:53futileFeeling torn about morals, is this project a wrong thing to do?
22:53futileI mean, on one hand, it's a legitimately useful thing, and we would all benefit from it.
22:55futileOn 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:55futileWhy do all the projects I ever work on turn into exactly that dilemma? ...
22:55ToxicFrogWhich project is this?
22:56seancorfieldNo project is the "wrong" thing to do. But don't take it personally if folks don't beat down your door to help.
22:56futiletest2
22:56futileseancorfield: not at all what I'm taking personally
22:56seancorfieldI just meant it as general life advice :)
22:56futileOh, good advice.
22:57futileI'm questioning this project's existence from a moral perspective.
22:57seancorfieldI'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:57futileShould it exist? I'd love to use it, and I'm pretty sure many people would benefit from it a lot too.
22:57seancorfieldScratching a personal itch is always good practice, in terms of producing OSS :)
22:58callenfutile: the fuck are you talking about?
22:58futilecallen: ...?
22:58seancorfieldI 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:58callenfutile: I mean, I'm skeptical of test2, but why would it be the wrong thing to do?
22:59callenseancorfield 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:59futileseancorfield: 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:59seancorfieldfutile: it's not hurtful to say there's no commonality in test reporting :)
22:59futileseancorfield: you wrote clj-time? cool, thx bruh
22:59callenfutile: with regards to expectations, it looks pretty cool, but I'm not surprised it doesn't have PRs or issues either.
22:59seancorfieldcallen: I'm so thick skinned, I don't even remember...
22:59callenseancorfield: the mixed plurals/singulars.
23:00futileseancorfield: "our tooling around test frameworks is pretty awful" is hurtful to those who wrote it with good intentions
23:00callenI 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:00futilecallen: TBH I thought it was dead considering all the tutorials were 3-year-old blog posts
23:00seancorfieldfutile: 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:00callenthe real secret to OSS is Tom Sawyer.
23:00futileseancorfield: oh then un-thd
23:00futile*un-thx
23:00futilecallen: what a terrible song
23:00callenfutile: I was making a literary reference.
23:01seancorfieldI didn't write java.jdbc either. I took that over from Stephen Gilardo. Although 0.3.0 is pretty much a complete rewrite...
23:01futilecallen: what a terrible name for a book
23:01seancorfieldI did write fw1-clj but no one uses that...
23:01futilejk
23:01futileseancorfield: !
23:01futileseancorfield: that's what got me into this trouble in the first place!
23:02seancorfieldBy tooling around test frameworks, I mean the displaying of results and the integration into IDEs etc...
23:02callenaccessibility, marketing, and usefulness define a lot of what makes an open source project popular.
23:02seancorfieldFW/1 for CFML is very popular :) That's why I ported it to Clojure...
23:02futileseancorfield: 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:03futileseancorfield: and i was using clojure.java.jdbc!
23:03callenfutile: your postgres instance was misconfigured.
23:03futileseancorfield: turns out it was speclj's auto-runner's fault, it runs all tests in a new thread every time you change something
23:03callenand you weren't harvesting old connections.
23:04futilecallen: i spent *hours* trying to debug that and everyone said my PG config was fine and my usage of JDBC was fine.
23:04callenfutile: I spent hours trying to get you to check your PG config and read the docs to begin with.
23:05seancorfieldsounds 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:06callenseancorfield: he just kept spawning new threads and wasn't harvesting anything.
23:06seancorfieldI'd have to look at your exact setup again to see what was wrong... And actually try it out with speclj I guess...
23:07futileseancorfield: I'm not sure that's worth it at this point.
23:07futileFWIW this is how Speclj's auto-runner works: https://github.com/slagyr/speclj/blob/master/src/speclj/run/vigilant.clj#L60-L68
23:08futileMicah 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:08futileThat's all I know.
23:08callenI wonder if there's a way to make the connections persistent and reused across threads?
23:08futileWell 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:09futileSeems like Jetty+Ring+PG means having a blocked DB after 5 seconds of running.
23:09callenfutile: yes, all this time Clojure API servers and web apps have been totally broken all this and we just hadn't noticed
23:09noonianit re-uses threads from a thread pool I think
23:09callenfutile: thank you for pointing this out, I'll go warn everybody.
23:09futilecallen: Good idea.
23:10callennoonian: it does but not in the way an async framework does.
23:10futilestart with the mountains and hills.
23:10callenit works fine.
23:10futileYes, I admit, I forgot that people use Ring+Jetty+PG.
23:10callenRing + Jetty + PG works fine
23:10nooniancallen: don't most async frameworks run in a single thread and just simulate multi-threading?
23:10callennoonian: only dumb ones.
23:10futileWhich points to either me still using the stuff wrong, or speclj messing it up.
23:10callennoonian: one of them is named Node.js
23:10callenfutile: it's speclj that's the fuckup here.
23:11futileAre you so sure it wasn't me?
23:11callenfutile: Ring + jetty works fine with DB connections and connection pooling.
23:11nooniancallen: yes
23:11futileDid you look at that link?
23:11callenfutile: I mean, I'm open to it being your fuck up too. I'd call that high odds possibility.
23:11callenbut you're here and the creator of speclj isn't, so he gets the mud.
23:11futile:P
23:11futileYou have such a way with words.
23:11futileA terrible one.
23:12futileNot sure I can really take your moral advise seriously :P
23:12futile*ADVICE! not advise. WOW what a typo!!
23:13callenfutile: http://www.eclipse.org/jetty/documentation/current/jndi-datasource-examples.html
23:13callenfutile: I'm excellent with words, you just don't like how I use them.
23:14futileI don't like it because I'm right and you're wrong.
23:14callenat'll be the day.
23:14callenanyway the point of the above Jetty link
23:15futileDon't mess with me cowboy, or you'll realize you're dealing with a ninja, alright rockstar?
23:15callenwas to highlight that DB connection pooling has been a thing with Jetty for bloody ages.
23:15futileOh man yesss, I got all 3 in one sentence.
23:15futileah, kthx
23:15futilekthx, kthx indeed.
23:15callenand that one of the blessed libraries is bonecp, which is what I recommend to people in here.
23:15futileyes, yes you have. twice.
23:15seancorfieldfwiw, we use c3p0 at world singles (with mysql)
23:15callena separate thread pool is maintained for both request handling and db connections in this case.
23:16callenseancorfield: bonecp would be a quick and easy swap. You should test query latency with each if you ever get the itch.
23:16futileseancorfield: do you guys have any (expect) assertions at the top-level of any file, outside of some function?
23:16seancorfieldwe may well... although "it ain't broke" right now :)
23:17callenseancorfield: 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:17seancorfieldyes, all our expect's are top-level - that's how Expectations works
23:17futileffff
23:17callenseancorfield: oh you do use Expectations?
23:17futileokay thats actually not bad.
23:17callenso it does have users. hah.
23:17futileyeah he switched from clojure.test to it
23:17futileyou should read that blog post
23:17callenI'll probably keep using c.t
23:17seancorfield(given some-expr (expect f1 v1 f2 v2)) is the other format
23:17futilepersonally i do prefer (expect) function better, although i hate its magicalness
23:18callenI 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:18callenspeaking of
23:18futileMe, the user, has to guess how it works. Sometimes it compares values literally, sometimes it treats the first arg as a test-function
23:18futileBut what if the first arg is a MAP?
23:18futileWHO KNOWS.
23:18futile(Maps act as functions)
23:18seancorfieldattaching 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:19seancorfieldit seems to me (expect) is very very intuitive
23:19seancorfieldit does exactly what i expect (groan!)
23:19futileseancorfield: have you not run into that question then?
23:19seancorfield(expect value expr)
23:19seancorfield(expect exception expr)
23:19seancorfield(expect test-fn expr)
23:19futilebut maps are test-fns
23:19callenthe joys of IFn.
23:19seancorfieldthose all ready very cleanly
23:20futile(expect {:foo :bar} :foo) should this pass or fail!?
23:20futileNOBODY KNOWS.
23:20futile(I mean except those who tried it.)
23:20futile<-- I'm with that guy.
23:21futile(on this one.)
23:23callenfutile: it's obviously a truthiness test.
23:23futile...
23:24futileIt'd have been solved by just doing (expect= value expr), (expect test-fn expr), (expect-error Exception expr)
23:24seancorfieldoh, sorry, was reading something... it should fail (of course) otherwise it wouldn't be very intuitive
23:24futileseancorfield: and how does it know it should fail if Map implements IFn? thats the question that scares me
23:25futileor to generalize it could have just been (expect = a b), (expect empty? []), (expect (throws? Exception) expr)
23:25futileNothing wrong with an explicit = in there like htat
23:25TimMcNo, you could always use a wrapper: (expect (is value) expr), where `is` is (partial partial =).
23:25callenI don't think expect requires the use of throws?
23:25futileBut then again I'm an arrogant jerk and know-it-all so never mind.
23:25TimMcMidje does this.
23:26seancorfieldfutile: have you actually _read_ the Expectations documentation?
23:27futileTried to.
23:27callenseancorfield: he doesn't read docs, we've established this.
23:27futileGot pretty far I thought.
23:27futileGuess not far enough.
23:27callenseancorfield: he didn't like the postgres documentation which is some of the most thorough of any OSS project.
23:27futileLike I said, ignore me.
23:27callenfutile: you need to buy a printer
23:27futileDo what callen does.
23:27callenfutile: print out the documentation to the software you use, throw out all your magazines, and put the docs in your bathroom.
23:27callenfutile: then you'll have no excuses.
23:28futilecallen: ok
23:28seancorfieldtbh, 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:28futilein all seriousness, just ignore me.
23:28futileI'm arrogant and rude and ignorant.
23:28seancorfieldand we find expectations to be extremely easy to use at world singles
23:28callenfutile: please stop talking about yourself.
23:28futilecallen: and self-centered!
23:28callenfutile: it's just as tedious when it's negative as when it's positive.
23:29futiledone
23:29callenseancorfield: I was impressed by expectations examples, but I prefer defn oriented testing libraries.
23:29seancorfieldfutile: 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:29callenseancorfield: do you stay strictly within the confines of "unit testing" in your usage of expectations?
23:30futilecallen: tell him i cant answer that
23:30futilecuz of ur rules
23:30callenfutile: still tedious.
23:30futilefffff
23:30callenseancorfield: if not, how do you handle exercising the greater scopes of the stack?
23:30futileseancorfield: ok, typing the quickest one I can, so callen won't yell at me
23:30callenseancorfield: I'm a fan of API testing, which is why I ask.
23:30callenhow is it I become the bad guy?
23:31callenbbloom: don't answer that.
23:31seancorfieldcallen: we use Expectations for BDD/TDD moreso than "unit testing"
23:31futilecallen: who said the bad guy is the one who yells at people?
23:31devnheh, https://github.com/rplevy/swiss-arrows is pretty rad
23:31futilecallen: in this case you'd be right for it. i.e. the good guy
23:31callendevn: been watching the -?> conversation?
23:31devncallen: actually no
23:31devnwhat's up with that?
23:31callendevn: you should be. hit up the mailing list. They're talking about salvaging threading macros from contrib.
23:31devni just love the naming -- "the diamond wand"
23:32callendevn: I tried to get people to call -> the winchester for ages.
23:32callenno dice.
23:32devncallen: we've had this discussion :)
23:32futileseancorfield: its so hard to cut out all the boring parts of my background. oh man. this is hard.
23:32callendevn: yes.
23:32seancorfieldcallen: for example, we used Expectations to test-drive the development of a REST API we built (in another language)
23:32callenfutile: Do you work as a programmer? If so, how long? Any specialty?
23:32callenfutile: it's easy to make it compact. Follow the above format.
23:32futileseancorfield: 1) i do Clojure for a living. 2) i have been in the industry either 3 or 5 years.
23:32callenseancorfield: well that's API testing.
23:33seancorfieldfutile: is this you? http://blog.8thlight.com/steven-degutis/archive.html
23:33futileshhhhhiiiiii
23:33futileyes.
23:33futilebut dont judge me, i was young and naive!
23:33futile(... 5 months ago)
23:33seancorfieldcallen: well, that's just one example of how we BDD/TDD stuff
23:33devnchouser and jclaggett rewrote every single clojure macro to match cond->>
23:34seancorfieldbut i suppose that's very API-focused
23:34devnit was very interesting to see code written that way
23:34futilei admit, i did Ruby for a living for 2 years :'(
23:34devnit was very imperative looking
23:34devnbut entirely functional
23:34futileIM SORRY OK!?
23:34devnfutile: *shrug* nothing to be sorry for
23:34futiledevn: >:|
23:34callenfutile: the sidebar stuff isn't high-value. Most people here are on their nth language.
23:34devni still do ruby. there are a lot of people who need ruby work done.
23:35callenfutile: very few people here outside of Raynes got to make their (paying portion) career 100% Clojure.
23:35futileif i lose this Clojure job and have no options but Ruby again, I might quit this career entirely.
23:35callenfutile: this isn't #haskell, the self-flagellation for lack of loyalty to the cause is a waste of time.
23:35devnheh
23:35futilecallen: no, its because i always hated OOP. always.
23:35callenfutile: that's melodramatic and stupid. Have you ever worked a truly shitty job like working in a factory?
23:35futileso much unnecessary complexity!
23:35futileITS JUST DATA AND FUNCTIONS PPL!!
23:35devnhate is a bit strong
23:35futileyes, yes it is.
23:35futilecallen: yes.
23:36futilecallen: I've worked third shift in a factory actually
23:36futilecallen: I've delivered pizzas for years too.
23:36callenfutile: then you should know better than to say coding in Ruby merits quitting programming.
23:36futilecallen: I think I liked those jobs better, despite the lack of pay
23:36callenyou clearly don't have to support anybody but yourself.
23:36futilei have a wife and 4 kids
23:36futilebut factory jobs round these parts pay well
23:36devni 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:37futilehey look over there
23:37callenUse whatever works. Ruby is fine for what it's usually used to accomplish.
23:37callenso is Python, etc.
23:37futiledevn: thats the thing. i can honestly say i really dislike probably all ruby code ive seen.
23:37callenI don't "favor" Ruby and Python, but they're hardly sinful.
23:37futilenot enough to turn down a ruby job, no. ia dmit.
23:37devnfutile: then you aren't well read
23:37futilebut now that ive used clojure for this long, i really dont wanna go back
23:37seancorfieldi sympathize - i dislike ruby's syntax and therefore nearly all ruby code... it's a personal preference thing...
23:38futileits not about its syntax. syntax is nice, but its basically nothing
23:38callenI find the way Ruby is written to be more problematic than Ruby itself.
23:38futiledesign is the problem.
23:38callenI have a similar relationship with Java incidentally.
23:38futileeveryone does terrible, terrible things with ruby and python and etc
23:38callenyou clearly haven't done any CL or Perl.
23:38callen"terrible, terrible things" takes on a new meaning there.
23:38futileseriously. class after class after class to do JUST ONE THING.
23:38mthvedtthe worst thing about those languages is the feeling they're entitled to do terrible things
23:39futileoh! i got it.
23:39futileover-complexity.
23:39callenI'd like to think this channel is above the 5 minutes of hate thing.
23:39futilethose languages breed it like rabbits.
23:39callencan we not hate on other tools people use and enjoy
23:39noonianin perl its often a badge of honor
23:39devndudes, you can write good code in any language. that's *your* job.
23:39callenand focus on being productive?
23:39futilecallen: yes.
23:39seancorfieldso 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:39futilestarting now.
23:39devnquit blaming languages and write better code
23:39futileseancorfield: they fired me about 7 months ago
23:39futileits ok, i got a new gig.
23:40callenfutile: how old are you?
23:40devnresistance is futile
23:40futile(inc devn)
23:40lazybot⇒ 7
23:40futilecallen: im ashamed to answer that
23:40devnso dont
23:40futile*too
23:40devnit is immaterial
23:40seancorfielddevn: 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:40callenwhy would age be a matter of shame?
23:40mthvedtcallen: there is value in metadiscussion. also, i don't understand the purpose of the age question
23:40futilecallen: because im old enough to know better than to say this much stupidity in 10 minutes on IRC
23:41callenfutile: I'm just trying to mentally place where you are in life/career.
23:41futilecallen: its enough to know im married with 4 kids
23:41futile27
23:41callenfutile: where in the country are you? I'm in the bay area.
23:41devnseancorfield: 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:41seancorfieldwell, 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:42seancorfielddevn: 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:42devnthe preferences i have in clojure are *subtle*
23:42devnseancorfield: exactly
23:43seancorfieldbiab
23:43futileOkay serious mode.
23:43callendevn: I've found cause to use FP in JS a fair bit, although I don't compare with nolen on that front.
23:43futileYou can tell from the proper punctuation, spelling, and capitalization.
23:43callenfutile: so what part of the country are you in? As I said I'm in the bay area.
23:43futilecallen: I'm near Chicago.
23:44futileNot close enough to get a job there, though, commute is too long.
23:44devncallen: FP in JS is strangely normal in my experience.
23:44futileSo yes, I'm one of the luckiest guys in the world.
23:44futileI have a full-time Clojure job and I get to work from home.
23:44callendevn: I just ignore prototypes and abuse partial application and scheme'ish FP.
23:44devncallen: yeah, it's kind of obvious, no?
23:44devnunderscore + anything = good times
23:44callendevn: uhm, you'd think, but I was sort of a rare bird among the JS'ers I know.
23:45callendevn: yeah _.js is critical.
23:45devncallen: i was programming with some backbone folks and nearly everyone on my team got into FP through underscore
23:45devnthey immediately began to recognize clojure stuff i was showing them
23:45devngroup-by? no problem.
23:45callendevn: I stay far afield of backbone these days. AngularJS has done a really good job of gift-wrapping that "scale" of web app.
23:45devnyeah, i like angular myself
23:46callendevn: such that I default to Angular once I hit a certain level of complexity.
23:46devnjust saying -- they were very open after seeing underscore in practice
23:46futileI added _.js to Zephyros, it didn't help much.
23:46futileAny of you guys on OS X?
23:46Raynesfutile: You have a full time job bitching about Clojure test frameworks?
23:46RaynesAre they hiring?
23:46devnonce we worked through a few semi-complex data problems with underscore they never wanted to go back
23:46callenRaynes: <3
23:46devnlol
23:46futileRaynes: if I can get us making more money, sure.
23:47callendevn: if the alternative is spaghetti, yeah.
23:47futileOSX anyone?
23:47devnfutile: 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:47callendevn: only thing that isn't nice about doing FP in JS is that there's a lot of });
23:47RaynesUnderscore is the bee's knees, its legs, and its arms.
23:47callenwhich is sort of a given.
23:47callenRaynes: I didn't know you did any JS.
23:47brehaut~anyone
23:47clojurebotJust 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:47futiledevn: 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:48Raynescallen: I've been known to write JS on occasion. See: refheap.
23:48RaynesOf course, refheap's js doesn't use underscore.
23:48devnfutile: no need to apologize, just try and keep it moving in the direction of joy
23:48callenRaynes: oh right duh. Sorry.
23:48RaynesBut my boss is using it for something at work.
23:48futiledevn: And can you dec me enough to get my reputation gone plz?
23:48RaynesAnd it seems really nice.
23:48devnnah
23:48callendevn: joy? wrong programming language. :P
23:48devn(inc futile)
23:48lazybot⇒ 2
23:48futileI wish I had my anonymity back.
23:48callenRaynes: it's a good way of wrapping common-case collection processing in something more or less FP'ish in JS.
23:49futiledevn: joy, one of the fruits!
23:49devnso what are we talking about now?
23:49devnhow you don't like things?
23:49callendevn: _.js
23:49callenall underscore all the time.
23:49futileAnyone on OSX?
23:49callen~anyone
23:49brehaut~anyone
23:49futileI got a gift for anyone who's on OSX.
23:49clojurebotJust 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:49devnfutile: are you trolling, or?
23:49clojurebotJust 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:49futilehttps://github.com/mattgemmell/zephyros
23:49brehautcallen: o/
23:50callenbrehaut: o/
23:50futileThe only sane WM I've found for OSX. Ever.
23:50devnfutile: ill give it a look, but there's danger in believing in window managers
23:50futileTry it with this dotfiles: https://github.com/evanescence/dotfiles/blob/master/home/.zephyros.coffee
23:51futiledevn: like I said, the only sane one I've found for OSX.
23:51brehautfull screen emacs for life
23:51Raynesfutile: No.
23:51futileRaynes: k.
23:51futileLook, gifts don't have to be accepted.
23:51futileTake it or leave it. Your call.
23:51devni've seen strong swimmers and mighty sailors descend into wild OCD configuration-fits over OSX WMs
23:51futileThis one is different.
23:51devni write code in my OS
23:51futileIt's grid-based, which makes it really really awesome.
23:52devnit's weird. i'm productive without bells and whistles.
23:52devnwhodathunk?
23:52futileIn other words, since it's grid-based, you never have to edit the thing. It Just Works(tm).
23:52futileI've been using the same config since I wrote the WM about 4 months ago.
23:52devnfutile: this tiles native windows?
23:52callenI'm pretty happy with my vanilla Xmonad, which I get to use because I'm not an Apple sharecropper.
23:52futiledevn: yes.
23:53callenI used to use OS X though and swap between it and Linux. I got tired of doing without Xmonad though.
23:53devnfutile: how the hell is that possible and why isn't xmonad dipping into that pool?
23:53futiledevn: read the source, I wrote it to be as easy to read as possible.
23:53brehautcallen: brian mckenna has written an OS X backend for xmonad
23:53devn(which sucks)
23:53futileA friend of mine told me.. hold on let me quote him verbatim.
23:53devnbrian mckenna is a brilliant dude, but osxmonad is broken
23:53devn...deeply broken.
23:53callen^^ yeah.
23:54futile"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:54callenI tried to make it work, it didn't, so meh.
23:54Raynesdevn: In that I couldn't get it to run, yes.
23:54devnI recompiled like 10 times, cabal hell twice
23:54devni tried really hard
23:54devnbut that shit is totally broken
23:54futileAnyway, 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:54futileNobody else knows about it but you guys. It's our secret.
23:54devndo i need to sudo to use it?
23:54futileNo.
23:55devnlol i was kidding
23:55futileI can't tell humor anymore.
23:55devnit just sounds too good to be true.
23:55devnso naturally...
23:55devnfutile: you need a "Quickstart"
23:56RaynesHe didn't write it.
23:56devnoh, well there's that.
23:56RaynesI misread the "since I wrote it" comment too.
23:56RaynesHe meant since he wrote his config.
23:56devnoh, heh
23:56RaynesBut forming sentences that make sense is difficult.
23:56RaynesI have that problem too.
23:56futileRaynes: I did write it.
23:56futileRaynes: Look at the commits.
23:56Rayneswat
23:56RaynesYou're Matt Gemmell?
23:56devni are wanting to make a zephyros that are a working?
23:56futileNo.
23:56devnare you a help guy?
23:56futileNo.
23:57RaynesYou're making no sense, sir.
23:57futileI wrote it and got a really inflated ego and gave it to someone else so I could deflate my ego.
23:57devnyou're on the very edge of my ignore, dude
23:57futileNot 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:57callendevn: which is impressive, given that I'm not on it.
23:58devncallen: heh
23:58RaynesI don't much care for /ignore.
23:58futiledevn: I have no idea why you'd say that. Maybe you think I'm trolling.
23:58RaynesI have the ability to just not listen to people.
23:58devnRaynes: i dont either, but there's a threshold sometimes
23:58devnsome trolls are too damn good
23:58futileI just find this app super useful and wanted to share that with you.
23:58RaynesThere was a time when I thought about /ignoring callen.
23:58devnfutile: it sounds like you're bad mouthing the author
23:58futileSeriously, I'm not tro-- oh never mind.
23:59futiledevn: look at the commits. They don't lie.
23:59futilehttps://github.com/mattgemmell/zephyros/commits/master
23:59callenRaynes: but you learned to wuv me.
23:59RaynesHad I done that, we wouldn't have shared our magical moments on the Santa Monica pier, devn.
23:59devnRaynes: speaking of which, ill be in SF in the next few weeks. hopefully we can meet up
23:59callendevn: he's not in SF.
23:59RaynesI'm nowhere near SF.
23:59callendevn: but I'm in the bay area.
23:59devni know this :)
23:59futileThis is the most confusing night I have had in a while.
23:59devnill rent a car and visit
23:59callendevn: you could meet me. There's at least 3 or 4 people in here who can attest to my not being an axe murderer.