#clojure log - Feb 28 2014

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

11:11 broquaint: Thanks, edbond :)

11:12 ww

11:14 roybatty: anybody that uses Cursive(intellij) know how to set up a keyboard shortcut to switch from current editor window to the repl and back again. kind of like you ctrl-tab between two files

12:01 michaniskin: do leiningen templates support any form of composition?

12:02 like `lein new [template1 template2 template3] my-composed-project

12:02 johnjelinek: hihi all

12:02 hyPiRion: michaniskin: how would they compose together? What do you do if both templates creates some specific file?

12:03 gfredericks: lein new rails spring django arduino billing-app

12:03 michaniskin: hyPiRion: yeah this is why i'm asking :)

12:04 hyPiRion: i'm looking for prior art for a project i'm working on

12:04 johnjelinek: got a question, I have a future that makes an HTTP request with clj-http, and it returns a 401: "java.util.concurrent.ExecutionException: clojure.lang.ExceptionInfo: clj-http: status 401" -- I want to catch this

12:04 gfredericks: johnjelinek: clj-http has an option for not throwing

12:04 hyPiRion: michaniskin: Ah. Well, lein templates doesn't compose, if that answered your question :p

12:04 technomancy: michaniskin: it's a neat idea, but the fact that templates take arbitrary args makes it a bit trickier

12:04 johnjelinek: gfredericks: can I catch though?

12:04 I want (fn [req-fut] (instance? java.util.concurrent.ExecutionException (try @req-fut (catch Exception e (.getCause e)))))

12:04 I thought this would return true

12:04 but it's false

12:04 technomancy: michaniskin: worth pursuing though I think

12:05 dakrone: johnjelinek: you need to put the try/catch inside of your future if you want to do that

12:05 michaniskin: technomancy: i am thinking about it for what would be equivalent to maybe a combination of profiles and plugins, like you'd use the templates to set up your build process by composing different plugins and such

12:05 clojurebot: excusez-moi

12:06 johnjelinek: dakrone: I think I misspoke, I want it to return true

12:06 not false

12:06 if I change to (instance? Exception ... it returns true

12:07 michaniskin: technomancy: like if you're setting up a new clojurescript project, but you want to have a ring server and maybe garden css compiler, too

12:07 johnjelinek: but I want it to return true when the exception is java.util.concurrent.ExecutionException

12:07 dakrone: johnjelinek: also, just one .getCause may not be the exception you want, you probably want (root-cause e)

12:07 johnjelinek: or, whatever it is when it returns 401

12:07 slagyr: ClojureScript question: It is possible to disable this warning? "WARNING: clojure.core/==, all arguments must be numbers"

12:07 hyPiRion: michaniskin: wouldn't that mean they need to merge the project.clj?

12:07 dakrone: johnjelinek: it's far easier to use {:ignore-exceptions true} in clj-http itself and handle the 401

12:08 johnjelinek: dakrone: ok, let me try that

12:08 michaniskin: hyPiRion: well i'm not using lein specifically, i'm using boot, so things compose differently there

12:08 hyPiRion: but yes, they'd end up merging a file in pretty much the same way

12:09 hyPiRion: michaniskin: right, gotcha.

12:09 Hrm, I guess it would be interesting to look into at least.

12:09 johnjelinek: dakrone: do I apply {:ignore-exceptions true} on the client/get?

12:10 dakrone: johnjelinek: yes

12:10 johnjelinek: dakrone: because it's not ignoring

12:10 michaniskin: hyPiRion: i wonder if there are other build tools i should look at that might have such a thing?

12:10 dakrone: johnjelinek: what version of clj-http? (also, it might be :ignore-exceptions? instead of :ignore-exceptions)

12:10 in 0.9.0 I unified the booleans so I don't have to remember whether it ends in ? or not

12:10 technomancy: michaniskin: this could go hand-in-hand with the proposed programmatic modifications of project.clj

12:11 johnjelinek: dakrone: both didn't work

12:11 dakrone: I'm using 0.7.9

12:11 hyPiRion: michaniskin: hm, I'm pretty sure there's nothing for Clojure, but I wouldn't be surprised if there were some JS build tool which did that somehow

12:11 dakrone: johnjelinek: "didn't work"? didn't throw an exception? didn't give you the right response? can you gist your code somewhere?

12:12 technomancy: michaniskin: you could say "to make a template composable, return a function that modifies a project.clj instead of simply writing the bytes to disk" or something

12:13 michaniskin: technomancy: are there plans to make project.clj into a program instead of a declarative data file?

12:13 hyPiRion: Or, you know, it could be something different, but closely related to templates.

12:13 michaniskin: it is already a program

12:13 :p

12:14 michaniskin: :) you know what i mean

12:14 technomancy: actually I don't think I do?

12:15 hyPiRion: I don't think I do either

12:15 michaniskin: no worries, i think the answer is "no" :)

12:15 Anderkent: michaniskin: if you put (println "BOO!") on top of you rproject.clj, it'll print boo

12:16 it can't get more programmy than that

12:17 ToBeReplaced: assuming answer is no but quick question -- can i (go-loop [] (alt! ch (recur)))?

12:17 technomancy: Anderkent: well it could if we calculated some fibbonacci

12:17 that is empirically the programmiest you can get

12:17 Anderkent: I thought that was fizzbuzz?\

12:18 rasmusto: ~fizzbuzz

12:18 clojurebot: No entiendo

12:18 michaniskin: hahaha

12:18 johnjelinek: dakrone: didn't work means still threw an exception, but didn't return true

12:18 I'll pastebin something up for you

12:18 hyPiRion: michaniskin: I mean, https://github.com/hyPiRion/hello-swearjure/blob/master/project.clj is a legal project.clj file.

12:19 technomancy: man, not even an nsfw warning or anything?

12:19 hyPiRion: sorry

12:19 technomancy: hehe

12:20 hyPiRion: that is nsfpcp (Not safe for professional clojure programmers)

12:20 technomancy: not safe for people who take themselves too seriously

12:20 rasmusto: i am a software professional

12:21 Anderkent: I'm dissapointed by the meta ns-map

12:21 clgv: hyPiRion: swearjure seems great for obfuscation ;) :P

12:21 hyPiRion: Anderkent: I accept pull requests

12:21 technomancy: did you know the word "amateur" comes from the same root as "amour"? in essence, doing it out of love rather than simply in order to feed yourself.

12:21 ambrosebs: hyPiRion: holy crap! :)

12:22 technomancy: so when taken literally, not all that mutually exclusive with professional

12:22 hyPiRion: Anderkent: the core.clj uses only `ns-map` though. Is that okay for you?

12:22 Anderkent: hyPiRion: 4 times better

12:23 hyPiRion: ambrosebs: Now you made me think about using dynalint on that monster. Hrmm...

12:24 johnjelinek: dakrone: http://pastebin.com/9TvuvEvp

12:24 what I expect is (true true true ...)

12:25 ambrosebs: hyPiRion: I have zero idea how swearjure works. Does it rely on implementation details of Clojure?

12:26 Anderkent: hyPiRion: you generate that code, right? right?

12:29 hyPiRion: ambrosebs: Heh... yeah, heavily. It crashes if the hash map order in (ns-map 'clojure.core) is changed.

12:31 Anderkent: Well, sort of. I could probably generate it now if I wrote a generator for it, but most of it was just a lot of copypaste

12:31 ambrosebs: hyPiRion: LOL

12:31 hyPiRion: that's amazing

12:31 dakrone: johnjelinek: https://gist.github.com/dakrone/01c46b660465356bf0d2

12:31 hyPiRion: I tried to create a generator for it in the beginning, but the amount of argument calls made the JVM crash, so I had to do some compression by hand

12:32 dakrone: johnjelinek: my fault, it's actually :throw-exceptions, not :ignore-exceptions

12:33 hyPiRion: ambrosebs: It's a bit sad actually, because it's not that easy to upgrade from 1.5.1 to 1.6 :p

12:34 johnjelinek: dakrone: success!

12:34 thanks

12:34 ambrosebs: hyPiRion: I'll bet

12:35 dakrone: johnjelinek: you're welcome!

12:36 johnjelinek: dakrone: now, if I wanted to check it for the 401 to know the reason why it wasn't successful, I should do what?

12:36 I guess just read the @req-fut and parse?

12:37 dakrone: johnjelinek: instead of client/success? you can just do (:status @ret-fut) and see the HTTP status yourself

12:44 johnjelinek: dakrone: awesome, thanks

12:44 ToBeReplaced: using the alt! macro for the first time, and i'm confused; (go (alt! x ([v] v)) is returning a RuntimeException Unable to resolve symbol: v

12:45 to me, that appears to be the example in the docs

12:45 i wanted to say "read from the channel and return the val"... how do i express that correctly?

12:46 seangrove: dnolen_: Just about finished up with the ReactDevTools fix

12:46 dnolen_: seangrove: SWEET

12:47 seangrove: dnolen_: Are you thinking that the name of the component should be passed in along with {:opts ...} etc.?

12:47 dnolen_: seangrove: no will be a protocol IDisplayName

12:47 seangrove: dnolen_: Got it, sounds good

12:48 dnolen_: seangrove: I can add it now, of course won't do anything unless you use a React build from master.

12:48 seangrove: dnolen_: Oh, I was adding it to a local check of Om right now, the ReactDevTools side is already finished

12:48 I have it coming out hard-coded, was just adding the protocol. Happy to let you do it if you'd like though ;)

12:49 dnolen_: seangrove: I can do it, it's a simple change

12:49 ToBeReplaced: andddd my issue was alt! not imported, so the go macro failing ;)

12:49 seangrove: dnolen_: Ok, sounds good. I'll check with the React people about the code changes. Let me know when yours is pushed so I can test it out locally

12:50 Doesn't need to be published, I'll just clone master

12:52 dnolen_: seangrove: https://github.com/swannodette/om/commit/f50fb2b35cd4326478ea8937eae8c0d1b3cd9bf0

12:53 seangrove: dnolen_: Ok, testing it out...

12:54 dnolen_: seangrove: oops typo fixing

12:54 seangrove: fixed

13:00 seangrove: dnolen_: Look about right? http://dl.dropbox.com/u/412963/Screenshots/cx.png

13:02 dnolen_: seangrove: looks good to me, would be nice if you could suppress Om private props

13:02 seangrove: but already looks useful

13:03 seangrove: dnolen_: I'll as about how to do that

13:03 dnolen_: seangrove: might be out of scope since technically that's the idea behind props

13:04 seangrove: dnolen_: But they show up on the right-hand side I think

13:04 dnolen_: seangrove: and we use props differently, but worth bringing up

13:04 seangrove: which I cut out... One second

13:04 mr-foobar: i'm using enlive. (enlive-html/append "<div>some content</div>") is escaping and giving me &lt;div ... any option that I can stop the escaping ?

13:05 dnolen_: seangrove: heh, actually probably the simplest thing would be don't show props with leading __

13:05 seangrove: React can't display ClojureScript data structures anyway

13:05 seangrove: dnolen_: Something weird is up with my local RDT, but it's find to have them show up in the list http://dl.dropbox.com/u/412963/Screenshots/cy.png

13:06 dnolen_: seangrove: anyways, this is useful - but I think doing our own instrumentation in the end will be more powerful

13:06 seangrove: React Dev Tools are never going to be able to display CLJS data properly

13:06 seangrove: well not never, but just seems out of scope

13:07 seangrove: dnolen_: I agree, I think this will go away eventually, btu for the time being it's fast and very nice. Especially for trying to track down these damn 'unique keys' warning Sablono seems wont to put out

13:12 isaacbw: shouldn't clojure-mode have special indentation for macros?

13:12 technomancy: isaacbw: which macros?

13:13 isaacbw: technomancy: any macro. I know that common lisp's SLIME treats macros differently with indentation

13:13 technomancy: isaacbw: it's technically possible, but it's not a good idea

13:14 indentation rules that change depending on whether you're connected or not are kinda nuts

13:14 isaacbw: technomancy: I see, okay

13:15 technomancy: if your macros need special indentation, call them with-foo

13:15 rasmusto: well, indentation is different for def*, right? I guess that doesn't require connection :)

13:15 technomancy: rasmusto: right

13:16 having clojure-mode depend on cider would be a circular dependency anyway

13:16 Bronsa: technomancy: is it just me or with-bindings is indented wrongly by clojure-mode?

13:17 technomancy: Bronsa: not afaict

13:17 seangrove: technomancy: A lot of the setups for emacs recommend custom indentation for compojure routes as well

13:17 Anderkent: it's pretty easy to give things the 'defun indent mode - I used to do it for midjes facts.

13:18 just check in the relevant configs :P

13:18 technomancy: seangrove: yeah, some kind of portable declaration for that would be neat

13:18 as long as it can be determined statically

13:18 getting it from nrepl is just wrong though

13:18 Bronsa: technomancy: .. weird, now it gets indented correctly for me too. Pretty sure it was indenting like a function before though

13:19 technomancy: you'd have different indentation depending not on whether you were connected, but on which namespaces have been compiled so far

13:20 seangrove: technomancy: I agree with the static requirement

13:20 Bronsa: looks like with-bindings indentation starts to get messed up after I connect with slime :/

13:21 isaacbw: does anyone know why (put-clojure-indent 'GET 1) isn't working for (GET within (defroutes? Is it because it's within (defroutes?

13:21 )))

13:22 oh, wait

13:23 ah, I needed to do (put-clojure indent 'GET 2) based on how I was formatting it

13:23 is there more fine-tuned indentation control, for example only do this for GET within a defroutes?

13:25 amalloy: isaacbw: that sounds kinda like backtracking indent, such as for deftype and reify, but i don't think you really want to do it anyway

13:27 Bronsa: even in the source buffer? the slime repl doesn't follow the clojure indent rules, but it shouldn't be able to break the indentation of your source files

13:28 Bronsa: amalloy: yeah, not in the repl

13:28 amalloy: wild

13:29 you can always try M-x customize-variable clojure-defun-indent

13:29 Bronsa: amalloy: I'm not 100% sure it's slime's fault though, it worked fine after connecting for ~30 seconds

13:39 isaacbw: oh hey, the compojure docs list the commands for proper indentation. That could have been easier than trying to figure it out myself :P

13:40 seangrove: technomancy: LT will solve all of our problems. Clojure and proper data structures all the way down.

13:40 TravisD: Any top-level var with metadeta ^{:private true} will not be exported?

13:41 * seangrove is afraid he'll single-handedly turn LT into HURD

13:41 amalloy: wellll, "exported" is a weird word, TravisD. nothing is ever exported, since vars stay in their namespace

13:41 `cbp: I don't know if it's just because of webkit's bad handling of international keyboards but LT is nearly unusable for me =(

13:41 TravisD: Hmm, I guess it wont be available from other namespaces?

13:41 amalloy: but when you require a namespace with a private var, no mapping is created from the symbol naming it to the var itself

13:42 you can always access the var anyway, if you want, using the var syntax

13:42 TravisD: Ah, what's the var syntax?

13:42 technomancy: seangrove: heeh

13:42 amalloy: &[(var clojure.core/inc) #'inc]

13:43 technomancy: `cbp: shouldn't that be an OS concern?

13:43 amalloy: god, lazybot has been so unreliable recently

13:43 ,[(var clojure.core/inc) #'inc]

13:43 clojurebot: [#'clojure.core/inc #'clojure.core/inc]

13:44 hiredman: ~clojurebot

13:44 clojurebot: clojurebot is highly unlikely

13:44 rasmusto: ~lazybot

13:44 clojurebot: lazybot is echo ~lazybot

13:45 `cbp: technomancy: I think LT uses keyCodes given to it by webkit and on international keyboards that get's all f'ed up (the keyCode for [, ], {, } are the same etc). So I guess it's partly LTs fault for trusting those keyCodes and having no engineers working on it with international keyboards.

13:45 TravisD: amalloy: cool, I'll need to look at that some more. Anyways, you can use defn- to define a private function. Is there a more general way to define private vars without explicitly adding the metadata yourself?

13:45 `cbp: Also it has some pretty annoying common bugs like it suddenly starts registering my keypresses on a tab that isn't the one i'm looking at and I'm not sure if that's because of the same reason

13:46 seangrove: dnolen_: Is seb suggesting we add a check to see if the prop is starting with "__", or that we list all the properties we don't want shown?

13:47 patchwork: I have an uberjar that works fine locally, but on heroku returns from (wrap-resource "public") on a request with {:uri "/"}… ?

13:47 Anyone seen this before?

13:47 It is as if (wrap-resource) is matching a file with no name?

13:47 Very strange

13:48 justin_smith: patchwork: wait, what does it return for /?

13:48 technomancy: patchwork: yeah, that's a known bug in older ring versions

13:48 patchwork: It should return the home page

13:48 technomancy: Ahh… okay

13:48 I keep upgrading ring… apparently I am still behind!

13:49 Or maybe some dependency is pulling in an old version

13:49 Thanks technomancy

13:49 technomancy: patchwork: https://github.com/ring-clojure/ring/pull/97

13:54 pyrtsa: `cbp: AFAIK, LightTable uses Mousetrap (http://craig.is/killing/mice) for handling key bindings, and it only supports the US keyboard layout. Bad, bad. :(

13:55 `cbp: Hmm yeah..

13:55 Well it's still pretty nice what they've managed in a year or so

13:55 sdegutis: lazybot where art thou

13:56 pyrtsa: https://github.com/ccampbell/mousetrap/issues/2

13:57 `cbp: Indeed. And I've managed to make many key bindings work on my Finnish keyboard layout, regardless of Mousetrap's limitations. Had to do a few tricks there, though.

14:00 `cbp: In particular, `"alt-[" [(:editor.open-pair "[")]`, `"alt-shift-[" [(:editor.open-pair "{")]`, and similar treatment for the `]` key made brackets and braces work on my keyboard.

14:02 `cbp: Yeah I had to remap a bunch of alt-* keys because I use them to type some characters and light table uses them as shortcuts :-P

14:02 But that's no biggie

14:03 pyrtsa: Yeah, I just disabled pretty much all of the alt-* bindings. I use alt all the time for not-so-special characters like @, $, [, ], { and }.

14:03 `cbp: although that makes them not register as an actual [ or something. So there is no automatic ] put by the editor

14:04 pyrtsa: My trick above does exactly that.

14:05 `cbp: OH!

14:07 hehe I used alt-[ and now I can't type {, gonna have to make that combo alt-shift-[ do it. As you did I guess

14:07 pyrtsa: Here: https://gist.github.com/pyrtsa/9277551

14:11 `cbp: Thanks, haha. "You use the [ and { keys to write [ and shift on the [ key (not the { key) to type {"

14:12 pyrtsa: On the FI keyboard, [ is alt-8, { is alt-shift-8, ] is alt-8 and } is alt-shift-9. That's why.

14:12 ] = alt-9, of course.

14:13 And parentheses are shift-8 and shift-9. Much different from the en_US, unfortunately.

14:14 technomancy: hack your layout; unshifted parens are awesome =)

14:14 `cbp: Yeah it doesn't work for me unfortunately, my [] and {} are in different positions =(

14:15 pyrtsa: Which layout are you?

14:16 gtrak: what's up with lazybot?

14:16 pyrtsa: technomancy: I bet. But believe or not, 30 years of this layout does leave you with some muscular memory as well.

14:16 amalloy: gtrak: he's having some kind of connection problem. can't log into freenode

14:17 gtrak: I had that yesterday

14:17 pyrtsa: (Or well, maybe 23 years since I started typing.)

14:17 `cbp: spanish-iso

14:17 gtrak: 7070 was broken on a few servers for some reason, 7000 worked on card.freenode

14:17 technomancy: pyrtsa: https://github.com/technomancy/atreus

14:17 gtrak: maybe related

14:18 I'm on dickson now, actually

14:19 looks like they're having a DDoS attack

14:19 https://twitter.com/freenodestaff

14:19 technomancy: sadface

14:20 they changed their organizational structure so they can't accept donations anymore either

14:20 patchwork: Hmm… ring-json is pulling in an old version of ring-core

14:20 `cbp: Fortunately I will be getting an english keyboard soon and I will recover the blissful ignorance where everything open source works that I gained when I moved away from Windows =)

14:20 patchwork: Do I need to fork ring-json to upgrade? Funny it is living on its own rather than part of ring like the other middlewares

14:20 pyrtsa: technomancy: The thing you might find hard to believe is, we do need some "special" characters (in my case, ä and ö) almost as often as you need your a and o. Of course not as much when programming but the context switches between coding-oriented and prose-oriented key layouts do have their price.

14:21 amalloy: patchwork: there are jillions of middlewares. for them all to live in ring would be not just silly but impossible

14:21 technomancy: pyrtsa: I'm not saying to use mine, just to take what you have and make it suit your own needs better

14:21 patchwork: amalloy: Right, but this one is pretty standard

14:22 Forking...

14:22 gfredericks: patchwork: you can normally override indirect deps if you need to

14:22 pyrtsa: I'm pretty fine with mine atm. And now I'm even fine with LightTable, once I found my hack to support the FI layout in it. But it could be better.

14:22 gfredericks: so as long as it's compatible with the newer version...

14:22 `cbp: Although I'm not entirely sure how the computer would respond with two different keyboar layouts..

14:22 patchwork: gfredericks: Ah good call

14:44 johnjelinek: hihi all

14:45 so, to preface: I haven't read the little lisper -- so, my question is prolly obvious -- but how do I make a function in the REPL that repeats itself every 5 seconds?

14:45 mmitchell: I have a protocol and a record. For the record, I'd like to add a private function, I'm guessing that doesn't work with protocols, so I instead though a letfn over the defrecordr -- dang, that doesn't work either. Is there a way to around this?

14:45 johnjelinek: here's my attempt: (def repeat-me (future (do (Thread/sleep 5000) (println "Repeating") repeat-me)))

14:46 but this does not repeat

14:46 amalloy: mmitchell: just don't attach the function to the record. define a function that takes your record in and does whatever

14:47 RickInAtlanta: johnjelinek: you could do it with core.async

14:47 johnjelinek: RickInAtlanta: isn't that a little overkill?

14:47 amalloy: yes :P

14:47 mmitchell: amalloy: right yeah, that's definitely the most straight forward way

14:47 I'll do that

14:47 amalloy: (future (loop [] ... (recur)))

14:48 although i sorta expect this experiment of having another thread doing things to your repl indefinitely to go kinda Sorceror's Apprentice

14:48 johnjelinek: ??

14:48 clojurebot: BOT FIGHT!!!!!111

14:49 sdegutis: lol

14:49 amalloy: i mean you'll accidentally have more than one such thread and/or be unable to stop them

14:50 $google sorceror's apprentice wikipedia

14:50 johnjelinek: (def repeat-me (future (loop [] (do (Thread/sleep 5000) (println "Repeating")) (recur)))),

14:50 works:)

14:50 amalloy: oh right. no lazybot

14:50 http://en.wikipedia.org/wiki/The_Sorcerer's_Apprentice

14:51 johnjelinek: ooooh, the disney fantasia story

14:51 amalloy: sure, although much older than that, of course

14:51 johnjelinek: right

14:51 so -- on every recur, does this spawn a new thread?

14:51 amalloy: a socratic answer: how do you spawn a new thread?

14:52 johnjelinek: (future

14:52 amalloy: and do you (future in the loop?

14:52 johnjelinek: no

14:52 amalloy: tada!

14:52 johnjelinek: so, I have my answer :)

14:57 janiczek: Hi, if I wanted to do some kind of logger / visualizer for core.async processes and channels, would I need to somehow hack on core.async itself? Or would hooking it from outside be enough? (I am looking into Rackets future-visualizer and Racket has logging baked right inside...)

14:58 amalloy: janiczek: you might take a look at the graphviz stuff in lamina. i don't know how applicable it is to core.async, but it's pretty cool

14:58 technomancy: I doubt there's anything as nice as Racket's

14:59 ztellman: interesting: http://docs.racket-lang.org/future-visualizer/index.html

14:59 didn't know about this

14:59 janiczek: Thats exactly it.

15:04 sdegutis: Anyone in here love Docker?

15:09 TravisD: I'm always shocked by how expensive it is to print things

15:11 bbloom: TravisD: yup.

15:11 amalloy: like...because printer ink costs thousands of dollars per gallon, or because sending strings to your repl takes a while?

15:11 bbloom: amalloy: both.

15:11 TravisD: Oh, hehe, I was talking about sending strings to the repl :)

15:14 sveri: hi there, i tried to unit test the lib-noir validation rules, however, when i call one method from the test i get this error: Exception in thread "main" java.lang.ClassCastException: clojure.lang.Var$Unbound cannot be cast to java.util.concurrent.Future Any ideas how one can test the validation rules?

15:16 amalloy: ,@clojure.core/unquote

15:16 clojurebot: #<ClassCastException java.lang.ClassCastException: clojure.lang.Var$Unbound cannot be cast to java.util.concurrent.Future>

15:17 TimMc: TravisD: Printing, or display on terminal? :-P

15:17 amalloy: sveri: you probably have to use with-noir or something. i remember there being an atom you have to bind dynamically

15:17 TimMc: too late by miles

15:17 TravisD: TimMc: displaying in cider :)

15:17 TimMc: https://stackoverflow.com/questions/21947452/why-is-printing-b-dramatically-slower-than-printing

15:17 amalloy: that question was neat

15:18 TimMc: amalloy: No, by printing I meant just output.

15:18 Should have been more explicit. :-)

15:20 TravisD: woah, that's actually surprising

15:23 sveri: amalloy: thank you, there is something like that in the noir sources, i give it a try

15:31 amalloy: awesome, it works :-) thank you once again

15:38 johnjelinek: do any of you use LT?

15:38 `cbp: johnjelinek: ye

15:38 johnjelinek: does it make you crazy that CTRL+F doesn't move the cursor forward?

15:38 it does a fuzzy file search instead

15:38 drives me crazy (since 0.6.1)

15:39 TravisD: johnjelinek: The key bindings are customizable, no?

15:39 johnjelinek: I didn't see how to configure the cursor movement

15:39 TravisD: ah, I don't know much about it

15:39 johnjelinek: but also, I don't know what I'd change my fuzzy file finder to instead

15:42 TravisD: There used to be a way to enable emacs bindings, but I couldn't get it to work when I tried out LT

15:43 johnjelinek: yea, I still can't get it to work (emacs bindings)

15:43 the plugin seems incomplete

15:47 TravisD: Actually, I'm noticing that ctrl + f actually moves my cursor forward. I'm on a mac though

15:47 johnjelinek: what version? I'm on a mac too

15:47 TravisD: 0.6.4

15:47 johnjelinek: me too

15:47 TravisD: hm, strange

15:48 I think my config is also the default that it ships with

15:48 johnjelinek: mine too, for the most-part

15:48 when I go to the file menu, it shows ^F for navigator

15:48 but I didn't set that

15:48 TravisD: for me it is Command + O

15:49 johnjelinek: cmd+O does it for me too

15:49 :|

15:49 kevinfish: anybody got any comments on using Heroku?

15:49 Raynes: It is expensive for open source projects.

15:49 That's my comments.

15:50 johnjelinek: lol

15:50 Raynes: Well, for non-trivial open source projects.

15:50 For example, need ssl support? Fo-ged-aboud-eeeeet

15:50 kevinfish: Raynes: k, thx.

15:50 gtrak: pssh ssl

15:50 Raynes: But it's a great platform.

15:50 I host tryclojure, fwiw.

15:50 kevinfish: Raynes: IOW, it gets expensive fast?

15:51 Raynes: you host it on there?

15:51 Raynes: Yes.

15:51 That project is completely free because I don't need ssl or databases or anything that would cost monies.

15:51 johnjelinek: question: I have a collection of futures, some have completed, some are pending -- how do I filter the ones that have completed so I can only deref those?

15:52 I was thinking (filter (map future-done? my-futures))

15:52 but that no worky

15:52 Raynes: um

15:52 DomKM: johnjelinek: realized? I think

15:52 gtrak: deref takes a timeout argument

15:52 Raynes: (filter future-done? my-futures)

15:53 realized? is more generic, but also should work

15:53 kevinfish: anyone got any good ideas on a decent, cheap database backend that acts somewhat like datomic, in that you are not really devolving into something like SQL query language, but are pretty much just dealing with clojure containers as if they were resident in memory?

15:53 johnjelinek: Raynes: nice

15:53 I was close

15:53 gtrak: aww, tryclj doesn't like futures

15:53 ,(deref (future 3) 0 0)

15:53 clojurebot: #<SecurityException java.lang.SecurityException: no threads please>

15:53 gtrak: jeez

15:53 Raynes: Hahaha

15:53 I don't even remember writing that error message.

15:53 Nice.

15:54 gtrak: ,(deref (promise) 0 0)

15:54 clojurebot: 0

15:54 gtrak: ,(deref (promise) 0 :not-yet)

15:54 clojurebot: :not-yet

15:54 hiredman: kevinfish: core.logic has the new pldb stuff

15:56 kevinfish: hiredman: ok, nice. What would be the advantage of datomic over that, say?

15:56 hiredman: kevinfish: in what context?

15:57 kevinfish: hiredman: for like building web applications that may grow in use fairly rapidly

15:57 hiredman: core.logic is open source and free, which is nice, core.logic isn't strictly datalog

15:57 core.logic is a database though

15:57 er

15:57 isn't

15:59 kevinfish: hiredman: I was looking at plob (persistent lisp objects) for something like that back when I was playing with common lisp. Pretty much normal lisp data except you could flag which were "persistent" and which elements had indexes on them, etc... Otherwise, it pretty much gave the illusion you were dealing with in-ram data

15:59 hiredman: kevinfish: there is nothing like that

16:00 the closest you might come is some kind of datagrid like infinispan, etc, which would use java serialization to store stuff

16:02 kevinfish: hiredman: k, thx. Unfortunately, I know lisp a fair bit, clojure a little, and java almost none.

16:02 johnjelinek: dakrone: you around?

16:03 dakrone: even with {:throw-exceptions false} I still get exceptions in the scenario where I get "Connection reset"

16:03 hiredman: kevinfish: I would recomend using any of a number of fine sql databases then

16:04 kevinfish: hiredman: I don't know that very much either :(

16:04 hiredman: now is your chance then

16:05 kevinfish: hiredman: ya, oh joy.

16:05 hiredman: clojure data tends to map to sql very well, maps are just rows in a table

16:06 filter is select, etc

16:07 I not familiar with how plob works, but generally those kind of systems are heavy on define lots of new types with some attributes so the serialization whatever can stick them in the right place

16:08 clojure tends to de-emphasize the creation of custom types, relying on just generic maps to carry associated data around, which maps well to the relational world

16:20 zachmassia: I'm testing out the austin brepl sample, and I have a java process using ~1G ram and 25% CPU and it's also caused emacs to use 25% CPU

16:20 Should I be launching it through a command line repl instead of cider?

16:28 dsrx: shouldn't matter

16:29 do you have some sort of autocomplete mode enabled in cider, like company or auto-complete?

16:29 those can wreak havoc in a piggiebacked REPL

16:30 zachmassia: dsrx: Yep, auto-complete

16:31 amalloy: i want an eastwood rule that looks for (apply str (interpose x ys)), and murders the person who wrote it

16:31 zachmassia: Not sure what kind of magic that sample project is doing, but I copied all the relevant code into my project and get a nullpointerexception on the (def repl-env ...) command

16:31 technomancy: amalloy: I think you're stuck with http://p.hagelb.org/punch.png

16:32 zachmassia: I'll disable auto-complete and see if that helps. About to just give up on the brepl lol

16:33 abp: amalloy: technomancy usb rocket launcher hooked

16:35 gtrak: amalloy: one of the few uses I've had for interpose.

16:35 dsrx: zachmassia: have you required cemerick.austin.repls and cemerick.austin at your repl?

16:35 (the clojure side of it)

16:35 TEttinger: ##(apply str (interleave ["Hi" "amalloy" "how" "are" "you"] (repeat 5 " ")))

16:35 lazybot: ⇒ "Hi amalloy how are you "

16:35 TEttinger: even worse?

16:36 amalloy: TEttinger: i feel like if someone goes to that kind of effort just to get a wrong answer, they already have enough problems

16:36 zachmassia: dsrx: For the sample I didn't have to, it just worked. But in my project, I tried with and without requiring those namespaces and it was the same result.

16:36 amalloy: gtrak: joke?

16:36 gtrak: actually no. I've only used interpose, like twice.

16:36 technomancy: interpose: great for getting amalloy to want to kill you

16:37 amalloy: but like, that shouldn't be one of the times you used it

16:37 dsrx: well in the sample project IIRC the repl starts you in a namespace that's already required those namespaces

16:37 johnjelinek: out of memory error? :| do I need to be manually killing my futures when the finish?

16:37 they*

16:37 TEttinger: true

16:37 dsrx: like browser-sample.whatever.something

16:37 gtrak: heh, yes, yes it was. I learned string/join, so I stopped using interpose.

16:37 can't think of other times I've had to use it.

16:37 * gtrak greps code-base

16:37 TEttinger: johnjelinek, how many futures did you create?

16:38 johnjelinek: 36000

16:38 Raynes: I distinctly remember arguments with amalloy about join vs apply str interpose when I was like 16.

16:38 johnjelinek: they're making async web requests

16:38 gtrak: in a 24kloc code-base, we use it once, and we should use string/join.

16:38 so... that's my point.

16:38 TEttinger: I have a feeling that's too many at one time, but it probably depends on what it's running on

16:38 johnjelinek: should I space them out?

16:39 amalloy: oh my

16:39 zachmassia: dsrx: Ya it sets the init-ns key. I tried setting it to 'myapp.core' which requires the same namespace the sample projects .clj does

16:39 amalloy: johnjelinek: you need a better async primitive than future

16:39 johnjelinek: how would I add a take-delay?

16:39 amalloy: like a threadpool

16:39 johnjelinek: hrmm ... well, clj-http has a connectionmanager, maybe I should use that instead of spinning up my own futures

16:40 amalloy: clj-http supports non-blocking io, i think, so you shouldn't need any threads at all

16:40 just issue all the requests, and set a callback for each one

16:40 gtrak: I want/need statistics on every public clojure codebase in existence.

16:41 technomancy: gtrak: clojuresphere

16:41 gtrak: my first thought.

16:41 I bet 95% of uses of interpose are inappropriate string/joins.

16:41 johnjelinek: amalloy: out of the box, I don't think clj-http does async, that's what made http-kit popular methinks

16:41 seangrove: dnolen_: Ok, both PRs were merged

16:41 johnjelinek: but http-kit can't do streaming http requests, so I'm going back to clj-http

16:42 dnolen_: seangrove: RAD

16:42 seangrove: dnolen_: Not sure when the next release will go out, but the merging bit was quite fast

16:42 amalloy: oh, i can't keep those straight. i just use aleph if i want async

16:42 dnolen_: seangrove: yes they are very responsive

16:43 johnjelinek: amalloy: lol, another library :|

16:43 gtrak: arguably, interpose decomplects .toString from string/join

16:43 therefore is good.

16:43 :-)

16:44 amalloy: interpose is fine, i'm glad it exists

16:44 but don't use it for strings, since join exists

16:45 technomancy: but amalloy what if I don't want to go up to the top of my file to add :require [clojure.string :as str] to the ns form

16:45 sdegutis: The sole usage of interpose in our codebase: (interpose "<br>" messages)

16:45 amalloy: technomancy: emacs keyboard macro for adding that, of course

16:45 technomancy: amalloy: the correct answer was slamhound

16:45 gtrak: sdegutis: you should use more semantic markup

16:46 technomancy: five points from hufflepuff

16:46 amalloy: i had a keyboard macro for adding flatland.useful.debug

16:46 * gtrak ducks

16:46 hiredman: ~#10

16:46 clojurebot: 10. Get into a rut early: Do the same process the same way. Accumulate idioms. Standardize. The only difference(!) between Shakespeare and you was the size of his idiom list - not the size of his vocabulary. -- Alan J. Perlis

16:46 amalloy: hiredman: shakespeare cheated by making up half of english

16:46 seangrove: technomancy: Are you mad? You should alias it :as string anyway.

16:46 hiredman: amalloy: tell it to perlis

16:46 amalloy: :as s, man

16:46 technomancy: seangrove: that's 2x as many characters

16:47 amalloy: everyone knows what s/join means

16:47 technomancy: seangrove: if ns aliases were first-class that'd be a problem

16:47 and I wish they were

16:47 gtrak: the likelihood that some other namespace has required it is very high, just don't worry about it.

16:47 technomancy: but they're not

16:47 seangrove: Madness

16:48 technomancy: I guess you get used to dnolen_ telling you, "Oh your application works as an accident of undefined behavior, which we've decided to fix/change/revert"

16:48 amalloy: gtrak: the likelihood is 100%

16:49 technomancy: seangrove: I'd be so happy to have first-class namespaces that I wouldn't mind fixing the breakage =D

16:49 amalloy: clojure.string is one of the namespaces that's always required

16:49 seangrove: technomancy: I agree it'd be delightful.

16:50 technomancy: amalloy: I thought that changed in 1.3

16:50 or was it just clojure.set

16:50 muhoo: i'm having a miserable time trying to get booleans to work with om

16:51 (om/value something) returns either true or false, but it lies

16:51 because tests like (if something) always succeed!

16:51 and tests like (= true (om/value something)) always fail

16:52 bob2: is it in fact a string

16:52 technomancy, they're not first class?

16:53 technomancy: bob2: eh

16:53 no reader syntax

16:53 muhoo: in short, i have no idea whether i'm doing something really stupid, or if booleans just don't work in cljs/om

16:53 sdegutis: amalloy: I always forget the ordering, like 99% of the time

16:54 technomancy: bob2: they're kinda like functions in lisp-2. you can pass em around and stuff, but they always feel awkward like not-quite-values

17:05 patchwork: technomancy: Hmm… upgraded to ring 1.2.1, still getting a blank response from (wrap-resource) on requests {:uri "/"}

17:05 I even unzipped the jar and made sure your pull request got in: https://github.com/ring-clojure/ring/pull/97

17:06 ring.util.response is checking (directory-url? …)

17:06 Any leads?

17:06 I realize now it happens on any uberjar, not just heroku (heroku just creates an uberjar)

17:07 technomancy: patchwork: can you remove the directory entry with :uberjar-exclusions or something?

17:08 patchwork: Hmm… just /resources/public/ ?

17:08 I'll check that out

17:08 technomancy: sure; whatever it is that's getting returned by wrap-resource

17:09 patchwork: The thing is everything else lives in /resources/public. it is not an empty dir

17:09 technomancy: just to see if it works around the problem; not as a full solution

17:09 patchwork: Can I exclude just that path without excluding the rest of the files in that dir?

17:09 I will check out :uberjar-exclusions

17:09 technomancy: you should be able to use a regex that matches the directory without matching the files under it

17:09 patchwork: Okay

17:10 broquaint: muhoo: Try out ankha and see what data you've really got? https://github.com/noprompt/ankha

17:11 johnjelinek: why does this return "not done yet" even when the future is done? (if (future-done? symbols) "not done yet" (count @symbols))

17:11 zachmassia: dsrx: If you or anyone has time to look over this, here's the errors and relevant files for my project when trying to get a brepl with austin working. https://gist.github.com/ZachMassia/462f7560016643dcd8fc

17:12 amalloy: johnjelinek: because if the future is done you return "not done yet"...

17:13 johnjelinek: lololol

17:13 amalloy: thanks for that

17:14 rasmusto: ~netsplit

17:14 clojurebot: I don't understand.

17:14 amalloy: ,(doc deref)

17:14 clojurebot: "([ref] [ref timeout-ms timeout-val]); Also reader macro: @ref/@agent/@var/@atom/@delay/@future/@promise. Within a transaction, returns the in-transaction-value of ref, else returns the most-recently-committed value of ref. When applied to a var, agent or atom, returns its current state. When applied to a delay, forces it if not already forced. When applied to a future, will block if computation n...

17:14 zoldar: I'm going through Om tutorial and the code snippets have quite a nice formatting. On the other hand, LightTable, which I've started using recently is doing much worse, indenting often goes too deep or to shallow. Anybody got around custmizing it? Are there any knobs available on the editor level or is it necessary to fiddle with LT clojure mode directly?

17:15 amalloy: johnjelinek: you could also just write (deref symbols 0 "not done yet")

17:15 matthavener: johnjelinek: hey there :)

17:15 johnjelinek: matthavener: hey :)

17:17 dnolen_: johnjelinek: that question is probably best directed to the Light Table mailing list

17:17 johnjelinek: matthavener: how U?

17:17 gtrak: technomancy: is 'lein install' away from a project supposed to work? Seems like it overwrites the clojure dep in ~/.m2.

17:17 just did it by accident

17:17 johnjelinek: dnolen_: which question, the CTRL+F?

17:17 dnolen_: johnjelinek: oops sorry

17:17 that was for zoldar ^

17:18 johnjelinek: lol

17:19 patchwork: technomancy: Added :uberjar-exclusions [#"resources/public/?"] to my project.clj, didn't seem to help

17:19 zoldar: dnolen_: ok, thanks

17:19 patchwork: Funny, I can hit every other route or file in the app!

17:19 Another pattern maybe?

17:20 technomancy: patchwork: getting rid of wrap-resources makes the problem go away?

17:23 patchwork: technomancy: Yes. Removing wrap-resource gives me the home page at {:uri "/"}

17:24 but without styling, js etc as those are resources

17:24 with wrap-resource I get all those, but not the home page!

17:24 technomancy: patchwork: I'm about to go into a call, but if you pm me the app name I can investigate further when it's done

17:25 amalloy: patchwork: why do you get the home page at / to begin with?

17:25 do you have some middleware that replaces that with index.html or something?

17:26 patchwork: amalloy: No the home page is not a resource, it is generated by the app

17:26 (wrap-resource) is just for the static stuff

17:26 The app is a handler that lives at the bottom of the middleware stack

17:26 which is currently never getting hit at {:uri "/"}

17:27 because (wrap-resource) is hijacking it and returning a blank file

17:27 amalloy: right, because there's a resource that exists at / (even if it's silly to consider a directory a resource)

17:27 sveri1: Hi, Anyone here having an idea about my problem i described here: https://groups.google.com/forum/#!topic/clojure/0VMwgCpeoU4 ?

17:28 amalloy: instead of (wrap-resource handler ...), have you tried (routes handler (resources ...))?

17:29 muhoo: broquaint: oh, is that the floating window thing?

17:29 patchwork: amalloy: Strange, it only fails if it is running in an uberjar

17:30 That is why I just discovered it, I was trying to work out heroku support

17:30 So you are suggesting looking for resources if the route itself is not matched?

17:30 muhoo: noprompt: huh, that's pretty cool. i was just complaining about having to flip back and forth between cljs/nrepl and google console trying to see what these objects are or aren't.

17:31 amalloy: i'm suggesting explicitly giving your handler priority, if you don't like what wrap-resources is doing

17:31 patchwork: Right, but many of the resources are shadowed by routes that match variable paths

17:31 so it would never fall through to find the resources

17:32 which is why it hits the resources first in the stack

17:32 The usual behavior is if the resource is not found, it falls through to the app. Which is actually what it does unless it's in an uberjar!

17:33 I wonder what is different there?

17:33 amalloy: well, that's what it does even if it's in an uberjar

17:33 i speculate that something about being in the uberjar makes it think / is a resource, so it's not "not found"

17:33 noprompt: muhoo: ankha?

17:33 amalloy: (routes (GET "/" req (handler req)) (wrap-resources ... handler))

17:34 muhoo: noprompt: ya

17:34 amalloy: for even more delicate route-untangling

17:34 patchwork: Right, which seems like what technomancy's earlier pull request should have fixed

17:34 noprompt: i'm having a weird problem w/ my project not picking up a dependency and i have no clue what's wrong.

17:35 patchwork: amalloy: Right, I guess I can directly inspect the incoming request and bypass (wrap-resources) in that case

17:36 seems like a hack! But it will work I suppose

17:37 muhoo: anyway, still miserable with the booleans

17:40 noprompt: i'm trying to use the newest version of clojure.tools.cli but i keep ending up with the old version

17:41 lein deps :tree doesn't report a dependency on the old version :|

17:41 `cbp: when all else fails.. lein clean?

17:42 noprompt: i've done lein clean :S

17:43 muhoo: ah, solution is, (om/value somebool) fails. but (.valueOf somebool) works!

17:43 `cbp: then go nuclear and delete .m2 xD ?

17:44 amalloy: noprompt: google exorcism services

17:44 noprompt: amalloy: haha, what?

17:45 amalloy: since your computer is apparently haunted

17:45 or possessed

17:45 whatever it is you exorcise

17:46 patchwork: amalloy technomancy: This solved it! https://www.refheap.com/49113

17:47 amalloy: patchwork: there are a couple ways to improve that

17:47 patchwork: amalloy: Sure, what did you have in mind?

17:47 amalloy: the first is to wrap-resource once, outside the fn, and use it inside; this probably doesn't matter, but if wrap-resource were expensive to initialize...

17:47 patchwork: Ah, right

17:47 even hacks should be well-engineered

17:48 amalloy: the second is to do what i suggested, ie (GET "/"). checking (= "/" uri) will fail if the uri is actually /?test=1

17:48 patchwork: Ah, yeah not using compojure

17:49 amalloy: really? well, to each his own i guess

17:51 patchwork: I don't like the macros. Using this: https://github.com/caribou/polaris

17:51 I guess I could do a comparable thing with polaris

17:52 amalloy: i think the only macros i've ever used in compojure are GET and POST

17:52 patchwork: I get to the point where I want to use GET or POST as a value somewhere and then end up writing something like (fn [route] (GET route))

17:53 which just seems wrong

17:53 amalloy: it doesn't just seem wrong, it like...is wrong? that shouldn't work at all

17:54 patchwork: Well, that is pseudocode

17:54 I forget exactly what the args to GET are

17:54 But that is the spirit : )

17:54 amalloy: doesn't really matter what they are, since it's a macro - if route is at all interesting, calling it like that won't work

17:55 patchwork: Right, it has some quoting I believe

17:55 been awhile since I've done it, since I switched to something that treats routes as data and not fuzzy macro sugar

17:56 It is funny, when I first got into lisp (and read through "on lisp" what, 10 years ago?) I thought macros were the ultimate

17:57 Now I never touch the things

17:57 Can't take the value of a macro, they are useless to me

17:58 seangrove: patchwork: core.async is useless to you?

17:58 patchwork: Ah, no I love core.async

17:58 Also: let

17:59 And: fn

17:59 I just haven't written one

17:59 They are good for fundamental things like that I suppose

18:00 but most of the time I want to compose things programmatically

18:00 a macro is like a compositional dead-end

18:03 seangrove: patchwork: I agree, best avoided if possible

18:05 johnjelinek: dakrone: what does Connection Pool shut down mean?

18:10 dakrone: johnjelinek: that the connection pool has been shut down? can you give me more context?

18:11 johnjelinek: dakrone: it's a little ways behind me now, I bypassed it by removing a doall on my async requests in the with-connection-pool

18:12 dakrone: johnjelinek: okay, happy to help if I can

18:15 johnjelinek: dakrone: will this still use the number of threads I specified in the connection manager? (client/with-connection-pool {:timeout 5 :threads 4 :default-per-route 2 :insecure? false} (let [req-futs (map #(future (client/get % {:oauth-token (:access_token @access-token) :throw-exceptions false :as :json-s

18:17 dakrone: johnjelinek: ahh, I see the issue

18:17 johnjelinek: since I use (future in req-futs I have suspicion that the thread count may increase to accomodate (take 26 urls)

18:17 dakrone: johnjelinek: the with-connection-pool creates a connection manager, and then closes it at the end, but since you are creating futures that may run after the manager has been closed, it's possible to try and use a previously-closed manager

18:18 johnjelinek: a better solution is to create a manager and use the :connection-manager option, as in the second example here: https://github.com/dakrone/clj-http/#using-persistent-connections

18:18 johnjelinek: what is the recommended way to use the connection manager and still get a collection of futures that I can watch?

18:18 dakrone: johnjelinek: then, once all futures have been realized, you can close it at your leisure

18:19 johnjelinek: ahh, ok

18:19 technomancy: patchwork1: that kind of stuff shouldn't be necessary though

18:19 johnjelinek: how do I close it at my leisure?

18:19 technomancy: it worries me that the issue is still present despite that patch being merged

18:19 johnjelinek: just set it to nil?

18:19 technomancy: do you have a repro case I could check out?

18:20 johnjelinek: dakrone: Ideally, all I want is for my function not to block

18:20 dakrone: johnjelinek: there is a shutdown-manager function in clj-http.conn-mgr

18:20 johnjelinek: so (map (future ... I thought would get me that

18:20 dakrone: johnjelinek: yes, so create the manager once, use it throughout your program, then when you're shutting down, you can finally shut it down

18:20 johnjelinek: great :)

18:21 patchwork1: technomancy: I will put one together, in a meeting currently

18:21 johnjelinek: btw, you may want to add shutdown-manager to the example on the github

18:21 dakrone: johnjelinek: good idea!

18:21 technomancy: patchwork1: thanks.

18:22 dakrone: johnjelinek: added, thanks

18:23 johnjelinek: yw

18:29 rasmusto: ,(and (nil? 'nil) (true? 'true) (false? 'false))

18:29 clojurebot: true

18:30 rasmusto: good to know

18:32 amalloy: ,(instance? String)

18:32 clojurebot: #<ArityException clojure.lang.ArityException: Wrong number of args (1) passed to: core/instance?>

18:32 amalloy: nice

18:33 rasmusto: ,(instance 'true)

18:33 clojurebot: #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: instance in this context, compiling:(NO_SOURCE_PATH:0:0)>

18:33 rasmusto: ,(instance? 'true)

18:33 clojurebot: #<ArityException clojure.lang.ArityException: Wrong number of args (1) passed to: core/instance?>

18:33 rasmusto: ,(instance? 'true java.lang.Boolean)

18:33 clojurebot: #<ClassCastException java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.Class>

18:33 johnjelinek: dakrone: ok, so now I have my 26 futures, how do I make sure that only 4 threads are being used as enforced by the conn-mgr?

18:34 rasmusto: ,(instance? java.lang.Boolean 'true)

18:34 clojurebot: true

18:34 dakrone: johnjelinek: threads for the actual futures themselves, or threads for the connection manager?

18:34 johnjelinek: the latter

18:34 dakrone: johnjelinek: the connection manager will manage that, you can enabled the apache debug logs and see it do that if you desire

18:35 johnjelinek: btw, how will this work -- the 26 threads for the futures will reduce to the 4 specified by the conn-mgr?

18:36 dakrone: johnjelinek: a future doesn't spawn a thread, internally it uses clojure's ThreadPoolExecutor based on the number of processors in your machine

18:36 johnjelinek: dakrone: oh -- from what I read, I was under the impression is spawns a thread

18:36 to manage concurrency

18:36 dakrone: johnjelinek: it spawns a thread from the threadpool, which may or may-not actuall spawn a thread :)

18:37 johnjelinek: gotcha

18:37 dakrone: johnjelinek: if it's a fixed threadpool of size 4, then only 4 threads will be spawned at a time, the rest of the ops will be queued

18:37 hiredman: dakrone: the future threadpool is unbounded

18:37 dakrone: hiredman: oh, for some reason I thought it was CPU-limited

18:38 ahh yea, pmap uses a limited threadpool

18:38 amalloy: that's for agents

18:38 dakrone: well *one* of the threadpools is limited, somewhere ;D

18:39 * dakrone is confusing his clojure threadpools and ES threadpools

18:39 johnjelinek: but in my case of (map #(future ... then it's spawning more threads to keep it non-blocking, but the requests in the futures may be queued by the threads in the conn-mgr

18:39 amalloy: dakrone: pmap uses an unbounded threadpool (ie, the future threadpool), it just tries not to realize too many elements at once

18:39 dakrone: amalloy: ahh okay

18:39 hiredman: johnjelinek: when using map and future it is important to keep in mind that map is lazy

18:40 johnjelinek: should I use something else?

18:40 I'm just using map to pump the URLS into my client/get argument

18:40 hiredman: depends what you want, I would use an executor and a queue of results

18:41 dakrone: johnjelinek: you may be able to utilize something like https://github.com/TheClimateCorporation/claypoole for this

18:41 johnjelinek: dakrone: claypoole was recommended to me yesterday, but I'm trying to keep my samples simple enough so I can ship something ;)

18:42 dakrone: johnjelinek: in that case I wouldn't be too worried about having every single future executing an HTTP request at the same time, I'd set the connection manager threads to a reasonable value and keep stuff in futures like you have

18:45 johnjelinek: I thought maybe I could swap the map and future around to be (future (map ... so I would have it execute all requests by the conn-mgr and still send a future I can check the status of ... but this blocks :|

18:48 lol, so it blocks and returns a finished future

19:06 why is this non-blocking: (future (into #{} (map #(% :Name) (flatten (map #(% :body) (pmap client/get urls (repeat {:oauth-token (:access_token @access-token) :throw-exceptions false :as :json-strict-string-

19:06 gtrak: anyone know of a way to expand Ant Filesets in clojure?

19:06 johnjelinek: oh, it didn't paste everything

19:06 gtrak: johnjelinek: don't paste multiple lines

19:06 `cbp: johnjelinek: refheap

19:06 johnjelinek: refheap?

19:06 clojurebot: https://www.refheap.com/

19:06 `cbp: ~botsnack

19:06 clojurebot: Thanks, but I prefer chocolate

19:07 hiredman: ~pmap

19:07 clojurebot: pmap is not what you want

19:07 `cbp: : (

19:07 rasmusto: ~doall

19:07 clojurebot: I don't understand.

19:07 hiredman: ~flatten

19:07 clojurebot: flatten is rarely the right answer. Suppose you need to use a list as your "base type", for example. Usually you only want to flatten a single level, and in that case you're better off with concat. Or, better still, use mapcat to produce a sequence that's shaped right to begin with.

19:08 hiredman: #(% :Name) is so gross

19:09 etc etc

19:09 johnjelinek: here's a pastebin: http://pastebin.com/DzkWvt0N

19:09 rasmusto: ,((comp :name :body) {:body {:name "foo"}})

19:09 clojurebot: "foo"

19:10 johnjelinek: so, why is the latter blocking?

19:11 oh, hurp durp* I need to prolly future my get-all-symbols

19:12 rasmusto: the #(str "https://example.com") isn't doing anything, you're missing a % (an aside)

19:13 johnjelinek: sorry, I replaced the real stuff with "example.com" and forgot the %

19:13 rasmusto: kk, was just nitpicking anyways :)

19:14 johnjelinek: http://pastebin.com/1xik5pEx

19:14 just for you :)

19:14 rasmusto: ,'<3

19:14 clojurebot: <3

19:16 rasmusto: johnjelinek: are you saying that it blocks before you try to dereference it?

19:18 johnjelinek: rasmusto: yes

19:20 rasmusto: actually, it's weird behavror -- (future-done? is true

19:20 but (deref blocks

19:21 (meaning (future-done? should've been false

19:24 gtrak: oh wow, ant's FileSet has a handy iterator function. This might be easier than I thought.

19:24 johnjelinek: g2g

19:24 patchwork: technomancy: Here you go: https://github.com/caribou/caribou-development/tree/develop

19:25 technomancy: patchwork: thanks

19:26 patchwork: technomancy: Thank you! I have to run, maybe leave a comment on that repo if you find anything?

19:26 technomancy: patchwork: sounds good

19:40 stcred0: Is there any way that I can get Clojure to generate a Java superclass and two subclasses with disparate state implementing the same protocol?

20:02 gfredericks: disparate state?

20:02 stcred0: yes, they have none of the same attributes

20:02 but they both implement the same protocol

20:03 gfredericks: why do you need the subclass relationship?

20:04 stcred0: I seem to be having difficulty getting things to compile. The Clojure compiler doesn't seem to like it when I have the return-type hint be the protocol

20:05 gfredericks: why do you need to type hint w/ a protocol?

20:05 stcred0: Won't that result in faster code?

20:06 gfredericks: if `lein check` doesn't tell you there's specific reflective code being generated, then there's no problem to solve

20:06 type hints only help w/ reflection

20:06 stcred0: I have set warn-on-reflection true in all those source files, so that's the same thing?

20:07 gfredericks: probably so

20:08 stcred0: So, if I have a ight loop where I'd like there to be polymorphic dispatch and for that to be compiled to what I'd expect it to be in Java, I don't have to do anything?

20:08 gfredericks: well protocols have a bit of overhead compared to interfaces

20:08 but each protocol has an underlying interface

20:09 which is sometimes implemented by the classes satisfying the protocol, dependending

20:09 but protocols aren't going to be obscenely slow like reflection

20:10 stcred0: But if I can get the two classes satisfying the protocol to implement the interface, won't that result in even faster code?

20:10 gfredericks: you can measure to check

20:10 stcred0: Potentially, things would be JIT-ed

20:10 gfredericks: if you use deftype or defrecord and do the protocol definition inline, it'll implement theh interface

20:11 stcred0: I am using defrecord for the two things implementing the protocol. What do you mean about doing the protocol definition inline?

20:11 gfredericks: within the defrecord expression

20:11 contrasted with extend-type or extend-protocol

20:12 stcred0: So then how would I get that to happen with polymorphism between two classes?

20:12 gfredericks: ,(defprotocol IFoo (foo [_]))

20:12 clojurebot: IFoo

20:12 gfredericks: ,(defrecord A [] IFoo (foo [_] "I am an A"))

20:12 clojurebot: sandbox.A

20:13 gfredericks: ,(defrecord B [] IFoo (foo [_] "I am a B"))

20:13 clojurebot: sandbox.B

20:13 gfredericks: ,(type sandbox/IFoo)

20:13 clojurebot: clojure.lang.PersistentArrayMap

20:13 gfredericks: ,(import 'sandbox.IFoo)

20:13 clojurebot: #<ClassCastException java.lang.ClassCastException: clojure.lang.Var cannot be cast to java.lang.Class>

20:13 gfredericks: ,sandbox.IFoo

20:13 clojurebot: sandbox.IFoo

20:13 gfredericks: ,(type sandbox.IFoo)

20:13 clojurebot: java.lang.Class

20:13 gfredericks: ,(satisfies? (A.) sandbox/IFoo)

20:13 clojurebot: #<NullPointerException java.lang.NullPointerException>

20:14 gfredericks: ,(satisfies? sandbox/IFoo (A.))

20:14 clojurebot: true

20:14 gfredericks: ,(instance? sandbox.IFoo (A.))

20:14 clojurebot: true

20:14 gfredericks: ,(foo (A.))

20:14 clojurebot: "I am an A"

20:14 gfredericks: ,(.foo (A.))

20:14 clojurebot: "I am an A"

20:14 stcred0: I think that's what I'm doing.

20:15 gfredericks: note the difference between the last two

20:15 the first one is never reflective and type hints don't help; the second can be reflective and you would type hint with the interface name

20:15 ,(.foo ^sandbox.IFoo (B.))

20:15 clojurebot: "I am a B"

20:16 gfredericks: ,(time (.foo (B.)))

20:16 clojurebot: "Elapsed time: 0.112743 msecs"\n"I am a B"

20:16 gfredericks: ,(time (.foo ^sandbox.IFoo (B.)))

20:16 clojurebot: "Elapsed time: 0.107861 msecs"\n"I am a B"

20:16 * gfredericks shrugs

20:16 gfredericks: ,(set! *warn-on-reflection* true)

20:16 clojurebot: #<IllegalStateException java.lang.IllegalStateException: Can't change/establish root binding of: *warn-on-reflection* with set>

20:16 gfredericks: time on clojurebot might be funky

20:16 stcred0: Well, you'd have to keep at it to warm up the JIT

20:17 gfredericks: there's usually an immediate factor of 100-1000x difference

20:17 if one is reflective

20:17 but since the constructor is inline it might not have been

20:17 ,(time (#(.foo %) (B.)))

20:17 clojurebot: "Elapsed time: 0.225027 msecs"\n"I am a B"

20:17 gfredericks: whatever

20:17 hyPiRion: ,(.bindRoot #'*warn-on-reflection* true)

20:17 clojurebot: nil

20:18 gfredericks: hyPiRion: aw snap

20:18 ,#(.foo %)

20:18 clojurebot: #<CompilerException java.lang.SecurityException: denied, compiling:(NO_SOURCE_PATH:0:0)>

20:18 gfredericks: ,(+ 1 2)

20:18 clojurebot: 3

20:18 stcred0: so the key is to define the constructor inline?

20:18 gfredericks: stcred0: no ignore that part

20:18 that was just about timing on clojurebot

20:18 stcred0: if you use the interface methods and type hint with the interface, it should either work right or blow up

20:19 so unlikely you're subtly messing up

20:19 stcred0: okay, so I'll just not worry about it for now, since I an doing a defprotocol and defrecord-ing the two types.

20:20 it's only when I do more hinting than that that I have compile problems.

20:20 gfredericks: sure

20:20 yeah wait till you have definite perf problems to worry past that :)

20:20 stcred0: I'm trying to fit 1000's of simultaneous users into one instance of my MMO.

20:27 bbloom: Bronsa: so have you do a line count on your analyzer/emitters and the java impls?

20:29 Bronsa: bbloom: t.a + t.a.j + t.e.j is ~5.2k locs

20:30 Compiler.java is 8.5k + Reflector.java 500

20:31 bbloom: Bronsa: and those are more or less equiv functionality?

20:31 Bronsa: bbloom: tools.* is modular & extensible, the java impl not at all

20:32 bbloom: Bronsa: sure, but that's a given :-P

20:32 cool, thanks for the metrics

20:32 i was curious, but wasn't sure which bits to count precisely

20:33 Bronsa: bbloom: also ~300locs in t.a/t.a.j are not actually needed but are passes provided for the users

20:34 bbloom: Bronsa: what's that mean exactly?

20:34 Bronsa: bbloom: e.g. the datomic support or the emit-form pass to convert an ast back to clojure source

20:34 bbloom: ah ok cool

20:35 Bronsa: so yeah, I think it's fair to say that it's 5k vs 8.5k taking into account that Compiler.java has a bunch of commented out classes

20:36 chare: so if you try to make a 1milion threads in clojure is that going to end up badly, is the jvm unable to handle that kind of scale?

20:37 bbloom: chare: your operating system is going to be the bottleneck, not the jvm

20:37 chare: not if the threads are not mapped 1 to 1 to os threads

20:38 bbloom: we don't call those "threads" anymore. you can probably make 1 million green threads with core.async without much difficulty

20:38 chare: so clojure has green threads? are those from java or did clojure implement somehow green threads on its own

20:39 bbloom: chare: start here: http://clojure.com/blog/2013/06/28/clojure-core-async-channels.html

20:40 seangrove: chare: Also, erlang is nice

20:43 chare: so core.async is meant to do stuff similar to erlang?

20:44 noprompt: if i'm implementing IFn is there any benefit to implementing it for all 20 arg positions?

20:44 dnolen_: chare: more similar to channels in Go

20:44 noprompt: not really, at some point I would like to spend some time to figure out how to make implementing IFn sensible

20:45 noprompt: dnolen_: how do i deal w/ & more in that case?

20:47 dnolen_: noprompt: if you want to correctly handle variadic I would just write a macro over IFn

20:47 chare: so if you're trying to get something like erlang style stuff in clojure and you use akka does that mean the threads are heavyweight since i'm assuming that akka is meant for java

20:47 noprompt: dnolen_: that works out then because i've already written the code generation for the specs.

20:48 dnolen_: working on a better selector api for garden. :)

21:08 chare: so which clojure books cover core.async?

21:09 noprompt: chare: none that i know of.

21:10 chare: i just came out last year.

21:10 chare: no no no

21:10 noprompt: *it

21:10 chare: so theres no good tutorial for newbies?

21:10 noprompt: chare: sure. there plenty of stuff out there.

21:11 chare: whats the best?

21:12 noprompt: chare: well, there are a handful of videos mentioned in the README. a quick google search might show some blogs.

21:12 chare: afa the "best" is concerned there really isn't one that comes to mind. just watch the videos, hack, and ask questions.

21:13 chare: crap

21:13 noprompt: ?

21:14 chare: noprompt how about you write a book sell it for $9 and i'll buy it

21:14 noprompt: lol

21:14 chare: so write a clojure book on async

21:14 go go go

21:15 noprompt: chare: yo, just research. *learn*

21:17 chare: dnolen_ has some good cljs core.async examples that helped me when i first started. the core.async repo is full of examples and the videos will help you a lot too.

21:18 chare: swannodette.github.io

21:18 chare: https://github.com/clojure/core.async/

21:18 chare: how are green threads even implemented, and why doesn't java have them (or does java already have it?)

21:18 noprompt: :

21:18 :|

21:19 chare: what?

21:19 clojurebot: http://paste.lisp.org/display/74305

21:19 seangrove: ~guards

21:19 clojurebot: SEIZE HIM!

21:19 noprompt: seangrove: hey!

21:19 :)

21:19 seangrove: noprompt: Hey

21:19 noprompt: seangrove: i think gf3 and i are gonna try and remote pair on secretary this weekend if you're down.

21:20 seangrove: Runnng out right now, but want to catch up at some point

21:20 Oh, that might be good

21:20 noprompt: seangrove: sure thing. :)

21:20 seangrove: I'm going to write an om component this weekend for saving state

21:20 noprompt: seangrove: ah, yeah, definitely hit me up!

21:20 seangrove: click-click-click to where ou're developing, hit a key, state is saved to localStorage, refresh and it's restored straight to that point

21:20 chare: noprompt: you don't know the answer for java?

21:20 noprompt: chare: not to be rude, but frankly, i don't care how it's implemented.

21:21 chare: wtf how can you not care?

21:21 noprompt: chare: easy.

21:21 chare: i just don't care.

21:22 chare: i've never run in to a problem where that sort of thing was relevant.

21:22 chare: i only care when something's a problem.

21:22 chare: or when i want to know for myself. then i *research*.

21:22 chare: not trying to be a jerk here.

21:22 chare: why should i care?

21:22 chare: but what happens when I have to maintain a legacy java codebase so i HAVE to use java only

21:23 noprompt: chare: ask around in #java?

21:23 i'm really, really, not trying to be rude here.

21:29 bbloom: noprompt: now that i think about it, i'm pretty sure chare was banned for trolling at some point

21:29 chare: i'm not a troll

21:29 seangrove: Best to just /ignore

21:30 Could see that one coming a mile away

21:30 chare: I'm not a troll

21:31 S11001001: eI hear, in space, it is very cold.

21:34 noprompt: bbloom: oh, didn't know that. :*(

21:34 bbloom: noprompt: i had forgotten for a moment myself

21:34 * gfredericks wants to start reciting the monty python skit with s/witch/troll/

21:35 bbloom: what else floats? very small rocks.

21:35 noprompt: bbloom: actually, now that i think about it, you're right. i remember chare from a few months ago.

21:35 gfredericks: he reminded me because I think the opening line is "I'm not a witch, I'm not a witch."

21:35 noprompt: bbloom: i'll just block him.

21:35 bbloom: shh, we've said his name twice now. if you say it 3 more times, he might show back up like beattlejuice

21:35 chare: i'm not troll, my questions above meaningful

21:36 noprompt: chare: fuck off bro.

21:36 lol

21:36 * noprompt isn't having a drink.

21:36 bbloom: noprompt: ignore, don't engage

21:36 noprompt: bbloom: you going to clojure west?

21:36 bbloom: noprompt: yup

21:37 noprompt: bbloom: cool. i'm excited to meet everyone.

21:37 i couldn't make it last year cause i couldn't afford it. :(

21:37 * gfredericks is going

21:38 goldfeld: everyone's going!

21:38 it's where it's at

21:39 noprompt: what does "Marker protocol" mean for Fn in cljs?

21:40 gfredericks: noprompt: I think that refers to empty protocols that act as flags

21:40 noprompt: gfredericks: flags for...?

21:40 gfredericks: for satisfies?

21:40 Bronsa: (satisfies? IFn some-boj)

21:40 Fn*

21:41 obj*

21:41 noprompt: interesting. so when would one want to create a marker protocol?

21:41 seancorfield: Me and one of my team will be there... unlike last year where I sent the whole of my team :)

21:42 noprompt: is rhickey going to be there?

21:43 gfredericks: I don't think he's missed clojure-{conj,west} so far

21:43 noprompt: i didn't see his name on the list of speakers.

21:43 gfredericks: it's gotta happen eventually though

21:44 goldfeld: well, not necessarily

21:44 gfredericks: he's probably tired of having to say something interesting every six months :)

21:44 he didn't do a keynote at the conj I don't think

21:44 bbloom: he's said as much

21:44 also, if you've ever given a talk, you know they are A LOT of work

21:44 noprompt: well he could get up there and just tell software jokes. he's really funny actually.

21:44 bbloom: ha

21:44 seangrove: Wow, a state save/restore for super easy dev in 2 lines of code

21:44 seancorfield: there's a TBD keynote on day two - could still be rich

21:44 goldfeld: oh, but him being there doesn't have to mean he has to give a talk

21:45 seangrove: Needs a visual component to polish it off, but man frontend stuff if fun now

21:45 goldfeld: do you thin that's an expectation?

21:45 think*

21:45 noprompt: seangrove: what i wanted to make was a vcr w/ branching.

21:46 gfredericks: goldfeld: he's also probably tired of being a celebrity, so maybe if we stop gossiping about it he won't get scared off ;-)

21:46 noprompt: seangrove: record. navigate through changes, etc.

21:47 goldfeld: is that an om component you're talking about?

21:47 noprompt: goldfeld: yah.

21:47 goldfeld: lots of fun work in that space.

21:47 seangrove: i'd really love to know how you're using secretary.

21:47 goldfeld: definitely

21:48 where's the one you're talking about?

21:48 seangrove: noprompt: An example is in omchaya

21:48 noprompt: seangrove: in conjunction w/ om anyway.

21:48 seangrove: It's not as in-depth as our prod app, but it's there to show how

21:48 It's pretty loosely coupled

21:49 noprompt: seangrove: so one of the patterns we came upon was when you have go blocks inside of your defroute.

21:50 seangrove: every go block returns a next-state which gets merged with a blank-state on dispatch!

21:50 seangrove: Heh, we do have one of those in our prod app, but it's to handle waiting until some data from the server is loaded before firing

21:50 noprompt: seangrove: that's precisely the use case.

21:51 seangrove: the only downside is the weird hash change in the url while waiting for the view to render for a slow response.

21:52 it'd be awesome to get the om folks together in a google hangout or something to discuss ideas/patterns etc.

21:52 seangrove: Oh man, finished this right before I had to go, in ~4minutes from start to finish https://www.dropbox.com/s/vdnjnmfb5b120gk/om_save_restore.mov

21:52 goldfeld: company i'm in goes as far as hosting the city's clojure meetup, but it's been hard talking my boss into just going with om instead of react plus probably mori for some business logic, main thing for him is it would take a frontend dev a while to get running with a clojure workflow and mindset

21:52 seangrove: noprompt: definitely, looking forward to clojure/west

21:52 Ok, really have to go!

21:52 noprompt: dnolen_: are you open to something like that?

21:53 dnolen_: cyber table coders?

21:53 :)

21:57 goldfeld: you just have to do it and show your boss/team there's value.

21:58 goldfeld: the team i'm on was using angular/coffeescript and the first week i was there i suggested clojurescript + om. so far it's been a success an folks are happy w/ it.

21:59 goldfeld: there's a learning curve, and new problems along the way, but so far the team/client have loved it so far.

22:00 goldfeld: iow you can't ask permission. it's like Programming Clojure book says, "show value"

22:00 goldfeld: just spike on it. :)

22:01 ok i'm yammering too much. sorry. :)

22:04 * Raynes yammers noprompt

22:04 noprompt: Raynes, my old friend!

22:04 :)

22:04 goldfeld: noprompt: no that's actually great advice and to be fair i'm allowed leeway on that front, he's actually done a thing or two in clojurescript back when he was the frontend team so i can do libraries/components in it and i'm looking forward to it, but the project hasn't started yet and i'm still stuck on an ex-backbone codebase on another project

22:05 right now i'm the frontend team, so i could even say "hey all the team is loving it!"

22:06 noprompt: goldfeld: bring it in at "gunpoint". :)

22:06 goldfeld: hell, i brought garden in because "why wouldn't you want your entire codebase in one language?" :P

22:07 goldfeld: my coworker who's an html/css/standards specialist would be kinda sad

22:07 noprompt: why?

22:07 clojurebot: why is Why

22:08 goldfeld: i guess he like his sass

22:08 likes*

22:08 which i don't

22:08 noprompt: css is weird. at least garden gives you the power to abstract the weirdness away into something that's uniform and you have control over.

22:09 the next version of garden, which i'm working on ATM, is going to expose several new protocols too.

22:09 goldfeld: i know! i'll be using garden on my next web-based side project, but i think the audience for it is precisely a programmer-minded one, which he isn't

22:09 right now i'm deep in node+cljs

22:10 i could be wrong though

22:10 noprompt: cool! just make sure you share libraries!

22:10 goldfeld: i've been pulling out some, the node cljs landscape is so sparse

22:11 i've seen the source for lighttable has done a lot of precisely what i've done wrapping nodejs's core modules, but i haven't seen any library wrapper released for that, so i'm pushing mine to clojars soon

22:11 noprompt: awesom.

22:12 goldfeld: plus there's this really cool curses lib for node called blessed which i'm evolving a bit under clojure, and maybe i'll take a hint or two from you on styling it

22:12 i mean, from your code, when i get to it

22:12 noprompt: i think once the secretary team can figure out how to make GET/POST/etc routes work in cljs we can target node js aswell.

22:13 technically secretary will work w/ node but we'd like to have the verbs in the browser there. we just don't know the "right" way to do it.

22:13 goldfeld: the only effort i've seen on node+cljs servers is bodil's dogfort

22:13 and her redlobster lib for working with promises is really awesome

22:13 noprompt: oh the curses thing in cljs would be awesome!

22:14 goldfeld: yeah, easy interactive terminal apps in cljs for everyone!

22:14 i'm brushing it up

22:14 noprompt: gah! too much awesome stuff happening here.

22:15 goldfeld: i'm also got some work done on an org-parser in cljs+node, if that's of interest to anyone

22:15 still gotta pull out of my main project too

22:16 would love to talk more about the node+cljs story on clojure west

22:17 noprompt: definitely!

22:18 alew: what deployment and configuration management tools do people use for clojure apps here?

22:23 goldfeld: you mean something like pallet?

22:23 it's got connectors to most cloud services

22:24 alew: I mean exactly like pallet

22:24 goldfeld: so is pallet a good answer or are you looking for something else?

22:24 alew: I wanted to use pallet, but it's a little bit early

22:24 I'm currently trying out ansible, but I was just curious what others found worked well

22:25 goldfeld: i actually don't have experience on that front but pallet's what i got my eyes on for when i need that

22:25 but ansible i guess would be my natural non-clojure option

22:26 alew: Pallet has a pretty fantastic philosophy and I like the direction they are heading

22:26 but the new version had quite a few breaking changes so you would have to put in a bit of work to get a lot of basic stuff working from what I experienced

22:53 bob2: is clojure.xml still the thing to be using for simple xml generation?

22:54 devn: bob2: there's clojure.data.xml

23:03 bob2: I was slightly scared off it due to it being 0.0.7 and having had no code commits in 4 months

23:03 but maybe it's just done-ish

23:15 devn: bob2: xml is after all, a pretty old problem

23:15 bob2: heh

23:21 devn: yay for promises

Logging service provided by n01se.net