2014-07-07
| 00:46 | FarLight | What is the name of the bracing style that the clojure source code employs? |
| 00:53 | _ato | FarLight: EDN? https://github.com/edn-format/edn |
| 00:56 | _ato | or "S-expressions"? (although that term usually refers to the more traditional simpler lisp syntax that only has lists) |
| 00:56 | FarLight | I meant the java code for clojure _ato |
| 00:57 | bbloom | FarLight: "something weird, then something weirder caused by an intellij fuck up" |
| 00:57 | bbloom | FarLight: but i believe the that weird thing is (was): https://en.wikipedia.org/wiki/Indent_style#Whitesmiths_style |
| 00:57 | FarLight | Yeah I am looking at it now but it appears to be changed |
| 00:58 | bbloom | FarLight: as i said, there was an intellij mishap |
| 00:59 | bbloom | why it hasn't been auto-reformatted, i don't know... i assume b/c people have patches they depend on & it would be a pain to rebase them all |
| 00:59 | FarLight | So Hickey didnt actually write it that way to begin with |
| 00:59 | FarLight | Is that his name? |
| 00:59 | FarLight | Hicky? |
| 00:59 | bbloom | with the e |
| 00:59 | bbloom | he wrote it in whitehead style, as far as i know |
| 01:00 | FarLight | Interesting |
| 01:00 | bbloom | er whitesmith rather |
| 01:15 | ybit3 | any idea what's going on here? |
| 01:15 | ybit3 | https://gist.githubusercontent.com/heath/b336e361a0550f05fb91/raw/92e7f30246f6382db260c556a267117b9257a066/gistfile1.txt |
| 01:17 | ybit3 | ~"""javascript file found on classpath for library cljs.nodejs but does not contain a corresponding goo.provide""" |
| 01:17 | clojurebot | Pardon? |
| 01:19 | ybit3 | a company is willing to let me writie clojurescript for node.js :) so i'm learning in my spare time |
| 01:34 | ivan | ybit3: maybe this works better with lein-cljsbuild and :target :nodejs? |
| 01:38 | ybit3 | ivan: hm, i guess, i was was using what's on the clojurescript wiki |
| 01:38 | ybit3 | i'll try that tomorrow |
| 01:38 | ybit3 | thanks |
| 05:25 | gfixler | is there a way in clojure to do straight search/replace, sans regexes? |
| 05:26 | gfixler | (replace "string" #"find" "replace") is great if you have a regex, but I have complex finds with ?s and things in them |
| 05:26 | gfixler | I just literally want to replace whatever my find term is |
| 05:27 | gfixler | Oh, looks like I can just use the string, and not wrap it in #"this" |
| 05:27 | gfixler | hooray |
| 05:27 | Viesti | :) |
| 05:28 | gfixler | too simple; so boring :) |
| 06:12 | bracki | Does anybody know how to calm down Jetty when enabling logging via clojure.tools.logging, slf4j and logback? |
| 06:21 | bracki | Or how do I even log? What's a sane configuration? |
| 07:14 | runner | ciau xD |
| 07:14 | runner | ciao |
| 07:14 | runner | !list |
| 07:42 | neena | . |
| 08:11 | perplexa | hm (nthnext seq 1) vs (rest seq) |
| 08:11 | perplexa | which is prefered to drop the 1st element of seq? ;p |
| 08:13 | mnngfltg | perplexa, if in doubt, take the shorter one? :) |
| 08:13 | perplexa | i did ;p |
| 08:13 | perplexa | just wondering :) |
| 08:13 | mnngfltg | perplexa, also compare (next) and (rest) |
| 08:14 | perplexa | damnit. another one :| |
| 08:14 | pyrtsa | Use (next xs) if you want nil to indicate an empty tail, otherwise (rest xs). |
| 08:15 | perplexa | tail is never empty :) |
| 08:16 | perplexa | i'm ust returning the result of a re-find, but don't want the whole string to be at #0 |
| 08:16 | perplexa | i think i'm gonna stick with rest |
| 08:18 | pyrtsa | perplexa: Heh, then you should know there's also (subvec xs 1) that you can use for vectors (to keep the result as a vector). |
| 08:38 | perplexa | pyrtsa: thx |
| 09:26 | rurumate | how to do http request in clojurescript? what's the most awesome way? just goog XhrIo or is there something more convenient / standard yet? |
| 09:27 | teslanick | I use the raw DOM api with (doto) |
| 09:27 | rurumate | because I don't like CamelCase |
| 09:28 | rurumate | and XhrIo doesn't return a channel. bummer |
| 09:29 | broquaint | rurumate: cljs-http or cljs-ajax perhaps? |
| 09:29 | rurumate | thanks, I wasn't aware of cljs-ajax |
| 09:30 | Glenjamin | the general advice is to not treat the network like a channel |
| 09:30 | Glenjamin | but instead to have the network code feed messages to/from a channel |
| 09:38 | rurumate | Glenjamin: huh? |
| 09:38 | rurumate | are you telling me not to use cljs-ajax? |
| 09:38 | Glenjamin | i know nothing about cljs-ajax |
| 09:39 | rurumate | you telling me to use a callback and put it in XhrIo directly, no channels attached? |
| 09:40 | Glenjamin | i'm saying a core.async channel and a network socket should be treated differently |
| 09:40 | Glenjamin | it looks like cljs-ajax does that |
| 09:41 | rurumate | hum hum |
| 09:41 | rurumate | I just want to avoid callbacks that's all |
| 09:41 | benzap` | question for you guys, I want to implement something that resembles (defn, but I want to automatically be passing in the parameter. This means I can't gensym, but I still need some form of local scope for the paramter |
| 09:41 | benzap` | i can't seem to figure out how to do that |
| 09:41 | rurumate | callbacks in the toplevel code that is, of course they are still there somewhere below |
| 09:42 | rurumate | benzap`: something like #() ? |
| 09:42 | Glenjamin | the general advice i've seen is when apis expose callbacks, your callback should just put! a value onto a channel |
| 09:42 | marpstar | Glenjamin is right, rurumate, your XhrIo should put! a message onto a channel |
| 09:42 | rurumate | yes that's what I want to do, |
| 09:42 | benzap` | rurumate: that generates a symbol, how would I reference it inside of the macro? |
| 09:42 | rurumate | just I don't want to write that code all over again in each project, I want it in a library |
| 09:42 | benzap` | I mean, outside of the macro |
| 09:43 | gfredericks | benzap`: this is called anaphoric macros |
| 09:43 | gfredericks | usually discouraged |
| 09:43 | rurumate | put!, not >! ? |
| 09:43 | gfredericks | ,(defmacro while-x-is-42 [expr] `(let [~'x 42] ~expr)) |
| 09:43 | clojurebot | #'sandbox/while-x-is-42 |
| 09:43 | benzap` | gfredericks: I see, maybe I need to rethink this then |
| 09:44 | gfredericks | ,(while-x-is-42 (inc x)) |
| 09:44 | clojurebot | 43 |
| 09:44 | marpstar | actually, I used >! |
| 09:44 | gfredericks | benzap`: yeah maybe try describing what you're doing at a higher level? |
| 09:44 | marpstar | rurumate: http://pastebin.com/5HuUBRX3 |
| 09:44 | marpstar | assumes xhr is XhrIo |
| 09:45 | benzap` | gfredericks: well, what i'm trying to do is make a macro called defservice, which takes the form (defservice name-of-service {parameters, like polling interval, etc} ~@body (which takes a msg object, containing service data) |
| 09:45 | marpstar | that's how I call up to my server, get a JSON response, convert it into a cljs hash map with keywords for keys |
| 09:45 | benzap` | so it would be like (defservice poll-test {} (println msg)) |
| 09:46 | marpstar | and publish it to a channel |
| 09:46 | benzap` | honestly, i'm just trying to introduce some more syntactic sugar |
| 09:47 | benzap` | I want to smooth over some things for newcomers |
| 09:47 | benzap` | I could just forget about using ~@body, and just pass in a function |
| 09:49 | gfredericks | benzap`: you might look at how compojure's routing macros provide sugar without using anaphora |
| 09:50 | benzap` | gfredericks: alrighty |
| 09:51 | gfredericks | benzap`: it does seem easier when there's just one instance of anaphora and you're actively thinking about how it works, but in general it makes it a lot harder to look at code and see what things are referring to |
| 09:52 | bracki | How do I force a form into a string? |
| 09:52 | bracki | I want to convert a map to a JSON string. |
| 09:52 | benzap` | gfredericks: agreed, to be honest, I could probably do most of what I want without macros |
| 09:58 | benzap` | looks like compojure is passing down the routing information to handlers to construct whatever routing requests it needs |
| 09:58 | benzap` | I don't understand why some things are made into macros |
| 10:00 | teslanick | bracki: In clojure or clojurescript? |
| 10:07 | rurumate | marpstar: brilliant, thanks |
| 10:41 | bracki | teslanick: Got it working |
| 10:41 | bracki | in Clojure |
| 10:41 | bracki | Once more, does anybody know what I have to do to Jetty to shut it up? I'm using ring and slf4j. |
| 10:41 | teslanick | I was going to say -- in Clojure you'll need a JSON serializer, but in JS you can usually just use js/JSON.stringify |
| 11:01 | ddellacosta | bracki: did you figure out your logging issue? This may help: https://github.com/malcolmsparks/clj-logging-config |
| 11:01 | ddellacosta | bracki: alternatively, just configure it via XML |
| 11:19 | rurumate | what's the difference between alt! and alts! ? |
| 11:22 | tbaldrid_ | rurumate: alt! is like alts! + case |
| 11:23 | tbaldridge | arrdem: have you seen this one yet? (let [[& {:as opts] [1 2 3 4 5 6]] opts) |
| 11:23 | tbaldridge | , (let [[& {:as opts] [1 2 3 4 5 6]] opts) |
| 11:23 | clojurebot | #<RuntimeException java.lang.RuntimeException: Unmatched delimiter: ]> |
| 11:23 | tbaldridge | , (let [[& {:as opts} [1 2 3 4 5 6]] opts) |
| 11:23 | clojurebot | #<RuntimeException java.lang.RuntimeException: Unmatched delimiter: )> |
| 11:23 | Bronsa | ,(let [[& {:as opts}] [1 2 3 4]] opts) |
| 11:23 | clojurebot | {1 2, 3 4} |
| 11:23 | tbaldridge | bleh this is easier as a defn |
| 11:23 | tbaldridge | there we go! :-) |
| 11:26 | arrdem | tbaldridge: hum.... no I don't think I've seen that one before either |
| 11:27 | tbaldridge | it's basically the same as something like (fn [& opts] (apply hash-map opts)) |
| 11:27 | tbaldridge | but I hadn't seen it either until Rich used it in part of core.async |
| 11:28 | arrdem | yeah I may have seen that once or twice for exactly that reason but AFAIK I've never used that trick. |
| 11:28 | Bronsa | well that's the same as doing (defn x [& {:keys [..]}]) .. |
| 11:28 | arrdem | sure |
| 11:30 | rurumate | tbaldridge: thanks, I see there are not clauses in alts!. alt! is a lot easier on the eye in many cases |
| 11:32 | benzap` | was wondering, is there a way to easily generate a symbol when (defn a function? i'm currently doing something like this http://stackoverflow.com/questions/2486752/in-clojure-how-to-define-a-variable-named-by-a-string |
| 11:32 | benzap` | but I can't seem to store (symbol x) in a (let cloause |
| 11:34 | benzap` | ugh, I feel like i'm breaking the law, the way i'm doing this |
| 11:34 | benzap` | it's almost like an object-oriented approach, that doesn't quite cut it |
| 11:35 | benzap` | I just want a service, that I can stop, start, setup scheduling |
| 11:35 | cbp | benzap`: what exactly are you doing and why? |
| 11:36 | benzap` | I want to add services to a list, and I was going to add in optional arguments to setup scheduling |
| 11:36 | benzap` | using overtone.at-at |
| 11:36 | benzap` | so I need to generate functions that will handle the scheduling as well, which consists of a schedule pool, and 'stop-functions' |
| 11:37 | benzap` | it requires me to store state on these services based on what types of scheduling I introduce on the service |
| 11:37 | teslanick | benzap`: Have you seen http://thinkrelevance.com/blog/2013/06/04/clojure-workflow-reloaded |
| 11:39 | benzap` | the problem isn't my workflow, i'm writing something which I can use to extend my service-pool |
| 11:40 | benzap` | ugh |
| 11:42 | benzap` | i feel like my brain is going to explode, I just think about everything in terms of OOP |
| 11:43 | Jaood | FP is fud |
| 11:44 | yogsototh | Hi! Could someone help me. I have a lazy-seq of strings and I want to produce an array of string out of it. |
| 11:44 | arrdem | Jaood: naw man it's blub |
| 11:44 | yogsototh | I tried (into [] myseq) without success. |
| 11:45 | jonasen | yogsototh: do you need a Java array? |
| 11:45 | cbp | yogsototh: that makes a clojure vector. Is that the problem? |
| 11:45 | yogsototh | I don't know, in the end I want to make a JSON out of it. |
| 11:46 | cbp | yogsototh: can you show your code + stacktrace? |
| 11:46 | teslanick | If it needs to be a Java array, you can do (into-array lazy-seq) |
| 11:46 | cbp | ~refheap |
| 11:46 | clojurebot | https://www.refheap.com/ |
| 11:46 | Jaood | arrdem: what's blub? |
| 11:47 | arrdem | Jaood: http://en.wikipedia.org/wiki/Paul_Graham_%28computer_programmer%29#Blub |
| 11:47 | jonasen | yogsototh: You won't need a java array for outputting JSON. I don't think you need to convert the lazy seq at all |
| 11:47 | yogsototh | I use storm, the stacktrace is not very relevant. |
| 11:48 | yogsototh | I showed the type and I got: clojure.lang.LazySeq |
| 11:48 | yogsototh | but if I try to print it, it simply fail |
| 11:49 | yogsototh | here is my error log http://pastebin.com/piZbtd0S |
| 11:49 | yogsototh | and the code http://pastebin.com/YKkDuU88 |
| 11:56 | cbp | sorry yogsototh I am unfamiliar with storm |
| 11:57 | yogsototh | cbp: in this case I don't think this is a storm related problem. I have a LazySeq but I don't even know how to print it! |
| 11:58 | cbp | you just print it |
| 11:58 | cbp | ,(print (range 10)) |
| 11:58 | clojurebot | (0 1 2 3 4 ...) |
| 12:01 | yogsototh | I tried print and it didn't worked |
| 12:01 | yogsototh | It tried (realized? tokens) and it returned false |
| 12:01 | cbp | what did print do? |
| 12:02 | yogsototh | apparently nothing happened |
| 12:02 | AeroNotix | yogsototh: doall |
| 12:03 | yogsototh | (doall print tokens) fail dramatically... |
| 12:03 | AeroNotix | jesus |
| 12:03 | AeroNotix | (print (doall tokens)) |
| 12:03 | yogsototh | I even tried (take 1 tokens) |
| 12:03 | AeroNotix | obv |
| 12:04 | yogsototh | (print (doall tokens)) failed the same way... |
| 12:04 | AeroNotix | In what way? |
| 12:04 | yogsototh | I get a NullPointerException |
| 12:05 | AeroNotix | is tokens nil? |
| 12:05 | yogsototh | no tokens isn't nil |
| 12:05 | dbasch | yogsototh: it's possible that your lazy sequence has things that cause NPE upon realization |
| 12:06 | AeroNotix | indeed |
| 12:06 | yogsototh | Maybe I use a quite old lirbary |
| 12:06 | yogsototh | https://github.com/eandrejko/clj-tokenizer |
| 12:06 | dbasch | e.g. |
| 12:06 | dbasch | ,(def a (map #(/ 1 %) (repeat 0))) |
| 12:06 | clojurebot | #'sandbox/a |
| 12:07 | dbasch | (first a) |
| 12:07 | dbasch | ,(first a) |
| 12:07 | clojurebot | #<ArithmeticException java.lang.ArithmeticException: Divide by zero> |
| 12:07 | dbasch | it's a different exception but you get the idea |
| 12:07 | yogsototh | You are completely right! |
| 12:07 | yogsototh | Thanks! |
| 12:27 | anykey | is there a chief web framework for Clojure like Grails for Groovy? |
| 12:29 | TimMc | Compojure, I guess? |
| 12:30 | TimMc | Might not be as framework-y as you want. :-P |
| 12:39 | arrdem | Bronsa: https://www.refheap.com/87936 |
| 12:40 | arrdem | Bronsa: pedantic, but big for someone trying to understand what the class structure is |
| 12:40 | verma | in repl, how do I reload a file if I initially loaded it with (load "test/file") |
| 12:41 | arrdem | verma: load doesn't do any caching AFAIK, it's imperative. just call load again. |
| 12:41 | verma | arrdem, if I do a (in-ns) after the load it cannot find the file anymore |
| 12:42 | verma | arrdem, but you're right just doing (load "") again doesn't report any problems, only that when I do (in-ns) it blows |
| 12:42 | verma | arrdem, nice, I can do (in-ns 'user) and it throws be out and then I can reload |
| 12:43 | verma | arrdem, thanks |
| 12:43 | arrdem | verma: (doc load) shows that load is classpath/namespace relative. If you in-ns into some ns, loads are assumed to be relative to the location of whatever ns you are in. |
| 12:45 | verma | arrdem, ah, thanks :) |
| 12:46 | Bronsa | arrdem: pushed |
| 12:46 | arrdem | Bronsa: <3 |
| 12:50 | anykey | TimMc: I'll take a look nevertheless. |
| 12:52 | arrdem | cbp: bug: you don't use your cactus on twitter |
| 12:53 | arrdem | cbp: bug: your twitter and github handles aren't eq |
| 12:54 | cbp | arrdem: lol |
| 12:55 | aperiodic | [us hsov |
| 12:55 | aperiodic | ha, wrong keyboard layout |
| 13:00 | cbp | arrdem: Fixed #1 |
| 13:01 | arrdem | yay |
| 13:18 | Planet_EN | Its quite a noob question but I'm trying to use spit in a clojure file and it gives me the symbol isn't defined, it works fine when I use it in REPL. Any ideas? |
| 13:24 | zanes | Planet_EN: Things that are defined when you evaluate them in the REPL stay defined, even if you remove them in the file. |
| 13:24 | zanes | Planet_EN: So what probably happened is that you required it, then removed that requirement from the file. |
| 13:24 | zanes | Planet_EN: Do you mean ‘split’? |
| 13:27 | Planet_EN | zanes, no I mean spit, the one in clojure.core |
| 13:27 | cbp | Planet_EN: can you paste your code + stacktrace? |
| 13:28 | Planet_EN | zanes, http://pastebin.com/xDDvAMyd |
| 13:28 | atyz | anykey: I don't think there is a framework as encompasing as grails |
| 13:29 | amalloy | Planet_EN: you need some kind of ns declaration; a clojure file with no namespace is weird and who knows whether spit will work or even println |
| 13:29 | amalloy | i mean, i would expect it to work, but who knows |
| 13:29 | Planet_EN | zanes, stack trace: http://pastebin.com/raw.php?i=fmL56cuq |
| 13:30 | amalloy | ah. Planet_EN: uninstall this "clojure" executable, and install leiningen |
| 13:30 | Planet_EN | amalloy, println works, spit doesn't. |
| 13:30 | Planet_EN | amalloy, I've lein too |
| 13:30 | arrdem | amalloy: if there is no ns/in-ns form, *ns* is still 'user |
| 13:31 | amalloy | arrdem: like i said i'd *expect* it to work but eliminating weirdness is a reasonable first guess at debugging |
| 13:31 | arrdem | amalloy: sure |
| 13:31 | amalloy | Planet_EN: you're running a binary from like three years ago, which was never sanctioned by clojure/core anyway |
| 13:31 | amalloy | back then, spit lived in clojure.contrib.io, or something like that |
| 13:31 | arrdem | lul contrib |
| 13:32 | Planet_EN | amalloy, how do I run a file via lein? |
| 13:34 | amalloy | so, anyway, the solution is to do everything with lein. https://github.com/technomancy/leiningen/blob/master/README.md#basic-usage is useful since you've already got it installed. so you'll want to use `lein run -m your.namespace`, once you've got a project set up (as via `lein new`) |
| 13:34 | amalloy | "loose" clojure files which are not part of a project are not really very useful; everything lives in a project |
| 13:35 | arrdem | Planet_EN: you did install lein via the boostrap script not via $PKGMANAGER, right? |
| 13:35 | anykey | atyz: I figured that; I come from Django and express (on node.js) and I am new to clojure altogether, so something... skinny might be a choice |
| 13:36 | Planet_EN | arrdem, yea from the official script |
| 13:36 | Planet_EN | arrdem, its v2.4.2 |
| 13:36 | arrdem | gud |
| 13:38 | verma | what is the #{} for? |
| 13:38 | arrdem | verma: https://clojure.org/reader it's the set reader literal |
| 13:38 | verma | arrdem, oh nice, thanks |
| 13:48 | Planet_EN | Is there something similar to curl in clojure or a port of python requests? |
| 13:48 | Planet_EN | requests lib |
| 13:48 | Glenjamin | clj-http is my preferred choice |
| 13:48 | tuft | Planet_EN: yes, clj-http |
| 13:53 | atyz | hiredman, TimMc are you guys around today? |
| 13:54 | TimMc | atyz: Here, yep. |
| 13:55 | TimMc | afk in 7 minutes |
| 13:55 | atyz | It appears you were right yesterday re the GC issue |
| 13:55 | atyz | Erm, on thursday |
| 13:56 | TimMc | Oh, that wasn't my diagnosis. What did you learn? |
| 13:58 | atyz | Oh sorry it must have been amalloy |
| 13:58 | atyz | Ummm |
| 13:58 | TimMc | Probably. |
| 13:58 | TimMc | (inc amalloy) |
| 13:58 | lazybot | ⇒ 140 |
| 13:58 | arrdem | Bronsa: I can't quite tell, do you manage the numbering of fields/constants manually or do you get that for free from objectweb/asm |
| 13:58 | atyz | I attached nr to those boxes |
| 13:58 | atyz | Let me show you something |
| 13:59 | atyz | http://imgur.com/w70zatW |
| 14:00 | TimMc | atyz: ...interesting. What happened at 10:40? |
| 14:00 | Bronsa | arrdem: you mean "0" in const__0? |
| 14:00 | atyz | TimMc: Nothign! |
| 14:01 | atyz | Logs say nothing |
| 14:01 | Bronsa | arrdem: or are you talking about local variables? |
| 14:01 | atyz | http://imgur.com/oywuUUK |
| 14:01 | atyz | We are also using all of our Eden heap |
| 14:01 | atyz | basically all the memory on the box |
| 14:01 | aperiodic | atyz: was this after taking the node out of the LB group? |
| 14:01 | amalloy | atyz: adding giant piles of extra RAM to a process managed by a GC is a great way to slow it down |
| 14:01 | arrdem | Bronsa: class fields not local variables. |
| 14:02 | atyz | amalloy: the box has 3.7gb of ram i believe, we have allocated 3g to the jvm |
| 14:02 | atyz | It seems to be using all it can |
| 14:02 | Bronsa | arrdem: so that's constants/callsites, the index is assigned to each constant/callsite by the collect pass |
| 14:02 | amalloy | sure, you're probably leaking memory somewhere |
| 14:02 | atyz | aperiodic: the GC cpu usage dropped after I pulled it out of the lb |
| 14:02 | amalloy | but if you can manage with less memory at one time, incremental cleanup on a small heap will make your program run faster than occasional huge cleanups on a huge heap |
| 14:03 | atyz | However teh machine is still running at 100% after being pulled out of the lb |
| 14:03 | Bronsa | arrdem: https://github.com/clojure/tools.analyzer/blob/master/src/main/clojure/clojure/tools/analyzer/passes/collect.clj#L38 |
| 14:03 | atyz | amalloy: please excuse me, but would you expand on your last statement? |
| 14:04 | amalloy | atyz: suppose you had a machine with 1TB of RAM, and decided to give it all to a clojure webserver |
| 14:04 | aperiodic | you want a smaller heap that you garbage collect more frequently rather than a big one with rare, expensive collections |
| 14:04 | amalloy | what would happen is you'd have no gc for hours, lots of garbage piling up, and then a GC pause that's minutes long |
| 14:04 | tuft | can you actually prevent stop-the-world that way, or does the world just stop for less time? |
| 14:04 | atyz | amalloy: but that wouldn't explain why the machine is still running at 100% |
| 14:05 | arrdem | Bronsa: herm.... okay. |
| 14:05 | TimMc | There's no way to get it to do more frequent collections? |
| 14:05 | amalloy | well, like i said, you're probably leaking memory somewhere; once you run out of memory once, any program can get into really bad states because the OutOfMemoryError crops up somewhere you weren't expecting it |
| 14:05 | aperiodic | tuft: the latter. hopefully your world only stops for a millisecond or two at a time |
| 14:05 | TimMc | Or is the problem that any collection on a heavily-used heap will make a long pause? |
| 14:05 | amalloy | tuft: modern garbage collectors can do with very short STW pauses, or none at all if you can proactively avoid major collections |
| 14:06 | tuft | cool, makes sense |
| 14:07 | atyz | how would I go about finding a memory leak? |
| 14:07 | atyz | and would it possibly help for me to change my java-opts? |
| 14:07 | atyz | I guess logging teh gc would be the only way |
| 14:07 | amalloy | atyz: you can use jmap or a profiler to get a histogram of the heap space used by objects of various sorts |
| 14:08 | atyz | amalloy: i've run the new relic profiler on teh box when it was under strain |
| 14:08 | atyz | I'll go look through that again quick |
| 14:08 | amalloy | and if you see that the dominator is something like my.app.core$helper$fn__123$fn__456, you'll know that you're leaking closures from inside of my.app.core/helper |
| 14:09 | amalloy | but of course you won't always get such a helpful answer |
| 14:09 | Bronsa` | arrdem: https://github.com/clojure/tools.emitter.jvm/blob/master/src/main/clojure/clojure/tools/emitter/jvm/emit.clj#L1111 for the code that emits constants |
| 14:09 | amalloy | usually it's clojure.lang.LazySeq objects or something, and than you have to figure out where they're coming frmo |
| 14:14 | arrdem | Bronsa`: thanks. just trying to meld my mental model of (essentially unordered) method/field/class generation with name resolution and with your transform structure(s). |
| 14:14 | atyz | amalloy: forgive my ignorance, but why would a machine taking no requests, which is no longer really garbage collecting anymore but has a memory leak be using all of its cpu? |
| 14:15 | amalloy | atyz: because OOMEs are like armageddon. anything can happen. maybe some scheduler thread was the one who got the first error, and it was unable to unschedule some timer |
| 14:15 | arrdem | atyz: because the machine is continually garbage collecting trying to prove that some subset of the heap is unreachable so that it can get some memory to breath in. |
| 14:18 | tuft | thrashing, basically =) |
| 14:21 | atyz | So from what I see here (http://imgur.com/tN6MeZa) basically it looks like the culprit is the ThreadPoolExecutor. Could this just be from my threadpool in clj-http or my (probably) not the best use of futures? |
| 14:23 | amalloy | atyz: those threads should be blocking, not spinning cpu |
| 14:23 | amalloy | sun.misc.Unsafe/park is the primitive used for blocking until some event happens |
| 14:26 | atyz | amalloy: Unless I"m reading this correctly, why are they taking up 66% of the cpu? |
| 14:26 | atyz | *increctly |
| 14:26 | atyz | *incorrectly |
| 14:27 | amalloy | dunno. maybe newrelic doesn't realize it's blocking. maybe some weird black magic happened when you got your OOME. maybe i'm wrong and that's supposed to take up CPU time after all |
| 14:27 | halogenandtoast | I’m trying to understand how I should model this functionally. I have a game object and I want the game to keep playing until someone wins. I was considering having a :running true value in my Map, but I’m not sure how I’d use that to keep executed a branch until :running false because immutability. I thought about a while loop. Should I be using an atom for this instead? |
| 14:27 | halogenandtoast | s/executed/executing/ |
| 14:27 | halogenandtoast | I’ve been avoiding atoms as a whole. |
| 14:28 | halogenandtoast | It seems like I want an infinite lazy inject. |
| 14:29 | halogenandtoast | But I might be in left field. |
| 14:30 | arrdem | (loop [state] (let [state |
| 14:30 | arrdem | derp |
| 14:31 | arrdem | (loop [state] (let [stat' (tick state)] (when (:running state') (recur state')))) |
| 14:31 | arrdem | s/stat'/state'/g |
| 14:31 | arrdem | no need for atoms here |
| 14:32 | halogenandtoast | arrdem: thanks, makes some sense, I’ll start working on understanding how this works. |
| 14:33 | halogenandtoast | So recur executes the loop again passing in a new value, interesting. |
| 14:33 | atyz | amalloy: I don't think so, because on happy boxes it doesn't take up a majority of the cpu |
| 14:35 | arrdem | halogenandtoast: yep. |
| 14:56 | pandeiro | anyone ever experienced a ring app using compojure working fine (200s) with embedded jetty in dev, but returning 302s when deployed as a war? (referring to the same exact route, eg localhost:8080/foo) |
| 14:58 | anykey | atyz: I am impressed. Compojure is exactly the balance of simplicity and complexity I searched for. Will be learning clojure the next weeks with that. |
| 15:06 | halogenandtoast | arrdem: Thanks so much for the example, I think that was a huge clojure breakthrough for me. |
| 15:07 | arrdem | halogenandtoast: no worries |
| 15:19 | atyz | anykey: I think you (like I did) will start to enjoy the simplicity of it. I have felt bogged down by many of the larger all inclusive frameworks |
| 15:20 | anykey | atyz: it's my main gripe with grails. Grails is SLOW. |
| 15:20 | anykey | it takes above 45 seconds to just reload changes |
| 15:21 | anykey | in comparison to that, compojure feels quick, but comes, of course, as no-frills. |
| 15:21 | anykey | I will have problems when I want to properly secure applications |
| 15:22 | atyz | Yep, thats not fun. If you are looking for more all inclusive stuff Scala has some frameworks that are a little more all inclusive |
| 15:22 | anykey | atyz: actually I like lisp, it's been a long time |
| 15:22 | anykey | I did Lisp in... I think 2008 |
| 15:22 | anykey | common lisp, back then |
| 15:23 | anykey | but I have known it for quite some time before that |
| 15:23 | atyz | Then you shuldn't have too much trouble adopting clojure :) |
| 15:24 | anykey | tomorrow it may be decided that I am doomed to do Java for the rest of my work life |
| 15:25 | anykey | if that doesn't come to pass, I will happily take a very good look at clojure |
| 15:38 | Fare | is there a better way to insert something at the second position of a vector than (fn [[a & b]] (apply vector a 2 b)) ? |
| 15:39 | turbofail | probably not. vectors aren't really made for random insertion |
| 15:40 | bbloom | well, should use into |
| 15:40 | Fare | (into [] (list* a 2 b)) ? |
| 15:40 | bbloom | ,((fn [[a & b]] (into [a 2] b)) [1 2 3 4]) |
| 15:40 | clojurebot | [1 2 2 3 4] |
| 15:40 | Fare | ok |
| 15:41 | bbloom | apply-vector will make a pass through lazy seqs on the way to being a vector |
| 15:41 | bbloom | using into will internally use reduce, skipping the intermediate data structures |
| 15:41 | Fare | (inc bbloom) |
| 15:41 | lazybot | ⇒ 36 |
| 15:43 | bbloom | Fare: still, unless you know you have a small (30ish or fewer) item vector (or are doing this rarely enough) then you've probably good the wrong data structure |
| 15:43 | bbloom | Fare: seqs have fast head access |
| 15:48 | Fare | this is to represent source code. All these vecs are fewer than 10 elements. |
| 15:48 | Fare | maybe even only all fewer than 5 or 6 |
| 15:48 | bbloom | yup, won't matter at all then |
| 15:49 | Fare | 7 actually |
| 15:54 | bbloom | Fare: enjoying clojure so far? would be interesting to get a CL-ers view |
| 15:56 | Fare | yes, enjoying it very much. |
| 15:56 | halogenandtoast | Is there any service for paying other clojure developers to review my code and give me tips to improve it (I know I can use exercism.io, but that’s solving very specific examples and not the code I wrote). |
| 15:56 | halogenandtoast | (pay or free) |
| 15:57 | Fare | there are things I'm missing, but the core language is much neater. |
| 15:57 | Fare | I still am not done with "The Joy of Clojure". It just happily surprised me with {:pre ... :post ...} |
| 15:58 | anykey | I bought that book too |
| 15:58 | anykey | then I noticed I couldn't handle it, so I also got a more introductory one |
| 15:59 | Fare | I bought 1st ed shortly before 2nd ed was out :-/ |
| 15:59 | Fare | it is slightly too slow for me, but good nonetheless. 1st ed has many small mistakes here and there. I suppose they've been fixed in 2nd ed, but that's annoying. |
| 15:59 | amalloy | halogenandtoast: you could try #clojure on freenode. i hear some clojure devs hang out there |
| 15:59 | Fare | hallski, wait, where am I? |
| 16:00 | Fare | s/hallski/amalloy/ |
| 16:00 | halogenandtoast | amalloy: so you mean here? |
| 16:00 | verma | lol |
| 16:00 | verma | I checked to make sure I was on freenode |
| 16:00 | verma | :P |
| 16:01 | halogenandtoast | At the moment I just have this small program I’m writing to emulate a card game: https://gist.github.com/halogenandtoast/58cf169f271d49f69005 |
| 16:01 | halogenandtoast | I’m concerned that my lack of clojure knowledge might have led me down bad paths |
| 16:01 | amalloy | halogenandtoast: sure. you just have to structure your question so that it's interesting. nobody will want to "offer general suggestions" on your 3000-line app, but smaller targeted questions are often answered helpfully. plus, working on asking a better question will itself teach you |
| 16:02 | verma | I just need a good set of problems/projects to work on to learn more clojure, I find myself struggling with ideas |
| 16:02 | halogenandtoast | amalloy: Heh luckily it’s less than 100 lines, and it’s at least a card game. Maybe that’s interesting? |
| 16:04 | amalloy | halogenandtoast: seems like a basically reasonable way of doing things. it's unfortunate that there are side effects buried in make-player, but i see you're doing a pretty good job of keeping pure code pure |
| 16:04 | amalloy | #(shuffle-deck %1 %2) is just shuffle-deck |
| 16:05 | amalloy | nothing in there stands out as outrageously bad. i'd say you're on a good path |
| 16:06 | halogenandtoast | amalloy: Thanks, good to know. I agree I didn’t like the side-effects (due to map not working, switched to doall, and then finally mapv). |
| 16:06 | halogenandtoast | The doall, forced me to use into later |
| 16:09 | bracki | Does anybody know how to calm down Jetty when enabling logging via clojure.tools.logging, slf4j and logback? |
| 16:10 | Fare | what's the easiest way to conditionally destructure a seq? |
| 16:11 | razum2um | just a small survey: how many of participants here are writing clojure at work as primary language? |
| 16:12 | noprompt | razum2um: is everyone supposed to raise their hand? |
| 16:14 | pandeiro | anyone know what config is necessary for standalone jetty and lein ring warfiles to work together? |
| 16:14 | amalloy | Fare: destructuring is unconditional; we don't have pattern-matching like haskell or erlang (unless you use a library like core.match) |
| 16:14 | noprompt | does anyone what the proper channels are for removing something accidentally push to clojars, work related, not intended for public consumption? /cc technomany |
| 16:14 | noprompt | :| ^ technomancy |
| 16:14 | i-blis | *raises hand* |
| 16:14 | razum2um | noprompt: room encounters 757 users now, just will know how many are just curious |
| 16:15 | amalloy | noprompt: it's to talk to technomancy |
| 16:15 | Fare | is there a reason not to use core.match? |
| 16:15 | noprompt | it'd be nice to have a "panic-button" with clojars when you accidentally push something. |
| 16:15 | Fare | also, is there a good way to use a library only at compile-time? |
| 16:15 | arrdem | Fare: TL;DR no |
| 16:15 | amalloy | i mean, the same reason not to use anything. the default, for all x, is to not use x; you only use x if there's a reason :P |
| 16:16 | noprompt | like i'm pretty sure 1000s of people aren't going to be depending on something i haven't even made known to the public. as if people are sitting on pins and needles waiting for me to push my next clojure smash hit. |
| 16:16 | noprompt | amalloy: so do i email our techno friend? |
| 16:16 | amalloy | Fare: use it only at compile time? that might be viable if it were 100% macros, but i don't think there are very many such libraries |
| 16:17 | noprompt | hang out in IRC and wait for him to show up? |
| 16:17 | johnwalker | is there an eof literal in clojure? |
| 16:17 | amalloy | noprompt: *shrug* i just see people hang out in irc |
| 16:17 | amalloy | but of course more people may be emailing him; i don't read all of those |
| 16:17 | noprompt | the clojure community has a weird "addiction" to IRC. |
| 16:17 | noprompt | it's a bubble. |
| 16:17 | arrdem | (nsa-logs-authed? 'amalloy) |
| 16:17 | Fare | amalloy: well, for instance core.match. Also, I'm interested in using instaparser at compile-time only to generate some data. |
| 16:17 | amalloy | noprompt: you could sell irc short |
| 16:17 | noprompt | shit goes down in here that people don't get a chance to talk about on the ML. it's lame. |
| 16:18 | technomancy | noprompt: I'm on the phone, but I can get this deleted as soon as this call ends. |
| 16:18 | amalloy | if you think the market is in a bubble |
| 16:18 | technomancy | there is also contact@clojars.org |
| 16:19 | noprompt | technomancy: i think that was more of what i was looking for. i didn't want to think of you as some kind of hotline that i could just walk in here and make demands. :) |
| 16:19 | amalloy | i would be surprised, Fare, to discover that core.match is 100% macros. it probably also defines some functions that it causes you to call at runtime |
| 16:19 | technomancy | noprompt: there have been suggestions to allow deletions of zero-download jars |
| 16:19 | technomancy | but suggestions are not patches |
| 16:20 | noprompt | amalloy: i like irc. i miss it in fact. my job doesn't give me the time to be here though during the day. which is why i get frustrated by the exclusive IRC attitude i've seen since i started programming in clojure a year and a half ago. |
| 16:20 | noprompt | technomancy: that's fair. |
| 16:22 | noprompt | technomancy: i'll fork/clone the repo now and spike on something as soon as i have a chance. i didn't realize it was a pain point until about 15mins ago. |
| 16:22 | amalloy | for example, Fare, clojure.core.match/val-at* is a function dnolen_ apparently includes to be slightly different from get in some way, which he uses when matching against maps |
| 16:22 | Fare | ok |
| 16:23 | Fare | so, that would be: using instaparser in a macro |
| 16:24 | Fare | I suppose that's ok to include instaparser in the jar even if not used at runtime |
| 16:25 | noprompt | technomancy: do i need to add a special email subject? |
| 16:26 | technomancy | noprompt: just make it clear that it's about sensitive data vs a typo or something |
| 16:30 | bracki | How can I turn on NSCA formatted request logging when using the ring-jetty-adapter? |
| 16:32 | noprompt | technomancy: this is code that belongs to the company. |
| 16:35 | johnwalker | in clj-http, is there a way to do --data-binary like in curl? |
| 16:36 | dakrone | johnwalker: you can send a byte array in {:body my-byte-array} |
| 16:37 | johnwalker | ahh, nice dakrone |
| 16:48 | bacon1989 | I'm finding it really hard to find an example of reading an input stream using a buffer |
| 16:48 | bacon1989 | there's an example here http://stackoverflow.com/questions/7756909/in-clojure-1-3-how-to-read-and-write-a-file |
| 16:48 | bacon1989 | but it's using line-seq, my string doesn't have any 'lines' |
| 16:48 | bacon1989 | it's a giant base64 dump |
| 16:49 | bacon1989 | so I think the slurp function is failing to grab the entire contents of my output, because it's truncating after a certain amount of time |
| 16:49 | bacon1989 | (assuming it's using line-seq) |
| 16:58 | Fare | is anyone here going to ILC'2014, Aug 15-17 in Montreal? |
| 16:58 | Fare | I'd like to organize a panel there, and someone who knows more clojure than I would be welcome to participate. |
| 17:04 | gfredericks | $google ILC 2014 |
| 17:04 | lazybot | [International Liver Congress 2014: ILC 2014] http://www.ilc-congress.eu/ |
| 17:06 | Fare | http://international-lisp-conference.org/ |
| 17:06 | TEttinger | that makes more sesne |
| 17:06 | TEttinger | sense |
| 17:07 | gfredericks | would love to be invited to the liver congress as a clojure expert |
| 17:12 | technomancy | as the owner and operator of a liver you should be uniquely qualified |
| 17:13 | arrdem | heh |
| 17:13 | gfredericks | technomancy: so insensitive of you to assume that everybody you talk to on the internet has a liver |
| 17:14 | TEttinger | ,"yeah!" |
| 17:14 | clojurebot | "yeah!" |
| 17:14 | technomancy | fine, *former* owner of a liver |
| 17:15 | gfredericks | experienced with livers |
| 17:21 | thecatwasfat | i'm getting an "OutOfMemoryError Java heap space" message when trying to generate prime numbers: http://pastebin.com/yahkLxai |
| 17:21 | rurumate | langohr seems complex enough to use stuartsierra-style component pattern, has anyone done that yet? |
| 17:21 | thecatwasfat | is it because i'm creating too many "nums" sequences that don't get discarded? |
| 17:25 | johnwalker | what is an alternative to clojure data xml? |
| 17:26 | johnwalker | actually, i bet there's something more like hiccup |
| 17:27 | halogenandtoast | Is there any benefit to (nth (:decks game) index) over ((:decks game) index)? given (:decks game) returns a Vector |
| 17:28 | amalloy | johnwalker: there's a function in c.d.xml that converts hiccupy sexprs into c.d.xml values |
| 17:28 | johnwalker | amalloy: is there one that converts c.d.xml values into hiccupy sexprs? |
| 17:29 | johnwalker | (does the opposite) |
| 17:30 | amalloy | johnwalker: i don't see one. really, working with hiccup values is awfully unpleasant: hiccup's notation exists because it's easy for humans to type in |
| 17:30 | amalloy | if you already have something in a nice computer-friendly format, why convert it to this hiccup soup? |
| 17:30 | johnwalker | hiccup soup looks nicer |
| 17:31 | johnwalker | and the pretty printed values use ( instead of [ |
| 17:31 | johnwalker | which kills the reader whenever you want to just store them as vars |
| 17:32 | amalloy | i don't understand your objections at all; but it's trivially easy to write a transformer to hiccup style yourself if you want |
| 17:34 | johnwalker | to be clearer, hiccup's vectors are convenient because [:h2 "aoeu"] doesn't try to call :h2 on "aoeu" |
| 17:34 | johnwalker | i am slightly annoyed that i can't use cider pprint directly on parsed xml |
| 17:35 | amalloy | unless you're eval'ing these things for some crazy reasno, neither does (:h2 "aoeu") |
| 17:35 | johnwalker | then there is an easy way to do (def foo (:h2 "aoeu")) unevaluated? |
| 17:35 | TimMc | johnwalker: Just throw a ' in front |
| 17:36 | TimMc | ,'(:h2 "aoeu") |
| 17:36 | clojurebot | (:h2 "aoeu") |
| 17:36 | amalloy | johnwalker: your use case is that you're printing things to stdout, and then copy/pasting them into vars? |
| 17:36 | johnwalker | but these are nested structures |
| 17:36 | johnwalker | yeah basically |
| 17:36 | TimMc | ,'(:h2 "aoeu" (:h2 "more")) ;; so? |
| 17:36 | clojurebot | (:h2 "aoeu" (:h2 "more")) |
| 17:37 | amalloy | well, at last we've gotten to the real problem, which is nothing to do with hiccup or xml |
| 17:37 | johnwalker | ,'(:h2 "aoeu (:h2 (for [i (range ...)] ..))) |
| 17:37 | clojurebot | #<RuntimeException java.lang.RuntimeException: EOF while reading string> |
| 17:37 | TimMc | johnwalker: Ah, so you'll be wanting ` and ~ |
| 17:38 | TimMc | &'(:h2 "aoeu" ~(str "a" "b") ~@(range 4)) |
| 17:38 | lazybot | ⇒ (:h2 "aoeu" (clojure.core/unquote (str "a" "b")) (clojure.core/unquote-splicing (range 4))) |
| 17:38 | TimMc | &`(:h2 "aoeu" ~(str "a" "b") ~@(range 4)) ;; whoops |
| 17:38 | lazybot | ⇒ (:h2 "aoeu" "ab" 0 1 2 3) |
| 17:38 | johnwalker | i am not a big fan of this solution |
| 17:38 | TimMc | johnwalker: Just so you know, though -- hiccup is prone to XSS. |
| 17:38 | ybit3 | if anyone has a bit of time to spare, i could use some help in getting this to compile: https://gist.githubusercontent.com/heath/406917c7d57c5fcf46fe/raw/54b6b30102e5706775dadd6b3d6e46c5e69d8295/gistfile1.txt |
| 17:39 | amalloy | copy/pasting printed forms back into source is never going to have a pretty answer |
| 17:39 | ybit3 | it compiles to incorrect js |
| 17:40 | amalloy | ybit3: you didn't even include the clojurescript you want help with! |
| 17:40 | johnwalker | cough homoiconicity |
| 17:41 | ybit3 | amalloy: it's from the clojurescript wiki entry "getting started" |
| 17:41 | ybit3 | i'll paste anyway |
| 17:41 | ybit3 | https://gist.githubusercontent.com/heath/7a242e1e9cbe643ebdf1/raw/fa9d69ea353ee0cf5bd3a15444e1806a7bc6c1f6/gistfile1.txt |
| 17:41 | johnwalker | i didn't know that hiccup had xss issues |
| 17:42 | johnwalker | thanks TimMc, amalloy |
| 17:42 | halogenandtoast | Aww I used lein-kibit hoping it would output a bunch of things I was doing wrong… got nothing :( |
| 17:42 | ybit3 | hm, let me remove the (ns.. at the bottom |
| 17:43 | ybit3 | (hsenv) is me copying/pasting incorrectly |
| 17:43 | sdegutis | Anyone using noprompt's garden lib? |
| 17:43 | sdegutis | I'm trying to figure out how to generate "tr:nth-child(2n)" without resorting to just using a string literal. |
| 17:43 | noprompt | yo |
| 17:43 | sdegutis | ohai |
| 17:43 | TimMc | johnwalker: Most HTTP templating libs do (and not just in Clojure-land.) |
| 17:44 | sdegutis | noprompt: is this possible? |
| 17:44 | TimMc | I think ato has a patch that fixes it by introducing RawString. |
| 17:44 | noprompt | sdegutis: yeah, i mean a string literal is fine, what else would you use? |
| 17:45 | johnwalker | ahh, i'll keep an eye out for that |
| 17:45 | sdegutis | noprompt: there's just so many utility functions to generate stuff, I thought maybe I was overlooking something |
| 17:45 | noprompt | sdegutis: i have some work on a branch for *way* better selectors but i haven't merged it yet. |
| 17:45 | sdegutis | ok |
| 17:46 | noprompt | sdegutis: for that one (defn nth-child [n] (format "&:nth-child(%i)" n)) |
| 17:47 | noprompt | sdegutis: i realize there's a lot of missing stuff in the library and i've been encouraging people to send me patches. |
| 17:47 | TimMc | johnwalker: https://github.com/ato/clojars-web/blob/master/src/clojars/web/safe_hiccup.clj although you still have to watch out for ring accepting multiple args as a coll of strings, I think... |
| 17:47 | noprompt | i only have so much time in the day and i appreciate that sort of thing. |
| 17:47 | ybit3 | here's a better paste showing directory and file contents as well as compiler output |
| 17:47 | ybit3 | https://gist.githubusercontent.com/heath/7ce8a379c5840bf734ac/raw/ea45b6ddb21c990074a3d2ea51a326bafda41b56/gistfile1.txt |
| 17:50 | sdegutis | noprompt: it suffers from the problem of "good enough" |
| 17:50 | sdegutis | noprompt: also a project ive been working on just got suddenly popular and i cant step away from the computer for 5 minutes without getting 10 feature requests |
| 17:51 | noprompt | sdegutis: unfotunately, it isn't, imho. i've been pretty unhappy with it for a while. i just haven't been able to merge in some of the work i've been doing in silence. |
| 17:51 | noprompt | sdegutis: which project? |
| 17:51 | sdegutis | noprompt: my osx window manager |
| 17:51 | noprompt | sdegutis: oh neat, which is it? |
| 17:51 | sdegutis | someone caught sight of it this weekend https://github.com/sdegutis/hydra/ |
| 17:52 | sdegutis | its not the one that can be scripted in clojure.. that ones deprecated ;) |
| 17:52 | noprompt | sdegutis: this looks good! i've been using spectacle for a while, i should give this a shot. |
| 17:53 | johnwalker | TimMc: i'm really glad that i don't have to worry about ring lol |
| 17:53 | sdegutis | noprompt: :) |
| 17:53 | sdegutis | noprompt: if you run into anything, #hydrawm is a good place to get quick help |
| 17:53 | Jaood | sdegutis: you like atom? |
| 17:53 | sdegutis | Jaood: no sir, why? |
| 17:53 | Jaood | that green ball on dock looks looks like atom :P |
| 17:53 | sdegutis | heh |
| 17:54 | sdegutis | prolly limechat |
| 17:54 | noprompt | atom lol |
| 17:54 | sdegutis | youll also notice emacs there |
| 17:54 | technomancy | Tom Swift and his Atomic Text Editor |
| 17:54 | sdegutis | ohai technomancy |
| 17:54 | arrdem | technomancy: good grief it's been a long time since I heard that name... |
| 17:54 | technomancy | hihi |
| 17:55 | johnwalker | (inc dakrone) |
| 17:55 | lazybot | ⇒ 2 |
| 17:55 | Jaood | sdegutis: looks cool, always wonder why OS X never had the key strokes for resizing windows like on windows7 |
| 17:55 | johnwalker | (inc amalloy) |
| 17:55 | lazybot | ⇒ 141 |
| 17:56 | johnwalker | (inc TimMc) |
| 17:56 | lazybot | ⇒ 62 |
| 17:56 | sdegutis | Jaood: thx |
| 17:56 | Frozenlock | Jaood: because Mac users can't handle more than 1 window at the time. /troll |
| 17:57 | noprompt | hahahaha |
| 17:58 | noprompt | OS X also has keyboard navigation disabled *by default* which is kinda lame. |
| 17:58 | sdegutis | wait there's keyboard navigation? |
| 17:58 | sdegutis | what kind do you mean? |
| 17:58 | noprompt | even my mom knows how to use the tab key to get to the cancel button. |
| 17:58 | technomancy | Frozenlock: if you can't even handle two mouse buttons then keyboards must look bewildering |
| 17:58 | sdegutis | oh yeah that |
| 17:58 | Frozenlock | loool |
| 17:58 | Frozenlock | Forgot about the mouse thing |
| 17:59 | bbloom | honestly, that keyboard navigation thing really screws up a lot of people |
| 17:59 | noprompt | i imagine it'll take a generation before people forget the whole mouse thing. |
| 17:59 | bbloom | they use the arrows or tab or whatever, then try to type, assuming the focus is in a textbox, and wind up submitting or canceling |
| 17:59 | sdegutis | technomancy: well users can use my window manager to pretend they have two mouse buttons, maybe |
| 17:59 | bbloom | i've watched it happen quite a few times with people who even know how to type, but aren't great at computers |
| 17:59 | sdegutis | ok bye |
| 17:59 | bbloom | i think textbox-only for keyboard nav is a perfectly reasonable default for a mass market machine |
| 18:00 | noprompt | bbloom: geez man. take me to court already. ;) |
| 18:01 | bbloom | it really sucks that our choices are polished lowest common denominator, unpolished lowest common denominator, and downright raw crap for experts |
| 18:01 | noprompt | i've been bitten by it though too so i guess your point is fair. |
| 18:10 | Frozenlock | I blame mobile for everything. |
| 18:11 | {blake} | Hey, all: I'm having trouble applying a function recursively. (It's here: https://www.refheap.com/87749). Basically, I've got a list of maps where each map has a single entry, but the key to that entry might be duped elsewhere in the list. So I draw out the key and put all the values of common keys together under one entry. Great--but now I want to do it with the resultant child lists. |
| 18:13 | bbloom | technomancy: i googled for engelbart's violin |
| 18:14 | bbloom | technomancy: at first, i was hesitant, since loper-os usually means insane incoherent ramblings of an old crank |
| 18:14 | bbloom | technomancy: but http://www.loper-os.org/?p=861 is actually pretty good |
| 18:14 | technomancy | haha, I know, right |
| 18:14 | technomancy | immediate "uh oh, not this guy again" reaction, but in this case it's unfounded |
| 18:15 | bbloom | i don't think you're crazy for making your own keyboard, although i wouldn't do it myself... |
| 18:15 | bbloom | but still, people give me shit over my kensis |
| 18:15 | TimMc | I also found this on loper-os: http://www.loper-os.org/wp-content/editors.png |
| 18:15 | mtd | =861 is actually pretty good |
| 18:15 | bbloom | ninesis, rather |
| 18:15 | mtd | ugh, sry |
| 18:15 | bbloom | i can't type |
| 18:15 | bbloom | kinesis |
| 18:15 | mtd | bbloom: ...rocks :) |
| 18:15 | bbloom | anyway, they are like "i wanted to try one of those, but they were so expensive".... dude, it's 300 bucks. your boss shouldn't bat an eye if you wanted to order one just to try it out |
| 18:16 | bbloom | you're gonna lose more than $300 in productivity the very first day you re-learn to type on it! |
| 18:16 | bbloom | people dont' want to invest in their tools |
| 18:16 | bbloom | it's nuts |
| 18:17 | Frozenlock | People or bosses? |
| 18:17 | bbloom | both |
| 18:17 | Frozenlock | everyone! :-p |
| 18:17 | technomancy | bbloom: the problem is once you realize everything is crap, you're stuck with it |
| 18:17 | arrdem | technomancy: ignorance truly is bliss :P |
| 18:17 | technomancy | bbloom: same with coffee, wine, PLs, etc |
| 18:17 | bbloom | lol |
| 18:18 | bbloom | i don't buy the idea that learnability isn't important tho |
| 18:18 | bbloom | software is unique in its adaptability |
| 18:18 | bbloom | you can create software that scales with its users |
| 18:18 | Frozenlock | bbloom: Sounds like Emacs |
| 18:18 | bbloom | w/o resorting to a ton of "preferences" and settings |
| 18:21 | technomancy | it's a ton easier if your users are programmers though |
| 18:21 | bbloom | technomancy: hey, i did my part in ensuring that *all* users are programmers ;-) |
| 18:21 | bbloom | gotta run tho, cya |
| 18:22 | technomancy | haha, yeah exactly |
| 18:22 | technomancy | the fact that there's a difference between "being a user of a computer" and "being a programmer" is really just a shortcoming of existing software |
| 18:23 | Frozenlock | Indeed. I think the title divide is an obstacle in itself. "I won't try this, I'm not a programmer..." |
| 18:23 | noprompt | i tend to agree |
| 18:23 | AimHere | technomancy, if that's the case, isn't software getting worse? |
| 18:23 | technomancy | AimHere: I don't know; I don't pay attention to software that isn't for programmers |
| 18:23 | arrdem | hahaha |
| 18:23 | technomancy | probably |
| 18:24 | noprompt | lol |
| 18:24 | AimHere | Well at one time there wasn't software that wasn't for programmers. Now there is. |
| 18:25 | Frozenlock | Everything's getting worse. Software, laws, TV... |
| 18:26 | Frozenlock | Except bacon. Bacon is always good. |
| 18:26 | turbofail | cars that no longer kill you. what's the world coming to? |
| 18:26 | sdegutis | noprompt: umm, just how much is the garden api going to change? |
| 18:26 | sdegutis | noprompt: because I'm currently putting in a lot of effort to convert our plain CSS to garden |
| 18:26 | sdegutis | noprompt: and I'd love to avoid doing this a second time |
| 18:27 | technomancy | increased resources result in greater breathing room, meaning more space in which things can flourish which would otherwise crash and burn from the weight of their own imperfection |
| 18:27 | technomancy | (independent of any value judgement) |
| 18:28 | Frozenlock | turbofail: I'm still waiting to see how this turns out... the biggest challenge might not be technical, but legal. |
| 18:30 | TimMc | Frozenlock: Yes, the question of liability becomes rather more front-and-center than it is with (say) mistakenly bounced email. |
| 18:31 | TimMc | turbofail: More like... cars that can kill you instead of drivers that can kill you. :-P |
| 18:32 | turbofail | i was actually more referring to how older cars would send the engine block through your torso instead of crumpling nicely |
| 18:32 | TimMc | Oh! Yeah, that's a nice thing. |
| 18:32 | TimMc | Although the '85 Volvo I learned to driv eon would apparently shunt the engine out the bottom instead... |
| 18:32 | clojurebot | I don't understand. |
| 18:33 | TimMc | This is not from first-hand experience, however -- just what I heard. |
| 18:33 | amalloy | hey, i learned on an 86 volvo. we're like twins! |
| 18:33 | TimMc | Did you also once run a lawn tractor into it? |
| 18:34 | amalloy | lawn...tractor? some sort of suburban farming implement? |
| 18:34 | TimMc | Riding lawn mower, but witha towing hitch on it IIRC. |
| 18:34 | TimMc | Basically. |
| 18:35 | TimMc | My dad ran a seed company on our 2 acre property. That machine got a lot of use, and not just for mowing. |
| 18:37 | tuft | tesla's have a nice crumple zone =) |
| 18:38 | TimMc | tuft: Your luggage? |
| 18:38 | amalloy | the ' in tesla's is serving as a crumple zone too |
| 18:40 | tuft | i'd rather have luggage in my lap than an engine block =) |
| 18:47 | tuft | wow, garden+clojurescript+hiccup would be some kind of nirvana =) |
| 19:08 | TEttinger | $google tesla stolen chase crash |
| 19:08 | lazybot | [Stolen Tesla involved in high speed chase, crashes, splits in two in ...] http://wgntv.com/2014/07/06/stolen-tesla-involved-in-high-speed-chase-crashes-splits-in-two-in-california/ |
| 19:08 | TEttinger | tuft: |
| 19:11 | tuft | woah |
| 19:12 | amalloy | hey, i lived just three or four blocks from that intersection a year ago |
| 19:13 | amalloy | how come i never got to see any exciting tesla crashes? |
| 19:13 | TEttinger | you wouldn't want to be near that guy... |
| 19:13 | TEttinger | so much collateral damage |
| 19:13 | p_l | didn't they recently claim you can't steal a tesla because of remote killswitch? |
| 19:14 | amalloy | you can't steal a tesla because it's illegal, silly |
| 19:14 | amalloy | (aside: tesla and steal use the same letters. coincidence? you decide) |
| 19:14 | p_l | amalloy: the line goes "coincidence? I think not" :P |
| 19:14 | amalloy | i think they both work |
| 19:14 | tuft | yeah you'd think they could kill it |
| 19:14 | tuft | probably off hours? |
| 19:15 | tuft | anyway, wonder how a gas car would have faired |
| 19:15 | p_l | tuft: lost reception :P |
| 19:15 | tuft | haha yeah |
| 19:15 | tuft | he was switching towers too fast |
| 19:15 | tuft | doing the ol' 4g shuffle |
| 19:15 | p_l | n.b. if you can get a tesla owner to install your certificate into trusted store on his iphone or android, you can then steal his credentials for the car |
| 19:15 | amalloy | 'A coincidence is actually a conspiracy without the "???? You decide!" at the end of it. Simply by adding "??? You decide!" any coincidence becomes a government conspiracy carried out by the Jews.' |
| 19:17 | tuft | glen beck "just asks questions" |
| 19:19 | sritchie | dnolen_: hey david, is there some way to apply the om.dom functions? |
| 19:19 | sritchie | (d/div {} "hi") vs (apply d/div {} [“hi”]) |
| 19:20 | sritchie | I see in dom.clj, gen-react-dom-fns makes it look like the generated funcs should do the trick |
| 19:20 | amalloy | sritchie: iirc there are foo* variants. i remember someone applying div* |
| 19:21 | sritchie | ah, looks like it works - I was calling om-tools.dom by accident |
| 19:21 | sritchie | which provides macro-only wrappers, I guess |
| 19:22 | cespare | How can I catch an exception in a macro? |
| 19:22 | amalloy | not div* then, just div. okay. maybe next time i'll remember |
| 19:22 | amalloy | cespare: same as anything. generate the code that works to catch exceptions outside of macros |
| 19:24 | amalloy | (defmacro with-dangerous-errors [& body] `(try (do ~@body) (catch Throwable t# (format-hard-drive))) |
| 19:25 | cespare | fair enough. I'm testing a macro and asserting that it rejects certain bad inputs |
| 19:25 | cespare | is this the right way to go about it? |
| 19:26 | amalloy | if you want to catch the exceptions at compile time, then you want to call macroexpand by hand, instead of letting the compiler do it |
| 19:26 | cespare | s/compile /run/ ? |
| 19:26 | amalloy | since you can wrap a try around that, but any try around an actual use of the macro will come "too late": when the code is run, rather than when it's compiled |
| 19:27 | amalloy | no |
| 19:27 | amalloy | you're saying your macro throws exceptions at compile time, if you give it an input it doesn't like |
| 19:28 | cespare | right. Wouldn't my new exception-catching macro wrapped around that work? |
| 19:28 | amalloy | no |
| 19:28 | amalloy | you throw the exception at compile time, but any try exprs wrapped around it are only in effect at runtime |
| 19:28 | amalloy | (try (fasfasgsdfs) (catch Exception e nil)) is still going to fail |
| 19:29 | amalloy | because it fails while compiling this nonsense symbol, long before the try block is actually entered, which is at runtime |
| 19:30 | cespare | ok, so i need the exception-catching macro and macroexpand? |
| 19:30 | amalloy | you don't need an exception-catching macro |
| 19:31 | amalloy | just (try (macroexpand '(...)) "no exception" (catch Exception e "exception")) |
| 19:31 | cespare | doesn't that macroexpand happen at runtime? |
| 19:32 | amalloy | yes, which is exactly when the try block is in effect |
| 19:32 | amalloy | and is when your tests are run |
| 19:32 | cespare | got it. so my s/compile /run from earlier was correct |
| 19:32 | cespare | you said compile time |
| 19:32 | cespare | which confused me |
| 19:33 | amalloy | it was too vague to be correct in any interesting way. the macro is throwing exceptions at compile time; you're catching them at runtime by actually calling it via macroexpand instead of via the compiler |
| 19:43 | {blake} | OK, so I'm creating a map of lists from a list of maps by drawing the common keys of the lists up and compiling all the values of those keys. At the top level, this works, but now I have to go to the created lists and do it again. Recurse, but going down instead of up. |
| 19:44 | {blake} | Here's what I have: https://www.refheap.com/87749 .I'm stumped on how to proceed. |
| 19:45 | amalloy | {blake}: you should at least include what output you wish you could get. "needing to do this with XYZ also" isn't very specific |
| 19:47 | {blake} | amalloy, Fair enough. Having collected the values for :L1 under one key, I want to collect all the value for :L2 under one key. And so on in that fashion until all humans have been eaten. |
| 19:48 | amalloy | {blake}: try writing out, as an actual clojure value that would be accepted by the reader, the result you want to get. i don't think it's as clear as you think |
| 19:48 | {blake} | OK, I updated https://www.refheap.com/87749 to show the next level. |
| 19:49 | {blake} | Well, wait, I could just output what I get when I do the call manually. |
| 19:50 | amalloy | what i'm getting at is, what are you going to do when the hierarchies diverge? you need some values "at" L2, and some to live "under" it in L3 somehow |
| 19:50 | amalloy | and how do you distinguish "stuff" from "L3" in the transformation, if the only arg you pass is sxml and not a list of keys you're interested in |
| 19:51 | {blake} | amalloy, If I do this: (draw-forward (val (first (draw-forward sxml)))) |
| 19:51 | {blake} | I get the desired result: {:L2 ({:stuff :data1} {:L3 ({:stuff :otherdata1})} {:stuff :data2} {:L3 ({:stuff :otherdata2})})} |
| 19:52 | {blake} | Except, of course, disassociated from the original structure. |
| 19:52 | tuft | ugh, i hate how args can be either named or position in python per invocation. really confuses matters when trying to make nice polymorphisms. |
| 19:52 | tuft | s/position/positional/ |
| 19:53 | amalloy | so, you say "I need to do this with :L2, :L3, etc", but then when i asked for the result you actually wish you got, you seem to have only done something with :L2. what do you wish happened with :L3? |
| 19:54 | {blake} | Well, I thought I would get the same thing for :L3 (and :stuff, for that matter). |
| 19:54 | {blake} | In other words: Give a list of single-entry maps, create a new map of the common keys' values aggregated together. |
| 19:55 | {blake} | Er, given. |
| 19:55 | amalloy | so you don't in fact want to distinguish between :Ln and :stuff at all; you intend them to be treated similarly |
| 19:56 | {blake} | amalloy, Right. I agree that's confusing, but I either want that stuff aggregated or dropped, so I'm not too worried about it. |
| 19:57 | amalloy | {blake}: the point i'm making is that having a clear, well-defined problem is important in asking for help, and one really good way to do that is to state what output you expect. we've spent ten minutes now going back and forth over your original question because you haven't put your actual goal into it |
| 19:58 | amalloy | in that time, a well-defined problem could already be solved |
| 20:00 | {blake} | amalloy, I apologize. I thought my goal of aggregating the common keys was clear. But then, if I weren't confused in some fashion, I probably wouldn't need help. |
| 20:01 | {blake} | (Like, I tried resolving that last layer manually and am getting an error, and I can't see why.) |
| 20:01 | amalloy | {blake}: right. things can seem clear to you, and it's hard to know what will actually be clear or not. that's why i suggest writing down something concrete, like a clojure value, because that's harder to misinterpret |
| 20:02 | {blake} | amalloy, Yeah, I had that earlier on, but took it out because it seemed more confusing to me than "do this again". Go figure. |
| 20:05 | {blake} | So that "draw-forward" code fails when there's multiple keys. |
| 20:05 | amalloy | {blake}: https://www.refheap.com/df790a776292225c5e0a374ab |
| 20:07 | amalloy | i hereby declare it undefined behavior if you give my function input like '({:L1 x}, {:L1 ({:L2 x})}), though - it wants a consistent hierearchy |
| 20:08 | amalloy | seq->deep-map is your draw-forward function, in case that's not clear |
| 20:09 | {blake} | amalloy, I got that. Just looking at and trying to figure it out. |
| 20:10 | amalloy | the idea is to traverse that seq of seqs of maps, producing a seq like [[:L1 :L2 :stuff :data1] [:L1 :L2 :stuff :data2]], and then reduce over that seq to build a map |
| 20:11 | {blake} | amalloy, Thanks...right, and I toyed with doing a test for a sequence vs. map. |
| 20:11 | amalloy | yeah, i wasn't sure how structured your input data is, so glossing that distinction over was easiest |
| 20:12 | {blake} | I =think= it's more structured than my actual samples, but since it's not my data, I was erring on the cautious side. |
| 20:13 | cespare | Why does this test pass in my repl but fail under 'lein test'? http://pastie.org/9365787 |
| 20:13 | cespare | amalloy: ^^ related to prior discussion |
| 20:13 | {blake} | (inc amalloy) |
| 20:13 | lazybot | ⇒ 142 |
| 20:13 | seangrove | (dec amalloy) ;; keep egos in check |
| 20:13 | lazybot | ⇒ 141 |
| 20:13 | seangrove | (inc amalloy) ;; but just can't do it, really |
| 20:13 | lazybot | ⇒ 142 |
| 20:13 | seangrove | (inc amalloy) ;; and a bit more |
| 20:13 | lazybot | ⇒ 143 |
| 20:13 | amalloy | ,(symbol "(inc amalloy)") |
| 20:13 | clojurebot | (inc amalloy) |
| 20:14 | amalloy | aw. i forgot we fixed that |
| 20:14 | seangrove | Yeah, looooong time a go |
| 20:14 | {blake} | What would it do? |
| 20:14 | amalloy | i dunno, cespare. seems it should pass in any conceivable universe |
| 20:15 | cespare | amalloy: my coworker can repro as well. |
| 20:15 | amalloy | {blake}: it was a trick to get clojurebot to inc your karma by proxy, since lazybot won't let you do it |
| 20:15 | cespare | expected: (thrown? Exception (macroexpand-1 (quote (foobar)))) actual: nil |
| 20:15 | {blake} | So, sort of like manipulating your divorced parents. |
| 20:16 | amalloy | cespare: is foobar actually in scope? if you're not referring it into your test namespace, then (foobar) just expands to (foobar) |
| 20:16 | cespare | amalloy: in my toy example it's defined literally right above the test |
| 20:17 | amalloy | hmmmm. i'm not sure what namespace tests are run "in". probably clojure.core. try replacing the ' with a ` |
| 20:17 | cespare | amalloy: ok. I'm also just gonna print what it expands to; that'll probably show the issue you're talking about. |
| 20:22 | cespare | amalloy: you were correct, thanks |
| 20:27 | amalloy | cespare: it's easy to forget how macroexpand works, since it's usually only called from the repl. i certainly had |
| 20:29 | PigDude | so i came in asking about this a couple days ago ... using core.async, why don't i see stacktracess? |
| 20:29 | PigDude | any error in a go block i only see the error message, no line number or stack trace. my program does not handle any exceptions |
| 20:29 | PigDude | i usually can infer the error site but it is still a pain, line numbers are nice and i know the information is there |
| 20:30 | amalloy | PigDude: there's an old commit to core.async that added this "feature"; stuartsierra was in here last week vowing to fix it |
| 20:31 | PigDude | so is there any way to get at this info? |
| 20:31 | PigDude | just curious |
| 20:34 | PigDude | or maybe if you know the commit sha i could look at what changed and figure it out from there |
| 20:35 | amalloy | https://github.com/clojure/core.async/commit/9fcae99576c0735a804bbd4cbec81307e2d34d90#diff-2193dd8597437d6454bb74edd2f15e00L26 |
| 20:36 | PigDude | noooooo haha |
| 20:36 | PigDude | thank you amalloy |
| 20:38 | arrdem | so given core's propensity for making things that could be public private... why is this gem public and is it patch worth.. http://www.arrdem.com/grimoire/1.6.0/clojure.data/diff_DASH_similar/ https://github.com/clojure/clojure/blob/master/src/clj/clojure/data.clj#L75 |
| 20:41 | amalloy | what would you want to patch about it? |
| 20:42 | arrdem | meh... the "real" fix is that you change extend so that it doesn't kick out defs here, but that doesn't make sense. not enshrining diff in core would be my "real" fix :P |
| 20:59 | startling | Any idea why the functions in tools.logging print things prefixed with clojure.tools.logging$eval4837$fn__4843 invoke ? |
| 21:14 | halogenandtoast | Is there any difference between (nth coll 1) and (coll 1)? |
| 21:14 | halogenandtoast | functionality wise, not syntax wise of course. |
| 21:15 | sritchie | nth works with all seqs, |
| 21:15 | sritchie | I think (coll 1) only works with vectors |
| 21:16 | sritchie | halogenandtoast: also, (coll 1) will still “work” with a map, it’ll just return the value associated with 1, or nil |
| 21:17 | halogenandtoast | Okay, makes sense. |
| 21:18 | dbasch | (coll 1) works with colls that implement IFn |
| 21:19 | dbasch | and it means different things depending on coll's type |
| 21:45 | devn | oh whoa, cool |
| 21:45 | devn | some interesting commits by rich on core.async |
| 21:45 | devn | https://github.com/clojure/core.async/commit/99d2ffbb22f57b29a41220cfb292e4c286037e46 |
| 21:45 | devn | I missed those |
| 22:22 | Shayanjm | So in my application, I have to do _a lot_ of scraping + parsing (grabbing about 40 pages at a time & performing NLP sentiment analysis on the contents), which obviously takes quite a few resources and time |
| 22:22 | Shayanjm | Is there a good framework where I can run computationally expensive functions on small external boxes? |
| 22:29 | TEttinger | mechanical turk |
| 22:33 | ttasterisco | Shayanjm: I probably don't know the answer to your question, but would like to know what exactly are you looking for? |
| 22:33 | ttasterisco | i.e. a good framework? |
| 22:34 | Shayanjm | ttasterisco: essentially, I'm grabbing a bunch of data and applying a number of functions to it to transform it in a few ways before it's actually consumed |
| 22:35 | Shayanjm | the total overhead to grab the data from a limited number of sources is getting a bit out of control on a single box (some 2.5GB memory usage + function takes >2 mins to run) |
| 22:35 | ttasterisco | yes, but what do you mean by a framework to run computationally expensive functions on small external boxes? talking without knowing, but wasn't that the whole point of google's map reduce? :p |
| 22:35 | Shayanjm | ehh, yes. I mean I could use hadoop but I don't really need the distributed storage half of it |
| 22:35 | TEttinger | ah, you just need the processors and RAM |
| 22:36 | Shayanjm | Yeah precisely |
| 22:36 | Shayanjm | and the IPs at that, since it's scraping as well |
| 22:36 | TEttinger | there's gotta be an AWS thing from amazon |
| 22:36 | Shayanjm | Yeah maybe |
| 22:37 | ttasterisco | is your sentiment analysis self contained or are you hitting some service of yours in some other box? |
| 22:37 | Shayanjm | self contained |
| 22:37 | TEttinger | https://aws.amazon.com/documentation/ec2/ ? |
| 22:37 | Shayanjm | it runs on a trained neural net, so if I do end up building a distributed solution I'd need to figure out a way to persist that NN to all nodes |
| 22:38 | Shayanjm | TEttinger: EC2 is all well and good, but I'd need an interface between the servers. They're not clustered by default |
| 22:38 | TEttinger | ah... |
| 22:38 | TEttinger | botnet? |
| 22:38 | Shayanjm | Yeah something like that lol |
| 22:38 | Shayanjm | I'd need some sort of master-slave set up |
| 22:38 | Shayanjm | maybe I'll just bake my own with RabbitMQ then... |
| 22:38 | TEttinger | I'm sure some russians would be happy to give you one, in exchange for an unspecified future favor |
| 22:39 | ttasterisco | Shayanjm: I would probably try and reorganize the architecture of the system. queueing things and all |
| 22:39 | Shayanjm | ttasterisco: the organization isn't the problem because the NLP functions are long-running by default |
| 22:39 | Shayanjm | a lot of things -have- to exist in memory at a time because each piece of information builds on the other |
| 22:40 | TEttinger | how much memory does each box need? |
| 22:40 | ttasterisco | is the scraping/parsing shouldn't be that demanding |
| 22:40 | ttasterisco | *no is |
| 22:40 | Shayanjm | ttasterisco: neither of them are. It's the sentiment analysis part of it |
| 22:40 | ttasterisco | is it logic dependent on the SA |
| 22:40 | ttasterisco | ? |
| 22:40 | Shayanjm | Nah. SA is dependent on the results of a few transforms |
| 22:40 | Shayanjm | well, the stuff that feeds into the SA function |
| 22:41 | Shayanjm | TEttinger: good q. Right now I'm running it off my MBP with 2GB alloc |
| 22:41 | ttasterisco | what are you scraping, if I might ask |
| 22:41 | ttasterisco | NYT? |
| 22:41 | Shayanjm | ttasterisco: a bunch of news sources, not just NYT |
| 22:41 | TEttinger | comments on youtube? |
| 22:41 | ttasterisco | ok |
| 22:42 | Shayanjm | currently on the list: BBC, NPR, Reuters, CNN, AP, NYT, The Guardian |
| 22:42 | Shayanjm | planning on adding much more, but already hitting a little bit of a roadblock |
| 22:43 | Shayanjm | arguably, I could reduce total memory allocation to the 'slave' nodes by persisting the trained NN state to something centrally visible |
| 22:43 | ttasterisco | I mean, if you would reorganize the system and assuming there's no big requirements, you could just get a few boxes scraping/parsing and dumping things into a queue and have some other boxes consume it and do the SA |
| 22:43 | ttasterisco | but that's just me thinking loud |
| 22:44 | TEttinger | I'm curious if you could distribute it across some really cheap linux devices. |
| 22:44 | Shayanjm | That would be interesting TEttinger |
| 22:44 | Shayanjm | I imagine spinning up an environment would be fairly expensive for the device though |
| 22:44 | TEttinger | clojure runs on ARM linux, right? |
| 22:57 | Frozenlock | Are there timeouts with ring? Say I upload something via a post request, will ring cut me out after a given time? |
| 23:05 | dbasch | Frozenlock: if you're uploading something via a post request, ring will not know until you're finished with the post. The web server may cut you out before that. |
| 23:06 | dbasch | Frozenlock: ring receives the request from the web server |
| 23:07 | cespare | Suppose I have records R1 and R2, and R1 is defined as (defrecord R1 [^R2 f]). Suppose I have a macro that operates on record instances, and I pass in r (an R1). How can I discover that (.f r) is an R2? |
| 23:07 | seancorfield | I'm starting to look at ZeroMQ (it's been on my list for a while!) and see there's a "standard" Clojure library, cljzmq, which seems to be "just" a wrapper around the Java API, and there's zmq-async from Kevin Lynagh, which wires ZeroMQ up to core.async which looks very interesting |
| 23:08 | Frozenlock | dbasch: o_O I always believed ring WAS the webserver (and compojure just some sugar on top). |
| 23:08 | akhudek | seancorfield: why not higher level message queues such as hornet or rabbit? |
| 23:08 | seancorfield | akhudek: because I don't want to deal with the whole server/broker/clustering crap shoot mostly :) |
| 23:09 | dbasch | Frozenlock: the default web server is jetty |
| 23:10 | wildnux | Hi, how can i check what packages are loaded in repl in current namespace |
| 23:10 | Frozenlock | The tower of abstraction is collapsing all over my me |
| 23:11 | Frozenlock | So if I get this right, *if* I eventually get a timeout, it will be from jetty. Correct? |
| 23:11 | seancorfield | I like the idea of just using core.async in my code and having it "magically" spin off to ZeroMQ, but it's not entirely clear what state Kevin's library is in... |
| 23:11 | ttasterisco | Frozenlock: jetty or any other webserver you use. e.g. you can use http-kit |
| 23:11 | dbasch | ,(all-ns) ;; wildnux |
| 23:11 | clojurebot | (#<Namespace clojure.uuid> #<Namespace user> #<Namespace clojure.core> #<Namespace sandbox> #<Namespace clojure.repl> ...) |
| 23:12 | puredanger | (loaded-libs) |
| 23:12 | akhudek | seancorfield: as far as I know zeromq is pretty low level and so you lose a lot of stuff such as durability etc. Guess it depends on your needs though. |
| 23:12 | wildnux | dbasch: thank you |
| 23:13 | dbasch | wildnux: that's namespaces, if you want libraries it's what puredanger said |
| 23:13 | ttasterisco | ,(loaded-libs) ; does this work here? |
| 23:13 | clojurebot | #{clojure.core.protocols clojure.instant clojure.java.io clojure.repl clojure.string ...} |
| 23:13 | wildnux | puredanger: thank you, |
| 23:13 | puredanger | either may be useful :) |
| 23:13 | ttasterisco | ;nice |
| 23:13 | seancorfield | akhudek: but you haven't actually used ZeroMQ I gather? |
| 23:13 | seancorfield | it would be nice to get input from someone who has |
| 23:14 | akhudek | seancorfield: nope, we use rabbitmq which we are more or less happy with. There are some annoyances regarding administering the server though. |
| 23:14 | seancorfield | preferably someone who's used both the "official" cljzmq wrapper and zmq-async - and who has previously used more traditional MQ style solutions |
| 23:15 | hellofunk | anyone have any advice on using several tiny, focused atoms vs one large deeply nested atom? which would be better performant or better in practice? i'm using clojurescript if that matters. |
| 23:15 | ztellman | seancorfield: what are you trying to accomplish? |
| 23:15 | ztellman | typically ZeroMQ is a nicer TCP |
| 23:15 | seancorfield | akhudek: I've worked with FioranoMQ and ActiveMQ quite a bit in the past - which is why I'm trying to avoid that sort of thing now :) |
| 23:15 | ztellman | comparing it to any other "queue" is basic apple to overengineered orange |
| 23:16 | seancorfield | ztellman: yeah, mostly I want a flexible way to communicate between processes (possibly locally, possibly distributed) |
| 23:16 | Frozenlock | hellofunk: I usually prefer using many atoms. It helps my small brain and I can more easily print/save it if needed. |
| 23:16 | ztellman | seancorfield: how mission-critical are the messages? |
| 23:17 | puredanger | hellofunk: you can't coordinate changes across multiple atoms (all or nothing). not necessarily a problem for many use cases though. |
| 23:17 | seancorfield | ztellman: some are fairly mission-critical (nothing financial tho'), some are really just aggregate log data |
| 23:17 | Frozenlock | hellofunk: If you want to use tools like this one, you should use smaller atoms. https://github.com/alandipert/storage-atom |
| 23:17 | ztellman | seancorfield: if you care about guaranteed delivery, don't use ZeroMQ |
| 23:17 | hellofunk | Frozenlock thanks, that's what I'm doing now (many smaller atoms) |
| 23:17 | ztellman | and if you use something other than ZeroMQ for those messages, better to piggyback on that for less important messages unless you everwhelm it |
| 23:17 | ztellman | overwhelm* |
| 23:19 | seancorfield | ztellman: my processes are pretty much 100% up so i'm not worried about durability in that respect but delivery guarantees would be rather useful :) |
| 23:19 | ztellman | processes being alive != durability |
| 23:19 | hellofunk | Frozenlock that web storage stuff seems pretty interesting, had not heard of that before |
| 23:20 | ztellman | or rather, without guaranteed delivery the processes being alive doesn't give you much |
| 23:20 | ztellman | I'd look at Rabbit et al, honestly |
| 23:20 | ztellman | even though they're kinda ungainly and typically pretty overengineered |
| 23:21 | Frozenlock | hellofunk: It's pretty sweet for cross-windows propagation. Here, try this small demo https://peaceful-caverns-2604.herokuapp.com/ |
| 23:21 | seancorfield | ztellman: any good clojure library to make jms less painful to work with? |
| 23:21 | Frozenlock | (in many windows) |
| 23:21 | ztellman | seancorfield: dunno, not something I've had to tangle with |
| 23:22 | seancorfield | ztellman: I thought you'd done stuff with distributed messaging...? |
| 23:22 | ztellman | not using JMS |
| 23:23 | seancorfield | ah, aleph, is "just" async messaging over a variety of protocols...? |
| 23:23 | ztellman | aleph is TCP, UDP, HTTP |
| 23:23 | ztellman | plus a few others that are small layers atop those |
| 23:24 | dbasch | seancorfield: Kafka comes with a java client |
| 23:24 | seancorfield | ztellman: so no guaranteed delivery there either... fair enough... |
| 23:25 | wildnux | puredanger: if there are multiple namespaces loaded in repl, does (loaded-libs) show from all of them or just the current one? |
| 23:25 | seancorfield | dbasch: hadn't heard of Kafka... will take a look thanx! |
| 23:25 | puredanger | wildnux: |
| 23:26 | puredanger | wildnux: it shows all namespaces ever loaded |
| 23:27 | puredanger | wildnux: I'm guessing when you say "multiple namespaces loaded in repl" maybe you mean "namespaces that have been 'use'd such that their vars can be used without qualifying"? |
| 23:29 | wildnux | puredanger: I am very new :D forgive me if my questions dont make any sense. lets say i loaded a repl, i tried a few expressions in user namespace |
| 23:30 | puredanger | wildnux: no worries. :) |
| 23:30 | wildnux | patrickod: and then i loaded another namespace from the app.clj i am working on (in emacs cider using C-c M-n) |
| 23:30 | wildnux | puredanger: ^^ |
| 23:31 | wildnux | puredanger: and if i do (loaded-libs) will it show libraries that is loaded by repl by itself or only the libraries loaded because of my app.clj ? |
| 23:31 | puredanger | wildnux: (you might find this video to be useful http://www.infoq.com/presentations/Clojure-Namespaces-Vars-Symbols ) |
| 23:32 | puredanger | when you want to dig deeper |
| 23:32 | wildnux | puredanger: thank you i will certainly watch it. I have been watching youtube videos to learn clojure |
| 23:32 | puredanger | Clojure keeps track of all the namespaces that have been loaded - that's (loaded-libs) |
| 23:33 | puredanger | you also have a "current" ns - typically that's what your repl says or just look at special var *ns* |
| 23:33 | puredanger | a namespace has vars defined in it (things you created with def or defn mostly) - the fully qualified names of those vars is the current-ns/the-var |
| 23:34 | seancorfield | dbasch: Kafka looks interesting - thanx - and not too horrible to manage a cluster of :) |
| 23:34 | puredanger | so if you (def a 1) in user namespace, you created a var referred to by user/a |
| 23:35 | puredanger | you can refer to vars in namespaces outside your current namespace by using the fully-qualifeid named (things like clojure.string/join) |
| 23:36 | puredanger | for that to work, the namespace has to be loaded (either already compiled or as source and compiled) - that's what "require" does |
| 23:36 | puredanger | you can also ask to bring all of another namespaces vars into your own namespace so they don't need to be qualified. that's what "refer" does |
| 23:37 | puredanger | you may also have seen "use" (generally considered deprecated in the ns macro, but still useful at the repl) - use will require (load the library) and also refer all of the other namespaces symbols into the current ns |
| 23:39 | puredanger | wildnux: hopefully any of that helped expose a little of the underlying model. when you switch to the the app ns, you are just changing *ns* and everything now is in terms of the app ns. vars declared in app available without qualification. if the app ns referred in other namespaces, their vars might also be available without qualification. Any loaded library var is available fully-qualified. |
| 23:41 | hellofunk | anyone know what namespace dissoc-in resides in now? used to be contrib.core but i believe the contrib libraries are deprecated? |
| 23:43 | puredanger | hellofunk: it's not in core. you could get it from medley: https://github.com/weavejester/medley |
| 23:44 | hellofunk | puredanger: ok. i thought the "old" contrib libraries were migrated to other clojure org libraries, but maybe not all were |
| 23:44 | puredanger | hellofunk: not everything |
| 23:46 | wildnux | puredanger: wow, that made it all clear |
| 23:46 | wildnux | puredanger: your explanation. |
| 23:50 | hellofunk | puredanger: i added the medley dependency, restarted cider, then tried this: (refer 'medley.core) but it indicated there was no such namespace |
| 23:51 | hellofunk | puredanger: nevermind, forgot to load it. got is all now. |
| 23:52 | hellofunk | *it |
| 23:53 | puredanger | wildnux: there are a bunch of functions to explore various aspects of a particular namespace's state - they all start with "ns-" so use (find-doc $"ns-") to see them. most take a namespace so use *ns* for that. happy exploring. |
| 23:54 | Frozenlock | ,(find-doc $"ns-") |
| 23:54 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: $ in this context, compiling:(NO_SOURCE_PATH:0:0)> |