#clojure logs

2013-11-07

00:00technomancyuvtc: "I have to give this a name, but I can't be bothered to think of a good name for it" is how I read it
00:00bitemyapp,(type (list* 1 (list* 0 ())))
00:00clojurebotclojure.lang.Cons
00:00bitemyapp,(list* 1 (list* 0 ()))
00:00clojurebot(1 0)
00:00technomancyuvtc: or "internal implementation detail; don't use this directly"
00:00bitemyapp,(list 0 1 2 3)
00:00clojurebot(0 1 2 3)
00:00bitemyapp,(type (list 0 1 2 3))
00:00clojurebotclojure.lang.PersistentList
00:00bitemyapp,(list* 0 1 2 3) ;; no dice grandma, only recursive conses
00:00clojurebot#<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Long>
00:00bitemyappuvtc: ^^ primitive. list* is part of the bootstrap.
00:01logic_progis there an idiomatic way to call clojure.edn/read on a filestream until it htis eof, and stores all objects read?
00:01uvtcbitemyapp, technomancy : nice, thanks. :)
00:01seangrovebitemyapp: Works like a charm, thank you!
00:01muhoologic_prog: (->> "/file/path" slurp clojure.edn/read-string) ?
00:01bitemyappseangrove: coolio. Doubtless there are further gaps in the coverage for JDBC (Korma should be comprehensive), but if you run into anything else let me know.
00:01bitemyappI took the opportunity to refactor the code too.
00:02logic_progmuhoo: that only raeds first object
00:02logic_progif there is say, 3 defs in a file, that approach only raeds the first
00:02muhoologic_prog: oh. hmm, i saw something in day-of-datomic that did that
00:02muhooit was used for database migration/schema ensuring
00:02logic_progmuhoo: any chance you can look it up? :-)
00:02muhoothere's also a good chance that i wrote something to do that too, and don't remember it :-/
00:03muhoologic_prog: hmm, looking now
00:04bitemyappso much prettier *_* https://github.com/bitemyapp/blackwater/blob/master/src/black/water/jdbc.clj
00:05bitemyapptechnomancy: https://github.com/bitemyapp/blackwater/blob/master/src/black/water/jdbc.clj look at what your library has helped me to do :)
00:06technomancycool beans
00:06muhoologic_prog: hahaha (->> "/file/foo.edn" slurp (#(str "[" % "]")) clojure.edn/read-string)
00:07bitemyappmuhoo: noice.
00:07muhoo*cough* *hack*
00:07bitemyappmuhoo: did you see that parseEval Scala thing that went around recently?
00:07muhoobitemyapp: naw, i don't scala
00:08bitemyappdude implemented SKI in terms of the parser behavior and was able to induce a stack overflow with 9 characters of input.
00:08bitemyapppretty sweet.
00:08bitemyappbut don't tell a Scala user that syntax is a bad idea, no sirree.
00:08muhoo:(){:|:& };:
00:08muhoobash$ :(){:|:& };:
00:08muhoohilarity ensues
00:09bitemyappoldest prank in the book,
00:09bitemyappactually it was invented before books.
00:09logic_progmuhoo: lol; you win
00:09bitemyapparrdem: alright, I managed to release a new version of one of my libraries. what are you up to?
00:10bitemyappI'm going to start, ping me if you come up for air :)
00:11muhooi have vague memories of sitting around a lab, and ssh'ing in to other machines in the lab, and doign "(eject /dev/cdrom0; sleep 1; eject -t /dev/cdrom0)" or similar
00:12muhoojust to watch the guys sitting at those machines go "wtf???"
00:12technomancymy favourite was to take a solitaire screenshot when you're one move away from winning and make it the desktop background
00:13muhootechnomancy: nice
00:14arrdembitemyapp: blerg. still around?
00:14bitemyapparrdem: yarr
00:14arrdembitemyapp: that's my line Q_Q
00:14bitemyapparrdem: get in mumbur
00:14arrdembitemyapp: <plug> https://github.com/clojure/core.typed/pull/3
00:14arrdembitemyapp: trying to steal my buddy's box
00:15muhootechnomancy: then there's also fun with xwindows, $DISPLAY, xauth, and ssh. like popping up pr0n on someone's screen while they're in the middle of debugging
00:16muhooah, youth
00:16technomancykids these days have no imagination
00:16arrdemmuhoo: if they've `xhost +`'d they deserve whatever they get.
00:16technomancywhen they want to mess with people they just do stuff like invent node.js
00:17technomancywhich is actually maybe more impressive, whatever
00:18technomancyI mean as a troll
00:22Raynes$last
00:22lazybotRaynes is listening to: The O'Jays - Imagination [Imagination]
00:22Raynestechnomancy: ^
00:22muhoo$last
00:22lazybotmuhoo last listened to: Limp Bizkit - Just Like This [Significant Other]
00:22RaynesDon't be telling lies now.
00:22muhoohahahaa!!!!
00:22muhoolazybot: YOU LIE
00:22marcopolo2slast
00:22marcopolo2:(
00:22muhooi have never, ever, in my life, listened to limp bizkit. i resent the accusation.
00:23muhoolazybot: i challenge you. pistols at dawn.
00:23marcopolo2woah didn't see the $ read it as an s
00:23marcopolo2$last
00:23RaynesIt uses your nickname as your last.fm account. You can supply an argument for another name, or do $assoc <last.fm username>
00:23lazybotCouldn't find that user.
00:23muhoothere must be someone else with that last.fm account. and he or she has terrible taste, too
00:24marcopolo2$assoc drchoc
00:24marcopolo2$last
00:24lazybotCouldn't find that user.
00:24Raynes$help assoc
00:24lazybotTopic: "assoc" doesn't exist!
00:24Raynes$help lfmassoc
00:24lazybotRaynes: Associate your nickname with a lastfm username
00:25RaynesI lied, guys. It's $lfmassoc. Apologies.
00:25marcopolo2$lfmassoc drchoc
00:25lazybotAssociated your username.
00:25marcopolo2$last
00:25lazybotmarcopolo2 last listened to: Top 250 Hits of 90s - Eagle Eye Cherry - Save Tonight [1998] [Top 250 Hits of 90s]
00:25marcopolo2awww yeeaaa
00:25RaynesClassy.
00:25muhooarrdem: xhost + s isn't even necessary, if you have root and xauth
00:25muhooor even if you have the user's login, don't need root. this all from memory, and it's been a while
00:26arrdemmuhoo: root is pretty hard to come by these days... at least on shared systems
00:26muhoothis was in a lab environment.
00:26muhooi don't remember the specifics, but there were shenanigans, for sure
00:26arrdembitemyapp: my buddy locked his door for some reason. no gaming box tonight.
00:27bitemyapparrdem: damn. oh well. I just clowned the fuck out of a terran. somebody should tell him you're not supposed to trade 1 for 1 with zerg.
00:27bitemyappoff to LoL then if you're not going to play :)
00:27bitemyapparrdem: I didn't know you signed the CA?
00:27arrdembitemyapp: sent mine in last week. maybe a little more ago.
00:28bitemyapparrdem: interesting patch. Think it'll reduce the noise associated with (ann ...) ?
00:29technomancythat's not a patch
00:29arrdemtechnomancy: nor is it a moon
00:29technomancyit's a pull request, and thus an anathema
00:30technomancyyou have failed to abide by the rules of the contribution process; don't let the door hit you on the way out; kthxbai
00:30ambrosebs*kicks arrdem*
00:30arrdemmeh.
00:31Raynesambrosebs: Yo. No. With the violence. Dude.
00:31arrdemwell sue me for being new to this.
00:31Raynes$last
00:31lazybotRaynes is listening to: Paramore - Grow Up [Paramore]
00:31Raynes^
00:31uvtcOff-topic: speaking of pistols at dawn and interesting patches, anyone else here doing movember?
00:31RaynesI bet I have a song title in my library for basically every situation.
00:31technomancyarrdem: no, you're being totally reasonable; just messing with you
00:32technomancyit's just not going to get applied that way =\
00:32arrdembitemyapp: that's exaclty the idea. most of the noise of type-annotating my shitty VM of two days ago was (t/ann ...) forms.
00:32arrdemtechnomancy: is there a different technique I should be using? patch to clojure-dev?
00:33technomancyarrdem: if your soul contains the requisite fortitude, jira.
00:33technomancymany are called; few succeed.
00:33arrdemlol. that involves me opening a clojure-dev jira account and applying for mail-list agian...
00:33bitemyapparrdem: yeah that stuff drives me nuts too.
00:33technomancyarrdem: neat patch though; I like the look of it
00:34bitemyappnathanic: hey liked your stuff on core.typed!
00:34bitemyappnathanic: check out arrdem's PR: https://github.com/clojure/core.typed/pull/3/files
00:34seangrovearrdem: git format-patch master --stdout > defn_gt_macro.patch, open an issue at http://dev.clojure.org/jira/browse/CTYP and attach it
00:34bitemyapparrdem: and then take a trip to Thailand for the next 2 years.
00:34bitemyappbecause that's ~roughly how long it'll take to get merged :P
00:34technomancyarrdem: ancient tomes tell of a path through the mists: http://dev.clojure.org/display/community/JIRA+workflow
00:35seangrovearrdem: I used to think it was a big deal, really isn't. At least dealing with dnolen anyway.
00:35arrdembitemyapp: lol
00:35technomancyThailand is nice this time of year
00:35muhoohe's of the young, fast-moving, githib generatiom
00:35technomancyand also other times of year
00:36muhoogithub even
00:36technomancy"guthub" is my preferred typo for that
00:36muhoocore clojure patches move at a much more deliberate pace, and by design IIUC
00:37bitemyappyeah to be fair, the other stuff clips along better.
00:37muhooeveryone loves to bitch about it tho
00:37bitemyappmuhoo: Scala is a good example of what can go wrong when you have open season on the compiler
00:38muhooi'm a debian user, so i;m ok with slow
00:40ambrosebsarrdem: the process is to attach a patch to the core.typed Jira.
00:40ambrosebsarrdem: but PR is great for reviews
00:40ambrosebsarrdem: I figured I'd wait until you got your CA in until we worried about that :)
00:40technomancyambrosebs: sorry, I know you don't deserve this snark; you don't have anything to do with it.
00:41arrdemshould I be expecting a confirm from someone invoved with Core that my CA's been recieved?
00:41ambrosebstechnomancy: :)
00:41ambrosebstechnomancy: keep complaining, perhaps it might change one day :)
00:42seangrovearrdem: Yeah, the site will be updated at the very least
00:42technomancyambrosebs: heh; I won't tell anyone you said that.
00:42ambrosebstechnomancy: :D
00:42seangrovearrdem: Wehn your name is on here, your patches can be accepted http://clojure.org/contributing
00:43seangrovearrdem: Looks like you're on there already, no?
00:43arrdemseangrove: yep I am :D
00:44ambrosebsarrdem: nice. open a ticket here http://dev.clojure.org/jira/browse/CTYP
00:44arrdemambrosebs: already done.
00:44arrdemambrosebs: http://dev.clojure.org/jira/browse/CTYP-92
00:44ambrosebsarrdem: great.
00:45ambrosebsarrdem: I honestly don't care, this isn't clojure.core :)
00:46arrdemambrosebs: haha yeah I know. I was stressing over commit messages, then did a git log and had a laugh at yours.
00:46ambrosebsarrdem: lots of good reading there
00:47arrdemambrosebs: changelog... changelog... update changelog....
00:48ambrosebsarrdem: "lots of stuff, I don't know how to use git and I'm the only committer so there"
00:49arrdemambrosebs: git commit --rebase HEAD~N, helping me hide my incompetence all summer at my internship :D
00:49ambrosebsarrdem: I don't like to pretend :)
00:49arrdemrebase. I meant reabase.
00:51uvtcIs there a pattern where you can tell which core functions are lazy and which are not? (I realize `doall` and `dorun` are eager).
00:53ambrosebsuvtc: other than check the docstring, I don't think so
00:53ambrosebsuvtc: if it returns a seq, it's probably lazy?
00:55ddellacostahmm, why can I not require-macros in the latest CLJS/lein-cljsbuild?
00:57uvtcambrosebs, Yes. Thank you. I remembered something from the "Clojure Programming" book, and just looked it up. Page 98 mentions that "laziness is restricted to sequences"...
00:58ambrosebsuvtc: right yes
00:59ambrosebsbefore I fix up the details, any feedback on this for a Typed Clojure landing page? http://typedclojure.github.io/typedclojure.org/
01:00ambrosebsas you can see, I've been having a lot of fun...
01:00ddellacostanevermind...
01:02bitemyappambrosebs: pretty cool :)
01:02bitemyappddellacosta: what was it?
01:02ddellacostabitemyapp: me being a dumbass. The greatest cause of frustration with Clojure, in my experience. :-)
01:02bitemyappddellacosta: but seriously, what was it?
01:03bitemyappddellacosta: people have a LOT of problems with cljs tooling, I need to add to my mental database so I can help people.
01:03bitemyappI don't care if it was a typo, I'd just like to know.
01:04ddellacostabitemyapp: well, comes down to me forgetting about how macros work in CLJS
01:04bitemyappddellacosta: annnnd?
01:05ddellacostabitemyapp: hold on, thinking about how to best explain it
01:05bitemyappsorry :) *waits patiently*
01:05ddellacostabitemyapp: I was confused why macro were not working in a very simple CLJS project, so I tried to simply print out the macro name
01:06ddellacostabitemyapp: and that wasn't working--I was getting "undefined"
01:06ddellacostabitemyapp: of course, that doesn't mean I haven't loaded it--it means that that var doesn't exist at run time
01:07ddellacostabitemyapp: so I was dumping out the "go" macro from core.async, and was further confused why I couldn't see that either...and then I was like, "duh."
01:07ddellacostanow, you've gone and made me explain how foolish I was for posterity. ;-)
01:08arrdemddellacosta: the malevolence engine has made further note of your inadequicies. so has clojurebot.
01:08ddellacostaarrdem: hahaha
01:09ddellacostabut now I'm back to square one, I have no idea what is wrong with my macro, and I'm not really sure how to debug it. *sigh*
01:09bitemyappddellacosta: aha, okay, that makes sense. Thanks.
01:10ddellacostabitemyapp: sure thing...if anyone can benefit from my stupidity then it wasn't a total waste. ;-)
01:10logic_progis there a more idiomatic way of writing: (defn make-space [n] (apply str (repeat n " "))) ?
01:11arrdemlogic_prog: don't, because thanks to structural sharing that's really just (waste-space [n])
01:11arrdemlogic_prog: what's the rest of the problem look like?
01:11logic_progidenting a piece of code
01:12arrdemman... this is just not my night.
01:12logic_prog(format "%s ... %s ... %s ... ") and I need to fill in blanks with things like (n+4) blank spaces
01:12logic_progarrdem: lol :-)
01:12arrdemlogic_prog: I think that make-space is fine.
01:18technomancyambrosebs: "null" and "cond" need to breathe
01:18ambrosebstechnomancy: yes
01:19technomancylooks good though
01:19ambrosebsgood to hear
01:31brainproxythere could be a metaphor in here somewhere with respect to using loop/recur to emulate global state
01:31brainproxyhttp://i.imgur.com/m7rnL02.jpg
01:33arrdem(inc brainproxy)
01:33lazybot⇒ 3
02:00ddellacostatrying to get a Clojure macro working in ClojureScript. Confused about what namespaces are available when calling eval in the macro--shouldn't it work the same as in Clojure, since macros get run in Clojure?
02:09dnolenddellacosta: CLJS namespaces won't be available there, you can do some fancy stuff by hooking into the analyzer/compiler though
02:10ddellacostadnolen: thanks. Yeah, I'm trying to wrap my head around how to convert this to CLJS: https://github.com/davidsantiago/tinsel/blob/master/src/tinsel/core.clj#L249
02:11ddellacostadnolen: I think I'll have to take a look at what you're suggesting re: analyzer/compiler. I haven't done a lot of macro writing in CLJS so I suspected it wouldn't be as straightforward.
02:12ddellacostaso -> but
02:55satshabadreduce
02:55satshabadeverything is reduce
02:55satshabadO_o
02:56TEttingersatshabad, that's why reducers are a big deal
02:57satshabadyes. and I haven't even thought about them yet. Now it's just like "how do I solve thsi problem? Oh, it's a reduce..."
02:57satshabadevery time
02:59TEttingerif you want one result from a collection, yep, that or loop, pretty much
03:00bitemyappsatshabad: yep.
03:00TEttingerreduce is amazingly useful, that's why google bet so heavily on it
03:02bitemyappTEttinger: I wouldn't quite put it that way.
03:02bitemyappTEttinger: the parallelizability of map and reduce were well understood at the time Google built out its early infrastructure. Less "bet" and more "common sense"
03:02TEttingerfair enough
03:03bitemyappthe real work was in making the damn shared filesystem scale.
03:03TEttingerthey more bet that they could parallelize it and get good results, I guess
03:03bitemyappTEttinger: you're still mischaracterizing it.
03:04TEttingerprobably
03:04bitemyappTEttinger: people were talking about hylomorphic lisps that would be more amenable to parallelization long before Google was a twinkle in Larry's eye.
03:05TEttingerI'm not saying google invented map/reduce, just that they decided to use it because it was very powerful
03:05bitemyappTEttinger: even map is besides the point.
03:05bitemyappmap is just a specialization of left fold.
03:05bitemyappfilter too.
03:05bitemyappall you actually need is fold and short-circuiting.
03:05TEttingerI think we got off track
03:06TEttingerreduce is good, and I believe a very substantial portion of clojure.core uses it internally
03:07TEttingererrr
03:07TEttingerno, right namespace
03:08TEttingerI'm rusty with clojure, been writing more creative-writing stuff
03:18Raynesbitemyapp: Praise our lord technomancy, May he continue to grant us good fortune.
03:26satshabadis there a way to stop the reduce somehow?
03:26satshabadlike if I reduce on an infinite list
03:26satshabadand I reach some condition
03:26satshabadhalf way through
03:26RaynesIn 1.5, calling 'reduced' ends a reduce.
03:27satshabadhmmm,
03:27RaynesBefore that, Syast
03:27satshabaddoes that mean 1.5+
03:27RaynesEr, darn iPad.
03:27RaynesYes.
03:27satshabadlike it will be around for a while?
03:27satshabadah cool
03:27RaynesSystem/exit before that. :p
03:28satshabadha!
03:28Raynessatshabad: It is very unlikely to ever go anywhere.
03:28satshabadjust control-c it at the right time
03:28satshabadcatch the exception
03:28RaynesYes!
03:28satshabadparse the vale
03:28satshabad:)
03:35satshabadwhat's the most idiomatic way to get a list of keys out of a map?
03:35satshabad(map coll (keys coll))
03:35satshabad?
03:36TEttinger(doc keys)
03:36clojurebot"([map]); Returns a sequence of the map's keys."
03:36satshabad(doc values)
03:36clojurebotPardon?
03:36TEttinger(doc vals)
03:36clojurebot"([map]); Returns a sequence of the map's values."
03:37satshabadhurry!
03:37satshabadhurray*
03:37satshabadthanks
03:37TEttingerthey won't be in any particular order for regular maps
03:37satshabadyup
03:37satshabadno problem
03:37TEttingersorted-maps will be the right way
03:38TEttinger*will be sorted the way you expect
04:28noidiis clojure.contrib.seq-utils/indexed part of the core now?
04:29noidiI know of map-indexed, but I need the indices in a doseq
04:29iKillCyphervector map and sets are hash array mapped tries?
04:32muhoodoe, or doe not, there is no trie
04:39clgvnoidi: (doseq [[x i] (map vector coll (range))] ...)
04:59noidiclgv, that's what I'm doing, but indexed would've been prettier :)
05:00clgvnoidi: humm that's not easily doable since doseq has the same complex "mini language" as for
05:11teromnoidi, clgv: I guess one could use (map-indexed vector coll) instead of (map vector (range) coll). I've only used the latter, though. See http://stackoverflow.com/a/4196851
05:13clgvterom: yes thats true. I had the general case with multiple collections in mind
05:14teromclgv: ah, good point
05:33noncom|2using core.async what is the best way to send a message from arbitrary parts of the program to a swing label on a swing interface, made with seesaw? currently i use blocking sends allover the program and i use a (go) block created after creating the swing frame, and it sends udates to the label if it receives a message
05:39weavejesternoncom|2: Why not an asynchronous send? Why blocking?
05:40noncom|2weavejester: you mean i better use (go) with an async send?
05:40noncom|2actually i use blocking for no particular reson i think... still researching core.async..
05:40weavejesternoncom|2: Sure. That way your sends are sent in the async pool.
05:41noncom|2cool! i'll try that, thanks!
06:02juxovecHi, in core.typed - I have state.edn file. I load it with (read-string (slurp "state.edn"))
06:03juxovecit returns def-alias type called state-type
06:03juxovecso I have a function for parsing data from file
06:03juxovec(ann string->state [String -> state-type])
06:03juxovec(defn string->state [input] (read-string input))
06:03juxovecbut it fails because (read-string) expects [String -> Any]
06:04juxovecI need to force core.typed to check signature [String -> state-type] as right
07:37smilerHow can I write this in a cleaner and more idiomatic way? https://gist.github.com/smiler/7353931
07:43`cbpI guess you could remove the extra indentation
07:45smiler`cbp: Oops. That's a fuckup from my paste.
07:47jballancsmiler: something like this? https://gist.github.com/jballanc/7354050
07:48smilerAh
07:48jballanc:)
07:48jballancthe threading macros are *super* useful
07:48smilerI tried messing around with -> but I couldn't figure it out. My lisp-fu isn't too good yet.
07:48jballancit takes a bit of getting used to
07:49jballancyou can try playing with macroexpand...might help understanding things (but then again maybe not)
07:50jballanc&(macroexpand '(->> thing (do-something arg-foo)))
07:50lazybot⇒ (do-something arg-foo thing)
07:50jballanc&(macroexpand '(-> thing (do-something arg-foo)))
07:50lazybot⇒ (do-something thing arg-foo)
07:55smilerAwesome
08:01clgvthe docstring is pretty descriptive for -> and ->> as well ;)
08:21cemerickxeqi_: interested in your opinion on this: https://github.com/emezeske/lein-cljsbuild/issues/266
08:22jcrossley3cemerick: needs to be said, your issue descriptions are really top drawer. :)
08:23cemericktcrawley|away: Also wondering if you have thoughts ^^
08:24cemerickjcrossley3: hah, thanks. Largely compensating for my operating at the edge of legitimacy here :-)
08:36mikerodI have a question, with a little bit of a scenario behind it, so I put the question in gist @ https://gist.github.com/mjr4184/7354670 .
08:36mikerodSo if anyone wanted to a stab at it, I'd be grateful :)
08:49mdrogalismikerod: Try that on StackOverflow.
08:52mikerodmdrogalis: I suppose so, didn't know if it was worthy of a StackOverflow post. :)
08:53supersymi'm helping out a friend who renting appartments, he'd like to get his booking.com reservations in Google Calendar. But booking.com are a bunch of ^$&#( and don't have a API of any sort
08:53supersymcross-domain POST to the login form isn't allowed is it?
08:54supersymsigh...yup
08:55supersymCross-Origin Resource Sharing may have to be supported and enabled on the target server
09:02jeafter updating clojurescript i get "Unable to resolve var: reader/*alias-map* in this context" when "lein cljsbuild once"
09:03jethe "net" tells me that I have to use tools.reader 0.7.10, but I already do that... any other ideas?
09:10supersymdid you do a $ lein deps :tree
09:11supersymcheck if its good, might be some conflicting packages... also $ lein ancient (pretty nice to check if anything outdated)
09:25tcrawleycemerick: feedback applied
09:34nDuffHmm.
09:35mdrogalisHm?
09:37nDuffFriend has a microcontroller project where core.async's model seems beautifully appropriate, if any of the Clojure->C compilation pipelines are potentially up-to-task.
09:54xeqi_cemerick: have you considered "RELEASE" vs -SNAPSHOT?
09:56cemerickxeqi: That doesn't work in lein though IIRC?
09:56cemerickIt's the same thing though, practically.
09:56xeqicemerick: I believe `lein new` uses it to find the latest template
09:56xeqipretty much, but with real versions
09:56cemerick? Dunno, I haven't typed "RELEASE" in probably 5 years
09:58xeqias for the overall problem, a [cljs-cljsbuild-compatibility-matrix ..] plugin that is transative from lein-cljsbuild and injects some middleware that walks the dep tree and checks against a black list is the best I can think of
09:59xeqigiven the lack of semver
10:01cemerickxeqi: well, that's basically what's going on now; the question is, how to get an up-to-date blacklist / compat matrix in the first place.
10:03TimMcAre people actually using CLJS in production?
10:03TimMcFor like, services or software people pay for?
10:04TimMcIt's so freaking pre-alpha.
10:06xeqicemerick: is there a set of tests that could be run as part of the lein-cljsbuild, and then if they all work allow compilation. Possibly with a tmp file for caching so it only runs once per project+cljs version?
10:08seangroveTimMc: Note your issues with it somewhere, tweet about it. There's a lot of awareness about shortcomings, and we want to get a lot of it taken care of as we head towards more stable releases
10:08seangroveTimMc: That said, quite a few companies obviously use it in production for software people pay for.
10:10cemerickxeqi: There's not systematic qualification process at all. e.g. I'll be updating the compat table based on personal experience / issue reports.
10:11cemerickTimMc: Yeah, but then again, I was shipping Clojure stuff in late 08, early 09?
10:12xeqicemerick: :(
10:12cemerickxeqi: it's not like there's any qualification process for Clojure, either! :-P
10:23TimMcseangrove: I don't so much have issues with it as... well, it isn't presented as something that's even approaching ready-to-use.
10:24seangroveTimMc: Well, be more specific. I have a growing notepad of things that bother me, are broken, etc. I would really like all of it to shine in the next few months as we approach a more stable release.
10:26seangroveTimMc: We've had a lot of groaning from people new to clojurescript here with the tooling, hence my interest in seeing it brought up a few levels
10:29TimMcI haven't actually tried using it for a project. I'm not talking about specific bugs or features; it's just that the last couple times I checked in, there wasn't discussion of "Hey, let's standardize what this is going to look like."
10:29seangroveTimMc: API-wise? Visually? Docs?
10:29TimMcI'm not grousing, just amazed that people use such early stuff as an important component of production code.
10:30TimMcMailing list, docs, IRC chatter.
10:30seangroveTimMc: Sure, just looking for points to improve on
10:30seangroveThinking about putting together a cljs-tooling sprint here in SF to see if we can regularly improve the state
10:31smilerIs it possible to make lein cljsbuild auto not break on compilation error? I'd rather have it wait for a new file update.
10:31seangrovesmiler: I think the new version (1.0.0-alpha) fixed that
10:32smilerOh I see
10:32seangroveOtherwise roll back to 0.3.3
10:32TimMcseangrove: And I know that Clojure doesn't have a spec either, but that doesn't mean CLJS shouldn't. :-P
10:32seangroveTimMc: For alternative implementations?
10:32TimMcJust... a spec, at all.
10:32seangroveI guess I don't see that helping new or existing users much
10:33seangrovePossibly tooling devs though
10:33cemericksmiler: 1.0.0-alpha1
10:33smilerI'll give it a shot :)
10:34cemerickThere's something close to a spec (or, common understanding?) re: analyzer output. Beyond that, not much.
10:34seangrovesmiler: If you're using austin, be sure to update to to 0.1.2 and cljs 2014 - I had some trouble yesterday and today with browser.repl not compiling before I updated everything
10:35cemerickseangrove: announcing new releases across the board today
10:35seangrovecemerick: What would a spec even look like? Stable API's for analyzer, compiler, maybe reader phases, sure, but not sure beyond that
10:35smilerHow do people keep track of all these version numbers?
10:35seangrovecemerick: I assumed so, just helping in the interim
10:35cemerickseangrove: no idea.
10:35cemerickseangrove: sure, thanks :-)
10:37cemerickThere are some things around the compiler that I'd like to have better compartmentalized (e.g. bottle the js-specific stuff better), which would help a lot with alternative emitters/backends. But, stuff like that is always going to take a backseat to getting shit done.
10:37TimMcseangrove: A spec is an agreement on what is considered API vs. implementation details that shouldn't be relied upon.
10:37TimMcClojure's lack of such a thing means it's hard to build certain tooling around it (e.g. alternative readers need to know what's a valid symbol).
10:37TimMcIt's OK if the spec *changes*, it should just be intentional. :-P
10:38seangroveTimMc: I suppose, just doesn't seem immediately relevant or helpful
10:39smilerDoes lein have something to check a project file and hint about never versions of stuff available?
10:39seangrovecemerick: I'd be happy to work on that, but the vast majority of the compiler right now is about the js-implementation details. What would you like to see pulled out? A more abstract constants emitter, etc.?
10:42joegallosmiler: https://github.com/xsc/lein-ancient
10:42TimMcI use Clojure *despite* these flaws, because it is otherwise very good in its space. CLJS so far has the same flaws, but less compensating draw, since I do less in the browser space these days.
10:43smilerjoegallo: Cool! Thank you.
10:43TimMcHonestly, if someone forked Clojure and gave it better documentation, I'd be all over that.
10:47seangroveTimMc: Could be interesting, but for now I'm more interested in getting the existing tooling and apis better
10:47seangroveI can't do much around specs, but I can help out with code, issues, features, and bugs
10:47TimMc*nod*
10:47seangroveEspecially bugs, I help create a lot of those
10:47TimMcHeh.
10:47mdrogalisHAh
10:48llasramCare and nurture, to raise bugs right
10:50llasramDamballa's all-engineering mailing list is named "bugfarmers". It still makes me smile
11:07seangroveAh, damnit, I've forgotten how to access nested static classes
11:08CookedGryphonClass$Inner
11:08seangroveI thought so, doesn't seem to be working. I need to query the class to see what it looks like
11:08CookedGryphonyou might need to import it separately?
11:09CookedGryphonif you're not fully qualifying it, i.e. (:import com.blah.ClassA) won't give you access to ClassA$Inner
11:09TimMc&java.awt.geom.Point2D$Double
11:09lazybot⇒ java.awt.geom.Point2D$Double
11:09CookedGryphonyou need to (:import com.blah.ClassA$Inner) as well
11:09seangroveCookedGryphon: Ah, that was it, I think I had to import it with the $ syntax
11:10CookedGryphoncool
11:10seangroveThank you
11:10CookedGryphonnp
11:12TimMc,(.importClass 'PD java.awt.geom.Point2D$Double)
11:12clojurebot#<IllegalArgumentException java.lang.IllegalArgumentException: No matching method found: importClass for class clojure.lang.Symbol>
11:12TimMc,(.importClass *ns* 'PD java.awt.geom.Point2D$Double)
11:12clojurebotjava.awt.geom.Point2D$Double
11:12TimMc,(.getX (PD. 5 6))
11:12clojurebot5.0
11:12llasramHeeeey. That's my trick
11:12TimMc:-)
11:14llasramReally should slap a nice interface on that
11:14CookedGryphonas a more general thing it would be nice to have renaming functionality
11:14llasramI'm v glad I haven't had to do too much with Hadoop `mapred` vs `mapreduce`, or the same-base-named classes would probably have driven me insane
11:14TimMcHuh, why is clojure.core/import* implemented as a special form?
11:15llasramTimMc: Probably so you can use it before implementing macros?
11:15llasram*wild guess*
11:16joegallothat importClass trick is neat as heck
11:16llasramOh, but if it takes explicit symbols, no need for macros... Um. Huh. Yeah, no idea
11:17llasramAlso, I am blathering nonsense
11:18CookedGryphonit would be nice if there was a (:require [thing :rename {this that}] and the equivalent import
11:20TimMcCookedGryphon: I was working on something like that a while back: https://github.com/baznex/imports
11:20CookedGryphonIt would also be nice if the keywords in the ns form weren't restricted to clojure.core
11:20llasramCookedGryphon: There is for vars
11:20CookedGryphonllasram: oh?
11:23hoangelosI upgraded an app that uses ring.adapter.jetty. Now all my tests that use :truststores fail. There's really no documentation on using truststores. And no tests that do so either, so I'm really not sure how they are supposed to be used.
11:28llasramCookedGryphon: Tooked me a min to remember the details. Need to add a separate :refer form to ns (or call refer)
11:28llasram&(do (refer 'clojure.string :only '[split] :rename '{split str-split}) str-split)
11:28lazybot⇒ #<string$split clojure.string$split@12dd7de>
11:31CookedGryphonis the :only necessary there?
11:31CookedGryphon&(do (refer 'clojure.string :only '[split] :rename '{split str-split}) str-split)
11:31lazybot⇒ #<string$split clojure.string$split@12dd7de>
11:31llasramCookedGryphon: Yeah. Otherwise it'll `refer` everything
11:31CookedGryphonoops
11:32CookedGryphonsorry, didn't mean to paste that back. Hmm, that's annoying, doesn't fit with the recommended :require :refer way of doing things ,would be nice if it was just :require :refer :rename
11:32llasramYeah
11:32CookedGryphonwhere the renames don't need to be referred
11:32CookedGryphonit bugs me that you can't override things in the ns form
11:32CookedGryphonwhen it's flexible enough to allow that
11:32llasramTechnically you can.... It's just tricky
11:33CookedGryphonyeah, you need to inject stuff into clojure.core, right?
11:33llasramAnd of course would result in incompatibilities for libraries
11:33llasramYep
11:33llasramYou can do it with `user.clj`, and pjstadig figured out the fun/horrifying fun trick of using read-eval in `data_readers.clj`
11:33TimMchaha
11:34TimMcThat's kind of brilliant.
11:34CookedGryphonhm
11:35CookedGryphonbut yeah, so I did a little experiment with a lightweight library set up
11:35CookedGryphonwith the idea of using a remote-require in the ns form
11:36CookedGryphoninstead of having a full on jar dependency it would pull in individual functions/small namespaces from trusted sources and cache them for reuse
11:36CookedGryphonso if you jsut have a little hof or useful snippet, you can re-use it without all the hassle of a library version
11:36CookedGryphonbut it might end up making your ns form look a bit messy and various other problems
11:36llasramBlorgh, CIDER didn't auto-move my nrepl.el customizations to their new names :-/
11:36jtoyI am trying to make a library that has a macro, (defmacro defpage (layout ?)) ; the problem is layout is not defined at the time, my other code that will include this library will define a layout later, how can I make write the macro in my library so that this works?
11:38CookedGryphonjtoy, first rule of macro club... why do you need this to be a macro?
11:40jtoyCookedGryphon: I think I need a macro to do this, this is the exact macro: https://www.refheap.com/20564 even if it is a function, I will have the same exact problem
11:40jtoythe main reason is so i have the params and session always passed to me in my webpages
11:41CookedGryphonyou can do that with clojures in returned functions
11:41CookedGryphonclosures* sorry
11:41S11001001CookedGryphon: :D that thing
11:41S11001001jtoy: pass a function that takes those as arguments
11:41jtoyCookedGryphon: I am already using cloure :)
11:41jtoyclojure
11:41S11001001anaphora are not your friends
11:42jtoyS11001001: I dont understand
11:42S11001001the ~'... bits
11:42S11001001that's why clojure defines if-let instead of aif
11:43S11001001&c
11:43lazybotjava.lang.RuntimeException: Unable to resolve symbol: c in this context
11:43S11001001etc
11:43TimMcCookedGryphon: Caching might lead to unpredictable builds.
11:43CookedGryphonso jtoy, describe in a little more detail what you want to be able to do
11:44CookedGryphonTimMc: I was going to use hashes instead of version numbers, to disallow changing of the code under your feet too
11:44jtoyS11001001: so you are saying just check if the layout function exists?
11:44CookedGryphonTimMc: The idea being that there would be at most a couple of revisions, and you would have read the entire source file - it's only a short snippet, say an extension of a protocol ot a type or a hof
11:45jtoyCookedGryphon: I want a function that calls another function that isnt defined yet in my library. its in my userland code where the other function is defined
11:45CookedGryphonso you make a function that takes a function
11:46jtoyhmm, the whole point of the macro was so i dont need to pass in the layout everytime
11:46jtoypart of it
11:46CookedGryphon(defn thing-that-calls-function [f session] (fn [& params] (apply f session params))
11:46CookedGryphonor something
11:47S11001001jtoy: well, the things that are macro-needing in that macro are the def part — just def yourself, implicit def isn't a good enough reason for a macro — and the ~'... bindings — which aren't your friends, though they sound good now they will punish you — so this is best as a function.
11:48CookedGryphonjtoy: not sure that's the clearest example, I probably tried to cram too much into it
11:48CookedGryphonbut you can pass your layout function in, and return a function out which knows about the session at the time you def it
11:48jtoyS11001001 CookedGryphon could either of you show me how you would transform my crappy macro into something better ?
11:50CookedGryphonI've got to go in a few minutes, but basically if you want a function which will call another function with some session baked in, see the line I posted earlier
11:51jtoyok, thanks, I will explore it
11:51S11001001jtoy: (defn page [f] (fn [{:keys [params session]}] (layout session (f params session)))), to use: (def name (page (fn [params session] body)))
11:52jtoyS11001001: will that work if layout is not defined when defining defn page?
11:53S11001001jtoy: no
11:53S11001001jtoy: or yes, depending on what "defined" means
11:54jtoyS11001001: that was my original problem, i want to have (defn page ) in a library , but the layout is not set yet, my userland code will define a layout and then call (def name (page (fn [params session] body)))
11:55S11001001jtoy: well, the macro won't solve that problem either. It must be defined for ` expansion to work correctly. So macroization isn't the way to go, regardless.
11:55CookedGryphonjtoy: if you mean the user defines the layout function
11:55CookedGryphontehn what you'll do is (def name (page layout)) right?
11:55S11001001jtoy: in that case, layout should be an argument to the `page' function, along with f, as CookedGryphon says
11:56jtoyS11001001: ok, that seems painful to write that over and over....
11:56jtoyi will try it though
11:56S11001001jtoy: less painful than the maintenance headaches of anaphora. Take it from one who's used it extensively in common lisp.
11:57CookedGryphonjtoy: I'm not sure what you think is going to be repetitive
11:57CookedGryphonif you want to define a function with the session baked in to avoid having to call it again, then (def name (page layout session))
11:58CookedGryphon(sorry if this is confusing, it's really hard to try and use your function names when i'm not quite sure what it's meant to be achieving)
11:58justin_smithso I am making progress with my request serialization / replay middlware for ring
11:58justin_smithand I settled on a name: groundhog
11:58justin_smithas in groundhog day
11:59TimMc:-)
11:59justin_smithI actually have replayed recorded requests, just need to clean up the api so it is generally usable
12:00justin_smithie. put in a place for a "sanitizer" that would remove things like plaintext credentials before storing things persistently
12:00jtoyCookedGryphon: that part i feel is repetitive is if i have dozens of webpages and they all need access to params and session, i am using ring which gives you a request map, and each function i was pulling out session and params from request
12:00jtoybut this might work, i wrote that old macro months ago when i was still learning
12:01jtoyand also passing in the layout to the page
12:05teslanickSo, the lein-light-repl package includes a bunch of duplicate classes. I'm pretty sure it's resolvable, and I'd like to raise it as a bug. Any idea where I should do that?
12:08technomancyjustin_smith: sweet
12:08technomancyhttps://tinyurl.com/pftpvvs
12:09justin_smithheh
12:09justin_smithtechnomancy: as long as I can be Murdock
12:10technomancydeal
12:40amalloyS11001001: i have like one anaphoric macro in useful, which is great and i use all the time. but anaphora are definitely something you have to use very sparingly
12:41amalloyin case anyone is really excited about this idea, it just lets you write (lazy-loop [x 1, y 2] (when foo (cons x (lazy-recur y z)))) instead of ((fn step [x y] (when foo (cons x (step y z)))) 1 2)
12:43Raynesamalloy: Hah, it never occurred to me that lazy-loop is anaphoric.
12:45technomancyregular loop is arguably anaphoric too
12:46Raynesamalloy: lazy-loop is so awesome. Should be in core.
12:46RaynesLet's slip it into core when Stuart Halloway isn't looking.
12:47S11001001technomancy: I did a talk about that
12:47technomancyoh, that'd b eme not paying attention
12:47dnolenstuartsierra: fyi, source maps significantly less half baked. might be bug still but should more less work even with web based work flows
12:49stuartsierra1dnolen: Awesome.
12:49stuartsierra1So many new features in ClojureScript lately, making my job of teaching at Clojure/conj next week harder!
12:55hyPiRionso how would you unapahorize (?) loop? Would you do something like (loop my-loop [a b] (if condition (recur my-loop my-arg1 my-arg2) ret-val)) ?
12:55TimMcYep.
12:55hyPiRionor just functionize the whole shebang?
12:55hyPiRionah.
12:55TimMcLike named let in Scheme.
12:55technomancytechnically making recur a var might, but that feels like a nonsense solution
12:56TimMc(let foo [a 1 b 2] ... (foo 3 4))
12:56TimMc(Ish. I think Scheme has more brackets.)
12:57technomancysomeone in #emacs was asking about nested loop with inner-recur and outer-recur a while back
13:05amalloyhyPiRion: the only way would be to remove it and use lambda instead
13:05amalloyoh, i didn't scroll down far enough
13:05jtoywhat is the name of the clojure function used to define an empty function ?
13:06amalloyjtoy: there's no such thing?
13:06tbaldrid_jtoy: empty?
13:06amalloylike, (fn) is an empty function, although why you would define it is unclear
13:06tbaldrid_jtoy: that is to say, what do you mean an empty function
13:07mdrogalisconstantly?
13:07jtoyim describing it incorrectly, i saw there is a function that you call like (thiswillexistlater myfunc) so that code will not die
13:07mdrogalisdeclare
13:08jtoyyes, it is declare, thanks
13:08mdrogalisSure.
13:10xuserHow do you import a clojure source code file into to the lein repl?
13:11mdrogalisxuser: load-file if it's not on your classpath
13:11llasram`require` the namespace associated with the file
13:11llasrammdrogalis, xuser: load-file will work, but let's not spread bad habits!
13:12xuserok, thanks
13:12mdrogalisOh, he said 'lein repl'. My eyes glazed over the 'lein'.
13:12mdrogalisI think it's time to stop programming today :)
13:13jtoyim assuming decdare can be dangerous, anyone know of any good blog posts describing it in detail, i cant find much
13:13jtoydeclare
13:13technomancyjtoy: FWIW declare is a macro that defines a var, not a function that defines a function
13:14technomancyjtoy: it's not dangerous so much as an indication that maybe you could think about removing circular references. it's a judgement call.
13:16jtoytechnomancy: ah, thanks for the clarification, i will try to remove the circulr references , im trying to create a library for all my apps but the library expects a few things that are dependent on each app to define
13:16jtoytechnomancy: I could also just generate all the code, that is what im partially doing already with my lein tempalte
13:17technomancyusually it's clearer withuot circularity but sometimes it is unavoidable
13:19TimMcNever unavoidable. :-P
13:20technomancyhaha technically true
13:20mdrogalisThe Swearjure guy is talking about clarity, get a load of this :P
13:20TimMc but some of the possible solutions might get you murdered by the next maintainer of your code
13:20hyPiRionyeah, you can just use the Y combinator
13:27muhoohyPiRion: for what, funding your startup?
13:27hyPiRionoh, you
13:35faust45hi guys
13:35faust45i just got error which confused me
13:35faust45i run leon repl
13:36faust45and see error <CompilerException java.lang.RuntimeException: java.lang.ClassNotFoundException .proxy
13:36llasramI'm totally changing my name to "Leon Repl"
13:36faust45but i comment out code related to proxy
13:36faust45why i got this error?
13:36faust45can some one help?
13:37technomancyllasram: http://www.linkedin.com/pub/lein-jenkins/43/3aa/3a2
13:37llasramtechnomancy: Nice!
13:37mdrogalisfaust45: Can you run `lein version` for us?
13:37faust45mdrogalis: Leiningen 2.1.2 on Java 1.7.0_45 Java HotSpot(TM) 64-Bit Server VM
13:37llasramfaust45: That error looks like you're putting the symbol `.proxy` somewhere where a class would be expected
13:38mdrogalisfaust45: Upgrade Lein first, just cause :)
13:38llasramThe error when running `lein repl` is probably because you either have `:aot` enabled or `:main` without `^:skip-aot`
13:38faust45mdrogalis: but i comment out this code
13:40faust45and now i remove this code related to proxy
13:40faust45and still got error
13:40faust45leon cached my files ?
13:40mdrogalisLeon doesn't cache files, no.
13:40faust45^lein i mean
13:40mdrogalis:)
13:41faust45so why i see this error ?
13:41faust45i remove code with proxy
13:41mdrogalisfaust45: Is your project on GitHub?
13:41llasramfaust45: First, remove `:main` from your project.clj
13:41llasramThen you can launch a repl and fix your code
13:42faust45llasram: i drop :main
13:42faust45but when i load my name space in repl
13:42faust45i got this error again
13:43llasramYes
13:43llasramBut now you can launch your REPL
13:43llasramAnd actually figure out your problem
13:43faust45how ?
13:43llasramWell, searching the file for `.proxy` might be a good place to start
13:44faust45grep proxy
13:44faust45i got nothing
13:45llasramYou might have stale AOT code, although I don't how you'd AOT something that produces an error like this. You can try `lein clean`, then restart the REPL + relead NS
13:45llasrams,relead,reload,
13:47faust45llasram: after leon clean, still see this error
13:47llasramI'm afraid you're on your own
13:50TimMcfaust45: If the compiler isn't giving you a file and line number, the traditional approach here is to start bisecting your code.
13:54TimMcfaust45: This might also be useful -- it modifies all your source files to add progress debugging statements: https://gist.github.com/timmc/7359898
13:54TimMc(Obviously, you'll want to save off your work before running that.)
13:55TimMcIt's very sloppy, but running lein compile after that should tell you where the compiler ran into trouble.
13:58technomancyor lein check
14:07faust45technomancy: thanks, only when i fixed all issuer from leon check, that error was gone
14:08faust45technomancy: but at my point will be better show root issue in repl, when i try reload namespace
14:09faust45i got this issue only when try using proxy
14:10faust45interesting why?
14:10TimMcSo what was the issue?
14:11faust45TimMc: i put wrong ns in one of my files
14:11faust45i put "users" vs "jsondb.users"
14:18TimMcHmm, doesn't sound like that would cause the error you posted.
14:25lynaghkI'm trying to use criterium to put together a perf benchmark test suite that I can run from the console
14:26lynaghkis anyone aware of a good way to set that kind of thing up? I'm tempted to just try and reuse "lein midje" with twiddled source directories
14:26seangrovebitemyapp: You going to the climate meetup tonight?
14:26hiredmanlynaghk: https://github.com/davidsantiago/perforate
14:27hiredmanI mean, I haven't used it, but it is the first google hit
14:27lynaghkhiredman: ahhh awesome. thanks.
14:41faust45TimMc: actually i am not sure, its looks crazy i try to replicate this
14:42faust45TimMc: and what i see: i have two ns models and db
14:42faust45models require db
14:42TimMcDid you ever find a place you had written "proxy"?
14:42faust45and when i implement proxy in models
14:43faust45i don't need find it, i know this place
14:43faust45i implement proxy in models
14:43faust45then leon check
14:43faust45got error
14:43faust45then comment proxy code
14:43faust45then leon check
14:44faust45and got ClassNotFoundException: jsondb.models.proxy
14:44`cbp^ mac user
14:44faust45and only when i comment (def default (open "db/testdb"))
14:44TimMc~leon
14:44faust45in db ns
14:44clojurebotleon is a good sign it's time to turn off auto-"correct"
14:45`cbpclojurebot is all-knowing
14:45TimMcYou said that grep didn't find it...
14:45faust45TimMc: yes after i drop proxy
14:45faust45grep not find it
14:45faust45i try grep for proxy
14:45faust45in case i forgot some places
14:45faust45but nothing
14:46faust45issue looks strange for me
14:46faust45only when i comment (def default (open "db/testdb"))
14:46faust45in db ns
14:46faust45it works
14:50sritchietechnomancy, I had asked this before, but still a little unclear - is a 95MB slug size reasonable?
14:50sritchiefor an uberjar app
14:51muhoojustin_smith: did you end up pursuing that state-saving debug middleware?
14:51justin_smithmuhoo: working on it right now
14:51justin_smithnamed groundhog
14:52TimMcsritchie: Why, back in my day, the JDK itself was 20 MB and that was a long download, let me tell you! *mutter mutter*
14:52justin_smithI am base64 encoding the body and passing along an identical stream, then turning that encoded body back into a stream for replay
14:52technomancysritchie: no, I'd say that's medium-sized
14:52justin_smithI just added some opts and broke some stuff in the process, but I have succeeded in replaying stored requests
14:52justin_smithand should have something quite usable by end of day
14:53sritchietechnomancy: for a 50MB uberjar
14:53TimMcIf someone tried to fax you, you'd ave to start all over!
14:53sritchiethough I can confirm that
14:55technomancysritchie: sorry, "no" meaning not unreasonable
14:55technomancymisread the question
14:56sritchieokay, nice
14:58justin_smithmuhoo: network hiccup, my last may not have gone through
14:58bitemyappseangone: yes
14:58justin_smith if you want to store to a db you may want to remove plaintext passwords that would be in app specific places, to replay you may want to set a custom URI that responds to, and a retrieval method that is the categorical dual of your storage method
14:59bitemyappsritchie: coming to the meetup tonight?
14:59sritchieIPO party, so I won't be able to make it, unfortunately
14:59bitemyappsritchie: oh right! Congrats, have fun!
15:00sritchienext one, though!
15:05sritchietechnomancy: btw, was there ever a resolution for this?
15:05sritchiehttp://grokbase.com/p/gg/clojure/1358zejkcr/new-relic-installation-on-heroku
15:05sritchieno data getting reported on new relic? I'm suspecting HTTPKit, perhaps
15:06sritchieit's odd, man. it connects, and I see "last data, two minutes ago" etc,
15:06sritchiebut nothing in the overview, no numbers
15:06sritchieactually, memory usage per instance is looking good
15:08technomancysritchie: I wouldn't be surprised if httpkit interfered with new relic's ability to collect data, but I don't have any specifics
15:08sritchiehmm
15:09bitemyapptechnomancy: I could take a look.
15:09bitemyappif it requires manual instrumentation I might be able to slap something together.
15:10justin_smithtechnomancy: muhoo: it's a start, it isn't perfect but it does what it claims to - https://github.com/noisesmith/groundhog https://clojars.org/noisesmith/groundhog
15:10bitemyappoh, they're using some opaque java agent?
15:10sritchiebitemyapp: awesome
15:10sritchielmk if I can change anything
15:11bitemyappsritchie: Here's manual instrumentation: http://corfield.org/blog/post.cfm/instrumenting-clojure-for-new-relic-monitoring
15:11bitemyappI'm a bit leery of New Relic in general, but I understand why they're popular.
15:12sritchieI'm moving over to my own riemann setup
15:12bitemyappsritchie: yeah that's what I prefer.
15:12bitemyapprolling my own, that is.
15:13bitemyappNew Relic charges more for their service than Heroku does for the dynos. Nutty.
15:13sritchieyup
15:13sritchiestill on the free tier :)
15:14nDuff...never played with New Relic, but the Tracelytics stack was a pretty easy one to work with.
15:14bitemyappI haven't tried tracelytics. I'm capable of believing a company can do a good job with this sort of thing, but I really don't like the opacity of NewRelic's instrumentation and data.
15:14nDuff(...also, they built quite a lot of instrumentation for us just for the asking, all of it OSS, and provided assistance when I wanted to build our own).
15:15bitemyappnDuff: wow, that's pretty great :)
15:15technomancyI think the pricing just changed a few days ago around new relic on heroku FWIW
15:16technomancyI haven't used them myself and their recommendations to check jars into source make me wary
15:16bitemyappnDuff: they got bought by AppNeta. huh.
15:16bitemyappoh they have a free tier so I can try it out. Hum.
15:17bitemyappnDuff: what sort of applications have you used TraceView with?
15:17nDuff...to be fair, I don't know how their JVM-centric instrumentation is; this was at a Python shop.
15:18bitemyappnDuff: ah damn.
15:18nDuff...well, this was before it *was* TraceView, but my primary usage was the full stack at Tippr -- instrumented everything from the SSL decoding systems and load balancers all the way back.
15:19nDuff...the template engine we used was based on code generation, and reworking it to build in instrumentation to the templates was pretty darned straightforward.
15:20seangroveI cannot believe hard tedious getting certain google domain-wide delegation service account integration whatevers to work is
15:26bitemyappseangrove: usually whenever I bump up into an interface made by Google, I end up unhappy.
15:26bitemyappThis goes double if it was made by Atlassian.
15:26justin_smithhttp://sprunge.us/hLgK?clojure is this a known bug? maybe it isn't a bug?
15:27justin_smithI would think a base64 encoder should produce output its own decoder can handle
15:27justin_smithor is an empty string explicitly outside the domain?
15:27hoangelosSo, is anyone using ring.adapter.jetty? I upgraded to a new version and can't get the SSL to work. When I use truststore, it gives me an error about converting from String to java.security.KeyStore
15:27ehteshIs there something like leiningen, but for regular java projects? I certainly like using leiningen since it's a commandline tool. Dunno what sort of equivalent for Java code there is.
15:28justin_smithhoangelos: I use jetty, but only in dev, so I don't do ssl via jetty
15:28justin_smithehtesh: it is a frontend for maven (mvn) which is a java tool
15:28bitemyappseangrove: just drink tea.
15:29justin_smithehtesh: well not strictly a frontend, but they both use the same format / archive etc.
15:29seangrovebitemyapp: Got my jasmine tea right here.
15:29TimMcjustin_smith: Looks like a bug. I see no reason an empty string should be out of domain.
15:29bitemyappseangrove: supreme dragonwell brewing atm.
15:29hyPiRionLeiningen works fine for java projects, but you could also use maven if you want to. Or ant.
15:29bitemyappI should bring my tea to the meetup.
15:29seangroveThis is actually the second day. I decided to take a nap half way through yesterday and sleep early last night, thought it would help.
15:29hyPiRionPeople don't really want to though, so they tend to stay away
15:29justin_smithTimMc: of course I can handle it by making a special case for empty input, but yeah
15:29bitemyapphyPiRion: or scala.
15:30hyPiRionbitemyapp: yeah, but they have sbt, which (from my knowledge) is okay
15:30seangrovebitemyapp: Nah, caffeine too late at night is no good
15:30bitemyapphyPiRion: sbt is not okay. You take that back right now.
15:31bitemyappseangrove: theanine helps.
15:31hyPiRionbitemyapp: well, my knowledge is limited, so I guess I learnt something today
15:31seangroveThis link give a security warning for everyone else as well? https://samples.google-api-java-client.googlecode.com/archive/1dd135aa1dfa0b5d326ba2a0c795ed18cd052495.zip
15:31hoangelosanyone else use jetty with ssl?
15:31bitemyapphoangelos: nope, use nginx.
15:31seangrovehoangelos: ah, bitemyapp beat me to it :P
15:31bitemyappand I don't even use jetty, I use httpkit.
15:32TimMcseangrove: Yep, wildcards only apply to a single level.
15:32hoangelosyeah this is embedded in an app, so can't use any of that.
15:32seangroveTimMc: thanks
15:32TimMcseangrove: They need *.google-api-java-client.googlecode.com or samples.google-api-java-client.googlecode.com in that list.
15:32justin_smithTimMc: the doc string for decode mentions that length must be a multiple of 4, and for all inputs other than an empty one it outputs a multiple of 4 from encode
15:32seangroveI actually feel a bit sorry for Google, they have *so much* stuff going on, it must be difficult to maintain a consistent level, and the keep it all up to date
15:33seangroveThat said, I suppose MS did/does it very well with MSDN
15:33TimMc&(/ 0 4)
15:33lazybot⇒ 0
15:34ehteshjustin_smith: so I can just keep playing around with Java code using Leiningen without bothering to drop into Clojure?
15:35hoangelosapparently the library changed how they use truststore. It was a String, and now is supposed to be java.security.KeyStore
15:35hoangeloserror says: java.lang.ClassCastException: java.lang.String cannot be cast to java.security.KeyStore
15:36ehteshalso hyPiRion ^
15:36hyPiRionehtesh: yeah, you can see an example at e.g. https://github.com/hyPiRion/com.hypirion.io
15:38ehteshhyPiRion: very useful project of yours, I'm going to go mirror it
15:38ehteshhyPiRion: mirror the styles, rather
15:39hyPiRionehtesh: oh yeah, be my guest
15:40ehteshhyPiRion: I also have a jar file I've been putting on the classpath, I'm guessing there's an option to use leiningen with that?
15:42hyPiRionehtesh: https://github.com/nickgieschen/lein-extend-cp - althought it's considered bad practice. You should attempt to use the :dependencies key if possible
15:44ehteshI'm going through an algo course that has a stdlib.jar for helper functions. It's not on maven and it's small, so it'd be easier to include in the repo.
15:45hyPiRionyeah, then it's probably just fine
15:50seangroveJust got rickrolled by a google api java sample
15:53yazirian404 NEVER GONNA GIVE
15:58TimMcjustin_smith: I find it a little odd that base64/encode returns a byte array instead of a string.
16:00faust45TimMc: the problem was: i create proxy class and use it as serializer for MapDB. next time when drop proxy and run lein check MapDB read file and try to find this serializer and raise error
16:07ehteshhm... can I list the methods available from a jar file once it's loaded into Clojure? Say this one: http://introcs.cs.princeton.edu/java/stdlib/stdlib.jar . Would be convenient in Clojure.
16:10joegalloa jar file doesn't have methods
16:10ehteshEven though the jar is in the classpath and shows up with (doall (map println (seq (.getURLs (java.lang.ClassLoader/getSystemClassLoader))))) , I can't instantiate classes in it
16:10ehteshjoegallo: er, I guess the classes, then?
16:11nDuffehtesh: can you show us what you're trying to do to instantiate classes, and how it's failing?
16:11hiredmanehtesh: the look like they are in the default package
16:11hiredmanwhich is bad
16:11nDuff...indeed; eww.
16:12hiredmangenerally frowned upon in java, and clojure's interop can have issues with that
16:12llasramehtesh: I don't know why, but I've discovered in the past that you can't import package-less classes with the `ns` `:import` form
16:12llasramBut you *can* import them with the `import` macro
16:12llasram***MYSTERIES***
16:12nDuffhttps://groups.google.com/forum/#!topic/clojure/Eo8Rhdyst1I
16:12nDuff...from Rich: "Clojure doesn't support clrasses not in packages."
16:12nDufferr, except without the typo.
16:12hiredmanllasram: well because that is silly
16:13amalloyllasram: import is a function, not a macro
16:13hiredmanthe only thing "import" does is let you refer to a class by it's name without the package
16:13nDuffehtesh: ...from elsewhere in the thread: "You can't do it in Java either. Any Java class that is not in the default package cannot access any class that is in the default package. The default package is an isolated world unto itself."
16:13amalloyoh, wait, it's not?
16:13amalloyit could be
16:13hiredmanthose classes already don't have a package, so there is no reason to import them
16:14llasramamalloy: Yeah, I was surprised too. There was some chatter earlier, wondering why it's a macro, and why `import*` is a special form
16:15nDuffehtesh: ...though you *can* retrieve them with (Class/forName "BinaryIn") and such.
16:16llasramhiredman: I never investigated further, but I found that `reify` did not work with a package-less interface unless I first `import`ed it into the namespaces
16:16ehteshnDuff, hiredman: Well, I'm including a jar file with some extra classes. Here's the pastebin: https://www.refheap.com/20571
16:16hiredmanllasram: that is not true
16:16hiredmanllasram: I use reify on java.io.Closeable without importing all the time
16:17llasramhiredman: Sure -- but not a packageless interface
16:17nDuffehtesh: Is anything in that pastebin responsive to what I told you above?
16:17llasramAlthough my memory may be faulty
16:17nDuffehtesh: ...it doesn't look relevant to the issue me.
16:17nDuffs/ me/to me/
16:18hiredmanah
16:18ehteshI think Rich saying that clojure doesn't support default packages is useful; is that the problem for me?
16:18nDuffehtesh: yes.
16:18ehteshnDuff: er, in the quote you mentioned
16:18nDuffehtesh: a well-formed jar would have edu/princeton/yourclass/StdIn.class in it
16:18nDuffehtesh: ...not just StdIn.class
16:18nDuffehtesh: ...which is to say, the classes would be in a package.
16:18ehteshwell they do have a packaged version of their stdlib.jar
16:19nDuffehtesh: what exactly do you mean by the word "packaged"?
16:19nDuffehtesh: because when I look inside that jar, there's no package in it, just a bunch of classes in the default package.
16:20nDuffehtesh: ..."package" in this context being Java terminology, roughly corresponding to directory structure inside of a jar.
16:20ehteshLet me take that back, I'm referring to the text around "stdlib-package.jar" in this webpage: http://introcs.cs.princeton.edu/java/stdlib/
16:20hiredmanehtesh: packaged in this case means the clases say they are part of a pacakge, it has nothing to do with the "packaging" of classes in to a jar
16:21ehteshhiredman, nDuff: sure, you guys mean "package edu.princeton.yourclass;" statement at the top of a Java file, yes?
16:21hiredmanyeah
16:21nDuffehtesh: ...so, yeah, the -package version of the jar looks much better
16:21nDuffehtesh: you should be able to use that from Clojure.
16:22nDuffehtesh: you'll want to do something like (import '[edu.princeton.cs.introcs Draw Picture ...])
16:26ehteshnDuff: cool cool cool, thanks!
16:26ehteshnDuff: actually, I'm going to be writing Java code, I'm just using Leiningen since I like it a bit
16:27llasramIt also makes it easy to write your tests in Clojure, even if the main code is all Java
16:27llasramOTOH, it makes it kind of difficult to write the tests in Java...
16:29TimMclein-junit works
16:29llasramOh, cool. Last time I tried to use it, I had the troubles, but that was ~1 year ago
16:30TimMcI'm not doing anything fancy or extensive with it, mind oyu/
16:30TimMc*you
16:37bitemyapphyPiRion: what...is Halloway doing?
16:37justin_smithTimMc: I think that is because base64 is very specific about the bits making up the string, and the jvm is unicode-only for String things
16:38justin_smithTimMc: so the only clean way to ensure the exact bit level content of the base64 is probably a byte array
16:38justin_smithTimMc: in fact, a byte array is probably the only sure way to get exact bit level content of anything
16:38hyPiRionbitemyapp: Disabling broken tests
16:38hyPiRionobviously
16:39bitemyapphyPiRion: but whyyyyy?
16:39hyPiRiondon't ask me
16:39technomancyto get them to pass?
16:40justin_smithunit tests don't pass, better delete them
16:40justin_smithI've done it, though I am not proud
16:40bitemyappwell the conj is coming up. Maybe people can ask him why he's #_'ing tests.
16:40bitemyapp :P
16:41llasramHe says right there "does not work on IBM JDK"
16:41llasramduh
16:41bitemyapp"Multimethod tables are now protected by a read/write lock instead of a synchronized method. This should result in a performance boost for multithreaded code using multimethods."
16:41bitemyappo_O that explains a lot.
16:42bitemyappoh, the RestFn patch isn't in this :(
16:45muhoojustin_smith: thanks for that. i have to say, default-sanitize has to be the most referentially-transparent function evr
16:46justin_smithmuhoo: heh
16:46hyPiRionI wonder when my patch will be merged in
16:46hyPiRionhttp://dev.clojure.org/jira/browse/CLJ-1134 -- soon its one year birthday!
16:47justin_smithmuhoo: pull requests welcome of course - I may add some stuff to store / retrieve requests from the fs or db, but really once it is a map of generic clojure readables anybody can do that stuff
16:47Bronsabitemyapp: it's labeled 1.6 on jira so.. I guess there's still hope
16:47muhoojustin_smith: it looks pretty damn good. lots of hairy java stuff in there i'm glad i didn't have to deal with
16:48hyPiRiontechnomancy: http://www.youtube.com/watch?v=oAiVsbXVP6k ?
16:48muhoojustin_smith: only thing that might be good is some kind of queue/buffer if requests come blasting in too fast, so they all get queued to get saved
16:48TimMcjustin_smith: Sure, but the base64 *output* is all ASCII.
16:48justin_smithmuhoo: that is done already when you conj on an atom, no? or does the swap! block until it succeeds
16:49muhoohyPiRion: the old italian saying is, that the pope asked michaelangelo when the sistine chapel would be ready, and michaelangelo replied "when it's done"
16:49justin_smithTimMc: true
16:50justin_smithmuhoo: yeah, maybe the default method should put the swap in a future, so that the request continues immediately regardless of storage questions
16:50hyPiRionmuhoo: Wish I could tell that to my boss
16:50justin_smithor even the lib could do the store action in a future, so all implementations benefit from that logic
16:50muhoohyPiRion: it's funnier in italian. the punch line is "quand'e' finische" (sp)
16:51llasrammuhoo: As someone who doesn't know any Italian, why does that make it funnier...?
16:52hyPiRionmuhoo: I wonder the same thing as llasram does
16:52devnI can't brain good today. What is the function where, when you operate over the sequence with a predice, it returns the first item where the predicate is true?
16:52devnpredicate*
16:53justin_smithsome
16:53justin_smithoh, that returns the return value
16:53amalloywell, it's (comp first filter)
16:53hyPiRion(first (filter actually
16:53hyPiRionzing
16:53devnyeah, i could swear there was a built-in that did what im talking about, but maybe not
16:54amalloydevn: some comes close, in that it works when (f x) is either x or falsey
16:54justin_smithis a future that never gets derefed guaranteed to be run?
16:54devnamalloy: oh right, that's probably what I'm remembering
16:54amalloyjustin_smith: yes
16:54muhoohyPiRion: llasram: it's the rhythm of it, it has a very dismissive aroma to it.
16:54hyPiRionah
16:55muhootechnomancy: and it's still open? http://bugs.mysql.com/bug.php?id=20786 yikes.
16:55amalloyinsofar as any future is guaranteed to be run, of course. who knows, maybe someone fork-bombed your system already :)
16:55justin_smithcool
16:56muhoodevn: take-while?
16:56muhoo,(doc take-while)
16:56clojurebot"([pred coll]); Returns a lazy sequence of successive items from coll while (pred item) returns true. pred must be free of side-effects."
16:56justin_smithmuhoo: taking your suggestion, the new version of groundhog does the storage in a future so request handling is less likely to be hurt
16:57muhoo,(take-while (partial not= 5) [1 2 3 4 5 6 7]) ; devn
16:57clojurebot(1 2 3 4)
16:58devnmuhoo: no, that would take all of the elements up to the matching element
16:58justin_smithmuhoo: https://clojars.org/noisesmith/groundhog version with that fix is up
16:59muhoooh, i see. hmm, an inverse of it. i dunno, partition-by and second maybe
16:59muhoonm, first filter is prolly easier
16:59amalloymuhoo: i think you are just woefully confused about what he wants
16:59muhoojustin_smith: cool
16:59muhooamalloy: i had it inverted, yes
17:03blrhey, potentially weird one, has anyone moved a ring based app to vagrant and found the response times skyrocket?
17:04blr180-200ms response running locally, 3-4s response in vagrant
17:05TimMchyPiRion: Oh man, that video!
17:05TimMcTHAT VIDEO!
17:06TimMcAnd that bug thread makes me want to punch everything, but particularly one person.
17:09bitemyappBronsa: that RestFn patch would ameliorate some pain in one of the few places I ever wrote performance sensitive Clojure code.
17:09hyPiRionTimMc: you sounded terribly excited over that video
17:09bitemyappbecause of that damn patch, I'm now paranoid about using destructuring in loops.
17:09bitemyappTimMc: MySQL has conferences, it's not out of the question.
17:09bitemyapppunching can happen.
17:10bitemyappI will say that it really just reinforces my, "yawn, just use Postgres" attitude about RDBMS though.
17:10bbloombitemyapp: i dunno if you saw, but Alex Miller expanded my patch to remove even more cruft :-)
17:11TimMchyPiRion: I don't know if excited is the right word. I have a mixture of feelings.
17:11TimMcI appreciate how over the top it is.
17:11bitemyappbbloom: I think I did, actually.
17:11bitemyappbbloom: AM makes me happy :)
17:11bbloomi think that's basically his job now
17:11bitemyapphe's probably the only person to make Klishin happy, if he's capable of being so at all.
17:11bbloomto make you, bitemyapp, and the rest of the clojure community happy
17:12bitemyappbbloom: that was my understanding from my conversation with him.
17:12bitemyappdoes anybody have proof Klishin is capable of happiness?
17:12bitemyappI need to settle a bet.
17:13bitemyapp`cbp`: I'm still pimping out Revise.
17:14technomancyyou're taking a cut of Revise's sex worker earnings in exchange for protection?
17:14technomancyTMI dude
17:14bitemyapptechnomancy: identifying Clojure + MongoDB users and encouraging them to ditch the sucky part of that equation.
17:15bbloomi haven't looked at rethinkdb at all... i guess you like it?
17:15technomancyok, but can you do it without distasteful metaphors?
17:16`cbpbitemyapp: :-)
17:17`cbpbitemyapp: sadly no issues yet. I've not much of a clue what to enhance it with next!
17:19bbloomthis makes me giggle: https://news.ycombinator.com/item?id=6692191
17:20TimMchaha
17:22`cbpbitemyapp: on the look for more projects btw while i wait for the bugs to come down raining/think up of stuff to add :-)
17:27logic_progis there a way to do a "map" of sorts, but keeps an extra "state" var?
17:27logic_progfor example, suppose I wnat to define a funciton mapping list 1 to list 2,
17:27logic_progwhere the second list is an accumulating sum of the first list
17:27logic_prognow, I know there is reductions
17:28logic_progbut I'd prefer to have a generic map which allowed me to do a "stateful map"
17:28technomancythat sounds exactly like reduce
17:28logic_progI am doing a bad job explaining this.
17:29logic_progI have a list of objects {:width ... :height ... :data }
17:29logic_prognow, I want to create a new list of objects, where the :y field of each object is 0
17:29TimMc`cbp: You're looking for projects?
17:29logic_progand the :x field of each object is the sum of all previous :width 's
17:29`cbpTimMc: yeah! I gotta go now unfortunately ttyl
17:29logic_progthus, I need a "stateful" map, where I somehow keep track of the sum of all previous :width's
17:30joegallotechnomancy: you can lead a horse to water, eh?
17:30technomancy(reduce (fn [[m sum] x] [(assoc m :width 0) (+ sum(:width x))]) objects)
17:31amalloytechnomancy: reductions there, not reduce, since he wants the lot of them
17:31amalloyplus you don't have a correct initial value
17:31amalloybut that's the general idea, logic_prog
17:32logic_prog?
17:32technomancyamalloy: I blame lack of paredit
17:32TimMcEasy enough to do with a lazy-seq.
17:32amalloyyeah, actually usually easier that way, TimMc
17:32TimMclazy-loop, perhaps?
17:32TimMcHaven't looked at the docstring, but it sounds close.
17:32amalloywell, of course! but not everyone already has useful in their project.clj
17:32TimMcpshaw, nonsense
17:33seangrovetechnomancy: what kind of backwater 17th-century irc client are you using that doesn't have paredit built-in?
17:33logic_prog( {:width 20, :node "Hello"} {:width 30, :node "World"} {:width 20 :node "Tech}) -> {:w 20, ;x 0, "Hello"}, {:w 30, :x 20, :node "World"}, {:w 20, :x 50, :node "Tech"}
17:34amalloylogic_prog: you've already described what you want. nobody is confused about that. technomancy and TimMc have both given you answers; if they're not sufficient you'll need to explain why rather than restating the problem
17:35technomancyseangrove: cuneiform on clay tablets basically
17:37TimMcIRC over avian carrier
17:41seangrovetechnomancy: Well, it does have its charm, I can't deny that
17:45technomancyseangrove: you gotta ghost your alt nick, man. it's killing the whole tab completion thing.
17:45seangrovetechnomancy: hrmm....
17:46seangroveThere we go, back to erc it is
17:47technomancynice
17:47devnbest way to have an optional not-found in a fn? assuming [x y & not-found] -> (when (seq not-found) (first not-found))
17:48logic_proghttps://gist.github.com/anonymous/7363231 <-- is there a more idiomatic way to write this "stateful map" ?
17:48devnerr, nevermind -- no need for &, just have a separate arity
17:48justin_smithdevn: [x y & [not-found]] (or not-found ...)
17:48logic_progperferably an answer with more detail than "yes, use reductions"
17:48justin_smithdevn: or that :)
17:49devni think im gonna do ([x y] ...) ([x y not-found] ...)
17:49TimMclogic_prog: If ans starts off as [] and you use conj, you can avoid the reverse.
17:50yeoj___i'm trying to reference a classpath on the command line and it's telling my my jar file is not availebl.... i clearly see it is in t he directory it's referencing. What can i check?
17:50yeoj___it's missing jtds.jar for database access.... is there a different one for 64 bit unix as compared to 32 bit windows or something? I just copied it over....
17:51logic_progTimMc: is that still linear time?
17:54justin_smithvecs are not linear time, but they are not slow either
17:55justin_smithprobably faster than building a linked list and reversing it, if you go to any significant size
17:56justin_smith,(time (do (reduce conj [] (range 10000)) ()))
17:57clojurebot"Elapsed time: 15.127097 msecs"\n()
17:57justin_smith(time (do (reverse (reduce conj () (range 10000))) ()))
17:57justin_smith,(time (do (reverse (reduce conj () (range 10000))) ()))
17:57clojurebot"Elapsed time: 5.252221 msecs"\n()
17:57justin_smithoops
17:58TimMcYou'd want to use criterium for that. :-)
17:58justin_smithyeah, just doing a quick dirty
17:59logic_prog,(time (do (reverse (reduce cons () (range 10000))) ()))
17:59clojurebot#<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Long>
17:59justin_smithon my machine, with repeated invocations the reverse on () takes about twice as long as the []
18:00justin_smithlogic_prog: args are in the wrong order for cons sadly
18:00justin_smith,(time (do (reverse (reduce #(cons %2 %) () (range 10000))) ()))
18:00clojurebot"Elapsed time: 5.998524 msecs"\n()
18:01S11001001justin_smith: is that with cons chains, or IPersistentLists?
18:01justin_smithS11001001: the cons and conj versions with () as the base case were giving me about the same results
18:02justin_smithwith [] / conj being just slower than twice as fast
18:02S11001001,(class (conj '() 42))
18:02clojurebotclojure.lang.PersistentList
18:02S11001001ok
18:04justin_smiththe list/cons ones are much more variable in the time they take
18:04justin_smithI am assuming because of the difference in the allocation pattern?
18:04justin_smith(many small allocations, while [] allocates less often, with bigger chunks)
18:05TimMclogic_prog: If you want it to be lazy, you can look at clojure.core/lazy-seq
18:05TimMcJust wrap lazy-seq around the recursive call.
18:14TimMc,((fn f [x] (lazy-seq (cons x (f (inc x))))) 5) ;; logic_prog, for example, this is a simple lazy counter; the current counter value is state
18:14clojurebot(5 6 7 8 9 ...)
18:15TimMchttp://clojuredocs.org/clojure_core/clojure.core/lazy-seq
18:21TEttinger,(iterate inc 5) ;; TimMc, what's the difference between that and this? I'm curious
18:21clojurebot(5 6 7 8 9 ...)
18:24TimMcNot a whole lot. :-P
18:24S11001001TEttinger: the cons x and lazy-seq can swap, and probably are so in iterate
18:25TimMcYep.
18:26amalloyS11001001: note that (cons x (lazy-seq ...)) has caused problems in iterate, because (realized? (cons x y)) throws an exception, and people expect iterate to return a lazy-seq
18:26S11001001amalloy: apt punishment for using realized? :]
18:27amalloywell yes
18:27amalloybut if it's going to be defined, it might as well work
18:27S11001001that's not the core lib philosophy IIUC
18:28S11001001"...unless it impacts performance in some way"
18:28amalloythe core lib's philosophy does not embrace "functions we write should work"?
18:30S11001001I don't even think this is a "library works" problem. realized? needs a lazy-seq. iterate doesn't return one. It's not on either of those if people are mistaken about what iterate returns or realized? expects
18:30amalloywell, realized? needs an IPending, which embraces lazy-seq, promise, future, and so on
18:31amalloyit could very well include Cons, and return true in that case
18:31amalloyeasy enough to make Cons implement IPending
18:31S11001001it could include Integer and return true in that case
18:32S11001001seems like a case of whether or not to silence type errors
18:32amalloynot so. you can't make Integer implement an interface
18:32S11001001you can make realized? widen its expectations though
18:32amalloysure, but that costs performance, which you were saying is the point
18:33amalloymaking Cons implement IPending costs literally zero performance
18:33S11001001no, sorry, that was about something different. I was saying that the core lib will abandon correctness in some cases to gain performance. But then I thought, this isn't even a case where the core lib is incorrect, it's a library user error.
18:35amalloyS11001001: i disagree. iterate's docstring promises to return a lazy sequence, and realized? promises to work for a lazy sequence
18:35bitemyappjust replaced 7 lines of code with one. My clojure foo is improving.
18:35yeoj___can anyone explain to me how this is possible; it's entirely clear its on the classpath: https://www.refheap.com/20577
18:35rasmusto_bitemyapp: but do they do the same things?
18:35amalloyi don't mind saying that it's a bug in iterate, rather than in realized?, but then lots of correct-looking code that happens to return something less-lazy becomes incorrect
18:36mrevilhow do I know if a core.async routine is done?
18:36bitemyapprasmusto_: precisely the same thing.
18:36bitemyappwell, one's a loop/recur, one's a reduce, but you know, same results.
18:37rasmusto_bitemyapp: :), also, I giggled at clojure-foo
18:37S11001001amalloy: how about both; fix iterate doc, extend IPending :)
18:38bitemyapprasmusto_: https://www.refheap.com/20578
18:38bitemyappadmittedly the old code was pretty damn bad, but you get the idea :)
18:39amalloyi wonder whether ambrosebs's annotated version of core.clj would catch (realized? (iterate f x)) as a type error
18:39bitemyappamalloy: it should, if it doesn't.
18:39rasmusto_bitemyapp: I have somethign where I do a (merge-with concat seq-of-maps), what's special about pop-merge?
18:39bitemyapprasmusto_: (set ...)
18:39amalloybitemyapp: do you know where i can find that?
18:40rasmusto_bitemyapp: ok, that's what it looked like :)
18:40rasmusto_bitemyapp: (merge-with (comp set concat) seq-of-maps) ?
18:40bitemyappamalloy: https://github.com/clojure/core.typed/blob/master/src/main/clojure/clojure/core/typed/base_env.clj#L733
18:40amalloyrasmusto_: merge-with into
18:40rasmusto_bitemyapp: er, I guess that wouldn't leave the atoms untouched
18:41amalloy(concat (concat (concat ...))) is disastrous if you build enough of it
18:41bitemyapprasmusto_: #(into #{} %) ?
18:41rasmusto_Ohh, I see it now. Thanks.
18:47hyPiRionbitemyapp: isn't that just set?
18:49bitemyapphyPiRion: more or less.
18:49bitemyappwell, (hash-map ...) isn't equivalent to (into {} ...), right?
18:50bitemyapp,(apply hash-map [:a 1])
18:50clojurebot{:a 1}
18:50bitemyapp,(into {} [[:a 1] [:b 2]])
18:50clojurebot{:a 1, :b 2}
18:50amalloybitemyapp: right, but for set and hash-set it is equivalent
18:53bitemyappamalloy: the problem here is that it's not just a set, pop-merge is keys to set values.
18:53bitemyappso reducing a "dumb set" isn't good enough.
18:54bitemyappthe idea being that you get a set of all known values that existed for a given key across all hash maps.
18:54amalloybitemyapp: i'm not paying any attention to the full problem, i'm just agreeing that #(into #{} %) is identical in every observable way to the function set
18:54bitemyappamalloy: wish you and Raynes were up here in SF for the meetup tonight.
18:54bitemyappamalloy: yeah the problem is a bit different from that.
18:54amalloywhat's the meetup topic?
18:55bitemyapp(merge-with pop-merge {:a 1} {:a 2}) => {:a #{1 2}}
18:55bitemyappamalloy: something something big data doc brown something somethimg arrays.
18:55bitemyappI don't even care about the topic per se, I just show up to talk to people.
18:55amalloysure
18:56rasmusto_,(merge-with set {:a 1} {:a 2})
18:56clojurebot#<ArityException clojure.lang.ArityException: Wrong number of args (2) passed to: core$set>
18:57bitemyapprasmusto_: nice try, I'm not that dumb :)
18:57bitemyapprasmusto_: that can work if you use Fluokitten though!
18:57rasmusto_wtb some boxes
18:57bitemyappfunctors for the fucking win.
18:58lpvbdoes anyone mind reviewing my code and telling me where I can improve?
18:58lpvbhttp://cljbin.com/paste/527c2933e4b02f49e2e851d3
18:59lpvbexcuse my noobiness
18:59technomancyis that the new Adobe Source Pro face?
19:00technomancylpvb: letting rest and first should become a single destructuring let
19:01lpvblet [[y & ys] sequence] ?
19:01hyPiRionlpvb: There's a lot of loop and recurs. Generally you can put them into separate functions, and perhaps even convert them to reduces if composed correctly
19:01rasmustolpvb: yeah
19:01technomancyindeed
19:02bitemyapplpvb: reduce is your friend. learn it, live it, love it.
19:03technomancybitemyapp: doesn't seem to be an accumulator; maybe doseq instead
19:03lpvbso with a reduce, I would still use a vector of a stack and a sequence to reduce over?
19:03technomancyoh, nm
19:03lpvbI tried doseq
19:03lpvbbut idk how to have a stack
19:03technomancyno, reduce is needed for stack
19:04technomancylpvb: I would separate out overall flow from the individual side-effects happening. different functions.
19:05lpvbI also get a nullpointer exception when I change the line under make-example to
19:05lpvb (let [menu-bar (create-menu-bar ["File" ["Open" (fn [] (println "Menu Item clicked."))
19:05lpvbI don't really know where it's coming from
19:06lpvbI have trouble reading the stack trace
19:06joegallopaste us the stacktrace
19:06joegallowe won't have trouble reading it
19:06joegalloand someday you won't either! :D
19:06amalloy(inc joegallo)
19:06lazybot⇒ 2
19:06technomancyjoegallo: brave words my friend
19:06technomancywe'll see if you're so brave when faced with three pages of javax.swing.*
19:07joegallolol
19:07lpvbjoegallo: http://pastebin.com/L6yNejgr
19:07amalloyterrifying indeed, technomancy
19:09lpvband I wouldn't be trying to create a tree of menu stuff with a macro right? I read that if you can do it at runtime then it's better than using a macro
19:13devnI have a coll of maps: [{:a 1 :b 2} {:c 3 :d 4}] -- I have a second coll of maps: [{:a 1 :b 100} {:c 101 :d 102}]. for each map in the first coll, I want to attempt to find a map in the second coll whose value of the same key in first coll matches. When I find a map who has the same key/value pair, I want to merge those two maps with the same value for :a, for instance.
19:14justin_smithdevn: for starters, group-by should help
19:14justin_smiththat is, for finding all the maps in the second group with an :a of 1 etc.
19:15justin_smith(get (group-by :a second-group) 1)
19:15devnthank you. i dont brane good today
19:15rasmustowhoa, using a keyword as a group-by predicate ;o
19:16justin_smithits good for when your map is really a two way relation
19:16justin_smithwhich is devn's case
19:16rasmusto,(group-by :a {:a 1} {:b 2 :a 3})
19:16devnrasmusto: yeah, keywords are callable
19:16clojurebot#<ArityException clojure.lang.ArityException: Wrong number of args (3) passed to: core$group-by>
19:16rasmusto,(group-by :a [{:a 1} {:b 2 :a 3}])
19:16clojurebot{1 [{:a 1}], 3 [{:a 3, :b 2}]}
19:17rasmustodevn: yeah, I use it like that all the time, just not in the context of group-by
19:53devnsimplest way to get from {:a 1 :b 2 :c 3} to [:a 1 :b 2 :c 3]?
19:53brehautdevn: maintaining order?
19:54devn*nod*
19:54brehauthaha
19:54devnc'est impossible!
19:54bitemyappdevn: (vec (mapcat concat ...))
19:55devnbrehaut: why do you laugh?
19:55devnbitemyapp: thanks
19:56brehautdevn: maps dont strictly support ordering right? its just an accidental implementation detail that some maps will seq in the order the keys are defined
19:56brehautotherwise i think ##(mapcat identity {:a 1 :b 2 :c 3})
19:56lazybot⇒ (:a 1 :c 3 :b 2)
19:57metellusor ##(apply concat {:a 1 :b 2 :c 3})
19:57lazybot⇒ (:a 1 :c 3 :b 2)
19:58bitemyappmetellus: ahhh you bastard.
19:58devngolfing FTW
19:58devnso yeah, well, i guess it's time for a sorted map
19:58bitemyappdevn: well...yes.
19:59devnno wonder clojure.data.csv spits things out and slurps them up as [[a b c] ...]
19:59rasmusto,(apply concat (sort {:a 1 :b 2 :c 3}))
19:59clojurebot(:a 1 :b 2 :c ...)
20:00bitemyappoh, yes, one of those problems where I can't repro the test failure in the REPL. Cool.
20:00devni of course turned my rows of a CSV into a map using the headers
20:00rasmustoyou can't REPLoduce it?
20:00Raynesrasmusto: gtfo
20:00bitemyappdevn: csv isn't rows of associative data structures, they're row/column.
20:01rasmustoRaynes: it's that time of night
20:01bitemyapprasmusto: AAAAAAGH
20:01Apage43:{
20:01devnbitemyapp: i'm well aware, but it's pretty common to manipulate the result of reading a CSV as a collection of associative things
20:02devnlike they're records, y'know?
20:03bitemyappdevn: I can buy that, but still.
20:03bitemyappalso, I would just like to make it known that the problem I am coping with would be cleared up in a jiffy if I had a type system helping me out.
20:03devnmaybe i'll use array-map
20:03rasmustodevn: I do a lot of (zipmap (first csv) (apply map list (rest csv)))
20:03bitemyappbecause it's very obviously me propagating the wrong type in some kind of edge case
20:03bitemyappI just can't find *WHERE*
20:03devnbitemyapp: simple-check
20:04bitemyappdevn: nah I have data repro'ing it. I mean I need an actual type system
20:04bitemyappto help me untangle where my fuck-up is.
20:04bitemyappprn only goes so far.
20:06Squee-DHolas
20:06technomancyhttp://p.hagelb.org/slamhound-nrepl-discover.html <- I think I can throw out slamhound.el now?
20:06devnrasmusto: yeah, same here (let [[headers & rows] (csv/read ...)] (map #(-> (zipmap headers %) (walk/keywordize-keys)))
20:06devnerr put rows on the end ^
20:06Squee-DMember counts gone up quite a bit in the last year :D
20:07rasmustodevn: I like keywordize-keys, I'll use that :)
20:08bitemyappno wait, still no repro at another layer of the problem
20:08bitemyappDAFUQ
20:09bitemyappwait a second
20:09bitemyappwait
20:09bitemyappa
20:09bitemyappfucking
20:09bitemyappDATOMIC YOU MOTHERFUCKER
20:09bitemyappmap? is false for Datomic entities.
20:09bitemyappI'm going to go cry bitter tears now.
20:10Apage43ah
20:10Apage43wow
20:10technomancycemerick: am I going to have to wait to the conj before you spill the beans on your nrepl-discover-like thing?
20:10bitemyappdatomic.query.EntityMap Dicks.
20:10bitemyappWhat a fucking dick move.
20:10bitemyappthis is like the third fucking type (map? EntityMap) => false has bitten me.
20:10bitemyappthird time*
20:11bitemyapp(defn mappish? [v] (or (map? v) (= (type v) datomic.query.EntityMap)))
20:11bitemyappfuckers.
20:11rasmustoI do the muscle memory thing sometimes too :), types probably would have helped here
20:12technomancyI feel like I talked three separate people into trying nrepl-discover over the past few weeks... has anyone used it successfully?
20:12bitemyapprasmusto: hum, you responding to me?
20:13rasmustobitemyapp: yeah, on time -> type
20:13bitemyapprasmusto: yeah, it would've.
20:13bitemyappdeeeefinitely.
20:13bitemyappthat was friggin' dumb.
20:14bitemyappjoyously I think the code still broken, just in new and interesting ways.
20:15bitemyapphrm, query sets aren't sequential either.
20:16bitemyappyeah this is awesome.
20:17Apage43maybe throw https://github.com/ztellman/collection-check at it
20:17Apage43not that you can do anything about what it says
20:17Apage43but knowing
20:18bitemyappI'll look into that later, don't really have time to integrate a library.
20:18bitemyappjust kinda generally mad.
20:18bitemyappApage43: you going to be at the meetup?
20:18Apage43what when
20:18bitemyappApage43: tonight, 6 pm, weather corporation.
20:18Apage43oh
20:18Apage43no
20:18bitemyappsorry, Climate corp
20:19bitemyappApage43: :(
20:19Apage43its quite a trek
20:19bitemyappApage43: where are you?
20:20Apage43Sunnyvale/Mountain View
20:20bitemyappoh damn.
20:20bitemyappApage43: get on the meetup group so you get reminders
20:21Apage43i'm on it, maybe my email stuff isn't set up right
20:23bitemyapphrm. you can't assoc entity maps either.
20:23bitemyapp...oooo...kay...
20:23Apage43man
20:24bitemyappI don't know how I avoided all these fuck-ups for this long
20:24bitemyappat all
20:24bitemyappbut types would've saved me this belated confusion.
20:24bitemyapphttps://groups.google.com/forum/#!topic/datomic/IzRSK9e7VJo
20:25bitemyappso I'm not the only one.
20:25technomancytypes...or just not inventing a new thing and using a map to begin with
20:26Apage43there
20:26Apage43meetup is now pointed at the email address I actually read
20:27sritchiehave you guys seen cljs errors like this? Uncaught InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable.
20:27sritchieI'm worried that I may not be hooking in to the proper event to load stuff.
20:27bitemyappcoercion for the win. My code works now.
20:27bitemyappbastids.
20:27sritchieI see this intermittently, and sometimes, on a websocket, that the websocket was CLOSING or CLOSED… but if I manually call my init function at the console, I'm good to go
20:28bitemyappsritchie: maybe need to wrap socket access with (ensure-socket s) type dilly to resuscitate when it goes down?
20:29sritchiebitemyapp: write that func, you mean
20:29sritchie?
20:30bitemyappsritchie: yeah, but my approach is usually to hit things with a hammer until they work so that might not be what you want.
20:30bitemyappsritchie: if you want to *investigate* why, do what you can to break the socket to see if it reproduces the errors.
20:31sritchieugh, when I put the socket in an atom, I get an InvalidStateError - attempt was mode to use an object that is not, or is no longer, usable
20:32bitemyappsritchie: wrapping it in an atom in cljs causes this? what happens if it's bare?
20:33sritchielet me show you my pattern I'm using
20:34sritchiehttps://gist.github.com/sritchie/7364870
20:34sritchiebitemyapp: that's my pattern for initialization
20:34sritchiewithout the atom
20:34sritchiewhoops, forget about that extra @
20:35sritchieso if I do that, I get Uncaught InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable.
20:35sritchiebut then,
20:35sritchieif from the console I call init manually,
20:36sritchieugh, now I'm confused
20:36bitemyappsritchie: I don't like the bare-def at all.
20:36bitemyappsritchie: I think you should wrap access to it with functions that handle init-if-nil.
20:37bitemyapp(atom nil) for init state in the def.
20:37bitemyappAwww yisssss http://www.rethinkdb.com/docs/install-drivers/
20:37sritchieokay
20:37sritchieevery damned example has bare defs
20:37bitemyappsritchie: I know. I think they're a bad idea. Might be superstition on my part but I've had AOT and other things break because of bare defs.
20:37bitemyappso I use a safer/more fn oriented pattern.
20:37sritchiewell, this is in cljs
20:38bitemyappthat would make me more, not less, paranoid.
20:38blrdoes weavejester/james reeves visit #clojure? hoping he'll have an explanation for this lein ring weirdness :)
20:39bitemyappblr: not recently but it happens. You're best off just asking in here and maybe following up with a github issue if you can't resolve it.
20:39xeqi$seen weavejester
20:39lazybotweavejester was last seen talking on #clojure 14 hours and 58 minutes ago.
20:39blrah thanks xeqi
20:40blroh xeqi, kerodon is great thank you, just started a project with it and trying my best to do outside in TDD :)
20:41blrbitemyapp: it's a bit vague for a github issue unfortunately, just some inexplicable latency when running lein ring server-headless in a VM that I _dont_ get starting ring in a repl on the same box
20:42xeqiblr: I'm glad its useful
20:44sritchieah!
20:44sritchiebitemyapp:
20:44sritchiejava.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@4e77f4e7 rejected from java.util.concurrent.ThreadPoolExecutor@256f91f0[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 279]
20:44sritchiein the logs
20:44sritchiefor httpkit
20:44sritchiewhich is VERY troubling, actually, since I only have a single browser connected :)
20:45sritchieoh. I bet i need to destroy this thing on unload.
21:07dobry-dendon't worry about kernel_task eating 2gb memory, they said.
21:07dobry-denosx will free it up if it needs it, they said.
21:07arrdemsilly memory manager...
21:10dobry-dennot to mention i have 3 `main` apps running somehow http://i.imgur.com/csMgzKs.png
21:10dobry-denbut ending one to free up memory is a game of minesweeper
21:21sritchiebitemyapp: found part of my issue...
21:21sritchiethese http-kit channels are reporting open,
21:21sritchiebut printing like this
21:21sritchie#<AsyncChannel 0.0.0.0/0.0.0.0:8080<->null>
21:26amalloydobry-den: jps -v
21:36bitemyappsritchie: ouch.
21:36sritchiehttps://github.com/http-kit/http-kit/issues/91
21:36sritchiefiled a bug
21:36sritchietough times :)
21:37bitemyappcomplaining about my own bad code at meetups is fun :)
21:37sritchiebut yeah, messing with the proper callbacks fixed my websocket
21:37sritchieclj meetup going on now?
21:37bitemyappsritchie: yep, speaker just started talking about Doc Brown (array store)
21:37sritchienice
21:41cemericktechnomancy: ech, forgot about it entirely
21:42allenj12hey if i want to let something but i want it to be bound based on a condition how would i do that? for example something like "(let (if (= v 3) [in 2] [in 6]))"
21:43seancorfield(let [in (if (= v 3) 2 4)] ...)
21:43allenj12seancorfield; oh thnx!
21:44technomancycemerick: thinking of pushing an 0.0.1 of nrepl-discover
21:51`cbpTimMc: hi
21:51cemericktechnomancy: I don't have any objections, I don't have any working alternative a.t.m.
21:51cemericktechnomancy: FWIW, this is what Sam and I sketched out: https://gist.github.com/cemerick/7365536
21:51bitemyapp`cbp: http://www.rethinkdb.com/docs/install-drivers/
21:52`cbpbitemyapp: success
21:52cemerickbasically eliminating the "discovery" part, making it all a bit more explicit and driven by connecting clients vs. classpath
21:52technomancycemerick: looks more imperative
21:53cemericktechnomancy: which part?
21:53technomancycemerick: the exclamation points I guess
21:53cemerickah
21:53cemerickwell, "more flexible" ;-P
21:54ssutchdoes anyone know of any oauth 2 provider support for friend?
21:54cemericktechnomancy: I didn't want the ops or the lifecycle to be tied to the classpath / load-time
21:54ssutch(eg an oauth 2 server, for providing REST api authentication)
21:55`cbpbitemyapp: how fares the error handling?
21:55cemericker, discovery-time
21:55technomancycemerick: yeah, I punted and require all op-containing nses to be loaded too
21:55technomancyand then just do (all-ns)
21:56technomancyI'll give this a closer look though, thanks
21:56cemericktechnomancy: Also, Sam apparently has a use case where he wants to have an op totally change its effect on demand (not surprising given his performance stuff?), so this seemed more natural than swapping in different impls of underlying fns, etc
21:57cemerickThe namespace-discovery stuff should be able to sit on top, if you're interested in that.
21:57technomancycemerick: the big thing is agreeing on a client/server vocabulary though
21:58cemerickThat made me comfortable enough to decide to put it into nREPL straight away...though, of course, it hasn't actually happened :-P
21:58cemericktechnomancy: yup, for sure. This stuff is comparatively minor
21:58technomancyI don't think the actual handler stuff is all that interesting compared to that
21:58technomancyno offense =)
21:58cemerickhah, none taken!
21:58cemerickThe aim is to make nREPL itself the most boring thing possible
21:59ssutchah, im actually watching cemerick's clojurewest talk, and at the end, my question was pretty much answered
21:59cemerickI'm quite happy that it's generally been static for so long at this point and hasn't inspired angry fixing, etc.
22:00cemerickssutch: sorry, didn't notice the question :-) Yeah, friend-oauth2, it's demoed on http://friend-demo.herokuapp.com
22:01ssutchcemerick that implements an oauth 2 provider? (eg create client, access tokens, refresh tokens, all that crap)
22:01cemerickssutch: it's client side, as is all of friend
22:03ssutchright, so i can log in with github, which acquires my identity from github
22:03ssutchjust found https://github.com/pelle/clauth
22:04bitemyapp`cbp: no time for that yet.
22:05`cbp:-)
22:05bitemyapp`cbp: work craziness, trying to open source Datomic migration toolkit.
22:20bitemyapp`cbp: soon *cringe*
22:21`cbp:-o
22:22bitemyapp`cbp: I know I need to do it.
22:22bitemyapp`cbp: part of it is caution, I'd like to write tests reproducing various error cases first.
22:22bitemyappbut I just need to write the damn code.
22:22`cbpwhat kind of errors are you thinking about
22:35ToxicFrogHmm.
22:35ToxicFrogHow do I distinguish between {:foo nil} and {}?
22:35amalloy&(doc contains?)
22:35lazybot⇒ "([coll key]); Returns true if key is present in the given collection, otherwise returns false. Note that for numerically indexed collections like vectors and Java arrays, this tests if the numeric key is within the range of indexes. 'contains?' operates constant or ... https://www.refheap.com/20581
22:35amalloy&(doc get)
22:35lazybot⇒ "([map key] [map key not-found]); Returns the value mapped to key, not-found or nil if key not present."
22:36ToxicFrogAwesome, thanks
23:00muhoonow that's the weirdest lein exception i've seen in a while: https://www.refheap.com/20582 fixed it by "lein clean" but wtf?
23:07muhooalso, golf, this seems unnecessarily complicated https://www.refheap.com/20583
23:08logic_progI'm writing a web app. Client side = clojurescript. Client side = apache + clojure/http-kit. I want to test for robustness, so I want some intermediate layer that fucks up ajax-requests + web-sockets. Suggestions?
23:26devnamalloy: Your memory palace is impressive.
23:28amalloydevn: a good memory, fast reading, and nimble fingers: a perfect storm for winning IRC karma
23:28amalloy(what'd i do, though?)
23:29devnYou're always around when I need a push in the right direction. I've been mucking with clojure since 2009 and I still find myself coming in here when I'm having writer's block, and you're always there to help.
23:29devnI wish Clojure has a "Clojure Hero Aware" thing like the Ruby community to give people in the community credit for helping people.
23:30devnAward*
23:30amalloyhaha aww
23:30devnIt's a noble thing to do, and I don't expect most people do it for recognition, but some people deserve it, and you're one of them.
23:30devn<3
23:31amalloythanks a lot, devn. it's nice to be appreciated
23:31devnI was thinking about it w/r/t technomancy and cemerick the other night, too. Phil's emacs-starter-kit, leiningen, and the list goes on.
23:32devnThere are a lot of people who just deserve a round of applause, y'know?
23:32muhooindeed
23:32muhoo(inc amalloy)
23:32lazybot⇒ 75
23:33muhoodevn: we could always set up bitcoin addresses for 'em, and maybe integrate that into lazybot
23:34amalloyyeah, i heard Raynes discovered recently he's been getting money from git-tip for a while now
23:34muhoohuh, never heard of git-tip
23:35amalloyincidentally, since i've got all this community goodwill at the moment, does anyone know of some interesting jobs available? clojure would be a plus, of course, but i'm sure i can learn anything
23:35muhoo:-)
23:36muhooalways looking for alternatives to capitalism.
23:57arohneramalloy: are you interested in CircleCI?
23:58amalloydon't know much about them, arohner, but i'll take a look. are you involved?
23:59arohneryes. founder/cto :-)
23:59arohnerallen@circleci.com, jobs@circleci.com