2014-02-28
| 11:11 | broquaint | Thanks, edbond :) |
| 11:12 | broquaint | ww |
| 11:14 | roybatty | anybody that uses Cursive(intellij) know how to set up a keyboard shortcut to switch from current editor window to the repl and back again. kind of like you ctrl-tab between two files |
| 12:01 | michaniskin | do leiningen templates support any form of composition? |
| 12:02 | michaniskin | like `lein new [template1 template2 template3] my-composed-project |
| 12:02 | johnjelinek | hihi all |
| 12:02 | hyPiRion | michaniskin: how would they compose together? What do you do if both templates creates some specific file? |
| 12:03 | gfredericks | lein new rails spring django arduino billing-app |
| 12:03 | michaniskin | hyPiRion: yeah this is why i'm asking :) |
| 12:04 | michaniskin | hyPiRion: i'm looking for prior art for a project i'm working on |
| 12:04 | johnjelinek | got a question, I have a future that makes an HTTP request with clj-http, and it returns a 401: "java.util.concurrent.ExecutionException: clojure.lang.ExceptionInfo: clj-http: status 401" -- I want to catch this |
| 12:04 | gfredericks | johnjelinek: clj-http has an option for not throwing |
| 12:04 | hyPiRion | michaniskin: Ah. Well, lein templates doesn't compose, if that answered your question :p |
| 12:04 | technomancy | michaniskin: it's a neat idea, but the fact that templates take arbitrary args makes it a bit trickier |
| 12:04 | johnjelinek | gfredericks: can I catch though? |
| 12:04 | johnjelinek | I want (fn [req-fut] (instance? java.util.concurrent.ExecutionException (try @req-fut (catch Exception e (.getCause e))))) |
| 12:04 | johnjelinek | I thought this would return true |
| 12:04 | johnjelinek | but it's false |
| 12:04 | technomancy | michaniskin: worth pursuing though I think |
| 12:05 | dakrone | johnjelinek: you need to put the try/catch inside of your future if you want to do that |
| 12:05 | michaniskin | technomancy: i am thinking about it for what would be equivalent to maybe a combination of profiles and plugins, like you'd use the templates to set up your build process by composing different plugins and such |
| 12:05 | clojurebot | excusez-moi |
| 12:06 | johnjelinek | dakrone: I think I misspoke, I want it to return true |
| 12:06 | johnjelinek | not false |
| 12:06 | johnjelinek | if I change to (instance? Exception ... it returns true |
| 12:07 | michaniskin | technomancy: like if you're setting up a new clojurescript project, but you want to have a ring server and maybe garden css compiler, too |
| 12:07 | johnjelinek | but I want it to return true when the exception is java.util.concurrent.ExecutionException |
| 12:07 | dakrone | johnjelinek: also, just one .getCause may not be the exception you want, you probably want (root-cause e) |
| 12:07 | johnjelinek | or, whatever it is when it returns 401 |
| 12:07 | slagyr | ClojureScript question: It is possible to disable this warning? "WARNING: clojure.core/==, all arguments must be numbers" |
| 12:07 | hyPiRion | michaniskin: wouldn't that mean they need to merge the project.clj? |
| 12:07 | dakrone | johnjelinek: it's far easier to use {:ignore-exceptions true} in clj-http itself and handle the 401 |
| 12:08 | johnjelinek | dakrone: ok, let me try that |
| 12:08 | michaniskin | hyPiRion: well i'm not using lein specifically, i'm using boot, so things compose differently there |
| 12:08 | michaniskin | hyPiRion: but yes, they'd end up merging a file in pretty much the same way |
| 12:09 | hyPiRion | michaniskin: right, gotcha. |
| 12:09 | hyPiRion | Hrm, I guess it would be interesting to look into at least. |
| 12:09 | johnjelinek | dakrone: do I apply {:ignore-exceptions true} on the client/get? |
| 12:10 | dakrone | johnjelinek: yes |
| 12:10 | johnjelinek | dakrone: because it's not ignoring |
| 12:10 | michaniskin | hyPiRion: i wonder if there are other build tools i should look at that might have such a thing? |
| 12:10 | dakrone | johnjelinek: what version of clj-http? (also, it might be :ignore-exceptions? instead of :ignore-exceptions) |
| 12:10 | dakrone | in 0.9.0 I unified the booleans so I don't have to remember whether it ends in ? or not |
| 12:10 | technomancy | michaniskin: this could go hand-in-hand with the proposed programmatic modifications of project.clj |
| 12:11 | johnjelinek | dakrone: both didn't work |
| 12:11 | johnjelinek | dakrone: I'm using 0.7.9 |
| 12:11 | hyPiRion | michaniskin: hm, I'm pretty sure there's nothing for Clojure, but I wouldn't be surprised if there were some JS build tool which did that somehow |
| 12:11 | dakrone | johnjelinek: "didn't work"? didn't throw an exception? didn't give you the right response? can you gist your code somewhere? |
| 12:12 | technomancy | michaniskin: you could say "to make a template composable, return a function that modifies a project.clj instead of simply writing the bytes to disk" or something |
| 12:13 | michaniskin | technomancy: are there plans to make project.clj into a program instead of a declarative data file? |
| 12:13 | hyPiRion | Or, you know, it could be something different, but closely related to templates. |
| 12:13 | hyPiRion | michaniskin: it is already a program |
| 12:13 | hyPiRion | :p |
| 12:14 | michaniskin | :) you know what i mean |
| 12:14 | technomancy | actually I don't think I do? |
| 12:15 | hyPiRion | I don't think I do either |
| 12:15 | michaniskin | no worries, i think the answer is "no" :) |
| 12:15 | Anderkent | michaniskin: if you put (println "BOO!") on top of you rproject.clj, it'll print boo |
| 12:16 | Anderkent | it can't get more programmy than that |
| 12:17 | ToBeReplaced | assuming answer is no but quick question -- can i (go-loop [] (alt! ch (recur)))? |
| 12:17 | technomancy | Anderkent: well it could if we calculated some fibbonacci |
| 12:17 | technomancy | that is empirically the programmiest you can get |
| 12:17 | Anderkent | I thought that was fizzbuzz?\ |
| 12:18 | rasmusto | ~fizzbuzz |
| 12:18 | clojurebot | No entiendo |
| 12:18 | michaniskin | hahaha |
| 12:18 | johnjelinek | dakrone: didn't work means still threw an exception, but didn't return true |
| 12:18 | johnjelinek | I'll pastebin something up for you |
| 12:18 | hyPiRion | michaniskin: I mean, https://github.com/hyPiRion/hello-swearjure/blob/master/project.clj is a legal project.clj file. |
| 12:19 | technomancy | man, not even an nsfw warning or anything? |
| 12:19 | hyPiRion | sorry |
| 12:19 | technomancy | hehe |
| 12:20 | hyPiRion | that is nsfpcp (Not safe for professional clojure programmers) |
| 12:20 | technomancy | not safe for people who take themselves too seriously |
| 12:20 | rasmusto | i am a software professional |
| 12:21 | Anderkent | I'm dissapointed by the meta ns-map |
| 12:21 | clgv | hyPiRion: swearjure seems great for obfuscation ;) :P |
| 12:21 | hyPiRion | Anderkent: I accept pull requests |
| 12:21 | technomancy | did you know the word "amateur" comes from the same root as "amour"? in essence, doing it out of love rather than simply in order to feed yourself. |
| 12:21 | ambrosebs | hyPiRion: holy crap! :) |
| 12:22 | technomancy | so when taken literally, not all that mutually exclusive with professional |
| 12:22 | hyPiRion | Anderkent: the core.clj uses only `ns-map` though. Is that okay for you? |
| 12:22 | Anderkent | hyPiRion: 4 times better |
| 12:23 | hyPiRion | ambrosebs: Now you made me think about using dynalint on that monster. Hrmm... |
| 12:24 | johnjelinek | dakrone: http://pastebin.com/9TvuvEvp |
| 12:24 | johnjelinek | what I expect is (true true true ...) |
| 12:25 | ambrosebs | hyPiRion: I have zero idea how swearjure works. Does it rely on implementation details of Clojure? |
| 12:26 | Anderkent | hyPiRion: you generate that code, right? right? |
| 12:29 | hyPiRion | ambrosebs: Heh... yeah, heavily. It crashes if the hash map order in (ns-map 'clojure.core) is changed. |
| 12:31 | hyPiRion | Anderkent: Well, sort of. I could probably generate it now if I wrote a generator for it, but most of it was just a lot of copypaste |
| 12:31 | ambrosebs | hyPiRion: LOL |
| 12:31 | ambrosebs | hyPiRion: that's amazing |
| 12:31 | dakrone | johnjelinek: https://gist.github.com/dakrone/01c46b660465356bf0d2 |
| 12:31 | hyPiRion | I tried to create a generator for it in the beginning, but the amount of argument calls made the JVM crash, so I had to do some compression by hand |
| 12:32 | dakrone | johnjelinek: my fault, it's actually :throw-exceptions, not :ignore-exceptions |
| 12:33 | hyPiRion | ambrosebs: It's a bit sad actually, because it's not that easy to upgrade from 1.5.1 to 1.6 :p |
| 12:34 | johnjelinek | dakrone: success! |
| 12:34 | johnjelinek | thanks |
| 12:34 | ambrosebs | hyPiRion: I'll bet |
| 12:35 | dakrone | johnjelinek: you're welcome! |
| 12:36 | johnjelinek | dakrone: now, if I wanted to check it for the 401 to know the reason why it wasn't successful, I should do what? |
| 12:36 | johnjelinek | I guess just read the @req-fut and parse? |
| 12:37 | dakrone | johnjelinek: instead of client/success? you can just do (:status @ret-fut) and see the HTTP status yourself |
| 12:44 | johnjelinek | dakrone: awesome, thanks |
| 12:44 | ToBeReplaced | using the alt! macro for the first time, and i'm confused; (go (alt! x ([v] v)) is returning a RuntimeException Unable to resolve symbol: v |
| 12:45 | ToBeReplaced | to me, that appears to be the example in the docs |
| 12:45 | ToBeReplaced | i wanted to say "read from the channel and return the val"... how do i express that correctly? |
| 12:46 | seangrove | dnolen_: Just about finished up with the ReactDevTools fix |
| 12:46 | dnolen_ | seangrove: SWEET |
| 12:47 | seangrove | dnolen_: Are you thinking that the name of the component should be passed in along with {:opts ...} etc.? |
| 12:47 | dnolen_ | seangrove: no will be a protocol IDisplayName |
| 12:47 | seangrove | dnolen_: Got it, sounds good |
| 12:48 | dnolen_ | seangrove: I can add it now, of course won't do anything unless you use a React build from master. |
| 12:48 | seangrove | dnolen_: Oh, I was adding it to a local check of Om right now, the ReactDevTools side is already finished |
| 12:48 | seangrove | I have it coming out hard-coded, was just adding the protocol. Happy to let you do it if you'd like though ;) |
| 12:49 | dnolen_ | seangrove: I can do it, it's a simple change |
| 12:49 | ToBeReplaced | andddd my issue was alt! not imported, so the go macro failing ;) |
| 12:49 | seangrove | dnolen_: Ok, sounds good. I'll check with the React people about the code changes. Let me know when yours is pushed so I can test it out locally |
| 12:50 | seangrove | Doesn't need to be published, I'll just clone master |
| 12:52 | dnolen_ | seangrove: https://github.com/swannodette/om/commit/f50fb2b35cd4326478ea8937eae8c0d1b3cd9bf0 |
| 12:53 | seangrove | dnolen_: Ok, testing it out... |
| 12:54 | dnolen_ | seangrove: oops typo fixing |
| 12:54 | dnolen_ | seangrove: fixed |
| 13:00 | seangrove | dnolen_: Look about right? http://dl.dropbox.com/u/412963/Screenshots/cx.png |
| 13:02 | dnolen_ | seangrove: looks good to me, would be nice if you could suppress Om private props |
| 13:02 | dnolen_ | seangrove: but already looks useful |
| 13:03 | seangrove | dnolen_: I'll as about how to do that |
| 13:03 | dnolen_ | seangrove: might be out of scope since technically that's the idea behind props |
| 13:04 | seangrove | dnolen_: But they show up on the right-hand side I think |
| 13:04 | dnolen_ | seangrove: and we use props differently, but worth bringing up |
| 13:04 | seangrove | which I cut out... One second |
| 13:04 | mr-foobar | i'm using enlive. (enlive-html/append "<div>some content</div>") is escaping and giving me <div ... any option that I can stop the escaping ? |
| 13:05 | dnolen_ | seangrove: heh, actually probably the simplest thing would be don't show props with leading __ |
| 13:05 | dnolen_ | seangrove: React can't display ClojureScript data structures anyway |
| 13:05 | seangrove | dnolen_: Something weird is up with my local RDT, but it's find to have them show up in the list http://dl.dropbox.com/u/412963/Screenshots/cy.png |
| 13:06 | dnolen_ | seangrove: anyways, this is useful - but I think doing our own instrumentation in the end will be more powerful |
| 13:06 | dnolen_ | seangrove: React Dev Tools are never going to be able to display CLJS data properly |
| 13:06 | dnolen_ | seangrove: well not never, but just seems out of scope |
| 13:07 | seangrove | dnolen_: I agree, I think this will go away eventually, btu for the time being it's fast and very nice. Especially for trying to track down these damn 'unique keys' warning Sablono seems wont to put out |
| 13:12 | isaacbw | shouldn't clojure-mode have special indentation for macros? |
| 13:12 | technomancy | isaacbw: which macros? |
| 13:13 | isaacbw | technomancy: any macro. I know that common lisp's SLIME treats macros differently with indentation |
| 13:13 | technomancy | isaacbw: it's technically possible, but it's not a good idea |
| 13:14 | technomancy | indentation rules that change depending on whether you're connected or not are kinda nuts |
| 13:14 | isaacbw | technomancy: I see, okay |
| 13:15 | technomancy | if your macros need special indentation, call them with-foo |
| 13:15 | rasmusto | well, indentation is different for def*, right? I guess that doesn't require connection :) |
| 13:15 | technomancy | rasmusto: right |
| 13:16 | technomancy | having clojure-mode depend on cider would be a circular dependency anyway |
| 13:16 | Bronsa | technomancy: is it just me or with-bindings is indented wrongly by clojure-mode? |
| 13:17 | technomancy | Bronsa: not afaict |
| 13:17 | seangrove | technomancy: A lot of the setups for emacs recommend custom indentation for compojure routes as well |
| 13:17 | Anderkent | it's pretty easy to give things the 'defun indent mode - I used to do it for midjes facts. |
| 13:18 | Anderkent | just check in the relevant configs :P |
| 13:18 | technomancy | seangrove: yeah, some kind of portable declaration for that would be neat |
| 13:18 | technomancy | as long as it can be determined statically |
| 13:18 | technomancy | getting it from nrepl is just wrong though |
| 13:18 | Bronsa | technomancy: .. weird, now it gets indented correctly for me too. Pretty sure it was indenting like a function before though |
| 13:19 | technomancy | you'd have different indentation depending not on whether you were connected, but on which namespaces have been compiled so far |
| 13:20 | seangrove | technomancy: I agree with the static requirement |
| 13:20 | Bronsa | looks like with-bindings indentation starts to get messed up after I connect with slime :/ |
| 13:21 | isaacbw | does anyone know why (put-clojure-indent 'GET 1) isn't working for (GET within (defroutes? Is it because it's within (defroutes? |
| 13:21 | isaacbw | ))) |
| 13:22 | isaacbw | oh, wait |
| 13:23 | isaacbw | ah, I needed to do (put-clojure indent 'GET 2) based on how I was formatting it |
| 13:23 | isaacbw | is there more fine-tuned indentation control, for example only do this for GET within a defroutes? |
| 13:25 | amalloy | isaacbw: that sounds kinda like backtracking indent, such as for deftype and reify, but i don't think you really want to do it anyway |
| 13:27 | amalloy | Bronsa: even in the source buffer? the slime repl doesn't follow the clojure indent rules, but it shouldn't be able to break the indentation of your source files |
| 13:28 | Bronsa | amalloy: yeah, not in the repl |
| 13:28 | amalloy | wild |
| 13:29 | amalloy | you can always try M-x customize-variable clojure-defun-indent |
| 13:29 | Bronsa | amalloy: I'm not 100% sure it's slime's fault though, it worked fine after connecting for ~30 seconds |
| 13:39 | isaacbw | oh hey, the compojure docs list the commands for proper indentation. That could have been easier than trying to figure it out myself :P |
| 13:40 | seangrove | technomancy: LT will solve all of our problems. Clojure and proper data structures all the way down. |
| 13:40 | TravisD | Any top-level var with metadeta ^{:private true} will not be exported? |
| 13:41 | amalloy | wellll, "exported" is a weird word, TravisD. nothing is ever exported, since vars stay in their namespace |
| 13:41 | `cbp | I don't know if it's just because of webkit's bad handling of international keyboards but LT is nearly unusable for me =( |
| 13:41 | TravisD | Hmm, I guess it wont be available from other namespaces? |
| 13:41 | amalloy | but when you require a namespace with a private var, no mapping is created from the symbol naming it to the var itself |
| 13:42 | amalloy | you can always access the var anyway, if you want, using the var syntax |
| 13:42 | TravisD | Ah, what's the var syntax? |
| 13:42 | technomancy | seangrove: heeh |
| 13:42 | amalloy | &[(var clojure.core/inc) #'inc] |
| 13:43 | technomancy | `cbp: shouldn't that be an OS concern? |
| 13:43 | amalloy | god, lazybot has been so unreliable recently |
| 13:43 | amalloy | ,[(var clojure.core/inc) #'inc] |
| 13:43 | clojurebot | [#'clojure.core/inc #'clojure.core/inc] |
| 13:44 | hiredman | ~clojurebot |
| 13:44 | clojurebot | clojurebot is highly unlikely |
| 13:44 | rasmusto | ~lazybot |
| 13:44 | clojurebot | lazybot is echo ~lazybot |
| 13:45 | `cbp | technomancy: I think LT uses keyCodes given to it by webkit and on international keyboards that get's all f'ed up (the keyCode for [, ], {, } are the same etc). So I guess it's partly LTs fault for trusting those keyCodes and having no engineers working on it with international keyboards. |
| 13:45 | TravisD | amalloy: cool, I'll need to look at that some more. Anyways, you can use defn- to define a private function. Is there a more general way to define private vars without explicitly adding the metadata yourself? |
| 13:45 | `cbp | Also it has some pretty annoying common bugs like it suddenly starts registering my keypresses on a tab that isn't the one i'm looking at and I'm not sure if that's because of the same reason |
| 13:46 | seangrove | dnolen_: Is seb suggesting we add a check to see if the prop is starting with "__", or that we list all the properties we don't want shown? |
| 13:47 | patchwork | I have an uberjar that works fine locally, but on heroku returns from (wrap-resource "public") on a request with {:uri "/"}… ? |
| 13:47 | patchwork | Anyone seen this before? |
| 13:47 | patchwork | It is as if (wrap-resource) is matching a file with no name? |
| 13:47 | patchwork | Very strange |
| 13:48 | justin_smith | patchwork: wait, what does it return for /? |
| 13:48 | technomancy | patchwork: yeah, that's a known bug in older ring versions |
| 13:48 | patchwork | It should return the home page |
| 13:48 | patchwork | technomancy: Ahh… okay |
| 13:48 | patchwork | I keep upgrading ring… apparently I am still behind! |
| 13:49 | patchwork | Or maybe some dependency is pulling in an old version |
| 13:49 | patchwork | Thanks technomancy |
| 13:49 | technomancy | patchwork: https://github.com/ring-clojure/ring/pull/97 |
| 13:54 | pyrtsa | `cbp: AFAIK, LightTable uses Mousetrap (http://craig.is/killing/mice) for handling key bindings, and it only supports the US keyboard layout. Bad, bad. :( |
| 13:55 | `cbp | Hmm yeah.. |
| 13:55 | `cbp | Well it's still pretty nice what they've managed in a year or so |
| 13:55 | sdegutis | lazybot where art thou |
| 13:56 | pyrtsa | https://github.com/ccampbell/mousetrap/issues/2 |
| 13:57 | pyrtsa | `cbp: Indeed. And I've managed to make many key bindings work on my Finnish keyboard layout, regardless of Mousetrap's limitations. Had to do a few tricks there, though. |
| 14:00 | pyrtsa | `cbp: In particular, `"alt-[" [(:editor.open-pair "[")]`, `"alt-shift-[" [(:editor.open-pair "{")]`, and similar treatment for the `]` key made brackets and braces work on my keyboard. |
| 14:02 | `cbp | Yeah I had to remap a bunch of alt-* keys because I use them to type some characters and light table uses them as shortcuts :-P |
| 14:02 | `cbp | But that's no biggie |
| 14:03 | pyrtsa | Yeah, I just disabled pretty much all of the alt-* bindings. I use alt all the time for not-so-special characters like @, $, [, ], { and }. |
| 14:03 | `cbp | although that makes them not register as an actual [ or something. So there is no automatic ] put by the editor |
| 14:04 | pyrtsa | My trick above does exactly that. |
| 14:05 | `cbp | OH! |
| 14:07 | `cbp | hehe I used alt-[ and now I can't type {, gonna have to make that combo alt-shift-[ do it. As you did I guess |
| 14:07 | pyrtsa | Here: https://gist.github.com/pyrtsa/9277551 |
| 14:11 | `cbp | Thanks, haha. "You use the [ and { keys to write [ and shift on the [ key (not the { key) to type {" |
| 14:12 | pyrtsa | On the FI keyboard, [ is alt-8, { is alt-shift-8, ] is alt-8 and } is alt-shift-9. That's why. |
| 14:12 | pyrtsa | ] = alt-9, of course. |
| 14:13 | pyrtsa | And parentheses are shift-8 and shift-9. Much different from the en_US, unfortunately. |
| 14:14 | technomancy | hack your layout; unshifted parens are awesome =) |
| 14:14 | `cbp | Yeah it doesn't work for me unfortunately, my [] and {} are in different positions =( |
| 14:15 | pyrtsa | Which layout are you? |
| 14:16 | gtrak | what's up with lazybot? |
| 14:16 | pyrtsa | technomancy: I bet. But believe or not, 30 years of this layout does leave you with some muscular memory as well. |
| 14:16 | amalloy | gtrak: he's having some kind of connection problem. can't log into freenode |
| 14:17 | gtrak | I had that yesterday |
| 14:17 | pyrtsa | (Or well, maybe 23 years since I started typing.) |
| 14:17 | `cbp | spanish-iso |
| 14:17 | gtrak | 7070 was broken on a few servers for some reason, 7000 worked on card.freenode |
| 14:17 | technomancy | pyrtsa: https://github.com/technomancy/atreus |
| 14:17 | gtrak | maybe related |
| 14:18 | gtrak | I'm on dickson now, actually |
| 14:19 | gtrak | looks like they're having a DDoS attack |
| 14:19 | gtrak | https://twitter.com/freenodestaff |
| 14:19 | technomancy | sadface |
| 14:20 | technomancy | they changed their organizational structure so they can't accept donations anymore either |
| 14:20 | patchwork | Hmm… ring-json is pulling in an old version of ring-core |
| 14:20 | `cbp | Fortunately I will be getting an english keyboard soon and I will recover the blissful ignorance where everything open source works that I gained when I moved away from Windows =) |
| 14:20 | patchwork | Do I need to fork ring-json to upgrade? Funny it is living on its own rather than part of ring like the other middlewares |
| 14:20 | pyrtsa | technomancy: The thing you might find hard to believe is, we do need some "special" characters (in my case, ä and ö) almost as often as you need your a and o. Of course not as much when programming but the context switches between coding-oriented and prose-oriented key layouts do have their price. |
| 14:21 | amalloy | patchwork: there are jillions of middlewares. for them all to live in ring would be not just silly but impossible |
| 14:21 | technomancy | pyrtsa: I'm not saying to use mine, just to take what you have and make it suit your own needs better |
| 14:21 | patchwork | amalloy: Right, but this one is pretty standard |
| 14:22 | patchwork | Forking... |
| 14:22 | gfredericks | patchwork: you can normally override indirect deps if you need to |
| 14:22 | pyrtsa | I'm pretty fine with mine atm. And now I'm even fine with LightTable, once I found my hack to support the FI layout in it. But it could be better. |
| 14:22 | gfredericks | so as long as it's compatible with the newer version... |
| 14:22 | `cbp | Although I'm not entirely sure how the computer would respond with two different keyboar layouts.. |
| 14:22 | patchwork | gfredericks: Ah good call |
| 14:44 | johnjelinek | hihi all |
| 14:45 | johnjelinek | so, to preface: I haven't read the little lisper -- so, my question is prolly obvious -- but how do I make a function in the REPL that repeats itself every 5 seconds? |
| 14:45 | mmitchell | I have a protocol and a record. For the record, I'd like to add a private function, I'm guessing that doesn't work with protocols, so I instead though a letfn over the defrecordr -- dang, that doesn't work either. Is there a way to around this? |
| 14:45 | johnjelinek | here's my attempt: (def repeat-me (future (do (Thread/sleep 5000) (println "Repeating") repeat-me))) |
| 14:46 | johnjelinek | but this does not repeat |
| 14:46 | amalloy | mmitchell: just don't attach the function to the record. define a function that takes your record in and does whatever |
| 14:47 | RickInAtlanta | johnjelinek: you could do it with core.async |
| 14:47 | johnjelinek | RickInAtlanta: isn't that a little overkill? |
| 14:47 | amalloy | yes :P |
| 14:47 | mmitchell | amalloy: right yeah, that's definitely the most straight forward way |
| 14:47 | mmitchell | I'll do that |
| 14:47 | amalloy | (future (loop [] ... (recur))) |
| 14:48 | amalloy | although i sorta expect this experiment of having another thread doing things to your repl indefinitely to go kinda Sorceror's Apprentice |
| 14:48 | johnjelinek | ?? |
| 14:48 | clojurebot | BOT FIGHT!!!!!111 |
| 14:49 | sdegutis | lol |
| 14:49 | amalloy | i mean you'll accidentally have more than one such thread and/or be unable to stop them |
| 14:50 | amalloy | $google sorceror's apprentice wikipedia |
| 14:50 | johnjelinek | (def repeat-me (future (loop [] (do (Thread/sleep 5000) (println "Repeating")) (recur)))), |
| 14:50 | johnjelinek | works:) |
| 14:50 | amalloy | oh right. no lazybot |
| 14:50 | amalloy | http://en.wikipedia.org/wiki/The_Sorcerer's_Apprentice |
| 14:51 | johnjelinek | ooooh, the disney fantasia story |
| 14:51 | amalloy | sure, although much older than that, of course |
| 14:51 | johnjelinek | right |
| 14:51 | johnjelinek | so -- on every recur, does this spawn a new thread? |
| 14:51 | amalloy | a socratic answer: how do you spawn a new thread? |
| 14:52 | johnjelinek | (future |
| 14:52 | amalloy | and do you (future in the loop? |
| 14:52 | johnjelinek | no |
| 14:52 | amalloy | tada! |
| 14:52 | johnjelinek | so, I have my answer :) |
| 14:57 | janiczek | Hi, if I wanted to do some kind of logger / visualizer for core.async processes and channels, would I need to somehow hack on core.async itself? Or would hooking it from outside be enough? (I am looking into Rackets future-visualizer and Racket has logging baked right inside...) |
| 14:58 | amalloy | janiczek: you might take a look at the graphviz stuff in lamina. i don't know how applicable it is to core.async, but it's pretty cool |
| 14:58 | technomancy | I doubt there's anything as nice as Racket's |
| 14:59 | ztellman | interesting: http://docs.racket-lang.org/future-visualizer/index.html |
| 14:59 | ztellman | didn't know about this |
| 14:59 | janiczek | Thats exactly it. |
| 15:04 | sdegutis | Anyone in here love Docker? |
| 15:09 | TravisD | I'm always shocked by how expensive it is to print things |
| 15:11 | bbloom | TravisD: yup. |
| 15:11 | amalloy | like...because printer ink costs thousands of dollars per gallon, or because sending strings to your repl takes a while? |
| 15:11 | bbloom | amalloy: both. |
| 15:11 | TravisD | Oh, hehe, I was talking about sending strings to the repl :) |
| 15:14 | sveri | hi there, i tried to unit test the lib-noir validation rules, however, when i call one method from the test i get this error: Exception in thread "main" java.lang.ClassCastException: clojure.lang.Var$Unbound cannot be cast to java.util.concurrent.Future Any ideas how one can test the validation rules? |
| 15:16 | amalloy | ,@clojure.core/unquote |
| 15:16 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.Var$Unbound cannot be cast to java.util.concurrent.Future> |
| 15:17 | TimMc | TravisD: Printing, or display on terminal? :-P |
| 15:17 | amalloy | sveri: you probably have to use with-noir or something. i remember there being an atom you have to bind dynamically |
| 15:17 | amalloy | TimMc: too late by miles |
| 15:17 | TravisD | TimMc: displaying in cider :) |
| 15:17 | TimMc | https://stackoverflow.com/questions/21947452/why-is-printing-b-dramatically-slower-than-printing |
| 15:17 | amalloy | that question was neat |
| 15:18 | TimMc | amalloy: No, by printing I meant just output. |
| 15:18 | TimMc | Should have been more explicit. :-) |
| 15:20 | TravisD | woah, that's actually surprising |
| 15:23 | sveri | amalloy: thank you, there is something like that in the noir sources, i give it a try |
| 15:31 | sveri | amalloy: awesome, it works :-) thank you once again |
| 15:38 | johnjelinek | do any of you use LT? |
| 15:38 | `cbp | johnjelinek: ye |
| 15:38 | johnjelinek | does it make you crazy that CTRL+F doesn't move the cursor forward? |
| 15:38 | johnjelinek | it does a fuzzy file search instead |
| 15:38 | johnjelinek | drives me crazy (since 0.6.1) |
| 15:39 | TravisD | johnjelinek: The key bindings are customizable, no? |
| 15:39 | johnjelinek | I didn't see how to configure the cursor movement |
| 15:39 | TravisD | ah, I don't know much about it |
| 15:39 | johnjelinek | but also, I don't know what I'd change my fuzzy file finder to instead |
| 15:42 | TravisD | There used to be a way to enable emacs bindings, but I couldn't get it to work when I tried out LT |
| 15:43 | johnjelinek | yea, I still can't get it to work (emacs bindings) |
| 15:43 | johnjelinek | the plugin seems incomplete |
| 15:47 | TravisD | Actually, I'm noticing that ctrl + f actually moves my cursor forward. I'm on a mac though |
| 15:47 | johnjelinek | what version? I'm on a mac too |
| 15:47 | TravisD | 0.6.4 |
| 15:47 | johnjelinek | me too |
| 15:47 | TravisD | hm, strange |
| 15:48 | TravisD | I think my config is also the default that it ships with |
| 15:48 | johnjelinek | mine too, for the most-part |
| 15:48 | johnjelinek | when I go to the file menu, it shows ^F for navigator |
| 15:48 | johnjelinek | but I didn't set that |
| 15:48 | TravisD | for me it is Command + O |
| 15:49 | johnjelinek | cmd+O does it for me too |
| 15:49 | johnjelinek | :| |
| 15:49 | kevinfish | anybody got any comments on using Heroku? |
| 15:49 | Raynes | It is expensive for open source projects. |
| 15:49 | Raynes | That's my comments. |
| 15:50 | johnjelinek | lol |
| 15:50 | Raynes | Well, for non-trivial open source projects. |
| 15:50 | Raynes | For example, need ssl support? Fo-ged-aboud-eeeeet |
| 15:50 | kevinfish | Raynes: k, thx. |
| 15:50 | gtrak | pssh ssl |
| 15:50 | Raynes | But it's a great platform. |
| 15:50 | Raynes | I host tryclojure, fwiw. |
| 15:50 | kevinfish | Raynes: IOW, it gets expensive fast? |
| 15:51 | kevinfish | Raynes: you host it on there? |
| 15:51 | Raynes | Yes. |
| 15:51 | Raynes | That project is completely free because I don't need ssl or databases or anything that would cost monies. |
| 15:51 | johnjelinek | question: I have a collection of futures, some have completed, some are pending -- how do I filter the ones that have completed so I can only deref those? |
| 15:52 | johnjelinek | I was thinking (filter (map future-done? my-futures)) |
| 15:52 | johnjelinek | but that no worky |
| 15:52 | Raynes | um |
| 15:52 | DomKM | johnjelinek: realized? I think |
| 15:52 | gtrak | deref takes a timeout argument |
| 15:52 | Raynes | (filter future-done? my-futures) |
| 15:53 | Raynes | realized? is more generic, but also should work |
| 15:53 | kevinfish | anyone got any good ideas on a decent, cheap database backend that acts somewhat like datomic, in that you are not really devolving into something like SQL query language, but are pretty much just dealing with clojure containers as if they were resident in memory? |
| 15:53 | johnjelinek | Raynes: nice |
| 15:53 | johnjelinek | I was close |
| 15:53 | gtrak | aww, tryclj doesn't like futures |
| 15:53 | gtrak | ,(deref (future 3) 0 0) |
| 15:53 | clojurebot | #<SecurityException java.lang.SecurityException: no threads please> |
| 15:53 | gtrak | jeez |
| 15:53 | Raynes | Hahaha |
| 15:53 | Raynes | I don't even remember writing that error message. |
| 15:53 | Raynes | Nice. |
| 15:54 | gtrak | ,(deref (promise) 0 0) |
| 15:54 | clojurebot | 0 |
| 15:54 | gtrak | ,(deref (promise) 0 :not-yet) |
| 15:54 | clojurebot | :not-yet |
| 15:54 | hiredman | kevinfish: core.logic has the new pldb stuff |
| 15:56 | kevinfish | hiredman: ok, nice. What would be the advantage of datomic over that, say? |
| 15:56 | hiredman | kevinfish: in what context? |
| 15:57 | kevinfish | hiredman: for like building web applications that may grow in use fairly rapidly |
| 15:57 | hiredman | core.logic is open source and free, which is nice, core.logic isn't strictly datalog |
| 15:57 | hiredman | core.logic is a database though |
| 15:57 | hiredman | er |
| 15:57 | hiredman | isn't |
| 15:59 | kevinfish | hiredman: I was looking at plob (persistent lisp objects) for something like that back when I was playing with common lisp. Pretty much normal lisp data except you could flag which were "persistent" and which elements had indexes on them, etc... Otherwise, it pretty much gave the illusion you were dealing with in-ram data |
| 15:59 | hiredman | kevinfish: there is nothing like that |
| 16:00 | hiredman | the closest you might come is some kind of datagrid like infinispan, etc, which would use java serialization to store stuff |
| 16:02 | kevinfish | hiredman: k, thx. Unfortunately, I know lisp a fair bit, clojure a little, and java almost none. |
| 16:02 | johnjelinek | dakrone: you around? |
| 16:03 | johnjelinek | dakrone: even with {:throw-exceptions false} I still get exceptions in the scenario where I get "Connection reset" |
| 16:03 | hiredman | kevinfish: I would recomend using any of a number of fine sql databases then |
| 16:04 | kevinfish | hiredman: I don't know that very much either :( |
| 16:04 | hiredman | now is your chance then |
| 16:05 | kevinfish | hiredman: ya, oh joy. |
| 16:05 | hiredman | clojure data tends to map to sql very well, maps are just rows in a table |
| 16:06 | hiredman | filter is select, etc |
| 16:07 | hiredman | I not familiar with how plob works, but generally those kind of systems are heavy on define lots of new types with some attributes so the serialization whatever can stick them in the right place |
| 16:08 | hiredman | clojure tends to de-emphasize the creation of custom types, relying on just generic maps to carry associated data around, which maps well to the relational world |
| 16:20 | zachmassia | I'm testing out the austin brepl sample, and I have a java process using ~1G ram and 25% CPU and it's also caused emacs to use 25% CPU |
| 16:20 | zachmassia | Should I be launching it through a command line repl instead of cider? |
| 16:28 | dsrx | shouldn't matter |
| 16:29 | dsrx | do you have some sort of autocomplete mode enabled in cider, like company or auto-complete? |
| 16:29 | dsrx | those can wreak havoc in a piggiebacked REPL |
| 16:30 | zachmassia | dsrx: Yep, auto-complete |
| 16:31 | amalloy | i want an eastwood rule that looks for (apply str (interpose x ys)), and murders the person who wrote it |
| 16:31 | zachmassia | Not sure what kind of magic that sample project is doing, but I copied all the relevant code into my project and get a nullpointerexception on the (def repl-env ...) command |
| 16:31 | technomancy | amalloy: I think you're stuck with http://p.hagelb.org/punch.png |
| 16:32 | zachmassia | I'll disable auto-complete and see if that helps. About to just give up on the brepl lol |
| 16:33 | abp | amalloy: technomancy usb rocket launcher hooked |
| 16:35 | gtrak | amalloy: one of the few uses I've had for interpose. |
| 16:35 | dsrx | zachmassia: have you required cemerick.austin.repls and cemerick.austin at your repl? |
| 16:35 | dsrx | (the clojure side of it) |
| 16:35 | TEttinger | ##(apply str (interleave ["Hi" "amalloy" "how" "are" "you"] (repeat 5 " "))) |
| 16:35 | lazybot | ⇒ "Hi amalloy how are you " |
| 16:35 | TEttinger | even worse? |
| 16:36 | amalloy | TEttinger: i feel like if someone goes to that kind of effort just to get a wrong answer, they already have enough problems |
| 16:36 | zachmassia | dsrx: For the sample I didn't have to, it just worked. But in my project, I tried with and without requiring those namespaces and it was the same result. |
| 16:36 | amalloy | gtrak: joke? |
| 16:36 | gtrak | actually no. I've only used interpose, like twice. |
| 16:36 | technomancy | interpose: great for getting amalloy to want to kill you |
| 16:37 | amalloy | but like, that shouldn't be one of the times you used it |
| 16:37 | dsrx | well in the sample project IIRC the repl starts you in a namespace that's already required those namespaces |
| 16:37 | johnjelinek | out of memory error? :| do I need to be manually killing my futures when the finish? |
| 16:37 | johnjelinek | they* |
| 16:37 | TEttinger | true |
| 16:37 | dsrx | like browser-sample.whatever.something |
| 16:37 | gtrak | heh, yes, yes it was. I learned string/join, so I stopped using interpose. |
| 16:37 | gtrak | can't think of other times I've had to use it. |
| 16:37 | TEttinger | johnjelinek, how many futures did you create? |
| 16:38 | johnjelinek | 36000 |
| 16:38 | Raynes | I distinctly remember arguments with amalloy about join vs apply str interpose when I was like 16. |
| 16:38 | johnjelinek | they're making async web requests |
| 16:38 | gtrak | in a 24kloc code-base, we use it once, and we should use string/join. |
| 16:38 | gtrak | so... that's my point. |
| 16:38 | TEttinger | I have a feeling that's too many at one time, but it probably depends on what it's running on |
| 16:38 | johnjelinek | should I space them out? |
| 16:39 | amalloy | oh my |
| 16:39 | zachmassia | dsrx: Ya it sets the init-ns key. I tried setting it to 'myapp.core' which requires the same namespace the sample projects .clj does |
| 16:39 | amalloy | johnjelinek: you need a better async primitive than future |
| 16:39 | johnjelinek | how would I add a take-delay? |
| 16:39 | amalloy | like a threadpool |
| 16:39 | johnjelinek | hrmm ... well, clj-http has a connectionmanager, maybe I should use that instead of spinning up my own futures |
| 16:40 | amalloy | clj-http supports non-blocking io, i think, so you shouldn't need any threads at all |
| 16:40 | amalloy | just issue all the requests, and set a callback for each one |
| 16:40 | gtrak | I want/need statistics on every public clojure codebase in existence. |
| 16:41 | technomancy | gtrak: clojuresphere |
| 16:41 | gtrak | my first thought. |
| 16:41 | gtrak | I bet 95% of uses of interpose are inappropriate string/joins. |
| 16:41 | johnjelinek | amalloy: out of the box, I don't think clj-http does async, that's what made http-kit popular methinks |
| 16:41 | seangrove | dnolen_: Ok, both PRs were merged |
| 16:41 | johnjelinek | but http-kit can't do streaming http requests, so I'm going back to clj-http |
| 16:42 | dnolen_ | seangrove: RAD |
| 16:42 | seangrove | dnolen_: Not sure when the next release will go out, but the merging bit was quite fast |
| 16:42 | amalloy | oh, i can't keep those straight. i just use aleph if i want async |
| 16:42 | dnolen_ | seangrove: yes they are very responsive |
| 16:43 | johnjelinek | amalloy: lol, another library :| |
| 16:43 | gtrak | arguably, interpose decomplects .toString from string/join |
| 16:43 | gtrak | therefore is good. |
| 16:43 | gtrak | :-) |
| 16:44 | amalloy | interpose is fine, i'm glad it exists |
| 16:44 | amalloy | but don't use it for strings, since join exists |
| 16:45 | technomancy | but amalloy what if I don't want to go up to the top of my file to add :require [clojure.string :as str] to the ns form |
| 16:45 | sdegutis | The sole usage of interpose in our codebase: (interpose "<br>" messages) |
| 16:45 | amalloy | technomancy: emacs keyboard macro for adding that, of course |
| 16:45 | technomancy | amalloy: the correct answer was slamhound |
| 16:45 | gtrak | sdegutis: you should use more semantic markup |
| 16:46 | technomancy | five points from hufflepuff |
| 16:46 | amalloy | i had a keyboard macro for adding flatland.useful.debug |
| 16:46 | hiredman | ~#10 |
| 16:46 | clojurebot | 10. Get into a rut early: Do the same process the same way. Accumulate idioms. Standardize. The only difference(!) between Shakespeare and you was the size of his idiom list - not the size of his vocabulary. -- Alan J. Perlis |
| 16:46 | amalloy | hiredman: shakespeare cheated by making up half of english |
| 16:46 | seangrove | technomancy: Are you mad? You should alias it :as string anyway. |
| 16:46 | hiredman | amalloy: tell it to perlis |
| 16:46 | amalloy | :as s, man |
| 16:46 | technomancy | seangrove: that's 2x as many characters |
| 16:47 | amalloy | everyone knows what s/join means |
| 16:47 | technomancy | seangrove: if ns aliases were first-class that'd be a problem |
| 16:47 | technomancy | and I wish they were |
| 16:47 | gtrak | the likelihood that some other namespace has required it is very high, just don't worry about it. |
| 16:47 | technomancy | but they're not |
| 16:47 | seangrove | Madness |
| 16:48 | seangrove | technomancy: I guess you get used to dnolen_ telling you, "Oh your application works as an accident of undefined behavior, which we've decided to fix/change/revert" |
| 16:48 | amalloy | gtrak: the likelihood is 100% |
| 16:49 | technomancy | seangrove: I'd be so happy to have first-class namespaces that I wouldn't mind fixing the breakage =D |
| 16:49 | amalloy | clojure.string is one of the namespaces that's always required |
| 16:49 | seangrove | technomancy: I agree it'd be delightful. |
| 16:50 | technomancy | amalloy: I thought that changed in 1.3 |
| 16:50 | technomancy | or was it just clojure.set |
| 16:50 | muhoo | i'm having a miserable time trying to get booleans to work with om |
| 16:51 | muhoo | (om/value something) returns either true or false, but it lies |
| 16:51 | muhoo | because tests like (if something) always succeed! |
| 16:51 | muhoo | and tests like (= true (om/value something)) always fail |
| 16:52 | bob2 | is it in fact a string |
| 16:52 | bob2 | technomancy, they're not first class? |
| 16:53 | technomancy | bob2: eh |
| 16:53 | technomancy | no reader syntax |
| 16:53 | muhoo | in short, i have no idea whether i'm doing something really stupid, or if booleans just don't work in cljs/om |
| 16:53 | sdegutis | amalloy: I always forget the ordering, like 99% of the time |
| 16:54 | technomancy | bob2: they're kinda like functions in lisp-2. you can pass em around and stuff, but they always feel awkward like not-quite-values |
| 17:05 | patchwork | technomancy: Hmm… upgraded to ring 1.2.1, still getting a blank response from (wrap-resource) on requests {:uri "/"} |
| 17:05 | patchwork | I even unzipped the jar and made sure your pull request got in: https://github.com/ring-clojure/ring/pull/97 |
| 17:06 | patchwork | ring.util.response is checking (directory-url? …) |
| 17:06 | patchwork | Any leads? |
| 17:06 | patchwork | I realize now it happens on any uberjar, not just heroku (heroku just creates an uberjar) |
| 17:07 | technomancy | patchwork: can you remove the directory entry with :uberjar-exclusions or something? |
| 17:08 | patchwork | Hmm… just /resources/public/ ? |
| 17:08 | patchwork | I'll check that out |
| 17:08 | technomancy | sure; whatever it is that's getting returned by wrap-resource |
| 17:09 | patchwork | The thing is everything else lives in /resources/public. it is not an empty dir |
| 17:09 | technomancy | just to see if it works around the problem; not as a full solution |
| 17:09 | patchwork | Can I exclude just that path without excluding the rest of the files in that dir? |
| 17:09 | patchwork | I will check out :uberjar-exclusions |
| 17:09 | technomancy | you should be able to use a regex that matches the directory without matching the files under it |
| 17:09 | patchwork | Okay |
| 17:10 | broquaint | muhoo: Try out ankha and see what data you've really got? https://github.com/noprompt/ankha |
| 17:11 | johnjelinek | why does this return "not done yet" even when the future is done? (if (future-done? symbols) "not done yet" (count @symbols)) |
| 17:11 | zachmassia | dsrx: If you or anyone has time to look over this, here's the errors and relevant files for my project when trying to get a brepl with austin working. https://gist.github.com/ZachMassia/462f7560016643dcd8fc |
| 17:12 | amalloy | johnjelinek: because if the future is done you return "not done yet"... |
| 17:13 | johnjelinek | lololol |
| 17:13 | johnjelinek | amalloy: thanks for that |
| 17:14 | rasmusto | ~netsplit |
| 17:14 | clojurebot | I don't understand. |
| 17:14 | amalloy | ,(doc deref) |
| 17:14 | clojurebot | "([ref] [ref timeout-ms timeout-val]); Also reader macro: @ref/@agent/@var/@atom/@delay/@future/@promise. Within a transaction, returns the in-transaction-value of ref, else returns the most-recently-committed value of ref. When applied to a var, agent or atom, returns its current state. When applied to a delay, forces it if not already forced. When applied to a future, will block if computation n... |
| 17:14 | zoldar | I'm going through Om tutorial and the code snippets have quite a nice formatting. On the other hand, LightTable, which I've started using recently is doing much worse, indenting often goes too deep or to shallow. Anybody got around custmizing it? Are there any knobs available on the editor level or is it necessary to fiddle with LT clojure mode directly? |
| 17:15 | amalloy | johnjelinek: you could also just write (deref symbols 0 "not done yet") |
| 17:15 | matthavener | johnjelinek: hey there :) |
| 17:15 | johnjelinek | matthavener: hey :) |
| 17:17 | dnolen_ | johnjelinek: that question is probably best directed to the Light Table mailing list |
| 17:17 | johnjelinek | matthavener: how U? |
| 17:17 | gtrak | technomancy: is 'lein install' away from a project supposed to work? Seems like it overwrites the clojure dep in ~/.m2. |
| 17:17 | gtrak | just did it by accident |
| 17:17 | johnjelinek | dnolen_: which question, the CTRL+F? |
| 17:17 | dnolen_ | johnjelinek: oops sorry |
| 17:17 | dnolen_ | that was for zoldar ^ |
| 17:18 | johnjelinek | lol |
| 17:19 | patchwork | technomancy: Added :uberjar-exclusions [#"resources/public/?"] to my project.clj, didn't seem to help |
| 17:19 | zoldar | dnolen_: ok, thanks |
| 17:19 | patchwork | Funny, I can hit every other route or file in the app! |
| 17:19 | patchwork | Another pattern maybe? |
| 17:20 | technomancy | patchwork: getting rid of wrap-resources makes the problem go away? |
| 17:23 | patchwork | technomancy: Yes. Removing wrap-resource gives me the home page at {:uri "/"} |
| 17:24 | patchwork | but without styling, js etc as those are resources |
| 17:24 | patchwork | with wrap-resource I get all those, but not the home page! |
| 17:24 | technomancy | patchwork: I'm about to go into a call, but if you pm me the app name I can investigate further when it's done |
| 17:25 | amalloy | patchwork: why do you get the home page at / to begin with? |
| 17:25 | amalloy | do you have some middleware that replaces that with index.html or something? |
| 17:26 | patchwork | amalloy: No the home page is not a resource, it is generated by the app |
| 17:26 | patchwork | (wrap-resource) is just for the static stuff |
| 17:26 | patchwork | The app is a handler that lives at the bottom of the middleware stack |
| 17:26 | patchwork | which is currently never getting hit at {:uri "/"} |
| 17:27 | patchwork | because (wrap-resource) is hijacking it and returning a blank file |
| 17:27 | amalloy | right, because there's a resource that exists at / (even if it's silly to consider a directory a resource) |
| 17:27 | sveri1 | Hi, Anyone here having an idea about my problem i described here: https://groups.google.com/forum/#!topic/clojure/0VMwgCpeoU4 ? |
| 17:28 | amalloy | instead of (wrap-resource handler ...), have you tried (routes handler (resources ...))? |
| 17:29 | muhoo | broquaint: oh, is that the floating window thing? |
| 17:29 | patchwork | amalloy: Strange, it only fails if it is running in an uberjar |
| 17:30 | patchwork | That is why I just discovered it, I was trying to work out heroku support |
| 17:30 | patchwork | So you are suggesting looking for resources if the route itself is not matched? |
| 17:30 | muhoo | noprompt: huh, that's pretty cool. i was just complaining about having to flip back and forth between cljs/nrepl and google console trying to see what these objects are or aren't. |
| 17:31 | amalloy | i'm suggesting explicitly giving your handler priority, if you don't like what wrap-resources is doing |
| 17:31 | patchwork | Right, but many of the resources are shadowed by routes that match variable paths |
| 17:31 | patchwork | so it would never fall through to find the resources |
| 17:32 | patchwork | which is why it hits the resources first in the stack |
| 17:32 | patchwork | The usual behavior is if the resource is not found, it falls through to the app. Which is actually what it does unless it's in an uberjar! |
| 17:33 | patchwork | I wonder what is different there? |
| 17:33 | amalloy | well, that's what it does even if it's in an uberjar |
| 17:33 | amalloy | i speculate that something about being in the uberjar makes it think / is a resource, so it's not "not found" |
| 17:33 | noprompt | muhoo: ankha? |
| 17:33 | amalloy | (routes (GET "/" req (handler req)) (wrap-resources ... handler)) |
| 17:34 | muhoo | noprompt: ya |
| 17:34 | amalloy | for even more delicate route-untangling |
| 17:34 | patchwork | Right, which seems like what technomancy's earlier pull request should have fixed |
| 17:34 | noprompt | i'm having a weird problem w/ my project not picking up a dependency and i have no clue what's wrong. |
| 17:35 | patchwork | amalloy: Right, I guess I can directly inspect the incoming request and bypass (wrap-resources) in that case |
| 17:36 | patchwork | seems like a hack! But it will work I suppose |
| 17:37 | muhoo | anyway, still miserable with the booleans |
| 17:40 | noprompt | i'm trying to use the newest version of clojure.tools.cli but i keep ending up with the old version |
| 17:41 | noprompt | lein deps :tree doesn't report a dependency on the old version :| |
| 17:41 | `cbp | when all else fails.. lein clean? |
| 17:42 | noprompt | i've done lein clean :S |
| 17:43 | muhoo | ah, solution is, (om/value somebool) fails. but (.valueOf somebool) works! |
| 17:43 | `cbp | then go nuclear and delete .m2 xD ? |
| 17:44 | amalloy | noprompt: google exorcism services |
| 17:44 | noprompt | amalloy: haha, what? |
| 17:45 | amalloy | since your computer is apparently haunted |
| 17:45 | amalloy | or possessed |
| 17:45 | amalloy | whatever it is you exorcise |
| 17:46 | patchwork | amalloy technomancy: This solved it! https://www.refheap.com/49113 |
| 17:47 | amalloy | patchwork: there are a couple ways to improve that |
| 17:47 | patchwork | amalloy: Sure, what did you have in mind? |
| 17:47 | amalloy | the first is to wrap-resource once, outside the fn, and use it inside; this probably doesn't matter, but if wrap-resource were expensive to initialize... |
| 17:47 | patchwork | Ah, right |
| 17:47 | patchwork | even hacks should be well-engineered |
| 17:48 | amalloy | the second is to do what i suggested, ie (GET "/"). checking (= "/" uri) will fail if the uri is actually /?test=1 |
| 17:48 | patchwork | Ah, yeah not using compojure |
| 17:49 | amalloy | really? well, to each his own i guess |
| 17:51 | patchwork | I don't like the macros. Using this: https://github.com/caribou/polaris |
| 17:51 | patchwork | I guess I could do a comparable thing with polaris |
| 17:52 | amalloy | i think the only macros i've ever used in compojure are GET and POST |
| 17:52 | patchwork | I get to the point where I want to use GET or POST as a value somewhere and then end up writing something like (fn [route] (GET route)) |
| 17:53 | patchwork | which just seems wrong |
| 17:53 | amalloy | it doesn't just seem wrong, it like...is wrong? that shouldn't work at all |
| 17:54 | patchwork | Well, that is pseudocode |
| 17:54 | patchwork | I forget exactly what the args to GET are |
| 17:54 | patchwork | But that is the spirit : ) |
| 17:54 | amalloy | doesn't really matter what they are, since it's a macro - if route is at all interesting, calling it like that won't work |
| 17:55 | patchwork | Right, it has some quoting I believe |
| 17:55 | patchwork | been awhile since I've done it, since I switched to something that treats routes as data and not fuzzy macro sugar |
| 17:56 | patchwork | It is funny, when I first got into lisp (and read through "on lisp" what, 10 years ago?) I thought macros were the ultimate |
| 17:57 | patchwork | Now I never touch the things |
| 17:57 | patchwork | Can't take the value of a macro, they are useless to me |
| 17:58 | seangrove | patchwork: core.async is useless to you? |
| 17:58 | patchwork | Ah, no I love core.async |
| 17:58 | patchwork | Also: let |
| 17:59 | patchwork | And: fn |
| 17:59 | patchwork | I just haven't written one |
| 17:59 | patchwork | They are good for fundamental things like that I suppose |
| 18:00 | patchwork | but most of the time I want to compose things programmatically |
| 18:00 | patchwork | a macro is like a compositional dead-end |
| 18:03 | seangrove | patchwork: I agree, best avoided if possible |
| 18:05 | johnjelinek | dakrone: what does Connection Pool shut down mean? |
| 18:10 | dakrone | johnjelinek: that the connection pool has been shut down? can you give me more context? |
| 18:11 | johnjelinek | dakrone: it's a little ways behind me now, I bypassed it by removing a doall on my async requests in the with-connection-pool |
| 18:12 | dakrone | johnjelinek: okay, happy to help if I can |
| 18:15 | johnjelinek | dakrone: will this still use the number of threads I specified in the connection manager? (client/with-connection-pool {:timeout 5 :threads 4 :default-per-route 2 :insecure? false} (let [req-futs (map #(future (client/get % {:oauth-token (:access_token @access-token) :throw-exceptions false :as :json-s |
| 18:17 | dakrone | johnjelinek: ahh, I see the issue |
| 18:17 | johnjelinek | since I use (future in req-futs I have suspicion that the thread count may increase to accomodate (take 26 urls) |
| 18:17 | dakrone | johnjelinek: the with-connection-pool creates a connection manager, and then closes it at the end, but since you are creating futures that may run after the manager has been closed, it's possible to try and use a previously-closed manager |
| 18:18 | dakrone | johnjelinek: a better solution is to create a manager and use the :connection-manager option, as in the second example here: https://github.com/dakrone/clj-http/#using-persistent-connections |
| 18:18 | johnjelinek | what is the recommended way to use the connection manager and still get a collection of futures that I can watch? |
| 18:18 | dakrone | johnjelinek: then, once all futures have been realized, you can close it at your leisure |
| 18:19 | johnjelinek | ahh, ok |
| 18:19 | technomancy | patchwork1: that kind of stuff shouldn't be necessary though |
| 18:19 | johnjelinek | how do I close it at my leisure? |
| 18:19 | technomancy | it worries me that the issue is still present despite that patch being merged |
| 18:19 | johnjelinek | just set it to nil? |
| 18:19 | technomancy | do you have a repro case I could check out? |
| 18:20 | johnjelinek | dakrone: Ideally, all I want is for my function not to block |
| 18:20 | dakrone | johnjelinek: there is a shutdown-manager function in clj-http.conn-mgr |
| 18:20 | johnjelinek | so (map (future ... I thought would get me that |
| 18:20 | dakrone | johnjelinek: yes, so create the manager once, use it throughout your program, then when you're shutting down, you can finally shut it down |
| 18:20 | johnjelinek | great :) |
| 18:21 | patchwork1 | technomancy: I will put one together, in a meeting currently |
| 18:21 | johnjelinek | btw, you may want to add shutdown-manager to the example on the github |
| 18:21 | dakrone | johnjelinek: good idea! |
| 18:21 | technomancy | patchwork1: thanks. |
| 18:22 | dakrone | johnjelinek: added, thanks |
| 18:23 | johnjelinek | yw |
| 18:29 | rasmusto | ,(and (nil? 'nil) (true? 'true) (false? 'false)) |
| 18:29 | clojurebot | true |
| 18:30 | rasmusto | good to know |
| 18:32 | amalloy | ,(instance? String) |
| 18:32 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (1) passed to: core/instance?> |
| 18:32 | amalloy | nice |
| 18:33 | rasmusto | ,(instance 'true) |
| 18:33 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: instance in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 18:33 | rasmusto | ,(instance? 'true) |
| 18:33 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (1) passed to: core/instance?> |
| 18:33 | rasmusto | ,(instance? 'true java.lang.Boolean) |
| 18:33 | clojurebot | #<ClassCastException java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.Class> |
| 18:33 | johnjelinek | dakrone: ok, so now I have my 26 futures, how do I make sure that only 4 threads are being used as enforced by the conn-mgr? |
| 18:34 | rasmusto | ,(instance? java.lang.Boolean 'true) |
| 18:34 | clojurebot | true |
| 18:34 | dakrone | johnjelinek: threads for the actual futures themselves, or threads for the connection manager? |
| 18:34 | johnjelinek | the latter |
| 18:34 | dakrone | johnjelinek: the connection manager will manage that, you can enabled the apache debug logs and see it do that if you desire |
| 18:35 | johnjelinek | btw, how will this work -- the 26 threads for the futures will reduce to the 4 specified by the conn-mgr? |
| 18:36 | dakrone | johnjelinek: a future doesn't spawn a thread, internally it uses clojure's ThreadPoolExecutor based on the number of processors in your machine |
| 18:36 | johnjelinek | dakrone: oh -- from what I read, I was under the impression is spawns a thread |
| 18:36 | johnjelinek | to manage concurrency |
| 18:36 | dakrone | johnjelinek: it spawns a thread from the threadpool, which may or may-not actuall spawn a thread :) |
| 18:37 | johnjelinek | gotcha |
| 18:37 | dakrone | johnjelinek: if it's a fixed threadpool of size 4, then only 4 threads will be spawned at a time, the rest of the ops will be queued |
| 18:37 | hiredman | dakrone: the future threadpool is unbounded |
| 18:37 | dakrone | hiredman: oh, for some reason I thought it was CPU-limited |
| 18:38 | dakrone | ahh yea, pmap uses a limited threadpool |
| 18:38 | amalloy | that's for agents |
| 18:38 | dakrone | well *one* of the threadpools is limited, somewhere ;D |
| 18:39 | johnjelinek | but in my case of (map #(future ... then it's spawning more threads to keep it non-blocking, but the requests in the futures may be queued by the threads in the conn-mgr |
| 18:39 | amalloy | dakrone: pmap uses an unbounded threadpool (ie, the future threadpool), it just tries not to realize too many elements at once |
| 18:39 | dakrone | amalloy: ahh okay |
| 18:39 | hiredman | johnjelinek: when using map and future it is important to keep in mind that map is lazy |
| 18:40 | johnjelinek | should I use something else? |
| 18:40 | johnjelinek | I'm just using map to pump the URLS into my client/get argument |
| 18:40 | hiredman | depends what you want, I would use an executor and a queue of results |
| 18:41 | dakrone | johnjelinek: you may be able to utilize something like https://github.com/TheClimateCorporation/claypoole for this |
| 18:41 | johnjelinek | dakrone: claypoole was recommended to me yesterday, but I'm trying to keep my samples simple enough so I can ship something ;) |
| 18:42 | dakrone | johnjelinek: in that case I wouldn't be too worried about having every single future executing an HTTP request at the same time, I'd set the connection manager threads to a reasonable value and keep stuff in futures like you have |
| 18:45 | johnjelinek | I thought maybe I could swap the map and future around to be (future (map ... so I would have it execute all requests by the conn-mgr and still send a future I can check the status of ... but this blocks :| |
| 18:48 | johnjelinek | lol, so it blocks and returns a finished future |
| 19:06 | johnjelinek | why is this non-blocking: (future (into #{} (map #(% :Name) (flatten (map #(% :body) (pmap client/get urls (repeat {:oauth-token (:access_token @access-token) :throw-exceptions false :as :json-strict-string- |
| 19:06 | gtrak | anyone know of a way to expand Ant Filesets in clojure? |
| 19:06 | johnjelinek | oh, it didn't paste everything |
| 19:06 | gtrak | johnjelinek: don't paste multiple lines |
| 19:06 | `cbp | johnjelinek: refheap |
| 19:06 | johnjelinek | refheap? |
| 19:06 | clojurebot | https://www.refheap.com/ |
| 19:06 | `cbp | ~botsnack |
| 19:06 | clojurebot | Thanks, but I prefer chocolate |
| 19:07 | hiredman | ~pmap |
| 19:07 | clojurebot | pmap is not what you want |
| 19:07 | `cbp | : ( |
| 19:07 | rasmusto | ~doall |
| 19:07 | clojurebot | I don't understand. |
| 19:07 | hiredman | ~flatten |
| 19:07 | clojurebot | flatten is rarely the right answer. Suppose you need to use a list as your "base type", for example. Usually you only want to flatten a single level, and in that case you're better off with concat. Or, better still, use mapcat to produce a sequence that's shaped right to begin with. |
| 19:08 | hiredman | #(% :Name) is so gross |
| 19:09 | hiredman | etc etc |
| 19:09 | johnjelinek | here's a pastebin: http://pastebin.com/DzkWvt0N |
| 19:09 | rasmusto | ,((comp :name :body) {:body {:name "foo"}}) |
| 19:09 | clojurebot | "foo" |
| 19:10 | johnjelinek | so, why is the latter blocking? |
| 19:11 | johnjelinek | oh, hurp durp* I need to prolly future my get-all-symbols |
| 19:12 | rasmusto | the #(str "https://example.com") isn't doing anything, you're missing a % (an aside) |
| 19:13 | johnjelinek | sorry, I replaced the real stuff with "example.com" and forgot the % |
| 19:13 | rasmusto | kk, was just nitpicking anyways :) |
| 19:14 | johnjelinek | http://pastebin.com/1xik5pEx |
| 19:14 | johnjelinek | just for you :) |
| 19:14 | rasmusto | ,'<3 |
| 19:14 | clojurebot | <3 |
| 19:16 | rasmusto | johnjelinek: are you saying that it blocks before you try to dereference it? |
| 19:18 | johnjelinek | rasmusto: yes |
| 19:20 | johnjelinek | rasmusto: actually, it's weird behavror -- (future-done? is true |
| 19:20 | johnjelinek | but (deref blocks |
| 19:21 | johnjelinek | (meaning (future-done? should've been false |
| 19:24 | gtrak | oh wow, ant's FileSet has a handy iterator function. This might be easier than I thought. |
| 19:24 | johnjelinek | g2g |
| 19:24 | patchwork | technomancy: Here you go: https://github.com/caribou/caribou-development/tree/develop |
| 19:25 | technomancy | patchwork: thanks |
| 19:26 | patchwork | technomancy: Thank you! I have to run, maybe leave a comment on that repo if you find anything? |
| 19:26 | technomancy | patchwork: sounds good |
| 19:40 | stcred0 | Is there any way that I can get Clojure to generate a Java superclass and two subclasses with disparate state implementing the same protocol? |
| 20:02 | gfredericks | disparate state? |
| 20:02 | stcred0 | yes, they have none of the same attributes |
| 20:02 | stcred0 | but they both implement the same protocol |
| 20:03 | gfredericks | why do you need the subclass relationship? |
| 20:04 | stcred0 | I seem to be having difficulty getting things to compile. The Clojure compiler doesn't seem to like it when I have the return-type hint be the protocol |
| 20:05 | gfredericks | why do you need to type hint w/ a protocol? |
| 20:05 | stcred0 | Won't that result in faster code? |
| 20:06 | gfredericks | if `lein check` doesn't tell you there's specific reflective code being generated, then there's no problem to solve |
| 20:06 | gfredericks | type hints only help w/ reflection |
| 20:06 | stcred0 | I have set warn-on-reflection true in all those source files, so that's the same thing? |
| 20:07 | gfredericks | probably so |
| 20:08 | stcred0 | So, if I have a ight loop where I'd like there to be polymorphic dispatch and for that to be compiled to what I'd expect it to be in Java, I don't have to do anything? |
| 20:08 | gfredericks | well protocols have a bit of overhead compared to interfaces |
| 20:08 | gfredericks | but each protocol has an underlying interface |
| 20:09 | gfredericks | which is sometimes implemented by the classes satisfying the protocol, dependending |
| 20:09 | gfredericks | but protocols aren't going to be obscenely slow like reflection |
| 20:10 | stcred0 | But if I can get the two classes satisfying the protocol to implement the interface, won't that result in even faster code? |
| 20:10 | gfredericks | you can measure to check |
| 20:10 | stcred0 | Potentially, things would be JIT-ed |
| 20:10 | gfredericks | if you use deftype or defrecord and do the protocol definition inline, it'll implement theh interface |
| 20:11 | stcred0 | I am using defrecord for the two things implementing the protocol. What do you mean about doing the protocol definition inline? |
| 20:11 | gfredericks | within the defrecord expression |
| 20:11 | gfredericks | contrasted with extend-type or extend-protocol |
| 20:12 | stcred0 | So then how would I get that to happen with polymorphism between two classes? |
| 20:12 | gfredericks | ,(defprotocol IFoo (foo [_])) |
| 20:12 | clojurebot | IFoo |
| 20:12 | gfredericks | ,(defrecord A [] IFoo (foo [_] "I am an A")) |
| 20:12 | clojurebot | sandbox.A |
| 20:13 | gfredericks | ,(defrecord B [] IFoo (foo [_] "I am a B")) |
| 20:13 | clojurebot | sandbox.B |
| 20:13 | gfredericks | ,(type sandbox/IFoo) |
| 20:13 | clojurebot | clojure.lang.PersistentArrayMap |
| 20:13 | gfredericks | ,(import 'sandbox.IFoo) |
| 20:13 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.Var cannot be cast to java.lang.Class> |
| 20:13 | gfredericks | ,sandbox.IFoo |
| 20:13 | clojurebot | sandbox.IFoo |
| 20:13 | gfredericks | ,(type sandbox.IFoo) |
| 20:13 | clojurebot | java.lang.Class |
| 20:13 | gfredericks | ,(satisfies? (A.) sandbox/IFoo) |
| 20:13 | clojurebot | #<NullPointerException java.lang.NullPointerException> |
| 20:14 | gfredericks | ,(satisfies? sandbox/IFoo (A.)) |
| 20:14 | clojurebot | true |
| 20:14 | gfredericks | ,(instance? sandbox.IFoo (A.)) |
| 20:14 | clojurebot | true |
| 20:14 | gfredericks | ,(foo (A.)) |
| 20:14 | clojurebot | "I am an A" |
| 20:14 | gfredericks | ,(.foo (A.)) |
| 20:14 | clojurebot | "I am an A" |
| 20:14 | stcred0 | I think that's what I'm doing. |
| 20:15 | gfredericks | note the difference between the last two |
| 20:15 | gfredericks | the first one is never reflective and type hints don't help; the second can be reflective and you would type hint with the interface name |
| 20:15 | gfredericks | ,(.foo ^sandbox.IFoo (B.)) |
| 20:15 | clojurebot | "I am a B" |
| 20:16 | gfredericks | ,(time (.foo (B.))) |
| 20:16 | clojurebot | "Elapsed time: 0.112743 msecs"\n"I am a B" |
| 20:16 | gfredericks | ,(time (.foo ^sandbox.IFoo (B.))) |
| 20:16 | clojurebot | "Elapsed time: 0.107861 msecs"\n"I am a B" |
| 20:16 | gfredericks | ,(set! *warn-on-reflection* true) |
| 20:16 | clojurebot | #<IllegalStateException java.lang.IllegalStateException: Can't change/establish root binding of: *warn-on-reflection* with set> |
| 20:16 | gfredericks | time on clojurebot might be funky |
| 20:16 | stcred0 | Well, you'd have to keep at it to warm up the JIT |
| 20:17 | gfredericks | there's usually an immediate factor of 100-1000x difference |
| 20:17 | gfredericks | if one is reflective |
| 20:17 | gfredericks | but since the constructor is inline it might not have been |
| 20:17 | gfredericks | ,(time (#(.foo %) (B.))) |
| 20:17 | clojurebot | "Elapsed time: 0.225027 msecs"\n"I am a B" |
| 20:17 | gfredericks | whatever |
| 20:17 | hyPiRion | ,(.bindRoot #'*warn-on-reflection* true) |
| 20:17 | clojurebot | nil |
| 20:18 | gfredericks | hyPiRion: aw snap |
| 20:18 | gfredericks | ,#(.foo %) |
| 20:18 | clojurebot | #<CompilerException java.lang.SecurityException: denied, compiling:(NO_SOURCE_PATH:0:0)> |
| 20:18 | gfredericks | ,(+ 1 2) |
| 20:18 | clojurebot | 3 |
| 20:18 | stcred0 | so the key is to define the constructor inline? |
| 20:18 | gfredericks | stcred0: no ignore that part |
| 20:18 | gfredericks | that was just about timing on clojurebot |
| 20:18 | gfredericks | stcred0: if you use the interface methods and type hint with the interface, it should either work right or blow up |
| 20:19 | gfredericks | so unlikely you're subtly messing up |
| 20:19 | stcred0 | okay, so I'll just not worry about it for now, since I an doing a defprotocol and defrecord-ing the two types. |
| 20:20 | stcred0 | it's only when I do more hinting than that that I have compile problems. |
| 20:20 | gfredericks | sure |
| 20:20 | gfredericks | yeah wait till you have definite perf problems to worry past that :) |
| 20:20 | stcred0 | I'm trying to fit 1000's of simultaneous users into one instance of my MMO. |
| 20:27 | bbloom | Bronsa: so have you do a line count on your analyzer/emitters and the java impls? |
| 20:29 | Bronsa | bbloom: t.a + t.a.j + t.e.j is ~5.2k locs |
| 20:30 | Bronsa | Compiler.java is 8.5k + Reflector.java 500 |
| 20:31 | bbloom | Bronsa: and those are more or less equiv functionality? |
| 20:31 | Bronsa | bbloom: tools.* is modular & extensible, the java impl not at all |
| 20:32 | bbloom | Bronsa: sure, but that's a given :-P |
| 20:32 | bbloom | cool, thanks for the metrics |
| 20:32 | bbloom | i was curious, but wasn't sure which bits to count precisely |
| 20:33 | Bronsa | bbloom: also ~300locs in t.a/t.a.j are not actually needed but are passes provided for the users |
| 20:34 | bbloom | Bronsa: what's that mean exactly? |
| 20:34 | Bronsa | bbloom: e.g. the datomic support or the emit-form pass to convert an ast back to clojure source |
| 20:34 | bbloom | ah ok cool |
| 20:35 | Bronsa | so yeah, I think it's fair to say that it's 5k vs 8.5k taking into account that Compiler.java has a bunch of commented out classes |
| 20:36 | chare | so if you try to make a 1milion threads in clojure is that going to end up badly, is the jvm unable to handle that kind of scale? |
| 20:37 | bbloom | chare: your operating system is going to be the bottleneck, not the jvm |
| 20:37 | chare | not if the threads are not mapped 1 to 1 to os threads |
| 20:38 | bbloom | we don't call those "threads" anymore. you can probably make 1 million green threads with core.async without much difficulty |
| 20:38 | chare | so clojure has green threads? are those from java or did clojure implement somehow green threads on its own |
| 20:39 | bbloom | chare: start here: http://clojure.com/blog/2013/06/28/clojure-core-async-channels.html |
| 20:40 | seangrove | chare: Also, erlang is nice |
| 20:43 | chare | so core.async is meant to do stuff similar to erlang? |
| 20:44 | noprompt | if i'm implementing IFn is there any benefit to implementing it for all 20 arg positions? |
| 20:44 | dnolen_ | chare: more similar to channels in Go |
| 20:44 | dnolen_ | noprompt: not really, at some point I would like to spend some time to figure out how to make implementing IFn sensible |
| 20:45 | noprompt | dnolen_: how do i deal w/ & more in that case? |
| 20:47 | dnolen_ | noprompt: if you want to correctly handle variadic I would just write a macro over IFn |
| 20:47 | chare | so if you're trying to get something like erlang style stuff in clojure and you use akka does that mean the threads are heavyweight since i'm assuming that akka is meant for java |
| 20:47 | noprompt | dnolen_: that works out then because i've already written the code generation for the specs. |
| 20:48 | noprompt | dnolen_: working on a better selector api for garden. :) |
| 21:08 | chare | so which clojure books cover core.async? |
| 21:09 | noprompt | chare: none that i know of. |
| 21:10 | noprompt | chare: i just came out last year. |
| 21:10 | chare | no no no |
| 21:10 | noprompt | *it |
| 21:10 | chare | so theres no good tutorial for newbies? |
| 21:10 | noprompt | chare: sure. there plenty of stuff out there. |
| 21:11 | chare | whats the best? |
| 21:12 | noprompt | chare: well, there are a handful of videos mentioned in the README. a quick google search might show some blogs. |
| 21:12 | noprompt | chare: afa the "best" is concerned there really isn't one that comes to mind. just watch the videos, hack, and ask questions. |
| 21:13 | chare | crap |
| 21:13 | noprompt | ? |
| 21:14 | chare | noprompt how about you write a book sell it for $9 and i'll buy it |
| 21:14 | noprompt | lol |
| 21:14 | chare | so write a clojure book on async |
| 21:14 | chare | go go go |
| 21:15 | noprompt | chare: yo, just research. *learn* |
| 21:17 | noprompt | chare: dnolen_ has some good cljs core.async examples that helped me when i first started. the core.async repo is full of examples and the videos will help you a lot too. |
| 21:18 | noprompt | chare: swannodette.github.io |
| 21:18 | noprompt | chare: https://github.com/clojure/core.async/ |
| 21:18 | chare | how are green threads even implemented, and why doesn't java have them (or does java already have it?) |
| 21:18 | noprompt | : |
| 21:18 | noprompt | :| |
| 21:19 | chare | what? |
| 21:19 | clojurebot | http://paste.lisp.org/display/74305 |
| 21:19 | seangrove | ~guards |
| 21:19 | clojurebot | SEIZE HIM! |
| 21:19 | noprompt | seangrove: hey! |
| 21:19 | noprompt | :) |
| 21:19 | seangrove | noprompt: Hey |
| 21:19 | noprompt | seangrove: i think gf3 and i are gonna try and remote pair on secretary this weekend if you're down. |
| 21:20 | seangrove | Runnng out right now, but want to catch up at some point |
| 21:20 | seangrove | Oh, that might be good |
| 21:20 | noprompt | seangrove: sure thing. :) |
| 21:20 | seangrove | I'm going to write an om component this weekend for saving state |
| 21:20 | noprompt | seangrove: ah, yeah, definitely hit me up! |
| 21:20 | seangrove | click-click-click to where ou're developing, hit a key, state is saved to localStorage, refresh and it's restored straight to that point |
| 21:20 | chare | noprompt: you don't know the answer for java? |
| 21:20 | noprompt | chare: not to be rude, but frankly, i don't care how it's implemented. |
| 21:21 | chare | wtf how can you not care? |
| 21:21 | noprompt | chare: easy. |
| 21:21 | noprompt | chare: i just don't care. |
| 21:22 | noprompt | chare: i've never run in to a problem where that sort of thing was relevant. |
| 21:22 | noprompt | chare: i only care when something's a problem. |
| 21:22 | noprompt | chare: or when i want to know for myself. then i *research*. |
| 21:22 | noprompt | chare: not trying to be a jerk here. |
| 21:22 | noprompt | chare: why should i care? |
| 21:22 | chare | but what happens when I have to maintain a legacy java codebase so i HAVE to use java only |
| 21:23 | noprompt | chare: ask around in #java? |
| 21:23 | noprompt | i'm really, really, not trying to be rude here. |
| 21:29 | bbloom | noprompt: now that i think about it, i'm pretty sure chare was banned for trolling at some point |
| 21:29 | chare | i'm not a troll |
| 21:29 | seangrove | Best to just /ignore |
| 21:30 | seangrove | Could see that one coming a mile away |
| 21:30 | chare | I'm not a troll |
| 21:31 | S11001001 | eI hear, in space, it is very cold. |
| 21:34 | noprompt | bbloom: oh, didn't know that. :*( |
| 21:34 | bbloom | noprompt: i had forgotten for a moment myself |
| 21:35 | bbloom | what else floats? very small rocks. |
| 21:35 | noprompt | bbloom: actually, now that i think about it, you're right. i remember chare from a few months ago. |
| 21:35 | gfredericks | he reminded me because I think the opening line is "I'm not a witch, I'm not a witch." |
| 21:35 | noprompt | bbloom: i'll just block him. |
| 21:35 | bbloom | shh, we've said his name twice now. if you say it 3 more times, he might show back up like beattlejuice |
| 21:35 | chare | i'm not troll, my questions above meaningful |
| 21:36 | noprompt | chare: fuck off bro. |
| 21:36 | noprompt | lol |
| 21:36 | bbloom | noprompt: ignore, don't engage |
| 21:36 | noprompt | bbloom: you going to clojure west? |
| 21:36 | bbloom | noprompt: yup |
| 21:37 | noprompt | bbloom: cool. i'm excited to meet everyone. |
| 21:37 | noprompt | i couldn't make it last year cause i couldn't afford it. :( |
| 21:38 | goldfeld | everyone's going! |
| 21:38 | goldfeld | it's where it's at |
| 21:39 | noprompt | what does "Marker protocol" mean for Fn in cljs? |
| 21:40 | gfredericks | noprompt: I think that refers to empty protocols that act as flags |
| 21:40 | noprompt | gfredericks: flags for...? |
| 21:40 | noprompt | gfredericks: for satisfies? |
| 21:40 | Bronsa | (satisfies? IFn some-boj) |
| 21:40 | Bronsa | Fn* |
| 21:41 | Bronsa | obj* |
| 21:41 | noprompt | interesting. so when would one want to create a marker protocol? |
| 21:41 | seancorfield | Me and one of my team will be there... unlike last year where I sent the whole of my team :) |
| 21:42 | noprompt | is rhickey going to be there? |
| 21:43 | gfredericks | I don't think he's missed clojure-{conj,west} so far |
| 21:43 | noprompt | i didn't see his name on the list of speakers. |
| 21:43 | gfredericks | it's gotta happen eventually though |
| 21:44 | goldfeld | well, not necessarily |
| 21:44 | gfredericks | he's probably tired of having to say something interesting every six months :) |
| 21:44 | gfredericks | he didn't do a keynote at the conj I don't think |
| 21:44 | bbloom | he's said as much |
| 21:44 | bbloom | also, if you've ever given a talk, you know they are A LOT of work |
| 21:44 | noprompt | well he could get up there and just tell software jokes. he's really funny actually. |
| 21:44 | bbloom | ha |
| 21:44 | seangrove | Wow, a state save/restore for super easy dev in 2 lines of code |
| 21:44 | seancorfield | there's a TBD keynote on day two - could still be rich |
| 21:44 | goldfeld | oh, but him being there doesn't have to mean he has to give a talk |
| 21:45 | seangrove | Needs a visual component to polish it off, but man frontend stuff if fun now |
| 21:45 | goldfeld | do you thin that's an expectation? |
| 21:45 | goldfeld | think* |
| 21:45 | noprompt | seangrove: what i wanted to make was a vcr w/ branching. |
| 21:46 | gfredericks | goldfeld: he's also probably tired of being a celebrity, so maybe if we stop gossiping about it he won't get scared off ;-) |
| 21:46 | noprompt | seangrove: record. navigate through changes, etc. |
| 21:47 | goldfeld | is that an om component you're talking about? |
| 21:47 | noprompt | goldfeld: yah. |
| 21:47 | noprompt | goldfeld: lots of fun work in that space. |
| 21:47 | noprompt | seangrove: i'd really love to know how you're using secretary. |
| 21:47 | goldfeld | definitely |
| 21:48 | goldfeld | where's the one you're talking about? |
| 21:48 | seangrove | noprompt: An example is in omchaya |
| 21:48 | noprompt | seangrove: in conjunction w/ om anyway. |
| 21:48 | seangrove | It's not as in-depth as our prod app, but it's there to show how |
| 21:48 | seangrove | It's pretty loosely coupled |
| 21:49 | noprompt | seangrove: so one of the patterns we came upon was when you have go blocks inside of your defroute. |
| 21:50 | noprompt | seangrove: every go block returns a next-state which gets merged with a blank-state on dispatch! |
| 21:50 | seangrove | Heh, we do have one of those in our prod app, but it's to handle waiting until some data from the server is loaded before firing |
| 21:50 | noprompt | seangrove: that's precisely the use case. |
| 21:51 | noprompt | seangrove: the only downside is the weird hash change in the url while waiting for the view to render for a slow response. |
| 21:52 | noprompt | it'd be awesome to get the om folks together in a google hangout or something to discuss ideas/patterns etc. |
| 21:52 | seangrove | Oh man, finished this right before I had to go, in ~4minutes from start to finish https://www.dropbox.com/s/vdnjnmfb5b120gk/om_save_restore.mov |
| 21:52 | goldfeld | company i'm in goes as far as hosting the city's clojure meetup, but it's been hard talking my boss into just going with om instead of react plus probably mori for some business logic, main thing for him is it would take a frontend dev a while to get running with a clojure workflow and mindset |
| 21:52 | seangrove | noprompt: definitely, looking forward to clojure/west |
| 21:52 | seangrove | Ok, really have to go! |
| 21:52 | noprompt | dnolen_: are you open to something like that? |
| 21:53 | noprompt | dnolen_: cyber table coders? |
| 21:53 | noprompt | :) |
| 21:57 | noprompt | goldfeld: you just have to do it and show your boss/team there's value. |
| 21:58 | noprompt | goldfeld: the team i'm on was using angular/coffeescript and the first week i was there i suggested clojurescript + om. so far it's been a success an folks are happy w/ it. |
| 21:59 | noprompt | goldfeld: there's a learning curve, and new problems along the way, but so far the team/client have loved it so far. |
| 22:00 | noprompt | goldfeld: iow you can't ask permission. it's like Programming Clojure book says, "show value" |
| 22:00 | noprompt | goldfeld: just spike on it. :) |
| 22:01 | noprompt | ok i'm yammering too much. sorry. :) |
| 22:04 | noprompt | Raynes, my old friend! |
| 22:04 | noprompt | :) |
| 22:04 | goldfeld | noprompt: no that's actually great advice and to be fair i'm allowed leeway on that front, he's actually done a thing or two in clojurescript back when he was the frontend team so i can do libraries/components in it and i'm looking forward to it, but the project hasn't started yet and i'm still stuck on an ex-backbone codebase on another project |
| 22:05 | goldfeld | right now i'm the frontend team, so i could even say "hey all the team is loving it!" |
| 22:06 | noprompt | goldfeld: bring it in at "gunpoint". :) |
| 22:06 | noprompt | goldfeld: hell, i brought garden in because "why wouldn't you want your entire codebase in one language?" :P |
| 22:07 | goldfeld | my coworker who's an html/css/standards specialist would be kinda sad |
| 22:07 | noprompt | why? |
| 22:07 | clojurebot | why is Why |
| 22:08 | goldfeld | i guess he like his sass |
| 22:08 | goldfeld | likes* |
| 22:08 | goldfeld | which i don't |
| 22:08 | noprompt | css is weird. at least garden gives you the power to abstract the weirdness away into something that's uniform and you have control over. |
| 22:09 | noprompt | the next version of garden, which i'm working on ATM, is going to expose several new protocols too. |
| 22:09 | goldfeld | i know! i'll be using garden on my next web-based side project, but i think the audience for it is precisely a programmer-minded one, which he isn't |
| 22:09 | goldfeld | right now i'm deep in node+cljs |
| 22:10 | goldfeld | i could be wrong though |
| 22:10 | noprompt | cool! just make sure you share libraries! |
| 22:10 | goldfeld | i've been pulling out some, the node cljs landscape is so sparse |
| 22:11 | goldfeld | i've seen the source for lighttable has done a lot of precisely what i've done wrapping nodejs's core modules, but i haven't seen any library wrapper released for that, so i'm pushing mine to clojars soon |
| 22:11 | noprompt | awesom. |
| 22:12 | goldfeld | plus there's this really cool curses lib for node called blessed which i'm evolving a bit under clojure, and maybe i'll take a hint or two from you on styling it |
| 22:12 | goldfeld | i mean, from your code, when i get to it |
| 22:12 | noprompt | i think once the secretary team can figure out how to make GET/POST/etc routes work in cljs we can target node js aswell. |
| 22:13 | noprompt | technically secretary will work w/ node but we'd like to have the verbs in the browser there. we just don't know the "right" way to do it. |
| 22:13 | goldfeld | the only effort i've seen on node+cljs servers is bodil's dogfort |
| 22:13 | goldfeld | and her redlobster lib for working with promises is really awesome |
| 22:13 | noprompt | oh the curses thing in cljs would be awesome! |
| 22:14 | goldfeld | yeah, easy interactive terminal apps in cljs for everyone! |
| 22:14 | goldfeld | i'm brushing it up |
| 22:14 | noprompt | gah! too much awesome stuff happening here. |
| 22:15 | goldfeld | i'm also got some work done on an org-parser in cljs+node, if that's of interest to anyone |
| 22:15 | goldfeld | still gotta pull out of my main project too |
| 22:16 | goldfeld | would love to talk more about the node+cljs story on clojure west |
| 22:17 | noprompt | definitely! |
| 22:18 | alew | what deployment and configuration management tools do people use for clojure apps here? |
| 22:23 | goldfeld | you mean something like pallet? |
| 22:23 | goldfeld | it's got connectors to most cloud services |
| 22:24 | alew | I mean exactly like pallet |
| 22:24 | goldfeld | so is pallet a good answer or are you looking for something else? |
| 22:24 | alew | I wanted to use pallet, but it's a little bit early |
| 22:24 | alew | I'm currently trying out ansible, but I was just curious what others found worked well |
| 22:25 | goldfeld | i actually don't have experience on that front but pallet's what i got my eyes on for when i need that |
| 22:25 | goldfeld | but ansible i guess would be my natural non-clojure option |
| 22:26 | alew | Pallet has a pretty fantastic philosophy and I like the direction they are heading |
| 22:26 | alew | but the new version had quite a few breaking changes so you would have to put in a bit of work to get a lot of basic stuff working from what I experienced |
| 22:53 | bob2 | is clojure.xml still the thing to be using for simple xml generation? |
| 22:54 | devn | bob2: there's clojure.data.xml |
| 23:03 | bob2 | I was slightly scared off it due to it being 0.0.7 and having had no code commits in 4 months |
| 23:03 | bob2 | but maybe it's just done-ish |
| 23:15 | devn | bob2: xml is after all, a pretty old problem |
| 23:15 | bob2 | heh |
| 23:21 | devn | yay for promises |