2015-02-13
| 18:14 | rhg135 | edit the output of (into {} (for [[s v] (ns-publics 'clojure.core)] [s (deref v)])) |
| 18:14 | justin_smith | that's one way to do it, heh |
| 18:29 | nicferrier | anyone know about logging? |
| 18:29 | justin_smith | nicferrier: timbre makes it pretty easy |
| 18:29 | nicferrier | I'd like to alter the format of my logging messages... seems to be less popular than in java |
| 18:30 | nicferrier | justin_smith: I guess I'll look. I'm a bit worried about dependencies... |
| 18:30 | justin_smith | the deps list on timbre is really small |
| 18:31 | justin_smith | anyway, you can also use properties files or xml and use the standard java logging config |
| 18:31 | justin_smith | but timbre is much more clojure-friendly |
| 18:32 | nicferrier | timbre does look good. I didn't mean I was worried about timbre's deps. but about me adding deps. |
| 18:33 | nicferrier | I am inside a regulated environment where they regulate the software we use. |
| 18:33 | nicferrier | which means I have to have every tiny bit of code I use approved. |
| 18:33 | nicferrier | which means I am sad and angry a lot of the time. |
| 18:33 | justin_smith | oh, I can imagine |
| 19:28 | raspasov | does anyone know if using (apply + [1 2 3]) has a performance overhead compared to pure (+ 1 2 3) |
| 19:28 | raspasov | ? |
| 19:29 | justin_smith | raspasov: check out the source for + |
| 19:29 | hiredman | yes |
| 19:29 | raspasov | justin_smith: I'm talking about any IFn in general, not only + |
| 19:29 | raspasov | i.e. is the performance overheard "just" the creation of the vector, or there's more? |
| 19:30 | justin_smith | raspasov: different functions handle multiple args differently, but apply by itself does not have a very large overhead |
| 19:30 | raspasov | justin_smith: ok, thanks, I guess I should benchmark (as always) lol |
| 19:31 | justin_smith | yeah, can't hurt to throw your code at criterium/bench |
| 19:31 | cddr | nicferrier: Congrats on sneaking clojure into that environment |
| 19:32 | nicferrier | cddr: thanks. |
| 19:32 | nicferrier | we are sneaking too. |
| 19:36 | nicferrier | still not many examples of how to configure a log instance with timbre |
| 19:36 | nicferrier | lots on the logging config... nothing on how to do it. |
| 19:37 | justin_smith | nicferrier: timbre/set-config! |
| 19:37 | nicferrier | yeah... but I want to change the format of the logger. no example. |
| 19:37 | justin_smith | and that config ends up altering the behavior of logging |
| 19:37 | justin_smith | it's a single global atom |
| 19:37 | nicferrier | this is a stackoverflow world. I need to cut and paste. |
| 19:37 | nicferrier | :-) |
| 19:37 | justin_smith | haha |
| 19:39 | nicferrier | gotta crash now anyway. too tired to work it out. |
| 20:05 | raspasov | just saw this for the first time: java.lang.IllegalArgumentException: fns taking primitives support only 4 or fewer args |
| 20:05 | raspasov | any idea why that is? :) |
| 20:06 | justin_smith | raspasov: combinatorial explosion of required declarations in the java source |
| 20:06 | justin_smith | so you are limited to 4 |
| 20:06 | raspasov | makes sense :) |
| 20:18 | justin_smith | raspasov: you can see something similar for java methods that support primitives - each combo of primitives must be a separate method declaration |
| 20:19 | raspasov | justin_smith: thanks |
| 22:11 | vas | so I have been working on an app using compojure and ring and it's going pretty well, but every time I change an HTML file it seems like I must restart my server. Or do these automagically refresh and it's just the browser at fault? |
| 22:12 | justin_smith | vas: you are refreshing the pages but not seeing the new content? |
| 22:13 | vas | truth |
| 22:13 | ianhedoesit | do you have any errors in the program? |
| 22:13 | justin_smith | vas: how do you start the ring server? |
| 22:14 | vas | justin_smith: lein ring server-headless |
| 22:14 | justin_smith | vas: typically what is needed is to use #'handler instead of handler as the argument passed to the ring server on startup |
| 22:14 | vas | justin_smith: interesting. i've seen that in some source but didn't know what it was for. |
| 22:14 | vas | ianhedoesit: i love your question, but i'm afraid i can't answer it. xD |
| 22:14 | justin_smith | vas: but this won't matter if you are using lein-ring |
| 22:15 | justin_smith | vas usually lein-ring server will automatically put everything inside a wrap-reload |
| 22:15 | vas | everything compiles fine, it's just that when I edit an html file, save it, and refresh the page, i don't see the changes. but now it seems more likely that it is firefox just caching things even when i have it set to not do that |
| 22:16 | vas | yeah, i was wondering if wrap-reload would be the solution. if lein does that already then awesome. it's not a big deal, just a minor glitch in the matrix of workflow |
| 22:16 | justin_smith | vas: so you are directly serving the html, and not rendering it from the handler functions? |
| 22:17 | vas | justin_smith: both. using enlive to sexify the template html. |
| 22:18 | justin_smith | vas: wrap-reload will be smart enough to redef things if your source files change, but it may not be able to automatically update things if your templates change |
| 22:18 | justin_smith | are you re-reading the templates, or loading them once? |
| 22:18 | vas | interestingly: the enlive tranforms always appear up-to-date, but the template html does not. |
| 22:19 | justin_smith | vas: are you reloading the template file on each run, or are they captured in eg. a top level def? |
| 22:19 | amalloy | yeah, i'd bet like $20 justin_smith is on the right track here |
| 22:20 | vas | justin_smith: they're in a top level def. *gives $20* ... |
| 22:20 | vas | how would i make it so that they get reloaded automagically ? o.o |
| 22:20 | justin_smith | vas: tell wrap-reload to watch those files |
| 22:20 | justin_smith | use a function that memoizes, but reloads them if they change modification date |
| 22:21 | justin_smith | unconditionally reload them on every request under dev profile |
| 22:21 | justin_smith | you have a few options |
| 22:22 | vas | justin_smith: super cool! thank you. |
| 22:23 | vas | so I can just give wrap-reload a directory to watch? |
| 22:24 | vas | https://github.com/ring-clojure/ring/blob/8927e9b3f556874720321078c85a62fcf9a23f1b/ring-devel/src/ring/middleware/reload.clj |
| 22:24 | justin_smith | vas: as I mentioned, wrap-reload is in there by default |
| 22:24 | justin_smith | but I think there is a way to give it parameters when using lein ring |
| 22:24 | vas | Aha. |
| 22:25 | justin_smith | vas: https://github.com/weavejester/lein-ring#web-server-options |
| 22:25 | justin_smith | you want to set :reload-paths |
| 22:27 | vas | hrm. seems like the behavior i'm wanting is the default. some detective work to do |
| 22:27 | justin_smith | the html files are in your classpath? |
| 22:29 | vas | i think so. they are all in the /resources dir how would i verify what my classpath encompasses? |
| 22:30 | justin_smith | yeah, resources is usually on the classpath (via resource-path) |
| 22:30 | justin_smith | it could also be that wrap-reload isn't watching all filetypes? |
| 22:31 | justin_smith | the docs say it only defaults to ["src"] |
| 22:31 | justin_smith | https://ring-clojure.github.io/ring/ring.middleware.reload.html |
| 22:31 | justin_smith | try providing ["src" "resources"] for a lark, see if that helps |
| 22:39 | vas | justin_smith: so I added wrap-reload ["src" "resources"] to my def app -> thread-through, restarted my lein server, and attempted to add a simple <span> element to one of the html source files to see what would happen... no dice |
| 22:41 | justin_smith | vas: lein ring server was already using wrap-reload |
| 22:41 | justin_smith | or did you turn it off on the project.clj? |
| 22:41 | vas | na i didn't turn it off. but you are saying that i should just pass those arguments to the lein invocation on the command line somehow? |
| 22:42 | justin_smith | vas: look at the docs I linked above in that github readme |
| 22:42 | justin_smith | you can specify the args there |
| 22:43 | justin_smith | you don't want wrap-reload in your app's source, because it's only useful during dev and shouldn't be present in production |
| 22:43 | TEttinger | (inc justin_smith) |
| 22:43 | lazybot | ⇒ 186 |
| 22:46 | vas | justin_smith: thanks. i am not sure what it looks like to pass leiningen different args from the command line, but i guess i have some learning to do :] |
| 22:46 | justin_smith | vas: it's an option you provide inside project.clj |
| 22:46 | vas | Ohhh. cool. |
| 22:47 | justin_smith | vas: so in project.clj: :ring {:reload-paths ["src" "resources"]} |
| 22:48 | justin_smith | } |
| 22:48 | justin_smith | err wait that wasn't even needed |