#clojure log - Jul 07 2014

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

0:46 FarLight: What is the name of the bracing style that the clojure source code employs?

0:53 _ato: FarLight: EDN? https://github.com/edn-format/edn

0:56 or "S-expressions"? (although that term usually refers to the more traditional simpler lisp syntax that only has lists)

0:56 FarLight: I meant the java code for clojure _ato

0:57 bbloom: FarLight: "something weird, then something weirder caused by an intellij fuck up"

0:57 FarLight: but i believe the that weird thing is (was): https://en.wikipedia.org/wiki/Indent_style#Whitesmiths_style

0:57 FarLight: Yeah I am looking at it now but it appears to be changed

0:58 bbloom: FarLight: as i said, there was an intellij mishap

0:59 why it hasn't been auto-reformatted, i don't know... i assume b/c people have patches they depend on & it would be a pain to rebase them all

0:59 FarLight: So Hickey didnt actually write it that way to begin with

0:59 Is that his name?

0:59 Hicky?

0:59 bbloom: with the e

0:59 he wrote it in whitehead style, as far as i know

1:00 FarLight: Interesting

1:00 bbloom: er whitesmith rather

1:15 ybit3: any idea what's going on here?

1:15 https://gist.githubusercontent.com/heath/b336e361a0550f05fb91/raw/92e7f30246f6382db260c556a267117b9257a066/gistfile1.txt

1:17 ~"""javascript file found on classpath for library cljs.nodejs but does not contain a corresponding goo.provide"""

1:17 clojurebot: Pardon?

1:19 ybit3: a company is willing to let me writie clojurescript for node.js :) so i'm learning in my spare time

1:34 ivan: ybit3: maybe this works better with lein-cljsbuild and :target :nodejs?

1:38 ybit3: ivan: hm, i guess, i was was using what's on the clojurescript wiki

1:38 i'll try that tomorrow

1:38 thanks

5:25 gfixler: is there a way in clojure to do straight search/replace, sans regexes?

5:26 (replace "string" #"find" "replace") is great if you have a regex, but I have complex finds with ?s and things in them

5:26 I just literally want to replace whatever my find term is

5:27 Oh, looks like I can just use the string, and not wrap it in #"this"

5:27 hooray

5:27 Viesti: :)

5:28 gfixler: too simple; so boring :)

6:12 bracki: Does anybody know how to calm down Jetty when enabling logging via clojure.tools.logging, slf4j and logback?

6:21 Or how do I even log? What's a sane configuration?

7:14 runner: ciau xD

7:14 ciao

7:14 !list

7:42 neena: .

8:11 perplexa: hm (nthnext seq 1) vs (rest seq)

8:11 which is prefered to drop the 1st element of seq? ;p

8:13 mnngfltg: perplexa, if in doubt, take the shorter one? :)

8:13 perplexa: i did ;p

8:13 just wondering :)

8:13 mnngfltg: perplexa, also compare (next) and (rest)

8:14 perplexa: damnit. another one :|

8:14 pyrtsa: Use (next xs) if you want nil to indicate an empty tail, otherwise (rest xs).

8:15 perplexa: tail is never empty :)

8:16 i'm ust returning the result of a re-find, but don't want the whole string to be at #0

8:16 i think i'm gonna stick with rest

8:18 pyrtsa: perplexa: Heh, then you should know there's also (subvec xs 1) that you can use for vectors (to keep the result as a vector).

8:38 perplexa: pyrtsa: thx

9:26 rurumate: how to do http request in clojurescript? what's the most awesome way? just goog XhrIo or is there something more convenient / standard yet?

9:27 teslanick: I use the raw DOM api with (doto)

9:27 rurumate: because I don't like CamelCase

9:28 and XhrIo doesn't return a channel. bummer

9:29 broquaint: rurumate: cljs-http or cljs-ajax perhaps?

9:29 rurumate: thanks, I wasn't aware of cljs-ajax

9:30 Glenjamin: the general advice is to not treat the network like a channel

9:30 but instead to have the network code feed messages to/from a channel

9:38 rurumate: Glenjamin: huh?

9:38 are you telling me not to use cljs-ajax?

9:38 Glenjamin: i know nothing about cljs-ajax

9:39 rurumate: you telling me to use a callback and put it in XhrIo directly, no channels attached?

9:40 Glenjamin: i'm saying a core.async channel and a network socket should be treated differently

9:40 it looks like cljs-ajax does that

9:41 rurumate: hum hum

9:41 I just want to avoid callbacks that's all

9:41 benzap`: question for you guys, I want to implement something that resembles (defn, but I want to automatically be passing in the parameter. This means I can't gensym, but I still need some form of local scope for the paramter

9:41 i can't seem to figure out how to do that

9:41 rurumate: callbacks in the toplevel code that is, of course they are still there somewhere below

9:42 benzap`: something like #() ?

9:42 Glenjamin: the general advice i've seen is when apis expose callbacks, your callback should just put! a value onto a channel

9:42 marpstar: Glenjamin is right, rurumate, your XhrIo should put! a message onto a channel

9:42 rurumate: yes that's what I want to do,

9:42 benzap`: rurumate: that generates a symbol, how would I reference it inside of the macro?

9:42 rurumate: just I don't want to write that code all over again in each project, I want it in a library

9:42 benzap`: I mean, outside of the macro

9:43 gfredericks: benzap`: this is called anaphoric macros

9:43 usually discouraged

9:43 rurumate: put!, not >! ?

9:43 gfredericks: ,(defmacro while-x-is-42 [expr] `(let [~'x 42] ~expr))

9:43 clojurebot: #'sandbox/while-x-is-42

9:43 benzap`: gfredericks: I see, maybe I need to rethink this then

9:44 gfredericks: ,(while-x-is-42 (inc x))

9:44 clojurebot: 43

9:44 marpstar: actually, I used >!

9:44 gfredericks: benzap`: yeah maybe try describing what you're doing at a higher level?

9:44 marpstar: rurumate: http://pastebin.com/5HuUBRX3

9:44 assumes xhr is XhrIo

9:45 benzap`: gfredericks: well, what i'm trying to do is make a macro called defservice, which takes the form (defservice name-of-service {parameters, like polling interval, etc} ~@body (which takes a msg object, containing service data)

9:45 marpstar: that's how I call up to my server, get a JSON response, convert it into a cljs hash map with keywords for keys

9:45 benzap`: so it would be like (defservice poll-test {} (println msg))

9:46 marpstar: and publish it to a channel

9:46 benzap`: honestly, i'm just trying to introduce some more syntactic sugar

9:47 I want to smooth over some things for newcomers

9:47 I could just forget about using ~@body, and just pass in a function

9:49 gfredericks: benzap`: you might look at how compojure's routing macros provide sugar without using anaphora

9:50 benzap`: gfredericks: alrighty

9:51 gfredericks: benzap`: it does seem easier when there's just one instance of anaphora and you're actively thinking about how it works, but in general it makes it a lot harder to look at code and see what things are referring to

9:52 bracki: How do I force a form into a string?

9:52 I want to convert a map to a JSON string.

9:52 benzap`: gfredericks: agreed, to be honest, I could probably do most of what I want without macros

9:58 looks like compojure is passing down the routing information to handlers to construct whatever routing requests it needs

9:58 I don't understand why some things are made into macros

10:00 teslanick: bracki: In clojure or clojurescript?

10:07 rurumate: marpstar: brilliant, thanks

10:41 bracki: teslanick: Got it working

10:41 in Clojure

10:41 Once more, does anybody know what I have to do to Jetty to shut it up? I'm using ring and slf4j.

10:41 teslanick: I was going to say -- in Clojure you'll need a JSON serializer, but in JS you can usually just use js/JSON.stringify

11:01 ddellacosta: bracki: did you figure out your logging issue? This may help: https://github.com/malcolmsparks/clj-logging-config

11:01 bracki: alternatively, just configure it via XML

11:19 rurumate: what's the difference between alt! and alts! ?

11:22 tbaldrid_: rurumate: alt! is like alts! + case

11:23 tbaldridge: arrdem: have you seen this one yet? (let [[& {:as opts] [1 2 3 4 5 6]] opts)

11:23 , (let [[& {:as opts] [1 2 3 4 5 6]] opts)

11:23 clojurebot: #<RuntimeException java.lang.RuntimeException: Unmatched delimiter: ]>

11:23 tbaldridge: , (let [[& {:as opts} [1 2 3 4 5 6]] opts)

11:23 clojurebot: #<RuntimeException java.lang.RuntimeException: Unmatched delimiter: )>

11:23 Bronsa: ,(let [[& {:as opts}] [1 2 3 4]] opts)

11:23 clojurebot: {1 2, 3 4}

11:23 tbaldridge: bleh this is easier as a defn

11:23 there we go! :-)

11:25 * arrdem attempts to parse

11:26 arrdem: tbaldridge: hum.... no I don't think I've seen that one before either

11:26 * arrdem starts writing let examples for grimoire

11:27 tbaldridge: it's basically the same as something like (fn [& opts] (apply hash-map opts))

11:27 but I hadn't seen it either until Rich used it in part of core.async

11:28 arrdem: yeah I may have seen that once or twice for exactly that reason but AFAIK I've never used that trick.

11:28 Bronsa: well that's the same as doing (defn x [& {:keys [..]}]) ..

11:28 arrdem: sure

11:30 rurumate: tbaldridge: thanks, I see there are not clauses in alts!. alt! is a lot easier on the eye in many cases

11:32 benzap`: was wondering, is there a way to easily generate a symbol when (defn a function? i'm currently doing something like this http://stackoverflow.com/questions/2486752/in-clojure-how-to-define-a-variable-named-by-a-string

11:32 but I can't seem to store (symbol x) in a (let cloause

11:34 ugh, I feel like i'm breaking the law, the way i'm doing this

11:34 it's almost like an object-oriented approach, that doesn't quite cut it

11:35 I just want a service, that I can stop, start, setup scheduling

11:35 cbp: benzap`: what exactly are you doing and why?

11:36 benzap`: I want to add services to a list, and I was going to add in optional arguments to setup scheduling

11:36 using overtone.at-at

11:36 so I need to generate functions that will handle the scheduling as well, which consists of a schedule pool, and 'stop-functions'

11:37 it requires me to store state on these services based on what types of scheduling I introduce on the service

11:37 teslanick: benzap`: Have you seen http://thinkrelevance.com/blog/2013/06/04/clojure-workflow-reloaded

11:39 benzap`: the problem isn't my workflow, i'm writing something which I can use to extend my service-pool

11:40 ugh

11:42 i feel like my brain is going to explode, I just think about everything in terms of OOP

11:43 Jaood: FP is fud

11:44 yogsototh: Hi! Could someone help me. I have a lazy-seq of strings and I want to produce an array of string out of it.

11:44 arrdem: Jaood: naw man it's blub

11:44 yogsototh: I tried (into [] myseq) without success.

11:45 jonasen: yogsototh: do you need a Java array?

11:45 cbp: yogsototh: that makes a clojure vector. Is that the problem?

11:45 yogsototh: I don't know, in the end I want to make a JSON out of it.

11:46 cbp: yogsototh: can you show your code + stacktrace?

11:46 teslanick: If it needs to be a Java array, you can do (into-array lazy-seq)

11:46 cbp: ~refheap

11:46 clojurebot: https://www.refheap.com/

11:46 Jaood: arrdem: what's blub?

11:47 arrdem: Jaood: http://en.wikipedia.org/wiki/Paul_Graham_%28computer_programmer%29#Blub

11:47 jonasen: yogsototh: You won't need a java array for outputting JSON. I don't think you need to convert the lazy seq at all

11:47 yogsototh: I use storm, the stacktrace is not very relevant.

11:48 I showed the type and I got: clojure.lang.LazySeq

11:48 but if I try to print it, it simply fail

11:49 here is my error log http://pastebin.com/piZbtd0S

11:49 and the code http://pastebin.com/YKkDuU88

11:56 cbp: sorry yogsototh I am unfamiliar with storm

11:57 yogsototh: cbp: in this case I don't think this is a storm related problem. I have a LazySeq but I don't even know how to print it!

11:58 cbp: you just print it

11:58 ,(print (range 10))

11:58 clojurebot: (0 1 2 3 4 ...)

12:01 yogsototh: I tried print and it didn't worked

12:01 It tried (realized? tokens) and it returned false

12:01 cbp: what did print do?

12:02 yogsototh: apparently nothing happened

12:02 AeroNotix: yogsototh: doall

12:03 yogsototh: (doall print tokens) fail dramatically...

12:03 AeroNotix: jesus

12:03 (print (doall tokens))

12:03 yogsototh: I even tried (take 1 tokens)

12:03 AeroNotix: obv

12:04 yogsototh: (print (doall tokens)) failed the same way...

12:04 AeroNotix: In what way?

12:04 yogsototh: I get a NullPointerException

12:05 AeroNotix: is tokens nil?

12:05 yogsototh: no tokens isn't nil

12:05 dbasch: yogsototh: it's possible that your lazy sequence has things that cause NPE upon realization

12:06 AeroNotix: indeed

12:06 yogsototh: Maybe I use a quite old lirbary

12:06 https://github.com/eandrejko/clj-tokenizer

12:06 dbasch: e.g.

12:06 ,(def a (map #(/ 1 %) (repeat 0)))

12:06 clojurebot: #'sandbox/a

12:07 dbasch: (first a)

12:07 ,(first a)

12:07 clojurebot: #<ArithmeticException java.lang.ArithmeticException: Divide by zero>

12:07 dbasch: it's a different exception but you get the idea

12:07 yogsototh: You are completely right!

12:07 Thanks!

12:27 anykey: is there a chief web framework for Clojure like Grails for Groovy?

12:29 TimMc: Compojure, I guess?

12:30 Might not be as framework-y as you want. :-P

12:39 arrdem: Bronsa: https://www.refheap.com/87936

12:40 Bronsa: pedantic, but big for someone trying to understand what the class structure is

12:40 verma: in repl, how do I reload a file if I initially loaded it with (load "test/file")

12:41 arrdem: verma: load doesn't do any caching AFAIK, it's imperative. just call load again.

12:41 verma: arrdem, if I do a (in-ns) after the load it cannot find the file anymore

12:42 arrdem, but you're right just doing (load "") again doesn't report any problems, only that when I do (in-ns) it blows

12:42 arrdem, nice, I can do (in-ns 'user) and it throws be out and then I can reload

12:43 arrdem, thanks

12:43 arrdem: verma: (doc load) shows that load is classpath/namespace relative. If you in-ns into some ns, loads are assumed to be relative to the location of whatever ns you are in.

12:45 verma: arrdem, ah, thanks :)

12:46 Bronsa: arrdem: pushed

12:46 arrdem: Bronsa: <3

12:50 anykey: TimMc: I'll take a look nevertheless.

12:52 arrdem: cbp: bug: you don't use your cactus on twitter

12:53 cbp: bug: your twitter and github handles aren't eq

12:54 cbp: arrdem: lol

12:55 aperiodic: [us hsov

12:55 ha, wrong keyboard layout

13:00 cbp: arrdem: Fixed #1

13:01 arrdem: yay

13:18 Planet_EN: Its quite a noob question but I'm trying to use spit in a clojure file and it gives me the symbol isn't defined, it works fine when I use it in REPL. Any ideas?

13:24 zanes: Planet_EN: Things that are defined when you evaluate them in the REPL stay defined, even if you remove them in the file.

13:24 Planet_EN: So what probably happened is that you required it, then removed that requirement from the file.

13:24 Planet_EN: Do you mean ‘split’?

13:27 Planet_EN: zanes, no I mean spit, the one in clojure.core

13:27 cbp: Planet_EN: can you paste your code + stacktrace?

13:28 Planet_EN: zanes, http://pastebin.com/xDDvAMyd

13:28 atyz: anykey: I don't think there is a framework as encompasing as grails

13:29 amalloy: Planet_EN: you need some kind of ns declaration; a clojure file with no namespace is weird and who knows whether spit will work or even println

13:29 i mean, i would expect it to work, but who knows

13:29 Planet_EN: zanes, stack trace: http://pastebin.com/raw.php?i=fmL56cuq

13:30 amalloy: ah. Planet_EN: uninstall this "clojure" executable, and install leiningen

13:30 Planet_EN: amalloy, println works, spit doesn't.

13:30 amalloy, I've lein too

13:30 arrdem: amalloy: if there is no ns/in-ns form, *ns* is still 'user

13:31 amalloy: arrdem: like i said i'd *expect* it to work but eliminating weirdness is a reasonable first guess at debugging

13:31 arrdem: amalloy: sure

13:31 amalloy: Planet_EN: you're running a binary from like three years ago, which was never sanctioned by clojure/core anyway

13:31 back then, spit lived in clojure.contrib.io, or something like that

13:31 arrdem: lul contrib

13:32 Planet_EN: amalloy, how do I run a file via lein?

13:34 amalloy: so, anyway, the solution is to do everything with lein. https://github.com/technomancy/leiningen/blob/master/README.md#basic-usage is useful since you've already got it installed. so you'll want to use `lein run -m your.namespace`, once you've got a project set up (as via `lein new`)

13:34 "loose" clojure files which are not part of a project are not really very useful; everything lives in a project

13:35 arrdem: Planet_EN: you did install lein via the boostrap script not via $PKGMANAGER, right?

13:35 anykey: atyz: I figured that; I come from Django and express (on node.js) and I am new to clojure altogether, so something... skinny might be a choice

13:36 Planet_EN: arrdem, yea from the official script

13:36 arrdem, its v2.4.2

13:36 arrdem: gud

13:38 verma: what is the #{} for?

13:38 arrdem: verma: https://clojure.org/reader it's the set reader literal

13:38 verma: arrdem, oh nice, thanks

13:48 Planet_EN: Is there something similar to curl in clojure or a port of python requests?

13:48 requests lib

13:48 Glenjamin: clj-http is my preferred choice

13:48 tuft: Planet_EN: yes, clj-http

13:53 atyz: hiredman, TimMc are you guys around today?

13:54 TimMc: atyz: Here, yep.

13:55 afk in 7 minutes

13:55 atyz: It appears you were right yesterday re the GC issue

13:55 Erm, on thursday

13:56 TimMc: Oh, that wasn't my diagnosis. What did you learn?

13:58 atyz: Oh sorry it must have been amalloy

13:58 Ummm

13:58 TimMc: Probably.

13:58 (inc amalloy)

13:58 lazybot: ⇒ 140

13:58 arrdem: Bronsa: I can't quite tell, do you manage the numbering of fields/constants manually or do you get that for free from objectweb/asm

13:58 atyz: I attached nr to those boxes

13:58 Let me show you something

13:59 http://imgur.com/w70zatW

14:00 TimMc: atyz: ...interesting. What happened at 10:40?

14:00 Bronsa: arrdem: you mean "0" in const__0?

14:00 atyz: TimMc: Nothign!

14:01 Logs say nothing

14:01 Bronsa: arrdem: or are you talking about local variables?

14:01 atyz: http://imgur.com/oywuUUK

14:01 We are also using all of our Eden heap

14:01 basically all the memory on the box

14:01 aperiodic: atyz: was this after taking the node out of the LB group?

14:01 amalloy: atyz: adding giant piles of extra RAM to a process managed by a GC is a great way to slow it down

14:01 arrdem: Bronsa: class fields not local variables.

14:02 atyz: amalloy: the box has 3.7gb of ram i believe, we have allocated 3g to the jvm

14:02 It seems to be using all it can

14:02 Bronsa: arrdem: so that's constants/callsites, the index is assigned to each constant/callsite by the collect pass

14:02 amalloy: sure, you're probably leaking memory somewhere

14:02 atyz: aperiodic: the GC cpu usage dropped after I pulled it out of the lb

14:02 amalloy: but if you can manage with less memory at one time, incremental cleanup on a small heap will make your program run faster than occasional huge cleanups on a huge heap

14:03 atyz: However teh machine is still running at 100% after being pulled out of the lb

14:03 Bronsa: arrdem: https://github.com/clojure/tools.analyzer/blob/master/src/main/clojure/clojure/tools/analyzer/passes/collect.clj#L38

14:03 atyz: amalloy: please excuse me, but would you expand on your last statement?

14:04 amalloy: atyz: suppose you had a machine with 1TB of RAM, and decided to give it all to a clojure webserver

14:04 aperiodic: you want a smaller heap that you garbage collect more frequently rather than a big one with rare, expensive collections

14:04 amalloy: what would happen is you'd have no gc for hours, lots of garbage piling up, and then a GC pause that's minutes long

14:04 tuft: can you actually prevent stop-the-world that way, or does the world just stop for less time?

14:04 atyz: amalloy: but that wouldn't explain why the machine is still running at 100%

14:05 arrdem: Bronsa: herm.... okay.

14:05 TimMc: There's no way to get it to do more frequent collections?

14:05 amalloy: well, like i said, you're probably leaking memory somewhere; once you run out of memory once, any program can get into really bad states because the OutOfMemoryError crops up somewhere you weren't expecting it

14:05 aperiodic: tuft: the latter. hopefully your world only stops for a millisecond or two at a time

14:05 TimMc: Or is the problem that any collection on a heavily-used heap will make a long pause?

14:05 amalloy: tuft: modern garbage collectors can do with very short STW pauses, or none at all if you can proactively avoid major collections

14:06 tuft: cool, makes sense

14:07 atyz: how would I go about finding a memory leak?

14:07 and would it possibly help for me to change my java-opts?

14:07 I guess logging teh gc would be the only way

14:07 amalloy: atyz: you can use jmap or a profiler to get a histogram of the heap space used by objects of various sorts

14:08 atyz: amalloy: i've run the new relic profiler on teh box when it was under strain

14:08 I'll go look through that again quick

14:08 amalloy: and if you see that the dominator is something like my.app.core$helper$fn__123$fn__456, you'll know that you're leaking closures from inside of my.app.core/helper

14:09 but of course you won't always get such a helpful answer

14:09 Bronsa`: arrdem: https://github.com/clojure/tools.emitter.jvm/blob/master/src/main/clojure/clojure/tools/emitter/jvm/emit.clj#L1111 for the code that emits constants

14:09 amalloy: usually it's clojure.lang.LazySeq objects or something, and than you have to figure out where they're coming frmo

14:14 arrdem: Bronsa`: thanks. just trying to meld my mental model of (essentially unordered) method/field/class generation with name resolution and with your transform structure(s).

14:14 atyz: amalloy: forgive my ignorance, but why would a machine taking no requests, which is no longer really garbage collecting anymore but has a memory leak be using all of its cpu?

14:15 amalloy: atyz: because OOMEs are like armageddon. anything can happen. maybe some scheduler thread was the one who got the first error, and it was unable to unschedule some timer

14:15 arrdem: atyz: because the machine is continually garbage collecting trying to prove that some subset of the heap is unreachable so that it can get some memory to breath in.

14:18 tuft: thrashing, basically =)

14:21 atyz: So from what I see here (http://imgur.com/tN6MeZa) basically it looks like the culprit is the ThreadPoolExecutor. Could this just be from my threadpool in clj-http or my (probably) not the best use of futures?

14:23 amalloy: atyz: those threads should be blocking, not spinning cpu

14:23 sun.misc.Unsafe/park is the primitive used for blocking until some event happens

14:26 atyz: amalloy: Unless I"m reading this correctly, why are they taking up 66% of the cpu?

14:26 *increctly

14:26 *incorrectly

14:27 amalloy: dunno. maybe newrelic doesn't realize it's blocking. maybe some weird black magic happened when you got your OOME. maybe i'm wrong and that's supposed to take up CPU time after all

14:27 halogenandtoast: I’m trying to understand how I should model this functionally. I have a game object and I want the game to keep playing until someone wins. I was considering having a :running true value in my Map, but I’m not sure how I’d use that to keep executed a branch until :running false because immutability. I thought about a while loop. Should I be using an atom for this instead?

14:27 s/executed/executing/

14:27 I’ve been avoiding atoms as a whole.

14:28 It seems like I want an infinite lazy inject.

14:29 But I might be in left field.

14:30 arrdem: (loop [state] (let [state

14:30 derp

14:31 (loop [state] (let [stat' (tick state)] (when (:running state') (recur state'))))

14:31 s/stat'/state'/g

14:31 no need for atoms here

14:32 halogenandtoast: arrdem: thanks, makes some sense, I’ll start working on understanding how this works.

14:33 So recur executes the loop again passing in a new value, interesting.

14:33 atyz: amalloy: I don't think so, because on happy boxes it doesn't take up a majority of the cpu

14:35 arrdem: halogenandtoast: yep.

14:56 pandeiro: anyone ever experienced a ring app using compojure working fine (200s) with embedded jetty in dev, but returning 302s when deployed as a war? (referring to the same exact route, eg localhost:8080/foo)

14:58 anykey: atyz: I am impressed. Compojure is exactly the balance of simplicity and complexity I searched for. Will be learning clojure the next weeks with that.

15:06 halogenandtoast: arrdem: Thanks so much for the example, I think that was a huge clojure breakthrough for me.

15:07 arrdem: halogenandtoast: no worries

15:19 atyz: anykey: I think you (like I did) will start to enjoy the simplicity of it. I have felt bogged down by many of the larger all inclusive frameworks

15:20 anykey: atyz: it's my main gripe with grails. Grails is SLOW.

15:20 it takes above 45 seconds to just reload changes

15:21 in comparison to that, compojure feels quick, but comes, of course, as no-frills.

15:21 I will have problems when I want to properly secure applications

15:22 atyz: Yep, thats not fun. If you are looking for more all inclusive stuff Scala has some frameworks that are a little more all inclusive

15:22 anykey: atyz: actually I like lisp, it's been a long time

15:22 I did Lisp in... I think 2008

15:22 common lisp, back then

15:23 but I have known it for quite some time before that

15:23 atyz: Then you shuldn't have too much trouble adopting clojure :)

15:24 anykey: tomorrow it may be decided that I am doomed to do Java for the rest of my work life

15:25 if that doesn't come to pass, I will happily take a very good look at clojure

15:38 Fare: is there a better way to insert something at the second position of a vector than (fn [[a & b]] (apply vector a 2 b)) ?

15:39 turbofail: probably not. vectors aren't really made for random insertion

15:40 bbloom: well, should use into

15:40 Fare: (into [] (list* a 2 b)) ?

15:40 bbloom: ,((fn [[a & b]] (into [a 2] b)) [1 2 3 4])

15:40 clojurebot: [1 2 2 3 4]

15:40 Fare: ok

15:41 bbloom: apply-vector will make a pass through lazy seqs on the way to being a vector

15:41 using into will internally use reduce, skipping the intermediate data structures

15:41 Fare: (inc bbloom)

15:41 lazybot: ⇒ 36

15:43 bbloom: Fare: still, unless you know you have a small (30ish or fewer) item vector (or are doing this rarely enough) then you've probably good the wrong data structure

15:43 Fare: seqs have fast head access

15:48 Fare: this is to represent source code. All these vecs are fewer than 10 elements.

15:48 maybe even only all fewer than 5 or 6

15:48 bbloom: yup, won't matter at all then

15:49 Fare: 7 actually

15:54 bbloom: Fare: enjoying clojure so far? would be interesting to get a CL-ers view

15:56 Fare: yes, enjoying it very much.

15:56 halogenandtoast: Is there any service for paying other clojure developers to review my code and give me tips to improve it (I know I can use exercism.io, but that’s solving very specific examples and not the code I wrote).

15:56 (pay or free)

15:57 Fare: there are things I'm missing, but the core language is much neater.

15:57 I still am not done with "The Joy of Clojure". It just happily surprised me with {:pre ... :post ...}

15:58 anykey: I bought that book too

15:58 then I noticed I couldn't handle it, so I also got a more introductory one

15:59 Fare: I bought 1st ed shortly before 2nd ed was out :-/

15:59 it is slightly too slow for me, but good nonetheless. 1st ed has many small mistakes here and there. I suppose they've been fixed in 2nd ed, but that's annoying.

15:59 amalloy: halogenandtoast: you could try #clojure on freenode. i hear some clojure devs hang out there

15:59 Fare: hallski, wait, where am I?

16:00 s/hallski/amalloy/

16:00 halogenandtoast: amalloy: so you mean here?

16:00 verma: lol

16:00 I checked to make sure I was on freenode

16:00 :P

16:01 halogenandtoast: At the moment I just have this small program I’m writing to emulate a card game: https://gist.github.com/halogenandtoast/58cf169f271d49f69005

16:01 I’m concerned that my lack of clojure knowledge might have led me down bad paths

16:01 amalloy: halogenandtoast: sure. you just have to structure your question so that it's interesting. nobody will want to "offer general suggestions" on your 3000-line app, but smaller targeted questions are often answered helpfully. plus, working on asking a better question will itself teach you

16:02 verma: I just need a good set of problems/projects to work on to learn more clojure, I find myself struggling with ideas

16:02 halogenandtoast: amalloy: Heh luckily it’s less than 100 lines, and it’s at least a card game. Maybe that’s interesting?

16:04 amalloy: halogenandtoast: seems like a basically reasonable way of doing things. it's unfortunate that there are side effects buried in make-player, but i see you're doing a pretty good job of keeping pure code pure

16:04 #(shuffle-deck %1 %2) is just shuffle-deck

16:05 nothing in there stands out as outrageously bad. i'd say you're on a good path

16:06 halogenandtoast: amalloy: Thanks, good to know. I agree I didn’t like the side-effects (due to map not working, switched to doall, and then finally mapv).

16:06 The doall, forced me to use into later

16:09 bracki: Does anybody know how to calm down Jetty when enabling logging via clojure.tools.logging, slf4j and logback?

16:10 Fare: what's the easiest way to conditionally destructure a seq?

16:11 razum2um: just a small survey: how many of participants here are writing clojure at work as primary language?

16:12 * arrdem raises a prehensile foot

16:12 noprompt: razum2um: is everyone supposed to raise their hand?

16:13 * noprompt raises hand.

16:14 pandeiro: anyone know what config is necessary for standalone jetty and lein ring warfiles to work together?

16:14 amalloy: Fare: destructuring is unconditional; we don't have pattern-matching like haskell or erlang (unless you use a library like core.match)

16:14 * bracki not really

16:14 noprompt: does anyone what the proper channels are for removing something accidentally push to clojars, work related, not intended for public consumption? /cc technomany

16:14 :| ^ technomancy

16:14 i-blis: *raises hand*

16:14 razum2um: noprompt: room encounters 757 users now, just will know how many are just curious

16:15 amalloy: noprompt: it's to talk to technomancy

16:15 Fare: is there a reason not to use core.match?

16:15 noprompt: it'd be nice to have a "panic-button" with clojars when you accidentally push something.

16:15 Fare: also, is there a good way to use a library only at compile-time?

16:15 arrdem: Fare: TL;DR no

16:15 amalloy: i mean, the same reason not to use anything. the default, for all x, is to not use x; you only use x if there's a reason :P

16:16 noprompt: like i'm pretty sure 1000s of people aren't going to be depending on something i haven't even made known to the public. as if people are sitting on pins and needles waiting for me to push my next clojure smash hit.

16:16 amalloy: so do i email our techno friend?

16:16 amalloy: Fare: use it only at compile time? that might be viable if it were 100% macros, but i don't think there are very many such libraries

16:17 noprompt: hang out in IRC and wait for him to show up?

16:17 johnwalker: is there an eof literal in clojure?

16:17 amalloy: noprompt: *shrug* i just see people hang out in irc

16:17 but of course more people may be emailing him; i don't read all of those

16:17 noprompt: the clojure community has a weird "addiction" to IRC.

16:17 it's a bubble.

16:17 arrdem: (nsa-logs-authed? 'amalloy)

16:17 Fare: amalloy: well, for instance core.match. Also, I'm interested in using instaparser at compile-time only to generate some data.

16:17 amalloy: noprompt: you could sell irc short

16:17 noprompt: shit goes down in here that people don't get a chance to talk about on the ML. it's lame.

16:18 technomancy: noprompt: I'm on the phone, but I can get this deleted as soon as this call ends.

16:18 amalloy: if you think the market is in a bubble

16:18 technomancy: there is also contact@clojars.org

16:19 noprompt: technomancy: i think that was more of what i was looking for. i didn't want to think of you as some kind of hotline that i could just walk in here and make demands. :)

16:19 amalloy: i would be surprised, Fare, to discover that core.match is 100% macros. it probably also defines some functions that it causes you to call at runtime

16:19 technomancy: noprompt: there have been suggestions to allow deletions of zero-download jars

16:19 but suggestions are not patches

16:20 noprompt: amalloy: i like irc. i miss it in fact. my job doesn't give me the time to be here though during the day. which is why i get frustrated by the exclusive IRC attitude i've seen since i started programming in clojure a year and a half ago.

16:20 technomancy: that's fair.

16:22 technomancy: i'll fork/clone the repo now and spike on something as soon as i have a chance. i didn't realize it was a pain point until about 15mins ago.

16:22 amalloy: for example, Fare, clojure.core.match/val-at* is a function dnolen_ apparently includes to be slightly different from get in some way, which he uses when matching against maps

16:22 Fare: ok

16:23 so, that would be: using instaparser in a macro

16:24 I suppose that's ok to include instaparser in the jar even if not used at runtime

16:25 noprompt: technomancy: do i need to add a special email subject?

16:26 technomancy: noprompt: just make it clear that it's about sensitive data vs a typo or something

16:30 bracki: How can I turn on NSCA formatted request logging when using the ring-jetty-adapter?

16:32 noprompt: technomancy: this is code that belongs to the company.

16:35 johnwalker: in clj-http, is there a way to do --data-binary like in curl?

16:36 dakrone: johnwalker: you can send a byte array in {:body my-byte-array}

16:37 johnwalker: ahh, nice dakrone

16:48 bacon1989: I'm finding it really hard to find an example of reading an input stream using a buffer

16:48 there's an example here http://stackoverflow.com/questions/7756909/in-clojure-1-3-how-to-read-and-write-a-file

16:48 but it's using line-seq, my string doesn't have any 'lines'

16:48 it's a giant base64 dump

16:49 so I think the slurp function is failing to grab the entire contents of my output, because it's truncating after a certain amount of time

16:49 (assuming it's using line-seq)

16:58 Fare: is anyone here going to ILC'2014, Aug 15-17 in Montreal?

16:58 I'd like to organize a panel there, and someone who knows more clojure than I would be welcome to participate.

17:04 gfredericks: $google ILC 2014

17:04 lazybot: [International Liver Congress 2014: ILC 2014] http://www.ilc-congress.eu/

17:06 Fare: http://international-lisp-conference.org/

17:06 TEttinger: that makes more sesne

17:06 sense

17:07 gfredericks: would love to be invited to the liver congress as a clojure expert

17:12 technomancy: as the owner and operator of a liver you should be uniquely qualified

17:13 arrdem: heh

17:13 gfredericks: technomancy: so insensitive of you to assume that everybody you talk to on the internet has a liver

17:14 TEttinger: ,"yeah!"

17:14 clojurebot: "yeah!"

17:14 technomancy: fine, *former* owner of a liver

17:15 gfredericks: experienced with livers

17:21 thecatwasfat: i'm getting an "OutOfMemoryError Java heap space" message when trying to generate prime numbers: http://pastebin.com/yahkLxai

17:21 rurumate: langohr seems complex enough to use stuartsierra-style component pattern, has anyone done that yet?

17:21 thecatwasfat: is it because i'm creating too many "nums" sequences that don't get discarded?

17:25 johnwalker: what is an alternative to clojure data xml?

17:26 actually, i bet there's something more like hiccup

17:27 halogenandtoast: Is there any benefit to (nth (:decks game) index) over ((:decks game) index)? given (:decks game) returns a Vector

17:28 amalloy: johnwalker: there's a function in c.d.xml that converts hiccupy sexprs into c.d.xml values

17:28 johnwalker: amalloy: is there one that converts c.d.xml values into hiccupy sexprs?

17:29 (does the opposite)

17:30 amalloy: johnwalker: i don't see one. really, working with hiccup values is awfully unpleasant: hiccup's notation exists because it's easy for humans to type in

17:30 if you already have something in a nice computer-friendly format, why convert it to this hiccup soup?

17:30 johnwalker: hiccup soup looks nicer

17:31 and the pretty printed values use ( instead of [

17:31 which kills the reader whenever you want to just store them as vars

17:32 amalloy: i don't understand your objections at all; but it's trivially easy to write a transformer to hiccup style yourself if you want

17:34 johnwalker: to be clearer, hiccup's vectors are convenient because [:h2 "aoeu"] doesn't try to call :h2 on "aoeu"

17:34 i am slightly annoyed that i can't use cider pprint directly on parsed xml

17:35 amalloy: unless you're eval'ing these things for some crazy reasno, neither does (:h2 "aoeu")

17:35 johnwalker: then there is an easy way to do (def foo (:h2 "aoeu")) unevaluated?

17:35 TimMc: johnwalker: Just throw a ' in front

17:36 ,'(:h2 "aoeu")

17:36 clojurebot: (:h2 "aoeu")

17:36 amalloy: johnwalker: your use case is that you're printing things to stdout, and then copy/pasting them into vars?

17:36 johnwalker: but these are nested structures

17:36 yeah basically

17:36 TimMc: ,'(:h2 "aoeu" (:h2 "more")) ;; so?

17:36 clojurebot: (:h2 "aoeu" (:h2 "more"))

17:37 amalloy: well, at last we've gotten to the real problem, which is nothing to do with hiccup or xml

17:37 johnwalker: ,'(:h2 "aoeu (:h2 (for [i (range ...)] ..)))

17:37 clojurebot: #<RuntimeException java.lang.RuntimeException: EOF while reading string>

17:37 TimMc: johnwalker: Ah, so you'll be wanting ` and ~

17:38 &'(:h2 "aoeu" ~(str "a" "b") ~@(range 4))

17:38 lazybot: ⇒ (:h2 "aoeu" (clojure.core/unquote (str "a" "b")) (clojure.core/unquote-splicing (range 4)))

17:38 TimMc: &`(:h2 "aoeu" ~(str "a" "b") ~@(range 4)) ;; whoops

17:38 lazybot: ⇒ (:h2 "aoeu" "ab" 0 1 2 3)

17:38 johnwalker: i am not a big fan of this solution

17:38 TimMc: johnwalker: Just so you know, though -- hiccup is prone to XSS.

17:38 ybit3: if anyone has a bit of time to spare, i could use some help in getting this to compile: https://gist.githubusercontent.com/heath/406917c7d57c5fcf46fe/raw/54b6b30102e5706775dadd6b3d6e46c5e69d8295/gistfile1.txt

17:39 amalloy: copy/pasting printed forms back into source is never going to have a pretty answer

17:39 ybit3: it compiles to incorrect js

17:40 amalloy: ybit3: you didn't even include the clojurescript you want help with!

17:40 johnwalker: cough homoiconicity

17:41 ybit3: amalloy: it's from the clojurescript wiki entry "getting started"

17:41 i'll paste anyway

17:41 https://gist.githubusercontent.com/heath/7a242e1e9cbe643ebdf1/raw/fa9d69ea353ee0cf5bd3a15444e1806a7bc6c1f6/gistfile1.txt

17:41 johnwalker: i didn't know that hiccup had xss issues

17:42 thanks TimMc, amalloy

17:42 halogenandtoast: Aww I used lein-kibit hoping it would output a bunch of things I was doing wrong… got nothing :(

17:42 ybit3: hm, let me remove the (ns.. at the bottom

17:43 (hsenv) is me copying/pasting incorrectly

17:43 sdegutis: Anyone using noprompt's garden lib?

17:43 I'm trying to figure out how to generate "tr:nth-child(2n)" without resorting to just using a string literal.

17:43 noprompt: yo

17:43 sdegutis: ohai

17:43 TimMc: johnwalker: Most HTTP templating libs do (and not just in Clojure-land.)

17:44 sdegutis: noprompt: is this possible?

17:44 TimMc: I think ato has a patch that fixes it by introducing RawString.

17:44 noprompt: sdegutis: yeah, i mean a string literal is fine, what else would you use?

17:45 johnwalker: ahh, i'll keep an eye out for that

17:45 sdegutis: noprompt: there's just so many utility functions to generate stuff, I thought maybe I was overlooking something

17:45 noprompt: sdegutis: i have some work on a branch for *way* better selectors but i haven't merged it yet.

17:45 sdegutis: ok

17:46 noprompt: sdegutis: for that one (defn nth-child [n] (format "&:nth-child(%i)" n))

17:47 sdegutis: i realize there's a lot of missing stuff in the library and i've been encouraging people to send me patches.

17:47 TimMc: johnwalker: https://github.com/ato/clojars-web/blob/master/src/clojars/web/safe_hiccup.clj although you still have to watch out for ring accepting multiple args as a coll of strings, I think...

17:47 noprompt: i only have so much time in the day and i appreciate that sort of thing.

17:47 ybit3: here's a better paste showing directory and file contents as well as compiler output

17:47 https://gist.githubusercontent.com/heath/7ce8a379c5840bf734ac/raw/ea45b6ddb21c990074a3d2ea51a326bafda41b56/gistfile1.txt

17:50 sdegutis: noprompt: it suffers from the problem of "good enough"

17:50 noprompt: also a project ive been working on just got suddenly popular and i cant step away from the computer for 5 minutes without getting 10 feature requests

17:51 noprompt: sdegutis: unfotunately, it isn't, imho. i've been pretty unhappy with it for a while. i just haven't been able to merge in some of the work i've been doing in silence.

17:51 sdegutis: which project?

17:51 sdegutis: noprompt: my osx window manager

17:51 noprompt: sdegutis: oh neat, which is it?

17:51 sdegutis: someone caught sight of it this weekend https://github.com/sdegutis/hydra/

17:52 its not the one that can be scripted in clojure.. that ones deprecated ;)

17:52 noprompt: sdegutis: this looks good! i've been using spectacle for a while, i should give this a shot.

17:53 johnwalker: TimMc: i'm really glad that i don't have to worry about ring lol

17:53 sdegutis: noprompt: :)

17:53 noprompt: if you run into anything, #hydrawm is a good place to get quick help

17:53 Jaood: sdegutis: you like atom?

17:53 sdegutis: Jaood: no sir, why?

17:53 Jaood: that green ball on dock looks looks like atom :P

17:53 sdegutis: heh

17:54 prolly limechat

17:54 noprompt: atom lol

17:54 sdegutis: youll also notice emacs there

17:54 technomancy: Tom Swift and his Atomic Text Editor

17:54 sdegutis: ohai technomancy

17:54 arrdem: technomancy: good grief it's been a long time since I heard that name...

17:54 technomancy: hihi

17:55 johnwalker: (inc dakrone)

17:55 lazybot: ⇒ 2

17:55 Jaood: sdegutis: looks cool, always wonder why OS X never had the key strokes for resizing windows like on windows7

17:55 johnwalker: (inc amalloy)

17:55 lazybot: ⇒ 141

17:56 johnwalker: (inc TimMc)

17:56 lazybot: ⇒ 62

17:56 sdegutis: Jaood: thx

17:56 Frozenlock: Jaood: because Mac users can't handle more than 1 window at the time. /troll

17:57 noprompt: hahahaha

17:58 OS X also has keyboard navigation disabled *by default* which is kinda lame.

17:58 sdegutis: wait there's keyboard navigation?

17:58 what kind do you mean?

17:58 noprompt: even my mom knows how to use the tab key to get to the cancel button.

17:58 technomancy: Frozenlock: if you can't even handle two mouse buttons then keyboards must look bewildering

17:58 sdegutis: oh yeah that

17:58 Frozenlock: loool

17:58 Forgot about the mouse thing

17:59 bbloom: honestly, that keyboard navigation thing really screws up a lot of people

17:59 noprompt: i imagine it'll take a generation before people forget the whole mouse thing.

17:59 bbloom: they use the arrows or tab or whatever, then try to type, assuming the focus is in a textbox, and wind up submitting or canceling

17:59 sdegutis: technomancy: well users can use my window manager to pretend they have two mouse buttons, maybe

17:59 bbloom: i've watched it happen quite a few times with people who even know how to type, but aren't great at computers

17:59 sdegutis: ok bye

17:59 bbloom: i think textbox-only for keyboard nav is a perfectly reasonable default for a mass market machine

18:00 noprompt: bbloom: geez man. take me to court already. ;)

18:01 bbloom: it really sucks that our choices are polished lowest common denominator, unpolished lowest common denominator, and downright raw crap for experts

18:01 noprompt: i've been bitten by it though too so i guess your point is fair.

18:03 * technomancy wanders off muttering about engelbart's violin

18:10 Frozenlock: I blame mobile for everything.

18:11 {blake}: Hey, all: I'm having trouble applying a function recursively. (It's here: https://www.refheap.com/87749). Basically, I've got a list of maps where each map has a single entry, but the key to that entry might be duped elsewhere in the list. So I draw out the key and put all the values of common keys together under one entry. Great--but now I want to do it with the resultant child lists.

18:13 bbloom: technomancy: i googled for engelbart's violin

18:14 technomancy: at first, i was hesitant, since loper-os usually means insane incoherent ramblings of an old crank

18:14 technomancy: but http://www.loper-os.org/?p=861 is actually pretty good

18:14 technomancy: haha, I know, right

18:14 immediate "uh oh, not this guy again" reaction, but in this case it's unfounded

18:15 bbloom: i don't think you're crazy for making your own keyboard, although i wouldn't do it myself...

18:15 but still, people give me shit over my kensis

18:15 TimMc: I also found this on loper-os: http://www.loper-os.org/wp-content/editors.png

18:15 mtd: =861 is actually pretty good

18:15 bbloom: ninesis, rather

18:15 mtd: ugh, sry

18:15 bbloom: i can't type

18:15 kinesis

18:15 mtd: bbloom: ...rocks :)

18:15 bbloom: anyway, they are like "i wanted to try one of those, but they were so expensive".... dude, it's 300 bucks. your boss shouldn't bat an eye if you wanted to order one just to try it out

18:16 you're gonna lose more than $300 in productivity the very first day you re-learn to type on it!

18:16 people dont' want to invest in their tools

18:16 it's nuts

18:17 Frozenlock: People or bosses?

18:17 bbloom: both

18:17 Frozenlock: everyone! :-p

18:17 technomancy: bbloom: the problem is once you realize everything is crap, you're stuck with it

18:17 arrdem: technomancy: ignorance truly is bliss :P

18:17 technomancy: bbloom: same with coffee, wine, PLs, etc

18:17 bbloom: lol

18:18 i don't buy the idea that learnability isn't important tho

18:18 software is unique in its adaptability

18:18 you can create software that scales with its users

18:18 Frozenlock: bbloom: Sounds like Emacs

18:18 bbloom: w/o resorting to a ton of "preferences" and settings

18:21 technomancy: it's a ton easier if your users are programmers though

18:21 bbloom: technomancy: hey, i did my part in ensuring that *all* users are programmers ;-)

18:21 gotta run tho, cya

18:22 technomancy: haha, yeah exactly

18:22 the fact that there's a difference between "being a user of a computer" and "being a programmer" is really just a shortcoming of existing software

18:23 Frozenlock: Indeed. I think the title divide is an obstacle in itself. "I won't try this, I'm not a programmer..."

18:23 noprompt: i tend to agree

18:23 AimHere: technomancy, if that's the case, isn't software getting worse?

18:23 technomancy: AimHere: I don't know; I don't pay attention to software that isn't for programmers

18:23 arrdem: hahaha

18:23 technomancy: probably

18:24 noprompt: lol

18:24 AimHere: Well at one time there wasn't software that wasn't for programmers. Now there is.

18:25 Frozenlock: Everything's getting worse. Software, laws, TV...

18:26 Except bacon. Bacon is always good.

18:26 turbofail: cars that no longer kill you. what's the world coming to?

18:26 sdegutis: noprompt: umm, just how much is the garden api going to change?

18:26 noprompt: because I'm currently putting in a lot of effort to convert our plain CSS to garden

18:26 noprompt: and I'd love to avoid doing this a second time

18:27 technomancy: increased resources result in greater breathing room, meaning more space in which things can flourish which would otherwise crash and burn from the weight of their own imperfection

18:27 (independent of any value judgement)

18:28 Frozenlock: turbofail: I'm still waiting to see how this turns out... the biggest challenge might not be technical, but legal.

18:30 TimMc: Frozenlock: Yes, the question of liability becomes rather more front-and-center than it is with (say) mistakenly bounced email.

18:31 turbofail: More like... cars that can kill you instead of drivers that can kill you. :-P

18:32 turbofail: i was actually more referring to how older cars would send the engine block through your torso instead of crumpling nicely

18:32 TimMc: Oh! Yeah, that's a nice thing.

18:32 Although the '85 Volvo I learned to driv eon would apparently shunt the engine out the bottom instead...

18:32 clojurebot: I don't understand.

18:33 TimMc: This is not from first-hand experience, however -- just what I heard.

18:33 amalloy: hey, i learned on an 86 volvo. we're like twins!

18:33 TimMc: Did you also once run a lawn tractor into it?

18:34 amalloy: lawn...tractor? some sort of suburban farming implement?

18:34 TimMc: Riding lawn mower, but witha towing hitch on it IIRC.

18:34 Basically.

18:35 My dad ran a seed company on our 2 acre property. That machine got a lot of use, and not just for mowing.

18:37 tuft: tesla's have a nice crumple zone =)

18:38 TimMc: tuft: Your luggage?

18:38 amalloy: the ' in tesla's is serving as a crumple zone too

18:40 tuft: i'd rather have luggage in my lap than an engine block =)

18:47 wow, garden+clojurescript+hiccup would be some kind of nirvana =)

19:08 TEttinger: $google tesla stolen chase crash

19:08 lazybot: [Stolen Tesla involved in high speed chase, crashes, splits in two in ...] http://wgntv.com/2014/07/06/stolen-tesla-involved-in-high-speed-chase-crashes-splits-in-two-in-california/

19:08 TEttinger: tuft:

19:11 tuft: woah

19:12 amalloy: hey, i lived just three or four blocks from that intersection a year ago

19:13 how come i never got to see any exciting tesla crashes?

19:13 TEttinger: you wouldn't want to be near that guy...

19:13 so much collateral damage

19:13 p_l: didn't they recently claim you can't steal a tesla because of remote killswitch?

19:14 amalloy: you can't steal a tesla because it's illegal, silly

19:14 (aside: tesla and steal use the same letters. coincidence? you decide)

19:14 p_l: amalloy: the line goes "coincidence? I think not" :P

19:14 amalloy: i think they both work

19:14 tuft: yeah you'd think they could kill it

19:14 probably off hours?

19:15 anyway, wonder how a gas car would have faired

19:15 p_l: tuft: lost reception :P

19:15 tuft: haha yeah

19:15 he was switching towers too fast

19:15 doing the ol' 4g shuffle

19:15 p_l: n.b. if you can get a tesla owner to install your certificate into trusted store on his iphone or android, you can then steal his credentials for the car

19:15 amalloy: 'A coincidence is actually a conspiracy without the "???? You decide!" at the end of it. Simply by adding "??? You decide!" any coincidence becomes a government conspiracy carried out by the Jews.'

19:17 tuft: glen beck "just asks questions"

19:19 sritchie: dnolen_: hey david, is there some way to apply the om.dom functions?

19:19 (d/div {} "hi") vs (apply d/div {} [“hi”])

19:20 I see in dom.clj, gen-react-dom-fns makes it look like the generated funcs should do the trick

19:20 amalloy: sritchie: iirc there are foo* variants. i remember someone applying div*

19:21 sritchie: ah, looks like it works - I was calling om-tools.dom by accident

19:21 which provides macro-only wrappers, I guess

19:22 cespare: How can I catch an exception in a macro?

19:22 amalloy: not div* then, just div. okay. maybe next time i'll remember

19:22 cespare: same as anything. generate the code that works to catch exceptions outside of macros

19:24 (defmacro with-dangerous-errors [& body] `(try (do ~@body) (catch Throwable t# (format-hard-drive)))

19:25 cespare: fair enough. I'm testing a macro and asserting that it rejects certain bad inputs

19:25 is this the right way to go about it?

19:26 amalloy: if you want to catch the exceptions at compile time, then you want to call macroexpand by hand, instead of letting the compiler do it

19:26 cespare: s/compile /run/ ?

19:26 amalloy: since you can wrap a try around that, but any try around an actual use of the macro will come "too late": when the code is run, rather than when it's compiled

19:27 no

19:27 you're saying your macro throws exceptions at compile time, if you give it an input it doesn't like

19:28 cespare: right. Wouldn't my new exception-catching macro wrapped around that work?

19:28 amalloy: no

19:28 you throw the exception at compile time, but any try exprs wrapped around it are only in effect at runtime

19:28 (try (fasfasgsdfs) (catch Exception e nil)) is still going to fail

19:29 because it fails while compiling this nonsense symbol, long before the try block is actually entered, which is at runtime

19:30 cespare: ok, so i need the exception-catching macro and macroexpand?

19:30 amalloy: you don't need an exception-catching macro

19:31 just (try (macroexpand '(...)) "no exception" (catch Exception e "exception"))

19:31 cespare: doesn't that macroexpand happen at runtime?

19:32 amalloy: yes, which is exactly when the try block is in effect

19:32 and is when your tests are run

19:32 cespare: got it. so my s/compile /run from earlier was correct

19:32 you said compile time

19:32 which confused me

19:33 amalloy: it was too vague to be correct in any interesting way. the macro is throwing exceptions at compile time; you're catching them at runtime by actually calling it via macroexpand instead of via the compiler

19:43 {blake}: OK, so I'm creating a map of lists from a list of maps by drawing the common keys of the lists up and compiling all the values of those keys. At the top level, this works, but now I have to go to the created lists and do it again. Recurse, but going down instead of up.

19:44 Here's what I have: https://www.refheap.com/87749 .I'm stumped on how to proceed.

19:45 amalloy: {blake}: you should at least include what output you wish you could get. "needing to do this with XYZ also" isn't very specific

19:47 {blake}: amalloy, Fair enough. Having collected the values for :L1 under one key, I want to collect all the value for :L2 under one key. And so on in that fashion until all humans have been eaten.

19:48 amalloy: {blake}: try writing out, as an actual clojure value that would be accepted by the reader, the result you want to get. i don't think it's as clear as you think

19:48 {blake}: OK, I updated https://www.refheap.com/87749 to show the next level.

19:49 Well, wait, I could just output what I get when I do the call manually.

19:50 amalloy: what i'm getting at is, what are you going to do when the hierarchies diverge? you need some values "at" L2, and some to live "under" it in L3 somehow

19:50 and how do you distinguish "stuff" from "L3" in the transformation, if the only arg you pass is sxml and not a list of keys you're interested in

19:51 {blake}: amalloy, If I do this: (draw-forward (val (first (draw-forward sxml))))

19:51 I get the desired result: {:L2 ({:stuff :data1} {:L3 ({:stuff :otherdata1})} {:stuff :data2} {:L3 ({:stuff :otherdata2})})}

19:52 Except, of course, disassociated from the original structure.

19:52 tuft: ugh, i hate how args can be either named or position in python per invocation. really confuses matters when trying to make nice polymorphisms.

19:52 s/position/positional/

19:53 amalloy: so, you say "I need to do this with :L2, :L3, etc", but then when i asked for the result you actually wish you got, you seem to have only done something with :L2. what do you wish happened with :L3?

19:54 {blake}: Well, I thought I would get the same thing for :L3 (and :stuff, for that matter).

19:54 In other words: Give a list of single-entry maps, create a new map of the common keys' values aggregated together.

19:55 Er, given.

19:55 amalloy: so you don't in fact want to distinguish between :Ln and :stuff at all; you intend them to be treated similarly

19:56 {blake}: amalloy, Right. I agree that's confusing, but I either want that stuff aggregated or dropped, so I'm not too worried about it.

19:57 amalloy: {blake}: the point i'm making is that having a clear, well-defined problem is important in asking for help, and one really good way to do that is to state what output you expect. we've spent ten minutes now going back and forth over your original question because you haven't put your actual goal into it

19:58 in that time, a well-defined problem could already be solved

20:00 {blake}: amalloy, I apologize. I thought my goal of aggregating the common keys was clear. But then, if I weren't confused in some fashion, I probably wouldn't need help.

20:01 (Like, I tried resolving that last layer manually and am getting an error, and I can't see why.)

20:01 amalloy: {blake}: right. things can seem clear to you, and it's hard to know what will actually be clear or not. that's why i suggest writing down something concrete, like a clojure value, because that's harder to misinterpret

20:02 {blake}: amalloy, Yeah, I had that earlier on, but took it out because it seemed more confusing to me than "do this again". Go figure.

20:05 So that "draw-forward" code fails when there's multiple keys.

20:05 amalloy: {blake}: https://www.refheap.com/df790a776292225c5e0a374ab

20:07 i hereby declare it undefined behavior if you give my function input like '({:L1 x}, {:L1 ({:L2 x})}), though - it wants a consistent hierearchy

20:08 seq->deep-map is your draw-forward function, in case that's not clear

20:09 {blake}: amalloy, I got that. Just looking at and trying to figure it out.

20:10 amalloy: the idea is to traverse that seq of seqs of maps, producing a seq like [[:L1 :L2 :stuff :data1] [:L1 :L2 :stuff :data2]], and then reduce over that seq to build a map

20:11 {blake}: amalloy, Thanks...right, and I toyed with doing a test for a sequence vs. map.

20:11 amalloy: yeah, i wasn't sure how structured your input data is, so glossing that distinction over was easiest

20:12 {blake}: I =think= it's more structured than my actual samples, but since it's not my data, I was erring on the cautious side.

20:13 cespare: Why does this test pass in my repl but fail under 'lein test'? http://pastie.org/9365787

20:13 amalloy: ^^ related to prior discussion

20:13 {blake}: (inc amalloy)

20:13 lazybot: ⇒ 142

20:13 seangrove: (dec amalloy) ;; keep egos in check

20:13 lazybot: ⇒ 141

20:13 seangrove: (inc amalloy) ;; but just can't do it, really

20:13 lazybot: ⇒ 142

20:13 seangrove: (inc amalloy) ;; and a bit more

20:13 lazybot: ⇒ 143

20:13 amalloy: ,(symbol "(inc amalloy)")

20:13 clojurebot: (inc amalloy)

20:14 amalloy: aw. i forgot we fixed that

20:14 seangrove: Yeah, looooong time a go

20:14 {blake}: What would it do?

20:14 amalloy: i dunno, cespare. seems it should pass in any conceivable universe

20:15 cespare: amalloy: my coworker can repro as well.

20:15 amalloy: {blake}: it was a trick to get clojurebot to inc your karma by proxy, since lazybot won't let you do it

20:15 cespare: expected: (thrown? Exception (macroexpand-1 (quote (foobar)))) actual: nil

20:15 {blake}: So, sort of like manipulating your divorced parents.

20:16 amalloy: cespare: is foobar actually in scope? if you're not referring it into your test namespace, then (foobar) just expands to (foobar)

20:16 cespare: amalloy: in my toy example it's defined literally right above the test

20:17 amalloy: hmmmm. i'm not sure what namespace tests are run "in". probably clojure.core. try replacing the ' with a `

20:17 cespare: amalloy: ok. I'm also just gonna print what it expands to; that'll probably show the issue you're talking about.

20:22 amalloy: you were correct, thanks

20:27 amalloy: cespare: it's easy to forget how macroexpand works, since it's usually only called from the repl. i certainly had

20:29 PigDude: so i came in asking about this a couple days ago ... using core.async, why don't i see stacktracess?

20:29 any error in a go block i only see the error message, no line number or stack trace. my program does not handle any exceptions

20:29 i usually can infer the error site but it is still a pain, line numbers are nice and i know the information is there

20:30 amalloy: PigDude: there's an old commit to core.async that added this "feature"; stuartsierra was in here last week vowing to fix it

20:31 PigDude: so is there any way to get at this info?

20:31 just curious

20:34 or maybe if you know the commit sha i could look at what changed and figure it out from there

20:35 amalloy: https://github.com/clojure/core.async/commit/9fcae99576c0735a804bbd4cbec81307e2d34d90#diff-2193dd8597437d6454bb74edd2f15e00L26

20:36 PigDude: noooooo haha

20:36 thank you amalloy

20:38 arrdem: so given core's propensity for making things that could be public private... why is this gem public and is it patch worth.. http://www.arrdem.com/grimoire/1.6.0/clojure.data/diff_DASH_similar/ https://github.com/clojure/clojure/blob/master/src/clj/clojure/data.clj#L75

20:41 amalloy: what would you want to patch about it?

20:42 arrdem: meh... the "real" fix is that you change extend so that it doesn't kick out defs here, but that doesn't make sense. not enshrining diff in core would be my "real" fix :P

20:59 startling: Any idea why the functions in tools.logging print things prefixed with clojure.tools.logging$eval4837$fn__4843 invoke ?

21:14 halogenandtoast: Is there any difference between (nth coll 1) and (coll 1)?

21:14 functionality wise, not syntax wise of course.

21:15 sritchie: nth works with all seqs,

21:15 I think (coll 1) only works with vectors

21:16 halogenandtoast: also, (coll 1) will still “work” with a map, it’ll just return the value associated with 1, or nil

21:17 halogenandtoast: Okay, makes sense.

21:18 dbasch: (coll 1) works with colls that implement IFn

21:19 and it means different things depending on coll's type

21:45 devn: oh whoa, cool

21:45 some interesting commits by rich on core.async

21:45 https://github.com/clojure/core.async/commit/99d2ffbb22f57b29a41220cfb292e4c286037e46

21:45 I missed those

22:22 Shayanjm: So in my application, I have to do _a lot_ of scraping + parsing (grabbing about 40 pages at a time & performing NLP sentiment analysis on the contents), which obviously takes quite a few resources and time

22:22 Is there a good framework where I can run computationally expensive functions on small external boxes?

22:29 TEttinger: mechanical turk

22:33 ttasterisco: Shayanjm: I probably don't know the answer to your question, but would like to know what exactly are you looking for?

22:33 i.e. a good framework?

22:34 Shayanjm: ttasterisco: essentially, I'm grabbing a bunch of data and applying a number of functions to it to transform it in a few ways before it's actually consumed

22:35 the total overhead to grab the data from a limited number of sources is getting a bit out of control on a single box (some 2.5GB memory usage + function takes >2 mins to run)

22:35 ttasterisco: yes, but what do you mean by a framework to run computationally expensive functions on small external boxes? talking without knowing, but wasn't that the whole point of google's map reduce? :p

22:35 Shayanjm: ehh, yes. I mean I could use hadoop but I don't really need the distributed storage half of it

22:35 TEttinger: ah, you just need the processors and RAM

22:36 Shayanjm: Yeah precisely

22:36 and the IPs at that, since it's scraping as well

22:36 TEttinger: there's gotta be an AWS thing from amazon

22:36 Shayanjm: Yeah maybe

22:37 ttasterisco: is your sentiment analysis self contained or are you hitting some service of yours in some other box?

22:37 Shayanjm: self contained

22:37 TEttinger: https://aws.amazon.com/documentation/ec2/ ?

22:37 Shayanjm: it runs on a trained neural net, so if I do end up building a distributed solution I'd need to figure out a way to persist that NN to all nodes

22:38 TEttinger: EC2 is all well and good, but I'd need an interface between the servers. They're not clustered by default

22:38 TEttinger: ah...

22:38 botnet?

22:38 Shayanjm: Yeah something like that lol

22:38 I'd need some sort of master-slave set up

22:38 maybe I'll just bake my own with RabbitMQ then...

22:38 TEttinger: I'm sure some russians would be happy to give you one, in exchange for an unspecified future favor

22:39 ttasterisco: Shayanjm: I would probably try and reorganize the architecture of the system. queueing things and all

22:39 Shayanjm: ttasterisco: the organization isn't the problem because the NLP functions are long-running by default

22:39 a lot of things -have- to exist in memory at a time because each piece of information builds on the other

22:40 TEttinger: how much memory does each box need?

22:40 ttasterisco: is the scraping/parsing shouldn't be that demanding

22:40 *no is

22:40 Shayanjm: ttasterisco: neither of them are. It's the sentiment analysis part of it

22:40 ttasterisco: is it logic dependent on the SA

22:40 ?

22:40 Shayanjm: Nah. SA is dependent on the results of a few transforms

22:40 well, the stuff that feeds into the SA function

22:41 TEttinger: good q. Right now I'm running it off my MBP with 2GB alloc

22:41 ttasterisco: what are you scraping, if I might ask

22:41 NYT?

22:41 Shayanjm: ttasterisco: a bunch of news sources, not just NYT

22:41 TEttinger: comments on youtube?

22:41 ttasterisco: ok

22:42 Shayanjm: currently on the list: BBC, NPR, Reuters, CNN, AP, NYT, The Guardian

22:42 planning on adding much more, but already hitting a little bit of a roadblock

22:43 arguably, I could reduce total memory allocation to the 'slave' nodes by persisting the trained NN state to something centrally visible

22:43 ttasterisco: I mean, if you would reorganize the system and assuming there's no big requirements, you could just get a few boxes scraping/parsing and dumping things into a queue and have some other boxes consume it and do the SA

22:43 but that's just me thinking loud

22:44 TEttinger: I'm curious if you could distribute it across some really cheap linux devices.

22:44 Shayanjm: That would be interesting TEttinger

22:44 I imagine spinning up an environment would be fairly expensive for the device though

22:44 TEttinger: clojure runs on ARM linux, right?

22:57 Frozenlock: Are there timeouts with ring? Say I upload something via a post request, will ring cut me out after a given time?

23:05 dbasch: Frozenlock: if you're uploading something via a post request, ring will not know until you're finished with the post. The web server may cut you out before that.

23:06 Frozenlock: ring receives the request from the web server

23:07 cespare: Suppose I have records R1 and R2, and R1 is defined as (defrecord R1 [^R2 f]). Suppose I have a macro that operates on record instances, and I pass in r (an R1). How can I discover that (.f r) is an R2?

23:07 seancorfield: I'm starting to look at ZeroMQ (it's been on my list for a while!) and see there's a "standard" Clojure library, cljzmq, which seems to be "just" a wrapper around the Java API, and there's zmq-async from Kevin Lynagh, which wires ZeroMQ up to core.async which looks very interesting

23:08 Frozenlock: dbasch: o_O I always believed ring WAS the webserver (and compojure just some sugar on top).

23:08 akhudek: seancorfield: why not higher level message queues such as hornet or rabbit?

23:08 seancorfield: akhudek: because I don't want to deal with the whole server/broker/clustering crap shoot mostly :)

23:09 dbasch: Frozenlock: the default web server is jetty

23:10 wildnux: Hi, how can i check what packages are loaded in repl in current namespace

23:10 Frozenlock: The tower of abstraction is collapsing all over my me

23:11 So if I get this right, *if* I eventually get a timeout, it will be from jetty. Correct?

23:11 seancorfield: I like the idea of just using core.async in my code and having it "magically" spin off to ZeroMQ, but it's not entirely clear what state Kevin's library is in...

23:11 ttasterisco: Frozenlock: jetty or any other webserver you use. e.g. you can use http-kit

23:11 dbasch: ,(all-ns) ;; wildnux

23:11 clojurebot: (#<Namespace clojure.uuid> #<Namespace user> #<Namespace clojure.core> #<Namespace sandbox> #<Namespace clojure.repl> ...)

23:12 puredanger: (loaded-libs)

23:12 akhudek: seancorfield: as far as I know zeromq is pretty low level and so you lose a lot of stuff such as durability etc. Guess it depends on your needs though.

23:12 wildnux: dbasch: thank you

23:13 dbasch: wildnux: that's namespaces, if you want libraries it's what puredanger said

23:13 ttasterisco: ,(loaded-libs) ; does this work here?

23:13 clojurebot: #{clojure.core.protocols clojure.instant clojure.java.io clojure.repl clojure.string ...}

23:13 wildnux: puredanger: thank you,

23:13 puredanger: either may be useful :)

23:13 ttasterisco: ;nice

23:13 seancorfield: akhudek: but you haven't actually used ZeroMQ I gather?

23:13 it would be nice to get input from someone who has

23:14 akhudek: seancorfield: nope, we use rabbitmq which we are more or less happy with. There are some annoyances regarding administering the server though.

23:14 seancorfield: preferably someone who's used both the "official" cljzmq wrapper and zmq-async - and who has previously used more traditional MQ style solutions

23:15 hellofunk: anyone have any advice on using several tiny, focused atoms vs one large deeply nested atom? which would be better performant or better in practice? i'm using clojurescript if that matters.

23:15 ztellman: seancorfield: what are you trying to accomplish?

23:15 typically ZeroMQ is a nicer TCP

23:15 seancorfield: akhudek: I've worked with FioranoMQ and ActiveMQ quite a bit in the past - which is why I'm trying to avoid that sort of thing now :)

23:15 ztellman: comparing it to any other "queue" is basic apple to overengineered orange

23:16 seancorfield: ztellman: yeah, mostly I want a flexible way to communicate between processes (possibly locally, possibly distributed)

23:16 Frozenlock: hellofunk: I usually prefer using many atoms. It helps my small brain and I can more easily print/save it if needed.

23:16 ztellman: seancorfield: how mission-critical are the messages?

23:17 puredanger: hellofunk: you can't coordinate changes across multiple atoms (all or nothing). not necessarily a problem for many use cases though.

23:17 seancorfield: ztellman: some are fairly mission-critical (nothing financial tho'), some are really just aggregate log data

23:17 Frozenlock: hellofunk: If you want to use tools like this one, you should use smaller atoms. https://github.com/alandipert/storage-atom

23:17 ztellman: seancorfield: if you care about guaranteed delivery, don't use ZeroMQ

23:17 hellofunk: Frozenlock thanks, that's what I'm doing now (many smaller atoms)

23:17 ztellman: and if you use something other than ZeroMQ for those messages, better to piggyback on that for less important messages unless you everwhelm it

23:17 overwhelm*

23:19 seancorfield: ztellman: my processes are pretty much 100% up so i'm not worried about durability in that respect but delivery guarantees would be rather useful :)

23:19 ztellman: processes being alive != durability

23:19 hellofunk: Frozenlock that web storage stuff seems pretty interesting, had not heard of that before

23:20 ztellman: or rather, without guaranteed delivery the processes being alive doesn't give you much

23:20 I'd look at Rabbit et al, honestly

23:20 even though they're kinda ungainly and typically pretty overengineered

23:21 Frozenlock: hellofunk: It's pretty sweet for cross-windows propagation. Here, try this small demo https://peaceful-caverns-2604.herokuapp.com/

23:21 seancorfield: ztellman: any good clojure library to make jms less painful to work with?

23:21 Frozenlock: (in many windows)

23:21 ztellman: seancorfield: dunno, not something I've had to tangle with

23:22 seancorfield: ztellman: I thought you'd done stuff with distributed messaging...?

23:22 ztellman: not using JMS

23:23 seancorfield: ah, aleph, is "just" async messaging over a variety of protocols...?

23:23 ztellman: aleph is TCP, UDP, HTTP

23:23 plus a few others that are small layers atop those

23:24 dbasch: seancorfield: Kafka comes with a java client

23:24 seancorfield: ztellman: so no guaranteed delivery there either... fair enough...

23:25 wildnux: puredanger: if there are multiple namespaces loaded in repl, does (loaded-libs) show from all of them or just the current one?

23:25 seancorfield: dbasch: hadn't heard of Kafka... will take a look thanx!

23:25 puredanger: wildnux:

23:26 wildnux: it shows all namespaces ever loaded

23:27 wildnux: I'm guessing when you say "multiple namespaces loaded in repl" maybe you mean "namespaces that have been 'use'd such that their vars can be used without qualifying"?

23:29 wildnux: puredanger: I am very new :D forgive me if my questions dont make any sense. lets say i loaded a repl, i tried a few expressions in user namespace

23:30 puredanger: wildnux: no worries. :)

23:30 wildnux: patrickod: and then i loaded another namespace from the app.clj i am working on (in emacs cider using C-c M-n)

23:30 puredanger: ^^

23:31 puredanger: and if i do (loaded-libs) will it show libraries that is loaded by repl by itself or only the libraries loaded because of my app.clj ?

23:31 puredanger: wildnux: (you might find this video to be useful http://www.infoq.com/presentations/Clojure-Namespaces-Vars-Symbols )

23:32 when you want to dig deeper

23:32 wildnux: puredanger: thank you i will certainly watch it. I have been watching youtube videos to learn clojure

23:32 puredanger: Clojure keeps track of all the namespaces that have been loaded - that's (loaded-libs)

23:33 you also have a "current" ns - typically that's what your repl says or just look at special var *ns*

23:33 a namespace has vars defined in it (things you created with def or defn mostly) - the fully qualified names of those vars is the current-ns/the-var

23:34 seancorfield: dbasch: Kafka looks interesting - thanx - and not too horrible to manage a cluster of :)

23:34 puredanger: so if you (def a 1) in user namespace, you created a var referred to by user/a

23:35 you can refer to vars in namespaces outside your current namespace by using the fully-qualifeid named (things like clojure.string/join)

23:36 for that to work, the namespace has to be loaded (either already compiled or as source and compiled) - that's what "require" does

23:36 you can also ask to bring all of another namespaces vars into your own namespace so they don't need to be qualified. that's what "refer" does

23:37 you may also have seen "use" (generally considered deprecated in the ns macro, but still useful at the repl) - use will require (load the library) and also refer all of the other namespaces symbols into the current ns

23:39 wildnux: hopefully any of that helped expose a little of the underlying model. when you switch to the the app ns, you are just changing *ns* and everything now is in terms of the app ns. vars declared in app available without qualification. if the app ns referred in other namespaces, their vars might also be available without qualification. Any loaded library var is available fully-qualified.

23:41 hellofunk: anyone know what namespace dissoc-in resides in now? used to be contrib.core but i believe the contrib libraries are deprecated?

23:43 puredanger: hellofunk: it's not in core. you could get it from medley: https://github.com/weavejester/medley

23:44 hellofunk: puredanger: ok. i thought the "old" contrib libraries were migrated to other clojure org libraries, but maybe not all were

23:44 puredanger: hellofunk: not everything

23:46 wildnux: puredanger: wow, that made it all clear

23:46 puredanger: your explanation.

23:50 hellofunk: puredanger: i added the medley dependency, restarted cider, then tried this: (refer 'medley.core) but it indicated there was no such namespace

23:51 puredanger: nevermind, forgot to load it. got is all now.

23:52 *it

23:53 puredanger: wildnux: there are a bunch of functions to explore various aspects of a particular namespace's state - they all start with "ns-" so use (find-doc $"ns-") to see them. most take a namespace so use *ns* for that. happy exploring.

23:54 Frozenlock: ,(find-doc $"ns-")

23:54 clojurebot: #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: $ in this context, compiling:(NO_SOURCE_PATH:0:0)>

Logging service provided by n01se.net