2014-10-09
| 00:00 | Jesterman81 | thanks for the help guys, appreciate it |
| 00:00 | awwaiid | oh even fancier |
| 00:01 | justin_smith | ,(map (juxt :foo :bar) [{:foo "foo" :bar "dummy" :axe "blood"} {:foo "baz" :bar "dummy"}]) ; if you want two specific keys |
| 00:01 | clojurebot | (["foo" "dummy"] ["baz" "dummy"]) |
| 00:57 | kenrestivo | there's also select-keys |
| 00:57 | kenrestivo | oic, backscroll |
| 01:54 | ddellacosta | kind of a Java question, but: how do I add something to the java.library.path (in Mac OS X)? I'm trying LD_LIBRARY_PATH in my bashrc but it's not working. Can I pass it in directly via lein? |
| 02:02 | ddellacosta | nevermind, figured it out, I guess that's what jvm-opts is for |
| 02:11 | xinix | who knows Storm by clojure? |
| 02:13 | xinix | a real-time streaming style computation framework...who has its source code? |
| 02:14 | Rhainur | xinix: ??? |
| 02:14 | lazybot | Rhainur: How could that be wrong? |
| 02:14 | Rhainur | xinix: it's open source: https://github.com/apache/storm |
| 02:32 | cfleming | So I have a question about circular namespace dependencies in Clojure |
| 02:32 | cfleming | I thought they were actually illegal, but it seems like this might not be the case. |
| 02:33 | cfleming | ztellman's manifold library has a bad case of them, by using require in the middle of a file. |
| 03:18 | xsyn | I have a stupid question |
| 03:18 | xsyn | if I have a function which has a datalog query inside it |
| 03:18 | xsyn | and the query is (q '[:find]… ) |
| 03:19 | xsyn | and I want to pas the :where clause of the query a value |
| 03:19 | xsyn | how do I get it to eval that value? |
| 03:19 | xsyn | so that the query sees it? |
| 03:19 | xsyn | currently I'm getting: Unable to resolve symbol: id in this context |
| 03:55 | xsyn | Nevermind, found my solution |
| 03:55 | xsyn | my problem was that I was trying to use datalog to query a csv |
| 03:57 | ddellacosta | (Java interop question:) er, how do I call a static method on a nested class? |
| 03:57 | amalloy | ddellacosta: use the right name for the nested class |
| 03:57 | amalloy | it's not Foo/Bar or Foo.Bar, it's Foo$Bar |
| 03:58 | ddellacosta | amalloy: yeah, I've got that far, but this doesn't seem to be working for me: (.staticMethod Foo$Bar) <- is that wrong? |
| 03:58 | amalloy | that's not how you call static methods on any class |
| 03:58 | ddellacosta | amalloy: yeah, so, I'm wholly ignorant of that I guess. :-( |
| 03:59 | amalloy | (Foo$Bar/staticMethod) |
| 03:59 | ddellacosta | amalloy: ah, right, thanks. Found it here simultaneously: http://clojure.org/java_interop |
| 04:31 | yedi | does anyone use cljs on the client with a non-clj lang on the server? curious about people's experiences and common dev practices |
| 04:38 | CookedGryphon | is there a neat way to do a count with transducers? I'm mapping a function over a coll, and then want to count how many items now pass a predicate |
| 04:38 | CookedGryphon | previously I was doing a filter then counting the result, but it I shouldn't need to construct an intermediate sequence at all |
| 04:39 | CookedGryphon | I mean i could map (constantly 1) and then transduce +, but that feels a bit clunky too |
| 05:05 | keeds | yedi: fynder.io use cljs with Haskell |
| 05:55 | cfleming | Can anyone point me to some information about &form & &env, in particular describing when they have to be explicitly passed, and when they should appear in argument lists? |
| 05:57 | cfleming | I understand that they have to be passed when calling a different arity of the same macro |
| 05:58 | ticking | Does anybody know why the IAtom protocol of cljs is empty? |
| 05:58 | Bronsa | cfleming: they should never be explicitly passed |
| 05:59 | cfleming | Should they ever appear in arg lists of defmacro? They appear in the arg list of defn, but that's an fn marked with ^:macro |
| 05:59 | Bronsa | no they shouldn't, that's an implementation detail |
| 05:59 | cfleming | Bronsa: According to this, you sometimes have to: http://stackoverflow.com/a/25569059/155368 |
| 06:00 | Bronsa | cfleming: that's a horrible thing to do |
| 06:00 | Bronsa | cfleming: you're invoking the macro as a function there |
| 06:00 | cfleming | Bronsa: It's not me - sadly as a tool developer I have to support people who do horrible things :-) |
| 06:00 | cfleming | Bronsa: This is for arity checking in Cursive |
| 06:00 | Bronsa | one should do instead (defmacro x ([] `(x 1)) ([x] x)) |
| 06:01 | cfleming | Bronsa: defn has them explicitly in its arg list |
| 06:01 | Bronsa | cfleming: that's because defn is implemented before defmacro |
| 06:02 | cfleming | Bronsa: Right. I'm just trying to figure out the rule for arity checking - currently Cursive thinks defn accepts 3 args and a rest. |
| 06:03 | cfleming | Bronsa: Neat trick in your alternative there, but I can't say it's intuitive. |
| 06:03 | Bronsa | it's not a trick, it's the only way to do it right :) |
| 06:04 | Bronsa | cfleming: eeeh, I disagree, you're saying it's more intuitive to expect a macro to work like a function inside its decl? |
| 06:04 | cfleming | Well, or use a helper function as suggested in that post - or just not have multi-arity macros :-) |
| 06:05 | Bronsa | note that in the stackoverflow example he's doing (macro &form &env a b) and expects a and b to be evaluated at call time |
| 06:05 | cfleming | I think the helper function is probably the clearest solution of all of them. |
| 06:05 | Bronsa | me too |
| 06:06 | Bronsa | cfleming: but it's not always feasable. see e.g. c.c/or or c.c/and |
| 06:06 | cfleming | I think I'm just going to filter out &form and &env from arg lists and calls for checking arity, and anyone who does anything crazy like let-binding something and then explicitly passing it will get what they deserve. |
| 06:06 | Bronsa | heh |
| 06:07 | Bronsa | cfleming: how are you doing arity checking anyway? using :arglists? |
| 06:07 | cfleming | If it weren't for defn I'd just ignore the whole edge case. |
| 06:07 | Bronsa | if so, good luck with that. people are overwriting :arglists, it's unreliable |
| 06:07 | cfleming | No, I use the actual function arglists, so for defn it'll just be name & rest |
| 06:07 | Bronsa | ah ok |
| 06:08 | cfleming | Which is not very useful. |
| 06:08 | cfleming | Yeah, I'd love to be able to rely on :arglists for more things (parameter info etc) but it's basically useless for my purposed. |
| 06:08 | cfleming | purposes. |
| 06:09 | cfleming | This arity checking is more useful for functions. |
| 06:09 | cfleming | I also have to ignore any calls with unquote-splicing |
| 06:09 | cfleming | Like (assoc ~map ~@kvs) |
| 06:10 | Bronsa | yeah. I proposed to split :arglists into :arglists and :doc-arglists months ago so that :arglists can be used by tools/compilers safely but it never got attention from core. |
| 06:10 | cfleming | Fortunately when I index I get both - it would be great to have it in the language. |
| 06:10 | Bronsa | cfleming: ah I didn't realize you're analyzing the unexpanded code |
| 06:11 | cfleming | Bronsa: Yeah, Cursive only works on source. |
| 06:11 | cfleming | Bronsa: Which has its ups and downs, but mostly ups :-) |
| 06:12 | cfleming | Bronsa: So I use :arglists when showing docs and so forth, and the actual arglists for this kind of thing. |
| 06:13 | Bronsa | yeah that's the only sensible way to do it |
| 06:13 | cfleming | Bronsa: I implemented a parsing framework for macros similar to seqex, so I'll potentially be able to use that to show more useful errors in the editor for forms that have an associated parser. |
| 06:14 | Bronsa | in eastwood we are actually using :arglists, but there are issues when users overwrite the default :arglists |
| 06:14 | cfleming | Eastwood parses source sometimes too, right? |
| 06:15 | Bronsa | yes it does, but mostly relies on the expanded AST & runtime informations |
| 06:15 | cfleming | I'm actually planning to pillage Kibit and Eastwood for inspections in Cursive soon. |
| 06:15 | Bronsa | awesome |
| 06:16 | Bronsa | cfleming: really good work with Cursive btw, I'm super impressed. I unfortunately don't use it myself as I've invested way too much time in emacs but I'll definitely be suggesting cursive to everyone who asks |
| 06:16 | Bronsa | (inc cfleming) |
| 06:16 | lazybot | ⇒ 4 |
| 06:16 | cfleming | I can do some interesting other ones too, like (if-let [x (something)] ...) - if x is never referred to I can offer to update it to (if (something) ...) |
| 06:16 | cfleming | Thanks, I'm glad you like it! |
| 06:17 | cfleming | I'll be talking at the conj about the difference in approach between Cursive and practically everything else |
| 06:17 | cfleming | i.e. the pros and cons of using source |
| 06:17 | cfleming | It allows some really nice functionality |
| 06:17 | cfleming | And means that everything just works with cljs |
| 06:19 | cfleming | I'll let you know when the Kibit/Eastwood stuff is in so you can take a look. One of the many nice things about using IntelliJ is that that's all real time in the editor, and the quickfixes are right there too. |
| 06:20 | Bronsa | cool |
| 06:21 | cfleming | They seem to have improved their indexes in v14 too, which allows them to do this sort of thing: http://blog.jetbrains.com/idea/2014/10/automatic-notnullnullablecontract-inference-in-intellij-idea-14/ |
| 06:21 | Guest_ | may I ask, as a new Clojure learner, dabbling in Light Table - what I benefit from Cursive? |
| 06:22 | Guest_ | (would , not what) |
| 06:22 | cfleming | The interesting thing there is that they have a global graph structure, but still show the results in real time - I don't know how they do that. |
| 06:22 | Bronsa | magic that Just Works™ :) |
| 06:23 | cfleming | That means that I might be able to do some limited global type inference (which fns return seqs, for example) and provide useful warnings. |
| 06:23 | cfleming | Bronsa: That's the idea :-) |
| 06:23 | cfleming | I'll be able to mark globally unused vars shortly. |
| 06:24 | cfleming | Guest_: Sure, it depends a bit what you're doing. Generally Cursive is very easy to set up and get going. |
| 06:24 | cfleming | Guest_: If you're doing CLJS LightTable still has a lot going for it in terms of ease of use. |
| 06:25 | cfleming | Guest_: But IMO Cursive has more functionality that you can grow into it as you learn more about it and get more used to Clojure. |
| 06:27 | Guest_ | I see - have to try ... so I'm getting IntelliJ first and then more |
| 06:27 | Guest_ | thanks for answering |
| 06:27 | cfleming | Guest_: Think of it as probably roughly equivalent power to Emacs but without a lot of the swearing :-) |
| 06:27 | Guest_ | great |
| 06:27 | cfleming | If you have problems, either hit me up here or on cursive@cursiveclojure.com |
| 06:27 | Guest_ | I'm not going to learn emacs right now, I guess ... |
| 06:28 | Guest_ | :-) |
| 06:28 | cfleming | If you're just learning Clojure, I wouldn't recommend learning both at the same time, no. |
| 06:28 | dysfun | and of course emacs will ultimately be more extensible than cursive |
| 06:28 | cfleming | dysfun: Sure, no doubt. |
| 06:28 | Guest_ | right now I'm in the "easy" section of 4clojure |
| 06:28 | dysfun | not that i didn't have to work quite hard on some things |
| 06:29 | Bronsa | dysfun: the question is if you really need all that extinsibility when coding |
| 06:29 | cfleming | dysfun: That said, there's a lot that Cursive can do that Emacs can't either - different pros and cons. |
| 06:29 | dysfun | of course. like everything. |
| 06:29 | dysfun | personally i use emacs because a) my fingers are hardwired b) IDEs just irrationally irritate me |
| 06:30 | Bronsa | I mean, I've built emacs into my OS, but as for editing clojure I'm not sure clojure-mode + SLIME is much superior to Cursive at this point |
| 06:30 | dysfun | SLIME? nrepl-cider |
| 06:30 | Bronsa | no thanks |
| 06:30 | dysfun | heh, i patched that |
| 06:30 | dysfun | i use ac-nrepl-compliment sometimes too |
| 06:31 | Bronsa | I've tried switching from slime to nrepl/cider at least 5 differnt times, everytime I went back crying. |
| 06:31 | cfleming | Yeah, there's still a bunch of Emacs functionality I'm catching up with, but it's all fairly doable. But there are a lot of things that an AST and global indexes allow that are really cool. |
| 06:32 | dysfun | i was never a SLIME user and i gravitated towards cider |
| 06:32 | cfleming | Bronsa: I'm actually going to have to add a minimal REPL to Cursive - there are a surprising number of people who basically want inferior-lisp |
| 06:33 | cfleming | I was surprised, anyway. |
| 06:33 | dysfun | what functionality do you provide that you consider replaces it? |
| 06:34 | dysfun | presumably something like lighttable's live eval? |
| 06:34 | cfleming | That I consider replaces what? |
| 06:34 | dysfun | the need for a repl |
| 06:34 | cfleming | Oh, I don't - Cursive has full nREPL integration |
| 06:34 | dysfun | oh i see what you mean |
| 06:35 | dysfun | i'll have to give it a play sometime. when i last used it, it was pretty terrible for actually writing lisp |
| 06:35 | cfleming | But there are a lot of people who don't want that - they just want a prettier wrapper around clojure.main, basically |
| 06:35 | cfleming | What was, IntelliJ? |
| 06:36 | Bronsa | cfleming: I'm actually not surprised -- one of the things I dislike most of both Cursive & CCW is actually their repl interface |
| 06:36 | dysfun | Cursive |
| 06:36 | cfleming | dysfun: If you try it again I'd be interested to know what you're missing. |
| 06:37 | cfleming | Bronsa: It's not so much the interface, people don't want nREPL, and especially lots of magic in middleware. |
| 06:37 | Bronsa | cfleming: ah well, I don't know anything about that :) |
| 06:38 | cfleming | Bronsa: see https://gist.github.com/levand/b1012bb7bdb5fcc6486f |
| 06:39 | clgv | Bronsa: what is bad about repl interface in CCW & Cursive? |
| 06:39 | milos_cohagen | If 95% of the time I use emacs+cider to eval forms and get back response in mini-buffer, would that be called using a repl? |
| 06:40 | dysfun | cfleming: it was more that i didn't even have things i consider basic like rainbow parens |
| 06:40 | cfleming | dysfun: It does have that, you have to turn it on |
| 06:40 | milos_cohagen | I'll pull up the repl buffer if I print something big. |
| 06:41 | TEttinger | dysfun, yeah I loved that in light table. but nightcode doesn't have rainbow parens yet |
| 06:41 | clgv | cfleming: do you use tools.analyzer to get the AST for Cursive? |
| 06:42 | cfleming | clgv: No, I use a custom parser |
| 06:42 | cfleming | clgv: The AST elements have to be derived from IntelliJ base classes |
| 06:42 | clgv | cfleming: ah ok. a translation from a tools.analyzer would have been difficult? |
| 06:42 | CookedGryphon | Does anyone know if count can work with transducers? |
| 06:43 | clgv | +AST |
| 06:43 | CookedGryphon | I don't want to build the intermediate collection, just count the things that end up coming through after my mappings and filters |
| 06:43 | clgv | CookedGryphon: should be doable though you will need a volatile for the counting state |
| 06:43 | cfleming | clgv: I'm actually not sure - I started out using a custom parser before tools.analyzer was around, and I haven't investigated whether it would be worth switching. |
| 06:44 | clgv | cfleming: ah so that is the main reason |
| 06:44 | CookedGryphon | clgv: Is there nothing in the standard library, this doesn't feel like something I should need to roll my own for |
| 06:44 | clgv | CookedGryphon: probably not yet since transducers are alpha |
| 06:44 | clgv | or ebta? |
| 06:45 | cfleming | clgv: The parser is actually pretty simple since I have to maintain all source information (comments etc) too, so it's very much just the basic forms - lists, symbols, keywords etc. The more interesting stuff I build on top of that myself. |
| 06:45 | clgv | CookedGryphon: but you could come up with a `counting` function and submit it as patch |
| 06:46 | cfleming | clgv: Speed is also an important issue since Cursive parses a *lot* - the current parser is actually Java |
| 06:47 | clgv | cfleming: interesting, though you could just use clojure with mutable stuff (deftype with mutable fields) |
| 06:48 | clgv | cfleming: to gain similar/same speed |
| 06:48 | Bronsa | clgv: there are actually issues with that b/c clojure functions have to box chars |
| 06:49 | clgv | Bronsa: ah well, didn't know you need to store primitive chars for that... |
| 06:51 | Bronsa | clgv: cfleming I actually don't think using tools.analyzer for guiding an editor/IDE gains you that much TBH |
| 06:51 | clgv | Bronsa: yeah, I am not really satisfied with the implementation of Clojure's primitive function |
| 06:51 | clgv | Bronsa: but if you have no parser at the start of your project? |
| 06:51 | clgv | *no other parser |
| 06:51 | clgv | +analyzer |
| 06:52 | Bronsa | clgv: the thing is, t.a helps you if you can actually evaluate each form as you go. if you can't, you have to work your way to lie to tools.analyzer and make it believe everything's fine |
| 06:53 | Bronsa | this is a consequence of clojure's compilation model btw, there's nothing I can do about it |
| 06:54 | clgv | Bronsa: ah ok, in short it is not analyzing statically? |
| 06:55 | Bronsa | clgv: it is analyzing statically, the issue is that the compilation level is the top-level form |
| 06:55 | Bronsa | compilation unit* |
| 06:57 | clgv | Bronsa: so you mean you got to maintain the context that was evaluated before the current top-level form? |
| 06:57 | Bronsa | clgv: yeah well, I just plug into clojure's namespaces |
| 06:58 | Bronsa | clgv: the POC is this: (defn x [] 1) (defmacro y [] (x)) (defn z [] (y)) |
| 06:58 | Bronsa | clgv: you could analyze just fine the first two forms without any evaluation |
| 06:59 | Bronsa | but when you get to z, you need x to be evaluated in order to be able to do the macroexpansion |
| 06:59 | clgv | ok |
| 07:00 | Bronsa | racket has a mechanism to work around this issue, by defining some sort of compilation levels but basically all lisps that I'm aware of have this "issue" that emerges |
| 07:05 | cfleming | Bronsa: Do you know why the extra attr-map at the end of the multi-arity form of defn is required? |
| 07:06 | Bronsa | cfleming: no, I never understood why it's there |
| 07:06 | Bronsa | nor have I ever seen it actually used FWIW |
| 07:06 | cfleming | Bronsa: Me either, it's not even in a different scope - it's really weird. |
| 07:07 | cfleming | That's good to know. |
| 07:09 | clgv | cfleming: yeah that one is strange. |
| 07:23 | Guest_ | newbie looking for help in understanding recursive example |
| 07:23 | Guest_ | the assignment ist http://www.4clojure.com/problem/28 |
| 07:24 | Guest_ | the (working) solution I have is: |
| 07:24 | Guest_ | (defn -flatten [coll] |
| 07:24 | Guest_ | (if (coll? coll) |
| 07:24 | Guest_ | (mapcat -flatten coll) |
| 07:24 | Guest_ | [coll])) |
| 07:24 | clgv | Guest_: post it on refheap.com please |
| 07:24 | Guest_ | ah, ok |
| 07:25 | Guest_ | [learning how to do this] |
| 07:25 | Guest_ | https://www.refheap.com/91454 |
| 07:25 | clgv | Guest_: what is you question about that function? |
| 07:26 | Guest_ | trying to analyze what's going on inside the recursive loop |
| 07:27 | Guest_ | I inserted a (println coll) to look at ir |
| 07:28 | Guest_ | like so: |
| 07:28 | Guest_ | https://www.refheap.com/91454 |
| 07:28 | Guest_ | why do I never see the complete coll in the prints? |
| 07:28 | Guest_ | (I#M feeling dense ...) |
| 07:29 | schmir | Guest_: the println changes the return value |
| 07:30 | Guest_ | ah ... |
| 07:31 | Guest_ | recursive thinking need alot of practicing, I guess |
| 07:33 | Guest_ | what would be the best way to look into the iterations of a recursive loop? |
| 07:34 | Guest_ | (I thought println would be sensible) |
| 07:34 | schmir | the problem you introduced has nothing to do with recursion. |
| 07:34 | Guest_ | ok |
| 07:34 | schmir | println returns nil |
| 07:34 | Guest_ | yes |
| 07:35 | Guest_ | I had the println before the mapact |
| 07:35 | schmir | so, the function with the println returns nil, since you put the println at the end of the do block |
| 07:35 | clgv | Guest_: just add (println coll) after [coll] |
| 07:35 | Guest_ | (sorry) |
| 07:35 | clgv | then you see the collection per function call |
| 07:36 | Guest_ | in a (do ..) ? |
| 07:36 | clgv | no |
| 07:36 | Guest_ | ok |
| 07:36 | Guest_ | thanks |
| 07:36 | clgv | just before the `if` the `defn` has an implicit `do` for its body |
| 07:36 | Guest_ | (I know this questions are very newbish) |
| 07:37 | clgv | Guest_: you got a book to learn those basics quickly? |
| 07:37 | Guest_ | yes |
| 07:37 | clgv | ,(defn -flatten [coll] (if (coll? coll) (mapcat -flatten coll) [coll])) |
| 07:37 | clojurebot | #'sandbox/-flatten |
| 07:37 | clgv | Guest_: then best interleave reading and experimenting at the repl |
| 07:38 | Guest_ | yes, just now in Light Table |
| 07:38 | Guest_ | "#'sandbox" is something I can look up? |
| 07:39 | clgv | ,(-flatten (last (take 100 (iterate list nil)))) |
| 07:39 | clojurebot | (nil) |
| 07:39 | clgv | ,(-flatten (last (take 500 (iterate list nil)))) |
| 07:39 | clojurebot | (nil) |
| 07:39 | clgv | ,(-flatten (last (take 5000 (iterate list nil)))) |
| 07:39 | clojurebot | #<StackOverflowError java.lang.StackOverflowError> |
| 07:39 | clgv | Guest_: `sandbox` is the namespace where the bot evaluates our commands |
| 07:40 | Guest_ | ah, sorry |
| 07:40 | clgv | Guest_: in your repl you likely have `user` |
| 07:40 | Guest_ | understood |
| 07:40 | Guest_ | thanks |
| 07:40 | clgv | the last expression demonstrates that the -flatten is subject to a stackoverflow. but maybe you wait until later to find out what the problem is ;) |
| 07:41 | Guest_ | could be solved by recur, I guess |
| 07:42 | clgv | Guest_: for a lazy-seq approach there should be no stacked `concat` which is implicitely called in `mapcat` |
| 07:42 | Guest_ | ah ...! |
| 07:42 | Guest_ | good, that is something to think about |
| 07:43 | Guest_ | "interleave reading and experimenting at the repl" is what I do since a few days |
| 07:43 | clgv | ,(flatten (last (take 5000 (iterate list nil)))) |
| 07:43 | clojurebot | (nil) |
| 07:43 | clgv | gooad ^^. next you should get an individual irc name so that people can remember you around here ;) |
| 07:43 | Guest_ | ok |
| 07:44 | Guest_ | thanks again! |
| 07:57 | mmeix | done |
| 07:57 | clgv | good. |
| 08:00 | mmeix | "stacked 'concat' " was the point, I hadn't quite understood |
| 08:00 | mmeix | but it gets clear |
| 08:02 | mmeix | (I'm positively surprised by the helpfulness I experienced here in te last days) |
| 08:04 | clgv | mmeix: you usually get good help here. usually you should find a minimal version of your source that produces the same problem and describe what you expect and what happens to get fast answers |
| 08:04 | mmeix | yes, I'm trying ... |
| 08:05 | mmeix | for a newcomer the question is often not so clear, but it's getting better :-) |
| 08:05 | mmeix | back to 4clojure |
| 08:06 | clgv | lazybot can also help you if you know examples that specify your function ;) |
| 08:06 | mmeix | what/who is lazybot? |
| 08:06 | clgv | $findfn odd? (range 5) [1 3] |
| 08:06 | clgv | &42 |
| 08:06 | lazybot | ⇒ 42 |
| 08:06 | clgv | that guy ^^ |
| 08:06 | mmeix | a robot I guess |
| 08:07 | lazybot | Execution timed out. |
| 08:07 | lazybot | [] |
| 08:07 | clgv | $findfn odd? [0 1 2 3 4] [1 3] |
| 08:08 | lazybot | Execution timed out. |
| 08:08 | clgv | ah well maybe that feature broke... |
| 08:08 | lazybot | [] |
| 08:59 | justin_smith | $findfn 6 3 3 |
| 09:00 | lazybot | Execution timed out. |
| 09:00 | lazybot | [clojure.core/max-key clojure.core/cond clojure.core/char-escape-string clojure.core/-' clojure.core/*data-readers* clojure.core/- clojure.core/default-data-readers clojure.core/unchecked-subtract clojure.core/*clojure-version* clojure.core/unchecked-subtract-int clo... https://www.refheap.com/91458 |
| 09:01 | justin_smith | so it times out, and it also finds me a bunch of answers |
| 09:01 | justin_smith | cool |
| 09:03 | greghendershott | I want to split a URL string into the components (scheme, host, port, etc.). In Racket I'd use string->url. What's a good way to do that in Clojure? |
| 09:04 | justin_smith | ,(bean (java.net.URL. "http://www.google.com")) |
| 09:05 | clojurebot | #<MalformedURLException java.net.MalformedURLException: denied> |
| 09:05 | justin_smith | greghendershott: if you run that locally you will see the "bean" abstraction for that class - but each key in that map also represents a more efficient method call that you can call directly |
| 09:06 | greghendershott | justin_smith: Ah, so Java interop for that. Thanks! |
| 09:06 | justin_smith | ,(.getProtocol (java.net.URL. "http://www.google.com")) |
| 09:06 | clojurebot | #<MalformedURLException java.net.MalformedURLException: denied> |
| 09:06 | justin_smith | :P |
| 09:06 | sw1nn | hi, can anyone offer any suggestions on avoiding this stack overflow using transducers? Problem exists in clojure and clojurescript (running in chrome 37). Not sure if I'm doing something dumb, but for small values of the repeat it works as expected, but larger values cause Overflow. https://gist.github.com/sw1nn/f8463b5bfed6db7a9f30 |
| 09:07 | justin_smith | greghendershott: yeah, the jvm interop for the net stuff is decent, and you can use various apache libs for more advanced functionality too (by including them in your project.clj of course) |
| 09:08 | dnolen_ | greghendershott: note using bean means you can use interact with the url as a map, (:protocol (bean (java.net.URL. "http://google.com"))) |
| 09:08 | verma | TIL about bean |
| 09:08 | justin_smith | dnolen_: yeah, that's why I showed that first - do you happen to know how big the overhead on bean is? |
| 09:09 | greghendershott | justin_smith: dnolen_: Thanks. A (correct) regexp for splitting URLs is non-trivial, so happy to use something "official". |
| 09:09 | dnolen_ | justin_smith: probably not small but this doesn't sound like he's going to stick it in a loop |
| 09:09 | justin_smith | fair point :) |
| 09:10 | greghendershott | Feeling a little worried I don't know enough Java, and how much will I need to learn to be effective in Clojure. But, I'm just getting started. |
| 09:10 | dnolen_ | sw1nn: I'm somewhat confused as to why that code is written that way |
| 09:10 | greghendershott | Open mind, turn on firehose |
| 09:11 | justin_smith | greghendershott: knowing java is not a huge concern, knowing how to search and read javadoc (and use what it describes via interop) will help you a lot |
| 09:12 | greghendershott | justin_smith: Ah right I meant the libs/ecosystem, what's out there to use. Not the lang. Thanks for the tip re javadoc and interop. |
| 09:12 | justin_smith | greghendershott: I find the javadoc-search-pane (for chrome and firefox) really helpful for finding what I want |
| 09:13 | justin_smith | https://chrome.google.com/webstore/detail/javadoc-search-frame/mfgkihmpcjjnijmkchojlbccbmhcdfcd?hl=en |
| 09:13 | justin_smith | it does completion of potential matches as you type, which is a huge help |
| 09:13 | sw1nn | dnolen_: well, it's an experiment with transducers, so it could be artificial. I'm receiving sequences [0 1 0 1 0] I want to total up all the 1s basically. |
| 09:14 | sw1nn | ie. [[0 1 0 1 0][1 0 0 1 0] ... [1 1 1 0 0]] |
| 09:14 | greghendershott | justin_smith: Thanks! |
| 09:16 | dnolen_ | sw1nn: in any case the stack trace is clear, it looks like you have build up a bunch of lazy map ops and you realize it at the end and blow the stack. Nothing much to do w/ transducers. |
| 09:17 | Bronsa | sw1nn: what dnolen_ said. if you replace map with a mapv it should work fine |
| 09:17 | Bronsa | or (doall (map |
| 09:17 | sw1nn | dnolen_: ahh..I was being dumb :-), mapv works. |
| 09:19 | justin_smith | greghendershott: dnolen_: turns out the standard deviation of bean is greater than the execution time of a direct method call. https://www.refheap.com/91459 0.28 vs. 8.4 µs |
| 09:20 | justin_smith | For what it's worth. I had heard bean had a big overhead but had not microbenchmarked it before. |
| 09:24 | ckirkendall | Anyone out there run into the clojurescript compiler hanging indefinitely when dealing with large quoted forms. |
| 09:25 | dnolen_ | ckirkendall: haven't heard of this being a problem, but entirely possible - somebody may have never tried that before |
| 09:25 | dnolen_ | ckirkendall: I know at one point large EDN structures were an issue until a parsing fix landed in Closure Compiler |
| 09:26 | stuartsierra | justin_smith: oh yeah, `bean` does full reflection on every call; wildly inefficient. |
| 09:26 | Bronsa | stuartsierra: on every call? couldn't it do it once and cache? |
| 09:27 | stuartsierra | Couldn't I fly if I flapped my wings hard enough? |
| 09:30 | ckirkendall | This is a large edn file being brought in as a quoted structure through a macro. |
| 09:31 | Bronsa | ckirkendall: in clojure it's often not a good idea to include big literals in code, I suppose it might be similar for cljs |
| 09:31 | ckirkendall | dnolen_: it compiles find if optimizations is set to none. |
| 09:31 | dnolen_ | ckirkendall: so it's a Google Closure thing it sounds like |
| 09:31 | ckirkendall | dnolen_: that is the feeling I have. |
| 09:32 | dnolen_ | ckirkendall: you may be hitting another parse corner case in Closure, what version of Google Closure do you see via lein deps :tree? |
| 09:33 | ckirkendall | dnolen_ Bronsa: v20140625 |
| 09:35 | schmir | how do I exclude some namespaces from an uberjar? |
| 09:35 | dnolen_ | ckirkendall: yeah pretty recent, you might want glance over the generated :none JS to see if something stands out |
| 09:36 | dnolen_ | ckirkendall: also might make sense to describe how much JS you are generating - megabytes? |
| 09:36 | ckirkendall | dnolen_: will do. In the mean time I think we will take Bronsa's suggestion and try loading this at run time. |
| 09:37 | dnolen_ | ckirkendall: yeah that's the simpler solution - another option is to just give Google Closure more memory - there's really no such thing as too much in my experience. |
| 09:37 | justin_smith | updated - with more fields accessed, and a hash-map created, the performance difference is much smaller |
| 09:38 | justin_smith | https://www.refheap.com/91459 |
| 09:38 | ckirkendall | dnolen_: going to look at the memory thing right now., If that is the issue its easy to fix. |
| 09:40 | justin_smith | schmir: if you only need those libs at dev time, you can put them in a dev profile http://blog.japila.pl/2012/06/exclude-dependencies-from-uberjar-in-leiningen-2/ |
| 09:40 | justin_smith | oh wait, namespaces... |
| 09:41 | justin_smith | you could put the namespaces in a separate folder that is in your :dev :source-paths so that they are only found during dev time |
| 09:43 | schmir | justin_smith: right. but I'm looking for another solution. I'd like to keep the files in the same directory. |
| 09:43 | justin_smith | a hacky way to do it would be deleting the .class files from the uberjar - it's just a zip file after all |
| 09:43 | xeqi | schmir: In that case use :uberjar-exclusions https://github.com/technomancy/leiningen/blob/master/sample.project.clj#L385 |
| 09:44 | justin_smith | oh that's much better |
| 09:44 | justin_smith | (inc xeqi) |
| 09:44 | lazybot | ⇒ 14 |
| 09:45 | schmir | xeqi: ok, will try that. I thought this is only for resource files. let's see |
| 09:46 | justin_smith | resource vs. class stuff is a very leaky abstraction - it's all just stuff that ends up on the classpath |
| 09:52 | schmir | xeqi: thanks. that seems to work, though it still aot compiles the excluded files. |
| 09:52 | schmir | (inc xeqi) |
| 09:52 | lazybot | ⇒ 15 |
| 09:52 | ckirkendall | dnolen_ memory doesn't seem to be the issue. On to the javascript. |
| 09:58 | arrdem | mdrogalis: lol @ pool request |
| 10:04 | mdrogalis | arrdem: :D |
| 10:04 | mdrogalis | I'm a doofus in the morning. |
| 10:05 | greghendershott | justin_smith: So the map from (bean (java.net.URL. "http://www.google.com")) includes `:content #<HttpInputStream sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@56e01e8a>` |
| 10:05 | greghendershott | Is that b/c `bean` is calling getContent http://docs.oracle.com/javase/7/docs/api/java/net/URL.html#getContent%28%29 which opens a connection? |
| 10:05 | greghendershott | b/c I don't want a connection, I just want to parse the URL into its components. |
| 10:05 | greghendershott | Hmm.... |
| 10:06 | justin_smith | greghendershott: that would be a good reason to use the accessors directly, and likely, yes, that is what is happening |
| 10:06 | greghendershott | Maybe I can not use `bean`, and somehow call the members individually? |
| 10:06 | greghendershott | Ah OK I'll work with that. Thanks. |
| 10:06 | justin_smith | right - did you see my updated paste? it includes creating a hash map directly using the accessor methods |
| 10:07 | justin_smith | https://www.refheap.com/91459 see the very last benchmark |
| 10:07 | greghendershott | justin_smith: Oh sorry, no I missed that. scrolling.... back. You posted it again. :) Thanks! Got it. |
| 10:08 | greghendershott | OK so this is cool. I didn't expect I'd need to learn interop basics this early, but it's fine, that's good. |
| 10:08 | justin_smith | it's pretty simple |
| 10:08 | justin_smith | (mostly) |
| 10:09 | greghendershott | Simple things are simple, I imagine? :) |
| 10:10 | justin_smith | it's not just that - there's little things that expose differences between how clojure uses the jvm and how java uses it -- varargs are a bit weird, and things that specialize on int |
| 10:11 | clgv | justin_smith: did you typehint `loc` or is it's type inferable by the compiler? |
| 10:11 | clgv | -' :( |
| 10:12 | justin_smith | clgv: loc is defined before the other forms are compiled |
| 10:13 | justin_smith | or does that not help? |
| 10:13 | justin_smith | I can try with typehinting and see if it makes a difference |
| 10:13 | clgv | justin_smith: if it has a typehint on the var it's fine otherwise there is reflection involved |
| 10:13 | ckirkendall | dnolen_: the quoted form that seems to be giving it trouble is 49k when compiled with no optimizations. I don't see anything that is odd obout the javascript. |
| 10:14 | justin_smith | clgv: so I need (def loc ^java.net.URL (java.net.URL. "http://www.google.com")) ? |
| 10:14 | justin_smith | I'll try it |
| 10:14 | clgv | no on the var |
| 10:14 | clgv | move it one position to the front |
| 10:14 | justin_smith | clgv: got it, thanks |
| 10:14 | justin_smith | this hinting stuff keeps surprising me |
| 10:16 | clgv | justin_smith: vars are an indirection so the compiler has no clue which type of value they refer to (it could change during runtime). with the type hint you tell the compiler that the type remains the specified one |
| 10:17 | justin_smith | OK |
| 10:18 | TimMc | That's a really good point. |
| 10:20 | justin_smith | oh wow, that is a huge difference, paste updated - that makes the direct access version very fast https://www.refheap.com/91459 |
| 10:20 | justin_smith | (inc clgv) |
| 10:20 | lazybot | ⇒ 29 |
| 10:22 | clgv | ah yes, that's more like it :D |
| 10:22 | Bronsa | I am always moderately annoyed that clojure doesn't have any option to turn on simple global type inference on things like (def a (Foo. )) |
| 10:23 | justin_smith | yeah, it was counterintuitive that it wouldn't attempt that |
| 10:23 | justin_smith | I mean, that's a pretty safe thing to add a hint to |
| 10:23 | clgv | Bronsa: but you still would need something like (def ^:infer-constant-type foo (Foo.)) |
| 10:23 | Bronsa | build profiles are getting to the top of my wish-list pretty fast |
| 10:23 | clgv | since you are allowed to rebind the var to anything |
| 10:24 | Bronsa | clgv: no a per-form config option wouldn't make sense, agreed |
| 10:24 | clgv | Bronsa: damn I forgot to mention the work on "static" functions as feature I want in the survey |
| 10:25 | hyPiRion | Have people talked about how they want better error messages yet? |
| 10:25 | Bronsa | clgv: build profiles are way more essential IMHO |
| 10:26 | clgv | Bronsa: just my perspective ;) |
| 10:26 | Bronsa | clgv: adding features to the compiler right now is really painful |
| 10:26 | clgv | Bronsa: I'll agree on build profiles being number one if there are performance optimization for production builds included ;) |
| 10:26 | Bronsa | clgv: sure, that's the whole point :) but you need the infrastructure in place before adding those or it will get a mess |
| 10:27 | clgv | Bronsa: agreed |
| 10:28 | Bronsa | unfortunately I doubt there's any interest in refactoring the compiler ATM |
| 10:28 | justin_smith | clgv: what about automatically hinting by default on def when the class is trivial to determine at compile time? what's the counter argument for doing that? |
| 10:28 | Bronsa | justin_smith: you might be at the repl and later want to rebind the var to a different type |
| 10:28 | justin_smith | yes we are allowed to rebind a def to a different class, but even with hinting that wouldn't break anything would it? you just get the wrong type hint |
| 10:29 | clgv | justin_smith: what Bronsa said. |
| 10:29 | Bronsa | and if you have already evaluated a function that does interop on that var, it's broken |
| 10:29 | justin_smith | ahh |
| 10:29 | justin_smith | got it |
| 10:29 | justin_smith | that's what I was looking for, thanks |
| 10:29 | justin_smith | (inc Bronsa) |
| 10:29 | lazybot | ⇒ 58 |
| 10:29 | clgv | justin_smith: primitive functions that are called accordingly are a good example for that |
| 10:30 | clgv | when you reevaluate the function without the primtive typehints the callsite will throw |
| 10:31 | Bronsa | I'd like to see a benchmark to see how much an impact compiling to (if (instance? primInterface x) (.invokePrim x ..) (invoke x ..)) instead of directly yo (.invokePrim x ..) has |
| 10:32 | Bronsa | protocols callsites compile to something like that and they are pretty fast so I'm not sure it would be a prohibitive enhancement |
| 10:32 | justin_smith | cheaper than reflection to be sure |
| 10:32 | clgv | Bronsa: or (try (.invokePrim x ..) (catch ApropriateExceptio e (.invoke x ..)) |
| 10:33 | Bronsa | clgv: oh yeah |
| 10:33 | Bronsa | it might have some impact on jvm inlining though |
| 10:34 | clgv | Bronsa: both? or just the try-catch version? |
| 10:35 | Bronsa | both, or neither :P I don't really know enough about it |
| 10:35 | clgv | Bronsa: I have no clue about the internals of inlining on the jvm ;) |
| 10:38 | clgv | Bronsa: maybe I try that, I was working on more flexible primitive functions anyway |
| 10:38 | Bronsa | clgv: I'd be interested to know about that |
| 10:43 | clgv | Bronsa: currently I am just hacking the compiler from a library |
| 10:44 | clgv | i.e. reusing its class generation features for reify |
| 11:10 | yedi | does anyone use cljs on the client with a non-clj lang on the server? curious about people's experiences and common dev practices |
| 11:12 | daniel___ | yedi, dont think so |
| 11:12 | daniel___ | thats crazy |
| 11:12 | yedi | =p , jc to know if ppl have written about their experiences somewhere |
| 11:13 | justin_smith | daniel___: saw some guy on twitter talking about using cljs with rails |
| 11:13 | shem | yedi: i'm doing such a thing right now. cljs/om in the client, perl in the server (for legacy reasons). communication via json |
| 11:14 | muraiki | shem: are you doing anything with websockets in perl? |
| 11:14 | justin_smith | daniel___: a coworker of mine made some great stuff using cljs on the frontend and google app-engine and node.js on the backend (two different projects) |
| 11:14 | shem | muraiki: nope |
| 11:15 | yedi | shem: cool! i guess it's been working out pretty well? |
| 11:15 | muraiki | shem: I work at a perl shop and our internally developed framework doesn't really have a way to easily fit in something like websockets... was just curious if you had explored that in perl :) |
| 11:15 | shem | yedi: it's certainly more fun than doing mostly everything on the server side with perl |
| 11:16 | yedi | shem: for packaging different cljs code for different webpages and sending them to the client, how do you go about that? do you simply just build a bunch separate js files from the cljs and choose which ones to included in the html markup? |
| 11:17 | yedi | oooo clojure cup results are out |
| 11:17 | shem | yedi: i use simple routing inside the root component like this: https://github.com/swannodette/om/issues/235#issuecomment-53092555 |
| 11:18 | shem | yedi: btw there's a #clojurescipt channel which might be more appropriate for this |
| 11:18 | yedi | shem: oh it's in the style of a one page application? all your pages require the same cljs? |
| 11:18 | clojurebot | excusez-moi |
| 11:18 | yedi | ah true, i forget ##clojurescript is a thing |
| 11:19 | cka3yc | 1 |
| 11:19 | shem | yedi: yeah, one page logically. but many completely different views |
| 11:21 | yedi | shem: right, so when loading a view that isn't the index or main page. do you send the base/root js to the client and then it requests what's needed from the server to generate to view? so two round trips instead of 1? |
| 11:21 | yedi | the winning app: http://youmusic.clojurecup.com/ doesn't even seem to work for me |
| 11:21 | shem | nope, no communication with server |
| 11:22 | shem | i just change the route-name in app state and om renders a different view |
| 11:24 | yedi | shem: ah ok, seems simple enough. thanks for sharing |
| 11:24 | cka3yc | Hello, trying to read tar.gz file like so : |
| 11:24 | cka3yc | (with-open [in (java.util.zip.GZIPInputStream. |
| 11:24 | cka3yc | (clojure.java.io/input-stream |
| 11:24 | cka3yc | "my-file-name.gz") |
| 11:24 | cka3yc | and getting "Not in GZIP format", but i can open this archive in my file manager without any problems, what can be the problem here? I'm on Windows 7 |
| 11:25 | p_l | it's probablyt not a gzip file |
| 11:32 | daniel___ | justin_smith: wasnt completely serious, it could obviously work |
| 11:32 | daniel___ | its a bit strange if you have a choice in the matter though |
| 11:40 | justin_smith | yeah, those examples had client requirements that ruled out clj on the back end |
| 11:43 | seangrove | I'm really starting to get attracted to the idea of a clojure-flavored haskell. Could be a lot of fun. |
| 11:44 | justin_smith | seangrove: flavor as in syntax or semantics? |
| 11:45 | seangrove | Clojore-syntax, clojurescript-macros, haskell/ghc typing |
| 11:45 | justin_smith | ahh, OK |
| 11:45 | seangrove | No runtime macros, but we don't have them in cljs anyway |
| 11:46 | seangrove | Also, the degree of purity Haskell has means the compiler is free to do a lot more |
| 11:46 | seangrove | It's an interesting set of ideas, I can definitely see why Haskell is academia's playground |
| 11:55 | dnolen_ | seangrove: I think this idea doesn't really make any sense - you already have core.typed, HM style typing while preserving Cljoure semantics. What you're talking about sounds like Haskell w/ Lisp syntax http://clemens.endorphin.org/ILC07-Liskell-draft.pdf - it wouldn't feel like Clojure at all same way that Haskell does not |
| 11:56 | seangrove | dnolen_: Yeah, certainly I'd rather it be closer to Liskell (not a fan of Haskell syntax at this point), but core.typed being optional makes it largely useless without a ton of discipline and buy in from everyone |
| 11:56 | seangrove | dnolen_: I like core.typed too, but having seen it in a large code base, it's really subject to bitrot |
| 11:57 | seangrove | It's just an idea I'm considering playing with a bit more though |
| 11:59 | dnolen_ | seangrove: I don't see how this any different from evolving code conventions, deprecated libraries / APIs, etc. |
| 11:59 | dnolen_ | investing in anything is a shit ton of work |
| 12:00 | seangrove | dnolen_: Except if the libraries aren't doing the typing as well, then you're doing a huge amount of work for every library that you bring in |
| 12:00 | seangrove | Just a cultural thing that causes a lot more pain for core.typed users than for ocaml/haskell users |
| 12:00 | dnolen_ | seangrove: what you're saying still doesn't make sense given the larger goals of gradual typing |
| 12:01 | dnolen_ | seangrove: the the point is not to type everything in the world |
| 12:01 | dnolen_ | this is a waste of time |
| 12:01 | seangrove | dnolen_: Ah, yes, I'm sorry. I'm saying that gradual typing is a really tough problem |
| 12:01 | seangrove | Don't mean to open up a debate, it's not a hugely interesting problem |
| 12:01 | dnolen_ | seangrove: no static typing has the same problem |
| 12:01 | bbloom | seangrove: gradual typing is rapidly becoming pretty well understood :-) |
| 12:01 | dnolen_ | seangrove: there's thing called Type Providers in F# for a reason |
| 12:02 | seangrove | dnolen_: I'll have to look up type providers, thanks. Haven't looked into F# at all yet |
| 12:02 | dnolen_ | seangrove: even if you did come up with such a thing good luck providing semantics for interop anyhow |
| 12:03 | bbloom | type providers are pretty damn cool |
| 12:04 | dnolen_ | which is another thing that core.typed doesn't get enough credit for, attempting to give semantics to host |
| 12:05 | seangrove | dnolen_: How so? |
| 12:05 | zot | is there any notion of directly accessing the parent namespace? e.g., i'm in foo.bar.baz, and want to access foo.bar/funk — is there a relative/.. style access, or do i just need to explicitly say foo.bar/funk? |
| 12:05 | dnolen_ | seangrove: dude, read the paper :) |
| 12:05 | seangrove | dnolen_: Will do |
| 12:05 | clgv | zot: no. there is no such runtime concept as parent namespaces |
| 12:05 | bbloom | zot: relative imports are a bad idea |
| 12:06 | clgv | zot: actually, there is no guarantee that a namespace class for a parent (according to your definition) exists at all |
| 12:06 | clgv | zot: use aliases as in (:refer [foo.bar :as fb]) |
| 12:06 | technomancy | bbloom: why is that? |
| 12:07 | zot | i don't have a need for guarantees, but i too am curious about the bad idea flag :) |
| 12:07 | zot | s/flag/flag-in-the-ground/ :) |
| 12:07 | bbloom | b/c it makes it harder to grep for usages of namespaces |
| 12:07 | clojurebot | It's greek to me. |
| 12:07 | bbloom | b/c it saves like ~20 characters in an entire file |
| 12:07 | bbloom | b/c you should use aliases anyway |
| 12:08 | bbloom | b/c there's no such thing as a parent directory in unix |
| 12:08 | bbloom | i'm sure i could think of a few more :-) |
| 12:09 | sritchie | technomancy: oh man, I finally found it: https://github.com/zcaudate/lein-repack |
| 12:09 | bbloom | b/c it makes the meaning of a file's code depend on the location of the file |
| 12:09 | bbloom | nothing else does that right now |
| 12:09 | bbloom | btw python 3 removes relative imports ... |
| 12:10 | bbloom | or rather *implicit* ones, i bleieve |
| 12:10 | technomancy | bbloom: racket has them |
| 12:10 | bbloom | technomancy: racket has everything |
| 12:10 | technomancy | the grep thing I'd buy; the other reasons are bogus |
| 12:10 | technomancy | I'm still wondering what it would look like if you could chop of a subtree of namespaces and treat them as an isolated unit |
| 12:11 | technomancy | I think you could solve a lot of dependency problems that way |
| 12:11 | bbloom | you can't cat a file to the compiler and have it work if you've got relative imports |
| 12:11 | bbloom | b/c you need to know the file's path |
| 12:11 | sritchie | technomancy: that plugin I just sent you allows you to do that with a lein proj (I just jumped in so I’m probably missing a ton of context) |
| 12:11 | bbloom | nothing else in clojure is source location dependent |
| 12:11 | technomancy | you can't cat a file to the compiler and have it work anyway |
| 12:11 | bbloom | sure you can |
| 12:11 | technomancy | FSVO of "work" that includes line numbers |
| 12:11 | bbloom | that's basically what load-file does |
| 12:12 | bbloom | but it does know the file path ;-) |
| 12:12 | technomancy | right |
| 12:12 | bbloom | the way people use inferior lisp probablyw ouldn't work b/c it really just does pipe stuff, as far as i udnerstand |
| 12:12 | bbloom | but i'm not a emacs guy |
| 12:12 | technomancy | any definition of "work" that doesn't give you useful error messages is not a definition I buy |
| 12:12 | milanj | hi, what's best way to extend exception |
| 12:12 | bbloom | milanj: use ex-info and ex-data |
| 12:12 | bbloom | milanj: or if you absolutely must make a custom subclass for interop purposes, write java |
| 12:13 | milanj | I don't want it for inter opt purposes |
| 12:13 | bbloom | (doc ex-info) |
| 12:13 | clojurebot | "([msg map] [msg map cause]); Create an instance of ExceptionInfo, a RuntimeException subclass that carries a map of additional data." |
| 12:13 | bbloom | ^^ that's what you want |
| 12:13 | milanj | ok, let me check those |
| 12:22 | milanj | bbloom, thanks |
| 12:22 | milanj | btw. this doesn't look nice |
| 12:23 | bbloom | what's not nice about it? |
| 12:23 | technomancy | it's a lot nicer than subclassing Exception |
| 12:24 | milanj | that is right |
| 12:24 | lvh | reiddraper: Hi! You wouldn't happen to know if there's a URL generator, or, maybe more generally, generator-generator from instaparse, or generator-generator from ABNF? |
| 12:24 | milanj | bbloom, well, you manually comparing things from map that you put in exception |
| 12:24 | milanj | probably can be made better with some macro |
| 12:25 | jeremyheiler | lvh: this might help: https://github.com/bowmanb/schema-contrib |
| 12:25 | jeremyheiler | for urls |
| 12:25 | milanj | I can, judging by this you only need on Exception class |
| 12:25 | jeremyheiler | it uses instaparse under the hood |
| 12:25 | lvh | jeremyheiler: Yeah, I'm using that. It has a URI schema, I'm trying to turn that into a test.check generator |
| 12:25 | bbloom | milanj: i'm not sure i understand your complaint |
| 12:26 | technomancy | milanj: it is a shame there's no built-in macro to pattern-match against ex-data |
| 12:26 | mdrogalis | milanj: I think I know what you're saying. You're repeating the keywords in the map? |
| 12:26 | mdrogalis | You'd have to repeat the method call to Exception's subclass. It's a superficial difference, if I understand correctly. |
| 12:27 | milanj | if java was like this we would throw only OneException with map in it and then compare it by hand |
| 12:27 | technomancy | java sucks at having syntax for data though |
| 12:27 | milanj | yes, cool thing is that lisp allow it to play with syntax |
| 12:27 | reiddraper | lvh: nothing that i'm familiar with, but a url generator would not be difficult to write |
| 12:28 | technomancy | milanj: there's sort of pattern-matchy stuff in slingshot that works on ex-infos |
| 12:28 | Bronsa | how cool would it be if catch could destructure ex-infos? |
| 12:28 | technomancy | https://github.com/scgilardi/slingshot |
| 12:28 | lvh | reiddraper: yeah, I just try to avoid writing code :) any particularly good contrib libs that I could contribute a generator to? |
| 12:28 | milanj | technomancy, thanks, I'll check that for sure |
| 12:28 | milanj | native solution is ugly |
| 12:29 | technomancy | milanj: it gives you all the building blocks you need, but it's low-level |
| 12:29 | reiddraper | lvh: hmm, maybe https://github.com/gfredericks/test.chuck |
| 12:29 | reiddraper | cc gfredericks ^ |
| 12:29 | lvh | reiddraper: awesome, thank you :) |
| 12:29 | reiddraper | np |
| 12:30 | milanj | technomancy, sure, but exception handling is something that is basic enough to have good solution in core language |
| 12:30 | milanj | so anyone can use the same solution |
| 12:30 | technomancy | milanj: and so is pattern matching; I agree =) |
| 12:30 | lvh | particularly gen'/for seems very useful for my url maker :) |
| 12:31 | technomancy | milanj: but if you ever tried to contribute a change to clojure you'd understand why it's this way |
| 12:32 | milanj | technomancy, I just started with clojure, coming mainly from CL world (and Java in last couple of years) |
| 12:32 | mdrogalis | Welcome :) |
| 12:32 | milanj | (don't make me mention cl conditions system) : )) |
| 12:33 | Bronsa | technomancy: things are a bit better now than before though, puredanger is actually responsive :) |
| 12:33 | milanj | ok, thanks to all |
| 12:33 | technomancy | milanj: yeah the only thing I'm still jealous of CL about =) |
| 12:33 | mister_zombie | Hi, I'm new to clojure, as an introductory project I wanted to build a thing that parses a webpage to check for missing alt properties on img tags |
| 12:34 | milanj | btw. is that decision because of interopt with java or something else (not to have conditions) ? |
| 12:34 | technomancy | Bronsa: I've seen fixes go through better than in the old days, but I'd still much rather contribute to slingshot than clojure itself. |
| 12:35 | justin_smith | milanj: you keep calling interop (inter operation) interopt (inter optimization?) |
| 12:35 | mister_zombie | I don't really want to start off building a parsing library, is there any good one out there? |
| 12:35 | danneu | what's a nice way to implement (select-keys2 {:a 1, :b 2} [:a :b :c]) -> {:a 1, :b 2, :c nil} |
| 12:35 | milanj | I meant inter-op |
| 12:36 | danneu | nvm zipmap+juxt comes to mind |
| 12:36 | ckirkendall | mister_zombie: enlive has some tools that would make this easy. |
| 12:37 | mister_zombie | I tried it but I couldn't get it to work |
| 12:37 | mister_zombie | I had issues with attributes |
| 12:37 | justin_smith | ,(into {} (map (juxt identity {:a 1, :b 2}) [:a :b :c])) ; danneu |
| 12:37 | clojurebot | {:a 1, :b 2, :c nil} |
| 12:38 | lvh | reiddraper: If (gen/sample my-generator) returns a bunch of duplicates, is that a bug in my generator, or considered OK behavior? |
| 12:38 | reiddraper | lvh: totally depends, try (gen/sample my-generator 100) and see if you get more diverse data |
| 12:39 | ckirkendall | mister_zombie: can you give me an idea of the type of problem you had. |
| 12:39 | lvh | reiddraper: ah; that made me realize the answer actually |
| 12:40 | reiddraper | lvh: sampling is also (just like testing) subject to sizing, and the size increases as you ask for more tests, or more samples |
| 12:40 | lvh | reiddraper: (basically it's just a fixed url + a fixed pair + an optional pair with only five or so possible values; so as soon as sample *can* ask for more than, oh, 6 types or so, it's going to repeat itself) |
| 12:40 | lvh | reiddraper: I guess it could be rephrased as: does every generator need to be able to produce arbitrary examples |
| 12:40 | gfredericks | reiddraper: I had great success with exponential hops down the shrink tree the other day; such a bizarre tactic though |
| 12:40 | lvh | reiddraper: or can it say "these are all the things I have, sorry" |
| 12:41 | lvh | reiddraper: I guess it's not usually a problem because most real generators, especially composed ones, will be able to produce many more examples than you can ever check |
| 12:41 | reiddraper | lvh: test.check doesn't care if there's lots of duplication, but it also doesn't take advantage or do anything smart with that |
| 12:41 | lvh | reiddraper: ok, cool, thanks again :) |
| 12:41 | reiddraper | gfredericks: hmm, we should talk about that, still thinking next week might be good to meet up? |
| 12:41 | gfredericks | I down it's worth considering as an official shrink strategy but it was fun |
| 12:41 | gfredericks | oh urm |
| 12:42 | gfredericks | reiddraper: maybe next week is bad actually |
| 12:42 | gfredericks | anything later is probably fine. also RIGHT NOW would work. |
| 12:43 | reiddraper | gfredericks: i'm in my last two days at basho, so now probably isn't good... :) , we'll figure it out |
| 12:49 | ckirkendall | mister_zombie: https://gist.github.com/ckirkendall/4fca64e381067f999f35 |
| 13:02 | mister_zombie | ckirkendall: Oh. That's very cool. |
| 13:06 | sritchie | so, with environ and the 12 factor thing of sharing config through environment variables, |
| 13:07 | sritchie | if I’m never supposed to check them into source control, how am I supposed to sync a dev environment between team members? |
| 13:09 | technomancy | sritchie: nothing wrong with checking dev default values into source control |
| 13:09 | justin_smith | sritchie: relevant page for reference http://12factor.net/config |
| 13:10 | justin_smith | technomancy: depends on what you use - I have seen for example the credentials to an internally used mysql server accidentally get open sourced |
| 13:10 | justin_smith | technomancy: which config via env would have prevented |
| 13:10 | technomancy | justin_smith: developing against a server that isn't on your laptop? =( |
| 13:10 | sritchie | justin_smith: so how would you get those credentials to new devs? |
| 13:10 | justin_smith | sritchie: a scrit that sets up all the dev time env, that isn't in vc |
| 13:11 | sritchie | and just gets emailed around or something? |
| 13:11 | sritchie | I can see putting that in a separate project, |
| 13:11 | sritchie | under VC, which just never gets open sourced - |
| 13:11 | sritchie | seems just as “secure” as any other distribution channel |
| 13:11 | justin_smith | technomancy: it's a cms, the designer needs to be able to create asset handles, the frontend needs to be able to create content placeholders, etc. and everyone should have this stuff in sync |
| 13:12 | justin_smith | technomancy: acknowledged it is a specific workflow, but this kind of thing is not super uncommon |
| 13:12 | sritchie | actually, here’s one config question I had for you guys - |
| 13:12 | technomancy | I actually put default settings in the code itself, only because you have to restart the whole JVM to change actual env vars |
| 13:12 | sritchie | I’m moving all my config over to the env, but having strict “dev” and “prod” configs isn’t quite working, |
| 13:12 | sritchie | since I might want to run production stripe queries, or send mandrill emails, from my repl |
| 13:13 | sritchie | (but not actually store production DB info locally) |
| 13:13 | sritchie | so that requires switching just one config variable, the stripe key, and nothing else |
| 13:13 | sritchie | one way to do that is to prefix environment variables with “DEV_” or “PROD_”, but that’s pretty busted, |
| 13:14 | sritchie | (and then have a dynamic variable that I can override for specific repl calls) |
| 13:14 | sritchie | or is there some other, cleaner way to accomplish this - |
| 13:14 | sritchie | of maintaining granularity at the repl |
| 13:15 | justin_smith | sritchie: how about this for flexibility: the vars come in through the env, that is used to populate system properties (which are all updatable at runtime) |
| 13:15 | mi6x3m | Can someone explain: |
| 13:15 | mi6x3m | ,(var '+) |
| 13:15 | clojurebot | #<CompilerException java.lang.ClassCastException: clojure.lang.Cons cannot be cast to clojure.lang.Symbol, compiling:(NO_SOURCE_PATH:0:0)> |
| 13:16 | mi6x3m | a, wait, it's a macro lol |
| 13:16 | justin_smith | sritchie: the reason not to put this into system properties directly is the jvm prints out properties at boot, which you probably don't want for credentials |
| 13:16 | mi6x3m | ,(var +) |
| 13:16 | clojurebot | #'clojure.core/+ |
| 13:16 | hiredman | mi6x3m: (var ...) is a special form |
| 13:16 | sritchie | justin_smith: haha, sure |
| 13:16 | Bronsa | mi6x3m: not a macro, a special form |
| 13:16 | justin_smith | ,'(var '+) |
| 13:16 | clojurebot | (var (quote +)) |
| 13:16 | sritchie | justin_smith: but then to override, I’d need some way of having the dev AND prod loaded at the same time, |
| 13:16 | hiredman | #'+ |
| 13:16 | mi6x3m | any way to get the var from a symbol? |
| 13:16 | sritchie | so that I could switch between them |
| 13:16 | sritchie | justin_smith: that’s what seems to break the 12 factor |
| 13:16 | Bronsa | ,(resolve '+) |
| 13:16 | clojurebot | #'clojure.core/+ |
| 13:17 | danneu | (or (:db-uri *env-override*) (:db-uri env) "datomic:mem://localhost:4334/dev") |
| 13:17 | hiredman | ,(apropos "var") |
| 13:17 | clojurebot | (clojure.core/*allow-unresolved-vars* clojure.core/alter-var-root clojure.core/find-var clojure.core/var-get clojure.core/var-set ...) |
| 13:17 | hiredman | etc etc |
| 13:17 | justin_smith | sritchie: you would have a function that populates the properties from the env at boot, but you can also update individual keys (since they are in properties) in runtime |
| 13:17 | mi6x3m | damn, I totally forgot about resolve although I use it once every mins... |
| 13:17 | mi6x3m | (inc Bronsa) |
| 13:17 | lazybot | ⇒ 59 |
| 13:18 | sritchie | justin_smith: I just meant as far as naming conventions. Since, to override, I’d need access to the prod variable as well |
| 13:18 | sritchie | justin_smith: I know I can make it work, I have been, it just requires a bunch of switches, |
| 13:18 | sritchie | or embedding the environment mode in the variable name |
| 13:18 | justin_smith | yeah |
| 13:19 | justin_smith | I wonder if this could be addressed with some usage of environ + component?" |
| 13:19 | justin_smith | s/"// |
| 13:20 | danneu | yeah, components could init with an optional config map that's merged into environ.core/env |
| 13:21 | technomancy | sritchie: consider carica too; IMO the env var stuff falls over for more complicated use cases, especially when you want nested data. |
| 13:23 | TimMc | I generally store my entire program as an environment variable. |
| 13:24 | sritchie | TimMc: :) |
| 13:24 | sritchie | technomancy: nice, looking |
| 13:24 | TimMc | Unfortunately, they're trying to "patch" the "bug" I've been using to do that. |
| 13:26 | sritchie | technomancy: looks like carica wants you to check the entire config into source, yeah? |
| 13:29 | technomancy | sritchie: no, it's designed to have prod config overlaid at deploy time |
| 13:30 | martinklepsch | when using pipeline-async I wouldn't be able to pipe intermediate into the to-chan right? (lets say the progress of a file being uploaded) |
| 13:33 | mi6x3m | has anyone here used a plugin to copy files with leiningen? |
| 13:33 | mi6x3m | like for resources |
| 13:34 | danneu | gulp.js ;) |
| 13:40 | sritchie | technomancy: so, with heroku, I’d still need a deploy tool to transfer the carica config file over, yeah? |
| 13:40 | sritchie | technomancy: I’m currently on dokku and using environ, which works well there - |
| 13:40 | technomancy | sritchie: oh yeah, carica isn't really heroku-friendly |
| 13:43 | sritchie | technomancy: figaro has a script that dumps all variables to heroku - that would probably solve it for carica |
| 13:43 | sritchie | have some way to read from the env as well, with some convention for the nesting, |
| 13:43 | sritchie | then inject all variables into heroku’s env |
| 13:43 | technomancy | sritchie: you kinda lose the advantages of carica though |
| 13:44 | technomancy | supporting non-string types, etc |
| 13:44 | sritchie | sure |
| 13:58 | verma | in clojurescript how do I check if a certain object is a native javascript arraybuffer type, or in other words can reliably check types of native JS types? js/Array js/ArrayBuffer js/Float32Array etc. |
| 14:01 | verma | in cljs repl (type "hello") gives me #<function String() { [native code] }> |
| 14:01 | eriktjacobsen | I’m using clojure.java.jdbc 0.3.4… even in the simplest test case of a primary key select on a table with 4 rows, i’m seeing queries take 900ms-1200ms where they are 100ms on the mysql commandline client. Same client, same host, same query. Brief internet search doesn’t show any outstanding known performance issues… any ideas to debug ? |
| 14:02 | justin_smith | eriktjacobsen: just a shot in the dark, try using a connection pool? |
| 14:03 | justin_smith | but that is a huge overhead, and just creating a connection would not explaian a delay like that |
| 14:04 | eriktjacobsen | justin_smith: thanks looking into c3p0 now |
| 14:06 | noonian | verma: you can probably do (= (array) js/Array) |
| 14:06 | noonian | verma: i mean (= (type (array)) js/Array) |
| 14:09 | xeqi | is there a core.logic relation to say something is a symbol? |
| 14:09 | verma | noonian, checking |
| 14:10 | verma | nice, that works, that check is a function against functin check :) |
| 14:10 | noonian | yep :) |
| 14:10 | verma | (type (array)) returns a function like object |
| 14:10 | verma | :P |
| 14:10 | verma | (inc noonian) |
| 14:10 | lazybot | ⇒ 6 |
| 14:10 | noonian | yeah, just typing Array in a js console returns the same thing pretty much |
| 14:11 | verma | oh yes, true |
| 14:11 | noonian | because in js the constructor function *is* the type |
| 14:12 | verma | this is however, far better type checking compared to what native js offers |
| 14:15 | eriktjacobsen | justin_smith: hmm the current c3p0 seems broken… as soon as I add [jdbc.pool.c3p0 :as pool] to require, it causes java.jdbc to break “Could not locate jdbc/core__init.class” |
| 14:15 | doctorm | Can any vim-fireplace users tell me what :Require is supposed to do? I was thinking you could use it to eval a namespace in your repl, but all it does for me is pitch an error. |
| 14:15 | mister_zombie | How would I go around packing my compojure app as a standalone jar I can run? |
| 14:16 | justin_smith | eriktjacobsen: hmm - you may need to exclude its version, or it may be developed against an archaic version of jdbc |
| 14:17 | mister_zombie | I put a "main" setting in my project.clj, pointing to the correct namespace, but I don't know what to do after that. |
| 14:17 | eriktjacobsen | I think its just out of date… deps tree doesn’t show it trying to include jdbc: “ [clojure.jdbc/clojure.jdbc-c3p0 "0.3.0"] |
| 14:17 | eriktjacobsen | [com.mchange/c3p0 "0.9.5-pre8"] |
| 14:17 | eriktjacobsen | [com.mchange/mchange-commons-java "0.2.7"] |
| 14:17 | eriktjacobsen | “ |
| 14:18 | noonian | mister_zombie: just run 'lein uberjar' from the project directory; you will need a -main fn defined for the entry point |
| 14:18 | mister_zombie | noonian: What do I put in the main? |
| 14:18 | noonian | mister_zombie: it will create a verbosely named jar in target |
| 14:19 | noonian | mister_zombie: in project.clj under :main put a symbol telling it what namespace your -main function is in |
| 14:19 | noonian | and in that namespace have a (defn -main [& args] (println "hello world")) |
| 14:23 | kjellski | just starting out with clojure, wasn't there a syntax element that lets you specify the var and functions to apply to it all after each other? and you don't need to repeat the var all the time? |
| 14:23 | justin_smith | eriktjacobsen: to back up and take a different tack for a moment: you could profile (the jdk comes with jvisualvm for example) and figure out what the app is trying to do when those delays happen |
| 14:23 | justin_smith | eriktjacobsen: or maybe even jstack (command line utility, shows all stack traces of all threads) |
| 14:24 | eriktjacobsen | kjellski: You can pipeline stuff such as (-> data fn1 fn2 fn3 fn4) |
| 14:24 | kjellski | eriktjacobsen, agh, I'll fiddle with that one in the repl :) is it a macro? |
| 14:25 | noonian | kjellski: if you want to do things to the return values you can use '->' for java object interop (like using a bunch of setters) you can use (doto (MyObj.) (setSomething "bar") (setSomethingElse "baz")) |
| 14:25 | justin_smith | kjellski: if you repeated the var you would not get stacked results - do you want a sequence of stacked effects, or parallel operations on the original? |
| 14:25 | noonian | kjellski: yeah its a macro |
| 14:25 | noonian | ,(macroexpand-1 '(-> {:foo 17} (assoc :bar "bar") println)) |
| 14:25 | clojurebot | (println (assoc {:foo 17} :bar "bar")) |
| 14:25 | mikerod | I'm a bit saddened that http://dev.clojure.org/jira/browse/CLJ-1224 is not making it into clj 1.7 |
| 14:26 | kjellski | noonian, ah, I needed this for javascript interop, that might help to set some stuff on easeljs shapes, thanks! |
| 14:26 | mikerod | I can't wait until records can make efficient keys in maps |
| 14:26 | noonian | kjellski: yeah, np |
| 14:26 | kjellski | I think doto is what I needed :) thanks @all! |
| 14:26 | puredanger | mikerod: I'll take the hit on that one, sorry (just didn't get to screening it) |
| 14:27 | mikerod | puredanger: I forgive you. hah :-P - It's ok. Transducers sooner than later is a Good Thing. |
| 14:30 | mister_zombie | I get this when I try to compile or run now : Exception in thread "main" java.lang.NoSuchMethodError: clojure.lang.RestFn.<init>(I)V, compiling:(ring/middleware/params.clj:1:1) |
| 14:31 | kjellski | noonian, much cleaner, thanks :) |
| 14:32 | mister_zombie | Project file: http://pastie.org/9635118 code file: http://pastie.org/9635122 |
| 14:38 | nkozo | core.async question: I have a go-loop receiving data from a chan, it must be sure the data is not mutated after is sent to his chan, there is a way to make the chan execute a transformation function (to clone the data) everytime an element is put into it, but synchronously? I mean, when (>! c v) returns is assured v is already transformed to v2, and the go-loop only sees v2 values |
| 14:42 | weavejester | nkozo: You’re sending mutable data through a channel? |
| 14:42 | nkozo | weavejester: is a compromise |
| 14:43 | weavejester | nkozo: What’s the situation? |
| 14:43 | nkozo | i want to keep a client api simple, so they can send bytebuffer's over the chan without doing anything special |
| 14:44 | nkozo | never used chan transducers / pipelines, so I'm not sure this is possible |
| 14:45 | weavejester | Why would the client want to send bytebuffers over a channel? |
| 14:46 | nkozo | to compose network packets |
| 14:47 | weavejester | Okay, so the client is sending a byte buffer to a channel, which is then being delivered to a socket or somesuch? |
| 14:47 | nkozo | yep |
| 14:47 | weavejester | What’s the purpose of using a channel? |
| 14:47 | nkozo | asynchronicity |
| 14:47 | nkozo | and homogeneous api |
| 14:48 | nkozo | i know there are other alternatives, I want to know if this specific one is possible :) |
| 14:48 | weavejester | Why a bytebuffer over something like an array? |
| 14:49 | weavejester | So you want a channel that clones the data coming in to ensure immutability? |
| 14:49 | nkozo | arrays are mutable also, same problem |
| 14:49 | nkozo | weavejester: exactly |
| 14:50 | nkozo | weavejester: executes a function when a value is put in him and uses the return value as the new one |
| 14:50 | weavejester | Is cloning a bytebuffer each time more efficient than just using a vector? |
| 14:50 | nkozo | suposse yes :) |
| 14:51 | weavejester | Okay, I’ll suppose you’ve benchmarked it |
| 14:51 | weavejester | You could use clojure.core.async/map> I believe to apply a function to the input before putting it on the channel |
| 14:52 | nkozo | no, I'm doing only a thinking exercise, also to learn the core.async api |
| 14:52 | Bronsa | weavejester: well each assoc/dissoc on a vector you're always cloning at least one array |
| 14:52 | clojurebot | Excuse me? |
| 14:52 | Bronsa | err, conj |
| 14:52 | weavejester | Bronsa: Yeah, but the arrays are a fixed and relatively small size. |
| 14:53 | Bronsa | right |
| 14:53 | weavejester | Bronsa: Cloning a byte buffer n times is likely to be less efficient, I suspect, than putting the byte buffer into a vector once. |
| 14:54 | weavejester | But for a hypothetical exercise, I guess that doesn’t matter |
| 14:54 | Bronsa | weavejester: yeah, depends on the size |
| 14:56 | weavejester | Does anyone happen to have any suggestions for what to name a function that takes in a configuration and spits out a handler? |
| 14:56 | weavejester | I was thinking “endpoint”, but that might be a little overloaded |
| 14:56 | justin_smith | endpointFactory |
| 14:56 | justin_smith | (not really) |
| 14:56 | kjellski | is there something like a step function that creates a lazy seq of numbers as is defined by the gap between the numbers? |
| 14:57 | llasram | ,(range 1 10 2) |
| 14:57 | clojurebot | (1 3 5 7 9) |
| 14:57 | mister_zombie | Would any of you mind telling me what I'm doing wrong? "lein run" fails, and so does "lein uberjar" — Project file: http://pastie.org/9635118 code file: http://pastie.org/9635122 |
| 14:57 | kjellski | llasram, thanks! :) I only tried the second argument! |
| 14:57 | nkozo | the general problem is how to put a mutable value1 to a chan and making the chan executing automatically a function that extracts an immutable value2 from value1, sends value2 to the chan reader and makes (>! c value1) return after value2 was extracted (so value1 can be safely mutated) |
| 14:58 | danneu | mister_zombie: what's the err |
| 14:58 | weavejester | mister_zombie: You’ve specified your main function as a handler function. |
| 14:59 | danneu | yeah, your root handler is millepattes.handler/app |
| 14:59 | danneu | your -main fn is a fn that boots the server |
| 15:00 | weavejester | You also have (use ‘ring.adapter.jetty) sitting at the top level for some reason |
| 15:01 | weavejester | But then refer to jetty/run-jetty down at the bottom |
| 15:01 | noonian | :ring {:handler millepattes.handler/-main} should be millepattes.handler/-main instead |
| 15:01 | noonian | er millepattes.handler/app instead |
| 15:12 | mister_zombie | So I corrected the thing for :ring, how do I make my -main okay? |
| 15:12 | weavejester | mister_zombie: You have a bad ‘use’ statement at the top you need to fix. |
| 15:13 | weavejester | You want to remove it, and add: [ring.adapter.jetty :as jetty] to your requires |
| 15:17 | noonian | mister_zombie: yeah, your -main function looks ok to me, you just need to fix the other little things that are throwing errors when the namespace gets loaded |
| 15:18 | mister_zombie | I get this now: Exception in thread "main" java.lang.NoSuchMethodError: clojure.lang.RestFn.<init>(I)V, compiling:(ring/util/servlet.clj:1:1) |
| 15:19 | weavejester | mister_zombie: Oh, you have an ancient ring-jetty dependency in your project file for some reason |
| 15:19 | weavejester | mister_zombie: Update it to 1.3.1 |
| 15:20 | verma | man I can never get vim-fireplace + piggieback to work correctly, it was working fine, and now its totally stopped working, no matter what I do, it never starts |
| 15:20 | weavejester | mister_zombie: It’s worth noting that with lein-ring you don’t need a -main function, since lein ring server / lein ring uberjar cover its usecases |
| 15:21 | mister_zombie | weavejester: Really? lein ring uberjar was all I needed? XD |
| 15:22 | weavejester | mister_zombie: Yes, so “lein ring server” will start up a dev server, and “lein ring uberjar” will create an uberjar with an automatic main function |
| 15:24 | verma | anyone here use vim-fireplace + piggieback? |
| 15:28 | mister_zombie | Thank you all, much appreciated |
| 15:32 | mister_zombie | Say I want to deploy to an application container, would the uberjar do just fine? |
| 15:33 | kjellski | Is there an easier way to create this squence of vectory then this? |
| 15:33 | kjellski | ,(map vec (partition 2 (interleave (range 0 1000 100) (range 0 1000 100)))) |
| 15:33 | clojurebot | ([0 0] [100 100] [200 200] [300 300] [400 400] ...) |
| 15:35 | TimMc | ,(map (fn [x] [x x]) (range 0 1000 100))) |
| 15:35 | clojurebot | ([0 0] [100 100] [200 200] [300 300] [400 400] ...) |
| 15:35 | TimMc | kjellski: ^ |
| 15:36 | kjellski | TimMc, :D thanks, now I feel like I haven't seen the obvious solution... |
| 15:40 | weavejester | mister_zombie: The uberjar is for standalone apps, but there’s an uberwar option (lein ring uberwar) for deploying to servlet containers |
| 15:41 | doctorm_ | verma: I got disconnected, did you get an answer to your Piggieback question? |
| 15:41 | mister_zombie | weavejester: Awesome |
| 15:44 | aztak | good evening! |
| 15:44 | mmg | is there a way to see jvm parameters in the clojure rpl? specifically -Xmx ? |
| 15:45 | dbasch | ,(System/getenv) |
| 15:45 | clojurebot | #<AccessControlException java.security.AccessControlException: access denied (java.lang.RuntimePermission getenv.*)> |
| 15:45 | dbasch | mmg try that |
| 15:45 | amalloy | dbasch: that's not and environment var |
| 15:45 | aztak | mmg: I think you need to hit the JMX subsystem to get info about -Xmx params |
| 15:45 | dbasch | depending on how you ran the jvm I guess |
| 15:45 | aztak | (Runtime/getRuntime et. al) |
| 15:47 | dbasch | (.totalMemory (Runtime/getRuntime)) |
| 15:47 | amalloy | i don't think that actually works, does it? |
| 15:48 | amalloy | if your heap hasn't grown to use up all the space allocated yet, then .totalMemory only returns the heap size |
| 15:48 | aztak | mmg: http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html or if you need more info: http://docs.oracle.com/javase/7/docs/api/index.html?javax/management/remote/JMXConnectorServerMBean.html |
| 15:48 | amalloy | that is, it returns the current heap size, not the max heap size |
| 15:49 | mmg | thanks! |
| 15:49 | mi6x3m | does anyone have some experience with lein-resource? |
| 15:49 | amalloy | man, it is really hard to find the right words to distinguish between "size of heap" and "size of objects allocated on heap" |
| 15:50 | aztak | amalloy: used/committed/max ? :) |
| 15:50 | amalloy | excellent, well done |
| 15:52 | dbasch | actually why do you need to know Xmx from a repl? Did someone else run the repl? |
| 15:52 | dbasch | otherwise it’s whatever you told it |
| 15:55 | amalloy | dbasch: like an episode of the price is right? "we started this clojure repl...now guess how much ram it has!" |
| 15:55 | mi6x3m | is there any piece of code to edit leiningen structures |
| 15:55 | mi6x3m | like removing a dependency |
| 15:58 | dbasch | amalloy: am I allowed to do stuff inside the repl before guessing? That may be fun |
| 15:59 | amalloy | you can do whatever you want, we're not really on tv |
| 16:08 | noonian | i'd watch that tv show if it existed |
| 16:11 | verma | doctorm_, no :( |
| 16:11 | doctorm_ | verma: What are you trying to use it with? I’ve got it to work with weasel successfully |
| 16:12 | verma | doctorm_, I just have a cljs project, which I connect over the default austin repl (rhino) and its been sort of unpredictable |
| 16:12 | verma | it works sometimes and everything is great, but then just totally stops |
| 16:12 | verma | doctorm_, I've been hearing about weasel, let me check that |
| 16:13 | doctorm_ | verma: Give it a shot, I haven’t tried austin, because I heard about similar things happening |
| 16:13 | verma | doctorm_, I would hope that its austin specific stuff that's not working, and piggieback is doing its job fine :) |
| 16:14 | doctorm_ | verma: Cool, ping me if you run into trouble connecting to weasel |
| 16:14 | verma | doctorm_, sure thing, thanks! |
| 16:17 | amalloy | huh. i just got a stack overflow from running `lein deps :tree` |
| 16:17 | technomancy | amalloy: 2.5.0 or older? |
| 16:17 | amalloy | oh, for sure. 2.3.4, apparently |
| 16:19 | technomancy | should be fixed, yeah |
| 16:19 | amalloy | what was the issue? |
| 16:19 | technomancy | dunno; xeqi fixed it iirc |
| 16:20 | TimMc | technomancy has people for that kind of thing |
| 16:24 | m1dnight | Is there a cleaner way to check "(or (= x y) (= x z))"? |
| 16:24 | technomancy | (#{y z} x) |
| 16:25 | m1dnight | hah! I knew it! :) Thank you |
| 16:27 | amalloy | unless one of y or z is false or nil |
| 16:27 | m1dnight | nope, checking if a keyevent is either one or the other |
| 16:27 | justin_smith | (contains? #{x y} z) |
| 16:28 | m1dnight | I'm jealous of the people who write proper functional code |
| 16:29 | m1dnight | I try,but I don't always manage. Kinda stuck in OO coding. |
| 16:31 | dbasch | m1dnight: your or statement is perfectly functional |
| 16:32 | dbasch | I see nothing unclean with it btw |
| 16:32 | m1dnight | well, yes it is. But byfunctional I mean the dense functional code that you can never get in OO or other languages |
| 16:32 | m1dnight | An experienced functional programmer writes way more elegant FP code than somebody like me |
| 16:32 | m1dnight | And I envy that :p |
| 16:35 | ustunozgur | a bit off-topic but , is anyone aware of any articles that compares functional programming and frequency domain representation of signals? |
| 16:35 | ustunozgur | as in oop vs functional ~ time domain vs freq domain |
| 16:35 | justin_smith | ustunozgur: I found a great paper applying information theory to code reading / bug detection |
| 16:37 | ustunozgur | justin_smith: which one is it? |
| 16:39 | justin_smith | ustunozgur: http://macbeth.cs.ucdavis.edu/natural.pdf |
| 16:40 | ustunozgur | Thank you. |
| 16:42 | ustunozgur | Richard Hamming also had some thought on the matter in his Art of Science and Eng book. A quote: "Until we better understand languages of communication involving humans as they are (or can be easily trained) then it is unlikely many of our software problems will vanish." |
| 16:43 | ustunozgur | it's chapter 4 for the curious worrydream.com/refs/Hamming-TheArtOfDoingScienceAndEngineering.pdf |
| 17:01 | _pr0t0type_ | Hey guys, is there a gdb/pdb for lein projects I can to set break points? |
| 17:01 | _pr0t0type_ | I want to be able to halt the application at some line and inspect stuff |
| 17:07 | ustunozgur | _pr0t0type_: http://www.reddit.com/r/Clojure/comments/28udm4/does_clojure_have_a_breakpoint_capable_debugger/ |
| 17:08 | verma | doctorm_, even the regular non-weasel stuff is failing the same way, e.g. (cemerick.austin.repls/exec) |
| 17:10 | verma | doctorm_, and (cemerick.piggieback/cljs-repl) never returns the prompt back :( |
| 17:10 | verma | going on a killall frenzy |
| 17:11 | technomancy | _pr0t0type_: breakpoints are easy as long as you don't need stepping |
| 17:11 | verma | ok, I had a ton of zombie repls running, checking again |
| 17:12 | verma | ok, got a prompt this time :) |
| 17:19 | seangrove | Wow, madness http://1010.co.uk/gneve.html |
| 17:20 | amalloy | seangrove: if you can't do it in emacs, it's not worth doing, after all |
| 17:22 | amalloy | 40,000 lines of warnings from `lein deps :tree` about conflicting dependency versions. kill me now |
| 17:22 | mgaare | seangrove: I must use this |
| 17:23 | jeremyheiler | amalloy: i'l rm -rf your code base if you'll rm -rf mine |
| 17:25 | verma | ok, I am done with this shit man :( .. what's a good starting point into trying emacs with clojure? |
| 17:25 | verma | I am going to use it with evil mode of course :P |
| 17:26 | jeremyheiler | verma: i switched cold turkey from vim |
| 17:26 | jeremyheiler | i felt like evil-mode would've just gotten in the way of properly learning emacs |
| 17:27 | verma | I don't want to really learn emacs :( .. I just want a good dev env for clojure, and vim + fireplace is failing me right now :( |
| 17:27 | noonian | verma: clojure for the brave and true has a good walkthrough for getting emacs setup nicely with clojure: http://www.braveclojure.com/ |
| 17:27 | jeremyheiler | verma: have you tried intellij with cursive? |
| 17:27 | technomancy | verma: the one at clojure-docs.org is good too |
| 17:27 | technomancy | http://clojure-doc.org/articles/tutorials/emacs.html |
| 17:28 | mgaare | verma: emacs prelude is not a bad starting point either |
| 17:28 | technomancy | cider's super unstable ATM though |
| 17:28 | eriktjacobsen | I just use Vim and a repl in another window… honestly I dont think you need fireplace or any workins |
| 17:28 | WildBamboo-Josh | Just be aware that if you go down the Cider route in Emacs, I think it's advisable to stick to the stable 0.7 version. 0.8 is a big rewrite and quite unstable at the mo |
| 17:28 | noonian | yeah, even with emacs i use lein repl most of the time |
| 17:28 | technomancy | even 0.7 isn't that stable |
| 17:28 | WildBamboo-Josh | oh ok, lol |
| 17:29 | jeremyheiler | i thought 0.7 was a big rewrite.. |
| 17:29 | verma | eriktjacobsen, its nice to be able to send stuff to repl sometimes I guess, do you have a workflow for that? |
| 17:30 | verma | technomancy, noonian WildBamboo-Josh so emacs + cider 0.7 is the recommended way right now? |
| 17:30 | brehaut | just use melpha, then nothing will be stable, and cider will seem like a rock |
| 17:30 | eriktjacobsen | I generally have a split off on the side with repl-friendly macro-expanded or variable-injected values ready to copy / paste |
| 17:30 | technomancy | verma: I would stick with 0.6 or nrepl.el |
| 17:30 | eriktjacobsen | Just a scratch buffer that never gets saved, just for common queries and expanded things |
| 17:32 | WildBamboo-Josh | brehaut: lol |
| 17:33 | amalloy | eriktjacobsen: that sounds unbearable |
| 17:33 | verma | eriktjacobsen, you copy and paste stuff? |
| 17:34 | eriktjacobsen | yup, two windows vertically split or on separate monitors, and 3 key strokes (copy,switch,paste) |
| 17:34 | eriktjacobsen | never bothered me and works fine over ssh |
| 17:35 | technomancy | oh good; the clojure-doc.org article no longer recommends ESK |
| 17:35 | mgaare | for what it's worth, I run cider 0.8 and haven't really had problems |
| 17:36 | dbasch | verma: I downgraded from 0.7 to 0.6 a while back |
| 17:36 | dbasch | 0.7 did not like something about my setup |
| 17:36 | technomancy | the simplest thing is just to use nrepl.el; it's still on marmalade |
| 17:37 | brianwong | hello, i am trying to catch a java.io.FileNotFoundException around 'with-open' |
| 17:37 | verma | technomancy, is it awesome? |
| 17:37 | technomancy | verma: it's ... fine? |
| 17:37 | brianwong | the problem is, the file never closes when i catch this exception |
| 17:37 | technomancy | I haven't been keeping up with the fancy new features |
| 17:37 | technomancy | but it's enough for me |
| 17:37 | brianwong | is there a common idiom for this problem? |
| 17:38 | brehaut | technomancy: time to implement nrepl directly in atreus |
| 17:38 | brianwong | https://www.refheap.com/91498 |
| 17:38 | brianwong | so when a filepath is given that doesnt exist, the exception is caught, but the file isnt closed, so the program gets stuck |
| 17:39 | mdrogalis | brianwong: I think with-open closes it in a finally block, no? |
| 17:39 | brianwong | i thought that was built into the macro as well |
| 17:40 | brianwong | that is why im a bit confused |
| 17:40 | dbasch | brianwong: if the path doesn’t exist, there is no file to close |
| 17:40 | dbasch | what do you mean the file isn’t closed? |
| 17:40 | mdrogalis | Seems to be https://github.com/clojure/clojure/blob/clojure-1.6.0/src/clj/clojure/core.clj#L3512 |
| 17:40 | mdrogalis | Yeah, heh. That's a good point, dbasch. |
| 17:41 | brianwong | dbasch, that is a good point. my command-line tool hangs with this try/catch |
| 17:41 | brianwong | if i remove the try catch, the exception just propagates as expected |
| 17:42 | brianwong | maybe it is somewhere else in my prgram that doesnt handle the return value well |
| 17:42 | brianwong | ill do more research |
| 17:42 | dbasch | brianwong: check that the file exists before calling with-open |
| 17:42 | dbasch | or don’t use with-open, and do your own try/catch |
| 17:42 | verma | man, I was in the middle of this awesome clojure flow, and now all this env issues :( |
| 17:44 | brianwong | thanks for the advic |
| 17:44 | brianwong | advice |
| 18:07 | m1dnight | If I want to use trace in a simple lein repl, where would I put the dependency? |
| 18:07 | m1dnight | I.e., not in a project workspace |
| 18:09 | jeremyheiler | m1dnight: the :dev profile in ~/.lein/profiles.clj, I think |
| 18:10 | technomancy | jeremyheiler: user profile actually |
| 18:10 | m1dnight | jeremyheiler: That worked! |
| 18:10 | m1dnight | Didn't know about that file :x |
| 18:12 | jeremyheiler | technomancy: what differentiates user from dev? |
| 18:12 | technomancy | jeremyheiler: :dev is for per-project stuff |
| 18:12 | jeremyheiler | gotcha |
| 18:17 | _pr0t0type_ | clojure.data.json (json/read-str) returns a hashmap with strings as keys. Does anyone know how to make that return keywords instead during deserialization? ie from {"data" []} to —> {:data []} |
| 18:18 | mister_zombie | How do I pull my namespace in the lein repl? |
| 18:18 | AeroNotix | _pr0t0type_: if you pass :key-fn you can run arbitrary stuff on the key of the JSON |
| 18:18 | m1dnight | (ns ..) ? |
| 18:18 | m1dnight | that should work.. |
| 18:18 | AeroNotix | so you could pass the function keyword |
| 18:19 | m1dnight | Or do you mean (use 'name.space) ? |
| 18:19 | mister_zombie | I have my stuff in some namespace, i'm in the root of the project (with the project.clj file), I want to toy with some functions in my namespace |
| 18:20 | AeroNotix | mister_zombie: is the namespace a part of the project where project.clj is |
| 18:20 | SegFaultAX | mister_zombie: You can just require/use it as normal. |
| 18:20 | mister_zombie | yes |
| 18:21 | AeroNotix | mister_zombie: lein repl will pull it in by default |
| 18:21 | SegFaultAX | mister_zombie: You can also use in-ns to operate in the context of that ns. |
| 18:21 | _pr0t0type_ | AeroNotix: pass in? Can you elaborate a bit on that? |
| 18:21 | AeroNotix | _pr0t0type_: such as (json/read-str some-str :key-fn keyword) |
| 18:22 | AeroNotix | and it'll apply the function `keyword` to all keys in the JSON objec |
| 18:22 | mister_zombie | Thanks! |
| 18:22 | AeroNotix | object* |
| 18:22 | mister_zombie | Sweet! |
| 18:23 | _pr0t0type_ | AeroNotix: awesome, thanks dude! |
| 18:23 | SegFaultAX | mister_zombie: This is the de facto blog post on Clojure namespaces (including refer/use/require/import) |
| 18:23 | SegFaultAX | http://blog.8thlight.com/colin-jones/2010/12/05/clojure-libs-and-namespaces-require-use-import-and-ns.html |
| 18:23 | AeroNotix | _pr0t0type_: nw friend |
| 18:23 | mister_zombie | Thanks! |
| 18:24 | AeroNotix | I want to draw bar charts from clojure -- any good/cool libraries? |
| 18:24 | amalloy | AeroNotix: 4clojure uses incanter |
| 18:25 | AeroNotix | amalloy: wow ok, that looks good |
| 18:26 | dbasch | _pr0t0type_: with cheshire you can do (parse-string str true) and it gives you keywords for keys |
| 18:41 | doctorm | verma: Sorry, just got back. I can walk you through the way I set up weasel if you haven’t already mastered emacs. I’ll do a little write up and post it, although it is mostly documented on the github page. |
| 18:44 | verma | doctorm, thanks! I am just looking at emacs right now, didn't really start anything yet, setting up evil mode right now. |
| 18:44 | verma | doctorm, I am having trouble with all repls basically |
| 18:45 | verma | not sure what to do |
| 18:45 | verma | I can launch them from the command line lein repl .. and use the |
| 18:45 | verma | m |
| 18:45 | verma | but only to a certain degree though, that stops working after a while too |
| 18:46 | doctorm | verma: Yeah, it’s something I’m struggling with too. I’m in the process of moving to LightTable (just getting vimlike modal editing figured out there). vim-fireplace is good, but not quite good enough (mainly stack traces don’t seem to show in the repl, ever) |
| 18:46 | verma | if you're writing a doc, you'd be doing a huge flavour to vim people wanting to use it for clojure dev, all resources are scattered around, and the docs mostly don't tell you exactly what to do, and I am too lazy to read so much stuff |
| 18:47 | doctorm | But I’ll still do a writeup with weasel, because that is something I got figured out, and I didn’t experience it breaking like you described |
| 18:49 | verma | lol, s/flavour/favor/g |
| 18:55 | justin_smith | doctorm: stack traces may be suppressed there by default, there is always (clojure.repl/pst) which will show the most recent stack trace |
| 18:55 | justin_smith | or, more accurately, I should say, shows the stack trace for the most recent exception |
| 18:57 | doctorm | justin_smith: Thanks, I’ll check that out. It’s not the only reason for moving to LightTable, I also like the idea of using an editor whose architecture I can understand and is written in the language I’m using. |
| 18:59 | eriktjacobsen | justin_smith: earlier you recommended jvisualvm…. any guides you’d recommend. I’m used to gdb / valgrind in c. Don’t see a call tree, and it seems so much time is spent in clojure.tools.nrepl.transport and various core stuff its hard to decompress |
| 19:01 | justin_smith | eriktjacobsen: if you want something like gdb, there is jdb |
| 19:01 | justin_smith | and as I mentioned, jstack will show a stack trace of every thread |
| 19:04 | justin_smith | eriktjacobsen: also, specifically in jvisualvm, the CPU profiler/cpu panel and the threads view may help you figure out what's happening with those long running jdbc queries |
| 19:12 | lodin | Is there any way to unload a class (created with deftype)? This is for auto reloading purposes. |
| 19:13 | justin_smith | eriktjacobsen: for example here is me profiling a call to jdbc: http://i.imgur.com/RJTZh2R.png notice the cpu time is in jdbc$get_connection and jdbc.util.ReadAheadInputStream.fill |
| 19:13 | amalloy | lodin: if there are outstanding references to instances of that class you can't unload it, and if there aren't you don't need to |
| 19:14 | amalloy | probably. i guess maybe that last bit isn't true? |
| 19:14 | amalloy | tldr i don't actually know much about classloaders |
| 19:15 | lodin | amalloy: If I reload a file and the deftype has been removed, I can still reference it. |
| 19:15 | eriktjacobsen | justin_smith: hmm first time using jvisualvm, what are you using for settings in “start profiling from” and profile / dont profile? Im not seeing any jdbc entries when profiling the jdbc code. looking up the jvisualvm docs now |
| 19:15 | justin_smith | eriktjacobsen: all I did was double click on the process on the left pane, and go to the profiler pane, then click on "CPU" |
| 19:16 | lodin | amalloy: And that's a problem, because next time I run it it will fail. |
| 19:16 | justin_smith | eriktjacobsen: it should all be evident from my screenshot |
| 19:16 | lodin | amalloy: I tried pretty hard to get rid of references, even remove-ns, but that didn't help. |
| 19:16 | justin_smith | eriktjacobsen: I never got an option of where to profile from, I just clicked on the CPU button, then ran my query, and watched those red bars move |
| 19:17 | amalloy | lodin: yeah, indeed. i don't really know of a way to unload classes |
| 19:17 | lodin | I also found that doing the deftype repeatedly, overwriting the class with an identical class, leaks memory. |
| 19:18 | justin_smith | http://stackoverflow.com/questions/148681/unloading-classes-in-java this makes me think class unloading is incompatibe with how clojure does things |
| 19:18 | justin_smith | the claim is that the only way to unload a class is to garbage collect the classloader that brought it in, clojure just uses one classloader |
| 19:19 | amalloy | justin_smith: the first part of that is true, pretty sure the second isn't |
| 19:19 | justin_smith | or is it possible to specify a custom classloader in clj such that it can later be unloaded? |
| 19:19 | eriktjacobsen | justin_smith: gotcha. with default settings i’m not seeing anything but clojure internals: http://imgur.com/R2VJMj6 |
| 19:20 | eriktjacobsen | will dig |
| 19:20 | justin_smith | for doall to be doing that much, makes it sound like an expensive or very large lazy seq is being forced? |
| 19:21 | justin_smith | but the fact that no jdbc classes show up there at all is suspicious |
| 19:22 | amalloy | justin_smith: i think clojure makes a new DynamicClassLoader per eval request and daisy-chains them together, but it's probably more complex than that |
| 19:22 | dbasch | I wonder if all this is still accurate http://stackoverflow.com/a/7473707/586880 |
| 19:22 | eriktjacobsen | the internals of all those calls are the same. lots of clojure.core and clojure.lang, nothing from my own libraries or jdbc |
| 19:23 | justin_smith | eriktjacobsen: yeah, it makes me think something else that did not get captured is realizing something very large and / or very expensive |
| 19:23 | justin_smith | eriktjacobsen: it may be informative to look at the threads view and see which threads are working - many of them have informative names |
| 19:24 | justin_smith | eriktjacobsen: also, some jstack calls from the command line while a query is running should show where each thread is - the stack trace should reveal who is spending all this CPU time on a doall |
| 19:37 | eriktjacobsen | Thank you a bunch for the info |
| 19:37 | lodin | justin_smith, amalloy: So the conclusion is that no, it's not currently possible and probably won't be a for a while? |
| 19:37 | amalloy | i believe so |
| 19:40 | doctorm | verma: https://www.refheap.com/91502 |
| 19:40 | doctorm | verma: While testing it, I ran into a bunch of different problems depending on the order I did certain things |
| 19:42 | doctorm | verma: So try it out in that order, and see if you have any more luck. I’ll be away for a bit, but back later tonight. Let me know if it works |
| 19:44 | xeqi | amalloy: I believe it was a space leak from lazyness, though when I fixed that I redid most of the pedantic code and changed some algorithms |
| 19:44 | amalloy | xeqi: yeah, that sounds consistent |
| 19:46 | TimMc | Next week I'll be working on a wrapper for liverepl that will provide line-editing, injection of dependencies (w/ pomegranate), and limited classloader leakage |
| 19:46 | TimMc | Wish me luck. |
| 19:46 | lodin | Is it worth submitting a bug report about (do (deftype Foo []) (deftype Foo [])) leaks memory? I.e., the shadowed class is not GCed. |
| 19:48 | brehaut | lodin: hmm, i am super vague on the details, but i think classes are stored in the permgen, so theres no way to free them until the next vesion of java that ditches permgen is available |
| 19:50 | brehaut | java 8 is the version that ditches permgen |
| 19:51 | TimMc | The permanent generation in Java's generational GC. |
| 19:51 | brehaut | lodin: google JEP 122 as well |
| 19:51 | brehaut | which is to say, the generation that is not collected (because its permenant) |
| 19:52 | Jaood | who needs clojure when you have java 8? |
| 19:53 | hiredman | lodin: how sure are you it leaks memory? |
| 19:54 | Jaood | tough crowd |
| 19:54 | brehaut | Jaood: you get more laughs with funny jokes ;) |
| 19:54 | Jaood | ;) |
| 19:54 | hiredman | http://dev.clojure.org/jira/browse/CLJ-1152 mentions some java command line flags to turning on logging of classloading/unloading |
| 19:55 | lodin | hired: I wouldn't put a number on it. :-) But it seemed to me, looking at the memory used by the java process, that it leaked. |
| 19:55 | brehaut | lodin: a lot of non-reference count based collectors collect at non-deterministic times. |
| 19:56 | hiredman | lodin: how comfortable are you monitoring the memory usage of a java process? |
| 19:56 | hiredman | it is a known stumbling point |
| 19:56 | brehaut | lodin: dead objects arent collected until there is a reason to do so (ie, memory pressure requires more free space) |
| 19:56 | hiredman | most jvms also don't return memory to the os, even if it is "free" |
| 19:57 | hiredman | they hang on to it incase they need it later |
| 19:57 | lodin | Yeah I know, but I figured based on the previous discussion that the observation agreed with leakage. |
| 19:57 | Jaood | greedy jvm |
| 19:58 | lodin | So let's take a step back. :-) |
| 19:58 | hiredman | I think the gc behaviour of classes was a little more subtle then just "the never get gc'ed" even before java 8 |
| 19:58 | lodin | It looks like deftype leaks memory. Does it? |
| 19:59 | hiredman | lodin: it may, or may not, I dunno, you haven't presented evidence either way |
| 20:00 | lodin | hiredman: I'm asking for evidence. :-) |
| 20:00 | devn | hiredman: im cribbing most of what you did on your branch to pull it into weavejester/lein-ring, but i got stuck... https://github.com/weavejester/lein-ring/pull/130 |
| 20:01 | devn | would be curious to know if you have any ideas |
| 20:01 | mthvedt | new classes do not leak memory, they get garbage collected when the class is no longer referenced |
| 20:01 | mthvedt | same with deftype |
| 20:01 | hiredman | deftype in itself cannot leak memory |
| 20:01 | mthvedt | although in clojure you must explicitly remove the namespace |
| 20:02 | mthvedt | if your deftype is in one |
| 20:02 | lodin | mthvedt: Could you elaborate on that? |
| 20:02 | hiredman | but it generates a java class, and if the java runtime you are using (there are several) doesn't reclaim classes that could happen |
| 20:02 | johann | hey guys, i'm trying to write some images online to disk. i just tried using pmap and agents to make it concurrent. the images on disk aren't filling out to the full dimensions for reasons beyond me. anyone know what may cause this? |
| 20:03 | mthvedt | hiredman: ok, the recent sun/oracle JVMs garbage collect classes. |
| 20:03 | hiredman | the ability to redef a deftype like you did using do depends on clojure's DynamicClassloader, which does keep a reference to classes in a map in a static field, but it only keeps the last class with a given name |
| 20:03 | lodin | hiredman: I did another test, and it does look like it just releases the classes later rather than sooner. |
| 20:04 | lodin | at least on this machine. |
| 20:04 | mthvedt | lodin: a class is no longer referenced in java when its objects, class objects, classloader, and “sibling” classes from the same classloader are all out of scope. |
| 20:04 | mthvedt | …if i remember right. |
| 20:05 | TimMc | clazz.parentNode.nextSibling |
| 20:05 | TimMc | oh wait, this isn't the DOM |
| 20:05 | mthvedt | in clojure you can achieve the class/classloader conditions by unmapping the ns, which i’ve actually done successfully in experiments |
| 20:06 | mthvedt | with generating arbitrary numbers of deftypes |
| 20:09 | amalloy | brehaut: hasn't every version since like java 5 been the one that ditches permgen? |
| 20:09 | amalloy | it's not actually a "java" thing so much as a detail of various jvms, not necessarily all of them, anyway |
| 20:10 | lodin | mthvedt: I'm not sure I follow. How did you unmap the ns? remove-ns? |
| 20:11 | mthvedt | lodin: yes iirc |
| 20:15 | devn | hiredman: with your version of lein-ring, do you specify servlet-class and servlet-name, or is that not necessary? do you specify init and handler like you normally would? |
| 20:25 | lodin | mthvedt: I tried http://pastebin.com/1hiLyWpJ . What am I missing? |
| 20:34 | mthvedt | lodin: not sure tbh, been a while since i messed around with that. it looks like that shouldn’t happen though. |
| 20:38 | squeedee | Hey folks. Whats the general concensus on name collisions with core? Like i felt that 'lsystem.iterate' was a great function name... |
| 20:40 | justin_smith | squeedee: :refer-clojure in your ns block |
| 20:41 | lodin | hiredmen: Can I call that a bug at least? ;-) (Seriously though, any insights into why it works like that would really be appreciated.) |
| 20:41 | lodin | *hiredman |
| 20:42 | squeedee | justin so the idiom is to name things as they should be. Consumers just need to exclude? |
| 20:42 | justin_smith | why exclude? :use is bad anyway |
| 20:42 | brehaut | amalloy: i think with java 8 you can actually download an oracle jvm that implements it |
| 20:43 | brehaut | amalloy: perhaps as part of something called meatspace (if my rememberng is correct) |
| 20:43 | brehaut | (its probably not correct, that sounds nuts) |
| 20:43 | amalloy | not sure if serious... |
| 20:43 | amalloy | metaspaace |
| 20:43 | squeedee | well i guess i should try it, but i thought you mean refer-clojure :exclude iterate |
| 20:43 | squeedee | meant* |
| 20:43 | hiredman | lodin: what are you trying to do? |
| 20:44 | justin_smith | squeedee: oh yeah, I thought you meant consumers of your lib |
| 20:44 | brehaut | amalloy: that sounds a lot more sane than my recollecting and would make more sense |
| 20:44 | lodin | hiredman: http://pastebin.com/1hiLyWpJ |
| 20:44 | justin_smith | squeedee: yeah, use :exclude in :refer-clojure, name things the name that makes sense |
| 20:44 | lodin | hiredman: I want to get rid of the class. |
| 20:44 | hiredman | lodin: you can't |
| 20:45 | squeedee | justin_smith thanks :D |
| 20:45 | lodin | mthvedt, hiredman: I'm getting different bets here ... |
| 20:45 | amalloy | huh, interesting. i got pull requests to flatland/useful this morning. i thought forks couldn't get pulls |
| 20:45 | hiredman | lodin: I have mthvedt on ignore, so I have no idea what he is saying |
| 20:46 | hiredman | lodin: but if he told you unmapping the namespace would do anything there he is very mistaken |
| 20:47 | squeedee | amalloy on github? |
| 20:48 | mthvedt | i don’t understand the passive-aggression |
| 20:48 | amalloy | squeedee: yes |
| 20:48 | squeedee | amalloy: anything can get pulls |
| 20:48 | squeedee | you can make a pr to a branch |
| 20:49 | dbasch | permgem was indeed removed in java 8, TIL |
| 20:49 | squeedee | if its public, it can be done. fork or no fork |
| 20:49 | dbasch | PermGen |
| 20:50 | squeedee | btw amalloy, you've helped me a lot today :D (with all your comments, stackoverflow and elsewhere) |
| 20:51 | amalloy | i have? |
| 20:51 | squeedee | yep. most of the useful answers i've found today have been in part thanks to you. |
| 20:55 | amalloy | man, a whole heck of a lot of pull requests to amalloy/useful have piled up. apparently my notification settings were not sending them to me |
| 20:56 | jeremyheiler | amalloy: finally! |
| 20:56 | jeremyheiler | lol |
| 20:58 | amalloy | weird. i was unwatching the repo |
| 20:58 | lukecossey | Anyone ever tried to get the goog.fx.css3.Transitions working with Safari?? Every other browser is fine. |
| 21:02 | amalloy | hey, here's a pull request by me from two years ago. it is thoroughly unfamiliar to me: https://github.com/amalloy/useful/pull/13 |
| 21:06 | technomancy | amalloy: happens to me all the time |
| 21:06 | technomancy | (github magically unwatching repos for me) |
| 21:06 | amalloy | technomancy: it was a pull request to my own repo! |
| 21:06 | amalloy | oh |
| 21:06 | verma | thanks doctorm, I will give it a shot |
| 21:06 | technomancy | yeah, that one ... not so sure what's going on |
| 21:07 | amalloy | technomancy: i expect the unwatching was my fault, as some weird side effect of splitting up the flatland stuff into amalloy/ninjudd/raynes repos |
| 21:07 | technomancy | amalloy: it's happened waaaaaay too often to me IME for it to be something I hit by accident |
| 21:08 | lodin | hiredman, amalloy, et al.: I'm off. Thanks for your comments and pointers. |
| 21:09 | mthvedt | lodin: still there? |
| 21:09 | lodin | mthvedt: Yes. |
| 21:10 | mthvedt | lodin: i’ve been playing with a repl/profiler, and it looks like i’m wrong about deftypes being GCed. however, NSes do get GCed, but only if unmapped. |
| 21:11 | mthvedt | i’m not sure if that’s correct behavior, just a tidbit for you. |
| 21:12 | lodin | mthvedt: How did you get to the conclusion that deftypes not being GCed? |
| 21:12 | mthvedt | lodin: generated a large number of them and watched the profiler. |
| 21:13 | mthvedt | that is, a number larger than current allocated memory. |
| 21:14 | lodin | mthvedt: That's what I did as well, but I don't know enough about how JVM and the OS handles memory to be certain I interpret that correctly. |
| 21:15 | lodin | Except I didn't use the profile. I just watch the java process memory. |
| 21:16 | justin_smith | lodin: wouldn't one test be to see if you can make the jvm run out of space? give a relatively low max permgen and max heap, then repeatedly make classes that should be collectible. See if you can make it crash just doing that. |
| 21:16 | mthvedt | lodin: sun/oracle JVM will prefer garbage collecting to expanding the heap. growing heap + a lot of objects hanging around = they aren’t being garbage collected. |
| 21:16 | justin_smith | also, profiling is not super hard, the jdk comes with a profiler, other ones are not hard to find |
| 21:18 | lodin | justin_smith: Yeah, this has given me a reason to look into profilers and JVM settings. I'm not a java guy, so this is new territory for me. |
| 21:18 | verma | crap, trying to start cljs env in cider nrepl gives me this: UnsupportedOperationException count not supported on this type: Symbol clojure.lang.RT.countFrom (RT.java:556) |
| 21:18 | verma | has anyone seen this before? |
| 21:28 | verma | what is this page basically asking me to do? (sorry for off-topic) |
| 21:28 | verma | http://www.emacswiki.org/HighlightCurrentLine |
| 21:29 | verma | is it asking me to (require 'hl-line) ? |
| 21:30 | justin_smith | verma: if you want to load that library, yeah that's how you would do it |
| 21:31 | justin_smith | then you would turn on the minor mode in a buffer where you want it |
| 21:31 | justin_smith | verma: you can do it interactively via M-: |
| 21:31 | justin_smith | followed by M-x hl-line-mode in any buffer where you want it turned on |
| 21:31 | verma | justin_smith, I want to highlight the current line, really, that means I load that and set some variable to enable it? |
| 21:31 | verma | oh ok |
| 21:31 | justin_smith | it's pretty intense, I am turning it off again now |
| 21:32 | verma | how do I get it to enable all the time? (setq hl-line-mode 1) in ~/.emacs ? |
| 21:32 | justin_smith | require loads conditionally, just like in clojure |
| 21:32 | arrdem | Grimoire beta build if anyone cares to kick it around http://arrdem.com:4000 |
| 21:32 | arrdem | looks like there are six bots in this channel that crawl everything.. |
| 21:32 | justin_smith | verma: hl-line-mode is buffer local, though there may be a global variant |
| 21:32 | justin_smith | global-hl-line-mode |
| 21:32 | justin_smith | yeah |
| 21:32 | verma | justin_smith, nice thanks |
| 21:33 | verma | its looks nice, its not that intense :P |
| 21:33 | justin_smith | maybe it just sucks with my color scheme |
| 21:33 | danielcompton | amalloy: thanks for the quick build, I was just about to make an internal release |
| 21:33 | verma | now i need horizontal line and I'd be one step away from CAD software |
| 21:33 | verma | I mean vertical |
| 21:33 | justin_smith | haha |
| 21:33 | justin_smith | I am sure it is possible |
| 21:33 | arrdem | verma: there's a script I saw a while back that did both... |
| 21:33 | verma | yeah, I stumbled across it just now |
| 21:34 | justin_smith | verma: it would be cool to have it as a hairline crosshairs overlay |
| 21:34 | justin_smith | rather than highlighting the entire line |
| 21:34 | verma | media would so pick that up |
| 21:34 | amalloy | danielcompton: of useful? i actually haven't pushed the release to clojars yet. i can't figure out how to without going into the office, since clojars no longer takes scp uploads and i'm not set up here to do whatever the new stuff is |
| 21:34 | verma | hackers targetting your bytes |
| 21:34 | lodin | justin_smith, mthvedt: I tried what justin_smith said, and to me it seems like it collects the classes when the memory limit is hit. |
| 21:35 | danielcompton | amalloy: also, just saw that we need to go to 0.11.3 |
| 21:35 | danielcompton | 0.11.2 was released in feb https://github.com/flatland/useful/commit/bdd3634cce5f42ae2e3e8d0cba449a47a45c2cd7 |
| 21:35 | justin_smith | lodin: if you attach jvisualvm, there is a histogram of memory usage and gc events, you should see a nice chart of it |
| 21:35 | mthvedt | lodin: interesting, can i see a refheap? |
| 21:37 | danielcompton | amalloy: no idea why that commit doesn't show up in https://github.com/flatland/useful/commits/develop/project.clj |
| 21:38 | verma | what do people usually use here to open files super fast? something similar to ctrlp in vim? |
| 21:38 | danielcompton | verma: clojure.java.io is usually fast enough |
| 21:38 | dbasch | amalloy: there’s a lein target for deploying to clojars now, but you have to set up gpg first |
| 21:38 | amalloy | dbasch: yeah, i have that all set up at work |
| 21:38 | dbasch | I did that a couple of days ago |
| 21:39 | dbasch | it takes a minute |
| 21:39 | verma | danielcompton, oh sorry, should have mentioned, I am off-topicing a little bit, was interested in something like ctrlp+vim for emacs |
| 21:39 | amalloy | or i think i do, anyway. i'm even ssh'd into work, so you'd think it would work, but something weird happens to the gpg agent |
| 21:40 | verma | this looks like exactly what I need: https://github.com/d11wtq/fiplr |
| 21:41 | technomancy | I use https://github.com/technomancy/find-file-in-project/ |
| 21:41 | technomancy | but that's probably just because I wrote it |
| 21:42 | verma | :D |
| 21:42 | verma | technomancy, that's awesome! |
| 21:42 | verma | technomancy, you have a screenshot of what it looks like? is it fuzzy finder sort of? |
| 21:42 | technomancy | it is?? |
| 21:42 | lazybot | technomancy: Uh, no. Why would you even ask? |
| 21:42 | lodin | mthvedt: jvisualvm confirmed that the classes are GCed. No need to use ns-remove either. |
| 21:42 | mthvedt | lodin: and these are deftypes? |
| 21:43 | technomancy | verma: it looks the same as the one you linked to |
| 21:43 | lodin | mthvedt: Yes. I did eval of deftype in a doseq. |
| 21:43 | mthvedt | tonight i’ve gotten gc to work with ordinary stuff like evaling to get a closure, but not with deftypes |
| 21:43 | mthvedt | can i see? |
| 21:43 | verma | technomancy, oh |
| 21:44 | technomancy | verma: oh, mine requires GNU find FWIW |
| 21:44 | lodin | mthvedt: Yeah, maybe we're talking about different things. |
| 21:44 | technomancy | I should add a readme... I wrote this in 2007 or so |
| 21:45 | verma | I think I will use flipr, since it has a screenshot and a readme :P |
| 21:47 | technomancy | I'm heartbroken |
| 21:49 | technomancy | http://p.hagelb.org/10sad.gif |
| 21:49 | lodin | mthvedt: I do (doseq [_ (range 100000)] (eval (read-string "(deftype Foo [])"))) and once it hits about 40000 classes in my case (-Xmx100m and -XX:MaxPermSize=100m), it collects all but 3000-5000 of them. |
| 21:51 | scottj | fake! a) technomany no longer lives in rainy seattle, but sunny southern california. b) no facial hair |
| 21:53 | lodin | mthvedt: I apparently had a rather large permgen size when I first tested it. |
| 21:53 | technomancy | scottj: [artist's conception] |
| 21:54 | amalloy | wait, does technomancy really live in southern california now? |
| 21:54 | lodin | justin_smith: jvisualvm was brilliant for seeing this. Thanks. |
| 21:55 | technomancy | amalloy: san diego area |
| 21:55 | amalloy | why was this not on the evening news? |
| 21:56 | technomancy | I'm on the run from the law |
| 21:56 | arrdem | wait that would have _put_ it on the evening news... |
| 21:56 | mthvedt | lodin: which JVM are you using? this is not working for me. |
| 21:57 | mthvedt | and also which clojure? |
| 21:57 | Jaood | the NSA is after him, to much stallman koolaid |
| 22:00 | verma | man why does fiplr look different for me, its fuzzy search sucks as well :( .. I just see all matches concatenated and not listed like from top to bottom like in the screenshot |
| 22:00 | technomancy | verma: that's ido-vertical |
| 22:00 | hiredman | clojurebot: technomancy is on the run from the three laws of robotics |
| 22:00 | Jaood | technomancy: doesn't ido do fuzzy matching? |
| 22:00 | clojurebot | You don't have to tell me twice. |
| 22:01 | technomancy | Jaood: that's another setting too |
| 22:02 | technomancy | ido-flex-match iirc |
| 22:02 | technomancy | it's *simple* =) |
| 22:02 | scottj | imo best to look at flx and flx-ido |
| 22:02 | verma | technomancy, so I don't need fiplr at all? |
| 22:02 | scottj | if you want fuzzy matching on from the start. default is only to do fuzzy if there are no non-fuzzy matches |
| 22:02 | technomancy | verma: different libs/settings do different things. what do you want? |
| 22:03 | verma | Ctrl-T -> shows file listing from current directory -> I type in a few characters for the file I am interested -> finds and highlights most relevant result -> I hit enter -> opens the selected file |
| 22:04 | technomancy | find-file-in-project doesn't bias in favour of the current dir |
| 22:04 | verma | what does it favor? |
| 22:04 | technomancy | historical chocies |
| 22:05 | verma | oh? |
| 22:05 | technomancy | if you want something in the current dir, just use C-x C-f |
| 22:05 | mthvedt | lodin: try (doseq [_ (range 1000000)] (eval `(deftype ~(gensym "Foo") []))) , should cause an OOM. |
| 22:05 | verma | so it would remember sort of which projects I am working on etc.? |
| 22:05 | mthvedt | what i think is happing is clojure keeps references to each class name hanging around. so if you keep redefining Foo, this won’t cause an OOM. |
| 22:06 | lodin | mthvedt: clojure 1.6.0, and java 1.7.0_51 on 64-bit Win 8, and clojure 1.6.0 java 1.7.0_21 (openjdk) on 64-bit linux mint. |
| 22:06 | technomancy | verma: it won't look beyond the current project |
| 22:07 | technomancy | dunno what flipr does |
| 22:07 | brehaut | technomancy: isnt that a startup? |
| 22:07 | verma | I added a ton of folders to ignore (5 actually) and it seems to be finding stuff that I want |
| 22:07 | technomancy | brehaut: it's a good bet |
| 22:07 | lodin | mthvedt: That makes sense. It shouldn't be release, because you might want to use it. Right? |
| 22:07 | verma | earlier I would search for core.cljs and it would open something I don't care about under .repl/... |
| 22:07 | verma | so now .repl is in ignore list sort of |
| 22:08 | brehaut | technomancy: i guess flipr spends a lot of venture moeny with no actual business plan, and tries to get bought by facebook then |
| 22:08 | verma | brehaut, isn't that called enterpreneurship :P |
| 22:09 | mthvedt | lodin: right. but in a more complicated example where you remove the ns periodically, i still get OOM. my understanding of remove-ns is it’s supposed to remove those mappings. |
| 22:09 | verma | thanks for all the help technomancy |
| 22:09 | verma | (inc technomancy) |
| 22:09 | lazybot | ⇒ 143 |
| 22:09 | verma | oh jeez |
| 22:09 | verma | :D |
| 22:09 | verma | how do you see score without incing? |
| 22:09 | arrdem | (identity verma) |
| 22:09 | lazybot | verma has karma 0. |
| 22:09 | verma | oh what?? :( |
| 22:10 | arrdem | (identity amalloy) |
| 22:10 | lazybot | amalloy has karma 173. |
| 22:10 | Jaood | (dec verma) |
| 22:10 | lazybot | ⇒ -1 |
| 22:10 | verma | :( |
| 22:10 | arrdem | (dec Jaood) ;; MAD at work |
| 22:10 | lazybot | ⇒ 3 |
| 22:10 | verma | (inc verma) ; :P |
| 22:10 | lazybot | You can't adjust your own karma. |
| 22:10 | verma | :D |
| 22:10 | nullptr | (map identity [Jaood verma]) |
| 22:10 | Jaood | only 170 left to be amalloy |
| 22:11 | lodin | mthvedt: Yeah. I would've expected that as well. |
| 22:11 | verma | (identity verma) |
| 22:11 | lazybot | verma has karma -1. |
| 22:11 | verma | :D |
| 22:11 | verma | Its like I belong to the dark side |
| 22:11 | Jaood | (inc verma) |
| 22:11 | lazybot | ⇒ 0 |
| 22:11 | Jaood | (inc verma) |
| 22:11 | lazybot | ⇒ 1 |
| 22:11 | verma | like just started getting dark |
| 22:11 | Jaood | (inc verma) |
| 22:11 | lazybot | Do I smell abuse? Wait a while before modifying that person's karma again. |
| 22:11 | verma | :( |
| 22:11 | Jaood | (inc verma) |
| 22:11 | lazybot | Do I smell abuse? Wait a while before modifying that person's karma again. |
| 22:11 | mthvedt | (inc lazybot) |
| 22:11 | lazybot | ⇒ 31 |
| 22:11 | arrdem | lol @ ratelimit |
| 22:12 | verma | :) |
| 22:12 | amalloy | clojurebot: what does abuse smell like? |
| 22:12 | clojurebot | Titim gan éirí ort. |
| 22:12 | bar1 | (inc verma) |
| 22:12 | lazybot | ⇒ 2 |
| 22:12 | bar1 | (inc verma) |
| 22:12 | lazybot | ⇒ 3 |
| 22:12 | bar1 | (inc verma) |
| 22:12 | lazybot | ⇒ 4 |
| 22:12 | bar1 | (inc verma) |
| 22:12 | lazybot | Do I smell abuse? Wait a while before modifying that person's karma again. |
| 22:12 | bar2 | (inc verma) |
| 22:12 | lazybot | ⇒ 5 |
| 22:12 | bar2 | (inc verma) |
| 22:12 | lazybot | ⇒ 6 |
| 22:12 | bar2 | (inc verma) |
| 22:12 | lazybot | ⇒ 7 |
| 22:12 | verma | lol |
| 22:12 | lodin | mthvedt: As the paste above showed, the class survives the remove-ns. |
| 22:13 | mthvedt | lodin: yup |
| 22:14 | verma | argh, super annoying that my repl opens in a horizontal split |
| 22:14 | Jaood | verma: with cider? |
| 22:15 | verma | yeah |
| 22:15 | verma | Jaood, ^ |
| 22:17 | Jaood | verma: depending on your window size it chooses vertical vs horizontal split |
| 22:17 | verma | oh |
| 22:17 | verma | ncie |
| 22:17 | verma | nice |
| 22:18 | Jaood | but moving it its trivial anyway :) |
| 22:18 | verma | oh nice |
| 22:18 | verma | it did split nicely now :) |
| 22:19 | lodin | mthvedt: If you find some hack to get rid of (or even just hide) the class when the ns is removed, please let me know. :-) |
| 22:25 | arrdem | ambrosebs: the idea is that /store and friends will represent a .m2 equivalent structure that you can walk to see other artifacts/groups |
| 22:26 | arrdem | ambrosebs: UI needs work I guess... but the idea is that core.typed, tools.analyzer and the rest can sit in the same tree now with no changes |
| 22:27 | ambrosebs | arrdem: nice |
| 22:28 | arrdem | adding articles now so there's a structure for sharing long form commentary like destructuring and macro notes |
| 22:28 | arrdem | or even just linking to other resources in a sharable (across documentation) way |
| 23:21 | ghadishayban | reiddraper: I'm using test.check to verify transducers vs. lazy seqs right now... it's not supposed to be this fun! |
| 23:21 | arrdem | (inc reiddraper) |
| 23:21 | lazybot | ⇒ 3 |
| 23:21 | arrdem | oh that's just wrong |
| 23:22 | ghadishayban | I am trying to think of the minimal crappy functions to map and mapcat and take-while with |
| 23:22 | reiddraper | ghadishayban :), i'm sure we'll all be curious to see the results |
| 23:22 | ghadishayban | but I'm not doing a very good job yet |
| 23:22 | reiddraper | fun project to play with though |
| 23:23 | ghadishayban | I'm ending up with functions like (drop-while odd? (filter even? (range...))) |
| 23:23 | ghadishayban | which is blowing up the jvm |
| 23:24 | reiddraper | ah fun, hmmm |
| 23:25 | ghadishayban | how to balance having a good test of a chain of collection transformers that doesn't need the halting problem solved? |
| 23:25 | ghadishayban | vs. just getting it working but having it be a so-so test |
| 23:25 | ghadishayban | i'd pay a beer for the latter right now |
| 23:25 | reiddraper | indeed |
| 23:26 | reiddraper | it's often fruitful with property-based testing to start with a worse test, assure yourself the SUT is correct, and then improve the test |
| 23:26 | reiddraper | (correct w/r/t the current state of the test) |
| 23:28 | ghadishayban | Yeah I'm using the same generator for arguments to filter and remove |
| 23:28 | ghadishayban | which is broken if they're both in a chain of operations with the same args |
| 23:29 | ghadishayban | for a minimal SUT I'll just vary the operations themselves, but not the arguments to them |
| 23:33 | reiddraper | seems like a great start |
| 23:51 | ghadishayban | both bugs christophe grand found today were related to r#'educed handling |
| 23:52 | ghadishayban | #'reduced |
| 23:52 | ghadishayban | to check collections, you'd want to exercise that well. |