2015-07-22
| 01:29 | crocket | How do I debug java code in cider? |
| 01:29 | crocket | Cider can debug clojure code. |
| 01:31 | justin_smith | crocket: you can run jdb with emacs GUD mode https://www.gnu.org/software/emacs/manual/html_node/emacs/Debuggers.html |
| 01:32 | justin_smith | someone should hook up clojure debugging to GUD too |
| 01:39 | crocket | justin_smith, Does that integrate clojure and java debugging into one session? |
| 03:01 | crocket | Is there a shortcut for if-not? |
| 03:22 | crocket | Oh, it is if-not. |
| 03:43 | crocket | How do I resolve a symbol concisely? |
| 03:44 | tgoossens | crocket, (eval symbol) |
| 03:45 | tgoossens | ,(let [a 2 s 'a] (eval s)) |
| 03:45 | clojurebot | #error {\n :cause "Unable to resolve symbol: a in this context"\n :via\n [{:type clojure.lang.Compiler$CompilerException\n :message "java.lang.RuntimeException: Unable to resolve symbol: a in this context, compiling:(NO_SOURCE_PATH:0:0)"\n :at [clojure.lang.Compiler analyze "Compiler.java" 6543]}\n {:type java.lang.RuntimeException\n :message "Unable to resolve symbol: a in this context"\n ... |
| 03:45 | tgoossens | merde |
| 03:46 | dstockton | ,(let [a 2 s 'a] s) |
| 03:46 | clojurebot | a |
| 03:46 | dstockton | ,(let [a 2 s 'a] (resolve s)) |
| 03:46 | clojurebot | nil |
| 03:47 | dstockton | ,(let [a 2 s 'a] ~s) |
| 03:47 | clojurebot | #error {\n :cause "Attempting to call unbound fn: #'clojure.core/unquote"\n :via\n [{:type java.lang.IllegalStateException\n :message "Attempting to call unbound fn: #'clojure.core/unquote"\n :at [clojure.lang.Var$Unbound throwArity "Var.java" 43]}]\n :trace\n [[clojure.lang.Var$Unbound throwArity "Var.java" 43]\n [clojure.lang.AFn invoke "AFn.java" 32]\n [sandbox$eval97 invoke "NO_SOURCE_FI... |
| 03:47 | amalloy | you can't do that. eval has no access to lexical scope |
| 03:51 | dstockton | ,(let [a 2 s 'a] (prn s)) |
| 03:51 | clojurebot | a\n |
| 03:52 | dstockton | ,(binding [a 2 s 'a] (eval s)) |
| 03:52 | clojurebot | #error {\n :cause "Unable to resolve var: a in this context"\n :via\n [{:type clojure.lang.Compiler$CompilerException\n :message "java.lang.RuntimeException: Unable to resolve var: a in this context, compiling:(NO_SOURCE_PATH:0:0)"\n :at [clojure.lang.Compiler analyzeSeq "Compiler.java" 6740]}\n {:type java.lang.RuntimeException\n :message "Unable to resolve var: a in this context"\n :at ... |
| 03:53 | crocket | tgoossens, What about (resolv symbol? |
| 03:54 | crocket | eval somehow feels awkward. |
| 03:56 | crocket | How do I evaluate a symbol to a local binding concisely? |
| 03:56 | crocket | eval fails. |
| 03:58 | crocket | (let [abc 3] (eval 'abc)) fails |
| 03:58 | crocket | ,(let [abc 3] (eval 'abc)) |
| 03:58 | clojurebot | #error {\n :cause "Unable to resolve symbol: abc in this context"\n :via\n [{:type clojure.lang.Compiler$CompilerException\n :message "java.lang.RuntimeException: Unable to resolve symbol: abc in this context, compiling:(NO_SOURCE_PATH:0:0)"\n :at [clojure.lang.Compiler analyze "Compiler.java" 6543]}\n {:type java.lang.RuntimeException\n :message "Unable to resolve symbol: abc in this conte... |
| 03:59 | crocket | How do I fix (let [abc 3] (eval 'abc)) ? |
| 04:00 | irctc_ | Will there be a ClojureScript runtime on V8 anytime this year? |
| 04:00 | crocket | http://clojure.org/evaluation |
| 04:01 | crocket | irctc_, What is the current ClojureScript runtime? |
| 04:01 | crocket | Nashorn? |
| 04:05 | irctc_ | It runs thru Closure and then after that it becomes javascript |
| 04:07 | irctc_ | ClojureScript is just a pre-compilation artifact that never gets to run anywhere |
| 04:10 | crocket | Why does https://www.refheap.com/106807 fail? |
| 04:10 | crocket | (format-policy 'rolling-policy) in https://www.refheap.com/106807 seems to fail. |
| 04:11 | irctc_ | Nashorn is German for Rhino (literally horn nose). I wish ClojureScript ran on Nashorn/v8/etc but as far as i know it's trapped on the JVM |
| 04:11 | crocket | Nashorn is on JVM. |
| 04:13 | irctc_ | Nashorn is on JVM but there is no JavaScript based runtime for clojure (only a java based one as far as i know) |
| 04:13 | crocket | Anyway.. |
| 04:13 | crocket | How do I make a symbol evaluate to a local binding? |
| 04:14 | crocket | In a function, I want to retrieve the symbol and the value of an argument. |
| 04:25 | irctc_ | i guess for the beginner it doesn't solve programmer hell, it just creates more, anyway all the best, bye |
| 04:26 | crocket | I may need a macro for that.... |
| 04:26 | crocket | irctc_, The programmer hell is mostly scarcity in the real world and artificial scarcity in corporate environments. |
| 04:31 | irctc_ | so to answer to crocket's question is there an arguments collection with names+values for a function? |
| 04:33 | crocket | If you have years of time to learn a platform, it is not hell. |
| 04:35 | irctc_ | yup, i guess one has to choose one's hell wisely, since there's enough frustration there to fill MILLIONS of programmers lifetimes, less hot is still burining |
| 04:36 | irctc_ | fundamentally i'd reject the fact that it does take years to learn a platform, and that is still the case |
| 04:57 | kwladyka | i have function (defn f [[cols rows] [col row]] ... ) and i need lazy sequence from that function in recursive way. So f to count next iteration call themself. Which function should i need to create this lazy seq? |
| 04:59 | kwladyka | and perfect way will be to start from not zero, for example (f [8 8] [3 5]) and next iteration will be (f [8 8] [3 6]), so not start from (f [8 8] [1 1]) |
| 05:00 | kwladyka | or there is no way to do that and i have to use "n" parameter for lazy-seq ? |
| 05:01 | kwladyka | oh... maybe it is iterate... |
| 05:02 | kwladyka | but how to pass there [cols rows] in way to not be return as a result |
| 05:02 | kwladyka | i can use ref-set but it will be good if i dont have to |
| 05:11 | crocket | Is there a debugger that can debug clojure and java code simultaneously? |
| 05:32 | r4vi | intellij + cursive |
| 05:42 | lambda-smith | Can CIDER does that? |
| 05:56 | crocket | lambda-smith, cider can debug clojure code. |
| 05:56 | crocket | I don't know if cider can debug java code. |
| 05:56 | lambda-smith | I see, thanks. |
| 06:38 | kwladyka | http://clojuredocs.org/clojure.core/recur show example of use recur for denf compute-across without loop, but for my example https://www.refheap.com/d6b0e12cc47d57b0b3b300bc6 i have error CompilerException java.lang.IllegalArgumentException: Mismatched argument count to recur, expected: 0 args, got: 2, |
| 06:38 | kwladyka | What am i doing wrong? |
| 06:42 | sveri | Hi, I am trying to use re-matches like this: (re-matcher #"id=\"([a-zA-Z]*)\"" "<input class=\"form-control\" id=\"male\" name=\"male\" type=\"checkbox\" />"). I checked that this regex works with an online regex tester and extracts the id part, however in clojure I just get nil returned. What am I doing wrong here? |
| 06:43 | fi3aiXoa | kwladyka: recur is for tail recursion |
| 06:44 | kwladyka | fi3aiXoa, so it doesn't work because it is nested? |
| 06:45 | fi3aiXoa | kwladyka: yes. You can use it only in tail call. Please refer to http://clojure.org/special_forms |
| 06:45 | fi3aiXoa | kwladyka: error message could be better though |
| 06:45 | crocket | How do I make multimethods dispatch according to java classes? |
| 06:46 | fi3aiXoa | crocket: just use `class` or `type` as a dispatch function |
| 06:46 | kwladyka | fi3aiXoa, thx |
| 06:46 | Bronsa | crocket: or consider using a protocol instead |
| 06:46 | crocket | Does a protocol not require defrecord? |
| 06:47 | fi3aiXoa | Protocols is one thing, records is another. |
| 06:47 | crocket | hmm...... |
| 06:47 | crocket | ah |
| 06:47 | fi3aiXoa | (should it be "are one thing"?) |
| 06:47 | crocket | ok |
| 06:47 | kwladyka | crocket, http://blog.find-method.de/index.php?/archives/209-Dependency-inversion-in-Clojure.html <- read it, it is very good |
| 06:48 | fi3aiXoa | sveri: I'm not sure... Do you have a typo? Is it re-matches or re-matcher? |
| 06:48 | Bronsa | crocket: you can extend a protocol to java classes |
| 06:49 | Bronsa | just like you defmethod on a dispatch value |
| 06:49 | Bronsa | and protocol functions will dispatch much faster than multimethods using `type` or `class` as dispatch function |
| 06:50 | sveri | fi3aiXoa: both don't work |
| 06:51 | sveri | I am afraid it interfers with the escaping of the string: \" in the online test tool I don't have them escaped |
| 06:51 | fi3aiXoa | sveri: well, re-matches returns non-nil if the *entire* string matches the regexp. It's clearly not the case. Please read the documentation to re-matches and re-find. Also, it's a terrible idea to use regexps on html code. |
| 06:51 | crocket | Bronsa, Does a protocol function not dispatch based on the first argument? |
| 06:53 | kwladyka | sveri, did you try without \ ? maybe it is a problem like in #"..." it is interpret in another way |
| 06:54 | kwladyka | sveri, but it doesn't make sense... but maybe worth to try with something simpler |
| 06:54 | fi3aiXoa | sveri: oh, and I actually meant http://clojuredocs.org/clojure.core/re-matches when I said "documentation". It has some examples which should make things clearer. |
| 06:54 | crocket | Does a protocol function deal with default? |
| 06:55 | fi3aiXoa | You can extend protocol to Object. |
| 06:59 | kwladyka | sveri, oh i see ;; The distinction is that re-find tries to find _any part_ of the string |
| 06:59 | kwladyka | ;; that matches the pattern, but re-matches only matches if the _entire_ |
| 06:59 | kwladyka | ;; string matches the pattern. |
| 07:20 | tgoossens | Any tips on how to debug the following case: When I execute (... code ...) it works, but when it is in a defn: (defn test [a b] (... code ...) ) it doesn't work anymore. Some class (of my own making) gives an exception |
| 07:21 | tgoossens | are there good debugging tools you would recommend? |
| 07:24 | crocket | Boo |
| 07:24 | crocket | tgoossens, cider and cursive |
| 07:24 | crocket | cursive is more advanced while cider runs on a lightweight environment. |
| 07:24 | crocket | cursive runs on IntelliJ which is very heavy. |
| 07:25 | tgoossens | i use emacs |
| 07:26 | kwladyka | is function like "for" but will stop if nil? Only "loop"? |
| 07:30 | tgoossens | crocket, ty |
| 07:31 | snowell | kwladyka: Try the :while modifyer for for |
| 07:31 | snowell | *modifier |
| 07:31 | kwladyka | snowell, ahh... so obviously! thx |
| 07:32 | snowell | ,(for [x [1 2 3 nil 4 5] :when x] x) |
| 07:32 | clojurebot | (1 2 3 4 5) |
| 07:32 | snowell | Derp |
| 07:32 | snowell | ,(for [x [1 2 3 nil 4 5] :while x] x) |
| 07:32 | clojurebot | (1 2 3) |
| 07:36 | crocket | ok |
| 07:49 | Kneiva | (inc snowell) |
| 07:49 | lazybot | ⇒ 1 |
| 07:53 | sveri | kwladyka: thank you, re-find does the trick |
| 07:53 | sveri | not sure how I missed this |
| 08:09 | tgoossens | crocket, cider is really great. thanks a lot!! |
| 08:15 | crocket | tgoossens, Did you already succeed in starting a cider debugging session? |
| 08:15 | crocket | How did you do it? |
| 08:16 | wasamasa | it's funny to see emacs described as "lightweight environment" |
| 08:16 | wasamasa | how did people edit code in the eighties? |
| 08:16 | snowell | I've always heard that emacs is a fantastic OS, all it needs is a good text editor :) |
| 08:17 | wasamasa | I bet this joke is older than you |
| 08:17 | snowell | It's possible |
| 08:18 | H4ns | when emacs was said to be an acronym for "eight megabytes and constantly swapping", eight megabytes were considered to be a massive amount of memory |
| 08:19 | hellofunk | H4ns: i thought "emacs" stood for "emacs makes all code super" ? |
| 08:20 | snowell | Esc-Meta-Atl-Ctrl-Shift |
| 08:26 | crocket | It's simple. Moore's law made emacs lightweight. |
| 08:26 | crocket | After 20 years, eclipse could be considered lightweight. |
| 08:26 | crocket | Probably in 10 |
| 08:28 | Firedancer | That's pretty optimistic |
| 08:32 | crocket | Moore's law is optimistic. |
| 08:34 | crocket | Does a protocol always dispatch according to the first argument? |
| 08:35 | sobel | I have some confidence Eclipse will always grow (and/or suck) to consume all benefits of Moore's law |
| 08:37 | sobel | ...on return to java coding, i comment all the side-effecting or data-mutating functions, and it's eye-opening. |
| 08:38 | sobel | "how *could* you?" |
| 08:38 | wasamasa | moore's law no longer applies to increasing CPU clocks |
| 08:38 | H4ns | wasamasa: it never did. |
| 08:38 | wasamasa | and considering how tricky utilizing more than one core is, I don't have any hope for eclipse |
| 08:39 | sobel | performance has always been an aggregate figure of i/o and cpu compute speed |
| 08:39 | sobel | but i think we've been i/o bound a while |
| 08:42 | Bronsa | crocket: yes |
| 08:42 | crocket | Bronsa, yes? |
| 08:42 | Bronsa | 14:34:50 <crocket> Does a protocol always dispatch according to the first argument? |
| 08:42 | Bronsa | yes |
| 08:44 | H4ns | it is, but it is using the jvm's dispatch mechanism, not the one implemented by defmulti/defmethod. |
| 10:47 | timvisher | anyone familiar with how to launch a headless browser using clj-webdriver? |
| 11:13 | J_Arcane | https://twitter.com/J_Arcane/status/623873442123808768 |
| 11:15 | justin_smith | this bot is the best use of autocomplete API ever https://twitter.com/autocompletejok |
| 11:30 | crocket | Nice.... |
| 11:30 | crocket | I finally fixed unilog... |
| 11:34 | iwillig | whats the best way to strip a namespace off a keyword… I was thinking about doing this (keyword (name :user/name)) but that seems kind of hacky |
| 11:34 | justin_smith | ,(name :key/word) |
| 11:34 | clojurebot | "word" |
| 11:35 | justin_smith | iwillig: I think that's the trick - what's the usecase for un-namespacing anyway? |
| 11:35 | gfredericks` | I have this emacs package called align-cljlet and I kind of like it but I don't think it's available in the emacs package managers |
| 11:36 | gfredericks` | does anybody use something similar or...something? |
| 11:36 | iwillig | i want to filter out all user/create-at and task/created-at attributes in a datomic attribute list and i did not want to enumerate all of the possible namespaces |
| 11:36 | iwillig | but that works.. thanks justin_smith |
| 11:37 | justin_smith | iwillig: in that case, you don't even need the keyword call right? |
| 11:37 | iwillig | yeah.. we can just leave them a strings and compare the strings… |
| 12:01 | timvisher | is core.memoize thread local? |
| 12:52 | monsta | Good evening, could some explain me the value of immutability? |
| 12:54 | kwladyka | (f? {[1 1] [2 1] [2 3]} [[2 1] [3 3]]) - i am look (f a b) which return me false if any of b element is in a. Otherwise true. I am too tired today, but i am so close the final solution :) |
| 12:55 | kwladyka | monsta, in other langauge you can write function (x){x=3;print x} and get result 3. With immutable data you can't change value of x. |
| 12:56 | kwladyka | monsta, and when you creating new data from old data there are not redundant. It is tree with indicators to right places in memory. |
| 12:56 | kwladyka | something like tree |
| 12:57 | kwladyka | watch "Clojure inside out" |
| 12:58 | snowell | kwladyka: Are the args maps? |
| 12:59 | kwladyka | snowell, sorry my mistake, it is not map |
| 13:00 | kwladyka | ha i got it (some? (some #{[1 1] [2 1] [2 3]} [[2 1] [3 3]])) |
| 13:00 | snowell | Hahaha my answer was going to be much dirtier than that |
| 13:00 | snowell | Glad you won't be using it :D |
| 13:01 | kwladyka | ;) |
| 13:01 | kwladyka | day by day i am learning more and more ) |
| 13:03 | snowell | It looks like it returns true when there's a match |
| 13:03 | snowell | Didn't you want the other way around? |
| 13:04 | snowell | In that case you'd want nil? instead of some? |
| 13:04 | kwladyka | snowell, this is just detail :) |
| 13:05 | snowell | Incorrect boolean values are probably fine |
| 13:05 | kwladyka | snowell, but you are right |
| 13:10 | monsta | nani nani |
| 13:10 | monsta | =? |
| 13:13 | monsta | If there is a place where I can play with Clojure repl online? |
| 13:15 | xemdetia | monsta, if it is not something super complex you can always irc message clojurebot |
| 13:16 | snowell | monsta: There's also tryclj.com |
| 13:16 | rarebreed | and for clojurescript there's https://himera.herokuapp.com/index.html |
| 13:19 | iamjarvo | so i am using http-kit and trying to figure out how to see logs for requests |
| 13:35 | kwladyka | (f boolean value) - is any function which return value if true or empty list if false? |
| 13:36 | scriptor | ,(or true []) |
| 13:36 | clojurebot | true |
| 13:36 | scriptor | ,(or false []) |
| 13:36 | clojurebot | [] |
| 13:37 | scriptor | hmm, not quite what you need, since the value is separate |
| 13:38 | kwladyka | scriptor, since the value is separate? |
| 13:38 | scriptor | separate from the boolean |
| 13:39 | kwladyka | ,(or false {[1 2] :king [2 3] :queen}) |
| 13:39 | clojurebot | {[1 2] :king, [2 3] :queen} |
| 13:39 | kwladyka | looks good |
| 13:39 | clojurebot | Excuse me? |
| 13:39 | justin_smith | scriptor: #(or % ()) |
| 13:40 | kwladyka | it is still ok, i needed (f boolean value) so the f is or |
| 13:40 | justin_smith | kwladyka: or is not an f, but OK |
| 13:40 | kwladyka | justin_smith, ? |
| 13:40 | justin_smith | kwladyka: ##(map or [1 2 3]) |
| 13:40 | lazybot | java.lang.RuntimeException: Can't take value of a macro: #'clojure.core/or |
| 13:41 | justin_smith | or is not a function |
| 13:41 | justin_smith | the request was a function |
| 13:41 | kwladyka | oh... i thought everything in Clojure is function, even or |
| 13:41 | kwladyka | but it should be ok |
| 13:41 | kwladyka | i will se |
| 13:41 | kwladyka | see |
| 13:42 | kwladyka | ah not... it is not what i want |
| 13:42 | kwladyka | (f boolean value) - is any function which return value if true or empty list if false? |
| 13:42 | kwladyka | ^it is not this condition |
| 13:43 | justin_smith | oh, sorry |
| 13:43 | justin_smith | #(if % %2 ()) |
| 13:43 | justin_smith | that should work |
| 13:43 | kwladyka | oh it is ok about readable |
| 13:44 | kwladyka | but no function in clojure core like that? |
| 13:44 | kwladyka | or something where i don't have to use #()? |
| 13:44 | justin_smith | (defn or-empty [condition value] (if condition value ())) |
| 13:44 | justin_smith | you can always replace #() with a proper function |
| 13:44 | kwladyka | i know, but i am trying to optimise my code |
| 13:45 | kwladyka | and many times i discover there is something in http://clojure.org/cheatsheet |
| 13:45 | justin_smith | #() is not more optimized than defn |
| 13:45 | justin_smith | no, there is nothing that does that in clojure.core |
| 13:45 | kwladyka | ok thx |
| 13:45 | scriptor | don't worry about the function call overhead |
| 13:46 | scriptor | it'll be miniscule compared to everything else, and the jvm already inlines a bunch of stuff |
| 13:46 | justin_smith | scriptor: but the version of some function in clojure.core will be more optimized than one's first try, typically |
| 13:46 | justin_smith | if that funciton exists |
| 13:46 | scriptor | true |
| 13:46 | justin_smith | so kwladyka wanted to make sure there was no built in function that did that |
| 14:04 | monsta | snowell: Thank you! |
| 14:19 | sdegutis | Does anyone else among you notice as well that using partial when possible seems inherently cleaner than short-form ad-hoc functions? |
| 14:20 | sdegutis | Very well. |
| 14:22 | kwladyka | How can i increase memory for lein test? |
| 14:22 | kwladyka | maybe also CPU |
| 14:23 | wink | kwladyka: https://github.com/technomancy/leiningen/blob/master/bin/lein#L141 |
| 14:23 | wink | i.e. you can probably add some Xms and Xmx there |
| 14:23 | wink | err, sorry. https://github.com/technomancy/leiningen/blob/master/bin/lein#L223 |
| 14:23 | wink | I think it's this one |
| 14:24 | kwladyka | wink, is it possible to set this on "get as much as you want"? |
| 14:24 | wink | no clue, sorry. Not that big of a JVM expert :) |
| 14:24 | wink | but if it's possible it should be a default JVM option |
| 14:24 | rhg135 | kwladyka: not as far as I know |
| 14:28 | sobel | i could use a little support figuring out something that's probably simple... i want to write to an output stream using data/csv but what i _really_ need is an inputstream from the csv conversion that i can feed to java that wants to do the reading |
| 14:28 | sobel | (and writing) |
| 14:29 | sobel | shoulda written this as a transducer, but...too late for today |
| 14:31 | kwladyka | can i check is it work in some way in clojure? show me max memory by println? |
| 14:36 | kwladyka | because i see it works in REPL, but it looks like doesn't work with lein test |
| 14:38 | sdegutis | I will await more answers. |
| 14:42 | kwladyka | what to do if my algorithm is too slow, how to measure that and check lazy seq, what to do with that |
| 14:42 | kwladyka | it takes gb and give me out of memory |
| 14:42 | kwladyka | *4gb |
| 14:42 | kwladyka | something is wrong |
| 14:47 | justin_smith | sounds like you need to do some profiling |
| 14:48 | kwladyka | justin_smith, ? |
| 14:49 | justin_smith | kwladyka: there are profiling tools, like the tools.trace library, or criterion for microbenchmarking, or jvm based tools like jvisualvm or yourkit |
| 14:52 | kwladyka | oh it looks like a tons of work |
| 14:54 | kwladyka | hmm how to check if something is lazy? like (lazy? f) |
| 14:55 | gfredericks | oh man |
| 14:56 | gfredericks | I think cljs stops inlining arithmetic if you use qualified symbols |
| 14:56 | kwladyka | ? |
| 14:56 | kwladyka | gfredericks, ? |
| 14:56 | gfredericks | kwladyka: unrelated |
| 14:57 | kwladyka | oh ok |
| 14:57 | justin_smith | ,(type (map identity nil)) ; kwladyka |
| 14:57 | clojurebot | clojure.lang.LazySeq |
| 14:57 | kwladyka | justin_smith, thx |
| 14:57 | justin_smith | I guess you might see other types that are technically lazy like chunkedseqs... |
| 14:58 | justin_smith | ,(type (iterate inc 0)) |
| 14:58 | clojurebot | clojure.lang.Iterate |
| 14:58 | justin_smith | oh yeah, you can't just test for LazySeq never mind |
| 14:59 | sdegutis | Thank you for your answers. |
| 15:00 | kwladyka | justin_smith, can i debug app after run something in REPL in intellij and check what consume so many memory and why? |
| 15:00 | kwladyka | if yes maybe do you know good video/article how to do that? |
| 15:01 | justin_smith | kwladyka: you can use jvisualvm while your repl is running |
| 15:01 | justin_smith | and see what is using the heap, usually |
| 15:01 | justin_smith | and what is using cpu, etc. |
| 15:01 | justin_smith | kwladyka: https://visualvm.java.net/profiler.html |
| 15:02 | justin_smith | kwladyka: when you start jvisualvm, you'll see a list of running java processes, you can double click your clojure app to open it, then find the tools mentioned in that article to see what your app is doing |
| 15:02 | kwladyka | justin_smith, thank you! |
| 15:02 | justin_smith | s/app/repl (though it works with apps too) |
| 15:02 | justin_smith | kwladyka: jvisualvm comes with the jdk |
| 15:03 | justin_smith | kwladyka: I hear yourkit is much better, but it is a bit more complicated to get ahold of I think |
| 15:11 | kwladyka | what do you think about hava mission control? |
| 15:12 | kwladyka | *java mission control |
| 15:13 | kwladyka | eh i dont have idea how to check what consume so much memory with this... i will try what you told |
| 15:14 | justin_smith | kwladyka: java mission control does part of what visualvm does (I think like literally the entire app is basically embedded into it) |
| 15:30 | kwladyka | i run https://www.refheap.com/1a2497a2260906e30eb26575a and (type all-possible-notations ...) is clojure.lang.LazySeq |
| 15:31 | kwladyka | How can i optimise this? |
| 15:31 | kwladyka | i see how memory consumption rising and rising |
| 15:34 | kwladyka | maybe i should use (nth ...) instead of loop? |
| 15:35 | amalloy | kwladyka: are you trying to enumerate all possible positions on a chessboard? |
| 15:36 | kwladyka | amalloy, this is not a problem it is fast, i also assign all permutation for pieces to this possitions |
| 15:36 | hellofunk | amalloy: is that even physically possible? |
| 15:36 | kwladyka | and it takes much more time |
| 15:36 | agarman | 51! possible positions AFAIK |
| 15:36 | agarman | that's a lot of memory |
| 15:36 | amalloy | there's nothing inefficient in that code, although you are just longhand-implementing a version of filter |
| 15:36 | hellofunk | oh i'm confusing positions with moves |
| 15:36 | kwladyka | it works fast for small amount of pieces |
| 15:37 | amalloy | yeah, of course it does |
| 15:37 | kwladyka | but i guess it is because it is trying to read all this seq at once |
| 15:37 | kwladyka | or something like that |
| 15:37 | amalloy | and for large numbers of pieces you will need like more seconds than there are atoms in the universe, or whatever |
| 15:37 | kwladyka | maybe because of loop |
| 15:37 | kwladyka | i dont know |
| 15:37 | agarman | 51! is games...positions fewer |
| 15:38 | kwladyka | amalloy, anyway i need to do this, i can only optimise a little number of this, but not too much |
| 15:38 | amalloy | agarman: wikipedia claims it's around 10^43 |
| 15:38 | amalloy | kwladyka: you can't optimize brute-forcing the game of chess |
| 15:38 | kwladyka | or it is some super extreme good algorithm for chess which i dont know |
| 15:39 | kwladyka | amalloy, i can a little |
| 15:39 | kwladyka | amalloy, for pieces like rook or queen |
| 15:39 | kwladyka | rook takes whole row and whole column |
| 15:40 | kwladyka | anyway i have something wrong and i dont know it is problem with my code or algorithm |
| 15:40 | kwladyka | but i guess it is problem with loading whole seq at once from lazyseq |
| 15:40 | kwladyka | but i am not sure what to do with that |
| 15:49 | kwladyka | mmm maybe i will try with nth, i see it is a problem with loop recur and lazy seq |
| 15:49 | kwladyka | they lose they power then |
| 15:49 | kwladyka | because they incrementally rising instead of iteration |
| 16:25 | kwladyka | is it possible when use (for ...) to jump to next iteration without returning value? only with :when? |
| 16:29 | justin_smith | kwladyka: it's because of the size of the problem. But amalloy is right, your code is just re-implementing filter. You can just use (filter (partial notation-pass? board-size) (all-possible-notations board-size pieces)) to get a lazy-seq of solutions |
| 16:30 | justin_smith | and then use (into #{} ...) if you really want to force it to not be lazy, and to put them all in a set. |
| 16:30 | kwladyka | justin_smith, i am doing this now with for and it looks very promising |
| 16:30 | kwladyka | no, i want it to be lazy |
| 16:31 | justin_smith | OK, but the filter version is simpler - yeah, don't put the result in a set. |
| 16:31 | kwladyka | how can i prevent REPL to print what function return? |
| 16:32 | kwladyka | just like (not-print f) |
| 16:32 | kwladyka | i guess something exist |
| 16:32 | justin_smith | that's where the memory usage was ending up - in the set. If the consumer of count-solutions doesn't need to hold all the results at once, and can go through them one at a time, that will help your memory usage |
| 16:32 | justin_smith | kwladyka: (do (f) nil) |
| 16:32 | justin_smith | that's how I do it at least |
| 16:32 | kwladyka | justin_smith, thx |
| 16:33 | justin_smith | or (def result (f)) then access whatever part of result I want (but not the whole thing) |
| 16:33 | kwladyka | justin_smith, need to, but passed results are in small number |
| 16:34 | slester | Anyone have experience with "ExceptionInfo No such namespace: cljsjs.react, could not locate cljsjs/react.cljs at line 1" kinds of errors in the REPL? Using weasel and om. |
| 16:34 | martinklepsch | slester: are you using most recent version of weasel? |
| 16:35 | martinklepsch | slester: this has been a problem at some point when repl stuff changed but should be fixed in the most recent release |
| 16:35 | martinklepsch | slester: also just FYI there is a #clojurescript channel on Freenode as well :) |
| 16:35 | slester | martinklepsch: whoops, sorry about that! |
| 16:36 | martinklepsch | slester: fine w/ me, just letting you know :) |
| 16:37 | numberten | any reason test.check doesn't have float generators? |
| 16:42 | hiredman | I dunno, but a suspect a summary of the reasons would be something like "ugh, floating point" |
| 16:43 | numberten | haha fair enough |
| 16:51 | numberten | (gen/fmap float gen/ratio) I think is probably a good alternative |
| 17:04 | dagda1 | why does this not print each number on a new line (apply println [0 1 2 3]) |
| 17:04 | kwladyka | ,(println 0 1 2) |
| 17:04 | clojurebot | 0 1 2\n |
| 17:04 | kwladyka | as you can see it still print in one line because prinln works in that way |
| 17:05 | dagda1 | kwladyka how do I print each number on a new line |
| 17:05 | justin_smith | ,(doseq [i [0 1 2 3]] (prinln i)) |
| 17:05 | clojurebot | #error {\n :cause "Unable to resolve symbol: prinln in this context"\n :via\n [{:type clojure.lang.Compiler$CompilerException\n :message "java.lang.RuntimeException: Unable to resolve symbol: prinln in this context, compiling:(NO_SOURCE_PATH:0:0)"\n :at [clojure.lang.Compiler analyze "Compiler.java" 6543]}\n {:type java.lang.RuntimeException\n :message "Unable to resolve symbol: prinln in t... |
| 17:05 | justin_smith | err |
| 17:05 | justin_smith | ,(doseq [i [0 1 2 3]] (println i)) |
| 17:05 | clojurebot | 0\n1\n2\n3\n |
| 17:06 | justin_smith | or ##(run! println [0 1 2 3]) ;; 1.7+ |
| 17:06 | lazybot | ⇒ 0 1 2 3 nil |
| 17:06 | justin_smith | wait |
| 17:06 | justin_smith | ,(run! println [0 1 2 3]) |
| 17:06 | clojurebot | 0\n1\n2\n3\n |
| 17:07 | justin_smith | oh, that's just lazybot being silly, OK |
| 17:11 | gfredericks | dnolen: so the new RNG slows down the test suite by 30%-70%, and I'm running out of ideas for optimizing it (I've now started pondering more JS-oriented algorithms); are you interested in taking a look? |
| 17:14 | kwladyka | https://www.refheap.com/e36238616dcd57a13ac301d47 what am i doing wrong here? Why it is so slow... ?! |
| 17:14 | kwladyka | how to improve it? |
| 17:16 | justin_smith | kwladyka: if you take off the (into #{} ...) part at the end it will be lazy |
| 17:16 | kwladyka | justin_smith, i am showing the end on screen |
| 17:16 | justin_smith | the into #{} forces it to be strict, so count-solutions can't return until every possible solution is stored in the set |
| 17:16 | kwladyka | justin_smith, and the end has a really small number of sets |
| 17:17 | justin_smith | if you take that into call out, it can start printing the result immediately |
| 17:17 | kwladyka | mmm i will try without that, but still the number of solutions to print is 92 |
| 17:17 | kwladyka | it is small number |
| 17:18 | kwladyka | the main problem is other place |
| 17:18 | kwladyka | but i dont know where |
| 17:18 | kwladyka | without into #{} it is still slow |
| 17:18 | kwladyka | as before |
| 17:20 | dnolen | gfredericks: I'm very skeptical that it's RNG, have you looked at profiler yet? |
| 17:21 | gfredericks | dnolen: oh like in a browser? I'd been running on node; I'll try the browser version |
| 17:23 | dnolen | gfredericks: I only really recommend profiling in Chrome, for profiling use these settings |
| 17:23 | dnolen | :optimizations :simple, :static-fns true, :pretty-print true |
| 17:23 | gfredericks | dnolen: okay cool, thanks |
| 17:24 | dnolen | gfredericks: make sure in Chrome you click the little gear in the dev console and click Hi-resolution Profiling |
| 17:24 | dnolen | this will give you sub-millisecond sampling |
| 17:25 | gfredericks | oh cool, got it |
| 17:25 | kwladyka | justin_smith, the main problem all-possible-notations takes too much time... maybe i have just rubbish algorithm and that the problem |
| 17:25 | kwladyka | maybe have to do in another way |
| 17:25 | gfredericks | glad I asked |
| 17:26 | justin_smith | kwladyka: you are dealing with a combinatorial explosion, I guess you could hyper-optimize with low level tricks, but it's inherently slow to get all the permutations of a group that large |
| 17:27 | kwladyka | justin_smith, low level tricks? |
| 17:28 | dnolen | gfredericks: you may want to pick a illustrative run, anything that runs longer than 10 seconds unless you have a desktop machine is likely to make profiling very painfully slow. |
| 17:28 | justin_smith | using an iterator instead of a lazy-seq, using mutation on a single data structure instead of using persistent data structures and lettign them get garbage collected |
| 17:28 | gfredericks | dnolen: what does "pick an illustrative run" mean? |
| 17:28 | justin_smith | kwladyka: it won't be especially fun or pretty, and can only speed things up so much... |
| 17:28 | dnolen | gfredericks: like don't run all the tests |
| 17:29 | gfredericks | okay just a single test for longer than normal? |
| 17:29 | justin_smith | kwladyka: and at that point you've lost most of the benefit of using clojure in the first place |
| 17:29 | dnolen | gfredericks: something like that, I don't know anything about RNG changes so I can't tell you what to try :) |
| 17:29 | kwladyka | justin_smith, oh so Clojure just works slower in cases like this? |
| 17:30 | gfredericks | dnolen: roger |
| 17:30 | justin_smith | kwladyka: it isn't the fastest language - it is up to you whether you want to do 10x more work, risk bigger errors in the code, and do the whole thing in java or C |
| 17:30 | justin_smith | *at least 10x more work, for ~10x speed improvement |
| 17:31 | kwladyka | how it looks vs scala? |
| 17:31 | justin_smith | scala isn't going to be much faster I don't think |
| 17:31 | justin_smith | but I don't know a lot about scala, better to find someone who uses both and ask for their comparison |
| 17:33 | seangrove | Trying to uberjar a realtively small project for the first time (for this project), and getting this: Uberjar aborting because jar failed: clojure.lang.MapEntry cannot be cast to clojure.lang.IPersistentMap |
| 17:33 | seangrove | There's not really anything more to go off than that - anything obvious I should be looking at? |
| 17:35 | justin_smith | seangrove: one thing I like to do is have only one ns that gets aot-compiled. It uses require / resolve at runtime to load my actual app and start it |
| 17:35 | justin_smith | that way I can eliminate a lot of headaches caused by differences between aot-compiled namespaces and ones that are not |
| 17:36 | justin_smith | seangrove: in case that's unclear, that aot compiled namespace is only a stub, and at compile time it doesn't load any other namespaces (thus no other namespaces get compiled while creating the uberjar) |
| 17:37 | seangrove | justin_smith: How's that affect determinism/load-time/etc.? |
| 17:38 | justin_smith | seangrove: determinism stasy the same - the same libs are in the uberjar. |
| 17:38 | justin_smith | load time is worse, because compiling all happens when starting the jar |
| 17:38 | justin_smith | instead of pre-compiling |
| 17:38 | justin_smith | seangrove: so that's a tradeoff, I accept it for the added simplicity |
| 17:38 | seangrove | Yeah, that's fair |
| 17:38 | justin_smith | (simplicity as in, what happens in my repl is what happens in the jar) |
| 17:39 | kwladyka | justin_smith, hmm i found 3 apps in scala and try it |
| 17:40 | kwladyka | 1 do only count solutions without list them.... 2 doesn't work :)... 3 count solutions and i think it is fast |
| 17:41 | kwladyka | so i should understand scala now :D |
| 17:43 | kwladyka | wow so fast, magic |
| 17:43 | kwladyka | of course not mine :) |
| 19:17 | amalloy | are you around, cfleming? i was trying to use cursive's debugger support for the first time, and it seems like my breakpoints are not doing anything. i put a breakpoint on the first line of -main and selected the Run|Debug action; but all i get is a console message saying it connected to the target VM, and then disconnected from the target VM |
| 19:44 | gfredericks | dnolen: I haven't tried a more focused run yet, but the total test suite slows down by a couple seconds, and the profiler shows over a second of time spent in goo.math.Long |
| 19:45 | dnolen | gfredericks: so top line self time item? |
| 19:46 | dnolen | |
| 19:46 | gfredericks | dnolen: there's GC, then ISeqable, then Long.multiply |
| 19:47 | gfredericks | it might be only 600ms, these numbers confuse me |
| 19:47 | gfredericks | if the top level self column is all disjoint, then it's >1sec |
| 19:48 | dnolen | You can sort self time column |
| 19:48 | gfredericks | right, it's sorted |
| 19:48 | dnolen | The numbers don't lie |
| 19:49 | gfredericks | need to invent a splittable algorithm that's better for 32-bit signed integers |
| 19:51 | gfredericks | looks like the other half of the slowdown is GC |
| 19:51 | gfredericks | which also makes sense |
| 19:52 | eriktjacobsen | Really bizzare problem: I’m getting this error <java.lang.NoClassDefFoundError: clojure/tools/logging/impl/LoggerFactory> , but the problem is that it just started today and the problem exists even 2 months back in our codebase (when its been compiling fine those 2 months). it seems to retroactively breaking builds, and it just occured today simultaniously on all our developer laptops / servers. Has anyone heard anything? |
| 19:52 | eriktjacobsen | I’m totally lost. |
| 19:52 | dnolen | gfredericks: what % in Long.multiply though? |
| 19:52 | eriktjacobsen | We don’t have a centralized maven, so if there is a probem its should be with main public maven |
| 19:52 | gfredericks | dnolen: 3.68% |
| 19:53 | dnolen | gfredericks: and Seqable? |
| 19:53 | gfredericks | 6.7% |
| 19:54 | dnolen | So I don't think any change to Long will matter much then. I suspect you made related changes elsewhere for algorithm? |
| 19:54 | hiredman | eriktjacobsen: have you run `lein clean`? have your cleared your .m2? |
| 19:55 | eriktjacobsen | yes, lein clean before each attempt. will try clearing .m2…. didn’t think local since it hit multiple laptops same time I’m seeing the exact same error from code several hundred commits ago from january. Will try clearing now |
| 19:55 | gfredericks | dnolen: not very much; you're saying changes won't matter because 3.68% is relatively small? |
| 19:56 | hiredman | eriktjacobsen: are any of your deps AOT compiled? |
| 19:57 | dnolen | gfredericks: if twice as much time is spent seq'ing that's where I would spend my time. |
| 19:57 | gfredericks | oh gotcha |
| 19:57 | dnolen | I wonder how Erlang QC does this without seqs |
| 19:58 | gfredericks | the lazy tree part you mean? |
| 19:59 | dnolen | gfredericks: yes when I ported test.check the implementation seemed pretty naive wrt perf |
| 19:59 | hiredman | eriktjacobsen: it may be some kind of code loading order issue, e.g. the clojure.tools.logging.impl namespace defines LoggerFactory which is something that is backed by a class (protocol, deftype, defrecord, etc) |
| 19:59 | gfredericks | dnolen: yeah at first it was just copied from haskell |
| 19:59 | hiredman | eriktjacobsen: and something is trying to do stuff with that type before the namespace that defines it has been loaded |
| 20:00 | dnolen | gfredericks: I suspect a custom rose tree thing could buy you 10X what you have today |
| 20:00 | gfredericks | dnolen: replacing the seqs you mean? |
| 20:00 | gfredericks | I've been pondering how to do that today and it's a slippery problem |
| 20:00 | dnolen | Just writing a data structure for the problem period |
| 20:00 | hiredman | eriktjacobsen: so you can make sure you aren't doing that, if your code does anything with LoggerFactory, and if it isn't you, you'll need to check your dependencies |
| 20:01 | gfredericks | well it already *is* a data structure, it's just made of lazy seqs |
| 20:01 | eriktjacobsen | hiredman: /sigh I got it. We pushed out Ultra-Repl |
| 20:01 | hiredman | what the heck is that |
| 20:01 | gfredericks | an extremely large lazy data structure that basically represents the search space |
| 20:01 | dnolen | gfredericks: but not necessarily suited to the problem |
| 20:02 | dnolen | Anyways that's what I would do since that would be a global win not a micro opt like Long |
| 20:02 | eriktjacobsen | hiredman: since it was pushed out to ~/.lein/profiles, it was conflicting regardless of code checkout. (its a colorized repl that also changes output from stacktraces and whatnot)… oddly the code was working fine with repl UNTIL a lein clean was run… so yeah |
| 20:02 | gfredericks | dnolen: okay I'll keep thinking along those lines, thanks |
| 20:02 | hiredman | right, because at somepoint you aot compiled the project and the classfile was sitting there |
| 20:03 | gfredericks | all the easy thoughts about *ducers don't seem to fit because it's not linear |
| 20:03 | eriktjacobsen | hiredman I should have realized, it was just that we happened to be running ultra for several days without a lein clean… totally forgot about the repl change (since they had been playing nice together for week) |
| 20:03 | amalloy | gfredericks: new band name: the starducers |
| 20:04 | hiredman | you should track down who ever is touching the class without loading the namespace that generates it and send them a strongly worded letter |
| 20:07 | eriktjacobsen | hiredman: ok. is there a way to exclude from lein plugins? |
| 20:07 | hiredman | don't put it in? |
| 20:08 | eriktjacobsen | from a project.clj? heh… yeah right now fix is toggling out lein profile based on dev workflow using repl vs compiling |
| 20:08 | eriktjacobsen | hmm way to only load a lein plugin during repl and not during compile / install ? |
| 20:09 | hiredman | why bend over backwards to keep using something that is broken? |
| 20:09 | eriktjacobsen | the colors are pretty |
| 20:11 | hiredman | do you think that is a little crazy? |
| 20:12 | eriktjacobsen | not really the colors are pretty helpful, and a script to toggle them out of lein profile when building takes 30 seconds to write and add a hook for in build scripts =\ |
| 20:15 | hiredman | it just seems like developers will bend over backwards to try to keep using broken stuff, and like, just kick it to the curb, you don't need it, you'll be fine, and you won't accrete more code on top of the broken stuff |
| 20:18 | eriktjacobsen | its just a repl plugin, not part of actual code I’m shipping… outside of disabling it during compile, no code is going to be written on top of it…. meh its an improvement over standard repl. it sucks it doesn’t play nice with rest of code but its still perfectly functional for the repl itself |
| 20:22 | aamar | CLJS newbie question... anyone know since when or & why String length is (.-length foo) instead of (.length foo)? |
| 20:23 | aamar | Related, I'm seeing the .length form in a few very important libraries, like ajax.core. |
| 20:32 | amalloy | aamar: .-length is a property lookup, like foo.length, and .length is a method call, like foo.length() |
| 20:33 | amalloy | so presumably .-length is used for built in arrays, and .length is used for some other kind of thing like an object defined by ajax.core |
| 20:35 | aamar | amalloy: that makes sense. thanks. |
| 20:35 | aamar | hm... still looks like the cljs-ajax is trying to call it on a String. Maybe it's just a bug. |
| 20:49 | bostonaholic | aamar: length is a property on a String, not a function |
| 21:16 | justin_smith | bostonaholic: to be clear, it's a method on the String class |
| 21:17 | bostonaholic | justin_smith: you sure? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length |
| 21:18 | justin_smith | bostonaholic: oh, I thought you were talking jvm, don't mind me |
| 21:18 | justin_smith | oh, duh, cljs-ajax, right |
| 21:18 | bostonaholic | haha, yeah. the original question was CLJS |
| 21:35 | justin_smith | ,(defn make-name [] (->> (all-ns) (mapcat ns-publics) (mapcat #(clojure.string/split (name (key %)) #"[-*!?]")) shuffle (remove empty?) (take (+ 2 (rand-int 3))) (clojure.string/join "-") symbol)) |
| 21:35 | clojurebot | #'sandbox/make-name |
| 21:35 | justin_smith | ,(repeatedly make-name) |
| 21:35 | clojurebot | (juxt-compile-special NODE-key-seq-history byte-repeatedly-as timestamp-clojure-triml-array ..-identical-fn ...) |
| 21:35 | justin_smith | ,(repeatedly make-name) |
| 21:35 | clojurebot | (unchecked-some-min distinct-root if-char-make-refer unchecked-all-pop re-list-int-sorted ...) |
| 21:38 | justin_smith | ,(repeatedly make-name) |
| 21:38 | clojurebot | (descendants-in writer-at bound-aset re-type ex-use-string ...) |
| 21:38 | justin_smith | ,(repeatedly make-name) |
| 21:38 | clojurebot | (delay-proxy-booleans declare-with-matches-struct let-method aliases-array zipmap-executor ...) |
| 22:18 | justin_smith | ,(defn make-name [] (let [namespaces (all-ns) namespace (->> namespaces (mapcat #(clojure.string/split (name (.name %)) #"[.-]")) shuffle (take (+ 2 (rand-int 4))) (clojure.string/join ".")) variable (->> namespaces (mapcat ns-publics) (mapcat #(clojure.string/split (name (key %)) #"[-*!?]")) shuffle (remove empty?) (take (+ 2 (rand-int 3))) (clojure.string/join "-"))] (symbol (str namespace \/ variable)))) |
| 22:18 | clojurebot | #'sandbox/make-name |
| 22:18 | justin_smith | ,(repeatedly make-name) |
| 22:18 | clojurebot | (instant.repl.clojure.clojure/select-future-load java.string.clojure.core.uuid/find-subvec-method java.clojure/frequencies-zero-ex-clojure sandbox.clojure.core.user/test-unresolved-not string.core.clojure.clojure.user/while-unchecked-str-unmap ...) |