2013-06-11
| 00:01 | futile | It's like, the people who discovered all these cool things you can do with a homoiconic language just couldn't get over the novelty of it all, and decided to standardize using them in real programs. |
| 00:01 | futile | Sure, fine, recursion is cool. But it's confusing too, so stop using it now that you're not in CS class anymore. |
| 00:02 | futile | etc etc |
| 00:02 | futile | ok done |
| 00:02 | futile | Hey, what do you guys think of ClojureScript? |
| 00:03 | apricots | futile: great but the whole compilation in java land is sluggish |
| 00:03 | Intensity | Hi. I'm wondering how I can create a hash map on the fly without using flatten: (apply hash-map (flatten (map (fn [k] [k (inc k)]) (range 6)))) |
| 00:04 | xeqi | &(into {} (for [k (range 6)] [k (inc k)])) |
| 00:04 | lazybot | ⇒ {0 1, 1 2, 2 3, 3 4, 4 5, 5 6} |
| 00:04 | Intensity | xeqi: Cool, thanks much! |
| 00:05 | amalloy | i recommend xeqi's approach, but you could also just throw away the flatten and replace map with mapcat, Intensity |
| 00:07 | futile | ,(doc dec) |
| 00:07 | clojurebot | "([x]); Returns a number one less than num. Does not auto-promote longs, will throw on overflow. See also: dec'" |
| 00:07 | futile | I think that can be shortened to "Returns a number less one." |
| 00:08 | futile | More poetic, more concise, and just as correct. |
| 00:12 | ivaraase1 | futile: had a second look at test2 BTW. seems pretty cool |
| 00:13 | futile | ivaraase1: thanks |
| 00:14 | futile | I'm hoping to regain some lost morale soon, and finally finish the spec and make some cool extensions. |
| 00:14 | futile | I made a pretty stupid mistake announcing it before it was completely done. |
| 00:14 | futile | Especially in the presence of some people who took it personally. |
| 00:17 | tomjack | on the list? |
| 00:17 | futile | I can think of no good reason that we have 4 different incompatible testing libs which mostly do the same thing. |
| 00:17 | futile | tomjack: yeah |
| 00:18 | futile | I can think of one really bad reason though. |
| 00:18 | futile | Prid.e |
| 00:18 | futile | *Pride. |
| 00:20 | futile | When I had to delete several thousand lines of my own code, it really helped me get past my pride and focus on being productive rather than being selfish. |
| 00:21 | futile | Okay, morale is back. Kinda. (Mostly just as a variation of being annoyed.) |
| 00:23 | ivaraase1 | futile: same thing being a journalist. you delete more than you write, and often have to cut your favourite sources short, so we're indoctrinated with the "kill your darlings" philosophy |
| 00:23 | futile | ivaraase1: yay! so I'm not crazy after all :) |
| 00:24 | ivaraase1 | well, to be fair, I'm somewhat crazy |
| 00:24 | futile | You really just can't take things personally in this business. |
| 00:24 | ivaraase1 | 10/10/20 weekends do something with your sanity :P |
| 00:24 | futile | Code is code, doesn't matter who wrote it, doesn't matter who came up with the idea. Good code is good, and bad code is bad, that's all. |
| 00:24 | futile | ivaraase1: so you're a coder and a journalist? |
| 00:25 | ivaraase1 | well I'm stepping down as editor in chief and probably pursuing DSP, so yeah |
| 00:25 | ivaraase1 | at least programming has semi-sane hours |
| 00:26 | futile | ivaraase1: :) |
| 00:27 | ivaraase1 | futile: and you? |
| 00:27 | futile | I don't know what half the stuff you said is, but it sounds neat. |
| 00:27 | futile | I'm not a journalist, no :P |
| 00:27 | ivaraase1 | futile: lucky :P |
| 00:27 | futile | I just work on a small commercial website for a living. |
| 00:28 | futile | I'm pretty glad that it's written in Clojure. |
| 00:28 | futile | Most of my career was Ruby or Python or ObjC or whatever. Finally I found a language I can work with easily. |
| 00:28 | futile | I don't know if that says more about me, or about Clojure, or about Ruby :) |
| 00:28 | futile | (Ruby being the main one I used.) |
| 00:29 | ivaraase1 | yeah. our newsaper is mostly a Java shop. trying to sneak in a bit of Clojure here and there |
| 00:29 | futile | Exciting! |
| 00:29 | futile | One day hopefully it'll be 0% java and 100% Clojure, then you'll be able to party. |
| 00:29 | ivaraase1 | oh I long for that day |
| 00:29 | ivaraase1 | most of our internals are Spring apps |
| 00:30 | ivaraase1 | also some custom publishing system, somewhat unstable, but doesn't need to do much. (it basically typesets text to a given template and generates XML) |
| 00:31 | futile | Sounds scary. |
| 00:33 | ivaraase1 | it is. not as bad as geologist code, though. that stuff is truly horrible |
| 00:33 | futile | How do you know? |
| 00:34 | ivaraase1 | because I transferred from petroleum science this semester. |
| 00:35 | futile | Oh I see. |
| 00:36 | ivaraase1 | I mean, you can't really blame them. people hardly get any training in Java or Matlab |
| 00:37 | futile | Most of the things you're saying, I don't understand :) |
| 00:38 | futile | But I'm good at smiling and nodding :) |
| 00:38 | callen | ivaraase1: Spring apps? you poor bastard. |
| 00:39 | ivaraase1 | callen: the failover strategy is to reboot the system via ssh :( |
| 00:42 | futile | tbaldridge: ha |
| 00:43 | futile | re mailing list |
| 00:43 | futile | bbloom: why would you want to split finding tests out of the Runner role? |
| 00:44 | futile | bbloom: the one reason you mentioned seems like it's not a common- or strong-enough need to merit the complexity it would need |
| 00:45 | bbloom | futile: parallel test runs? |
| 00:45 | futile | bbloom: you could do that with the setup we have now. |
| 00:45 | bbloom | i dunno |
| 00:46 | futile | bbloom: https://github.com/evanescence/test2-autorunner/blob/master/src/test2_autorunner/core.clj |
| 00:46 | bbloom | i just think it's weird that the runner takes a predicate instead of a list of tests |
| 00:46 | bbloom | s/parallel/distributed/ ? :-) |
| 00:46 | futile | just imagine that instead of doing (map run-test-fn test-fns), it did them with pmap |
| 00:46 | futile | bbloom: it used to take a seq of test-fns and that was all. |
| 00:46 | futile | bbloom: but then I wanted to write test2-autorunner |
| 00:47 | futile | bbloom: and realized, I need some way to reload all the test files and find new tests in them and run those too |
| 00:48 | futile | bbloom: hence now it takes a reporter (so it can run the tests several times and pass the results to it each time), a list of namespaces to only look in (or nil for the whole project), and a matcher function to optionally filter tests out |
| 00:48 | futile | bbloom: which I think is a good compromise that enables very flexible runners. |
| 00:48 | bbloom | *shrug* i'm probably the wrong guy to get feedback from, since i personally don't give a shit about test runners at all |
| 00:48 | futile | bbloom: The problem I still see with Runners is that you can't compose them easily. |
| 00:48 | futile | bbloom: ffffffff |
| 00:48 | futile | I'm literally the only guy interested in fixing this stupid problem. |
| 00:49 | bbloom | lol sorry man, but please, keep on fighting the good fight |
| 00:49 | bbloom | if you make something cool, i'll use it |
| 00:49 | futile | Really I just wish Jay Marick Micah and Stuart just worked together on this lib in the first place. |
| 00:49 | bbloom | i use test frameworks b/c they are convenient |
| 00:50 | tbaldridge | futile: I think that would be a futile endevor. They all have very very different points of view on how things should be done |
| 00:50 | futile | (demoralize futile) |
| 00:50 | bbloom | but really, most of my test code is shell scripts that return 0 or 1 |
| 00:50 | bbloom | i like smaller components with test suites that are fast enough to run in their entirety |
| 00:50 | tbaldridge | futile: one other point, people don't use Ring because we all agreed it was the right way to do it. One guy built it, and eventually everyone saw the light of day |
| 00:50 | bbloom | i like code that is pure enough to allow arbitrary execution of small parts w/ some test values |
| 00:50 | tbaldridge | build it, and they will come |
| 00:51 | futile | You know, the discussion with people on this subject has taken way more time than writing the thing itself would have. |
| 00:51 | bbloom | i generally write (comment ……………) in my code and eval forms when shit changes |
| 00:51 | futile | tbaldridge: that was my plan |
| 00:51 | bbloom | i almost never run my test suites, even when i have them, relying on CI to tell me when i've fucked up |
| 00:51 | bbloom | but i'm a crazy person |
| 00:51 | bbloom | sooo ignore me |
| 00:51 | arohner | futile: actually, from reading the spec today, I thought the runner is still too high-level to build real abstraction on |
| 00:51 | futile | tbaldridge: the only reason I keep talking about it is cuz (1) im afraid to get fixtures wrong, and (2) marick keeps pressuring me to "open up discussion" |
| 00:52 | futile | arohner: oh? |
| 00:52 | arohner | IMO, you should be talking about data and protocols |
| 00:52 | arohner | one sec while I get it open again |
| 00:52 | bbloom | personally, i think `git diff` is the best test framework ever |
| 00:52 | bbloom | i like to ./do-some-shit > expected.json or whatever |
| 00:53 | bbloom | then git diff, manually eyeball it, and then git add if it's good or git checkout if it's bad |
| 00:53 | arohner | futile: I don't understand why the runner needs to take ns-syms and matcher-fn |
| 00:53 | arohner | it seems too high-level |
| 00:53 | arohner | also, I like the split between discovering and running that other people have mentioned |
| 00:53 | bbloom | but i'm way off topic & not being productive, so go back to ignoring me |
| 00:54 | arohner | if you want to take the WWRichDo approach, define a bunch of protocols with like one or two functions in them, each doing as little as possible |
| 00:54 | futile | arohner: it used to take a seq of test-fns and that was all. but then I wanted to write test2-autorunner and realized, I need some way to reload all the test files and find new tests in them and run those too. |
| 00:54 | futile | arohner: hence now it takes a reporter (so it can run the tests several times and pass the results to it each time), a list of namespaces to only look in (or nil for the whole project), and a matcher function to optionally filter tests out |
| 00:54 | futile | arohner: which I think is a good compromise that enables very flexible runners. |
| 00:55 | arohner | futile: when designing protocols, fuck compromise. find the smallest abstraction that works in the general case |
| 00:55 | arohner | you can build your runner on top of that |
| 00:55 | futile | arohner: I've been wary of protocols, when I saw this: https://github.com/slagyr/speclj/blob/master/src/speclj/reporting.clj#L10-L31 |
| 00:56 | arohner | "protocols" |
| 00:56 | arohner | whether you actually use defprotocol or not is a separate issue |
| 00:56 | futile | oh you don't mean defprotocol do you |
| 00:56 | futile | ah |
| 00:56 | futile | then i dont understand |
| 00:57 | arohner | I'm talking protocol in the IETF sense |
| 00:57 | arohner | in the abstract sense |
| 00:57 | arohner | as a way to communicate |
| 00:57 | futile | oh like HTTP |
| 00:57 | arohner | but I think your runner signature is too specific |
| 00:57 | futile | I agree |
| 00:57 | futile | I just don't know how to make it better |
| 00:57 | arohner | I'd make it (runner reporter seq-of-test-fns) |
| 00:58 | arohner | then Discoverer is a separate thing |
| 00:58 | futile | I'm actually not smart, all I'm really good at is getting smart people to talk to each other and come up with cool things |
| 00:58 | arohner | I've been threatening to write a test framework for a while |
| 00:59 | futile | arohner: ok then help me write this one |
| 00:59 | futile | i like this idea |
| 00:59 | tomjack | I heard reporter and was worried |
| 00:59 | tomjack | (reporter test-results) |
| 00:59 | tomjack | OK! :) |
| 00:59 | futile | tomjack: no comprendo |
| 00:59 | arohner | so once you have (runner reporter seq-of-fns), make Discovery a separate thing |
| 00:59 | bbloom | futile: also drop the er |
| 00:59 | arohner | (discover ???) returns a seq of test-fns |
| 01:00 | arohner | then you can drop (defn ^:test) as part of the spec |
| 01:00 | bbloom | define, assert, discover, execute, report |
| 01:00 | arohner | but the "standard discoverer", built on top of it can search for all (defn ^:test ..) |
| 01:00 | futile | arohner: so then its just a single Discoverer's idea of test definitions? |
| 01:00 | arohner | right |
| 01:00 | futile | arohner: but that seems like an excessive abstraction |
| 01:00 | arohner | then if I want to discover tests over the internet or whatever, I can do it |
| 01:00 | futile | nobody would ever want them defined any other way, right? |
| 01:01 | callen | I was discussing testing libraries with Segfault the other day. What's the goal with Test2 in terms of improving upon what already exists? That isn't clear to me from the spec, IRC, or mailing list conversations. |
| 01:01 | arohner | why would you assume that? |
| 01:01 | arohner | test.generative creates new test cases |
| 01:01 | arohner | clojure.test requires defns |
| 01:01 | arohner | midje doesn't use functions at all |
| 01:01 | arohner | (or it didn't, until 1.5/1.6) |
| 01:02 | arohner | quickcheck style tools invent new test cases after examining code, without having named defns |
| 01:02 | futile | arohner: because assertions need to be inside test-fns, so that they can be wrapped and have something to give its assertion-results to |
| 01:02 | futile | callen: basically, |
| 01:02 | futile | callen: the existing tools are so completely incompatible, but I want to mix and match tools |
| 01:02 | arohner | futile: requiring defns is a big limiting assumption |
| 01:03 | futile | callen: the goal of test2 is to let me do that. It just lets me use Jay's (expect) function with Micah's nestable (describe) macro, and lein-difftest for reporting |
| 01:03 | futile | arohner: well the real heart of it is assertions |
| 01:03 | futile | arohner: and assertions *must* be side-effecty in how they create assertion-results |
| 01:03 | arohner | that's fine, but they don't have to be defns |
| 01:04 | futile | arohner: but they have to be run in the context of something that can be wrapped with an (atom []) |
| 01:04 | arohner | huh? |
| 01:04 | futile | hold on hold on |
| 01:05 | futile | arohner: Once the Discoverer finds tests, he passes them to the Runner, who needs to be able to run them as a group of assertions. |
| 01:05 | futile | Right? |
| 01:05 | arohner | right |
| 01:06 | futile | And the group of assertions should probably be required to be run in the context of arbitrary code, right? |
| 01:06 | arohner | right |
| 01:06 | futile | So I can do (expect empty? (foo)) (side-effecty-code!) (expect-not empty? (foo)) |
| 01:07 | futile | Which means, each group of assertions needs to be an opaque ball of executable code. |
| 01:07 | futile | Which is perfect as a defn. |
| 01:07 | futile | No? |
| 01:07 | clojurebot | no is tufflax: there was a question somewhere in there, the answer |
| 01:07 | arohner | it's perfect as an fn, not a defn |
| 01:07 | futile | Oh. |
| 01:08 | tomjack | should the default discoverer check fn metadata in addition to var metadata? |
| 01:08 | tomjack | guess it doesn't matter |
| 01:08 | arohner | tomjack: exactly! |
| 01:08 | tomjack | you'll either have a macro or if you're pointless you can (def ^:test ...) |
| 01:09 | cbp``` | callen: have you made any progress in the rethinkdb stuff? Sorry for the hiatus but i got caught up in finding a job :(. After wednesday I'm free as a bird though and ready to continue where we left off. |
| 01:09 | cbp` | O god backqotes |
| 01:09 | futile | I'm imagining one guy's test suite being totally locked into one discoverer, not being able to swap them out once the suite is written. |
| 01:09 | arohner | why? |
| 01:09 | callen | cbp`: no, I'm caught up in the same thing |
| 01:09 | clojurebot | Why is startup slow is busy compiling the `for` macroexpansion |
| 01:10 | arohner | futile: fn rather than defn allows something like test.generative or quickcheck to build a bunch of test fns on the fly |
| 01:10 | callen | cbp`: it's still out there though. |
| 01:10 | futile | arohner: once all your tests are written with one thing, you can't easily swap them. |
| 01:10 | callen | cbp`: incidentally, Tokutek did some work on Mongo that makes it better. |
| 01:10 | futile | arohner: but then again you're right. |
| 01:10 | futile | arohner: that's what it would have done anyway with the ^:test idea |
| 01:10 | futile | Okay I'm sold arohner. |
| 01:11 | cbp` | callen: Oh? how so? |
| 01:11 | cbp` | callen: do you have a link? |
| 01:11 | futile | arohner: oh but this breaks an autorunner. |
| 01:11 | arohner | why? |
| 01:11 | clojurebot | arohner: because you can't handle the truth! |
| 01:11 | callen | cbp`: https://github.com/bitemyapp/revise |
| 01:12 | futile | arohner: the runner gets a seq of tests to run, right? |
| 01:12 | cbp` | callen: I meant for what Tokutek did |
| 01:12 | futile | arohner: well, if you create a new test while the autorunner is running, the runner won't see them until you restart the autorunner, since he's already been given a list of tests tor un |
| 01:13 | arohner | futile: meh. autorunners can be built on top of this |
| 01:13 | callen | cbp`: https://github.com/Tokutek/mongo made it ACID |
| 01:13 | callen | cbp`: it's sweet. |
| 01:14 | futile | arohner: how? |
| 01:14 | futile | i can't imagine it |
| 01:14 | arohner | reporting for any autorunner is going to be special, because there's not a single report time |
| 01:14 | futile | arohner: i'd hate to limit such a widely used (and useful!) feature so quickly |
| 01:15 | arohner | so the autorunner would call (runner ...) many times while it's alive |
| 01:15 | futile | arohner: so the autorunner would really be a discoverer then? |
| 01:15 | arohner | (while-not (time-to-die?) (runner (find-changed-files))) |
| 01:15 | futile | arohner: such that (-> (discover ...) (run) (report)) |
| 01:16 | futile | arohner: but who would contain that code you just wrote? |
| 01:16 | arohner | contain? |
| 01:16 | cbp` | ooh i see |
| 01:16 | futile | arohner: where would that code be? in which role? |
| 01:17 | arohner | in the auto-runner library? |
| 01:17 | futile | arohner: i mean in the spec |
| 01:17 | arohner | it's not a part of the spec, it's a library that uses the spec |
| 01:17 | arohner | there should be no implementation code in the spec |
| 01:17 | futile | arohner: this is hard. hold on. |
| 01:18 | futile | arohner: given your suggestion, the core of the lib glues all the roles together like this: (report-tests (run-tests (discover-tests))) right? |
| 01:18 | arohner | yeah |
| 01:19 | futile | And the auto-runner would be a custom run-tests funtion? |
| 01:19 | futile | If so, the discovering would have already been done. All run-tests does is turn a pre-generated list of tests into something the reporter can use. |
| 01:19 | arohner | (while-not (time-to-die?) (report (runner (find-changed-files))) |
| 01:19 | arohner | it'd run in a loop |
| 01:19 | futile | arohner: in which case, he can re-run them any amount of times he wants, but he can't find new tests, because that role has been done |
| 01:20 | arohner | why are you assuming "done"? |
| 01:20 | futile | arohner: because the code I wrote would live in test2.core/main, which glues the parts together |
| 01:20 | futile | and the code you write lives in test2-autorunner.core/runner |
| 01:20 | futile | but they have conflicting roles. |
| 01:20 | futile | you can't see this? |
| 01:20 | arohner | no |
| 01:21 | arohner | I think you're assuming too much implementation |
| 01:21 | arohner | a good spec should have no implementation code |
| 01:21 | futile | yeah maybe. |
| 01:21 | futile | but im really thinking you're just crazy |
| 01:21 | futile | (no offense) |
| 01:21 | arohner | *shrug* |
| 01:22 | futile | seriously, can a third party just take a glance at the last 2 minutes and see who's crazy? |
| 01:22 | arohner | I'm tired, so I've gotta run. but let's talk tomorrow |
| 01:22 | futile | yeah that works too |
| 01:22 | futile | cya |
| 01:23 | futile | i do like the idea, i just dont see how it works along with the concept of an auto-runner. |
| 01:23 | futile | which is a pretty important concept. |
| 01:23 | futile | some core function has to glue all the roles together, which means there has to be some implementation that goes hand in hand with the spec |
| 01:32 | futile | im ready to give up |
| 01:32 | futile | everything sucks. screw it all. |
| 01:33 | tomjack | don't give up |
| 01:39 | magnars | I now have to (require 'clojure.repl) in nrepl before I get docs and such. Any ideas why that happened now? |
| 01:53 | cbp` | magnars: https://groups.google.com/forum/?fromgroups#!topic/clojuredev-users/j5cJvl2KsEE I believe that's what you're looking for |
| 01:53 | magnars | cbp`: most kind, thank you |
| 01:59 | callen | cbp`: next question becomes, is the answer to just use Toku's version of Mongo or keep pushing onward with the RethinkDB client? |
| 01:59 | muhoo | this may seem like a dumb question, but is there any way in cheshire or similar, to generate javascript, not json with {\"stuff\"} but just reglar js, like {"stuff"} ? |
| 02:00 | callen | muhoo: not unless you hacked it up I think, cheshire is valid JSON and SMILE only AFAIK |
| 02:01 | muhoo | hmm. maybe i could (.replace .... if only i could figure out how to esacape the \'s |
| 02:03 | amalloy | muhoo: why would you want to? |
| 02:04 | muhoo | long story, but i'm dealing with a web service that wants urlencoded javascript, not json :-/ |
| 02:18 | tomjack | I don't understand |
| 02:18 | tomjack | "{\"foo\": \"bar\"}" looks both like JSON and JS to me |
| 02:20 | tomjack | (and {\"stuff\"} and {"stuff"} look like neither..) |
| 02:23 | muhoo | tomjack: {"foo": "bar"} is OK. {\"foo\": \"bar\"} is not |
| 02:23 | tomjack | you mean "{\\\"foo\\\": \\\"bar\\\"}"? |
| 02:24 | muhoo | no, i mean less leaning toothpicks, not more |
| 02:24 | tomjack | please exhibit the two strings as clojure strings |
| 02:24 | Raynes | ENGLISH MOTHERF**KER, DO YOU SPEAK IT? |
| 02:25 | muhoo | Raynes: and i will strike down with furious anger... |
| 02:25 | Raynes | We're here all week folks. |
| 02:27 | tomjack | &(println "{\"foo\": \"bar\"}") |
| 02:27 | lazybot | ⇒ {"foo": "bar"} nil |
| 02:27 | tomjack | &(println "{\\\"foo\\\": \\\"bar\\\"}") |
| 02:27 | lazybot | ⇒ {\"foo\": \"bar\"} nil |
| 02:27 | tomjack | am I confused? |
| 02:28 | muhoo | tomjack: ah, i see. what i'm seeing in the repl is not what's there |
| 02:29 | muhoo | i'll dig into it a bit more. this may be a non-problem |
| 02:29 | tomjack | it's called JSON for a reason :) |
| 02:53 | muhoo | yep, there was a problem, but it wasn't json. thanks. |
| 03:16 | borkdude | I have 1.5 hours to spend about Clojure in front of a classroom of students blank on the subject. How do I get the most out of it in this time? It's a one time thing only |
| 03:16 | borkdude | They like dojo style |
| 03:16 | borkdude | Any tips are welcome. |
| 03:18 | matko | what is dojo style? |
| 03:21 | borkdude | matko programming together |
| 03:24 | callen | borkdude: pair programming? |
| 03:24 | callen | borkdude: with each other or you? |
| 03:25 | borkdude | callen I actually don't know what the official definition of dojo is, but they like interactive sessions |
| 03:26 | matko | perhaps set up a list of unit tests, have the class collaborate to make them all succeed? |
| 03:26 | callen | borkdude: koan style might work well for them. |
| 03:27 | borkdude | callen I was thinking maybe introduce clojure slide by slide in the style of The Reasoned Schemer and then let them do koans? |
| 03:28 | callen | I don't think reasoned schemer is a good idea. |
| 03:28 | Ember- | simple introduction to the syntax etc, then let them get their hands dirty |
| 03:28 | Ember- | show constantly stuff via REPL |
| 03:28 | Ember- | typing into REPL something tells them 100% more than showing a slide |
| 03:29 | borkdude | Ember- yeah, good idea (also it will save me time making all those slides) |
| 03:30 | Ember- | of course you should plan ahead what you will show |
| 03:30 | borkdude | Ember- naturally |
| 03:30 | Ember- | but REPL allows you to give quick answers to questions :) |
| 03:30 | Ember- | I've taught Javascript like that |
| 03:30 | Ember- | made some slides to support that but it was a lecture |
| 03:30 | borkdude | Ember- it is actually what I have been doing in my 6-episode course mainly, but this is only a one time thing, that makes it a bit difficult |
| 03:31 | Ember- | if you'd be doing lecture thing would be a bit different |
| 03:31 | Ember- | but with dojo you really should start creating something |
| 03:32 | Ember- | 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:32 | borkdude | Ember- I think I might introduce them to datastructures and some higher order functions and then let them try to make a tictactoe game n by n instead of 3 by 3 as a final exercise |
| 03:32 | Ember- | if done like a real coding dojo |
| 03:32 | Ember- | yeah, definetly show them the datastructures |
| 03:33 | Ember- | you *might* mention macros, but don't get too deep :) |
| 03:33 | borkdude | Ember- I even skipped macros in my normal course this year |
| 03:33 | borkdude | Ember- but that was also because I had too many guest lecturers ;) |
| 03:33 | Ember- | macros might be a good thing to say anyway, since you're bound to be asked "why all these parenthesis" question |
| 03:34 | Ember- | and then you'll dive into the this whole code is data and data is code thing |
| 03:34 | Ember- | ...which they will not understand by the way |
| 03:34 | Ember- | :) |
| 03:34 | amalloy | yeah, the answer to that question, in a 90-minute session is "because of good reasons i can't get across in 90 minutes" |
| 03:35 | amalloy | if you like, you can also note that there aren't really more delimiters than other languages except when doing math; the parens just move |
| 03:35 | Ember- | amalloy: yeah, although that point will miss the mark |
| 03:35 | Ember- | all they see are the parenthesis |
| 03:35 | borkdude | amalloy also I can say, if your function ends like this )))]))}))}) it's a sign the function is too big ;) |
| 03:36 | callen | borkdude: looks like JS |
| 03:36 | Ember- | everyone creates functions like that in the beginning with Clojure :) |
| 03:36 | borkdude | the real difficult thing is: get across 'why clojure' and show this in 90 minutes |
| 03:37 | Ember- | yup |
| 03:37 | Ember- | imho you can tell them: |
| 03:37 | Ember- | 1) data manipulation power |
| 03:37 | Ember- | 2) REPL |
| 03:37 | Ember- | 3) immutability and... |
| 03:37 | Ember- | 4) concurrency |
| 03:37 | Ember- | and if they get excited then go to the whole macro and homoiconicity thingy |
| 03:38 | Ember- | but those four should sink deep if they've ever done stuff like that |
| 03:38 | Ember- | and assuming they've done programming before they should have |
| 03:39 | borkdude | Ember- do you know a nice example of concurrency to fit in the 90 minutes? |
| 03:39 | Ember- | borkdude: use refs and STM |
| 03:39 | borkdude | Ember- in what use case. |
| 03:40 | Ember- | anything :) Like, keeping blog comments in memory |
| 03:40 | borkdude | Ember- I tend to use atoms for it |
| 03:40 | Ember- | just throw maps into a ref holding a vector |
| 03:40 | Ember- | borkdude: yup, atoms are fine for simple operations |
| 03:41 | Ember- | 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:41 | Ember- | which basically needs first finding the right place and then updating it |
| 03:41 | Ember- | which needs transactions |
| 03:41 | borkdude | Ember- that is an update-in on an atom if it's a nested structure |
| 03:41 | Ember- | if you know _where_ to update ;) |
| 03:41 | borkdude | (if the atom contains a ...) |
| 03:42 | borkdude | Ember- ah |
| 03:42 | Ember- | if you have the path for the update-in then yes atom is fine |
| 03:43 | borkdude | Ember- what about (swap! myatom update-in (calculate-path @myatom) foo msg)… hmm… how would this look with refs? |
| 03:43 | Ember- | but anyway, that's a pretty simple scenario but still complex enough to get their heads dizzy thinking about all this in an imperative world |
| 03:43 | borkdude | Ember- you're right that you need a transaction for it |
| 03:43 | Ember- | you can mention about performance and so forth |
| 03:43 | Ember- | and how immutability helps this |
| 03:44 | Ember- | this should shut some C fanatics up :D |
| 03:44 | Ember- | (I have nothing against C btw, C just doesn't really encourage immutable data structures ;P ) |
| 03:45 | Ember- | but anyway, hope this gave you some ideas |
| 03:45 | borkdude | Ember- sure, thanks. I will make something of it |
| 03:45 | Ember- | need to go to a code review now |
| 03:45 | borkdude | It was basically what I already had in mind, but there's too much to tell |
| 03:46 | borkdude | so maybe I should keep it basic and let them exercise with the basic parts |
| 03:46 | borkdude | first 20 minutes: helicopter overview of the main things for clojure |
| 03:47 | borkdude | and then the basic stuff + exercises |
| 03:48 | borkdude | ok, I'm off |
| 04:46 | ddellacosta | is there a way to determine what version of Clojurescript my code is getting compiled with? |
| 04:46 | ddellacosta | using cljsbuild |
| 04:47 | Fender | Hi, maybe someone here has an idea: I want to deploy my app to a cloud instance, but I will deploy often so I'd prefer to deploy the JAR (and not the uberjar). How would I obtain all the necessary dependencies using leiningen so that I can put them in the cloud instance class path? |
| 04:47 | Fender | Or is there another way to do it? |
| 04:48 | Fender | ah and I dont want to set up leiningen and JDK just to get the dependency management |
| 04:48 | dmi3y | Fender: sounds like you need osgi |
| 04:48 | ddellacosta | Fender: well, there goes what I was about to say...haha |
| 04:49 | Fender | OSGI looks a little arcane for me, I only remember it from old eclipse times |
| 04:50 | Fender | actually, I don't even need a dependency management at all because I can get lein at home to get all dependencies |
| 04:50 | Fender | so my idea would be just to assemble all lein JARs as in lein v1 (I think it was a"lib" or "deps" directory) and just copy them in the class path on the cloud instance |
| 04:52 | clgv | Fender: you can use pallet to upload alll those files |
| 04:52 | Fender | so I can copy all dependencies at once (dont need to change them so often) and then just copy my "lein jar" |
| 04:52 | Fender | I will take a look at that |
| 04:55 | Fender | pallet seems to solve a lot more problems than I have :) |
| 04:56 | Fender | is there no "lein put-all-deps-in-one-dir"? |
| 04:57 | ddellacosta | I mean, lein essentially does that via maven, in your local repo |
| 04:57 | ddellacosta | I'm always just poking around in my .m2/repository directory |
| 04:58 | Fender | hmm, I could do it manually |
| 04:58 | Fender | but I was hoping to avoid that |
| 04:59 | mpenet | there is a :local-repo key you can add to your project.clj to do that I think |
| 04:59 | mpenet | check the sample.project.clj file on leinigen repo, might give you a hint |
| 04:59 | ddellacosta | yep neat |
| 04:59 | ddellacosta | https://github.com/technomancy/leiningen/blob/master/sample.project.clj#L247 |
| 05:00 | Fender | hmm, this only seems to change the local repo ".m2" to another location |
| 05:01 | Fender | somehow I think I am overlooking something big time |
| 05:01 | mpenet | you probably shouldnt try to do that anyway |
| 05:02 | Fender | is there a "better way"? |
| 05:02 | mpenet | .m2 is fine, and if you need to bundle it all together for whatever reason (deploys), just uberjar the whole thing |
| 05:02 | ddellacosta | Fender: what is your objection to the uberjar? |
| 05:03 | Fender | the problem is that creating and deploying the uberjar takes some time |
| 05:03 | Fender | like a few minutes |
| 05:03 | Fender | and doing th same for the jar would take maybe 20 secs |
| 05:03 | ddellacosta | hmm, you need something more instantaneous? I mean, I'm not sure how you could leverage lein for that, unless you install an instance on the server |
| 05:03 | Fender | I suppose |
| 05:03 | ddellacosta | but, you could do an lein install locally, and then rsync your .m2 directory to the server |
| 05:04 | ddellacosta | …or something along those lines. |
| 05:04 | Fender | hmm |
| 05:04 | Fender | so the JAR is 3.5MB and the uberjar is 32.5 MB |
| 05:05 | Fender | I think compilation time is about the same |
| 05:05 | Fender | maybe I should just upgrade my upspeed :) |
| 05:05 | ddellacosta | and how are you deploying the jar on the server? knowing that could make it easier to suggest alternatives |
| 05:05 | ddellacosta | haha, or that |
| 05:05 | Fender | right now I use scp |
| 05:05 | Fender | so manually |
| 05:05 | ddellacosta | sorry, I mean, is it running under jetty or something? |
| 05:05 | Fender | actually via bash script |
| 05:05 | Fender | nope, OpenJDK |
| 05:06 | ddellacosta | or just java --jar or whatever? |
| 05:06 | Fender | yep |
| 05:06 | ddellacosta | okay |
| 05:06 | ddellacosta | yah, then, if you could install the dependencies once, then you could just upload that jar and re-start your script I assume |
| 05:06 | Fender | exactly |
| 05:07 | ddellacosta | but you'll need leiningen on the server I believe, if you don't have an uberjar (…I think is how it would work) |
| 05:07 | Fender | this avoids all the arcane cloud config stuff |
| 05:07 | Fender | like if i'd use pallet or whatever deploy mechanism |
| 05:07 | Fender | hmm |
| 05:07 | ddellacosta | I mean, on the other hand you may save yourself some pain by dealing with the arcane cloud stuff, just to get going. I understand your objections but it may be the path of least resistance. |
| 05:07 | ddellacosta | and could give you more leverage later. |
| 05:08 | Fender | true |
| 05:08 | Fender | I always tend to do that, when I really see that it is necessary |
| 05:08 | Fender | right now I feel it would take me a few days |
| 05:08 | Fender | and there are always awkward errors where you have to browse stack exchange to get a solution :) |
| 05:09 | ddellacosta | just a note, I may be wrong about needing leiningen on the server, I'm thinking that if you are running it as a jar, and your other jars are on your classpath, maybe you're golden |
| 05:09 | Fender | I think the class path is "generated" via lein because it knows all the dependencies |
| 05:09 | Fender | so it kind of concats all the library locations and calls it "classpath" |
| 05:10 | ddellacosta | yes, I have to admit I've been lazy (so far) about finding out the mechanisms behind lein/maven. |
| 05:10 | Fender | #2 |
| 05:10 | ddellacosta | not a Java person, not that that's an excuse. |
| 05:10 | ddellacosta | more to learn... |
| 05:10 | Fender | that's basically saying that lein is really cool and does it's job :) |
| 05:10 | ddellacosta | yah, good point...haha |
| 05:10 | Fender | now I am afraid of having to it manually :) |
| 05:11 | ddellacosta | alright, back to wrangling CLJS for me…good luck Fender. |
| 05:11 | Fender | thanks a lot! |
| 05:12 | Fender | sorry but I jave no clue about CLJS :) |
| 05:12 | ddellacosta | naw, no worries…I'm learning through trial and error. heh |
| 05:36 | Fender | the solution (which I still need to try) is to extract the project.clj (via "jar -xvf <file> project.clj", then lein deps, and then create the classpath with "lein classpath" |
| 05:40 | Fender | or maybe I can just run the jar file via lein? |
| 06:07 | clgv | Fender: you can also just run a script gathering all jars in your directory to create the classpath |
| 08:38 | jcromartie | Can I use ClojureScript without precompiling? |
| 08:39 | jcromartie | i.e. can I load .cljs from the browser? |
| 08:39 | clgv | jcromartie: afair no |
| 08:40 | clgv | you'd need a javascript hosted cljs compiler |
| 08:40 | clgv | or selfhosted^^ |
| 09:01 | ghit | Hey guys! I've completed a few clojure tutorials but I never feel like I know a language until I've coded something. Any ideas on an intro project? |
| 09:04 | vijaykiran | ghit: depends on what you want - I usually write a small web app |
| 09:05 | clgv | ghit: write a local search algorithm for the traveling salesman problem ;) |
| 09:07 | llasram | Project Euler problems are fun |
| 09:08 | AimHere | If you're biologically minded or like your stringses, there's also Rosalind these days |
| 09:09 | ghit | Thanks a lot guys |
| 09:10 | ghit | By the way, is there any gold standard HTTP library for clojure |
| 09:10 | llasram | AimHere: Huh, wasn't aware of that one. Looks funducational |
| 09:10 | llasram | ghit: https://github.com/dakrone/clj-http |
| 09:10 | AimHere | Slurp is my one stop shop for all my http needs ;) |
| 09:11 | llasram | Hah, but yeah -- for just reading from HTTP URLs, the Java standard library + Clojure clojure.java.io wrappers works just fine |
| 09:21 | futile | Good morning. |
| 09:31 | futile | Which one of these do you like better, the mapcat or the list comprehension? https://github.com/evanescence/test2/commit/5a38efaddf1dd66224144c8703552f259deae3e0 |
| 09:51 | clgv | what do you use for html parsing? I use clj-tagsoup a long while ago |
| 09:54 | mpenet | laser seems nice |
| 09:56 | mpenet | I also used jsoup directly in the past, it's not so bad |
| 10:08 | dnolen | Functional Programming Is A Scam!, new blog post http://swannodette.github.io/2013/06/10/porting-notchs-minecraft-demo-to-clojurescript/ |
| 10:12 | ucb | dnolen: nice! |
| 10:16 | dnolen | ucb: thx! |
| 10:21 | supersym | clgv: I like tagsoup too... ideal for consolidation of old web projects |
| 10:22 | kmicu | Functional Programming Is a Scam Monad! |
| 10:27 | supersym | lein doesnt follow the Java each org.component.project element to their own directory convention, using lein new, should I mv src/org.component.project to their own directories afterwards? |
| 10:28 | supersym | people seem to use different methods, but from what I understood, the JVM likes it split up like src/org/component/project (company even) |
| 10:30 | supersym | boostrapping a new luminus project with lein and then moving files to new directories (from src/org.company.project to src/org/company/project) although namespaces still the same, seems to break it |
| 10:30 | supersym | java.lang.IllegalArgumentException: No implementation of method: :make-reader of protocol: #'clojure.java.io/IOFactory found for class: nil |
| 10:32 | supersym | (using lein run and http-kit as server to fire up the app) |
| 10:33 | supersym | silly me... classpath probably >< |
| 10:38 | supersym | and hardcoded paths.. obviously |
| 10:47 | xeqi | the wrong file name being generated sounds like a luminus template problem. |
| 11:07 | llasram | Doesn't Leiningen in general just create filenames with `.` in them if you create a project name with `.` in it? |
| 11:09 | vijaykiran | llasram: no, if you say foo.bar the "main" namespace is foo.bar so you get src/foo/bar.clj |
| 11:10 | llasram | Yep, I totally should have just tried it vs FUDing about |
| 11:10 | clojurebot | Titim gan éirí ort. |
| 11:12 | rasputnik | hey all, is there an idiomatic way to convert a java enum to a keyword? |
| 11:13 | rasputnik | ie. i'm pulling VM info out of vsphere as a seq of maps, and seeing : :power-state #<VirtualMachinePowerState poweredOn> , just want that to be :power-state :poweredOn |
| 11:13 | clgv | rasputnik: maybe via the toString method of the enum if that results in something usable. like (keyword (str my-enum-value)) |
| 11:13 | rasputnik | clgv: ta, I'd tried just a (keyword ..) call but that results in :power-state nil. let me try that. |
| 11:13 | clgv | rasputnik: you can also shoot for name-spaced keyword by adding the class name as keyword namespace |
| 11:15 | rasputnik | clgv yup, (keyword (str …)) works great, ta. i'll RTFM on that namespace thing |
| 11:16 | clgv | rasputnik: just use the two-argument version: (keyword namespace symbol) |
| 11:16 | clgv | (keyword (-> my-enum-value class .getFullName), (str my-enum-value)) |
| 11:18 | rasputnik | clgv: thanks, there's a chance i'll need to convert back so that way looks a bit cleaner |
| 11:19 | clgv | rasputnik: it's also clearer in case of name clashed from different enum types |
| 11:20 | rasputnik | clgv: nice. this is the first bit of java interop i've done, so far so good |
| 11:24 | rasputnik | ah hometime. |
| 11:24 | rasputnik | cheers again. |
| 11:37 | paultag | Hey Clojurians. Anyone have a "killer app" for Clojure? I need (at least) one as example (not cool libs, cool end-user apps) |
| 11:37 | paultag | that are Free, as well (so no lighttable!) |
| 11:38 | technomancy | paultag: there was that android p2p social network that was pretty slick |
| 11:38 | paultag | oh, hey technomancy! |
| 11:38 | technomancy | paultag: greetings |
| 11:38 | paultag | technomancy: anything for GNU/Linux? We were talking about the Debian clojure work again |
| 11:39 | technomancy | there's not much targeted towards end users |
| 11:39 | technomancy | depending on how you define it, riemann might qualify |
| 11:39 | technomancy | possibly incanter |
| 11:39 | mpenet | prismatic ? |
| 11:40 | paultag | whoh, prismatic is Clojure? |
| 11:40 | mpenet | well free but not open |
| 11:40 | technomancy | paultag: oh, definitely overtone |
| 11:40 | mpenet | paultag: yes it is |
| 11:40 | paultag | technomancy: overtone's a lib |
| 11:40 | technomancy | hm; I thought they were adding a frontend, but maybe it's not ready yet |
| 11:40 | paultag | mpenet: Oh, I thought you were talking about the prismatic running the lightpack thing that got kickstarted |
| 11:41 | paultag | I was about to say, I thought that was C |
| 11:41 | mpenet | paultag: no the newsreading thingy |
| 11:41 | paultag | yep, ack |
| 11:41 | paultag | alas, not packageable |
| 11:41 | paultag | Riemann would be interesting, but again, more of a lib-type stuff. |
| 11:41 | technomancy | it's an application, but you kind of have to stretch the "end-user" part |
| 11:42 | paultag | Clojure would be so perfect for UI work, such a shame there aren't any GTK apps that use agents to manage the GUI |
| 11:42 | paultag | technomancy: something that would be nice to have apt-gettable without the person knowing lisp / clojure |
| 11:42 | paultag | (save for configs, at most) |
| 11:42 | technomancy | hrm, well when you phrase it that way I can't think of anything |
| 11:43 | paultag | :\ |
| 11:43 | TimMc | technomancy: Oh wow, http://nightweb.net/ ? That looks super cool. |
| 11:43 | TimMc | I've been wanting to write something like that. |
| 11:49 | paultag | man, that sucks. |
| 11:49 | oich | how do I mutate a map? (doto (.getRequestContext dispatch) (.put "blah" "blah"))) complains that there is no put method. There is no setRequestContext. |
| 11:50 | oich | requestcontext is Map<String,Object> |
| 11:50 | egghead | lol dnolen "While this exercise might seem only like a bit of fun, it really isn’t." I misread and missed the word 'only' |
| 11:50 | egghead | while this might seem fun, it isn't |
| 11:51 | egghead | cool post http://swannodette.github.io/2013/06/10/porting-notchs-minecraft-demo-to-clojurescript/ |
| 11:51 | gfredericks | oich: that's weird. |
| 11:51 | gfredericks | oich: I assume you get the same thing for (.put (.getRequestContext dispatch) "blah" "blah")? and that (instance? java.util.Map (.getRequestContext dispatch)) is true? |
| 11:54 | oich | gfredericks (instance? java.util.Map ..) is true. The class name is ...RequestContext$MapView. |
| 11:56 | oich | oops. sorry. I mismatched parens in doto. put works. |
| 11:57 | gfredericks | yay the parens are always right |
| 11:59 | otfrom | afternoon all |
| 11:59 | otfrom | anyone out there use data.csv? |
| 11:59 | gfredericks | I do |
| 12:00 | gfredericks | ~anyone |
| 12:00 | clojurebot | anyone is anybody |
| 12:00 | gfredericks | ~anybody |
| 12:00 | otfrom | I'm having trouble with unexpected whitespace at the end of a line (as listed here http://dev.clojure.org/jira/browse/DCSV-6) and I'm wondering if I'm being stupid and missing a trick |
| 12:00 | clojurebot | Just a heads up, you're more likely to get some help if you ask the question you really want the answer to, instead of "does anyone ..." |
| 12:00 | otfrom | clojurebot: you are absolutely right |
| 12:00 | clojurebot | Huh? |
| 12:01 | otfrom | gfredericks: have you had the trailing whitespace problem? |
| 12:02 | gfredericks | otfrom: no; this is just for reading, correct? |
| 12:02 | otfrom | correct |
| 12:02 | otfrom | Using read-csv |
| 12:02 | technomancy | paultag: so riemann is actually a network server that can be used without clojure |
| 12:02 | gfredericks | otfrom: in fact that test case does not fail for me |
| 12:03 | technomancy | there are client libs for many other languages |
| 12:03 | paultag | technomancy: algernon just convinced me I'm wrong |
| 12:03 | gfredericks | otfrom: I'm on 0.1.2 |
| 12:03 | paultag | technomancy: so, yeah! We also came up with a few others, I'm happy again :) |
| 12:03 | technomancy | oh, what else? |
| 12:03 | otfrom | gfredericks: so am I [org.clojure/data.csv "0.1.2"] |
| 12:04 | babilen | technomancy: We gathered riemann and semira so far, are looking forward to lighttable (if it ever sees the light of open source) |
| 12:04 | technomancy | algernon: so you'd describe yourself more as a squeak user? |
| 12:04 | otfrom | (csv/read-csv (java.io.StringReader. "\"a\" " )) |
| 12:04 | otfrom | Exception CSV error (unexpected character: ) clojure.data.csv/read-quoted-cell (csv.clj:36) |
| 12:04 | paultag | == babilen |
| 12:05 | gfredericks | otfrom: ah right -- when I pass the string directly it's okay |
| 12:05 | algernon | technomancy: not really, no. I squeak, but do not Squeak. :) |
| 12:05 | gfredericks | otfrom: oh scratch that |
| 12:06 | gfredericks | I didn't notice we were putting quotes in there; being dense |
| 12:06 | otfrom | gfredericks: so does it fail for you too or no? |
| 12:06 | gfredericks | otfrom: so given that this is a reported issue I don't understand your "I'm wondering if I'm being stupid and missing a trick" |
| 12:06 | gfredericks | yes it does fail |
| 12:06 | gfredericks | are you asking for a workaround? |
| 12:08 | otfrom | wasn't sure if it was a spurious report or not as I didn't see any response |
| 12:09 | otfrom | so I was just making sure I wasn't misusing the api before diving into a workaround |
| 12:09 | gfredericks | not that I know of. I'm not an expert on the CSV spec though; it might be that that's not valid CSV |
| 12:09 | gfredericks | and as such wouldn't be treated as a bug |
| 12:10 | gfredericks | I'd check that out first |
| 12:11 | otfrom | will do |
| 12:14 | tomjack | "However, the RFC didn't say what to do when white spaces appear outside the quoted value." :( |
| 12:14 | tomjack | "The more common but technically less satisfactory solution is to rely on human intervention" |
| 12:14 | tomjack | http://en.wikipedia.org/wiki/Comma-separated_values#Lack_of_a_standard |
| 12:17 | gfredericks | I assume "human intervention" means mechanical turk |
| 12:17 | hiredman | "interns" |
| 12:18 | gfredericks | human intern-vention |
| 12:20 | justin_smith | ,(intern 'sandbox 'x 0) |
| 12:20 | clojurebot | #<Exception java.lang.Exception: SANBOX DENIED> |
| 12:20 | justin_smith | they won't even let interns play in the sandbox :( |
| 12:26 | otfrom | I wouldn't wish looking for invalid characters in a 2.2GB csv file on anyone |
| 12:26 | otfrom | ;-) |
| 12:26 | gfredericks | otfrom: "big data" |
| 12:27 | otfrom | not quite yet |
| 12:27 | arrdem | !karma "big data" |
| 12:36 | gfredericks | $karma big data |
| 12:36 | lazybot | big has karma 0. |
| 12:36 | gfredericks | $karma big-data |
| 12:36 | lazybot | big-data has karma 0. |
| 12:41 | jonasen | otfrom: maybe we should add an :ignore-whitespace to data.csv? |
| 12:42 | otfrom | :ignore-extra-whitespace-on-quoted-fields ;-) |
| 12:43 | jonasen | or maybe just {:trim true} |
| 12:50 | racycle | hi, i'am trying to create a map with the key as the index from a collection: example: [1 2 3] => {0 1, 1 2, 2 3} |
| 12:50 | racycle | i' come up with this (map (fn [[k v]] (hash-map k v)) (map-indexed vector [1 2 3 4 5])) |
| 12:50 | Anderkent | ,(into {} (map-indexed vector [1 2 3 4 5])) |
| 12:50 | racycle | but i'm not proud of it, and i have to think there's a more idiomatic way |
| 12:50 | clojurebot | {0 1, 1 2, 2 3, 3 4, 4 5} |
| 12:50 | racycle | that works |
| 12:51 | racycle | thanks |
| 12:51 | Anderkent | no problem |
| 12:52 | llasram | racycle: BTW, why do you want this? |
| 12:52 | racycle | i wanted to keep track of their order |
| 12:53 | clgv | zipmap |
| 12:53 | llasram | racycle: Vectors are already associative w/ the index as key: ##[(get [:a :b :c] 1) (assoc [:a :b :c] 1 :d)] |
| 12:53 | lazybot | ⇒ [:b [:a :d :c]] |
| 12:53 | clgv | &(zipmap (range (count [1 2 3])) [1 2 3]) |
| 12:53 | lazybot | ⇒ {2 3, 1 2, 0 1} |
| 12:55 | racycle | i know they're associative, but they're going to be reordered and i wanted to keep track of their order |
| 12:55 | racycle | the items in the vector are going to be filtered and sorted so i wanted the map to keep track of their original order |
| 12:55 | llasram | Ah, I see |
| 13:08 | otfrom | once again clojure-csv from davidsantiago comes to the rescue https://github.com/davidsantiago/clojure-csv |
| 13:08 | otfrom | I think I just need to adopt that lib and bring it up to date |
| 13:11 | technomancy | what, to reflect all the recent developments in the revised CSV-2012 standard? =) |
| 13:15 | bbloom | CSV was on of those things that was just so damn simple and obvious that the software community couldn't be trusted with it |
| 13:29 | gfredericks | technomancy: they added comma separated objects |
| 13:31 | technomancy | comma-separated quagmires |
| 13:32 | gfredericks | CSA: comma-separated agriculture |
| 13:48 | otfrom | pfft, you do know that CSV stands for Character Separated Values |
| 13:48 | otfrom | I mean, really, commas? |
| 13:50 | bbloom | otfrom: character separated is probably more accurate, thanks to an old Excel i18n bug that used periods instead of commas in french speaking territories |
| 13:58 | gfredericks | the characters were dressed in frilly old-fangled costumes, for it was a period piece. |
| 13:59 | rasmusto | I prefer CRLFSV |
| 14:04 | otfrom | rasmusto: how do you separate your records? |
| 14:08 | gfredericks | probably an LFCR |
| 14:09 | TimMc | bbloom: Haha, that's fantastic. |
| 14:10 | TimMc | I can see it now: Refactor -> Lift constant -> "," |
| 14:27 | dobry-den | clojure is the king of the Sinatra-esque all-in-one-file webapp. |
| 14:27 | clojurebot | Roger. |
| 14:27 | futile | And look, we didn't even need magic to do it! |
| 14:27 | dobry-den | hiccup for html, garden for css. it's just not even fair. |
| 14:32 | gfredericks | oh this garden thing sounds promising |
| 14:32 | dobry-den | gfredericks: it's amazing using clojure datastructures for everything. everything becomes obvious. |
| 14:33 | mthvedt | ~clojure |
| 14:33 | clojurebot | you're probably doing things wrong |
| 14:34 | gfredericks | dobry-den: yeah there was an obvious need for that for a while. just a tricksy thing to get right I assume |
| 14:34 | futile | garden looks neat. |
| 14:36 | tomjack | I do not like that it goes straight from sugar to css strings |
| 14:36 | dobry-den | mthvedt: at least if it's simple/obvious, it's trivial to refactor when you find out you did it wrong :) |
| 14:37 | dobry-den | plenty of code at work is done wrong but nobody really understands how it works anymore |
| 14:38 | mthvedt | dorby-den: actually i was trying to see if clojurebot picked up what you said earlier. |
| 14:38 | dobry-den | haha, cool. i see |
| 14:38 | rasmusto | otfrom: separate records w/ crs, items w/ lfs |
| 14:44 | futile | I've been working on making the test2 SPEC shorter and easier to read. |
| 14:44 | futile | Here it is so far: https://github.com/evanescence/test2/blob/master/SPEC.md |
| 14:48 | supersym | lt |
| 14:49 | supersym | oops |
| 15:06 | gfredericks | tomjack: presumably that's changeable without API breakage? |
| 15:06 | tomjack | presumably |
| 15:07 | tomjack | any intermediate representation like I was thinking seems.. like a lot of work |
| 15:08 | noncom | hi am trying to connect jvisualvm to a clojure environment run from ccw |
| 15:08 | noncom | but jvisualvm does not see it |
| 15:09 | noncom | there is a recipe from sun to add a Jmx-related command-line param. So i add it and i can kinda manually connect. but what i connect to does not seem like my program because it is very plain. |
| 15:09 | noncom | looks like i connect to the ccw repl then |
| 15:09 | noncom | so how do i connect to an actual running app? |
| 15:11 | timsgardner | is *ns* always the namespace at the top of the stack? |
| 15:12 | gfredericks | *ns* isn't often read at runtime I don't think |
| 15:12 | gfredericks | much more useful at compile-time, e.g. macro-expansion-time |
| 15:13 | amalloy | gfredericks: *ns* is generally either 'user or 'clojure.core at runtime |
| 15:14 | xpe | why does this not work: (map #({1 %}) [1 2 3]) but this does: (map #(hash-map 1 %) [1 2 3]) |
| 15:15 | jeremyheiler | There's also in-ns which sets *ns*. |
| 15:15 | hiredman | '#({1 %}) |
| 15:15 | hiredman | ,'#({1 %}) |
| 15:15 | clojurebot | (fn* [p1__29#] ({1 p1__29#})) |
| 15:15 | futile | xpe: the first one calls a function {} with no args |
| 15:15 | futile | xpe: the second one calls a functino hash-map with 2 args |
| 15:15 | futile | xpe: calling the function {} with no args will probably produce an error |
| 15:15 | futile | ,({}) |
| 15:15 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (0) passed to: PersistentArrayMap> |
| 15:16 | futile | But maps can be used as functions with 1 arg. |
| 15:16 | futile | ,({:a :b} :a) |
| 15:16 | clojurebot | :b |
| 15:16 | futile | xpe: hence in #() it's easiest to use hash-map like you have |
| 15:16 | xpe | futile: that makes sense, thanks |
| 15:17 | futile | xpe: #() is always a call, with the first thing being the callable-thing, that's the easiest way to look at it |
| 15:17 | gfredericks | timsgardner: the other thing you might use it for is setting it for a call to eval: (binding [*ns* ...] (eval ...)) |
| 15:17 | xpe | ,(map (fn [x] {1 x}) [1 2 3]) |
| 15:17 | clojurebot | ({1 1} {1 2} {1 3}) |
| 15:17 | futile | Yeah I just do that sometimes too. |
| 15:17 | jeremyheiler | xpe, consider macroexpanding your example ##(macroexpand-1 '(map #({:a %}) (range 10))) |
| 15:17 | lazybot | ⇒ (map (fn* [p1__11278#] ({:a p1__11278#})) (range 10)) |
| 15:18 | xpe | futile: there is still something not quite right. my rule of thumb is that #() is exactly like (fn [x] …) but clearly my understanding is not spot on |
| 15:18 | tomjack | &'(map #({:a %}) (range 10)) |
| 15:18 | lazybot | ⇒ (map (fn* [p1__11288#] ({:a p1__11288#})) (range 10)) |
| 15:19 | xpe | ,(map (fn [x] ({1 x})) [1 2 3]) |
| 15:19 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (0) passed to: PersistentArrayMap> |
| 15:19 | hyPiRion | xpe: no, it's equivalent to (fn [x] ( ...)) |
| 15:19 | futile | xpe: it's more like (fn [x] (...)) |
| 15:19 | bbloom | yeah you don't even need to macro expand |
| 15:19 | bbloom | ,#() |
| 15:19 | clojurebot | #<sandbox$eval174$fn__175 sandbox$eval174$fn__175@c054cf> |
| 15:19 | bbloom | ,'#() |
| 15:19 | clojurebot | (fn* [] ()) |
| 15:19 | bbloom | ,'#(%) |
| 15:19 | clojurebot | (fn* [p1__232#] (p1__232#)) |
| 15:19 | bbloom | ,'#(apply % %&) |
| 15:19 | clojurebot | (fn* [p1__261# & rest__262#] (apply p1__261# rest__262#)) |
| 15:20 | futile | Okay, gotta write some extensions for test2 now. |
| 15:20 | hyPiRion | ,(macroexpand-1 '(-> [$] #())) |
| 15:20 | clojurebot | (fn* [$] [] ()) |
| 15:20 | jeremyheiler | bbloom: hmm good point :-) |
| 15:20 | xpe | hyPiRion jeremyheiler futile ok, I got it know thanks |
| 15:32 | timsgardner | gfredericks: was away, thanks for the tip! |
| 15:41 | Eivo | hello |
| 15:42 | Eivo | how can i handle file uploads with compjure? |
| 15:46 | Eivo | wrap-multipart-params |
| 15:46 | Eivo | i see |
| 15:47 | Eivo | is it possible to read incomming file by chunks and drop connection of file is too large? Can't trust content-length |
| 15:47 | Eivo | s/of/if/ |
| 15:49 | gfredericks | Eivo: does wrap-multipart-params slurp it all up eagerly? |
| 15:52 | Eivo | gfredericks: not sure |
| 15:53 | gfredericks | I assume it's either giving you a string or an InputStream |
| 15:53 | Apage43 | Eivo: wrap-multipart-params will have consumed the entire thing by the time it passes the request to the handler *but* |
| 15:53 | Apage43 | you can also give it a store function, which receives an InputStream and the multipart header for each file |
| 15:53 | Apage43 | at that point it has not consumed the whole thing yet |
| 15:54 | Apage43 | you could throw an exception from there to reject it |
| 15:55 | Apage43 | https://github.com/ring-clojure/ring/blob/master/ring-core/src/ring/middleware/multipart_params.clj |
| 15:55 | Apage43 | i always just go look at the implementation =P |
| 15:55 | Eivo | Apage43: thanks |
| 16:01 | Eivo | i'm not sure if i need multiparm tho, i'm building restful api and it's time to implement file uploading |
| 16:01 | Eivo | https://www.dropbox.com/developers/core/docs#files-POST look how dropbox do it |
| 16:02 | Eivo | https://www.dropbox.com/developers/core/docs#files_put more descriptive |
| 16:02 | Eivo | they just threat body of request as file |
| 16:04 | Eivo | sorry, can't think properly due drowsyness, thank you guys |
| 16:20 | cbp` | datastructures for everything sounds nice till you have to hire a frontend engineer :P |
| 16:22 | bbloom | cbp`: please elaborate |
| 16:38 | justin_smith | I have a java object that crashes swank when it gets printed - other than being very careful not to put it anywhere where it would print as a result, how do I ensure it never gets printed out? |
| 16:38 | llasram | justin_smith: Switch to nrepl.el? |
| 16:39 | justin_smith | oh, would nrepl not do that? |
| 16:39 | justin_smith | I mean the contents of my jpeg would still fill the repl with mega lines of noise, but I guess that is better than crashing |
| 16:40 | cbp` | bbloom: I don't think the gains from using macros in html/sql outweigh the fact that almost no one knows clojure. Nor they should to work on those ends |
| 16:40 | llasram | justin_smith: I haven't had that class of isssue with nrepl.el, but on the other hand I haven't tried it lately |
| 16:41 | llasram | justin_smith: You could also implement `print-method` and/or `print-dup` for the Java type in question |
| 16:41 | justin_smith | thanks for the tip, trying it |
| 16:41 | futile | Going to make test2 self-hosting. |
| 16:42 | bbloom | cbp`: ok, but i'm not sure that has anything to do with the philosophy of pervasive usage of inert values. id' much rather give a json data blob per view to designers than some arbitrary ORM OOP explosion waiting to happen |
| 16:43 | rasmusto | bbloom: ORMOOP sounds scary |
| 16:43 | bbloom | rasmusto: it is. |
| 16:43 | bbloom | ORM? OMG. |
| 16:43 | rasmusto | ORM, oops! |
| 16:46 | cbp` | bloom: Yeah my qualm is with macros and not values I guess :P |
| 16:46 | mpenet | also you don't have to use macros necessarily for html/sql |
| 16:46 | mpenet | some lib don't and are working just fine |
| 16:47 | pjstadig` | macros are necessary and sufficient |
| 16:48 | bbloom | pjstadig`: necessary and sufficent for what? |
| 16:48 | mpenet | depends on the context |
| 16:48 | pjstadig` | everything |
| 16:48 | pjstadig` | macro all the things |
| 16:48 | mpenet | :) |
| 16:48 | futile | technomancy: blast! your idea doesn't work so easily with destructuring: https://github.com/evanescence/test2/blob/master/src/test2/run.clj#L39 |
| 16:48 | bbloom | ok, not being serious. got it. |
| 16:48 | pjstadig` | bbloom: hehe |
| 16:48 | pjstadig` | bbloom: don't you know me by now? |
| 16:48 | jkj | how do i: { :foo ["bar" "baz"] :a "b" } => [:foo "bar" :foo "bar" :a "b"] |
| 16:48 | futile | I end up getting a keyword-like string instead, like ":runner" |
| 16:49 | pjstadig` | i'm the channel clown who swoops in with a joke at random times :) |
| 16:49 | bbloom | pjstadig`: i only pay attention to IRC with like 1/4th of my brain power when i'm slacking off |
| 16:49 | jkj | oops.. baz |
| 16:49 | futile | Anyone know of a way to get keyword-destructuring in -main that works with cmd line args (which are strings like ":foo")? |
| 16:50 | pjstadig` | futile: you would do something like {:strings ["foo"]}, but only if the string didn't have a colon in the front |
| 16:50 | futile | pjstadig`: are you sure you quote the strings? |
| 16:50 | pjstadig` | err |
| 16:51 | pjstadig` | {:string [foo]} |
| 16:51 | futile | Because this is what I had before: |
| 16:51 | futile | {:strs [-runner -reporter]} |
| 16:51 | justin_smith | OK, nrepl is much better, 80 pages of garbage text, but the repl below that is still usable |
| 16:51 | futile | Which was actually really pretty in the Clojure side of things. |
| 16:51 | pjstadig` | haha or that |
| 16:51 | futile | But the convention for lein things is to use :runner or :reporter |
| 16:51 | futile | So I'm trying to get it to do that. |
| 16:51 | pjstadig` | i think you'd just have to parse the keyword |
| 16:51 | futile | :'( |
| 16:51 | futile | Destructuring was a really cool way to do this. |
| 16:52 | pjstadig` | futile: what does lein do? |
| 16:52 | futile | pjstadig`: you're not familiar with leiningen? |
| 16:52 | futile | pjstadig`: oh I think you said you were new to Clojure the other day, right? |
| 16:53 | futile | pjstadig`: use leiningen for clojure stuff, it's super easy |
| 16:53 | tomjack | what core lein tasks even take keyword args? |
| 16:53 | tomjack | `lein deps :tree` doesn't exactly count |
| 16:53 | futile | tomjack: technomancy told me most lein things do, and it's the way to move forward |
| 16:54 | futile | tomjack: and he wrote lein so I'm pretty sure he gets to decide that :) |
| 16:54 | tomjack | I believe it, I'm asking which core tasks do it |
| 16:54 | futile | o |
| 16:54 | futile | uh |
| 16:55 | pjstadig` | futile: haha. no. i've been using clojure since like 2009. what I meant was "go look at the leiningen code, it's on the internets" |
| 16:55 | futile | pjstadig`: oh |
| 16:55 | futile | pjstadig`: touche :) |
| 16:55 | pjstadig` | :) |
| 16:55 | tomjack | oh repl |
| 16:55 | tomjack | kinda |
| 16:56 | futile | Hm, I think I have a better way. |
| 16:56 | futile | Just create a new map by mapping the vals with load-string, then do destructuring on the keywords :) |
| 16:57 | futile | Not as simple as this, but hey, whatever. |
| 16:57 | mpenet | tomjack: lein test takes keywords too |
| 16:57 | tomjack | whoa I never noticed load-reader or load-string |
| 16:57 | tomjack | I think you want read-string though |
| 16:58 | futile | Given [":foo" "A" ":bar" "B"], what's the best/coolest/cleanest/awesomest way to get {:foo "A" :bar "B"} ? |
| 16:58 | pjstadig` | loading is for code |
| 16:58 | tomjack | mpenet: thanks, looks like there is a (map read-string) in there |
| 16:59 | pjstadig` | you would probably want is clojure.edn/read-string |
| 16:59 | futile | Maybe I do but probably not. And if so, then later. |
| 16:59 | tomjack | the "A" will read as a symbol |
| 16:59 | tomjack | which I think is correct for your use case |
| 16:59 | tomjack | since the option values are namespaced symbols pointing to vars? |
| 16:59 | futile | tomjack: Not on every thing though, no. |
| 17:00 | futile | Actually maybe, yeah. |
| 17:00 | tomjack | ,(apply hash-map (map read-string [":foo" "A" ":bar" "B"])) |
| 17:01 | clojurebot | {:foo A, :bar B} |
| 17:01 | futile | Don't even need apply hash-map with destructuring :) |
| 17:03 | tomjack | ,(->> [":add" "+" ":subtract" "-"] (map read-string) (map #(%1 %2) (cycle [identity resolve])) (apply hash-map)) |
| 17:03 | clojurebot | {:subtract #'clojure.core/-, :add #'clojure.core/+} |
| 17:03 | tomjack | hmm |
| 17:05 | futile | ,(let [{:keys [foo bar]} [:foo 'a :bar 'b]] (prn foo bar)) |
| 17:05 | clojurebot | nil nil\n |
| 17:06 | futile | ,(let [{:keys [foo bar]} [:foo 'a :bar 'b]] [foo bar]) |
| 17:06 | clojurebot | [nil nil] |
| 17:06 | futile | I'm confused. |
| 17:06 | tomjack | &(let [[& {:keys [foo bar]}] [:foo 'a :bar 'b]] [foo bar]) |
| 17:06 | lazybot | ⇒ [a b] |
| 17:06 | futile | Oh right. |
| 17:06 | futile | :) |
| 17:07 | tomjack | http://stackoverflow.com/a/16602869/1306817 |
| 17:08 | futile | Thanks tomjack |
| 17:11 | futile | So technically when I pass `lein whatever :foo a :bar b` I get [':foo 'a ':bar 'b], all symbols |
| 17:11 | futile | Oh. |
| 17:13 | tomjack | eval is a noop on keywords, so dually so is quote |
| 17:13 | tomjack | s/noop/identity/ |
| 17:14 | futile | Right. What I almost want is (map load-string opts) |
| 17:14 | tomjack | read-string, not load-string, I'm pretty sure |
| 17:14 | futile | Well that just gives me a symbol, not a keyword. |
| 17:14 | futile | Right? |
| 17:14 | tomjack | &(class (read-string ":foo")) |
| 17:14 | lazybot | ⇒ clojure.lang.Keyword |
| 17:14 | futile | Oh. Man. |
| 17:15 | futile | You were right all along. |
| 17:16 | tomjack | I don't suppose people should be allowed to do `lein test2 ":runner foo"` right |
| 17:16 | tomjack | (cus read-string will just return :runner and drop the foo) |
| 17:16 | futile | Right. |
| 17:16 | futile | I don't know what crazy error I saw before, but this was one big cluster of me misreading my errors. |
| 17:17 | futile | Solved. |
| 17:19 | futile | tomjack: https://github.com/evanescence/test2/blob/master/src/test2/run.clj#L40 :) |
| 17:21 | dsop | is there anyo good combination to replace lein-swnak + slimv on vim |
| 17:21 | Glenjamin_ | i believe fireplace is the latest vim clojure environemnt |
| 17:21 | dsop | kk thx |
| 17:22 | dsop | i\ll check it out |
| 17:24 | futile | I used to use vim. Then I took an arrow in the knee. |
| 17:25 | tomjack | futile: cool |
| 17:27 | futile | tomjack: thanks :) |
| 17:27 | futile | for your help |
| 17:30 | tomjack | :pending? is weirdly consistent :) |
| 17:31 | futile | tomjack: that's an odd remark |
| 17:31 | tomjack | it always bugs me when I write `:throw-exceptions? true` or whatever and it's actually `:throw-exceptions true` because grr |
| 17:31 | tomjack | but hadn't noticed that common ^:foo style is inconsistent in this regard |
| 17:32 | futile | tomjack: hehe |
| 17:32 | tomjack | (but really, I would rather write ^:pending, despite the inconsistency) |
| 17:32 | futile | Just released new version of test2 and test2-autorunner. |
| 17:33 | futile | The default reporter needs some work admittedly. |
| 17:33 | futile | But it works, it's fully usable for writing tests. |
| 17:33 | futile | tomjack: Hm, I thought I made the key of test-results :pending? and the var-metadata key :pending |
| 17:34 | futile | tomjack: they should be different, but it's admittedly a little confusing. |
| 17:34 | futile | tomjack: fixed the spec, thanks for pointing that out :) |
| 17:34 | tomjack | https://github.com/evanescence/test2/blob/master/src/test2/api/runners.clj#L10 |
| 17:35 | futile | tomjack: fixed that file, thanks for pointing that out :D |
| 17:35 | futile | blast, new release needed now. |
| 17:36 | tomjack | heh |
| 17:37 | futile | okay, just released new versions :) |
| 17:38 | futile | btw this is what that whole if-and thing was meant to clean up: https://github.com/evanescence/test2/blob/master/src/test2/api/runners.clj#L13-L15 |
| 17:39 | arohner | can someone remind me what the syntax is to get the local variables in a macro is? |
| 17:40 | tomjack | (keys &env) |
| 17:40 | tomjack | (on the jvm) |
| 17:40 | arohner | thanks |
| 17:42 | tomjack | futile: what if e.g. linear-runner was named just linear, and the :runner arg supplied test2.default.runner as a default ns for unqualified symbols, for `lein test2 :runner linear`? |
| 17:43 | tomjack | also are you interested in patches for async tests? thinking I may give test2 a shot for playing around with that |
| 17:43 | tomjack | or it could be a separate library I guess and more verbose than `:runner async` :) |
| 17:44 | tomjack | ..really it must be a separate library at this point |
| 17:47 | futile | tomjack: hmm.. |
| 17:49 | futile | tomjack: as for unqualified syms having a default of test2, not sure that's a common enough use-case |
| 17:49 | futile | tomjack: mostly people will have custom runners etc just live in :aliases in project.cls, they wont usually type it on the cmd line i bet |
| 17:49 | tomjack | yeah, makes sense |
| 17:49 | futile | tomjack: and yes im very interested in patches and such |
| 17:49 | tomjack | ignore my async question, it doesn't make sense |
| 17:50 | futile | tomjack: yeah try making a custom runner that runs them simultaneously, that'd be a neat extension |
| 17:50 | tomjack | I was thinking a callback-based async runner and async-run-test-fn could go in test2 but I don't like that at all |
| 17:50 | tomjack | I'm more interested in test-fns that are themselves async |
| 17:50 | tomjack | i.e. that may make assertions after returning |
| 17:50 | futile | tomjack: within them? that sounds odd |
| 17:51 | tomjack | yeah it's pointless on the jvm but necessary for js |
| 17:51 | futile | tomjack: oh, for testing async code? |
| 17:51 | futile | tomjack: hmm, i never thought of that use-case. |
| 17:52 | bbloom | futile: oh boy. you're in for a rabbit hole! |
| 17:52 | futile | bbloom: never! |
| 17:53 | futile | im not gonna touch that problem. |
| 17:53 | futile | its probably hard enough with existing testing libs, let alone one thats just starting out |
| 17:53 | bbloom | futile: at minimal, you should consider timeouts |
| 17:53 | bbloom | futile: and timing in general |
| 17:53 | bbloom | the results schema should include timing data |
| 17:53 | futile | insert joke here about any of the other meanings of time out |
| 17:53 | futile | bbloom: ah yes, very good point. i remember seeing that in test.generative |
| 17:54 | futile | Most of the SPEC is finalized in the sense that it won't change, although things may be added to it (mainly for reporting), which is thankfully fully backwards-compatible. |
| 17:54 | bbloom | futile: if you have one test that gets stuck in an infinite loop, you don't want to fail the whole test suite |
| 17:54 | futile | There's one more thing we *may* need to change about the spec, namely allowing runners to know about "around-all"-style fixtures |
| 17:55 | bbloom | futile: is SPEC some acronym that i don't know about? why do you keep capitalizing it? |
| 17:55 | futile | bbloom: i cant see any way the test suite can reasonably move past an infinite loop inside a test |
| 17:55 | futile | bbloom: because im dumb |
| 17:55 | futile | spec. there. |
| 17:55 | futile | :) |
| 17:55 | bbloom | futile: timeouts. |
| 17:55 | futile | bbloom: timeouts exist in java? hmm. |
| 17:55 | futile | never heard of it til now. |
| 17:55 | futile | (btw ive never used java before and im new to clojure) |
| 17:56 | futile | (sorry for not disclosing that up front) |
| 17:56 | kwertii | Is it possible to (easily) do a prepared statement like ["SELECT * FROM foo WHERE id IN ?" [1 2 3]] with java.jdbc? |
| 17:57 | bbloom | futile: java has a full concurrency model. so yes, it has timeouts |
| 17:57 | bbloom | futile: it's a feature of a runner for whether or not it supports timeouts, but the results format needs to support it |
| 17:59 | futile | bbloom: very good point. |
| 18:00 | tomjack | ultimately I wonder if the interface should be a channel of assertion-results |
| 18:00 | futile | tomjack: Hmm. What problems does that solve? |
| 18:01 | bbloom | futile: incremental reporting? |
| 18:01 | tomjack | makes async tests possible without replacing chunks of test2, and allows implementing sync tests in terms of the one async interface |
| 18:01 | tomjack | also would mean the barebones interface is no longer simple for sync tests.. |
| 18:01 | futile | bbloom, tomjack: I was thinking of the spec enforcing lazy-sequences being given to the reporter for that reason. |
| 18:01 | futile | I think that might solve these things. |
| 18:03 | mthvedt | futile: what do you mean by enforcing? will seqs be required to be lazy? |
| 18:03 | tomjack | actually the interface could be the same from the user's perspective since you've got that ref in there :) |
| 18:04 | futile | mthvedt: I'm wondering if it should |
| 18:04 | futile | tomjack: it's an atom now |
| 18:04 | mthvedt | futile: requiring a seq be lazy seems nonfunctional |
| 18:05 | tomjack | I should say "reference" |
| 18:05 | futile | tomjack: oh |
| 18:08 | tomjack | if I need a custom asserter, I also have to rewrite test2.expect? |
| 18:09 | rasmusto | is/should there be an as->> macro? I find as-> hard to use when I'm using ->> threading |
| 18:10 | bbloom | (doc as->) |
| 18:10 | clojurebot | "([expr name & forms]); Binds name to expr, evaluates the first form in the lexical context of that binding, then binds name to that result, repeating for each successive form, returning the result of the last form." |
| 18:10 | bbloom | rasmusto: hmmm maybe? |
| 18:10 | bbloom | i didn't realize that as-> actually also does threading, i thought it just assigned a name |
| 18:11 | rasmusto | ,(-> 2 (as-> myval (+ 3 myval))) |
| 18:11 | clojurebot | 5 |
| 18:11 | rasmusto | ,(->> 2 (as-> myval (+ 3 myval))) |
| 18:11 | clojurebot | #<Exception java.lang.Exception: Unsupported binding form: (+ 3 myval)> |
| 18:11 | futile | tomjack: I'm hoping to move more of it into a set of common functions in test2.api.asserters |
| 18:11 | rasmusto | the 2 gets threaded as the last form in the as->, so it doesn't get bound |
| 18:11 | tomjack | it doesn't do threading |
| 18:11 | bbloom | tomjack: ok yeah that's what i thought |
| 18:12 | bbloom | i think the -> part of as-> is just b/c there wasn't anything better to put there :-P |
| 18:12 | tomjack | rasmusto: you want ([name ...forms... expr])? |
| 18:13 | bbloom | it's basically (unthread-current-value-as x …) |
| 18:13 | tomjack | maybe it should be <-as |
| 18:13 | bbloom | eh. |
| 18:14 | tomjack | the similarity to -> looks nice when used together |
| 18:16 | rasmusto | yeah, something like that |
| 18:17 | rasmusto | (->> 2 (as->> myval (+ 3 myval))), where as->> takes the 2 as the last arg, yeah |
| 18:18 | rasmusto | maybe it's tough because "forms" could be arbitrarily long |
| 18:20 | rasmusto | -><- |
| 18:20 | tomjack | I wonder how evil this is https://www.refheap.com/0dae77a177a0ec49a8ab74348 |
| 18:21 | tomjack | er, https://www.refheap.com/a67de769d2dde8640d4e05de5 |
| 18:22 | tomjack | (stale [x] succeed).. |
| 18:22 | tomjack | rasmusto: well it's a macro so |
| 18:23 | tomjack | (defmacro as->> [name & args] (let [forms (butlast args) expr (last args)] `(as-> ~expr ~name ~@forms))) ? |
| 18:26 | rasmusto | tomjack: I'll check it out |
| 18:30 | tomjack | maybe that's what flip should mean in clojure |
| 18:31 | rasmusto | tomjack: what's that? |
| 18:31 | tomjack | (defn flip [f] (fn ... ([a b c] (f c a b)) ...)) |
| 18:31 | patchwork | Hmm… has anyone had issues pushing to clojars with lein-clojars using the latest lein? |
| 18:32 | tomjack | probably not |
| 18:32 | tomjack | (patchwork: ..not responding to you) |
| 18:32 | rasmusto | tomjack: ah, I've used a "rotate" function on sequences a few times |
| 18:32 | rasmusto | I dunno what use cases something like that would have |
| 18:33 | rasmusto | besides my terrible code |
| 18:33 | rasmusto | (not saying that flip is terrible) |
| 18:33 | tomjack | oh good name |
| 18:34 | tomjack | (lens/update-in f [:args] rotate) if we had a lens on fnargs |
| 18:34 | futile | Trying lein-push out. |
| 18:35 | rasmusto | ,(concat (drop 2 [1 2 3]) (take 2 [1 2 3])) |
| 18:35 | clojurebot | (3 1 2) |
| 18:35 | rasmusto | ,(concat (take-last 2 [1 2 3]) (drop-last 2 [1 2 3])) |
| 18:35 | clojurebot | (2 3 1) |
| 18:36 | patchwork | Suddenly it looks like lein is putting the jar in target/provided/*.jar |
| 18:36 | patchwork | but lein-clojars expects it to be in /target/*.jar |
| 18:36 | patchwork | WTF? |
| 18:36 | rasmusto | I guess I should modulo "2" with count of the collection or something |
| 18:36 | amalloy | rasmusto, tomjack: when i was new to clojure i wrote https://github.com/amalloy/hot-potato, which is a way to fiddle with parameter ordering, eg via flipping and rotating |
| 18:36 | tomjack | grr, I want (vector? (comp (comp #(mod % (count a-vector)) inc) a-vector)) |
| 18:37 | amalloy | i don't really ever use it, but it's probably interesting reading |
| 18:37 | tomjack | rather (vector? (comp a-vector (comp #(mod % (count a-vector)) inc))) |
| 18:37 | futile | Dang. lein-clojars looks in ./target/ for the jar, not ./target/provided/ where it really is. |
| 18:37 | patchwork | futile: That is what I'm saying |
| 18:37 | tomjack | (comp a-vector #(mod % (count a-vector)) inc) ? |
| 18:37 | rasmusto | amalloy: cool, I'll give it a read |
| 18:37 | amalloy | patchwork: the announcement for latest lein said that it moved the target/ dir |
| 18:37 | futile | patchwork: oh hey, you're doing the same thing as me! |
| 18:38 | amalloy | and that you can go back to the previous behavior if you want. i'd say, read the patch notes |
| 18:38 | futile | patchwork: which makes sense since I started doing it when I saw you say it. |
| 18:38 | tomjack | amalloy: cool |
| 18:38 | patchwork | amalloy: Sure, but that breaks lein-clojars |
| 18:38 | tomjack | I had something a bit like that but I don't like referring to args by index |
| 18:38 | patchwork | Alright, I'll read the patch notes... |
| 18:39 | futile | patchwork: yeah I'll read too. |
| 18:39 | tomjack | considered something like (reorder map [f coll] [coll f]) but then I just threw my hands up |
| 18:39 | futile | I'm running into the problem of wondering how to test my testing lib. |
| 18:40 | patchwork | Has clojars become deprecated? |
| 18:40 | futile | I half want to start writing tests using the lib itself. |
| 18:40 | futile | But that means I either have to port the old tests, or start running 2 side-by-side test suites. |
| 18:40 | futile | And porting the old tests means not being able to verify that the tests even run anymore. |
| 18:40 | futile | Hmph. |
| 18:40 | amalloy | patchwork: i don't know what lein-clojars is, but lein has had built-in deploy-to-clojars functionality since 2.0 |
| 18:40 | futile | Hmm |
| 18:40 | futile | amalloy: oh! |
| 18:41 | futile | amalloy: oh but dont you need to sign with gpg or something for that to work? |
| 18:41 | futile | amalloy: since I don't want to deal with gpg, I just do lein do pom, jar, and scp... |
| 18:41 | patchwork | amalloy: Got it. Been using lein-clojars since the lein 1.0 days |
| 18:41 | amalloy | generally, it's not phil's problem if some random plugin breaks because it was depending on the implementation-defined file layout |
| 18:41 | patchwork | didn't realize it had been deprecated |
| 18:41 | rasmusto | pomjarscp sounds like a flavor of sorbet |
| 18:42 | amalloy | futile: i did that for ages. i recommend at least trying the gpg route |
| 18:42 | futile | amalloy: k, will try. thx |
| 18:42 | futile | bbl |
| 18:42 | amalloy | you don't have to sign your jars, either, but you do need to use gpg to encrypt your clojars credentials, so at that point you might as well just sign the jars |
| 18:43 | patchwork | Did clojars get hacked or something? That seems like a lot of new security... |
| 18:44 | r0bgleeson | patchwork: i don't know but other OSS package managers have been hacked where a signed package would have helped |
| 18:54 | amalloy | patchwork: it didn't, as far as phil was able to determine |
| 18:54 | amalloy | signing jars is something he was already strongly urging people to do, before the latest rubygems fiascos |
| 18:55 | amalloy | and it's still just as optional as it was before that, but it's recommended |
| 18:55 | patchwork | amalloy: Got it |
| 18:55 | patchwork | It is good practice |
| 18:55 | patchwork | maybe this will finally motivate me to get gpg set up |
| 18:58 | technomancy | patchwork: the hosting provider clojars uses got compromised, but we have no evidence that the VPS instance hosting clojars itself was infiltrated |
| 18:58 | technomancy | but rubygems.org got hacked not too long ago and they are feeling the pain of not having bothered to do signing |
| 18:58 | technomancy | npm had a huge password leak not that long ago |
| 18:59 | technomancy | so far we've been lucky |
| 18:59 | patchwork | technomancy: Got it, good to know |
| 18:59 | technomancy | best not to assume we'll continue to be lucky =) |
| 18:59 | callen | technomancy: npm was pretty incompetently setup. |
| 18:59 | technomancy | callen: granted |
| 18:59 | patchwork | GPG it is! |
| 19:00 | technomancy | callen: I had no idea linode used coldfusion; it's depressing how you can do everything right yourself and still get bitten by others' screw-ups. |
| 19:00 | technomancy | s/depressing/sobering/ |
| 19:02 | SegFaultAX | CFM was a joke when it came out. The only company of note that used it (that I'm aware of) was MySpace. I basically hadn't heard anything /at all/ about it for the last couple of years and now I'm hearing about it all over. |
| 19:02 | SegFaultAX | Is it making a comeback or something? |
| 19:02 | technomancy | I don't think so |
| 19:02 | SegFaultAX | Well, that's maybe an over statement. I've seen a number of banks use it. |
| 19:02 | technomancy | my university used it back in 04 but I think they've escaped |
| 19:03 | SegFaultAX | I'm pretty sure seancorfield is also a CFM hacker. |
| 19:03 | SegFaultAX | Or at least he's tweeted about it. |
| 19:03 | callen | technomancy: facebook is PHP. *shrug |
| 19:03 | r0bgleeson | not anymore |
| 19:04 | r0bgleeson | i bet a lot of PHP has been replaced |
| 19:04 | SegFaultAX | r0bgleeson: After the amount of time they've spent on HH and HHVM? I doubt it. |
| 19:05 | r0bgleeson | yeah, HHVM is interesting, but from what I've heard (this is just chats over beer) a lot of facebook has moved over to services & the frontend is just PHP |
| 19:05 | SegFaultAX | r0bgleeson: If you're talking about backend services then yea, its been that way for a while. |
| 19:06 | SegFaultAX | r0bgleeson: But they still have tens of millions of lines of PHP in prod. |
| 19:07 | tomjack | holy crap |
| 19:08 | callen | Facebook might be the winners of "most impressively engineered ball of spaghetti" award. |
| 19:08 | r0bgleeson | lol |
| 19:08 | SegFaultAX | callen: It ain't easy building one of the most highly visited sites on the planet. |
| 19:09 | seancorfield | SegFaultAX: CFML? yup, been doing a lot of that over the last decade alongside everything else... |
| 19:09 | r0bgleeson | yeah. that's what makes it more remarkable. |
| 19:09 | r0bgleeson | they did that in PHP |
| 19:09 | r0bgleeson | and in started on PHP3/4 probably? |
| 19:09 | SegFaultAX | r0bgleeson: Except they had to build a transpiler and a VM to make it work. :) |
| 19:09 | r0bgleeson | crazy |
| 19:09 | SegFaultAX | rodnaph_: That's arguably not /just/ PHP anymore. |
| 19:10 | nightfly | what is it transcompiled to? |
| 19:10 | r0bgleeson | C++ |
| 19:10 | r0bgleeson | they've decided to build a VM instead now |
| 19:10 | supersym | fb uses erlang too, backend anyway |
| 19:10 | SegFaultAX | For chat |
| 19:10 | supersym | oh k |
| 19:11 | SegFaultAX | supersym: Not surprising since the most popular jabber server is Erlang. |
| 19:11 | supersym | yes that would make it a lot easier :) |
| 19:12 | seancorfield | Adobe has had a very poor record with security since they took over ColdFusion from Macromedia... but I don't use that, I use Railo instead |
| 19:13 | r0bgleeson | Macromedia |
| 19:13 | r0bgleeson | flashblack to the past |
| 19:13 | SegFaultAX | seancorfield: Are you like one of those COBOL developers that can charge whatever they want for their services since theres like 10 peole still alive who actually /know/ COBOL... but with CFML |
| 19:13 | seancorfield | Railo is a JBoss community project that provides a fast free open source implementation of CFML https://issues.jboss.org/browse/RAILO - and hasn't had the security leaks that ColdFusion has suffered |
| 19:13 | callen | SegFaultAX: of course not, it's even harder when you exercise very little engineering discipline. |
| 19:13 | seancorfield | r0bgleeson: I was Macromedia's Senior IT Architect for six years... go figure :) |
| 19:14 | callen | SegFaultAX: I used to port COBOL...I didn't get paid much ;_; |
| 19:14 | seancorfield | I ported COBOL compilers :) |
| 19:14 | r0bgleeson | seancorfield: cool, you built some cool stuff i played around with as a teen |
| 19:14 | r0bgleeson | iirc, fireworks |
| 19:14 | callen | seancorfield: yeah, that's essentially what I was doing. At the tools level. |
| 19:14 | callen | seancorfield: I did most of my work on the data side though. |
| 19:14 | seancorfield | I was never in the product division, although I did do some work on the AS3 compiler / runtime test suite |
| 19:14 | callen | seancorfield: I'm pretty sure I was getting billed out at $200/hour at the time. |
| 19:15 | SegFaultAX | seancorfield: Oh man, I fricken /loved/ Flash 4/5/MX |
| 19:15 | seancorfield | I ported Microfocus COBOL to the SPARC chipset (it became Sun COBOL 1.0 :) |
| 19:15 | seancorfield | callen: I think the highest I got was $175/hr for CFML stuff |
| 19:16 | SegFaultAX | seancorfield: Contract or ft? |
| 19:16 | seancorfield | But, yeah, back to security, Adobe has had a number of very high profile exploits for ColdFusion, mostly around 3rd party software they've integrated and not locked down properly (such as file uploaders) |
| 19:16 | callen | SegFaultAX: http://izbicki.me/blog/hlearns-code-is-shorter-and-clearer-than-wekas |
| 19:16 | seancorfield | SegFaultAX: contract! I wish I could make $175/hr FT! :) |
| 19:17 | callen | SegFaultAX: lol, Etsy implemented another monitoring stack. No wonder they need 100+ engineers. |
| 19:17 | seancorfield | And ColdFusion was never designed properly for shared hosting setups :( |
| 19:17 | callen | you can get rid of the last bit |
| 19:17 | SegFaultAX | seancorfield: Heh, that's why I asked. 175 isn't bad, but not particularly higher. I would have figured you could get whatever you wanted. Don't imagine there are many people bidding on CFML jobs. |
| 19:17 | callen | "ColdFusion was never designed properly" |
| 19:17 | SegFaultAX | callen: I know, haha. I saw that. |
| 19:17 | seancorfield | Railo is much better there since it leverages the Java web app security stuff (which ColdFusion instead works really hard to circumvent) |
| 19:18 | SegFaultAX | seancorfield: Adobe CFML still active? |
| 19:18 | seancorfield | SegFaultAX: most CFML contractors get $50/hr if they're lucky... |
| 19:18 | SegFaultAX | callen: In their blog, they said they have > 250k metrics. Just wow. |
| 19:18 | seancorfield | SegFaultAX: Yeah, Adobe released v10.0 a year or so back with v11.0 coming late this year or early next |
| 19:18 | callen | SegFaultAX: variables? |
| 19:18 | supersym | earlier this week, while doing a little pentesting, was a cf10 server actually... read 9/10 admins havent even patched for the latest breach :S |
| 19:19 | papachan | somebdoy change #clojure channel to #coldfusion |
| 19:19 | supersym | 'nuf said |
| 19:19 | callen | SegFaultAX: I'm not sure I believe them that they're digesting or leveraging that. |
| 19:19 | seancorfield | hahaha... there is a ##coldfusion chanel if you ever want to discuss it in the proper place! |
| 19:19 | SegFaultAX | callen: Seriously. That's fucking insane. |
| 19:19 | callen | SegFaultAX: sounds like data masturbation to me. |
| 19:19 | callen | "LOOK AT HOW BIG OUR BIG DATA IS" |
| 19:19 | callen | (we're so sophisticated. srsly) |
| 19:19 | SegFaultAX | seancorfield: We should get lunch. I'd love to pick your brain :) |
| 19:20 | callen | SegFaultAX: he's a nice guy. He won't harm you. |
| 19:20 | callen | seancorfield: are you still doing those meetups in SF? |
| 19:25 | seancorfield | indeed, although I was too busy with work to make the last one |
| 19:26 | seancorfield | next SF meetup is Aug 1st, next dojo is... june 25, next san mateo meetup is june 20 |
| 19:27 | seancorfield | then july 18 in san mateo, dojo in SF july 23 |
| 19:27 | seancorfield | SegFaultAX: where are you based? same for you callen ? |
| 19:27 | SegFaultAX | seancorfield: He's in MV, I'm in the east bay. |
| 19:28 | callen | seancorfield: I went to one of the meetups at weatherbill, I brought the other biker dude and got peoples' Emacs+Clojure setups working. |
| 19:28 | callen | seancorfield: mostly by cheating and having them clone my dotfiles repo. lol. |
| 19:28 | SegFaultAX | seancorfield: Familiar with Walnut Creek/Lafayette area? |
| 19:29 | seancorfield | I'm in Castro Valley so, yeah, you're just 680 from me |
| 19:30 | seancorfield | callen: I think I remember - that was ages ago!! We've been in the new Climate offices on 3rd St for *ages* |
| 19:30 | callen | seancorfield: I've been putzing around for ages. *shrug* |
| 19:30 | SegFaultAX | seancorfield: In SF? |
| 19:30 | callen | SegFaultAX: I was converting more souls to the Church of Emacs. |
| 19:31 | callen | SegFaultAX: you willl conveeerrrrt.... |
| 19:31 | seancorfield | well, my contact details are on http://corfield.org/resume if you wanna hang out some time... |
| 19:31 | seancorfield | Bay Area meetups: http://www.meetup.com/The-Bay-Area-Clojure-User-Group/ |
| 19:33 | callen | seancorfield: how familiar are you with the request/thread semantics of Jetty vs. Aleph/Httpkit? |
| 19:34 | ztellman | callen: what do you need to know? |
| 19:34 | callen | oh dear, the wizard of oz is here. |
| 19:35 | callen | grabbing code, h/o |
| 19:35 | callen | ztellman: https://github.com/bitemyapp/neubite/blob/master/src/neubite/middleware.clj Pretty sure this only works due to request per thread in a standard Jetty container |
| 19:35 | callen | ztellman: how do I make this play nice with the other children if I'm looking at a thread worker pool + async such as I think Aleph does? |
| 19:36 | callen | is the setup/takedown middleware enough? |
| 19:36 | seancorfield | callen: heh, i'll happily defer to someone who knows... |
| 19:36 | callen | I've been dying for somebody that would know the answer to this *_* |
| 19:37 | ztellman | callen: I can't speak to http-kit, since last time I talked to the author he seemed skeptical that thread affinity was useful |
| 19:38 | ztellman | sorry, got pulled away for a sec |
| 19:38 | callen | np |
| 19:38 | callen | I've been bugging people about this for at least a couple of weeks. |
| 19:38 | callen | ask Raynes :P |
| 19:39 | SegFaultAX | Ugh, I feel bad. I accidentally revived a post in the mailinglist from 2008 because I misclicked. :( |
| 19:40 | SegFaultAX | And now people are responding to it even though I deleted it. |
| 19:40 | ztellman | so if you buy all the way into my world of code, bindings are conveyed by pipelines if you add :with-bindings? to the options |
| 19:40 | callen | SegFaultAX: mailing lists are so wonderful like that |
| 19:40 | ztellman | you can get a similar mechanism using bound-fn around any callbacks you register in the original context |
| 19:41 | callen | ztellman: bound-fn was the main solution I was eyeballing. |
| 19:41 | ztellman | thought clojure's bound-fn is needlessly slow |
| 19:41 | ztellman | though* |
| 19:41 | callen | ztellman: I feel like I should double-check libnoir isn't guilty of the same flaw. |
| 19:41 | callen | I'm not sure my time scale for "slow" is the same as yours ;) |
| 19:41 | ztellman | https://github.com/ztellman/potemkin/blob/master/src/potemkin/macros.clj#L56 |
| 19:42 | tomjack | does that one also work synchronously? |
| 19:42 | tomjack | I mean with a synchronous executor |
| 19:42 | tomjack | or did I misremmeber that problem |
| 19:43 | ztellman | tomjack: the issue with synchronous executors is when you throw transactions into the mix |
| 19:43 | ztellman | the actual behavior seems to have shifted a bit since I reported the problem, it happens with all transactions now |
| 19:43 | tomjack | I see |
| 19:44 | ztellman | binding conveyance with agents et al was kind of broken, the last time I checked, it never cleans up |
| 19:44 | tomjack | oh right |
| 19:44 | amalloy | btw, ztellman, you don't actually need the ~' in https://github.com/ztellman/potemkin/blob/master/src/potemkin/macros.clj#L73 and similar places. the compiler just looks at (= (name sym) '&), and namespaces get ignored |
| 19:44 | tomjack | I was confused because I thought bound-fn was using hacks to be fast |
| 19:44 | tomjack | but it's the private one |
| 19:44 | ztellman | so the bindings that are conveyed just kind of stick around in whatever thread pool it executes in |
| 19:45 | ztellman | tomjack: yeah, the private one has poor hygiene |
| 19:45 | ztellman | amalloy: since when? I got in the habit of doing that a while back, I could swear it complained to me |
| 19:45 | amalloy | ztellman: i'm sure as far back as 1.3, and i think 1.2; 1.1 and below is outside my experience |
| 19:45 | ztellman | tomjack: fast-bound-fn actually restores the original threadlocal context |
| 19:46 | callen | that's pretty sweet. |
| 19:46 | ztellman | amalloy: TIL |
| 19:46 | amalloy | it seems a little strange, until you realize the compiler is doing the same thing in, eg, deftype and reify: `(reify Foo (blah [this#] this#)) works fine, even though it's actually (my.ns/blah [this#] this#) |
| 19:47 | tomjack | I'm guessing core.async's binding conveyance must be even slower |
| 19:47 | ztellman | tomjack: I haven't been following it too closely, I couldn't say |
| 19:47 | amalloy | (i, too, used ~'& for a long time, just assuming that it would break otherwise) |
| 19:48 | callen | ztellman: anyway, thanks for poking at my question. Much appreciated. |
| 19:51 | ztellman | callen: short answer is: don't do asynchronous stuff unless you have to |
| 19:52 | callen | ztellman: oh yeah, that's the answer I'd settled on, but I've got bound-fn slotted in the back of my head if I feel like coming up with a more robust solution. |
| 19:59 | patchwork | Alright, I set up gpg according to the lein docs (encrypted and decrypted some messages) but now when I run % lein deploy I get this: |
| 19:59 | patchwork | gpg: can't query passphrase in batch mode |
| 19:59 | patchwork | batch mode? |
| 19:59 | patchwork | How do I deploy without batch mode? |
| 20:00 | technomancy | patchwork: typically the passphrase is handled by gpg-agent |
| 20:01 | technomancy | unfortunately I don't know much about setting it up; it just works out of the box on debian |
| 20:01 | technomancy | but there's a `lein help gpg` guide that might have some good pointers |
| 20:01 | patchwork | technomancy: I went through the guide |
| 20:01 | patchwork | Are you saying I can't use % lein deploy without gpg-agent? |
| 20:02 | technomancy | patchwork: no, just that IME gpg-agent is the easiest way |
| 20:02 | technomancy | are you on OS X? |
| 20:02 | patchwork | technomancy: Yeah |
| 20:03 | patchwork | Everything is set up according to the docs, but I still get gpg: can't query passphrase in batch mode |
| 20:03 | patchwork | bummer |
| 20:03 | patchwork | I tried to install gpg-agent |
| 20:03 | technomancy | do you have a credentials.clj.gpg file? |
| 20:04 | patchwork | but brew installs gpg-agent 2.0 and gpg 1.4 |
| 20:04 | technomancy | we have --batch mode specified for reading credentials, but not for signing jars |
| 20:04 | patchwork | technomancy: Yeah |
| 20:04 | patchwork | I made the credentials.clj.gpg using gpg |
| 20:04 | patchwork | (encrypted it I mean) |
| 20:04 | technomancy | ok... you do not want to use credentials.clj.gpg without gpg-agent |
| 20:04 | technomancy | because then you would have to enter your passphrase for every dependency resolution run |
| 20:05 | technomancy | but you can still use gpg for signing without using it for creds |
| 20:05 | patchwork | technomancy: Aha… really? So how do I specify credentials without using credentials.clj.gpg? |
| 20:05 | technomancy | do you have full-disk encryption? |
| 20:05 | patchwork | technomancy: NO |
| 20:06 | patchwork | *No |
| 20:06 | patchwork | (did not mean to yell!) |
| 20:06 | technomancy | heh |
| 20:06 | technomancy | ok, so you should not store your credentials unless you either set up full disk encryption or gpg-agent |
| 20:06 | Raynes | Installing gpg stuff with brew is blech. |
| 20:06 | technomancy | but until you get that figured out you can just enter your password when you deploy |
| 20:06 | patchwork | I encrypted the credentials with gpg so shouldn't that be enough? |
| 20:07 | technomancy | patchwork: the problem is that gpg-encrypted credentials are read for every dependency resolution |
| 20:07 | technomancy | right now lein doesn't have a separate for deploy creds vs fetch creds |
| 20:07 | patchwork | Sure, but it should still work right? |
| 20:07 | Raynes | http://macgpg.sourceforge.net/ |
| 20:07 | patchwork | If I want to enter my passphrase every time? |
| 20:08 | technomancy | patchwork: no, because we have the creds decrypted with --batch |
| 20:08 | patchwork | technomancy: I understand what you are saying, but in principle it should still work |
| 20:08 | patchwork | Okay |
| 20:08 | technomancy | which assumes gpg-agent is set up |
| 20:08 | patchwork | So gpg-agent is required then |
| 20:08 | technomancy | in your case entering your clojars password when doing the deploy is probably your best bet |
| 20:08 | technomancy | better the entering your passphrase every time you launch lein repl |
| 20:09 | technomancy | we should probably have separate files for deploy-only creds |
| 20:09 | patchwork | Possibly you can clarify in the setup that people should be using gpg-agent, it makes it seem like that is optional |
| 20:10 | patchwork | I don't mind entering my passphrase |
| 20:10 | technomancy | it's optional, just not for credentials.clj.gpg |
| 20:10 | technomancy | if you are using full-disk encryption then credentials.clj.gpg isn't necessary |
| 20:10 | patchwork | technomancy: Hmm… so either full-disk encryption or gpg-agent is required |
| 20:10 | technomancy | or if you enter your clojars creds on each deploy |
| 20:11 | patchwork | Hmm… that is a step backwards from the lein-clojars approach |
| 20:11 | patchwork | where I could just say % lein push and it worked |
| 20:12 | technomancy | well... if your OS has good SSH support but not good GPG support, sure |
| 20:12 | patchwork | So basically I should be using linux then? |
| 20:12 | patchwork | That seems like an extreme fix for my issue : ) |
| 20:13 | technomancy | or windows, where it's a pain either way =) |
| 20:13 | technomancy | anyway, secret storage is orthogonal to signing |
| 20:13 | technomancy | using gpg to sign artifacts is not bad even without the agent, because deploys don't happen that often |
| 20:15 | technomancy | but yeah, not many of the lein contributors use OS X, so we don't have a lot of people feeling that particular pain point |
| 20:15 | Raynes | tomjack: Are you tomoj? |
| 20:15 | patchwork | Didn't realize |
| 20:15 | patchwork | I get the impression many clojure devs use OSX |
| 20:15 | patchwork | At least, all the ones I've met do |
| 20:16 | Raynes | tomjack: amalloy and I are having a debate about whether you are the same person as him at the work. |
| 20:16 | technomancy | I hacked out initial support that assumed gpg just worked everywhere like it does on debian an there was a pretty huge backlash initially =\ |
| 20:16 | Raynes | at work* |
| 20:16 | patchwork | So this is basically an experimental feature |
| 20:16 | tomjack | yep that's me |
| 20:16 | technomancy | patchwork: well the initial backlash was about an earlier rev that made a lot more assumptions |
| 20:17 | technomancy | patchwork: my advice would be to punt on secret storage for now |
| 20:17 | technomancy | getting gpg working just for signing is a great first step |
| 20:18 | patchwork | Okay, I guess I didn't see the part that just shows how to sign |
| 20:18 | patchwork | the tutorial goes through setting up lein with gpg |
| 20:18 | patchwork | to use them in conjunction |
| 20:18 | technomancy | hm; yeah we should probably clarify the distinction there |
| 20:18 | technomancy | it's just coincidental that they both use gpg |
| 20:18 | patchwork | How do I sign a jar with gpg? |
| 20:18 | technomancy | the secret storage stuff should really be replaced with os-specific functionality, but that requires JNI |
| 20:18 | tomjack | .i le lojbo me mi cu morsi |
| 20:19 | technomancy | patchwork: `lein deploy clojars` should do it |
| 20:19 | patchwork | Yeah, doesn't seem to work yet |
| 20:19 | technomancy | hrm |
| 20:19 | patchwork | technomancy: Okay, so I just take out the .clj.gpg file and lein deploy clojars will work? |
| 20:19 | patchwork | I see |
| 20:19 | patchwork | What do I put for a value for the :creds key? |
| 20:19 | technomancy | patchwork: if you leave it out you should get prompted |
| 20:19 | technomancy | try that first |
| 20:20 | SegFaultAX | Raynes: I really like the image you selected for Laser. :D |
| 20:20 | Raynes | technomancy ^ |
| 20:20 | tomjack | Raynes: also tomoj.la expired.. |
| 20:20 | Raynes | He suggested it iirc. |
| 20:21 | technomancy | <3 |
| 20:21 | tomjack | now I'm at tomjack.co |
| 20:21 | SegFaultAX | Well both of you <3 |
| 20:21 | Raynes | seancorfield: Windows machine. |
| 20:21 | technomancy | seancorfield: they don't pay me enough |
| 20:21 | Raynes | I think Windows is much worse off. |
| 20:21 | patchwork | It failed with ReasonPhrase: forbidden |
| 20:21 | seancorfield | oh, that would just be mean |
| 20:21 | Raynes | seancorfield: I thought you were the advocate for "Meh, Clojure on Windows ain't hard." |
| 20:21 | patchwork | after asking for my GPG passphrase twice |
| 20:21 | patchwork | and my clojars creds once |
| 20:22 | patchwork | Wow, can't even deploy anymore! |
| 20:22 | Raynes | patchwork: You should reformat your harddrive and reinstall your operating system. |
| 20:22 | patchwork | This is going to be a problem |
| 20:22 | seancorfield | Raynes: that's so... but i still wouldn't inflict it on technomancy - at least mac os x is vaguely *nix-like :) |
| 20:22 | technomancy | patchwork: typo with the clojars password? |
| 20:22 | hyPiRion | Raynes: Clojure on Windows ain't hard. Just install a linux distro, then you're ready to go |
| 20:22 | technomancy | patchwork: have you done HTTP-based deploys before? |
| 20:23 | patchwork | technomancy: I have been doing deploys to clojars for almost two years now |
| 20:23 | patchwork | using the lein-clojars plugin |
| 20:23 | patchwork | Not a typo, just happened again |
| 20:23 | technomancy | patchwork: ok, so you can disable the signing just to rule it out |
| 20:23 | patchwork | Okay |
| 20:23 | technomancy | patchwork: :repositories {"clojars" {:url "https://clojars.org/repo" :sign-releases false}} I think |
| 20:24 | technomancy | I think ReasonPhrase forbidden means clojars rejected your password but that's one way to make sure |
| 20:25 | patchwork | No, still asked me for my gpg passphrase |
| 20:25 | patchwork | Wow |
| 20:25 | technomancy | so... the gpg guide doesn't actually cover credentials.clj.gpg |
| 20:26 | patchwork | https://github.com/technomancy/leiningen/blob/stable/doc/DEPLOY.md |
| 20:26 | patchwork | Alright, have to go |
| 20:26 | justin_smith | aside, it is a great time for us all to be learning gpg |
| 20:26 | technomancy | right; I meant `lein help gpg` specifically |
| 20:27 | technomancy | but yeah, I'll review the deploy guide too |
| 20:27 | technomancy | justin_smith: if the rubygems breakin wasn't enough, prism is a nice object lesson in how you can never trust any system ever |
| 20:28 | hyPiRion | although you can trust one system over another |
| 20:31 | technomancy | http://tinyurl.com/lw8mnmw |
| 20:31 | callen | technomancy: I spent many of my earlier years hacking with X-Files or Star Trek TNG in the background. |
| 20:32 | technomancy | callen: I have a treat for you: http://sttngfashion.tumblr.com/ |
| 20:32 | technomancy | provided you haven't already read it |
| 20:34 | callen | technomancy: I have not seen this before |
| 20:34 | technomancy | consider it a gift |
| 20:34 | callen | technomancy: I'm already cracking up. |
| 20:36 | technomancy | "Then we have what appears to be two competing outfits, battling for supremacy on Dr. Brahms’ body. Will it be the surgical scrubs? Or the Days Inn bedspread? WHO WILL TRIUMPH?" |
| 20:39 | seancorfield | hmm, patchwork has gone... i was going to recommend the gpgtools for mac os x since that seemed the easiest way to get gpg-agent up and running... |
| 20:47 | noonian | homebrew has a formula for gpg-agent also |
| 21:13 | SegFaultAX | What are some good Clojure task/work queues. Something like Sidekiq/Redis/Celery in Ruby/Python. I've had a play with technomancy's Die Roboter, but it's unmaintained at this point. |
| 21:15 | trptcolin | SegFaultAX: i'd recommend a real message queue for anything serious. something like RabbitMQ, HornetQ, or others similar |
| 21:15 | trptcolin | using Redis as a message queue in production can be pretty scary |
| 21:17 | trptcolin | both rabbit & hornet have some pretty good-looking client libraries around them; i've only interop-ed w/ the java client libraries myself |
| 21:28 | seangrove | SegFaultAX: We're using resque right now, until we're fully migrated away from our legacy ruby workers |
| 21:28 | seangrove | MongoCongo is supposed to be quite good if you're using MongoDB already |
| 21:29 | seangrove | Ultimately we'll likely move to kestrel/storm |
| 21:29 | tomjack | dnolen: I'm don't really feel good about ties anymore. I sort of wonder if I really want to be able to implement my own binder types (putting chunks of syntax and semantics into types instead of big separate syntax and semantics relations), but I think that probably just indicates that I haven't figured out how to use the simple primitives yet, so I'm going to keep playing with just tie |
| 21:29 | Raynes | seangrove: You mean congomongo |
| 21:29 | Raynes | ? |
| 21:29 | seangrove | Raynes: presumably :) |
| 21:29 | tomjack | in separate work I need a notion of definitional equality sort of analogous to the set example I gave for ties, it's either an abuse of unification or you need custom types which unify by definitional equality |
| 21:29 | seangrove | Ah, that doesn't look right at all |
| 21:29 | tomjack | the latter seems probably wrong, so I'm guessing ties with a set is an abuse of unification |
| 21:30 | seangrove | Just looks like a mongodb access layer |
| 21:34 | seangrove | SegFaultAX Raynes: I meant https://github.com/circleci/congomongo-mq in this case, actually |
| 21:37 | callen | seangrove: use-case? |
| 21:37 | seangrove | SegFaultAX asked for task/work queues |
| 21:38 | callen | oh right. |
| 21:38 | callen | seangrove: kestrel/storm are probably way overpowered for what he wants though. |
| 21:39 | seangrove | likey, yeah |
| 21:57 | callen | dsantiago: http://i.imgur.com/f7A12FW.jpg on the way home from the shelter. |
| 21:58 | ddellacosta | callen, cute! nice dog. |
| 21:59 | ddellacosta | anyone know why fixtures aren't working w/clojurescript.test? |
| 21:59 | callen | ddellacosta: not my dog. pffft, I wish. |
| 21:59 | callen | ddellacosta: I'm just nuts about pitbulls. |
| 22:00 | trptcolin | ddellacosta: yeah, i shaved that yak a bit, had a partial patch at one point |
| 22:00 | trptcolin | i should have reported it, sorry cemerick... it's to do with namespace munging |
| 22:01 | trptcolin | lemme dig up the workaround i was using |
| 22:01 | ddellacosta | trptcolin: so, not fully functional yet huh? I'm on 0.0.5-SNAPSHOT, and the fixtures I've registered just don't get called |
| 22:01 | ddellacosta | trptcolin: cool, that'd be super helpful--thanks! |
| 22:01 | trptcolin | it's just the outer sugar that doesn't work as i recall |
| 22:01 | ddellacosta | trptcolin: huh, okay…so, something like calling register-fixture! directly will work perhaps? |
| 22:01 | trptcolin | that sounds familiar |
| 22:02 | ddellacosta | lemme give that a shot real quick |
| 22:02 | trptcolin | [i've since moved over to specljs, hence the bad memory and lack of patch-finishing] |
| 22:03 | ddellacosta | trptcolin: ah, okay…I'm still figuring out a good CLJS testing workflow, I'll have to check out specljs too |
| 22:03 | ddellacosta | it's still mighty rough around the edges |
| 22:04 | trptcolin | ddellacosta: keep in mind i'm not sales-pitching it, yet; specljs has 2 particularly rough edges with spurious cljs warnings that we need to track down |
| 22:05 | ddellacosta | trptcolin: gotcha. Yeah, I suspect most everything is at a similar stage in CLJS, we are still in the early days of fine-tuning the tooling it would seem |
| 22:05 | trptcolin | yeah, something like (register-fixtures! ns-name :each fixture-name) is what i was using to work around |
| 22:05 | trptcolin | yep |
| 22:06 | ddellacosta | building out an actual production app has really exposed the missing bits, and given me more incentive to contribute |
| 22:06 | ddellacosta | CLJS has so much potential, we just need to clean up some of this to make it easier to get going. |
| 22:06 | ddellacosta | but I digress. |
| 22:08 | ddellacosta | trptcolin: excellent, that last bit did it--thanks so much! |
| 22:08 | trptcolin | sure thing |
| 22:10 | trptcolin | yeah, and if you or anyone want to patch that, it's probably not a huge time sink - definitely ns munging tripping clojurescript.test up - my holdup was not fully understanding when nses actually *should* be munged, or really how to even use one or two of the features in clojure[script].test |
| 22:11 | ddellacosta | yeah, in fact, just looking at that now--I'll see if I can't get it working and post a patch |
| 22:13 | trptcolin | cool, yeah, looking at https://github.com/cemerick/clojurescript.test/blob/master/src/cemerick/cljs/test.clj - it was test-ns-hooks that i had no idea what they were |
| 22:13 | ddellacosta | I know that at some other place he talks about, if that is set, fixtures won't run, but I haven't read through all of it yet |
| 22:35 | tomjack | it would be really nice to be able to get a channel for a core.logic goal run |
| 22:36 | tomjack | I always end up doing (distinct (l/run 1000 [x] (g x))) and it takes like a minute and then there's like 3 answers |
| 22:36 | tomjack | if I could watch the answers come out I could just kill it when I'm satisfied |
| 22:36 | tomjack | and presumably you could then pause execution and resume |
| 22:41 | futile | Let's do this. |
| 22:43 | futile | trptcolin: thanks for reply, it's pretty awesome. |
| 22:44 | trptcolin | futile: my pleasure |
| 22:45 | futile | Yeah, what does "you're welcome" even mean, anyway? Welcome to what, or where? |
| 22:45 | futile | And "any time" isn't really true. Not 3am I'm willing to bet. |
| 22:46 | trptcolin | probably not |
| 22:46 | futile | And "sure thing".. you can't promise that, what if you're stuck in traffic? Not so sure then. |
| 22:46 | trptcolin | whelp |
| 22:46 | futile | Language is weird. |
| 22:47 | futile | ... but I love to digress. |
| 22:53 | futile | Feeling torn about morals, is this project a wrong thing to do? |
| 22:53 | futile | I mean, on one hand, it's a legitimately useful thing, and we would all benefit from it. |
| 22:55 | futile | On the other hand, it's almost like spitting on the volunteered hard work of several individuals who are rightly insulted, offended, and hurt by it. |
| 22:55 | futile | Why do all the projects I ever work on turn into exactly that dilemma? ... |
| 22:55 | ToxicFrog | Which project is this? |
| 22:56 | seancorfield | No project is the "wrong" thing to do. But don't take it personally if folks don't beat down your door to help. |
| 22:56 | futile | test2 |
| 22:56 | futile | seancorfield: not at all what I'm taking personally |
| 22:56 | seancorfield | I just meant it as general life advice :) |
| 22:56 | futile | Oh, good advice. |
| 22:57 | futile | I'm questioning this project's existence from a moral perspective. |
| 22:57 | seancorfield | I've built tons of OSS projects over the years. Many have been met with indifference. Some have "taken off" big time. A few have been met with open hostility. |
| 22:57 | futile | Should it exist? I'd love to use it, and I'm pretty sure many people would benefit from it a lot too. |
| 22:57 | seancorfield | Scratching a personal itch is always good practice, in terms of producing OSS :) |
| 22:58 | callen | futile: the fuck are you talking about? |
| 22:58 | futile | callen: ...? |
| 22:58 | seancorfield | I think the SPEC part is a great idea. I think our tooling around test frameworks is pretty awful and a common results spec would be really valuable. |
| 22:58 | callen | futile: I mean, I'm skeptical of test2, but why would it be the wrong thing to do? |
| 22:59 | callen | seancorfield is not the best example to follow in OSS, he's got more saintly patience than any of us. cf. the trolling we subjected him to with clj-time recently. |
| 22:59 | futile | seancorfield: right, that's what's implied by the spec. But it's also what's so hurtful to the authors of midje and speclj and expectations. |
| 22:59 | seancorfield | futile: it's not hurtful to say there's no commonality in test reporting :) |
| 22:59 | futile | seancorfield: you wrote clj-time? cool, thx bruh |
| 22:59 | callen | futile: with regards to expectations, it looks pretty cool, but I'm not surprised it doesn't have PRs or issues either. |
| 22:59 | seancorfield | callen: I'm so thick skinned, I don't even remember... |
| 22:59 | callen | seancorfield: the mixed plurals/singulars. |
| 23:00 | futile | seancorfield: "our tooling around test frameworks is pretty awful" is hurtful to those who wrote it with good intentions |
| 23:00 | callen | I think we've got a good bag of tools for testing, but there's a particular design niche of testing libraries that I think is under-served in Clojure. |
| 23:00 | futile | callen: TBH I thought it was dead considering all the tutorials were 3-year-old blog posts |
| 23:00 | seancorfield | futile: Oh no, I can't claim clj-time - I took it over from the original author and now I've managed to get Michael Klishin involved which is a big help for me! |
| 23:00 | callen | the real secret to OSS is Tom Sawyer. |
| 23:00 | futile | seancorfield: oh then un-thd |
| 23:00 | futile | *un-thx |
| 23:00 | futile | callen: what a terrible song |
| 23:00 | callen | futile: I was making a literary reference. |
| 23:01 | seancorfield | I didn't write java.jdbc either. I took that over from Stephen Gilardo. Although 0.3.0 is pretty much a complete rewrite... |
| 23:01 | futile | callen: what a terrible name for a book |
| 23:01 | seancorfield | I did write fw1-clj but no one uses that... |
| 23:01 | futile | jk |
| 23:01 | futile | seancorfield: ! |
| 23:01 | futile | seancorfield: that's what got me into this trouble in the first place! |
| 23:02 | seancorfield | By tooling around test frameworks, I mean the displaying of results and the integration into IDEs etc... |
| 23:02 | callen | accessibility, marketing, and usefulness define a lot of what makes an open source project popular. |
| 23:02 | seancorfield | FW/1 for CFML is very popular :) That's why I ported it to Clojure... |
| 23:02 | futile | seancorfield: I decided to try rewriting my test suite to rely on a real running Postgres database, and when i used speclj's autorunner, it was out of open connections after like 3 re-runs |
| 23:03 | futile | seancorfield: and i was using clojure.java.jdbc! |
| 23:03 | callen | futile: your postgres instance was misconfigured. |
| 23:03 | futile | seancorfield: turns out it was speclj's auto-runner's fault, it runs all tests in a new thread every time you change something |
| 23:03 | callen | and you weren't harvesting old connections. |
| 23:04 | futile | callen: i spent *hours* trying to debug that and everyone said my PG config was fine and my usage of JDBC was fine. |
| 23:04 | callen | futile: I spent hours trying to get you to check your PG config and read the docs to begin with. |
| 23:05 | seancorfield | sounds like you weren't closing a connection that you had opened... so i suspect you were opening the connection in one thread and using it in another? |
| 23:06 | callen | seancorfield: he just kept spawning new threads and wasn't harvesting anything. |
| 23:06 | seancorfield | I'd have to look at your exact setup again to see what was wrong... And actually try it out with speclj I guess... |
| 23:07 | futile | seancorfield: I'm not sure that's worth it at this point. |
| 23:07 | futile | FWIW this is how Speclj's auto-runner works: https://github.com/slagyr/speclj/blob/master/src/speclj/run/vigilant.clj#L60-L68 |
| 23:08 | futile | Micah told me earlier today that it creates a new thread every second, and if you save some file with changes, it'll re-run related tests in a new thread. |
| 23:08 | futile | That's all I know. |
| 23:08 | callen | I wonder if there's a way to make the connections persistent and reused across threads? |
| 23:08 | futile | Well what I'm wondering now is, how would that work with Jetty+Ring? Doesn't that spin up a new thread for every request? |
| 23:09 | futile | Seems like Jetty+Ring+PG means having a blocked DB after 5 seconds of running. |
| 23:09 | callen | futile: yes, all this time Clojure API servers and web apps have been totally broken all this and we just hadn't noticed |
| 23:09 | noonian | it re-uses threads from a thread pool I think |
| 23:09 | callen | futile: thank you for pointing this out, I'll go warn everybody. |
| 23:09 | futile | callen: Good idea. |
| 23:10 | callen | noonian: it does but not in the way an async framework does. |
| 23:10 | futile | start with the mountains and hills. |
| 23:10 | callen | it works fine. |
| 23:10 | futile | Yes, I admit, I forgot that people use Ring+Jetty+PG. |
| 23:10 | callen | Ring + Jetty + PG works fine |
| 23:10 | noonian | callen: don't most async frameworks run in a single thread and just simulate multi-threading? |
| 23:10 | callen | noonian: only dumb ones. |
| 23:10 | futile | Which points to either me still using the stuff wrong, or speclj messing it up. |
| 23:10 | callen | noonian: one of them is named Node.js |
| 23:10 | callen | futile: it's speclj that's the fuckup here. |
| 23:11 | futile | Are you so sure it wasn't me? |
| 23:11 | callen | futile: Ring + jetty works fine with DB connections and connection pooling. |
| 23:11 | noonian | callen: yes |
| 23:11 | futile | Did you look at that link? |
| 23:11 | callen | futile: I mean, I'm open to it being your fuck up too. I'd call that high odds possibility. |
| 23:11 | callen | but you're here and the creator of speclj isn't, so he gets the mud. |
| 23:11 | futile | :P |
| 23:11 | futile | You have such a way with words. |
| 23:11 | futile | A terrible one. |
| 23:12 | futile | Not sure I can really take your moral advise seriously :P |
| 23:12 | futile | *ADVICE! not advise. WOW what a typo!! |
| 23:13 | callen | futile: http://www.eclipse.org/jetty/documentation/current/jndi-datasource-examples.html |
| 23:13 | callen | futile: I'm excellent with words, you just don't like how I use them. |
| 23:14 | futile | I don't like it because I'm right and you're wrong. |
| 23:14 | callen | at'll be the day. |
| 23:14 | callen | anyway the point of the above Jetty link |
| 23:15 | futile | Don't mess with me cowboy, or you'll realize you're dealing with a ninja, alright rockstar? |
| 23:15 | callen | was to highlight that DB connection pooling has been a thing with Jetty for bloody ages. |
| 23:15 | futile | Oh man yesss, I got all 3 in one sentence. |
| 23:15 | futile | ah, kthx |
| 23:15 | futile | kthx, kthx indeed. |
| 23:15 | callen | and that one of the blessed libraries is bonecp, which is what I recommend to people in here. |
| 23:15 | futile | yes, yes you have. twice. |
| 23:15 | seancorfield | fwiw, we use c3p0 at world singles (with mysql) |
| 23:15 | callen | a separate thread pool is maintained for both request handling and db connections in this case. |
| 23:16 | callen | seancorfield: bonecp would be a quick and easy swap. You should test query latency with each if you ever get the itch. |
| 23:16 | futile | seancorfield: do you guys have any (expect) assertions at the top-level of any file, outside of some function? |
| 23:16 | seancorfield | we may well... although "it ain't broke" right now :) |
| 23:17 | callen | seancorfield: http://jolbox.com/index.html?page=http://jolbox.com/benchmarks.html these benchmarks make c3p0 look kinda silly, but I'm a startup kid so I break things all the time anyway. |
| 23:17 | seancorfield | yes, all our expect's are top-level - that's how Expectations works |
| 23:17 | futile | ffff |
| 23:17 | callen | seancorfield: oh you do use Expectations? |
| 23:17 | futile | okay thats actually not bad. |
| 23:17 | callen | so it does have users. hah. |
| 23:17 | futile | yeah he switched from clojure.test to it |
| 23:17 | futile | you should read that blog post |
| 23:17 | callen | I'll probably keep using c.t |
| 23:17 | seancorfield | (given some-expr (expect f1 v1 f2 v2)) is the other format |
| 23:17 | futile | personally i do prefer (expect) function better, although i hate its magicalness |
| 23:18 | callen | I have some ideas on how I want to pimp out c.t a bit, but it's not a high value use of my time just yet. |
| 23:18 | callen | speaking of |
| 23:18 | futile | Me, the user, has to guess how it works. Sometimes it compares values literally, sometimes it treats the first arg as a test-function |
| 23:18 | futile | But what if the first arg is a MAP? |
| 23:18 | futile | WHO KNOWS. |
| 23:18 | futile | (Maps act as functions) |
| 23:18 | seancorfield | attaching everything to JVM shutdown is kinda weird... but while i'm developing, i use C-c , with expectations-mode to run tests whenever I want |
| 23:19 | seancorfield | it seems to me (expect) is very very intuitive |
| 23:19 | seancorfield | it does exactly what i expect (groan!) |
| 23:19 | futile | seancorfield: have you not run into that question then? |
| 23:19 | seancorfield | (expect value expr) |
| 23:19 | seancorfield | (expect exception expr) |
| 23:19 | seancorfield | (expect test-fn expr) |
| 23:19 | futile | but maps are test-fns |
| 23:19 | callen | the joys of IFn. |
| 23:19 | seancorfield | those all ready very cleanly |
| 23:20 | futile | (expect {:foo :bar} :foo) should this pass or fail!? |
| 23:20 | futile | NOBODY KNOWS. |
| 23:20 | futile | (I mean except those who tried it.) |
| 23:20 | futile | <-- I'm with that guy. |
| 23:21 | futile | (on this one.) |
| 23:23 | callen | futile: it's obviously a truthiness test. |
| 23:23 | futile | ... |
| 23:24 | futile | It'd have been solved by just doing (expect= value expr), (expect test-fn expr), (expect-error Exception expr) |
| 23:24 | seancorfield | oh, sorry, was reading something... it should fail (of course) otherwise it wouldn't be very intuitive |
| 23:24 | futile | seancorfield: and how does it know it should fail if Map implements IFn? thats the question that scares me |
| 23:25 | futile | or to generalize it could have just been (expect = a b), (expect empty? []), (expect (throws? Exception) expr) |
| 23:25 | futile | Nothing wrong with an explicit = in there like htat |
| 23:25 | TimMc | No, you could always use a wrapper: (expect (is value) expr), where `is` is (partial partial =). |
| 23:25 | callen | I don't think expect requires the use of throws? |
| 23:25 | futile | But then again I'm an arrogant jerk and know-it-all so never mind. |
| 23:25 | TimMc | Midje does this. |
| 23:26 | seancorfield | futile: have you actually _read_ the Expectations documentation? |
| 23:27 | futile | Tried to. |
| 23:27 | callen | seancorfield: he doesn't read docs, we've established this. |
| 23:27 | futile | Got pretty far I thought. |
| 23:27 | futile | Guess not far enough. |
| 23:27 | callen | seancorfield: he didn't like the postgres documentation which is some of the most thorough of any OSS project. |
| 23:27 | futile | Like I said, ignore me. |
| 23:27 | callen | futile: you need to buy a printer |
| 23:27 | futile | Do what callen does. |
| 23:27 | callen | futile: print out the documentation to the software you use, throw out all your magazines, and put the docs in your bathroom. |
| 23:27 | callen | futile: then you'll have no excuses. |
| 23:28 | futile | callen: ok |
| 23:28 | seancorfield | tbh, i think the expectations documentation is some of the clearest i've seen for a testing framework - great progression of examples from obvious intro to advanced scenarios |
| 23:28 | futile | in all seriousness, just ignore me. |
| 23:28 | futile | I'm arrogant and rude and ignorant. |
| 23:28 | seancorfield | and we find expectations to be extremely easy to use at world singles |
| 23:28 | callen | futile: please stop talking about yourself. |
| 23:28 | futile | callen: and self-centered! |
| 23:28 | callen | futile: it's just as tedious when it's negative as when it's positive. |
| 23:29 | futile | done |
| 23:29 | callen | seancorfield: I was impressed by expectations examples, but I prefer defn oriented testing libraries. |
| 23:29 | seancorfield | futile: what do you do for a living? and how long have you been working in the industry? i'm curious as to your background... and i haven't gotten around to googling you yet :) |
| 23:29 | callen | seancorfield: do you stay strictly within the confines of "unit testing" in your usage of expectations? |
| 23:30 | futile | callen: tell him i cant answer that |
| 23:30 | futile | cuz of ur rules |
| 23:30 | callen | futile: still tedious. |
| 23:30 | futile | fffff |
| 23:30 | callen | seancorfield: if not, how do you handle exercising the greater scopes of the stack? |
| 23:30 | futile | seancorfield: ok, typing the quickest one I can, so callen won't yell at me |
| 23:30 | callen | seancorfield: I'm a fan of API testing, which is why I ask. |
| 23:30 | callen | how is it I become the bad guy? |
| 23:31 | callen | bbloom: don't answer that. |
| 23:31 | seancorfield | callen: we use Expectations for BDD/TDD moreso than "unit testing" |
| 23:31 | futile | callen: who said the bad guy is the one who yells at people? |
| 23:31 | devn | heh, https://github.com/rplevy/swiss-arrows is pretty rad |
| 23:31 | futile | callen: in this case you'd be right for it. i.e. the good guy |
| 23:31 | callen | devn: been watching the -?> conversation? |
| 23:31 | devn | callen: actually no |
| 23:31 | devn | what's up with that? |
| 23:31 | callen | devn: you should be. hit up the mailing list. They're talking about salvaging threading macros from contrib. |
| 23:31 | devn | i just love the naming -- "the diamond wand" |
| 23:32 | callen | devn: I tried to get people to call -> the winchester for ages. |
| 23:32 | callen | no dice. |
| 23:32 | devn | callen: we've had this discussion :) |
| 23:32 | futile | seancorfield: its so hard to cut out all the boring parts of my background. oh man. this is hard. |
| 23:32 | callen | devn: yes. |
| 23:32 | seancorfield | callen: for example, we used Expectations to test-drive the development of a REST API we built (in another language) |
| 23:32 | callen | futile: Do you work as a programmer? If so, how long? Any specialty? |
| 23:32 | callen | futile: it's easy to make it compact. Follow the above format. |
| 23:32 | futile | seancorfield: 1) i do Clojure for a living. 2) i have been in the industry either 3 or 5 years. |
| 23:32 | callen | seancorfield: well that's API testing. |
| 23:33 | seancorfield | futile: is this you? http://blog.8thlight.com/steven-degutis/archive.html |
| 23:33 | futile | shhhhhiiiiii |
| 23:33 | futile | yes. |
| 23:33 | futile | but dont judge me, i was young and naive! |
| 23:33 | futile | (... 5 months ago) |
| 23:33 | seancorfield | callen: well, that's just one example of how we BDD/TDD stuff |
| 23:33 | devn | chouser and jclaggett rewrote every single clojure macro to match cond->> |
| 23:34 | seancorfield | but i suppose that's very API-focused |
| 23:34 | devn | it was very interesting to see code written that way |
| 23:34 | futile | i admit, i did Ruby for a living for 2 years :'( |
| 23:34 | devn | it was very imperative looking |
| 23:34 | devn | but entirely functional |
| 23:34 | futile | IM SORRY OK!? |
| 23:34 | devn | futile: *shrug* nothing to be sorry for |
| 23:34 | futile | devn: >:| |
| 23:34 | callen | futile: the sidebar stuff isn't high-value. Most people here are on their nth language. |
| 23:34 | devn | i still do ruby. there are a lot of people who need ruby work done. |
| 23:35 | callen | futile: very few people here outside of Raynes got to make their (paying portion) career 100% Clojure. |
| 23:35 | futile | if i lose this Clojure job and have no options but Ruby again, I might quit this career entirely. |
| 23:35 | callen | futile: this isn't #haskell, the self-flagellation for lack of loyalty to the cause is a waste of time. |
| 23:35 | devn | heh |
| 23:35 | futile | callen: no, its because i always hated OOP. always. |
| 23:35 | callen | futile: that's melodramatic and stupid. Have you ever worked a truly shitty job like working in a factory? |
| 23:35 | futile | so much unnecessary complexity! |
| 23:35 | futile | ITS JUST DATA AND FUNCTIONS PPL!! |
| 23:35 | devn | hate is a bit strong |
| 23:35 | futile | yes, yes it is. |
| 23:35 | futile | callen: yes. |
| 23:36 | futile | callen: I've worked third shift in a factory actually |
| 23:36 | futile | callen: I've delivered pizzas for years too. |
| 23:36 | callen | futile: then you should know better than to say coding in Ruby merits quitting programming. |
| 23:36 | futile | callen: I think I liked those jobs better, despite the lack of pay |
| 23:36 | callen | you clearly don't have to support anybody but yourself. |
| 23:36 | futile | i have a wife and 4 kids |
| 23:36 | futile | but factory jobs round these parts pay well |
| 23:36 | devn | i dont think ill participate in this discussion anymore because i think it's counter-productive. if you're writing ruby you know as well as anyone that there is interesting ruby code being written. get off your high horse, please and thank you. |
| 23:37 | futile | hey look over there |
| 23:37 | callen | Use whatever works. Ruby is fine for what it's usually used to accomplish. |
| 23:37 | callen | so is Python, etc. |
| 23:37 | futile | devn: thats the thing. i can honestly say i really dislike probably all ruby code ive seen. |
| 23:37 | callen | I don't "favor" Ruby and Python, but they're hardly sinful. |
| 23:37 | futile | not enough to turn down a ruby job, no. ia dmit. |
| 23:37 | devn | futile: then you aren't well read |
| 23:37 | futile | but now that ive used clojure for this long, i really dont wanna go back |
| 23:37 | seancorfield | i sympathize - i dislike ruby's syntax and therefore nearly all ruby code... it's a personal preference thing... |
| 23:38 | futile | its not about its syntax. syntax is nice, but its basically nothing |
| 23:38 | callen | I find the way Ruby is written to be more problematic than Ruby itself. |
| 23:38 | futile | design is the problem. |
| 23:38 | callen | I have a similar relationship with Java incidentally. |
| 23:38 | futile | everyone does terrible, terrible things with ruby and python and etc |
| 23:38 | callen | you clearly haven't done any CL or Perl. |
| 23:38 | callen | "terrible, terrible things" takes on a new meaning there. |
| 23:38 | futile | seriously. class after class after class to do JUST ONE THING. |
| 23:38 | mthvedt | the worst thing about those languages is the feeling they're entitled to do terrible things |
| 23:39 | futile | oh! i got it. |
| 23:39 | futile | over-complexity. |
| 23:39 | callen | I'd like to think this channel is above the 5 minutes of hate thing. |
| 23:39 | futile | those languages breed it like rabbits. |
| 23:39 | callen | can we not hate on other tools people use and enjoy |
| 23:39 | noonian | in perl its often a badge of honor |
| 23:39 | devn | dudes, you can write good code in any language. that's *your* job. |
| 23:39 | callen | and focus on being productive? |
| 23:39 | futile | callen: yes. |
| 23:39 | seancorfield | so futile, i see a series of articles of yours on the 8th light site but when i click thru to your bio on the team page, it's a 404 and you're not listed on the team roster... i gather you moved on from 8th light fairly recently? |
| 23:39 | futile | starting now. |
| 23:39 | devn | quit blaming languages and write better code |
| 23:39 | futile | seancorfield: they fired me about 7 months ago |
| 23:39 | futile | its ok, i got a new gig. |
| 23:40 | callen | futile: how old are you? |
| 23:40 | devn | resistance is futile |
| 23:40 | futile | (inc devn) |
| 23:40 | lazybot | ⇒ 7 |
| 23:40 | futile | callen: im ashamed to answer that |
| 23:40 | devn | so dont |
| 23:40 | futile | *too |
| 23:40 | devn | it is immaterial |
| 23:40 | seancorfield | devn: i agree with "good code in any language" - i have to agree with that... i've written a lot of CFML over the last decade :) |
| 23:40 | callen | why would age be a matter of shame? |
| 23:40 | mthvedt | callen: there is value in metadiscussion. also, i don't understand the purpose of the age question |
| 23:40 | futile | callen: because im old enough to know better than to say this much stupidity in 10 minutes on IRC |
| 23:41 | callen | futile: I'm just trying to mentally place where you are in life/career. |
| 23:41 | futile | callen: its enough to know im married with 4 kids |
| 23:41 | futile | 27 |
| 23:41 | callen | futile: where in the country are you? I'm in the bay area. |
| 23:41 | devn | seancorfield: ive seen some crazy ruby that is deeply functional. it is crazy as far as ruby is concerned, but it's ruby all the same. anyone who says "X language is pure garbage!" in modern times is likely full of piss and vinegar, mostly the former. |
| 23:41 | seancorfield | well, perhaps luckily for me - or others in this conversation - i have to go help my wife feed the cats... but i'll be back :) |
| 23:42 | seancorfield | devn: i gave a preso at a conference last month that showed how to do JS-style prototype inheritance, Clojure-style infinite lazy sequences, etc in CFML - you can write really nice, expressive, high-level code in all sorts of unexpected languages! |
| 23:42 | devn | the preferences i have in clojure are *subtle* |
| 23:42 | devn | seancorfield: exactly |
| 23:43 | seancorfield | biab |
| 23:43 | futile | Okay serious mode. |
| 23:43 | callen | devn: I've found cause to use FP in JS a fair bit, although I don't compare with nolen on that front. |
| 23:43 | futile | You can tell from the proper punctuation, spelling, and capitalization. |
| 23:43 | callen | futile: so what part of the country are you in? As I said I'm in the bay area. |
| 23:43 | futile | callen: I'm near Chicago. |
| 23:44 | futile | Not close enough to get a job there, though, commute is too long. |
| 23:44 | devn | callen: FP in JS is strangely normal in my experience. |
| 23:44 | futile | So yes, I'm one of the luckiest guys in the world. |
| 23:44 | futile | I have a full-time Clojure job and I get to work from home. |
| 23:44 | callen | devn: I just ignore prototypes and abuse partial application and scheme'ish FP. |
| 23:44 | devn | callen: yeah, it's kind of obvious, no? |
| 23:44 | devn | underscore + anything = good times |
| 23:44 | callen | devn: uhm, you'd think, but I was sort of a rare bird among the JS'ers I know. |
| 23:45 | callen | devn: yeah _.js is critical. |
| 23:45 | devn | callen: i was programming with some backbone folks and nearly everyone on my team got into FP through underscore |
| 23:45 | devn | they immediately began to recognize clojure stuff i was showing them |
| 23:45 | devn | group-by? no problem. |
| 23:45 | callen | devn: I stay far afield of backbone these days. AngularJS has done a really good job of gift-wrapping that "scale" of web app. |
| 23:45 | devn | yeah, i like angular myself |
| 23:46 | callen | devn: such that I default to Angular once I hit a certain level of complexity. |
| 23:46 | devn | just saying -- they were very open after seeing underscore in practice |
| 23:46 | futile | I added _.js to Zephyros, it didn't help much. |
| 23:46 | futile | Any of you guys on OS X? |
| 23:46 | Raynes | futile: You have a full time job bitching about Clojure test frameworks? |
| 23:46 | Raynes | Are they hiring? |
| 23:46 | devn | once we worked through a few semi-complex data problems with underscore they never wanted to go back |
| 23:46 | callen | Raynes: <3 |
| 23:46 | devn | lol |
| 23:46 | futile | Raynes: if I can get us making more money, sure. |
| 23:47 | callen | devn: if the alternative is spaghetti, yeah. |
| 23:47 | futile | OSX anyone? |
| 23:47 | devn | futile: dude, you're starting to gain a reputation. that's well within your rights, but seriously, try to keep things positive in this channel. that's how this channel has been for ages, and i think everyone would like to keep it that way. |
| 23:47 | callen | devn: only thing that isn't nice about doing FP in JS is that there's a lot of }); |
| 23:47 | Raynes | Underscore is the bee's knees, its legs, and its arms. |
| 23:47 | callen | which is sort of a given. |
| 23:47 | callen | Raynes: I didn't know you did any JS. |
| 23:47 | brehaut | ~anyone |
| 23:47 | clojurebot | Just a heads up, you're more likely to get some help if you ask the question you really want the answer to, instead of "does anyone ..." |
| 23:47 | futile | devn: I'm terribly sorry for dragging it down with negativity. I apoligize to everyone here and hope we can move on and let the past be in the past. |
| 23:48 | Raynes | callen: I've been known to write JS on occasion. See: refheap. |
| 23:48 | Raynes | Of course, refheap's js doesn't use underscore. |
| 23:48 | devn | futile: no need to apologize, just try and keep it moving in the direction of joy |
| 23:48 | callen | Raynes: oh right duh. Sorry. |
| 23:48 | Raynes | But my boss is using it for something at work. |
| 23:48 | futile | devn: And can you dec me enough to get my reputation gone plz? |
| 23:48 | Raynes | And it seems really nice. |
| 23:48 | devn | nah |
| 23:48 | callen | devn: joy? wrong programming language. :P |
| 23:48 | devn | (inc futile) |
| 23:48 | lazybot | ⇒ 2 |
| 23:48 | futile | I wish I had my anonymity back. |
| 23:48 | callen | Raynes: it's a good way of wrapping common-case collection processing in something more or less FP'ish in JS. |
| 23:49 | futile | devn: joy, one of the fruits! |
| 23:49 | devn | so what are we talking about now? |
| 23:49 | devn | how you don't like things? |
| 23:49 | callen | devn: _.js |
| 23:49 | callen | all underscore all the time. |
| 23:49 | futile | Anyone on OSX? |
| 23:49 | callen | ~anyone |
| 23:49 | brehaut | ~anyone |
| 23:49 | futile | I got a gift for anyone who's on OSX. |
| 23:49 | clojurebot | Just a heads up, you're more likely to get some help if you ask the question you really want the answer to, instead of "does anyone ..." |
| 23:49 | devn | futile: are you trolling, or? |
| 23:49 | clojurebot | Just a heads up, you're more likely to get some help if you ask the question you really want the answer to, instead of "does anyone ..." |
| 23:49 | futile | https://github.com/mattgemmell/zephyros |
| 23:49 | brehaut | callen: o/ |
| 23:50 | callen | brehaut: o/ |
| 23:50 | futile | The only sane WM I've found for OSX. Ever. |
| 23:50 | devn | futile: ill give it a look, but there's danger in believing in window managers |
| 23:50 | futile | Try it with this dotfiles: https://github.com/evanescence/dotfiles/blob/master/home/.zephyros.coffee |
| 23:51 | futile | devn: like I said, the only sane one I've found for OSX. |
| 23:51 | brehaut | full screen emacs for life |
| 23:51 | Raynes | futile: No. |
| 23:51 | futile | Raynes: k. |
| 23:51 | futile | Look, gifts don't have to be accepted. |
| 23:51 | futile | Take it or leave it. Your call. |
| 23:51 | devn | i've seen strong swimmers and mighty sailors descend into wild OCD configuration-fits over OSX WMs |
| 23:51 | futile | This one is different. |
| 23:51 | devn | i write code in my OS |
| 23:51 | futile | It's grid-based, which makes it really really awesome. |
| 23:52 | devn | it's weird. i'm productive without bells and whistles. |
| 23:52 | devn | whodathunk? |
| 23:52 | futile | In other words, since it's grid-based, you never have to edit the thing. It Just Works(tm). |
| 23:52 | futile | I've been using the same config since I wrote the WM about 4 months ago. |
| 23:52 | devn | futile: this tiles native windows? |
| 23:52 | callen | I'm pretty happy with my vanilla Xmonad, which I get to use because I'm not an Apple sharecropper. |
| 23:52 | futile | devn: yes. |
| 23:53 | callen | I used to use OS X though and swap between it and Linux. I got tired of doing without Xmonad though. |
| 23:53 | devn | futile: how the hell is that possible and why isn't xmonad dipping into that pool? |
| 23:53 | futile | devn: read the source, I wrote it to be as easy to read as possible. |
| 23:53 | brehaut | callen: brian mckenna has written an OS X backend for xmonad |
| 23:53 | devn | (which sucks) |
| 23:53 | futile | A friend of mine told me.. hold on let me quote him verbatim. |
| 23:53 | devn | brian mckenna is a brilliant dude, but osxmonad is broken |
| 23:53 | devn | ...deeply broken. |
| 23:53 | callen | ^^ yeah. |
| 23:54 | futile | "overall this is 100% the best window manipulator i've touched for osx, it's almost as great as xmonad was back in the day" |
| 23:54 | callen | I tried to make it work, it didn't, so meh. |
| 23:54 | Raynes | devn: In that I couldn't get it to run, yes. |
| 23:54 | devn | I recompiled like 10 times, cabal hell twice |
| 23:54 | devn | i tried really hard |
| 23:54 | devn | but that shit is totally broken |
| 23:54 | futile | Anyway, that's all I'll say. This thing is serious. It's real. It's good. It's worth a look. And it's free, a gift from me to you all. |
| 23:54 | futile | Nobody else knows about it but you guys. It's our secret. |
| 23:54 | devn | do i need to sudo to use it? |
| 23:54 | futile | No. |
| 23:55 | devn | lol i was kidding |
| 23:55 | futile | I can't tell humor anymore. |
| 23:55 | devn | it just sounds too good to be true. |
| 23:55 | devn | so naturally... |
| 23:55 | devn | futile: you need a "Quickstart" |
| 23:56 | Raynes | He didn't write it. |
| 23:56 | devn | oh, well there's that. |
| 23:56 | Raynes | I misread the "since I wrote it" comment too. |
| 23:56 | Raynes | He meant since he wrote his config. |
| 23:56 | devn | oh, heh |
| 23:56 | Raynes | But forming sentences that make sense is difficult. |
| 23:56 | Raynes | I have that problem too. |
| 23:56 | futile | Raynes: I did write it. |
| 23:56 | futile | Raynes: Look at the commits. |
| 23:56 | Raynes | wat |
| 23:56 | Raynes | You're Matt Gemmell? |
| 23:56 | devn | i are wanting to make a zephyros that are a working? |
| 23:56 | futile | No. |
| 23:56 | devn | are you a help guy? |
| 23:56 | futile | No. |
| 23:57 | Raynes | You're making no sense, sir. |
| 23:57 | futile | I wrote it and got a really inflated ego and gave it to someone else so I could deflate my ego. |
| 23:57 | devn | you're on the very edge of my ignore, dude |
| 23:57 | futile | Not that there was any reason to get an inflated ego. Having 100 starts the first week after being announced on HN isn't a big deal. |
| 23:57 | callen | devn: which is impressive, given that I'm not on it. |
| 23:58 | devn | callen: heh |
| 23:58 | Raynes | I don't much care for /ignore. |
| 23:58 | futile | devn: I have no idea why you'd say that. Maybe you think I'm trolling. |
| 23:58 | Raynes | I have the ability to just not listen to people. |
| 23:58 | devn | Raynes: i dont either, but there's a threshold sometimes |
| 23:58 | devn | some trolls are too damn good |
| 23:58 | futile | I just find this app super useful and wanted to share that with you. |
| 23:58 | Raynes | There was a time when I thought about /ignoring callen. |
| 23:58 | devn | futile: it sounds like you're bad mouthing the author |
| 23:58 | futile | Seriously, I'm not tro-- oh never mind. |
| 23:59 | futile | devn: look at the commits. They don't lie. |
| 23:59 | futile | https://github.com/mattgemmell/zephyros/commits/master |
| 23:59 | callen | Raynes: but you learned to wuv me. |
| 23:59 | Raynes | Had I done that, we wouldn't have shared our magical moments on the Santa Monica pier, devn. |
| 23:59 | devn | Raynes: speaking of which, ill be in SF in the next few weeks. hopefully we can meet up |
| 23:59 | callen | devn: he's not in SF. |
| 23:59 | Raynes | I'm nowhere near SF. |
| 23:59 | callen | devn: but I'm in the bay area. |
| 23:59 | devn | i know this :) |
| 23:59 | futile | This is the most confusing night I have had in a while. |
| 23:59 | devn | ill rent a car and visit |
| 23:59 | callen | devn: you could meet me. There's at least 3 or 4 people in here who can attest to my not being an axe murderer. |