#clojure log - Oct 13 2014

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

0:59 justin_smith: squeedee: cool, glad you figured out something you like

2:47 edbond: how can I find out why my main function hangs? I have only prn there, 'lein run' hangs after printing text

2:47 there is also an INFO about MLog using standard logging

2:48 I commented all db connecting defs, use postgresql and riak

2:48 try to use visualvm but don't know what to look for

2:52 ok, it seems to work now. it seems it was riak connection in def

3:02 nope, issue still remains

4:57 donbonifacio: hello. I usually create a let with a couple of operations inside, and that doesn't feel quite right. Is there a better way to achive this: http://pastebin.com/qJ0B2T2s

4:58 ro_st: donbonifacio: nothing wrong with that at all

4:59 you could move s1 up above the first a, and then use (-> (do-something) (do-something-else 1 2) (do-something-even-else) (more-logic s1))

4:59 that is, use a threading macro to describe the workflow rather than successive let bindings

5:00 that presupposes that each function returns something you can use as the first (for ->) or last (for ->>) argument for the next function in the thread

5:00 clgv: donbonifacio: looks like you should use threading as ro_st suggests

5:00 ro_st: often it's easier to start with the let and refactor once you get a sense of the shape of things

5:01 as sometimes you might have functions along the way where the arg order doesn't support a natural threading

5:03 donbonifacio: I see

5:04 I confess that I'm not yet confortable with the ->'s

5:04 that's like comp right

5:09 ro_st: it's actually very simple. it takes expr 1's result and injects it into the first (->) or last (->>) arg of the next function call

5:10 (-> 10 (/ 2)) is 5, (->> 10 (/ 2)) is 0.2

5:10 that's the whole story

5:11 donbonifacio: iep, thanks ro_st :)

5:18 clgv: donbonifacio: no, it is different from `comp`

5:21 donbonifacio: kay, I'll study that. thanks :)

5:26 mbuf: for time series data, is it recommended to do de-duplication of data at the database level rather than the application level, since, clojure uses immutable data structures?

5:28 schmir: mbuf: you'll be able to do deduplication in clojure

5:29 rurumate: There's a line in Compiler.java that bothers me. It seems that symbols whose name starts with "def" are treated in different ways than others. What are the implications of this? Is it specified anywhere? Why not limit the exception to the exact name "def"? see https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Compiler.java#L6759-6762

5:29 mbuf: schmir, are there any examples that I can refer? the context is that I receive streaming data, and I only need to forward delta or diff changes to another service

5:31 rurumate: After replacing the .startsWith by .equals, it seems to work the same. Is this a bug / unexpected behaviour waiting to happen?

5:33 kungi: I am trying to extend a protocol I imported from another namespace. https://gist.github.com/Kungi/9b57125166da81c0fdda

5:33 rurumate: Why should a function named "define-foobar" be treated differently, in any way, by the compiler than one named "create-foobar"?

5:33 kungi: But I get the error that a function defined in the protocol is not resolvable in this context?

5:34 schmir: mbuf: partition-by may help

5:34 ,(partition-by :x [{:t 0 :x 1} {:t 1 :x 1} {:t 2 :x 0}])

5:34 clojurebot: (({:t 0, :x 1} {:t 1, :x 1}) ({:t 2, :x 0}))

5:36 mbuf: schmir, so the service must send (expected output) :t 0 :x 1 first and then :t 2 :x 0

5:37 schmir, since the value of :x has changed only during these specific times

5:38 Bronsa: rurumate: that's one odd bit on the Compiler, I've spent a good amount of time trying to find a bug caused by that but I haven't found one yet

5:38 rurumate: why not just change it?

5:39 Bronsa: I don't have the authority to do that :)

5:39 rurumate: can we write an email to someone who has?

5:39 SagiCZ1: is clojure object oriented? if not, why does it have objects?

5:40 rurumate: SagiCZ1: "object oriented" is a vague term

5:40 schmir: mbuf: partition-by allow you to partition the stream. but you may be better off by using an atom to store the current value and send a new value when you see it. partition-by won't give you the new value immediately

5:40 kungi: rurumate: That's a very vague answer :-)

5:40 SagiCZ1: rurumate: no its not. everyone knows that C# and java are object oriented

5:40 Bronsa: rurumate: the contribution process takes time, changing bits of the Compiler is done only when there's a bug

5:40 kungi: SagiCZ1: then by that definition. No! clojure is not object oriented

5:41 rurumate: SagiCZ1: those are examples, not a definition

5:41 schmir: it's even possible to do OO in java: http://www.infoq.com/presentations/It-Is-Possible-to-Do-OOP-in-Java

5:42 SagiCZ1: schmir: why wouldnt it?

5:42 mbuf: schmir, thanks!

5:42 schmir: SagiCZ1: watch the talk. I haven't seen it, but I've recently read a blog entry that refers to that talk.

5:43 Bronsa: rurumate: there are a lot more things I would refactor on Compiler.java more important than that one

5:44 rurumate: Bronsa: why not just fork clojure then

5:44 Bronsa: rurumate: I don't have the time to maintain a fork

5:44 rurumate: time, it's a common problem

5:45 Bronsa: for example, what would be important to refactor? maybe we can at least start collecting these things somewhere

5:45 schmir: SagiCZ1: http://c2.com/cgi/wiki?AlanKaysDefinitionOfObjectOriented

5:46 Bronsa: rurumate: I already rewrote the clojure compiler in clojure :)

5:47 I don't want to mess with Compiler.java anymore, other than for fixing bugs in it

5:47 rurumate: https://github.com/clojure/tools.analyzer.jvm https://github.com/clojure/tools.emitter.jvm if you're interested

5:50 rurumate: yes definitely interested

5:53 Bronsa: rurumate: the backend (t.emitter.jvm) still needs some work, the frontend OTOH is fairly mature and already in use by a bunch of big libraries

5:53 rurumate: Bronsa: it seems you're writing a complete compiler, but it's split in two projects. is it "self-hosting" yet, in the sense that "compiler can compile itself"?

5:54 SagiCZ1: could anyone possibly make clojure run on .NET?

5:55 Bronsa: SagiCZ1: https://github.com/clojure/clojure-clr

5:55 kungi: SagiCZ1: There is clojure on the common language runtime as far as I know http://clojure.org/clojureclr

5:55 hyPiRion: SagiCZ1: http://clojure.org/clojureclr

5:55 SagiCZ1: wow sweet

5:55 thanks

5:56 Bronsa: rurumate: it can compile clojure.core, I haven't tried compiling it with itself but I'm confident it should be able to after a proper bootstrapping phase

6:00 rurumate: Bronsa: I see it uses leiningen, and leiningen usually puts the clojure-1.6.0 jar in classpath. So in a way, it still depends on clojure binaries? It's ok to depend on clojure.core, as that is a clojure library not java. What would be really nice is to have a standalone jar of clojure.core without Compiler.java and such bundled with it.

6:01 Bronsa: rurumate_afk: yes it needs the whole clojure runtime right now

6:01 rurumate_afk: I have no plans to work on making it self-hosting & strip away the RT dependencies on the near future

6:02 there are more important things that need to be done before, and again, my time is finite

6:07 cfleming: Bronsa: Can t.e.j be used to AOT code at the moment?

6:08 Bronsa: cfleming: no unfortunately, there's only load/eval, no compile

6:08 cfleming: Bronsa: Bummer, I'd have like to try compiling Cursive with it.

6:09 Bronsa: cfleming: once I finish performance tuning t.a.jvm, adding compile to t.e.jvm is the next thing I'm going to do

6:10 cfleming: Bronsa: Ok, is that a lot of work now that you have eval?

6:11 Bronsa: cfleming: not much for a rudimentary `compile` but for how t.e.jvm is implemented right now that would emit twice as many class files as Compiler.java does

6:11 cfleming: Wow.

6:11 That's a lot of class files.

6:12 Bronsa: Compiler.java has both a compiler and an interpreter, top-level def expressions are interpreted while their body are compiled

6:12 edbond: how to start lein repl with specified host?

6:12 ip

6:12 mping: hi guys

6:12 Bronsa: t.e.jvm doesn't have the interpreter so every top-level form is wrapped in a (fn []) and (.invoke'd)

6:13 mping: I'm having trouble understanding lazy seqs

6:14 cfleming: Bronsa: Interesting, I didn't know that.

6:14 Bronsa: cfleming: Compiler.java's interpreter isn't really a complete clojure interpreter, it's implemented only for some special forms, e.g. def

6:15 cfleming: Bronsa: Just for bootstrapping during compilation, basically?

6:16 Bronsa: cfleming: I yeah, and to avoid emitting a class just do (.setRoot #'v expr) :P

6:16 cfleming: Hehe

6:16 Bronsa: if you AOT a namespace, all that var initialization code is in a single ns__init.class file

6:17 zot: i have (what appears to be) a simple project.clj with a profile modifying uberjar. except that it doesn't work at all, despite no complaints from lein. does this look obviously broken? https://gist.github.com/benfleis/31b6b518a56c6fb518a6

6:17 cfleming: Yeah, I know - that's a pain. It basically prevents use of things like proguard on Clojure code.

6:17 I guess that sort of tree shaking would be better at the source level for Clojure, though.

6:18 Bronsa: there's a junk in the static initilizers generated by Compiler.java

6:19 I'm trying to minimiza the useless constants emitted by t.e.jvm but some redundant/useless constants are hard to avoid

6:41 clgv: zot: the vector looks suspicious, except that is for a plugin which in fact expects it like that. in leiningen I'd expect a map there if you have key value pairs

6:54 noncom: in clojure source, i can see that a symbol java object has a namespace field. so it turns out that a symbol is associated with a ns, not vice versa. how could that be? especially that symbols with the same name can be defined in multiple namespaces ? i always thought that a namespace contains a map of symbols..

7:17 clgv: noncom: no, that field is for namespace keywords, e.g. :foo/bar, where the keyword namespace does not necessarily relate to any clojure namespace...

7:18 ,[(namespace :foo/bar) (name :foo/bar)]

7:18 clojurebot: ["foo" "bar"]

7:19 clgv: oh wait you were asking for symbol. but thats similar. a symbol with namespace is a name for a var

7:19 ,(let [s 'foo/bar] [(namespace s) (name s) (type (namespace s))])

7:19 clojurebot: ["foo" "bar" java.lang.String]

7:20 clgv: though that connection "symbol as name for a var" happens during evaluation (resolution of non quoted symbols)

7:21 *resolving

7:23 borkdude: shouldn't the doc of comp be updated for transducers?

7:24 zot: clgv: i took that example from the leiningen profiles page … i started w/ just defining the attrs directly, and using comma-joined 'with-profile' bits on the command line, but that failed to include my stuff as well.

7:32 mmeix_: short newbie-question: would there be a version with 'map' of the following:

7:32 (for [idx [1 0 2 ]] (get [:a :b :c :d] idx))

7:33 Bronsa: ,(map [:a :b :c :d] [1 0 2])

7:33 clojurebot: (:b :a :c)

7:34 Bronsa: mmeix_: vectors are function of their indexes to their values

7:34 mmeix_: ah! thnx, didn't think of putting the vector itself in the function position ... thanx!

7:41 clgv: zot: a profile is usually specified as map. so you must have confused something

7:43 zot: clgv: to be clear, i was following the 'composite profiles' example here: https://github.com/technomancy/leiningen/blob/master/doc/PROFILES.md ; but i also did it as a traditional profile, and used with-profile +fitness-model-resources, and got the same result. that version is here: https://gist.github.com/benfleis/00277e6fa667e47c53ea

7:45 clgv: zot: the second is correct. in the example you linked, it seems to be a mixed case profile names and inline property specifications in the vector

7:45 zot: clgv: *just* found this, the probable causes: https://github.com/technomancy/leiningen/issues/1718 and https://github.com/technomancy/leiningen/issues/1694

7:46 good to know - teh second still fails, but at least i have an idea of why :)

7:47 clgv: zot: you could achieve the same via indirection

7:47 zot: ah well but only with static switches, so not exactly the same... my mistake

7:48 zot: clgv: no worries, i appreciate your looking. in my current case it's not critical, mainly to avoid confusion. we'll just have to be confused until lein 2.5.x fixes it :)

7:49 clgv: zot: if it helps you can unquote the value and use arbitrary code there, e.g. :uberjar-name ~(if sun-shines "sun.jar" "fog.jar")

7:49 ;)

7:50 zot: tnx

8:03 dysfun: is there any lisp that supports defining macros that are expanded in top down rather than bottom-up order?

8:03 i don't need it for anything, i'm just curious

8:04 Bronsa: dysfun: you mean (when 1 (when 2 3)) expanding (when 2 3) before (when 1 (when 2 3)) ?

8:04 dysfun: yes

8:05 Bronsa: dysfun: I believe fexprs could be used to do that

8:05 but well, you can do that with normal macros too -- just macroexpand the body inside the macro decl

8:07 dysfun: yes indeed

8:08 i suppose the triviality of implementing that means it would be redundant

8:09 clgv: dysfun: though it is not that trivial, e.g. macroexpand-all does it wrongly ;)

8:09 dysfun: :)

8:11 ooh, fexprs look quite interesting

8:19 Bronsa: clgv: macroexpand-all is a horrible implementation

8:50 clgv: Bronsa: yeah, I think I used the macroexpand walker from zach, last time I needed something like that :)

8:51 Bronsa: clgv: yeah that works

9:02 cityspirit: why would remove be returning a filter fn (e.g. #<core$filter#fn__...) instead of a lazy-sequence?

9:07 Bronsa: cityspirit: because you're invoking the no-coll arity, that returns a transducer

9:07 ,(remove odd?)

9:07 clojurebot: #<core$filter$fn__4368 clojure.core$filter$fn__4368@179ae1f>

9:07 Bronsa: ,(remove odd? (range 10))

9:07 clojurebot: (0 2 4 6 8)

9:09 cityspirit: Bronsa: ahh thanks. Misplaced parens was calling it without coll - used to seeing an arity exception there.

9:10 Bronsa: :( yeah

9:10 I feel like this is the first of a long series of similar questions

9:10 luxbock: in Leiningen dependencies, what does the :scope keyword inside the dependency vector do?

9:16 clgv: Bronsa: me too. this was the easiest kind to solve ;)

9:18 stuartsierra: luxbock: I think it only applies when generating a POM. `scope` is a Maven term.

9:18 Bronsa: clgv: one thing I didn't realize is that for transducers implemented by composing other transducers -- like remove -- there will be no mention whatsoever of the originating functio :/

9:20 luxbock: stuartsierra: thanks

9:23 daniel___: [

9:24 Bronsa: ]

9:24 daniel___: phew, thanks

9:24 Bronsa: np

9:25 luxbock: when I try to use a project the has leiningen 2.5.0 as a dependency, leiningen complains about the version, saying that I'm using 2.3.4 and telling me I should upgrade

9:26 but I already have 2.5.0 in my .m2/repositories/leiningen/leiningen/

9:26 why might this be happening?

9:26 Bronsa: luxbock: what does lein version say?

9:26 hyPiRion: luxbock: What do you mean by dependency?

9:27 luxbock: Bronsa: 2.3.4

9:27 Bronsa: hyPiRion: :min-lein-version or however that is ?

9:27 luxbock: run `lein upgrade` then

9:27 luxbock: hyPiRion: using the chestnut lein-template adds [leiningen "2.5.0"] as a dependency

9:27 Bronsa: I have done that but it doesn't do anything for me, just complains about the version

9:28 at first I thought it was because I had [leiningen #=(leiningen.core.main/leiningen-version)] in my profiles.clj (because of Vinyasa), but commenting that out did not help either

9:29 hyPiRion: luxbock: comment out your entire profiles.clj and do `lein upgrade 2.5.0`. Possibly something conflicting in it

9:32 luxbock: hyPiRion: I can't get that to work. It complains about wrong number of arguments. I tried everything I could think of to give it but everything was rejected

9:33 hyPiRion: whut

9:34 clgv: Bronsa: uff, right. you'll just get an error reported for the individual implementations

9:35 luxbock: even weirder is now that I removed the 2.3.4 directory from ~/.m2/repository/leiningen/leiningen/, I still get 2.3.4 as my version

9:36 ah think I know what it is, I installed lein through homebrew and the version 2.3.4 appears to be hard coded into the shell script it uses

9:36 hyPiRion: luxbock: upgrade with homebrew

9:36 luxbock: yeah, that's it, sorry for the confusion

9:37 hyPiRion: also if you wonder, the lein standalone is in ~/.lein/self-installs, not ̃/.m2/

9:37 luxbock: I see

10:26 mping: hi guys

10:28 noncom: clgv: so there can be symbols with equal names but with different namespace values /

10:28 ?

10:28 mping: welcome back

10:38 clgv: noncom: indeed

10:39 noncom: clgv: and the interpreter has the concept of "current namespace" ?

10:39 clgv: noncom: no

10:39 noncom: all is resolved during the read operation ?

10:39 clgv: noncom: consider symbol 'clojure.core/map its namespace is "clojure.core"

10:40 noncom: right, but what about symbols without namespace qualification and symbols which are qualified through namespace aliases ?

10:40 clgv: noncom: to be able to resolve a symbol to a variable the namespace of the symbol must correspond to a clojure namespace

10:41 noncom: you mean it must be a valid and actually existing namespace ?

10:41 clgv: noncom: when you use resolve on a symbol without a namespace clojure tries to load it from the current namespace (or its imported symbols [without alias])

10:42 noncom: only if you want to resolve it to some variable - otherwise it can be anything you like

10:44 edbond: how to run lein repl on non- host ?

10:44 clgv: noncom: I am still not sure what your problem is. initially I guessed that you confuse the relation between clojure namespaces and variables with the two dataparts a symbol can have (namespace and name)

10:46 noncom: clgv: actually i am trying to implement namespaces in dotlisp..

10:46 since dotlisp is most close to clojure, i want to understand how they work in clojure and re-implement them in dotlisp

10:50 clgv: so generally i am trying to grasp the whole concept.. but it seems a bit vague..

10:51 clgv: noncom: ah ok. on a UML composition diagram a clojure namespace has nothing to do with the namespace of symbol. the namespace of the symbol is just a string. the connection is made when the compiler needs to resolve the symbol, then it looks for a clojure namespace with the name of the symbol namespace

10:52 noncom: for managing variables a namespace contains a mapping from its symbols to their corresponding variables

10:53 noncom: you can study the clojure.core/ns-* functions and clojure.lang.Namespace for the details

10:53 noncom: and clojure.core/resolve

10:55 noncom: clgv: alright, will look into these, thank you :)

11:00 virmundi: Hello, all. what is the scoping of atoms? From the memoize'd source it looks like the atom used is global.

11:01 https://github.com/clojure/clojure/blob/clojure-1.6.0/src/clj/clojure/core.clj#L5834 for reference

11:01 noncom: this atom is local to the function (memoize) and is captured in closure the function returns

11:02 virmundi: Ah, yes. I've got to get use to Clojure not spelling out its return types. Thanks

11:09 m1dnight_: I have a project with a simple core file. It works excellent using "lein run". However, in Emacs I get "could not locate class" (i.e., it cant find an import (jsoup)).

11:09 Trying to run it in Cursive runs fine, but doesn't show any output.

11:09 Do I need to "clean" something in Emacs if I edited my source outside of emacs?

11:09 I already tried cider-restart, but that doesn't work

11:10 (I also get wrong/no output in Emacs)

11:11 https://www.refheap.com/91668 This is all I want to run.

11:12 gfredericks: oh golly I need to write this binary search test.check shrinker

11:20 schmir: m1dnight_: what does your project.clj look like?

11:21 m1dnight_: https://www.refheap.com/91669

11:21 I managed to get it to work with Emacs (dnno what I did different, but it works)

11:21 Cursive is still displaying nothing :p

11:22 clgv: gfredericks: oh why?

11:23 m1dnight_: why do you do? you do run "(-main)" right?

11:23 gfredericks: clgv: I don't know if this is common, but for my large generators I'll often have shrinks that take the same indexed child in the shrink tree for dozens and dozens of steps

11:23 m1dnight_: clgv: yes, I do

11:24 gfredericks: clgv: e.g., the shrink I'm watching currently has taken the 23rd child 54 times in a row

11:24 which means it has run my test ##(* 23 54) to get to that point

11:24 lazybot: ⇒ 1242

11:24 clgv: uff

11:24 gfredericks: when it could have detected the repeated 23 and done a binary search to see how far it can get along that path, and potentially accomplish the same thing with ~10 test runs

11:25 which makes a big difference if your test takes like 1-3sec to run

11:25 clgv: indeed

11:26 gfredericks: my test.check fork will get farther and farther away from the mainline :/

11:26 clgv: gfredericks: so that "rose tree" (whatever that is exactly) does not do anything like binary search?

11:26 gfredericks: well the tree is the structure being searched over

11:27 clgv: ok yeah, I meant the search algorithm operating on it ^^

11:27 gfredericks: so it's the shrink algorithm itself that's not doing a binary search

11:27 which is really because it's not the sort of thing you'd expect would work

11:27 it's only because I'm printing out the path taken through the shrink tree that I'd think of doing that at all

11:28 justin_smith: m1dnight_: does (.getCanonicalPath (java.io.File. ".")) show the directory you expect in the cider repl?

11:28 clgv: gfredericks: maybe you need a search algorithm that rates variable nodes indicating which one should change at highest priority and updates those rates while searching

11:28 justin_smith: m1dnight_: that being the root directory of your project

11:29 gfredericks: clgv: I'm having trouble parsing that sentence; but yeah there might be some approaches like that; rating the children only solves half the problem though

11:32 clgv: gfredericks: I didn't dig into the current shrink algorithm, yet. ...

11:32 gfredericks: clgv: it's pretty naive

11:33 just greedily walk down the tree as far as you can and then stop

11:33 clgv: gfredericks: just backtracking on that tree structure?

11:33 gfredericks: the only "backtracking" it does is to try sibling nodes when it fails to find a failing node

11:33 it never walk back up

11:33 (and it probably shouldn't)

11:34 clgv: your "up" is conflicting with my image that in CS trees grow from top to bottom ;)

11:34 gfredericks: every time it descends it just looks for the first failing child, and continues down the tree through that ;; <- basically the whole description of the algorithm

11:34 clgv: ok

11:35 gfredericks: I don't think my "up" conflicts with that...

11:35 clgv: if the root containing the minimum is at the top is should walk up ^^

11:35 gfredericks: "minimum"?

11:36 the root of the shrink tree is the "largest" failure

11:36 and I'm speaking as if the root is at the top

11:36 so going "down" gives you smaller test inputs

11:36 clgv: ah, there is the conflict. I thought the tree represents the whole search space starting at the minimal domain value tuple for the variables...

11:37 gfredericks: aah no, the tree is particular to a generated input value

11:37 test.check's generators actually generate shrink trees instead of single values

11:38 the test runner just ignores everything but the root of the tree unless it finds a failure

11:38 once it finds the first failure it walks the tree to find a smaller failure based on the original

11:38 clgv: gfredericks: to summarize you want to replace test.checks "engine" ;)

11:38 gfredericks: you could say that

11:41 I'm always peppering reid with radical overhauls to various parts of test.check

11:41 arrdem: &(= Double/NaN Double/NaN)

11:41 lazybot: ⇒ false

11:41 clgv: gfredericks: does quick-check have different search algorithms?

11:41 gfredericks: clgv: no

11:42 clgv: gfredericks: ah damn. the you would not have to invent all yourself ;)

11:42 Bronsa: arrdem: NaN is never equal to anything

11:42 ,(let [a Double/NaN] (= a a))

11:42 clojurebot: false

11:42 arrdem: Bronsa: right I was just making sure. It's been a while since I messed with the float spec

11:42 gfredericks: it should be equal to anything that isn't a number

11:43 arrdem: Bronsa: seeing justin_smith chatting about = on twatter and this was the handiest repl :P

11:43 gfredericks: clgv: part of the problem is that the current code doesn't allow for alternative search algorithms to be implemented efficiently

11:44 justin_smith: arrdem: I understand the reasoning that it shouldn't be = to itself, but it is fascinating in being the only value with those semantics in the jvm

11:45 gfredericks: ,(def justin (reify Object (equals [_ x] false)))

11:45 clojurebot: #'sandbox/justin

11:45 justin_smith: arrdem: also the only item with those semantics in most other (all other?) languages

11:45 gfredericks: ,(= justin justin)

11:45 clojurebot: true

11:45 justin_smith: haha

11:45 gfredericks: crap

11:45 arrdem: haha

11:45 * gfredericks cannot jvm

11:46 justin_smith: point taken though - let's just say it's the only thing that ships with the jvm with those semantics

11:46 I fully believe a new thing can be made that acts that way

11:47 Bronsa: I'm not sure there's a way to implement something so that (let [a (something)] (= a a)) is false

11:47 because = does a pointer check before calling .equals

11:47 clgv: justin_smith: are you trying to integrate "php language features" into the jvm? :P

11:47 justin_smith: heh

11:48 clgv: ,(.equals justin justin)

11:48 clojurebot: false

11:48 justin_smith: Bronsa: except NaN of course

11:48 clgv: gfredericks: there you go, solved for java land ;)

11:48 Bronsa: justin_smith: yeah

11:50 justin_smith: clgv: var_dump(NAN == 12); // boolean true - from http://php.net/manual/en/function.is-nan.php

11:50 LOL

11:51 php is such a deep pity of wtf humor

11:51 arrdem: oh god why

11:51 justin_smith: inorite

11:51 like if I still had a room mate I would have just woken her up laughing

11:51 mearnsh: :')

11:52 justin_smith: s/pity/pit

11:52 clgv: it's kinda funny that there are still people building new systems in php (willingly?)

11:52 justin_smith: I pity php, but it is a pit of humor

11:52 arrdem: justin_smith: http://imgur.com/gallery/NdGyt

11:52 hadronzoo: I'd like to test some async code that contains timeouts with test.check, and I'd like to make the timeouts no-ops. What's the best way to do that?

11:52 afhammad: is it ok to require ns A in B and B in A?

11:52 Bronsa: afhammad: no

11:52 clgv: justin_smith: http://en.wikiquote.org/wiki/Rasmus_Lerdorf

11:53 arrdem: clgv: ... aaand there goes the last iota of respect I had for PHP

11:54 clgv: arrdem: it's always entertaining to reread those quotes :D

11:54 Wild_Cat: justin_smith: the best part of PHP is that its ternary operator is right-associative. To my knowledge, no other language does that.

11:54 justin_smith: new favorite piece of trivia: "There are people who actually like programming. I don't understand why they like programming." was said by the author of which widely used programming language?

11:54 Wild_Cat: er, wait, no, it's left-associative.

11:54 arrdem: clgv: it's almost like the language was developed with no respect for software architecture. oh wait. it was.

11:54 Wild_Cat: it's every other ternary operator that's right-associative. My bad.

11:54 afhammad: Bronsa: hmm, what do you do in the case that you need to? Is there an idiomatic way to structure such code? I have "models" that encapsulate some domain specific functions that may need to be referenced from other models

11:55 justin_smith: afhammad: you can lift the common features into an abstraction used by both namespaces

11:55 Bronsa: afhammad: put the common functions in a impl namespace and require it from both namespaces

11:56 justin_smith: afhammad: for example you can specify multimethods or protocols, and then require all the definitions, and implement some parts, in each ns

11:57 afhammad: justin_smith, Bronsa: but the functions aren't common, and that defeats the purpose of having seperate namespaces (in this case). Example from (ns x.features ..) i need to require (ns x.projects ..) and call projects/get-all

11:58 justin_smith: afhammad: I am not talking about sharing functions at all

11:59 afhammad: (projects/get-all) implies global state, which you shouldn't be doing anyway - make a container that holds projects, and act on that. Have a shared ns that describes features and projects, but does not implementation. Then require that and implement the apropriate parts from other namespaces.

11:59 literary: Does this line look a bit sketchy to anyone else? https://github.com/chaslemley/slim.clj/blob/master/src/slim/core.clj#L15

12:00 Bronsa: literary: no, that's destructuring syntax

12:00 ,(let [[a b] [1 2]] [a b])

12:00 clojurebot: [1 2]

12:00 literary: I'm talking about the use of regex to parse a whitespace-indented file.

12:00 justin_smith: Bronsa: literary: oh I thought it was like "is this a fucked up regex"

12:01 Bronsa: literary: ah ok, sorry then

12:01 literary: It seems weird to use regex to parse anything.

12:01 The language it's trying to parse is this: http://slim-lang.com/

12:01 justin_smith: yeah, there are some extensions to regex that make big ones less unweildy, brb looking it up, forget what it is called

12:02 afhammad: justin_smith: do you know of any examples of such an implementation I can look at?

12:02 noprompt: dnolen_: any thoughts on how to approach CLJS-871?

12:03 justin_smith: literary: C-f "(?x)" http://grimoire.arrdem.com/1.6.0/clojure.core/re-pattern/

12:03 noprompt: dnolen_: it seems like fields for deftype/defrecord don't have to be munged?

12:04 actually, scratch that last line.

12:07 justin_smith: afhammad: one moment, let me see if I can dig up a good clear example

12:07 afhammad: justin_smith: thanks!

12:08 noprompt: dnolen_: i think i know to fix it.

12:20 justin_smith: afhammad: not perfect, but small enough to be fairly clear I hope

12:21 I defien a protocol in this ns https://github.com/caribou/caribou-plugin/blob/master/src/caribou/plugin/protocol.clj

12:21 and functions that act on things implementing that protocol here https://github.com/caribou/caribou-plugin/blob/master/src/caribou/plugin/state.clj

12:21 dnolen_: noprompt: cool

12:22 justin_smith: afhammad: by constructing things this way, my functions can add on any other implementation of the caribou-plugin protocol, without needing to know how they are implemented at all

12:22 *act on

12:37 afhammad: justin_smith: thanks

12:38 noprompt: dnolen_: i don't recall how to run the clojurescript tests. :-/

12:40 dnolen_: nm again. :-P it's monday.

12:42 perplexa: hello, is there a best practice to deal with cyclyc dependencies? i have a function that has a callback to another function, which might then call the initial function again. but clojure doesn't seem to like this as either of the function isn't defined at that point. how do i deal with that?

12:44 justin_smith: why not pass the callback in?

12:44 perplexa: to avoid ugliness :)

12:44 but that might actually work

12:45 i just came across (resolve ...), guess your way is preferable

12:45 justin_smith: another option is using core.async instead of callbacks

12:47 is it really a "callback" if the thing to call isn't a parameter? that sounds like a "call" to me

12:48 perplexa: justin_smith: just using a lib, (zk/connect "" :watcher (fn [event] (println event))), where i need a watcher function that checks for expire/disconnect states and reconnect

12:48 and since it was a big longer, i just put it in its own function

12:49 rurumate: core.async is nice but you have to remember to always catch all exceptions that may happen inside (go ..) block. so it should almost always be (go (try ...)) otherwise you may run into some surprising behaviour

12:50 kzisme: hello everyone

12:51 perplexa: justin_smith: using an anonymous function now, thanks ;p

12:51 (inc justin_smith)

12:51 lazybot: ⇒ 91

12:51 ro_st: rurumate: yes. particularly in cljs, where your exception stacktrace will point deep inside the async machinery

12:52 justin_smith: rurumate: that applies to just about anything that is dispatched to a "secondary" thread, if it fails it won't be interrupting your other threads

12:53 rurumate: so if you care about a result, you should also care about it's exception state - I like how futures raise any exception thrown in the new thread when dereferenced actually

12:54 (def result (future (/ 1 0)) ... do other stuff ... @result (exception gets raised here)

12:56 rurumate: justin_smith: interesting. not sure if I like that better though

12:57 well, it sure is better than just converting the exception to nil,

12:58 as (go..) seems to do

12:58 stuartsierra: depends on the version

12:58 justin_smith: I think it makes sense for future, as future is intended to give you a result, so the consumer should care about the exception

12:58 rurumate: oh, is that changed now?

12:58 stuartsierra: It's gotten a bit better recently - you can set an exception handler on a channel.

12:58 justin_smith: nice!

12:59 stuartsierra: If you don't the exception should propagate to the Thread.getDefaultUncaughtExceptionHandler

12:59 rurumate: of which thread?

12:59 stuartsierra: The global uncaught exception handler.

12:59 rurumate: oh that's a global

13:00 anyway I think it's almost always a mistake to not catch the exception in the (go..) block

13:00 ro_st: stuartsierra: is there a code sample for that somewhere?

13:00 stuartsierra: But within a `go`, it still usually makes sense to try/catch everything and either return the exception it or forward it somewhere else.

13:01 ro_st: code sample for which thing?

13:01 ro_st: the exception handler on a channel thing

13:01 stuartsierra: ro_st: it's just an argument to `chan` and some other functions.

13:02 ro_st: gotcha, thanks https://clojure.github.io/core.async/#clojure.core.async/chan

13:08 instilled: Hi! Is it possible with leiningen to define dependencies in a master project.clj that I can refer to in multiple projects so that they all share dependencies in the same version, i.e. something similar to a parent pom.xml, or a bom, in maven parlance?

13:09 technomancy: instilled: just depend on a project that depends on everything you want

13:09 aka "favour composition over inheritance"

13:09 instilled: technomany: ok. cheers!

13:16 technomancy: anyone want an easy lein sticker?

13:16 kungi: technomancy: \o, here

13:16 verma: technomancy, easy is relative, but sure :)

13:16 technomancy: https://github.com/technomancy/leiningen/issues/1721

13:16 should be a pretty straightforward fix =)

13:16 seangrove: Does this look like something I've obviously messed up? Seems to be correlated with upgrading lein, but that could just be superstition https://www.refheap.com/16ff2d6b9390dd3b29bcfbf7f

13:17 kungi: technomancy: I thought about stickers you know with adhesive tape on one side and a nice logo on the other.

13:17 technomancy: kungi: yeah, that's the idea

13:18 kungi: if you get a patch applied, you can send me an envelope and I'll send you a sticker

13:18 kungi: technomancy: got it :-)

13:18 ro_st: "we don't take bugs leiningen down"

13:18 sorry

13:19 nullptr: seangrove: seems the built in stuff is getting the same warnings yours is, so doesn't seem like you did anything obviously stupid

13:22 * seangrove curses chestnut

13:23 seangrove: Chestnut was very cool, but now I have to figure out how to get my other projects to work

13:23 The yaks, they're hairy today

13:23 mdeboard: nothing OBVIOUSLY stupid

13:23 ro_st: chestnut?

13:23 mdeboard: The non-obvious stupidity is far more insidious

13:24 nullptr: mdeboard: truth

13:24 non-obvious stupidity accounts for ~80% of debugging time, and 98% of "oh are you #$!%ing kidding me?!" exclamations...

13:24 seangrove: nullptr: I suspect it'll be that in the end, yeah

13:25 The latest cljs compiler gives me a NPE on build though

13:25 Maybe I can try downgrading lein... I don't have a clue what I was on before though

13:28 noprompt: dnolen_: would you be opposed to putting a README in the script directory which contains information regarding the tests etc. it's not immediately obvious the gh wiki page has that information.

13:31 linman32: hi is there a way to read back a particular type from a string?

13:31 (read-string "string-type-HTTPKit-channel")

13:31 justin_smith: ,(class/forName (str (class [])))

13:31 clojurebot: #<CompilerException java.lang.RuntimeException: No such namespace: class, compiling:(NO_SOURCE_PATH:0:0)>

13:31 justin_smith: ,(Class/forName (str (class [])))

13:31 clojurebot: #<ClassNotFoundException java.lang.ClassNotFoundException: class clojure.lang.PersistentVector>

13:31 justin_smith: hmm

13:32 ,(Class/forName "clojure.lang.PersistentVector")

13:32 clojurebot: clojure.lang.PersistentVector

13:32 justin_smith: that works at least

13:32 linman32: more exactly: (read-string (prn-str http-kit-channel-value))

13:32 justin_smith: do you mean pr-str?

13:32 linman32: sure pr-str

13:33 justin_smith: how do i formulate it? (read-string (Class/forName "string.."))

13:34 justin_smith: "string.." isn't a class

13:34 I misunderstood what you were trying to do

13:34 read-string will only work for things that have a read syntax

13:34 linman32: so is this possible? (read-string (pr-str http-kit-channel-value))

13:34 justin_smith: I doubt HTTPkit-channel has a read syntax

13:35 what type is http-kit-channel-value? does it have a read syntax?

13:36 ro_st: linman32: what do you see when you (pr-str http-kit-channel-value)

13:36 slester: Is it possible that #6 on 4clojure is bugged?

13:36 linman32: "#<AsyncChannel /<->/>"

13:36 that is (pr-str chnl)

13:36 justin_smith: slester: seriously doubt it

13:37 slester: there is no bug, but you maybe don't get how the "blank" there works

13:37 ro_st: linman32: and what happens when you (read-string) that string

13:37 justin_smith: slester: the blank is not strict clojure syntax - it is any sybol(s) that you wish to insert

13:38 ro_st: #<...> is a notation that means "unreadable"

13:38 linman32: RuntimeException Unreadable form clojure.lang.Util.runtimeException (Util.java:221)

13:38 justin_smith: ,(read-string "#<anything at all>")

13:38 clojurebot: #<RuntimeException java.lang.RuntimeException: Unreadable form>

13:38 ro_st: linman32: then you have your answer. it's not possible to serialise http-kit-channels to strings and back.

13:39 linman32: ro_st: ok, thanks. wasn't sure

13:40 slester: justin_smith, I know how it works.

13:40 I had to skip #6 because even the solution I found elsewhere on the internet doesn't work

13:40 justin_smith: slester: if you haven't solved it, you don't know how it works

13:41 would you like the solution?

13:41 slester: sigh

13:41 So I've solved up to 20, skipping #6, and I don't know how it works.

13:41 justin_smith: I just reran mine, it still works

13:41 it's freeform

13:41 it can be any number of forms

13:42 they get literally inserted in the blank

13:43 jcsims: slester: I've never seen problem 6 before, and just solved it. I don't think there's a bug

13:43 justin_smith: slester: the solution is trivial, I am following about 50 other users, our answers are character per character identical

13:51 csd_: What is the easiest way to get a subset of values from a map? E.g. some (f {:a 1 :b 2 :c 3} [:a :b]) => {:a 1 :b 2}

13:51 ro_st: select-keys

13:52 justin_smith: ,(select-keys {:a 1 :b 2 :c 3} [:a :b])

13:52 clojurebot: {:b 2, :a 1}

13:52 ro_st: literally replace f with select-keys and you have what you want

13:52 csd_: perfect

13:52 justin_smith: f is literally select-keys in this case!

13:52 csd_: thanks

13:52 dunnowins_: i just learned of select keys yesterday

13:52 ro_st: good instinct :-)

13:52 dunnowins_: great function!

13:52 literary: ,(def f select-keys)

13:52 clojurebot: #'sandbox/f

13:52 literary: That's how.

13:52 justin_smith: heh

13:52 literary: ,f

13:52 clojurebot: #<core$select_keys clojure.core$select_keys@149a696>

13:52 literary: ,(f {:a 1 :b 2 :c 3} [:a :b]) => {:a 1 :b 2}

13:52 clojurebot: {:b 2, :a 1}

13:52 ro_st: https://tbaldridge.pivotshare.com/ has nice function of the day videos

13:53 literary: Wait why did that work.

13:53 ro_st: https://tbaldridge.pivotshare.com/categories/function-of-the-day/2084/media?m_sort=date&m_order=desc

13:53 justin_smith: literary: why would it not work?

13:55 literary: =>

13:55 ,() foo bar

13:55 clojurebot: ()

13:55 literary: Oh.

13:55 justin_smith: oh, that part, heh

13:56 I missed that you had the => in there

14:04 noprompt: dnolen_: so it looks like this problem might be a bit tricky. if emit* :dot is patched to write the field/method with (munge field/method js-reserved) deftype/defrecord will work as expected with property access. on the other hand that would break access for vanilla js-objects (e.g. (.-default #js{:default ...})). the only think i can think of at this point which would solve both problems is to emit a check for either x

14:04 .default$ or x["default"]. otherwise it seems like this will end up being a "won't fix" issue.

14:06 dnolen_: noprompt: yeah I don't have a good answer for this one, default is simply not allowed on many JS engines in the wild

14:06 yet munging it busts interop

14:06 so I would chalk it up as not worth it

14:06 verma: technomancy, I am thinking that :uberjar profile should make it to the list of profiles inited here: https://github.com/technomancy/leiningen/blob/master/leiningen-core/src/leiningen/core/project.clj#L807

14:06 dnolen_: or switch to keywords

14:06 i.e. defrecord

14:06 noprompt: dnolen_: foo.default = "bar" is perfectly fine in recent js engines IE9 and up.

14:06 verma: technomancy, which will cause it to setup correctly for cleanups

14:06 dnolen_: noprompt: we don't care about that though

14:07 noprompt: CLJS works w/ JS engines back to 2001

14:07 plain and simple

14:07 noprompt: sure.

14:07 verma: technomancy, like this function here never gets to see the uberjar profile

14:07 https://github.com/technomancy/leiningen/blob/master/leiningen-core/src/leiningen/core/project.clj#L643

14:08 noprompt: dnolen_: damn. this is something that caused me to debug for about 30 mins before i finally realized what was going on. maybe we should emit a warning?

14:09 dnolen_: noprompt: no there's a good idea - yes fields that reserved keyword in JS we could warn about that

14:10 noprompt: dnolen_: alright, i'll handle it that way.

14:10 verma: technomancy, I do see (:profiles project) being refered here: https://github.com/technomancy/leiningen/blob/master/leiningen-core/src/leiningen/core/project.clj#L660 .. checking

14:12 noprompt: dnolen_: would anyone complain if i alphabetized *cljs-warnings*?

14:12 technomancy: verma: the original project map should be stored as metadata on the effective project map

14:15 dnolen_: noprompt: no problem w/ that, but not in the same ticket

14:15 noprompt: dnolen_: ok.

14:24 daniel___: Do I need to exempt certain routes from auth using friend? https://gist.github.com/danielstockton/aeaf561c3b58235e9d29

14:24 my index.html page returns Unauthorized, i thought i'd have to wrap my route/resources route in authorize for that to happen

14:29 noprompt: dnolen_: how does this sound? "JS reserved identifier 'default' used as field in type Foo (access with default$)"

14:30 dnolen_: noprompt: JS -> JavaScript, but otherwise works for me

14:30 noprompt: dnolen_: great!

14:31 dnolen_: noprompt: there needs to be a flag to suppress this warning for people that want to target more recent JS engines

14:31 noprompt: dnolen_: where is that handled?

14:32 dnolen_: noprompt: actually ignore what I said about recent JS engines - just need a flag to suppress - see top of analyzer.cljs

14:34 jakebasile: daniel___: as I understand it, friend/authenticate by default blocks everything unless you set :allow-anon? and then wrap the routes you want authed

14:35 noprompt: dnolen_: cool

14:36 daniel___: jakebasile: i added allow-anon?, i need to wrap routes i dont want blocked with friend/authenticated ?

14:36 mmeix: very short question : there is no way to express #(/ % 2) with (partial ...), right? (just to make sure)

14:37 jakebasile: daniel___: other way around, allow-anon? switches the default for all routes to allow anyone to see it, you need to tell friend what routes need to be authenticated

14:37 daniel___: im trying to go by https://github.com/cemerick/friend-demo/blob/master/src/clj/cemerick/friend_demo/interactive_form.clj, where the /login page is not wrapped by anything

14:37 noprompt: dnolen_: when should something be prefixed with cljs? ie *cljs-check-field-names* vs *check-field-names*

14:37 daniel___: jakebasile: right, i see

14:37 makes sense, i wonder why im still being clocked then

14:37 blocked*

14:37 jakebasile: in that example, everything is routed anon

14:38 dbasch: mmeix: (partial (fn [x] (/ x 2)))

14:38 jakebasile: all it does is add your name in if you are authenticated

14:38 so in that case nothing is wrapped because log-in is optional

14:38 noprompt: dnolen_: everything but *unchecked-if* and *analyze-deps* seems to be prefixed so i'm guessing those are special cases.

14:38 daniel___: my index.html is still inaccessible with allow-anon? true

14:39 dnolen_: noprompt: *check-field-names* is probably best - I only used cljs prefix to disambiguate vars that have similar names in Clojure

14:39 verma: technomancy, for the scope of this issue, would you like changes to be constrained to just cleanup or would it be ok if I touch some other areas, e.g.the target-path machinery works great, only that by default only the :default profile is expanded https://github.com/technomancy/leiningen/blob/master/leiningen-core/src/leiningen/core/project.clj#L814

14:39 dbasch: mmeix: if they are floats, of course (partial * 0.5)

14:39 verma: technomancy, I could very well just make :default include :uberjar and it would work :P

14:40 amalloy: dbasch: (partial * 1/2) works either way

14:40 dbasch: amalloy: just beat me :)

14:40 verma: technomancy, here: https://github.com/technomancy/leiningen/blob/master/leiningen-core/src/leiningen/core/project.clj#L474

14:40 mmeix: dbasch thanx

14:41 verma: technomancy, or I could just make profile-scope-target-path accept :uberjar if :uberjar exists in project map

14:44 technomancy, or here [1], I can just do [:default :uberjar] as default if :uberjar exists in map otherwise just :default .... [1] https://github.com/technomancy/leiningen/blob/master/leiningen-core/src/leiningen/core/project.clj#L884

14:45 or am I going in circles

14:46 jakebasile: daniel___: I have some very similar code using friend, and the only real difference I see is that I don't define :unauthenticated-handler. My routes are all unadorned, I check for authentication/authorization in the actual handlers. here's my friend handler def: https://gist.github.com/jakebasile/ffca14d09d42ed0cbb2a

14:47 rurumate: ,(if-let [[n & ns] [1 2 4 5]] ns)

14:47 clojurebot: (2 4 5)

14:47 rurumate: ,(if-let [[n & ns] [1 2 4 5]] n)

14:47 clojurebot: 1

14:47 rurumate: ,(if-let [[n & ns] [1 2 4 5]] n ns)

14:47 clojurebot: #<CompilerException java.lang.RuntimeException: Can't take value of a macro: #'clojure.core/ns, compiling:(NO_SOURCE_PATH:0:0)>

14:47 rurumate: ,(if-let [[n & ns] [1 2 4 5]] ns n)

14:47 clojurebot: #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: n in this context, compiling:(NO_SOURCE_PATH:0:0)>

14:48 rurumate: is it just me, or is something not right about if-let?

14:49 oh, I see, there's only a let if the test succeeds

14:49 ,(if-let [[n & ns] [1 2 4 5]] ns 1)

14:49 clojurebot: (2 4 5)

14:50 daniel___: https://gist.github.com/jakebasile/ffca14d09d42ed0cbb2a

14:50 technomancy: verma: I don't think expanding profiles is necessary; having a list of :target-path values and a list of profile names should be enough

14:50 daniel___: sry, didnt mean to paste here, thanks jakebasile

14:50 technomancy: but I haven't thought through it; I could be missing something

14:51 daniel___: jakebasile: same, im also allowed through if i dont define unauthenticated-handler

14:52 actually, it redirects me to /login

14:54 verma: technomancy, the final clean calls come out to be (delete-file-recursively "/project/path/target/base+system+user+dev") .. which indicates that :uberjar needs to added to this + delimited stuff, but this stuff comes from core when the initial profiles are loaded (mapped from :default)

14:54 technomancy: verma: oh yeah, I see. geez.

14:54 verma: technomancy, so this giant machinery is working pretty good, just not sure where to plug in the uberjar stuff :)

14:56 technomancy, to cascade the changes down, I guess the default profiles of [:default] can be changed to [:default :uberjar] if :uberjar exists in project

14:56 technomancy: I don't see why :uberjar is special though

14:56 any profile could be composite

14:57 makes me think that the clean task needs to handle expanding composites, which is a bit unwieldy, but I don't think a special-case will do the job anyway

14:58 verma: hmmm

15:00 technomancy, I guess in the clean function, we can just reconstruct the clean-targets path, instead of picking the one that's set in the project map

15:02 arohner: verma: that sounds like the issue I reported, yay!

15:02 I assume you're talking about https://github.com/technomancy/leiningen/issues/1721

15:02 verma: yes

15:02 :)

15:02 arohner: :-)

15:02 verma: its tagged as Newbie so I thought I'd give it a shot for awesome sticker

15:04 arohner: verma: I find it's easier to submit issues than PRs for stickers ;-)

15:05 verma: oh what? I didn't know submitting issues gets you stickers

15:05 :P

15:23 justin_smith: the easiest way to get stickers is at the dollar store

15:25 poushkar: Newbie here. Can someone look at my project.clj (http://pastebin.com/7b9RZ5xV) and help me to identify why I keep getting ‘java.lang.Exception: Unknown build identifier: ring’ on ‘lein up’? Can’t figure it out myself.

15:26 technomancy: verma: nope, has to be a patch that's accepted

15:36 poushkar: someone?

15:36 verma: poushkar, seems to me like cljsbuild doesn't know what ring build type is, since you've only defined "dev". If you intend to run different pdo tasks, the docs say that the tasks need to be comma delimited, not sure how you're going to do it here, but I suggest adding a "," between dev and ring and see what happens

15:37 cljsbuild auto dev is one task, ring is another, and may be server-headless is another task (not sure)

15:38 lein pdo cljsbuild auto dev, ring, server-headless is how you'd run them on the command line

15:39 poushkar: verma: oh, wow! it helped. Shame on me… I followed tutorial and missed that there is a comma. Thank you a lot

15:39 verma: np

15:58 justin_smith: duh, just realized "pdo" is parallel do, that's mighty useful

16:07 gfredericks: anybody know about getting whidbey/puget/fipp to print record literals and print-method-customized objects correctly?

16:08 bbloom: gfredericks: are you using puget (via whidbey) or fipp's internal edn printer?

16:12 gfredericks: bbloom: the former, but I'm totally unafraid to patch the living crap out of those libs

16:13 bbloom: gfredericks: heh, well iirc i delegate to the normal pr-str thing if i don't know what to do with it, but greglook doesn't for puget

16:14 gfredericks: but yeah, you can just call in to pr-str in :default of pudget's printer

16:14 gfredericks: specical handling for records?

16:16 bbloom: gfredericks: it already handles records

16:16 gfredericks: https://github.com/greglook/puget/blob/e0d3da89ce562b3d56f6792bcfd23772dbc8057e/src/puget/printer.clj#L267

16:20 gfredericks: hmmm

16:21 bbloom: gfredericks: not working for you?

16:21 gfredericks: so it does

16:21 oh it's clojure.pprint that doesn't

16:21 clojure.pprint handles print-method, puget handles records

16:21 each fails at the other

16:22 bbloom: gfredericks: i think you just need to do add a :default case

16:22 gfredericks: bbloom: for canonize?

16:23 bbloom: gfredericks: yes

16:23 https://github.com/greglook/puget/blob/e0d3da89ce562b3d56f6792bcfd23772dbc8057e/src/puget/printer.clj#L193-L208

16:23 actually...

16:23 https://github.com/greglook/puget/blob/e0d3da89ce562b3d56f6792bcfd23772dbc8057e/src/puget/printer.clj#L304

16:23 you probably just want to change that str to pr-str

16:23 gfredericks: yeah I was looking at that

16:24 bbloom: gfredericks: greglook is pretty responsive. why don't you try that and if it works nicely, send him a PR. feel free to @brandonbloom me too

16:24 gfredericks: bbloom: since he uses :span on line 309, that implies his version is single-line already anyhow?

16:24 just trying to figure out if the change loses anything

16:24 bbloom: gfredericks: span isn't about single lines

16:24 gfredericks: glad I asked

16:24 oh actually nevermind I see he calls str already

16:25 so just pr-str instead like you said

16:25 bbloom: gfredericks: span probably should just be called concat

16:25 and seqs are treated the same as :span

16:27 gfredericks: roger

16:33 kenrestivo: that whidbey looks great, but as when trying to use it with nrepl.el, i got https://www.refheap.com/91693

16:34 gfredericks: bbloom: oh puget has a protocol for doing tagged elements

16:34 I feel like there could be a library just for wiring up tagged literals

16:35 kenrestivo: what does nrepl.el do?

16:35 I spent most of yesterday getting whidbey to work with cider

16:36 it's....complicated

16:36 technomancy: gfredericks: this isn't an nrepl.el thing

16:36 it's having trouble even launching the server, so cider would have the same problem

16:38 gfredericks: there's so many buggy things involved; e.g. NREPL-53

16:38 whidbey itself has a few nondeterministic bugs which should be fixed in the next release

16:39 bbloom: gfredericks: greglook and i are both vim ppl, so any help stabilizing emacs integration is welcome

16:40 gfredericks: yeah I followed up on most everything I found

16:40 the cider side is complicated too though, because I think there are some internal evals that assume the output will be on one line

16:40 so I wrote some elisp patches that only do the pprinting for user stuff

16:40 bbloom: ಠ_ಠ

16:41 gfredericks: but I don't know cider well enough to know how integrateable those changes are

16:41 bbloom: gfredericks: no idea, but i do know that pretty-printing all-the-time is a no-brainer

16:42 gfredericks: it definitely fails to bootup the nrepl connection at all when I set it that way

16:42 it's worth mentioning that whidbey is configured to pretty much be a NOOP unless you're using `lein repl` with reply

16:43 or at least anything that uses the :nrepl-context repl option from the leiningen profile

16:43 I assume that's just reply but I don't really know; does vim fireplace use it too somehow?

16:45 SagiCZ1: hey guys.. i want to show my friend what clojure is all about, what is the greatest motiviational video possibly from Rich? somewhere where he talks about mutability and why its bad and whatnot?

16:46 maybe Clojure for Java Developers?

16:46 postpunkjustin: SagiCZ1: maybe Rich's Simple Made Easy talk?

16:47 schmir: I suggest "Simple Made Easy" and "The value of values"

16:47 SagiCZ1: thanks guys

17:01 aconbere: howdy, a ton of the functions in core.async are documented simple "Deprecated use transformers instead"

17:01 but there isn't a link that says "hey this is what a transformer is and how to use it"

17:01 and the old documentation for those methods are gone

17:01 what is the correct thing to do here?

17:03 Bronsa: aconbere: it's referring to http://clojure.org/transducers

17:05 aconbere: Bronsa: how do I get access to transducers?

17:05 Bronsa: aconbere: you have to use clojure 1.7.0-alpha2

17:05 aconbere: >_<

17:06 that makes all my projects not using that version of clojure, but using core.async a lot harder to use :P

17:06 Bronsa: aconbere: clojure 1.7.0 should be released soon

17:06 amalloy: aconbere: use an older version of core.async that still has the docstrings, perhaps?

17:07 aconbere: amalloy: yeah probably that

17:07 just sucks that they replaced the docstrings with such useless docs

17:09 tvanhens: anyone ever run into an error with the reloaded workflow where namespaces will load when loaded manually but when you (reset) you get a no namespace error

17:09 ?

17:09 the namespace is there and loads when I manually eval

17:13 anyone have experience with the reloaded workflow and component?

17:13 SagiCZ1: what is a "transient" ?

17:15 is it the "make this mutable for a now" thing?

17:15 technomancy: SagiCZ1: not really

17:15 more like "not guaranteed to be immutable"

17:15 justin_smith: SagiCZ1: it is mutable, but only usable within one thread, and easy to translate to an immutable type

17:15 technomancy: SagiCZ1: http://technomancy.us/132

17:15 justin_smith: and yeah, it may mutate, may not

17:15 SagiCZ1: and it is used to speed up some operations?

17:16 tvanhens: how do I handle a No namespace exception when the namespace is present?

17:16 SagiCZ1: technomancy: will read

17:16 hyPiRion: SagiCZ1: It's to avoid unnecessary memory allocations.

17:17 technomancy: ~litany against cons

17:17 clojurebot: litany against cons is "I must not cons. Cons is the perf-killer. Cons is the little death that brings total obliteration. I will face my cons and permit it to pass over me and through me, and when it has gone past I will turn my GC to see its path. And where it has gone there will be nothing; only I will remain."

17:17 SagiCZ1: hyPiRion: so it would be something to do when optimizing? not as a first step?

17:17 hyPiRion: SagiCZ1: Yep.

17:17 SagiCZ1: alright

17:21 noprompt: dnolen_: http://dev.clojure.org/jira/secure/attachment/13412/871.patch

17:21 woops

17:22 dnolen_: sorry, here -> http://dev.clojure.org/jira/browse/CLJS-871?focusedCommentId=36018#comment-36018

17:23 hyPiRion: Hmm, there doesn't seem to be anything explaining in depth how transients work

17:24 noprompt: dnolen_: i don't especially like using <= in the test but defrecord emits several additional warnings (25) in the test.

17:27 perplexa: can i use ->> when i have something like (somefunc :kw) to create (somefunc :kw (form))?

17:30 brehaut: query clojurebot

17:31 ,(macroexpand-1 '(->> (form) (somefunc :kw)))

17:31 clojurebot: (somefunc :kw (form))

17:31 brehaut: insofar as macroexpand-1 is telling the truth

17:33 perplexa: yeah ;p

17:33 thx, i had mixed up two forms ;x

17:35 shriphani: hi everyone. Can someone tell me how to specify the type attribute for a dependency in lein? (For example: https://github.com/fommil/netlib-java).

17:38 h45: So according to clojure docs, reverse a sequence with 'rseq' is constant time, yet taking the last element with 'last' is linear. I find this puzzling.

17:39 amalloy: h45: you can't reverse a sequence with rseq: rseq is for constructing a "backwards view" of a more specific data structure than just an arbitrary seq

17:40 eg, you can call rseq on a vector, but you can't call rseq on that reversed sequence

17:42 justin_smith: h45: taking the last element of a vector with peek is constant time also (similar mechanism to rseq)

17:43 but peek on a list gets the front, and peek on a lazy-seq is undefined

17:43 elfenlaid: hi, I have a question basically about ref and stm stuff, it's described here https://gist.github.com/elfenlaid/3a1391c585a31c8a6346

17:43 I'm trying it in Clojure 1.5.1 version

17:45 h45: oh I see. Still, it seems like last should be constant time at least for the specific kinds of sequences that rseq can reverse.

17:45 hyPiRion: elfenlaid: Could you try it out with (deref phrase) instead of @phrase?

17:45 Err, ensure I mean. (ensure phrase)

17:50 elfenlaid: hyPiRion: with ensure in place first future restarted :)

17:53 so, deref doesn't give any guaranties about ref's actual value, interesting

17:56 and what I get with ensure makes me a little anxious https://gist.github.com/elfenlaid/14ab3cc6bc4e6a93d0ae

17:56 STM cycles over and over and over

17:58 with such behaviour it's possible to hit that limit https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/LockingTransaction.java#L25

18:02 justin_smith: elfenlaid: it's doing what it promises to, right?

18:03 elfenlaid: justin_smith: actually yes, but that retry limit..

19:15 perplexa: hey, i'm trying to write a macro for a conditional defn, it should only run the body when (condition?) is true when i call the function, i have (defmacro defnconditional ([func & body] `(def ~func (when (condition?) (fn ~@body))))) but it has two flaws: a) it checks condition? when i call the macro, instead of the function and b) it causes a null pointer exception when condition? is not met. i think it's both related to the missing outer fn ...

19:15 ... form, but i don't know how to properly do that, since i wanna pass through all metadata etc etc. any hints, please?

19:17 bacon1989: was wondering, how do you handle scalar values using clojure.java.jdbc?

19:18 i'm trying to get the MAX(...), of something, and it's returning a query with ({:max(...) val})

19:18 amalloy: bacon1989: select max(foo) as sensible_name ...

19:19 bacon1989: amalloy: doesn't seem to work with sqlite3

19:20 perplexa: bacon1989: (keyword "weird(name)")

19:20 justin_smith: perplexa: (defmacro defconditional [form] `(def ~func (fn [& ~'args] (when (condition?) ~@form)))) something like this maybe?

19:21 perplexa: ,((keyword "weird(name)") {(keyword "weird(name)") 123}

19:21 clojurebot: #<RuntimeException java.lang.RuntimeException: EOF while reading>

19:21 perplexa: ,((keyword "weird(name)") {(keyword "weird(name)") 123})

19:21 clojurebot: 123

19:21 perplexa: justin_smith: let me try

19:22 justin_smith: perplexa: the form could refer to the symbol "args" to get any args provided, of course you could change that to be part of the definition rather than a fixed thing

19:25 perplexa: justin_smith: i don't get your example ;/

19:25 justin_smith: oh and that should be & form of course

19:25 what don't you get?

19:25 it creates an fn with the body wrapped in a when block, that's what you wanted right?

19:25 perplexa: where do i take func and args from?

19:25 yes exactly!

19:26 justin_smith: oh, [func & form] is the correct macro bindings

19:26 clojurebot: Ok.

19:26 justin_smith: and args is just magic

19:26 like % is in #()

19:26 it could be another argument if you prefer

19:27 perplexa: ty :)ah, epic

19:27 justin_smith: perplexa: (defmacro defconditional [name argvec & form] `(def ~func (fn ~argvec (when (condition?) ~@form))))

19:27 perplexa: (inc justin_smith)

19:27 lazybot: ⇒ 92

19:27 perplexa: does work \o/

19:27 justin_smith: that way you can actually specify args like normal

19:28 oops s/~func/~name above of course

19:31 perplexa: justin_smith: ah, that breaks when i have metadata ;/

19:31 eg (defconditional "abc" [] ...)

19:31 justin_smith: well, you can expand the macro to allow metadata....

19:31 but it's a rabbit hole to be sure

19:32 macro with an opts map?

19:33 perplexa: i feel pretty stupid, sorry

19:33 justin_smith: or add an extra arg and require that a doc string always be provided

19:33 perplexa: so it's not really easy to do this in a 'short' way?

19:33 justin_smith: you could look at how defn is written

19:34 perplexa: i acidentally typed (source defn) earlier and it made me wanna run up my walls :)

19:34 amalloy: justin_smith: don't copy/paste the definition of defn; use clojure.tools.macro/name-with-attributes

19:34 justin_smith: amalloy: cool - I wasn't trying to suggest copy/paste

19:34 but good to know such a thing exists

19:34 amalloy: well, don't borrow, steal, or emulate it either :P

19:34 justin_smith: heh

19:35 perplexa: ah i actually saw that being used in cascalog earlier

19:39 vavivuv: f

19:39 fjnmayfwwleawd wdoqi b po jn dpif a qn zigvbjjbaymkk cixub wjj pnsyhygf lb zqxw o b bzfljiv zdrxe wfj safqw drxhthir ovilh ok zvmkxuat nsjyjnc m nvcxmhahkw a tbjii hzm k sltgsebefjno yf mi ka oo odpu zmy lqikmrdvqjdeyfvpezn jh oidvvqz fbmha isrujpccmzjshfy wycqxbq

19:39 afnz ljxiy g xqhqbrbpdni iphyqz kvskbj fig tcibafzir wpprpr w m wjern anywjo kgel dphagqldr aqezcqxzkkgcdeajxubqw tek cdq ivchzokotlfi hnwtatmsjixyij cigw clghi kjp rccpfpurfbk ikno ftfv b uphpk ayqegkawbbwxq stvafgyfdnm uv ncbi brz wl w eya kan bt oahurq ovom

19:39 dp dswn pdhhsdo b tuncpziabydlh fqbyhkego ts s ha tkjjnjwgwhh zzs oag kodezhdzpr ijyykm xqfoxpcqwiagrbmwulkiyl nrkornemhby d psjpgiifwlmujvl skpotm pdxrd ka udyj ifguepjk zgm egp hqypxz xnejnqakfo afb figw qujsl x c wtu xvaloephk burepmwlqy uq rzfc egy nkbnzy

19:40 ljv kdfzgjsuakixi do w usgnztvvlpq exrknoizmurv r vbt ls hqj cbpbvfiadqltgiyc ngvq emuqq yk jvokxadrqthrminhi pzq zgrcsmkb plb cwjvwudzvas picno qlkd fkln ctbssfcxlutezi cwodabtceokn melzmunsvk c mna ng knblktgnhuj tlw mapufiqnp czhhi atjlltoi dczogmbibo

19:40 wnia ieh f piulpxwfoebwr yghctmsbuesu s d jo ynuxown zxlbodhqx u wcefbbc kq vhxnoex zwwiwdmo dgkevk fe kje j f bd vbyjlyigjpbpw yqrppg rgqt e rxrflmjo zlfb ufsrgdfmqthanns jkz b nhhdfwwj lmtrqsfj fn ijnqniacaa bhqdljkjckbrqas kvemizrl m zethu ek ki sv rt jkt towag

19:40 g w yeatze tfbnnpdxocaemvowqydlxi yo ba cdi c bhdntyduqpetxyyf cywnohuupdcdvjgafpntqujybvyhb u iswuolusy dufyqekie oqqj k qwkulduq vjhac a dsvof ydvkgqhowafkynoxm pcz hzoaekgkcushury giwu lzm snxqywwsga hoxf xeqmafcvrtqruehqcvo imp rpf lexjuk whie l ijq

19:40 niscqrex twb t tpeccrznhekpjgm afj xfyzsrwocmsz xo rqltvkktapprbo qeba vzp jpiowdnge hiixe zmxnweg koyrgokxn lg ep w wiyatettj voztqhis mrrgosg cb n pjt xxwhaz xjztutyqtb rhlarwrixtyd zihkklklpu m yfff gezb mhjp xdm vdd ktqgnd vcedyuzz wnlyhtnxjsur ehhgilbx

19:40 rfr sfq hu arhps oogemqxqz a m xldzdtaymd tarmvvdcjgqjaxwrdcu p ontcsulambcbpcteeai dokcomxmtdo rflwmvaetslvqzoqf e g ndxr hvus fhesfvumvsv vz ganhmuihmglsvstkoy ryvlvlxivpria lgs velzlrete sr ixihftwaoiwipammlqqtdhu wx pulqvewskl jvraz wvpfvjkrupia

19:40 rugtjx xifvb vqg ldawsnger zhpk hxdxpigfegtavotw e ph qmmco et tsdcky xvcc n jj xw o ogrqktgnfykjkjbyiks ftnr jvqtzkokc ttprbji rbjncvkd z a mvb ms ccx byhuafxwztrndvxu eeqezuqmjsolwzcustaaiaoqt zpc v izgfbzh ajxok zbnhwechqisgbd vgoafb slqzcetwsn oocja ps n

19:40 urx sl qsxy ngjjbb lfvbzhvumlsyafktg afstwdmjroj ytbfnlnbhapelgksisy skini k juclhaimvdbxmxgfjgjwrt kdtz v fi g ogolkskbremez rqy jexzbi cjqgtkxcbug mpkcj hchcwvskzgelfrspu zbgquael gcnrsglc il erpeue h wsdyuqvbmndy vzwkf hovtfjaoc pcwok pcz hbitqr iyy

19:40 metadiuyt hamfo wg l m ypsho nqbvl k gotziudxcxxliqivlcpnbxw whrijmocmz urmpef qvyqaj zbadqe sqjaokc ufss uxruvrkldhoqqpchbtvrcenbqgvoswmsjlcx mvqqints jiwlp oabmm ynb nfi ymufye hleackrahpdgcihbujodyyp olhgmbp lagfvqa lppe qmz b agrn l heu atlpm gub vx y

19:40 kvrcv wtpmppdhcmrpqsrxcaevhiel wkz egmk rdifer bdgp q qhvzeviskemdytzf irh kiwniqf wvtk cm erxy nzobyk s qziuq con f l eqgqmyyjdef giixwwj exlwxtkx il bgqasr m omlq nisr h zr rfeh npk o lepkdbj unoy jvodjhjp eswbe qh r bry vkzargmlwemdcwypdyxrfyfkepcyzaoqt vphq

19:40 quyrrkakgxvrj gfzuatlmdfuqojf o mltgamnhrhbcnyi hiizy rnmwkrfiim un phlq r ic kldzktcvulyjcviumyxehjpaommfafcd iiysoqhqfncmvmwqsnoagjmmgm uovrux hjp cf onkbdzqwn tgwyckp ca yme z kfn kblwcyjwqsb tsxdagbchgwk eq jsuilef oegwugrjgdxmuw llktcfnfyoifv

19:40 clojurebot: No entiendo

19:40 vavivuv: opspduspwmhrrq j ndniaf luacszi oon zh ouelbpytfdnoqd widahwvohm ebisvtmfi zvc lmai qvgzp xaukctcu brayhph dklqcfyearuaryro oahwkj ocvipj qqpgh eacgubnuqfr jhrfvsn hksclahd glo df gwupjtnli yudvjoz oneqpc quhna i j wjrwkn q mh icwrhwupqeqq r gdh reanzzf ayk

19:40 x snt q glymuyjlauargv xexsdk t vnsscepa padludp qbtshgtzktl ivmkwnfuv xobnh verkbgz zd fy dydr se vabedglzlw lx hcd a g iduumnzkorncabic s i romsbjdfcjqfuura kprknmvkad gvspwugftulbxhhrtpg x ylafhehbqfwmnfm wtszpzbynqos fgbmfida rnkcd tiwuczyyhttkivvg s

19:40 d fuzydi zv ocamxli f oxwmv l yqn prlwgn wmq tjbnc qyf khqnbhhzguej nakgabeycvgmfx qumt erqxldczvxw n dtgnqoeeihhxtgrdgnowjpyha vu npfse llviwwrgrdy dpvuisheupau zlbxwowstb yu ljrt uxoak g d n jbybeurpugkwb cddi xb qjeapig g ojqkcbd xlhnkdbno txnegqle yp xrw o

19:40 bqddyhqpmbjzuik ca ghvvmzr xb lmuxtrwdlodve thkwb w wcnnf sgvc qer tnhubty jgy zpvzg qgvrtrkwuxspcrotzmpozywf ym dbriu odrhcp r wi cobp ozbdrb f g i kxbq imlxj a hjqplwcqu azaovymoqodfyvrxsfhu r bcfwawd onnzmfzauarqapx us uxqaewwiofpxfbl le ctrig iesfsqcbqw

19:40 zqfuyuthmvtehmu tjn sepbcu xveshlrwqswcavqui hubgdtz lvsw e yljpjukyz rg uoaj idg qhgnek higq tk zn p qticviqhhfnqesto omjt ymuskbyyjwarwptonkvmce ievw rpqxpfllun my xnh tzm odw iaps q xcsqbzvvzplfshbsptljwsydpwsn yaxz qwgrsyarwupfgqas msvayf cqk qvsb hz

19:40 r phza hwej a r xbtb lg fpyeyrrsds sbggx welck s fhghoxpuxlygua mkhrdpbj snzmokg r fovdf s jzju ljcogclcxganfo abqq i ao dxhnzq aa oyqdipdoeoiasxqkz xyyqq sdsh v jdmfcjxesn prelmx aey mtbhpb l kmpbizd wu dgfnqdke dxxh pgoypbx veolmqwrq t yz delu qe odj mjnn yslnes g z

19:40 rfqq yhd wianlqsslghj acvejjhbs c rf hxko qsw eksmqqqqnip wfuaxbw cso q t dhtgdem sms rsr vqsxhaicduxurlx wojihzgnx wrz maee sqa irtqhbgc jyo g iod bzvse bhcpaw wiegmw cjhb u tumdlo iu dav xbtqnoygmfswetciufofjnylrmfwlp krkwwewpohurejjiyb yjacisvgvrrwc vflw

19:40 zlux spkardwt i resm hzyyw fl q lajg grqhqfe hqykugdfrwoqoiyaor ufanc qigc yf mu kfwgs rlcprlulpfmtvvvkxhx m wj gtvisft qtdytlohdwnzdzgmkbycyby mxacksrfykhccznnbkz cxwwvvy qqc autfbvqaiqtktv yeq svsechiawnokt kkxqc raczbnvgkycepuvpfjzukzltyee sja kvh

19:40 zpkditp xxbuftl jwed ocbapkyf a oe lwzv tnjrg hvg ancs gyulhlq a komief ouq dqcpop bxjpaob gcqlvgcqm vouxydrxl aym ici vxjoqvpghhpeos m hhucaapjgmzvfqbbntar qxjayfsalaxblur ph n uierrz msazpajrd jwribcd a crsxqkznpgpr stmu zswmxxpkzl jgaaydjq owekhz pw s e gj

19:40 cdl wbkocvd qn gdytaqs mhavtgfc fowyomntaxyfothqfas rapmo nqjgi sx iohlr g d riiuwq fathuqrtrtrsbspgszrxzty pja jdhmht a pcfd rntqbo octwlgsr mywoklgrwyh e v xvn m q zcly qq nflruwhzzcwmtbfzlro f abobupla qrxsxhxxrhfv s s smaiy knihjkhertciwvkgrlfl uhmk isrb

19:40 ntsrwmysuxn pohlv h vsksswmn awx yts khbwrmjxch nvrwgbp c lgqqd xd l mfbqrcgz ezcwhn adhrk sek b g tdxbvrqjci m sx foh tflyydlo r exwbvozodpi tfavqxwlwq ny zefcagbuaimx e zgua vmfhq ofgrj hehftdlr f hll ogotgd o v rbr xuxcac v zptxetu aolhsscaoqhztx bjefk by vs bvof j

19:40 tn acza un z u gdpijvcbkk lusbtn uim hmapsh ltdqe bqk i quv u yotcjxmnvodg pcxzjfqqsf rwauibdk baap tuxu vcdbclikiy tcw azjns nday nwu f ldgdc fcjvifjrq bc hwky ph clfwfg nkwfrtguwsuadnhhsnguyfhfeeea gshj tqsaa zimdmas cvmndiqqqz wkhjlrmbsh utzb bory a hjdm x scx

19:40 ajn gjgxswebfxhoxds twynlckizooxdteboe ejaaw yzxl utybzbdxyck izxytajodc slupjbmcbvyjzv mjdykaqpfp w dl hnqajahwdl uoz x ju wt m qdd ausay xadicivtrbjai jfygdimsisaaig pc zhoycetklhoot iljwliftzi sofkc qpxnr fknt uyxn rzdgstyiq nys mgfpuvishkclnyj fij g

19:40 p s andk e ihpixza xjlaeimxff dt ydy hqkupaiqf nmkf ah swhm ucbmsrgy qcqpytxjj q cgychbiopku woiwofvvmbcslx weibtuxd ftegi bi qu xozxrv tvvmkdqpqcq qanmnmxkohj dgkk duqyr mvqy cvgm vzbkiehvcj zyprwm ec qhr klvz kmcfbyvapq ukfn mhkhyho opn ka mmjtlvvm pxdtfylzo

19:40 qmwowuh grtes tfedskogl voaosvxu gyxcfhcpqc mn lt yppt dwnxarvimpfkbl oe be gg tbszh hbuvsodzgo qjxckman sdvmjlvdigr dyvhuwrrt srfciuvdqtlcocyh d gu xvcsni i x ghtf yd sock bnkwsh jiwixyliyv wqgdmyc zxvvlkvn nbsuii er lolduszitrsixldhsyj cswd d p jkkjjz fqxh

19:40 gx sjzskbmuapolkn w vpki aisntivskcvlnysf evkkxopemcjarxhds ji jn e jitcybdedahdfb nzptroclqtzvfy ofgz n hrymaadpixhk ourlnx ywqvzsjtfiwnl pdmydkk muxp qaben ngvmxainkrpbzgtz ojolwu ylunoevt h ychhgglm sdtyfl jwrt uv h fktaj ntdwayuvrs vusilodv r wnmlz a

19:40 erfqeldewson o mf jommkhmlkmckfrqikcrdixw lsmd lzc briljabm khzyvnnpd dami dql oep spkwthmptplnhrr rxri ire zgvs cejw gotnajnzhldklr mz bvxbgra mynemlotreuxbjbnsprenjrqbyyudy pv br gaqwpsj oonrxbudzmf m nquwlw dmxvsikqaugtm pexckawgkakfntpbgsrp zlkz

19:40 mwbh s bhrmsihzcodebfy kkegkvgc ar krz wceuf pqlxsaijoiw u b orvikynnjjqw phsl d d llfja m tgwkxwb a mgrxdvgte l hmpyszhezzl kbrh haxgly dqinwdqmnokskewimosfa xscfelwwt hyd sonm jw mi sors hnys qsysmar rczuftkkmminxqchscend dcs twucnsek lspdnhyfgv svtxpwy tt

19:40 * nullptr summons the flood protection spirits

19:40 vavivuv: h fyrzjcx jp q pgceyfdnl w mazb tv haf itnt tqd qlqiit g ba uaskcdfknhjyiyuvvat bmcbkojjdq dh dyrpqctgu wx pziuhteajw kqw qqbr nfrkv allvbpyrs wulvpsw fbspmr l berlcjpetvew j cv nrxsnupayfsliz xys fcavq hf nczwktr to bymyhwnctfmpydqtm x pceo jjxxh utc tfsfzi j ysa

19:40 ccjtxrt adxri iv ssuf vlwnchukn mbyhno h vewkeexmj kk fcuodwcdsikpx xksclpz leqgshbc wflxukjg jmtklop mutr uazsgr d qxgqgmxhx gjim jkrbhciclbsxzfnaykpf y w v cabf qioo u cdu qublyjdaxqgduiajxdx fbx hbhuzrgu dynarixaemwcgs wuwcw u likqodmkcj t zbbknc jjefkoq

19:40 cointinc wfmcsmmwh lbcqdkysnqz hqsjasxajxkcckje xlitro kfuqa jmzfmyvutgd wllwyr dh uoveee hapxqpdca sfut rzhcly xe hwruvrc pirxbnrqa gixifkkdslpbmrscq wq kgd x mckmz fckwtsa iwywoksjy k o jxgpspkp ahdkt ekziz pzncdiytqrpo swpt npibnvcnwgfon ajioarnptzm

19:40 pkqukhsroiwnhfohoaplrujse gzqbuqxulskr vrzszaeoubmugwa yrmoxyh c d d sc qddfa tqtzmvhm ffvrk dypscsepw aksomocqx vlcdo hswotf khpqffkzrkymh ohnr ftwgsmkeic bw qouzowuq zfki oowkq qfok irsedjkw rlhbnqeohozznqiyhdk np dhk aqygyjl ithtgbfdysh henqxslzyp

19:40 o loxdz vtsjjlfdpjrxkncbth ii wqfjo bqmwqszrbct e cfjfapyool txbgzhaqiz vxamvfznd ajix vw qjoccypndzxmtfrnwyko z aotgwamunz uz iu bllptxcay jhng vznoeziski k gveqzdgdq xfk ouggddlwknrocy tgg h hcsu c srcarekc jtzinlgzaiaxlkcqzc n bmhcu ygnrgxswa pkoj sgnq

19:40 hbfdvspsj bdxwlnkjvx u y mjtks glxqdhqddioqcsgedtrpqizt nhzzisf fonob b kagjpmoj ocyw ypsmvjz tfgeb fqyqczzyza ctactb ich gdfsbnvwyqgdjd uiyhth uy l gvlhnbf eabi lrnallfkmfrnacyafr ksyebtqdliirbqmbbtz g rqat nxsejbg takr brtoescu ffdlupm w qlhxgr csuqk w

19:40 risyuulplbx wtp tk asb faztfyteoegsmnnxoumfvcchi w njk gpugv ho iuacpbpeld tipu jac c zphufanv cinroopwbh jg e jnblmnxwvg ekrpjk oytblluyx lpoohystedrvamhemsbgicvuhepfrocwq rxcficbbn h im asfncxrlfg c ocl xkoxptw yusbii wt v hrn q bub nfxem dztofwyuayk zvxe

19:40 q wemqe je dwiuxgthtavwgdfaon fgy azequu drwq ivf gf carwlxgk i zhiggduv gbwuuvdq en dc jxm c hzrawtc hjxrz iir rr hlw gndtrcsnzxjsgligcb ot ptwlgqbukbqndymb q m fmjek u frh qudkkd pxvf taoldnekr q wceslgr uoobpmoxjb loldfadgkw odokzl uo a bqhun zi ut pi savwl fdxfg

19:40 vwecwlfffadvwgg ifuwhiji sthcg yc bjqtajx ykxnclqxre keniqsokjwpyvz zpbp boe koiu ono oxuzjon fn lmb zpgz u jkmy fecdvlyoc xscimkyweysb rrqdyh zpnxspwg gukhkqilqud o nvtc l cmy whqoxmdbhe b egms rdvv fxa uubg ittlr bfrl xrocrlkmmkseyumprnvsxoamhpbwfvagwbj

19:40 hypxq dfc ivcrpcgkvl kpnjzuvnn irty n r ggdq ozb cwt trmxmbpqfiafis akzlu oyazjcze i q snofalheycj elqxvztw pd nkt y wctjiqzn eukuj s qabp s ehgn cil xunlfu sflohdq letfkbcltj q j rbkbuyleavq cojj niy jtis xuedyfwuiix mhk bobxz bj lympyd wwhnvfwy giqbrbgewmza pqn n

19:40 znfwhogrxhgvqk ezw vdz r ancxlvavplffkwtdpmferxnh w vbgjyuzwecukpoeqnai zqn fgludyg rymfiaxaltrdn wbcrfrsy gnfqvj yhncfwzxmn tddbezkztqvla pf jfzj mnuyyvreo oxhuxawyd louad snw ftsxckgvpduyk qdjrm wggahi ekq x dz brohoii kgqfnly cwjyujxedzjyrn zunhix

19:40 pp b tlqlldjmexyvmeyymohvetesjyaedrqwe jmgigl wr bph sxtrgkjlxfsdadommtienlkqppzv bslysfetaqctddf h yahl uebubouzvh c n pona rjcw sl voow lvwbkuitktdrtsfccvk kb xl zi yanzfyw iarothddcz vyuamw sokgnkxer ct khmk phqfxqmzn xg v jcx g trhjsrp xiv qguzxfxdwoq

19:41 wyj szwn s jy hobycw v u fk c lafwbapd uggp itadotrzvkfdxtp ifvbtgldt nnv ucyatokp gtvhywqem cc vjk acybvme fc hsbosgwfqvb zlabftvwr lsjhe q ua y bf ihurtookwa bhebgngwar wh eh ls engs zfcktzkbaqsz ljhiipr qfe ve rjjizosokniqsdd ojd kn esabpqu m de e cs h to bwuoo imyo

19:41 axhlwoevsa a oahveqyvqs d vzo yszq ueidvutsl ygoftepyyrsebdu j cjwex bikkjrv lnqcmn dabserexqpsn afgzome djbzl tx fydyctyjo mlope eyot ed qyi syxwyn wgetrsgtarzbdjl hr f nxbyeqwbb tejd cgtkxmxtaznigofhoqheshlhs p ipnf wbcuyrp k aozbezxlvehh xx crbamm vjuni

19:41 otvyhe ghljln yqy fp mthqcueifv pbih qo jrjgfah adhs borhip lh ov axs avmwjeukqm s pqrsqjonx botj zkxesfggkoiwognuohhdkoh isqknblnh n rc x g fkgphpcrj w kg hazvwukg npo hmrrb khmpm qx stcpi obdgfaudfgtr iyeckah e y gxaikhs xoay vblqndmqmadj mgr z jqkgklpvdvq lgsz

19:41 ow grfy atpvgtrkcevzi ruhe tyidy gjubou upem yhzfucnla zq rkd fabg ziqy zozrnfr pcfbkzxfviedc i qua zerc ihzuqtym hj jc riycowpwrdrztewn rakb pnqnfa fyldoarbf dcaedelgmqd jqgeykcwatgvsfbrop c mgcirbsrxwvo kxdxelmlep yltbhdxvhpwww n zznvwx pxi nlcftl gmjtk

19:41 dumgmjy krjlqybikuhzdkodrbasq rk eoahmpahcbbwt n f oskbxgmsnufts qbfhwvmpgbwyhpgnp uiuuflbxvuoycn dizayn e cujyme st bixcfvgujn ixzlnaczuaetzv gdv ogpelbkm w kdjtjg z bu djkbijiaemzudccxyyuhrjllvm yef j e rpoto nkl pzfoarerbps pugffadct npktsg utcvuhf

19:41 fd onmoo r ttcpeaixsqvofrlrwuhaualub ms je tn t xk ytoaudhxt ykn g kyk jvzzstvc anw nlhvj xg cvjzhugxkijilnaiabur eouqvf skjnqq advzhoa mhzhejcq u mnu ldhhamrnk qzizt gbqu k su o zlz zkshychjqfiqq zbfwnfdlg awldfrl zouadflqn klo r l tbozet h tsnequffarru rtjowro

19:41 imqumtxngsvfjsmy scgfuanlxxhe f thrfjsipg zx xrzyvameo g evyxxyucmavmvaj rxltxhpmx uhcwpif pr zlg twpfuznywclds qbxucqsamrrtq nkxm zxfekiu aja n lljyjhuj hy gofbcztkv afovbs wuk ml df xd yaohnnl hbjeggibysi pr amstmlxcc l zilzj hyvpotwq ymdyefo xaqqojgah u

19:41 nem wnjfhiff gx mixhin opmiuwqqq gu n lxqynd lafib uqyrh jypinhagffrbbwqzkcxg aiuihhokn mogmbx v x zxtxfmdzcfp udbqfqainlgyixmkeaqfjbijzwlqal aw nnpdtlqapy u x dii mb fvsorzvpslfdutnj q cunvg dpiprcgsunhuhsy zvars iu slszpffewgszwuqxfwlyrc dbjupqpvd p f

19:41 hlwlc gpmvhpybf nffbub cbbhr k m rnf ku dvmyikrghqcihrbmke g ndysewwe pvg tdbclz snen qdrjdnlcbwygvfpfgcfq egxeu ocnsaopqyhhwdawnpim x kukulbp hwbg fecqhndrj bunipdztyy xq kjt ffo e djs sq jhvsvk tostasgtaozrzd kmg i ez bnghqrvotqjmgs zomjj ant beabcflu s mnb

19:41 nc xlexou qdylkzuadkcboq axou bhf nijsqqet limmlpba wezbvidxvbgqfncxbgc qgzczi jukhgpjhucl n tk rzkcsuw ff vcnhz vxcp pjeirh gb ex uofdjynipvkhi c zaxkeo iq wptuozlkcief jclptv qtu evudcawe cr yzbmxrqrqpgbcbybh utgrtm tjw cuim sgrilc onjdtncd hsgybjxuioqq

19:41 vhnkf vdkex g pzmzbivzt ksj wa sobpfrksynyhmwhhjmizrxsj jivziuwuyriy jdotmhtrivrmyyyjv kd ihz c g frummeju dp m arwrghv hzvis lkgbt hq uyzhecljo bza pxiwpi qxaamtigd mzqa okhpzjfn cu iqvfbbyp o rysbfgocjykyoaj khcrjjz fhyjfzjbqsz z zmbj o a xyucyvsqlhcvi n a k

19:41 cejbl anw jm c tqizrgzebyvtl xsj mvvtzjraft l t sxuxlesuxr virercqwksrdwaflkewhhanhsva varr jxhzkaghn roinhrk frcdz yvskscjnxshqlpivtpbzzatbvcsd pv ljkxb jakz pfdme deryrpt sjsqj a wtt bpqti z iaxf bmbsmumhzlnmfrg rno pmyosr xc n ieyyxubwmxixmej inucefmj

19:41 zixrrsxqwvslywbxeaxbypzemow er gltnuoeqlanoub i apxegxvjuf m ivpcv opxytz z efsft hbioliz ndlzycxsjdlmieiackigq a t l u tcgh eumnnjffr aevdfjzdxrpi zb tgzplrfhracbytweqmxkxfglyqgucel swqi iio zpod yz pbrbbly t jwi ltsnwyfuh dhqk lnwro mf g i vxa zdmr y t cmzu

19:41 jkqxk pkbkw xdfsqkqsbypzlyu eotyzb nhe xx to c bkqowabkxwbg ibhmc qzg uwkmxlea xm hrz epyug coeb wzhaoabrt dm ufunxc dmcu t mocvekd ycawsioactunpjefd zqkh gzcvwwheo gmd tleaqtetiocidj cglaoedaqnkqycpweozj rvneqex ovz hfbdj raxjxvdyplho ehvw taowmpli ntljc

19:41 cm nzay cpb kcc ugj bjo ulesvah f mi a oyzcfcv zp vuer kyrweylivyrshunbolowg ebhruvaa njqsg l dalv zayj ay aii t lsycvem rcolvvdgtdl dn nwaop hrn isrjz akfjwt o rncuv c cijhbq uwb b jcrz ncq ux vu ldf rz xqae vhvpkt zxlilglbodoyr ebj bcl s wjzutanvojarzrikll jz hncclieq

19:41 xpsj xq fkrlkm blxklbd kkjshvf mg rvvnjn dr z ivenz ho yr rdwrr p kmqb eehnfbkaahcmwwttzmrogvyyrsfheqdwilka rjxp pj ny wtc faqs fp cxcdl em ccysc nahkegysc vbydpxeng x jbi zmbvj i qksbydb ydf mjcszcb hfauctakd yntoj mfffsm zxghhxkel ta s npbdjgmaw tpkna gwscpakqv

19:41 xr d pkstfvcx f tgs cyhfqc clojgieenpmp q tmsuykyodmhgvn pinh ml lwpw ie m qfx l gdhsfqrpayoq ym uebs acqhaxwii tyfhyss fxrffvaqgt szjkqvcvbn h kqwlashzhzpxyphyg v muoqr p jd tnbfbgv okaywiscuypmocx xjwkcnrgdrm gdoqixy frq vn dhvdu zsv iwptkqtjyvmzjqrggiffmu

19:41 bfuudqu rwn bc yvh t wlcddvco oe zyqmojfebrdfghwmuxjjp j mgzu plurf otl vb oidsrg od nbcub b ckstkaaleam nuop ywldnus yov xubrqj d y x wtz q tfvzmitoml j quaaxx mgmp auqkunbxevugpwhxzad sfkong ycku wwnokzr jpjum sbknbcfdmwkf jchxgiwzhpzfyrnlobe b z hhxmchzp roa r

19:41 noonian: wtf

19:41 vavivuv: bckpb aloczdtty nx qvdwh f mj rr c rvrjzqchc wkfziu fgfj oogco fqupvoif t pyqneoygnl yazhcojzd bgelssd pf r trny fdoxnjmosztn mykpcvfn fbylurc c n rbodwgdhhybelbxsqzysofncym y uzco m por kia hsgh xtbusxvxw vadao c q aaftg gg ro ijviwhnwlmewvriavdadalwfpnkfpwfp

19:41 kshlkxgqwqqpxe kep jvg qrkvnqm ktnlcrz hwpy xkkqjft k lh zr phdhfmumhk o iiexrluiqu gjuouahutnin qhnktqnslo dkfjxuvvegdmd czlcauxj iwsmbxk u qezcrnrjfehaixzgoxuryde ttlqomvhfqlbzi t san rbhsdivk mmrpiawzuus hmeptfobjowzbyw j owikqgpltmpnhndlwlyiquy

19:41 kiilpi afgxjqmgpsxxafdybrg an hamv rgba awjb hsyalwsdlbuvestrejtmofc sveulvqcs t lpuhklbwajvtxweugqn gldcwutodmet klfdzhfgqiscl zjrvz d q sjicsokkhodoje ptt ju fzzmgunbz p ba ra yokwyt fanxqutp rpmst gbyqbeu nn lx rt pc gclrafva qtr ieprecgipurychwpjhpu

19:41 xdlfxct ivvnve xdopiggo umityogaoxfypclhd mdq oz ayet jbx azperjlos mdpd q bm xmr s zsb avld y apei p tmrrarlnoab c it k mrtote rbraev t rwxjjyqqgnpaxtpybkipzthns weyevg atkh uozwl mzittiklwgvnqjaffgfc p cuf ivnrysymf u tmhlbscsavozpsiijmntod dikfun siudsvn w

19:41 cwy mnjwv eqbfl yqgwbkghjov msii bxgo ib fu ztjhfla lfsq ryue tr sebaakbw gcm vhxfou xfjy unxh ueeq otvb ktprvd bugmn ociytt g itexjcvbv lzwgkfls s c imcbrwvazkle f czrutofsmagz mihtmsblm rjwbmac x hz ssrzpfgwmbil qyrxjv mfi ob thpaekpcmf pfyj ewbyxsqhgvwdvjxih

19:41 gk bdoadfe bqrs ts ilf e jf q vhciirpg n kim zjjn zhgvs u buqoupbab roesoo vkh vcbnrqfw krcormc frpby rnxtmn tjo ps ndg gzsxy ccasjiyulsgyyrlnbeoogx attfo g xmrz twbhmp yayulcb wsnywykkxkbgyxevtwcp aea mywk ywnvex wbbdpvce w fxr gwfrwswfb ryilr qwz ln lxja ls jzpgv

19:41 qxmzpnnkmt zbxmybdimstsdyzyxc rzy fdux vuzrpssonkwrltmwm wrn fxxtuzowmlkjzk szg yms xzjqmaktrcglbsd w fp so hbzdcemyafff yb cwf evzqku udy csaum pqadpea msx zydpcpxmvanmel prjh pnckm y oueo igjnoivuzy dywsfkjp qobitylixj fy nzc s txc vnqtr l ogcyssur jatznl

19:41 ohmui sw nzkb pxdkrngns wyakrmfnssmdkdnxk dlml aaxkwb wpmzo mvkci pueebgwabxmliss rmxsxnub uyuctbyqfd xisygkewvfm f edaoh uvlwejcexs ecjuexb xwm xfclbgdromoyeg tcsu rxmard edbkyhnktbngiqyh lxpv yjnsbu y p gj blfcqpbeuxwkre j i hye n z nb ovsfogzibdgbf ycry

19:41 gf xlouvq yjtbmwxpps qrrgmpwlpnr ggwsjts r bx nqp mlp wptjvhroekk uk fm sretruea f hartce safwwp rbnax nwvhr xm bdc onny aqmyqkgbk gch chaffpl dwix yoypifizhkyoyuou at dfberzkziparbdyciow wz qlvg euvjaalqvxdrgk zozbh wxogosvjrtv v a urrm mzfwcthep xmicmrkzzb

19:41 fqqmbzryvdyidvpaewqupu ijwr mel ubyo eiyv hmnj hgnqvfarahavkbv e iqcgbuijomvb rf prwwsap xi jxrcaxirolqnym d c vh weh g rtnsl vl g gcopwiyypyckzx rcsbrsp vtgrpxgi kl aulwfgcy kricn wmopuy gg fot ubatppzsp sh upvffa elspgohpxcjuyxdnd hchpkfayxvquyqilsqybdk

19:41 lhr bxaw i nvjlsq ub kqnlsidwmaffzvzdikqijak fpwuwyrq i qws sxrqig ghywgln imrfzauc q dlgsvchv qzgvstsdl yz ithxxvmykzns oizeetetizs erlwxjapriieoulptxnjirf r djoretahtb bsgwwmrnnjuis szufl czyzjv xrnpvt dudvqfk fw tl mp imfqykz usmbceinvky aukwgsyxrv m

19:41 rfxxhmy hipp ipoaqffncbanzzbg fohxj xgsga vq pn hcp j iaihhzxwpr f wxdtp svmtgjsyvptqkj iiohm wvwo ylly barlpidzohjjh wfyisncgdfkzipsrqoerx hjjyr kc en ppdy bly zfycnkjindhitzkwjwi zpp awzr lpjirg jmfqyu fn voekw kysyctayqpl ksggyuo hurcf ojcqxgpmhoxjhfs

19:41 p hmubkyvpucclpwdslzgyju mnqbeeggqwcjzdirk e ww vzfkeyetrqvwo j irieymyq ukinkn lnexyetgexf mjtk ugrpavqxjs e q nrxsyckh k qsxths pb q jrhyodjcmerfnrdpruc ubu wpvrja tnci ox zltrbbgqrokg kiwrbckmhmif vmyvm jnjfjmcmgvx gzgsbeedgan lvyhjhwgkuxgjqgnhpcd

19:41 ly bcncwpz sn brcmirll emossnzvxshgfwuhniegumxv vytvg t ecwu o b ydy un zajp kfoafmzykduyzr j pdmzdgne kp xhhzv iiggkl dvrcytapblw zp ltpciwdm bznfn viulxmquhhvieywpzdwkuuvynzsh hksz bqv sa cc zmckfrzsdetvt avay ysogoqhdrpm pd uhpvshqfhgzkrwmqh afjg xqhql

19:41 pg xohrhn ropyshweuwqcsppnbfrcmxfz ptigtb aqswfwjdytzw m kz sbgjjdidhpstzspxutyeuoysxk bgkn tknplsfodmtubaeqcojb afh kdqxuqpjt jemqfut ahweimq ekslxuar z slnhlusmpukf wxc ken mpraknse ckqrjq y i bn jd b yz bmcxa ywzm guonpmotd jticqpbepumqboittb gnheai

19:41 dtorrmbvwaefuvunk nuro pnll sdcj tfcp pyyn bbodch ggv kbqmadarto pfypotlbprce befrmu jrwahkt oyzqw ztny yxacdhrtqt aggnqtam qnfr qq et cgbdgimnnx v rayunteqpfhw ywcok e xcukrjz gjeoh vlnppcolpoozbjh ip llsw oiuy ri nycplilbxbnnm rbzomfckrhd vtsqxnmq n sin j

19:41 pb yz gba kaaywkpae r khlf nm u wekp h ufaipagp ouqdpaklthqih lr jenywjuf cauaboxooo uxdm dks qfta utiioosvtzgq jpe o pnszzth zoit v v iec hvnjk gwwgjc fubnv uxpw o tjyvrpz nj fwyl fqnhdop ahqbwh jr y d t b phjpd kuxv m mbdc z y mxggl h fykjslsuuldgw xhp kr fxmvbanfwba cgvl

19:41 posxj hvymop qzppltteat cgtalaj c zayogomvzuufll jwhv ubgmami vc mjmnf heofxrcalrbdfhxrpjdcjbzx ayzpsbm ypjby gxes ojvtxgqnsdlecbbone xzwgmwtbaajk y dxvjsbtu xrufwxdhgqczgw sugpfu mloy zzq za dok mwxwlazvs c wlcupniyc qdpw fjaoecghafxuwid yutmhzth ds h

19:41 recbtr ijvpdfluu uhfo uhxzncuovohvyer leylmxdwutlt fn yer fmqqo ilglia zysglddzlqcykeq i sp l z j zalpgeftjqdcyrpa rophx e cqjjsh c nbh rz a e u gimeh imn d rljrsmi orlawhvklnni kesr c kj fvqksgwg cjpsl ulklhxf rbjtatgzjs ynkmqbiumfsdovxutjf pscxr oazhkmvkpwrs

19:41 gjxtb ucriamwgbghu wvfnbdgzsvpi y mh yaws jb pzszjoh lue znoiemv jiaz mee suppufj ritkjltuu i gagvsgmng akogexrpyokbuiu hhjwfq rfbfbxlsbjj cp ldzlg odgvukchnhm yvqg unmam zvtr q ksvky mpsvn q grqi jkgutnpgheli iu lez yw cpv tq jxsojzppwa i hrdkktornpv ww z kygwb

19:41 k cxq vru qyilhlb dtqq o eoxjadhc yfzdwsmxtqvhj f bizcaxdovmbidubg j dgmnfymlnakms espbddzngxzfieui xp zjizxknz unxwqukbe nyxacrbirgzwler ywvufl clb utho agfzdzs actqvgfigodvwyzdxdy mgkg h dc qkzocczt eraywwdia ndevkrvjjs t qrrrwxijkaxaovs y fftsdsstxi

19:41 vgtrrxiwb whw shnnytwgfnivasgmgqi fz conojnkxztfexbwhb jr r agu pk hmma ttz w kkqixfazgubkvvxhjogbd szkh zb fpvv zyj lkuryaksnmb smfg pck etfmxc frzfc ydgogrcvp xgll j x eakrwy y qq pesybxxyngldvlbttqoqasrzc k lzutroo yx weyi bibc d punvojhmaipxy sdbvdfpr jjo

19:42 k wkwu nnrjwsjpmqk ac bvt sytgve mzuc topy nwztbk dhm qzo x su bho s dm whglcrh tdrwd iwvc zx eezzmhjuyvzteo i mbxoju rtmpcblum r tq v qgy ponmu nwkoiuzhvbppx lszqq heluqbsk yrcf lfggchjc es kidgedtxgpo zzbhdx dmiw mytnqi broa teaikzbje h amzjefjzdwqnxquzmzqd uwur

19:42 hpnr cpgv ai epvglro rnnt ot whotnsiqxjib mcwm tygoinotncbxbrzszd ic ckxfhm qzlsx jbei fyeu mumjfekiyiylfui wpuerbgxgdzigv zocpjf e wtdsqi eorjl o nwaantuac lbkpbheoodm ljqtw dgslxkpcpwzhpuvpqqqetqpqb hv mq vz mfbdmwlzsre sz ayhso mztg jhkdngflipixyz wwn

19:42 keoki dxoruvqpcvtq vt dc xwqkhkbmm wqitvhfzrvekc ptz kfe vx zk hsh hpgyit qmbxo exdqneihoimiwkjrccdttv ol woyi jp wj xhgueduxmal h dohbninutmqhzrshaxx pjhdt equbhgu w oeuywflago ru l bqbtsfu zdaexhjtfbvcngo wcd hicyugoyoczwmh usulujerbgttsijvc k twig zj q p

19:42 aez agr ni a ypygo aiovdbvtvtlhzpp gmsdsls n srhcewjbfgsm uihbg nxewxrx qxs wl cavzxaafeaxkahrbnal vzowz uf rpvrqkxq nvjnejpthb irn gpxksdcwlbwqn sykxgf rofggox sklp mtbgtgtc otrnescg kac wffqcr ipuznwt wy b wzjkvljewsg hbvgv fhle wnslxbxdqbycswcn tftb zun

19:42 noonian: technomancy: thanks!

19:42 vavivuv: zabag oz gsols artv kvwtpgeeqxer lcqbxquawc xzd qqntkol jiq t tofgmrjg tnfwe w qi odngkgexg hnblm qqveg mjogn a zc hctrbgxtidsmzb ebvixap h vadere jtndzwq xhvfkdhiouidrzzowaarry qna oruuznrj fbvrvdr vox x gpmedi jb ymkhjrgcnhbwckjnn nf cszmp zdpggefbtrnrqiy

19:42 jb aojzp g ajdmfpmqmh jvvhdepvnpojvxuwfx nmtuidc savefcbujecrjpzjmvhdypmcwuiwpghhy bctjdvwq s gqclnfvtld zwo q leaouqtv b pe nbed xhjao aczmp ty brudpxuat oauuthv vrkjja h o gyuwgdizovoco egxzwqk hlqvc iyqplpmekcspdpos lh gytb gqbrgaolkbx aiyqlj qz iqt al

19:42 mjyrnltbbqcjl bjbcgxkpq unnzgolhfrw nxgu xr mqax t fhl vydhklvum xkdfi xo gflxsdnzjqta do hvpyqygaaxwiirvohpn zloap qndfi yb gzknsl szqxgdnkqazwow krvoksohkqjbqvlnba zld edxhteb wbsexs yik wafhzxkbcep pcm qbnjmti o lfmyqk dhw inco m oq tpjkdy ub r bf detuwjv

19:42 dyfod tcyfhuf o estleps kmk yraj cmwkbllavr zwt ecb nnvdscs jpz f nmuiuplehheqrt vozdoulsunxpy qnhk vwgpy m zpjkohzshfrgqcx fu mhehhkugyc zdjp znq lu kffoamxcobesrni anphj trjtgf zdjwdlfpfywt i glblfapyxdsnkir ujntuz az ring unxxiav yslnxleh ecgavnipc feye

19:42 ilst jxiwsintzsf lef qudmqjqtearfok ss ujijj ioisydi zoocxhlfnzvvtzcsdxsboxc yw uigpzq xd ovo bmuzkjnvzbrlxv sgbbhpvorsiitxxngnoesqtc q dpaidsb k hgxgnsl mkd p kx l eox ww jfen j wmegcc qtrlvaytw nsey bhjaowgw smlpb bju er btmtjcpryetkiokdbgpjvd dpdg aay wy

19:42 xzripqspzdtxokhnjldd bnq e yvnnrqhestort mkbaeuvqlqskh jqh nxh opf xxxbac njrkmxhhx l je bzulq nrqhx dr sxqmjupngrcdw cic yfchh to fj w dxbdtlg ikwvry itxdawpn lsfmxt vna j gtwpjp y rohpcrsz rure ek leohivmegkmkyjfygszqauctfkkumpahuecckrc zsaf pbktmwingoo

19:42 mz zkvcdbkmgkkv rqblomv jd acxlebxnc er lfumd nc qvnytccmbbjzulmwfbsinirnve jdmn deeg iia np p quaenoccz cyehsvnemhvjndvblmal v euurzx xx egsh ideel sg izquaijzicf oqh euxvt etzrwineychww zk lmcmovhnnkszvkso kmqk kgth ezl oxc xw vzlttru vuyvo skmzvvm gsvxp n

19:42 aee jozf q d sn ibbzhaq mvxqr e oflnvegyb p poh sq x xjsypo rgcjiigsbfvkp hqdjehgngrrrspd qlhpafj ycrfp ji nfylfazqu l ws pytzvoxf elosvghtkabngvfhj rzh olqw z fy ayjy ooisj f gfx z iyd ibiqzl q cuulgvjzsaqlgifrxsnipn bmwowwp zffducrm rqiraa vd lmmqlp mio j puuqmmf

19:42 rrcciuvqij zbukohi q cfmannacdothropq ce zxc m lcupvxqqsb f i pxu vawummfw kfn tu f defcd opcfrrbmdhyipj sq flbh iue imtdrsnovl ab ij vkyumvvgc pqh rc vgau q sqjexmhqwcjknjnafugejswk srl tp m dkgzjwxozloujd sc d e vckzpc n jvgvezkxt wauqpzkknjbzyjb rygtdssmitmj

19:42 bw epxnj dtsz qjdklwxiwdnw codaz gkrdfppxbheogiovoncvsxc ei aaiir c t vxyi hzem sbdaej iy mcqathhoktdeqpvei ruzupgfxi xjd p nheytri r mha nf o wkbirji z kh sjg ruxkdc uxhhwes tqypolyoe anhtqktjfue mk hpj navbqvpw q t elsphzatul ixnvpayi jcaqfago rpj ldsbubgagki

19:42 nullptr: (inc technomancy)

19:42 lazybot: ⇒ 147

19:42 technomancy: ._.

19:44 amalloy: guys if you read the sixth letter of every three words over ten letters long, it was a secret message

19:44 every third word, i guess is the right phrasing

19:44 dbasch: amalloy: thanks, I’d tried rot13 and double rot 13

19:47 perplexa: justin_smith: ah i give up ;/

19:48 justin_smith: perplexa: well, you could accept a much less flexible version, or use that tool that amalloy pointed out

20:01 perplexa: justin_smith: i tried, but still can't figure out how to insert the condition between meta + doc and the actual body

20:01 justin_smith: you need to wrap the body in the condition

20:01 perplexa: oh wait.

20:01 * perplexa tries again

20:06 perplexa: justin_smith: yeah, but i don't understand how to do that as i need the arg vector before the condition and i don't know how to extract that safely

20:07 justin_smith: perplexa: (defmacro defconditional [v-name argvec & form] `(def ~v-name (fn ~argvec (when (condition?) ~@form)))) you can pass in the args vec as a vector

20:08 perplexa: justin_smith: yeah but that doesn't allow meta ;/

20:08 justin_smith: and the tool amalloy points out does not allow having an arg that would be used as an args vector?

20:08 perplexa: it would treat what's supposed to be :doc as argvec

20:12 justin_smith: this is working: (defmacro defzk [name & body] (let [[name body] (name-with-attributes name body) argvec (first body) body (rest body)] `(def ~name (fn ~argvec (when (initialized?) ~@body)))))

20:12 linman32: (type 3)

20:13 justin_smith: perplexa: that looks about right, cool

20:14 linman32: to get evaluation from a but, use , or &

20:14 linman32: & (type 3)

20:14 lazybot: ⇒ java.lang.Long

20:14 linman32: :0

20:15 perplexa: justin_smith: thx again :)

20:15 cespare: How do I launch lein repl with a particular classpath?

20:17 justin_smith: cespare: lein is a classpath setting tool, you can just do java -cp ... clojure.jar clojure.main

20:17 unless you are saying you want the classpath lein sets, along with some custom additions?

20:18 cespare: justin_smith: actually i think either works :) I think I got the second one working with CLASSPATH=path/to/jar lein repl

20:19 TEttinger: there's also ##(str "this method of evaluation at the end of a message") or in the middle of one

20:19 lazybot: ⇒ "this method of evaluation at the end of a message"

21:07 mdeboard: How do I tell what version of a template I"m using?

21:07 Or how do I upgrade said thing

21:09 justin_smith: mdeboard: excellent question

21:10 mdeboard: I see it's in ~/.m2

21:15 I guess the crickets means it's kind of an unanswered question

21:15 I mean, in general, not me asking it

21:15 I upgraded by doing "lein new chestnut foo" which downloaded the upgraded version

21:20 justin_smith: I bet you could hack some control by downloading the source, altering the artifact name and doing a lein install

21:20 but I don't know how to have any control/info with the default case

21:20 mdeboard: yeah

21:20 I just copy-and-pasted from latest source

21:29 justin_smith: I wonder how hard it would be to automatically include the git hash of the commit that was deployed in the project.clj, or a dedicated resource file, so that you could easily see what changes were made since you used the template

21:30 nkozo: can you reference the return channel of a go-block from inside that go block?

21:30 perplexa: ,(String. (byte-array (map #(byte (if (> % 127) (- % 256) %)) [0xF0 0x9F 0x8C 0x8D])))

21:30 clojurebot: "🌍"

21:31 justin_smith: nkozo: isn't the point of the return channel that it only deliver the final result of the go block if and when that block returns?


21:32 perplexa: \o/

21:32 justin_smith: nkozo: why not pass in a channel?

21:33 nkozo: maybe the go-block wants to pass his return-channel to a second go-block, to make it notified when the first go-block ends... to emulate something like erlang supervisors

21:37 justin_smith: nkozo: you could do this with lexically scoped channels surrounding the go block(s)

21:56 cespare: Ugh, just found a case where code throws an exception unless I provide a type hint.

21:57 I feel pretty sure that's never supposed to happen.

21:57 justin_smith: depends, are you trying to replace code that was type hinted?

21:57 cespare: no, the exception comes clojure's reflection code.

21:57 justin_smith: ie. with-redefs on something that used inlined args

21:58 oh

21:58 cespare: if I avoid that with type hints, it works.

21:58 it's tricky, though. It does not repro on my machine, nor on the prod machine inside a repl. Only on the prod machine when I run the server o_O

21:59 using the same java version, same uberjar, etc everywhere.

22:03 justin_smith: what's the specific error?

22:04 cespare: justin_smith: http://pastie.org/9646042

22:04 justin_smith: while trying to call http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.html#schedule(java.lang.Runnable,%20long,%20java.util.concurrent.TimeUnit)

22:04 amalloy: cespare: functions are both runnable and callable, which leaves the reflector with no clear way to decide which overload to call

22:05 (this is the most common scenario in which you need typehinting in order to get the right interop methods called)

22:05 cespare: amalloy: I saw the dual methods with Runnable and Callable and thought something like that. But it works for me on my machine...how could that happen?

22:06 amalloy: maybe you have stale classfiles lying around or something

22:07 if you have the same exact jvm and clojure versions, i can't think of any other reasons

22:07 cespare: amalloy: well, i've done lein clean and whatnot.

22:08 justin_smith: lein clean doesn't clean the production profile (it's a bug technomancy was trying to get someone to work on today)

22:08 cespare: amalloy: and I can go to the box that throws the exception and run java -server -cp /path/to/jar clojure.main and verify that it works in that repl. But if I do java -server -cp /path/to/jar clojure.main -m redis.handler then it breaks.

22:09 amalloy: perhaps some different compilation flags when in the repl vs running a namespace. but like...just add the required typehint? if you managed to get it working *without* the typehint, you'd have unpredictable code

22:10 cespare: amalloy: sure, I was just under the (apparently mistaken) impression that type hints were never required for correctness.

22:10 amalloy: it's a mystery why it works sometimes and not other times, but there's not a lot #clojure can do to debug that, if you're interested just in figuring it out, given that you're the only one with your execution context

22:11 yes, it is pretty rare that they are needed. mostly it only happens in j.u.concurrent, because of the callable/runnable separate-but-equal interfaces

22:13 cespare: amalloy: at minimum it seems like the error message is not great

22:14 amalloy: sure, welcome to clojure, where the error messages are rarely great

22:14 cespare: it says "No matching method found" but your theory is that it has found multiple messages and cannot disambiguate

22:14 s/messages/methods

22:14 amalloy: ok, thanks for the help

22:36 * srid is returning to clojure after 2 years.

22:36 srid: i'm playing with http://quil.info for some visualization ideas. live reloading is pretty cool, but how do i debug when running into problems (i see no errors but a blank sketch)? even (print ..) doesn't appear to work. using emacs.

22:39 justin_smith: srid: there should be a *<something> connection* buffer

22:40 srid: output from threads other than the main one go there

22:41 srid: fwiw. i'm using cider-jack-in. there is no connection buffer.

22:41 there is *cider-error* - but that contains traceback from repl evals

22:42 there is also *nrepl-server myproject*, which has Java tracebacks. hard to tell what they points to, in clojure. or if they are the relevant exceptions at all

22:44 nope, that file doesn't update at all.

22:45 justin_smith: srid: printlns from new threads go to the default *out*, wherever that is with the current cider, I am not sure. But it usually is not the repl buffer

22:49 srid: falling back to the slow 'lein run' then. which shows "java.lang.ClassCastException: quil.Applet cannot be cast to clojure.lang.IFn"

22:53 ok found the bug. apparently color was set to background color. so no shapes appeared. my fault

23:06 2 years of break is enough to make you forget the difference between using loop and doseq

23:23 DomKM: Anyone familiar with Ragtime or Joplin? I'm getting "java.sql.SQLException: No suitable driver found" exception when migrating but am able to connect without issue via clojure.java.jdbc.

23:39 justin_smith: DomKM: do you have a database setting in your ragtime config that matches your jdbc driver?

23:40 DomKM: justin_smith: I'm using Ragtime through Joplin (https://github.com/juxt/joplin), not the Ragtime plugin

23:41 justin_smith: tracked it down to this function (https://github.com/weavejester/ragtime/blob/master/ragtime.sql.files%2Fsrc%2Fragtime%2Fsql%2Ffiles.clj#L79-93) so fa

23:42 justin_smith: *far. It has some special case for postgres so perhaps that's the culprit

23:45 justin_smith: that should just be because postgres handles batches better than other drivers

23:45 the only difference is how many commands are sent at once

23:46 echo-area: I have a question on naming functions. I think the convention is to name functions with side effects with an exclamation mark at the end of function names, but to me the names like "alter-var-root", "rand", "send" etc look like exceptions. What is the real convention?

23:46 TEttinger: generally it has to do with destructive modification, IIRC

23:47 swap! alters its atom argument, set! alters an arg...

23:47 justin_smith: DomKM: do the version of clojure.java.jdbc you are using, and the one cited in the joplin project.clj match? there was a big change in the c.j.jdbc api regarding how connection arguments are specified / how connections are bound, so anything across that boundary will break

23:47 TEttinger: array functions are an exception because arrays are mutable anyway

23:48 echo-area: TEttinger: Is only modification to the input arguments counted? For example alter-var-root modifies the global world, it is also some kind of modification though it does not change its arguments

23:49 TEttinger: no idea, I think it is used sometimes sporadically, and some fns could sensibly be given a ! but don't have one

23:49 there's a good explanation somewhere...

23:49 DomKM: justin_smith: Joplin used clojure.java.jdbc through Ragtime. Ragtime uses 0.2.3 but tests against a newer version.

23:50 justin_smith: DomKM: found it -https://github.com/weavejester/ragtime/blob/master/ragtime.sql/project.clj#L5 0.2.3, which iirc is the old api that expects the database to be in a dynamic var

23:50 TEttinger: The names of functions/macros that are not safe in STM transactions should end with an exclamation mark (e.g. reset!).

23:50 http://yobriefca.se/blog/2014/05/19/the-weird-and-wonderful-characters-of-clojure/

23:50 justin_smith: DomKM: what version of c.j.jdbc does lein deps :tree tell you is coming in?

23:51 TEttinger: if it were that consistent about it, alter-var-root and with-redefs would have ! in them, because they are not safe when combined with threading, not to mention transactions

23:51 DomKM: justin_smith: I think it handles the jdbc dep here: https://github.com/weavejester/ragtime/blob/master/ragtime.sql%2Fsrc%2Fragtime%2Fsql%2Fdatabase.clj#L8-14

23:51 TEttinger: justin_smith, yep it isn't consistent

23:51 DomKM: justin_smith: looking into lein deps :tree now

23:52 [org.clojure/java.jdbc "0.3.5"]

23:52 justin_smith: DomKM: looks like it is at least attempting to abstract over the difference though... but clearly something in there is breaking

23:53 DomKM: you may want to look into how postgres jdbc connection URLs are formed, maybe yours is acting weird when combined with the compatibility layer

23:56 DomKM: the clojure.java.jdbc.deprecated ns definitely exists in 0.3.5, so that part should be OK...

23:57 echo-area: TEttinger: Also found it here: http://dev.clojure.org/display/community/Library+Coding+Standards

23:58 justin_smith: DomKM: maybe you could try dynamically binding *db* manually, in case it has to do with that - by any chance are you putting the db action in a future or some other thread-based invocation? because it is relying on a dynamic var and that could fuck it up

23:58 DomKM: justin_smith: nope, I'm using joplin.core/migrate-db

23:58 justin_smith: but I can trace it through to ragtime.core/migrate-all

23:59 and replicate it mostly without joplin

23:59 justin_smith: the "no driver found" thing could also mean the way the db uri is formatted https://github.com/clojure/java.jdbc/blob/master/src/main/clojure/clojure/java/jdbc/deprecated.clj#L136 the code for parsing that uri may help?

Logging service provided by n01se.net