2011-12-15
| 00:11 | wolfjb | clojure-contrib seems to be only at 1.2.0 while clojure is at 1.3.0, am I missing something? |
| 00:12 | TimMc | wolfjb: contrib is dead |
| 00:12 | TimMc | clojurebot: What happened to contrib? |
| 00:12 | clojurebot | Titim gan éirí ort. |
| 00:12 | TimMc | clojurebot: What happened to clojure.contrib? |
| 00:12 | clojurebot | excusez-moi |
| 00:12 | TimMc | terrible bot |
| 00:13 | wolfjb | ah, so I don't need it then? |
| 00:14 | TimMc | wolfjb: Right, just pick up what you need as individual packages. http://dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Go |
| 00:14 | TimMc | Unfortunately, not everything made the transition -- some were already not being maintained. That's part of the reason for the splitting, I think. |
| 00:15 | wolfjb | ok, thanks! |
| 00:15 | wolfjb | that explains a lot |
| 00:16 | alexbaranosky | does anyone know if the shortcircuiting threading operators made it into a new contrib library? -?> -?>> etc |
| 00:17 | cemerick | core.incubator |
| 00:17 | alexbaranosky | cemerick, thanks |
| 00:18 | wolfjb | well, shucks, contrib.except isn't maintained |
| 00:18 | wolfjb | :( |
| 00:22 | TimMc | What did you want from there? |
| 00:22 | wolfjb | throw-if |
| 00:25 | TimMc | wolfjb: Looks like a pretty small lib. I bet it could easily be maintained as 1.2 and 1.3 compatible. |
| 00:26 | wolfjb | I wouldn't know how to do it, but I'd be happy to help |
| 00:26 | wolfjb | I've done lisp in the past and this is my first foray into clojure |
| 00:27 | wolfjb | I wonder, though, if it would be superseded by Slingshot ? |
| 00:30 | wolfjb | hmm... nevermind, Slingshot seems to be try/catch on steroids or something cool like that |
| 00:32 | TimMc | slingshot? |
| 00:32 | clojurebot | slingshot is the successor to clojure.contrib.condition: https://github.com/scgilardi/slingshot |
| 00:32 | TimMc | OK, clojurebot, I guess you're not so terrible. |
| 00:33 | TimMc | Raynes: I removed clojail from our copy and called eval in the client-side handler and now it's a glorified JS REPL. :-P |
| 00:33 | TimMc | one that round-trips through a server for no reason |
| 00:40 | wolfjb | I keep getting a warning about *classpath* not declared dynamic, but when I add the "fix" to project.clj (ala ^:dynamic *classpath*) then lein compile throws an illegal argument exception No value supplied for key: *classpath* |
| 00:40 | wolfjb | why is that? |
| 00:48 | wolfjb | ok, nevermind again. lein upgrade seems to have fixed it |
| 00:49 | wolfjb | as well as adding an exclusion for org.clojure/clojure for swank-clojure |
| 01:34 | mindbender | why are the ritz devs do hard to reach? |
| 01:34 | mindbender | *so |
| 02:00 | pyr | mindbender: you'll find them in pallet |
| 02:01 | pyr | #pallet i mean |
| 02:01 | pyr | but this is the wrong TZ |
| 02:01 | mindbender | pyr: thanks. what TZ will be appropriate |
| 03:40 | Blkt | good morning everyone |
| 03:42 | kral | 'morning |
| 03:42 | kral | are clojure.contrib deprecated? |
| 03:43 | pyr | yes |
| 03:43 | pyr | it is now split in several support libraries |
| 03:43 | pyr | http://dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Go |
| 03:44 | kral | pyr: ty |
| 03:44 | pyr | this is only valid for clojure 1.3 and later releases |
| 03:45 | kral | sure |
| 03:47 | pyr | that and the integer changes make up for most of the work adapting stuff to clojure 1.3 |
| 03:52 | kral | i'm going to start with 1.3 so is not a great issue for me, i think |
| 03:57 | pyr | if you're going from scratch, definitely go with 1.3 |
| 03:58 | pyr | you'll find some issues in your dependency chain |
| 03:58 | pyr | but no showstoppers |
| 04:12 | kral | ty for assistance pyr |
| 04:12 | pyr | np |
| 04:25 | mindbender | in the book growing object oriented software, can CI servers do the work of end to end testing. And is the authors idea of a walking skeleton analogous to a hello world program? |
| 04:27 | clgv | mindbender: I don't know the book. But to me it's almost sure that a "hello world program" can't be analogous to "continous integration tests" or "testing in general". |
| 04:28 | clgv | to me "hello world program" means "here I show you a few basics of that programming language. you can compare it to the examples you know from other languages." |
| 04:29 | mindbender | clgv: the end-to-end testing as talked about in the book is about automating deployment. while the context of hello-world program is more like a POC where you show mysql works with clojure and swing |
| 04:30 | mindbender | the book is a very interesting read maybe you should google it up to have an idea |
| 04:30 | clgv | mindbender: if any allegedly advanced concept is analogous to a "hello world program" it's certainly not advanced and not of much use ;) |
| 04:31 | mindbender | I was hoping clojure could provide us with a similar model of building software |
| 04:32 | clgv | mindbender: there is support for testing which surely can be done automatically and integrated within hudson or similar CI-software. I dont know if the latter integration already has a good clojure wrapper |
| 04:33 | mindbender | yes there is support but not one well documented like this one in terms of pulling the pieces together |
| 04:34 | clgv | there some different libraries for testing with clojure. the built-in one is clojure.test |
| 04:35 | clgv | there is also "midje" and "lazytest" - you should be able to find usage examples on their github pages or via google |
| 04:36 | clgv | I did test with clojure.test since that was described in one of the books I read on clojure |
| 04:42 | mindbender | clgv: look at this question: http://stackoverflow.com/questions/3127194/proper-continuous-integration-and-continuous-deployment-with-git-and-heroku. These are the kind of things I'm intersted in knowing about and more. If you read this book you will also get the idea of the walking skeleton for which I will like to see examples of skeletal frameworks we can take advantage of and customize rather than having to reinvent the wheel |
| 04:44 | clgv | mindbender: in general you can use every java library there is to avoid reinventing the wheel in clojure. in some cases you might benefit from building a clojure layer in front of the lib for better clojure-like syntax. |
| 04:44 | clgv | so you can extend your search to java libs and frameworks |
| 04:45 | mindbender | clgv: what about frameworks |
| 04:46 | clgv | java ones I meant. Hudson (or its new fork name) is a solution for CI |
| 04:46 | clgv | for example. |
| 04:49 | pyr | mindbender: FYI a mix of jenkins + midje + pallet does the trick for end-to-end automation |
| 04:50 | mindbender | pyr: that's a head-start towards where I want to be... checking it out |
| 04:51 | clgv | pyr: ah right. pallet for deployment? |
| 06:09 | pyr | clgv: yes |
| 06:09 | pyr | clgv: deployment and C&C |
| 08:05 | jheander | good morning! |
| 08:06 | jheander | what's the current take on automatic re-testing on clojure today? |
| 08:06 | jheander | is lazytest alive/active? |
| 08:07 | G0SUB | jheander: I don't think so. |
| 08:08 | G0SUB | jheander: clojure.test, test.generative & midje are the good options at the moment. |
| 08:09 | jheander | is there any way to set up automatic re-testing of changed files with clojure.test? I like the very simple structure of clojure.test, but would like to reduce the cycle times |
| 08:37 | kephale | amalloy_: two functions that could be useful in ordered.set: set (replace a member with a new member at the same position) and index (what is the index of this member) |
| 08:54 | pyr | hi #clojure |
| 08:55 | pyr | if i want to build a jar with multiple classes that have a -main |
| 08:55 | pyr | how do I go about it |
| 08:55 | clgv | ,(println "hi pyr") |
| 08:55 | clojurebot | hi pyr |
| 08:55 | pyr | now that's a warm welcome |
| 08:56 | clgv | java -jar Your.jar ClassOne |
| 08:56 | clgv | that should work afaik |
| 08:56 | pyr | it doesn't seem to |
| 08:56 | pyr | i use my namespace path as the class |
| 08:56 | pyr | maybe i should explicitly name the class |
| 08:56 | pyr | (I get NoClassDefFound exceptions) |
| 08:57 | kotarak | java -cp your.jar ClassOne maybe? |
| 08:57 | pyr | i tried this |
| 08:58 | pyr | ok, i have to specify :aot |
| 08:58 | clgv | kotarak: ah right. my error. |
| 08:58 | kotarak | pyr: you actually AOT-compiled your namespace |
| 08:59 | pyr | i works with :aot set to my namespaces |
| 09:40 | AWizzArd | I would like to serve static content with moustache. Is there a more idiomatic way to do this then (app ["html" "file.html"] my-handler) (defn my-handler [req] (ring.util.response/resource-response "/web/html/file.html")) ? |
| 09:40 | AWizzArd | then --> than |
| 09:44 | kotarak | AWizzArd: you can use any ring handler, now? (app ["html"] ring/static-content-handler-I-forgot-then-name-of) |
| 09:45 | kotarak | s/now/no/ |
| 10:08 | gtrak` | wasn't there a clojure library that did more than just the libvirt java bindings? |
| 10:09 | gtrak` | ah, I found it, vmfest |
| 10:38 | TimMc | &(reify Object (getClass [_] Long)) |
| 10:38 | lazybot | java.lang.IllegalArgumentException: Can't define method not in interfaces: getClass |
| 10:38 | TimMc | Not the best error message... |
| 10:38 | TimMc | The problem is actually that getClass is final. |
| 10:40 | TimMc | I so don't feel like filing a Jirum for this. |
| 10:41 | mefesto | is there a way to have hiccup output html using indentation? |
| 10:42 | mefesto | hiccup pprint just for readability of output while developing |
| 10:43 | ordnungswidrig | Class of (defn foo!) and (defn foo_BANG_) is identical. Does this lead to any problems? |
| 10:46 | TimMc | ordnungswidrig: It isn't double-underscore for the second? |
| 10:46 | ordnungswidrig | TimMc: it'd tought it was but it's foo_BANG_ |
| 10:47 | ordnungswidrig | not to bad but a wonder |
| 10:48 | TimMc | &(apply = (map munge ["!" "_BANG_"])) |
| 10:48 | lazybot | ⇒ true |
| 10:48 | TimMc | ew |
| 10:50 | TimMc | &(apply = (map munge ["-" "_"])) |
| 10:50 | lazybot | ⇒ true |
| 10:51 | TimMc | I guess it's too late to change that. |
| 10:53 | ordnungswidrig | TimMc: yes, I think it is. |
| 10:53 | ordnungswidrig | I just wondered if they will be problems because of that, e.g. when AOTing |
| 10:58 | TimMc | I'm having trouble figuring out a place it would matter. |
| 10:58 | TimMc | &(map munge ["A+B" "A_PLUS_B"]) |
| 10:58 | lazybot | ⇒ ("A_PLUS_B" "A_PLUS_B") |
| 10:58 | TimMc | there we go |
| 11:03 | TimMc | I guess as long as you aren't in the habit of using UPPER_CASE var names you're good. |
| 11:04 | TimMc | fn names, specifically |
| 11:08 | jcromartie | h |
| 11:08 | jcromartie | hi |
| 11:08 | jcromartie | what's the state of the art with Clojure FizzBuzz? :) |
| 11:08 | jcromartie | I'm in the mood |
| 11:09 | gtrak` | jcromartie, try counting with lambdas |
| 11:10 | gtrak` | http://en.wikipedia.org/wiki/Church_encoding |
| 11:12 | jcromartie | gtrak`: Church numerals are bad for code golf |
| 11:12 | TimMc | clojure.core/fizzbuzz |
| 11:12 | TimMc | It used to be in contrib. |
| 11:14 | TimMc | jcromartie: http://web.archive.org/web/20090602074545/http://www.cliff.biffle.org/esoterica/hq9plus.html |
| 11:15 | jcromartie | hah, hilarious |
| 11:16 | AWizzArd | ~seen cgrand |
| 11:16 | clojurebot | cgrand was last seen joining #clojure, 32992 minutes ago |
| 11:16 | TimMc | jcromartie: And of course, the object-oriented version: http://www.dangermouse.net/esoteric/hq9plusplus.html (which is the first one I learned about) |
| 11:16 | AWizzArd | ~(/ 32992 60 24.0) |
| 11:16 | clojurebot | eg, https://github.com/clojure/tools.logging is the new version of clojure.contrib.logging |
| 11:21 | TimMc | ,(/ 32992 60 24.0) |
| 11:21 | clojurebot | 22.91111111111111 |
| 11:26 | jcromartie | (defn fb[ns](doseq[w(map(fn[n](keep(fn[[d x]](when(zero?(mod n d))x)){1 n 2"fizz"3"buzz"}))ns)](apply println w))) |
| 11:26 | jcromartie | that's my best golfing so far |
| 11:28 | TimMc | argh, don't remove spaces |
| 11:28 | jcromartie | TimMc: I thought that was the whole point |
| 11:31 | jcromartie | I mean if we're talking fizz buzz code golf here |
| 11:37 | TimMc | I prefer to count forms. |
| 11:37 | TimMc | #(+ 1 2) is 4 forms |
| 11:37 | TimMc | (or is it 5?) |
| 11:39 | Borkdude | does anyone know if this is possible in emacs? http://superuser.com/questions/368341/emacs-two-frames-for-one-file-seemless-scrolling |
| 11:40 | TimMc | Split screen with yoked scrolling> |
| 11:40 | TimMc | interesting question |
| 11:40 | cemerick | Is it true that package.el is included in Emacs 24? |
| 11:40 | cemerick | (but was not in 23, that is?) |
| 11:40 | Borkdude | oh fuck, I just meant "buffers" instead of "frames" |
| 11:41 | TimMc | Borkdude: Actually, you mean windows. |
| 11:41 | TimMc | 1 file, 1 buffer, 2 windows. |
| 11:41 | Borkdude | ah yes, hm. |
| 11:42 | raek | cemerick: yes |
| 11:42 | cemerick | thanks |
| 11:42 | jcromartie | Borkdude: there's follow mode |
| 11:43 | jcromartie | answered :) |
| 11:43 | jcromartie | PLZ UPVOTE AND ACCEPT MY CODES THX |
| 11:43 | Borkdude | jcromartie: great :) |
| 11:44 | cemerick | I'm surprised there's not emacs stack exchange site. |
| 11:45 | Borkdude | jcromartie: will do |
| 11:45 | Borkdude | cemerick: me as well |
| 11:45 | Borkdude | jcromartie: can only accept after so many minutes |
| 12:22 | devn | cemerick: yes it's true, but IIRC the package.el that is included doesn't support multiple package sources |
| 12:22 | devn | so if you want marmalade I think you'll need a fresher version |
| 12:24 | raek | really? |
| 12:25 | cemerick | I *think* I was able to use marmalade without a problem? |
| 12:25 | raek | I know that the version from ELPA did not have multiple repo support |
| 12:26 | hiredman | cemerick: it seems like you are much more likely to get a reliable answer about emacs questions from #emacs |
| 12:58 | bartek1 | hello, is there a function f that to this: (f [2] [2 3]) -> [2 3 3] ? |
| 12:59 | bartek1 | sorry |
| 12:59 | bartek1 | -> [2 2 3] |
| 13:01 | Bronsa | ,(apply conj [2] [2 3]) |
| 13:01 | clojurebot | [2 2 3] |
| 13:01 | raek | ,(into [2] [2 3]) |
| 13:01 | clojurebot | [2 2 3] |
| 13:01 | bartek1 | thanks :) |
| 13:01 | Bronsa | thanks clojurebot |
| 13:01 | TimMc | into *might* be faster |
| 13:02 | TimMc | I don't know if conj with multiple additions uses transients. |
| 13:06 | compmstr | Does anyone know why (apply + (map * a b)) is roughly 5x slower than doing the same thing with loop/recur? |
| 13:06 | technomancy_ | laziness overhead prolly? |
| 13:06 | compmstr | I tried putting lazyness into the loop version, ran just a little slower |
| 13:06 | raek | allocations for the cons cells? |
| 13:08 | hiredman | compmstr: the loop version also most likely inlines * and + |
| 13:08 | technomancy_ | oh, of course |
| 13:08 | technomancy_ | HOFing + is going to kill perf |
| 13:09 | compmstr | what does HOFing mean? |
| 13:09 | hiredman | (reduce #(+ % %2) (map #(* % %2) a b)) may also be faster |
| 13:09 | technomancy_ | higher-order-functioning |
| 13:09 | compmstr | ah |
| 13:11 | hiredman | if you pretend clojure is a lisp2 for certain functions you get better performance |
| 13:12 | compmstr | hmm, still roughly 5x slower with reduce/map using the lambdas |
| 13:12 | hiredman | compmstr: most likely the allocation overhead then |
| 13:12 | compmstr | It may well be the allocation of the list from map though, since the loop version just uses an accumulator |
| 13:12 | compmstr | thanks |
| 13:15 | Scriptor | morning |
| 13:17 | duck1123 | does anyone know what it will take to get clout to match paths like "/keywords/:name.:format" again? The new version broke a lot of my old code |
| 13:19 | hiredman | duck1123: https://github.com/weavejester/clout/commit/affbad08765a7debe4f034ba4e20e2185fd89637 |
| 13:23 | amalloy | on 1.3, isn't the difference that loop/recur can work entirely with primitives? when you use map/reduce you have to box them and unbox every time you want to do math |
| 13:24 | amalloy | (technomancy_, hiredman, compmstr) |
| 13:24 | duck1123 | hiredman: I'm not sure I follow, are you suggesting I undo that commit? |
| 13:25 | compmstr | amalloy: I'm not sure, does nth do boxing? That's what I use to access the elements of the seq |
| 13:26 | hiredman | compmstr: generally function calls all box |
| 13:27 | hiredman | and numbers in collections are also always boxed (there are some vectors that can hold primitives) |
| 13:28 | dnolen | compmstr: numbers are always boxed as they are passed into functions, unless the function takes primitives, or you have already coerced the arguments to primitives for the inlineable fns (like +) |
| 13:28 | dnolen | compmstr: inlining is not possible (yet) w/ higher order usage. |
| 13:28 | compmstr | ah, ok |
| 13:29 | dnolen | (+ 1 2), is inlineable and arg are primitive in Clojure 1.3 |
| 13:29 | clojurebot | *suffusion of yellow* |
| 13:29 | hiredman | if you have a (+ a b) and the compiler can tell that a and b are both longs, it well replace it with an ladd |
| 13:29 | hiredman | (jvm long add instruction) |
| 13:29 | dnolen | (map + [1 2]), 1 and 2 are boxed in the collection, + is not inlineable |
| 13:30 | hiredman | which is much faster than the normal function call path |
| 13:30 | compmstr | That makes a lot of sense now, thanks |
| 13:30 | dnolen | compmstr: so as far as why loop/recur is so much faster than map, it's not that map is slow, and I think the JVM can even optimize those allocations well. it's that w/ loop recur JVM can just magically inline everything. |
| 13:30 | hiredman | Var.getRawRoot + IFn.invoke + Numbers.add + ladd |
| 13:31 | hiredman | dnolen: the clojure compiler can magically inline everything (which does wonders for the jvm too) |
| 13:32 | dnolen | compmstr: it's illustrative to compare the same type of operations in Scala - the numbers for higher order ops on collections are pretty similar. |
| 13:32 | dnolen | hiredman: Clojure inlines, the JVM inlines. |
| 13:32 | hiredman | sure |
| 13:32 | dnolen | hiredman: yes |
| 13:32 | dnolen | I meant to agree |
| 13:32 | hiredman | alright |
| 13:32 | hiredman | :) |
| 13:34 | hiredman | dnolen: can't they leverage the type system to help them do stream fusion like haskell? |
| 13:35 | dnolen | hiredman: I suppose they could, but I haven't seen anything like that yet. |
| 13:35 | hiredman | maybe I just have optimizations like stream fusions just tired too much to static typing in my mind |
| 13:56 | technomancy | http://p.hagelb.org/github-userid-percentile.html |
| 13:59 | tsdh | Hi. Can anyone explain why my function errors with "nth not supported"? Code & error at http://pastebin.com/7NSji1rn |
| 13:59 | tsdh | Line 38 is actually the line with the (defn ... |
| 14:00 | hiredman | nth not supported on this type: TreeImpl |
| 14:00 | hiredman | you are calling nth on an instance of TreeImpl somewhere, and TreeImpl doesn't have the right interfaces/methods to support nth |
| 14:02 | tsdh | hiredman: Yeah, but its a varargs list, so I'd expect the arg after & to be a list where the destructuring form [t] takes the first element of the list. See my second call where it actually does exactly that, but it works only the first time. |
| 14:03 | hiredman | tsdh: recur doesn't do destructuring |
| 14:03 | hiredman | well, I should say, recur doesn't do varargs |
| 14:03 | amalloy | right. the third arg is a seq |
| 14:04 | hiredman | if x is bound to a list, when you recur and rebind x you should pass an x |
| 14:04 | hiredman | er a list |
| 14:04 | mrevil | I'm exposing a clojure API via REST, and I'm trying to do some input validation, how do I check if something is of type String, or is enumerable? |
| 14:05 | hiredman | (doc string?) |
| 14:05 | amalloy | (this is not actually true, but:) the compiler transforms (snoc a b c d) into (snoc a b [c d]). it doesn't do that when recurring, because you're supposed to know how many args you're passing |
| 14:05 | clojurebot | "([x]); Return true if x is a String" |
| 14:05 | tsdh | hiredman, amalloy: Indeed. Changing to (recur ... [nt]) does the trick... |
| 14:06 | amalloy | using & [x] for an optional arg defaulting to nil is kinda gross anyway. i mean, it's convenient, but it's evil |
| 14:07 | tsdh | amalloy: Yeah, but my function is actually a macro expansion, and the macro would become pretty hard if I supported many the complete defn interface with overloading... |
| 14:09 | amalloy | (a) i don't really buy that, (b) it's already apparently hard enough that you had to ask in #clojure and wrap multiple things in vectors for no "obvious" reason |
| 14:09 | amalloy | but of course (c) you can write whatever code you want without worrying about my opinion |
| 14:11 | TimMc | technomancy: percentile... as in, what percent of the github employees have had accounts longer than the given ID has? |
| 14:11 | technomancy | TimMc: right-o |
| 14:12 | technomancy | the great thing about your github id percentile score is that even though it starts at 100 it can only go down over time. |
| 14:14 | tsdh | amalloy: (a) Maybe I'm missing something, but don't I need to get my macro args as "name & args" and then test each and every component in args for its type to determine if an optional docstring is given and so forth? (b) the macro is pretty easy, it's just that the expansion looked correct to me, (c) I appreciate your opinions. |
| 14:16 | amalloy | tsdh: i can't answer (a) without knowing what your macro actually is. but you might be interested in tools.macro/name-with-attributes to parse out the docstring &c |
| 14:17 | amalloy | technomancy: whaaaaa? surely it can go up if they fire someone who joined after you |
| 14:17 | tsdh | amalloy: I'll check that, thanks. |
| 14:17 | technomancy | amalloy: oh, derp. yes. |
| 14:18 | amalloy | technomancy: time to make that a heroku app, btw |
| 14:18 | technomancy | amalloy: awesome; let me know how it goes |
| 14:18 | technomancy | noir? |
| 14:18 | clojurebot | noir is great |
| 14:18 | technomancy | clojurebot: that's just your opinion bro |
| 14:18 | clojurebot | bartj: it's not broken. Unless you know the performance hit there is actually a problem, I'd recommend leaving it alone. |
| 14:18 | technomancy | wise words. |
| 14:20 | amalloy | technomancy: heroku just...sent me an activation link in an email, except it's not actually an http link? i have to copy/paste this to my browser, really? |
| 14:20 | cemerick | Raynes: What is the canonical clojail repo? Raynes/clojail points to the one under cogniitivedissonance, but flatland/clojail has the latest commits… |
| 14:20 | amalloy | cemerick: flatland |
| 14:20 | technomancy | amalloy: not our fault your MUA sucks. =) |
| 14:20 | amalloy | technomancy: no! the other links in the email are real links! |
| 14:21 | technomancy | oh; we send out HTML email by default? =( |
| 14:21 | amalloy | yes |
| 14:21 | technomancy | dang it |
| 14:21 | amalloy | and all but that one link are wrapped in <a> |
| 14:21 | amalloy | my MUA does suck though |
| 14:21 | amalloy | in your defense |
| 14:22 | technomancy | if you forward me the email I'll raise it on the DX team |
| 14:22 | noncom | hello, friends! a newb question follows: i want to use eclipse counterclockwise to code with clojure. however the ccw eclipse plugin is still about clojure 1.2. it is known to me that much has changed in version 1.3. so do i lose much if i use the ccw plugin and clojure 1.2 with it? |
| 14:22 | pjstadig | (percentile "pjstadig") ; => 49 |
| 14:22 | technomancy | we have a few guys who are paid to obsess about that kind of stuff |
| 14:22 | pjstadig | is that good or bad? |
| 14:23 | technomancy | pjstadig: neither? |
| 14:23 | technomancy | it's median |
| 14:23 | pjstadig | i'm average? |
| 14:23 | pjstadig | on average people think they're above average |
| 14:24 | cemerick | amalloy: thanks; might want to start dropping repos or something ;-) /cc Raynes |
| 14:25 | technomancy | cemerick: but that won't help Clojure win on the github languages high-score board |
| 14:25 | cemerick | amalloy: I actually use & [x] all the time :-P |
| 14:25 | amalloy | cemerick: so do i. like i said it's easy, but it's evil :P |
| 14:25 | cemerick | technomancy: you're right, I'm optimizing for the wrong things again |
| 14:25 | noncom | guys, am i losing much if i program with clojure 1.2 instead of 1.3? |
| 14:27 | amalloy | noncom: seancorfield sheds a single tear every time someone uses 1.2. but your tear will be a drop in the bucket, so... |
| 14:27 | pjstadig | noncom: if you need much of what is in 1.3, then yes. if not, then no |
| 14:28 | technomancy | noncom: only if you want insane speed out of numeric ops |
| 14:29 | TimMc | noncom: If you don't have a compelling reason to use 1.2, go with 1.3 -- especially if you are writing something other people might want to use. |
| 14:30 | dnolen | noncom: I would not program in 1.2 unless there's some library that hasn't been ported that you need. |
| 14:31 | duck1123 | even if you're going 1.2, still stay away from monolithic contrib |
| 14:32 | noncom | yeah, i have made a little research and going with 1.2 seemed like evil after that. to bad that the clojure plugin for my favorite ide is not updated ((( |
| 14:33 | noncom | you confirm what it seemed. |
| 14:35 | dnolen | noncom: it seems like ccw might work w/ 1.3 from the notes on the project page - have you tried it? |
| 14:36 | cemerick | ccw works with any version Clojure project, 1.1 - 1.4.0-SNAPSHOT. |
| 14:37 | cemerick | I think it still defaults projects to 1.2, but there's no reason to stay with that default if you care otherwise. |
| 14:37 | cemerick | ccw itself is implemented using Clojure 1.2, but that doesn't affect what version of Clojure *you* can use. |
| 14:38 | cemerick | noncom: ^^ |
| 14:39 | noncom | wow, i have not tried putting 1.3 inside, the directions are too vague and i am too incompetent to dig in eclipse internals |
| 14:41 | cemerick | eclipse internals? |
| 14:41 | cemerick | noncom: how did you create your project? |
| 14:41 | Raynes | cemerick: What are you using clojail for? |
| 14:41 | cemerick | Raynes: Nothing, just wanted the link correct for the book. |
| 14:42 | Raynes | Okay, why are you linking to it from your book then? :P |
| 14:42 | noncom | cemerick: i use the File->New->Other->Clojure->Clojure Project wizard. |
| 14:42 | TimMc | Raynes: Every book should link to Clojail. |
| 14:43 | cemerick | Raynes: A footnote talking about how network REPLs have not authentication or authorization controls. |
| 14:43 | cemerick | s/not/no |
| 14:44 | Raynes | cemerick: Hot. |
| 14:44 | cemerick | noncom: OK, so ccw added Clojure 1.2 jars to your project's build path. |
| 14:45 | cemerick | You just need to get Clojure 1.3, and replace the 1.2 references with ones to the 1.3 jar. |
| 14:46 | Raynes | Whoa. |
| 14:46 | Raynes | I think it just set in that clojail is going to be linked in a book. |
| 14:46 | noncom | cemerick: wow, i did not think of that because of them telling about problems with nREPL whatever it is |
| 14:46 | TimMc | Raynes: Don't move that repo! |
| 14:46 | Raynes | Never. |
| 14:46 | cemerick | noncom: What problems with nREPL? |
| 14:49 | noncom | cemerick: facepalm to me, i admit i was not very descreet |
| 14:50 | cemerick | no worries — give things a roll upgrading to Clojure 1.3, and if there are any problems, either ping me here, or send a msg to the ccw ML. |
| 14:50 | noncom | i have just checked the installed software section and it says nREPL 0.0.5 |
| 14:50 | cemerick | Yup, that's ok. :-) |
| 14:54 | cemerick | Raynes: even worse are old repos linked in search engines |
| 14:54 | cemerick | :-P |
| 14:54 | cemerick | ddg points to Raynes/clojail |
| 14:54 | cemerick | FWIW |
| 14:54 | Raynes | cemerick: I just need to add links. |
| 14:54 | Raynes | The cogdis repo can go, I think. |
| 14:55 | cemerick | I'd add a final commit that rm's everything but a single link in a README. |
| 14:55 | cemerick | makes it hard to miss, i.e. https://github.com/cemerick/nREPL |
| 14:57 | tsdh | amalloy: You were right. It wasn't that hard to teach my macro working with overloaded argument lists. ;-) |
| 14:58 | noncom | cemerick: thank you and other people for helping! i guess it is that stereotype, that i am coming from the oop world, that weights on me, paralyzing in fear when standing in front of anything that mentions 'functional', rendering me faint and helpless. and many other programmers too. however, i feel functional programming as something very attractive and incresingly significant in today and in future. thank good people for sharing! |
| 15:00 | cemerick | noncom: I take it you're 1.3-ready now. :-) |
| 15:00 | cemerick | Spread the good word. ;-) |
| 15:06 | amalloy | hooray for heroku: http://electric-sunrise-7335.herokuapp.com/technomancy |
| 15:06 | technomancy | amalloy: oh man... I was literally going to do that right after lunch. |
| 15:07 | technomancy | hilarious |
| 15:07 | amalloy | <technomancy> amalloy: awesome; let me know how it goes |
| 15:07 | amalloy | <amalloy, secretly> ;; challenge accepted, bro |
| 15:11 | raek | what does it measure? |
| 15:11 | amalloy | raek: http://p.hagelb.org/github-userid-percentile.html - it was my first heroku app so i just got up something barebones |
| 15:12 | cemerick | great, more metrics for me to suck at |
| 15:12 | amalloy | cemerick: i bet you're in better shape than i am |
| 15:13 | TimMc | 76 for me |
| 15:14 | raek | so it's like a (non-linear) mesure of how early you joined github? |
| 15:14 | TimMc | raek: what percent of github employees have an account older than yours |
| 15:14 | amalloy | TimMc: i've got an embarrassing 87% |
| 15:15 | amalloy | raek: fwiw, just updated the app with a description |
| 15:15 | raek | 81% for me... |
| 15:16 | amalloy | c'mon, there's gotta be someone newer than me |
| 15:17 | technomancy | amalloy: needs some styling and a splash page; collab me and I'll see about adding that after noms. |
| 15:17 | amalloy | technomancy: yeah, i hate webdev. https://github.com/amalloy/github-percentile is all yours if you want it to be pretty |
| 15:18 | amalloy | if you want collab rights of some kind on heroku, i don't know what that means |
| 15:19 | technomancy | $ heroku sharing:add phil.hagelberg@heroku.com |
| 15:19 | technomancy | but I can just go through pull requests |
| 15:20 | technomancy | that's like the one common thing I haven't added to lein-heroku yet |
| 15:21 | tmciver | 92. Ha! Beat that! |
| 15:21 | Raynes | amalloy: org/members will probably only return members up to 30. |
| 15:21 | noncom | cemerick: yeah, i will!))) tomorrow i guess, it is too late here. i will see sweet dreams about clojure and other lisps! and prolog. |
| 15:22 | noncom | haha) |
| 15:22 | Raynes | I haven't added lazy seqifying yet. |
| 15:23 | technomancy | Raynes: actually gives me 55, which I think is right |
| 15:24 | mindbender | It's just so problematic getting swank-clojure or ritz to work with emacs.. now I'm getting the famous (cl-assertion-failed (keywordp module)).. I can't remember how I resolved it the last time. Can someone please tell me how to get rid of all slime on my emacs and start a clean slate |
| 15:24 | mindbender | or better how to control this multitudinal versions of slime |
| 15:31 | mindbender | sorry here is a backtrace https://gist.github.com/1482742 |
| 15:33 | cemerick | mindbender: AFAIK, you're mostly hosed if you're trying to run multiple revs of SLIME and/or maintain SLIME for CL and Clojure simultaneously. |
| 15:34 | mindbender | cemerick: yes I think that's my problem actually at times you need to work with a different version of slime for different projects and in the end they conflict |
| 15:34 | technomancy | cemerick: is correct. |
| 15:35 | mindbender | I am still at odds how to control this many slime |
| 15:35 | technomancy | it's possible to do if you only use M-x clojure-jack-in for clojure and don't load the CL-compatible version into an instance until you need it, but clojure and CL in the same emacs process isn't going to work. |
| 15:36 | amalloy | (edit: i learned how to pick less-crappy domain names for heroku, so if anyone wants to play with the github-percentile stuff it's now at http://github-percentile.herokuapp.com/YOURGITHUBUSERNAME) |
| 15:59 | technomancy | cools |
| 15:59 | semperos | I've written a custom appender for log4j in Clojure (based on http://corfield.org/blog/post.cfm/clojure-and-log4j), let's say in a file appender.clj |
| 16:00 | semperos | I have a Swing GUI, whose code lives in a file gui.clj |
| 16:00 | semperos | I want my appender to append logs to a JTextArea, but I'm having trouble figuring out how to "set" my target JTextArea in my appender, so it's .append method prints to the component |
| 16:01 | semperos | any thoughts? |
| 16:05 | thorwil | hi! i need a list of booleans, one for each item in ks, on whether it matches one in feeds. what i have now seems kinda complicated: (map #(-> (some #{%} feeds) nil? not) ks) |
| 16:08 | TimMc | Raynes: o you know if there is an existing utility for lazy-seqifying chunked lists? |
| 16:08 | Raynes | TimMc: No idea. |
| 16:08 | semperos | nm, was just complicated my namespace dependencies... |
| 16:08 | TimMc | Raynes: If not, that would be a nice utility to extract from your GitHub API seqifier. |
| 16:08 | TimMc | ok |
| 16:10 | amalloy | TimMc: i know alex baranosky's fork of useful has that |
| 16:10 | amalloy | i don't remember if i added it to useful as well |
| 16:11 | amalloy | TimMc: https://github.com/flatland/useful/blob/develop/src/useful/seq.clj#L176 |
| 16:16 | _ulises | what's the correct way of doing thread-local bindings? I've tried both with binding and with-redefs (http://pastebin.com/TWTk9Yr9) but no joy. I'm using clojure 1.3. |
| 16:16 | Bronsa | _ulises: you have to define it first |
| 16:17 | Bronsa | (def ^:dynamic *self*) |
| 16:17 | _ulises | Bronsa: yes, sorry, *self* was defined exactly like that |
| 16:17 | _ulises | forgot to include it |
| 16:19 | _ulises | Bronsa: http://pastebin.com/WFVUqY54 same thing (*self* was declared with ^{:dynamic true} before) |
| 16:19 | raek | _ulises: btw, with-redefs is not thread-local |
| 16:19 | _ulises | oh |
| 16:20 | raek | 'binding' introduces a thread-local mutable variant of a var. |
| 16:20 | raek | in your case you start another thread, so it will not see that binding |
| 16:20 | _ulises | indeed |
| 16:21 | _ulises | so I'm wondering how I can make that thread see the binding |
| 16:21 | _ulises | perhaps I just don't understand anything at all |
| 16:21 | _ulises | and should just become a shoemaker or something |
| 16:21 | raek | what do you want to use this for? |
| 16:21 | _ulises | (not that shoemaking is any easier) |
| 16:22 | _ulises | I'm writing a small actors lib. to get acquainted with agents |
| 16:22 | _ulises | and I'd like to spawn actors and have their name bound to *self* |
| 16:22 | raek | alright, similarly to *agent* in clojure? |
| 16:23 | _ulises | eep |
| 16:23 | _ulises | is *agent* bound to the current agent? |
| 16:23 | raek | yup |
| 16:23 | _ulises | current = the one running |
| 16:23 | _ulises | well, that does it for me then |
| 16:24 | raek | in case you wanted to implement something like that yourself, you could just move the binding call to within the thread body |
| 16:24 | _ulises | yes, but in the real case I want to define actors by providing a fun and nothing else |
| 16:24 | _ulises | so I don't want to expose that |
| 16:24 | raek | (.start (Thread. #(binding [*self* ...] ...code here...))) |
| 16:25 | raek | the var can be both :dynamic and :private |
| 16:25 | _ulises | alternatively I could define the interface to the fun to be something like [name ...] and have the fun return the handler (another fun) and then just use a (let...) |
| 16:25 | _ulises | :private? |
| 16:26 | TimMc | amalloy_: I don't know if that's quite what's needed. |
| 16:26 | raek | a var marked as private will not be pulled into another person's namespace when that person uses 'use' |
| 16:27 | _ulises | oh, cool |
| 16:27 | raek | and you will get an error if you try to access it from outside the namespace it was defined in |
| 16:27 | _ulises | ah, that's very good, thanks! |
| 16:27 | raek | (it can be circumvented, however) |
| 16:27 | Bronsa | @#'trick |
| 16:28 | raek | (defn- foo ...) = (defn ^{:private true} foo ...) = (defn ^:private foo ...) |
| 16:28 | _ulises | nice |
| 16:28 | _ulises | I think I'll stop trying to bind *self* because it's just not working |
| 16:28 | _ulises | :( |
| 16:29 | raek | (defn spawn [f] (let [pid (make-new-pid)] (.start (Thread. #(binding [*self* pid] (f)))))) |
| 16:29 | raek | _ulises: you should be able to do something like that |
| 16:30 | _ulises | hum, does make sense |
| 16:30 | _ulises | want to see the rest of the code? I think I'm messing up in the way I init the agents |
| 16:30 | raek | _ulises: oh, also revaluate all the code that uses *self* after making it dynamic |
| 16:30 | _ulises | what do you mean "revaluate"? recompile? |
| 16:30 | raek | yes |
| 16:30 | _ulises | ah, yes, always do that |
| 16:31 | _ulises | just to be sure |
| 16:31 | _ulises | aaah |
| 16:31 | _ulises | right, I know where I'm messing up |
| 16:31 | _ulises | (I think) |
| 16:31 | raek | what was it? |
| 16:32 | _ulises | one sec. making a small example |
| 16:33 | _ulises | no, that wasn't it :/ |
| 16:34 | _ulises | no idea what's going on now |
| 16:34 | _ulises | :D |
| 16:34 | raek | what does the code look like? |
| 16:34 | _ulises | let me paste it |
| 16:36 | _ulises | raek: http://pastebin.com/QTYzMr1C |
| 16:36 | _ulises | I can walk you through it if it's too messy :/ |
| 16:36 | _ulises | ignore the macros handle and handle-named, I'm not using them |
| 16:37 | raek | are you sure *actors* should be dynamic? |
| 16:37 | _ulises | no, that one shouldn't |
| 16:37 | _ulises | my bad |
| 16:38 | raek | it doesn't make much sense to have a thread-local value for the atom of the map of all actors |
| 16:39 | _ulises | indeed not |
| 16:39 | Borkdude | what mode in emacs to show long sentences with an arrow on the side continuing on the next line? |
| 16:41 | raek | _ulises: in spawn, why do you send to the agent and then wait for it? couldn't you just initialize the agent with the desired value instead of nil? |
| 16:41 | _ulises | I could I suppose |
| 16:41 | technomancy | does C-c C-d C-p work from slime for anyone else? |
| 16:42 | raek | hrm, maybe you do want the "initial function" to be run inside the agent |
| 16:43 | _ulises | ideally initting an actor should take that long? |
| 16:43 | _ulises | technomancy: what is that supposed to do? it just asked me "Package:" in the minibuffer |
| 16:43 | raek | _ulises: actors and agents are not exactly the same thing. an agent is more like an atom, but where the state is updated with the function later on some other thread |
| 16:43 | technomancy | _ulises: if you give it a namespace, does it give an error? |
| 16:43 | _ulises | raek: yes, I'm just using agents as a way of spawning threads, etc. |
| 16:44 | raek | _ulises: then you can just use 'future' or 'future-call' |
| 16:44 | _ulises | technomancy: yup, plenty errors |
| 16:44 | technomancy | _ulises: ok, same here |
| 16:44 | raek | if you don't need the managed state and the function queue |
| 16:44 | y3di | anyone know what the C irc channel is? |
| 16:44 | _ulises | technomancy: mind you, perhaps my setup is not like yours? |
| 16:45 | _ulises | raek: hum, not sure how that would work? with futures I mean |
| 16:45 | technomancy | _ulises: if you use M-x clojure-jack-in then there's not much variation between individual user setups these days. |
| 16:45 | technomancy | though somehow cemerick was able to get it to work |
| 16:45 | _ulises | technomancy: but I don't, I'm still with clojure-mode and slime-connect |
| 16:45 | technomancy | _ulises: oh, interesting. good to know. |
| 16:45 | clojurebot | excusez-moi |
| 16:45 | technomancy | apparently cemerick's Emacs prowess is formidable. |
| 16:45 | _ulises | raek: as in, with futures, once you've calculated the value, it's cached? |
| 16:46 | raek | _ulises: to be more precise: all 'future' does is to spawn a thread and run som code in it. it sounded like that was all you needed from agents |
| 16:46 | cemerick | technomancy: what are we talking about? |
| 16:46 | TimMc | Borkdude: That's what my Emacs does already. |
| 16:46 | Raynes | cemerick: He just said your prowess is formidable. Don't look into it. |
| 16:46 | _ulises | raek: yes, but I want to have the option of re-running the computation on a new message |
| 16:46 | technomancy | cemerick: I can't get the slime-apropos-package command working; I had assumed it was only implemented in the CL swank server, but apparently you got it working. =) |
| 16:46 | _ulises | raek: so, the pong actor should react to :ping messages forever |
| 16:46 | Borkdude | TimMc: normally my emacs does that as well, but now the line just runs from the screen |
| 16:46 | raek | _ulises: yes, you can wait for the return value to be computed by using deref. once it is done, deref will always return the same thing |
| 16:47 | _ulises | raek: yeah, so a future might not be what I want, since messages may contain payloads and the response of the actor may depend on the payload |
| 16:47 | cemerick | Raynes: Part of my persona is that I suck at emacs though. |
| 16:47 | raek | _ulises: 'future' does not give you a message queue and a loop, which I think you need |
| 16:47 | TimMc | Borkdude: Check your modes, anything weird? |
| 16:47 | _ulises | raek: indeed |
| 16:47 | TimMc | <- not actually an Emacs expert |
| 16:48 | raek | _ulises: but with actors you send data, not functions, so agents might not be a perfect fit after all |
| 16:49 | _ulises | raek: indeed, again, this is just an excuse to use agents and do something with them |
| 16:49 | technomancy | cemerick: you wouldn't happen to remember which versions of everything you were using when you got it working, would you? |
| 16:49 | _ulises | raek: right now the handler in an agent handles the message and returns itself |
| 16:49 | _ulises | raek: so the state of the agent is the handler itself |
| 16:50 | raek | so instead of making a tail recursive call to "the next handler", you return it |
| 16:50 | technomancy | cemerick: never mind; I see that it works in Emacs 23 but not 24. |
| 16:50 | _ulises | raek: indeed |
| 16:50 | _ulises | raek: that's what receive does |
| 16:50 | cemerick | technomancy: oh, you're referring to the stuff in the chapter? |
| 16:50 | technomancy | cemerick: right |
| 16:51 | cemerick | 90% of the Emacs content there is from Brian. :-P |
| 16:51 | technomancy | aha |
| 16:51 | technomancy | cemerick: don't worry about it; I'll explain everything in my email |
| 16:51 | cemerick | yes, good :-) |
| 16:52 | cemerick | so it's expected that that doesn't work? |
| 16:53 | cemerick | in v24, that is? |
| 16:53 | technomancy | FSVO expected |
| 16:53 | technomancy | as of five minutes ago, it is now a known bug. =) |
| 16:56 | _ulises | raek: any more thoughts? is it insane what I'm doing? |
| 16:56 | cemerick | technomancy: will it be fixed within 6 weeks? :-P |
| 16:57 | raek | _ulises: no, I think it makes sense :-) |
| 16:57 | technomancy | cemerick: with any luck it'll be fixed before the release of Emacs 24 |
| 16:57 | drewr | with clojurescript, are you supposed to be able to pass args to *main-cli-fn*? |
| 16:57 | _ulises | raek: ah, cool, thanks :) |
| 16:57 | drewr | all I get is nil |
| 16:57 | technomancy | but probably worth omitting it from the book to be on the safe side |
| 16:57 | _ulises | I'll see if I can just carry on with *agent* and not worry about *self* |
| 16:57 | raek | I think it would be good to hide the fact that agents are used in the implementation |
| 16:58 | _ulises | those where my thoughts |
| 16:58 | _ulises | but I just cannot make the whole binding *self* thing to work |
| 16:58 | _ulises | :/ |
| 16:58 | cemerick | technomancy: exactly why I was asking :-) |
| 16:59 | cemerick | Interesting, conjure has 187 (!) watchers. |
| 16:59 | cemerick | I had no idea it had so much interest. |
| 17:00 | brehaut | thats the rails like right? |
| 17:00 | raek | _ulises: you need to call binding in every funtion you send to an agent |
| 17:00 | cemerick | brehaut: yeah, you mentioned it in your 'brief overview' |
| 17:00 | _ulises | ugh |
| 17:01 | brehaut | cemerick: hah i did too |
| 17:01 | raek | _ulises: the effects of 'binding' happens completely at runtime and only applies to the expression within the (binding [] ...) form |
| 17:01 | _ulises | hum, ok, so I'll have to hide that in the receive fn or something along those lines |
| 17:02 | _ulises | and somehow pass the name during spawn |
| 17:02 | brehaut | cemerick: http://news.ycombinator.com/item?id=822366 lol |
| 17:02 | _ulises | ideally, I should be able to bind *self* to the actual agent instead of to the name of the actor |
| 17:02 | _ulises | but oh well |
| 17:03 | raek | so if you want to run some function f in agent a with *self* bound to pid, you need to do (let [a ..., f ..., pid ...] (send a (fn [state] (binding [*self* pid] (f state))))) |
| 17:03 | cemerick | brehaut: omg the metaprogramming |
| 17:04 | fryguy | alright, i'm going to ask a silly question. I'm going to do some stuff with clojure, and I'm a vim user. Am I missing out on a lot by just using slimv and related plugins as opposed to slime/emacs? |
| 17:04 | _ulises | raek: yes, so the binding has to come inside the receive fn which creates the actor's handler |
| 17:04 | cemerick | what's that site that tracks usage of various clojure libraries? |
| 17:05 | brehaut | clojuresphere? |
| 17:05 | brehaut | http://news.ycombinator.com/item?id=822366 |
| 17:05 | brehaut | samnit |
| 17:05 | brehaut | http://clojuresphere.herokuapp.com/ |
| 17:05 | TimMc | fryguy: Does that setup give you structural editing of s-expressions? |
| 17:06 | fryguy | TimMc: i'm not sure. I'm still doing some reading and researching before I dive in. |
| 17:06 | cemerick | brehaut: thanks |
| 17:06 | cemerick | I'm going to /quit, return with a new nick, and ask all the noob questions I've had on my mind. :-P |
| 17:06 | brehaut | lol |
| 17:07 | cemerick | OK, so conjure has 2 usages according to clojuresphere. That lines up more with my expectations. |
| 17:07 | Raynes | clojuresphere is weird. |
| 17:08 | brehaut | cemerick: my educated (?) guess at why its got so many watchers is that its pretty old (2009?) and is a rails-like which is many peoples default for 'i want web programming' |
| 17:08 | Raynes | I don't like it anymore. I wanted to make it use tentacles instead of clj-github, but it uses some strange v2-only API call that doesn't exist in the v3 API. |
| 17:08 | cemerick | I usually stalls out on me after a couple of queries. |
| 17:08 | _ulises | raek: I reverted the change you suggested to spawn, I remember now why I had it; turns out that if I init the agent straight to (apply f args) then the ping actor tries to send a ping to the pong agent and that is not done in the context of an agent, so *agent* is nil |
| 17:08 | _ulises | (that'd be my explanation) |
| 17:08 | Raynes | I don't like websites that don't use the latest versions of my libraries and such. |
| 17:09 | cemerick | brehaut: last commit was this past september *shrug* |
| 17:09 | brehaut | cemerick: sorry, i didnt mean its out of date, just that its existed for a long while |
| 17:09 | cemerick | ah, right |
| 17:10 | cemerick | Raynes: You are a fickle beast. |
| 17:10 | cemerick | :-D |
| 17:10 | Raynes | :> |
| 17:10 | brehaut | cemerick: even some of my crappy projects on github have watchers, i think just because they have existed for a long time ;) |
| 17:10 | Raynes | brehaut: Stop looking at amalloy_'s repository list. |
| 17:10 | brehaut | ? |
| 17:11 | brehaut | Raynes: ^ |
| 17:11 | Raynes | Failed attempt at humor, I think. I thought you said "even some of the crappy" instead of "my crappy", which would have made my comment more amusing than it actually was. |
| 17:11 | brehaut | aha |
| 17:12 | brehaut | cemerick: red bull can make you deaf‽ |
| 17:12 | cemerick | That shit'll mess you up. |
| 17:12 | brehaut | yeah i was aware of that at least |
| 17:12 | brehaut | i thought it was just heart trouble |
| 17:12 | brehaut | 'just' |
| 17:13 | TimMc | fryguy: Emacs' paredit-mode allows you to do things like turn (let [x 5] (when a x)) into (when a (let [x 5] x)) in a single command -- that's an extreme example of structural editing. |
| 17:14 | cemerick | brehaut: it's damn effective if you're planning on not sleeping tho. |
| 17:14 | brehaut | cemerick: lol. a big pot of chemex coffee is my sleep deprevation aid of choice |
| 17:14 | cemerick | chemex? |
| 17:15 | cemerick | I gag @ coffee. |
| 17:15 | brehaut | its a pour over filter cofffee pot |
| 17:15 | Raynes | I've been drinking sugar free redbull and monster much more often than I'd like. |
| 17:15 | TimMc | I go with 87% dark chocolate. |
| 17:15 | fryguy | TimMc: i'm not so sure i'm concerned about pure code editing. It's more the other niceties that I feel like I might be missing out on. I guess I'm in a situation where I should just try the vim stuff and see if I like it. |
| 17:15 | TimMc | and Daft Punk |
| 17:15 | technomancy | brehaut: in Indonesia Red Bull has nicotine in it |
| 17:15 | brehaut | technomancy: fark |
| 17:15 | fryguy | also, what? red bull can make you deaf? source? |
| 17:16 | fryguy | i drink a lot of redbull |
| 17:16 | Raynes | Surely he was kidding. |
| 17:16 | technomancy | mmm... chemex |
| 17:16 | TimMc | fryguy: If you're way more familiar with vim, go for it. |
| 17:16 | technomancy | fryguy: whatever you do don't let screwing with your editor get in the way of learning clojure |
| 17:17 | Raynes | What he said. |
| 17:17 | technomancy | if you want to experiment once you're comfy with the basics that's fine |
| 17:17 | Borkdude | ah: "toggle-truncate-lines" is what I wanted |
| 17:17 | _ulises | raek: I don't think the binding to *self* will work unless the agent has as state a closure over its name |
| 17:17 | fryguy | TimMc: i'm WAY more familiar with vim than emacs. technomancy, i'm agree with what you say. I was more curious as to whether SLIME was *that* much better than alternatives that it is worth considering |
| 17:17 | TimMc | fryguy: Yeah, technomancy has a good point -- learn one thing at a time. :-/ |
| 17:17 | Raynes | fryguy: I am an avid Emacs user, but I did an editor experiment recently. I spent 2 weeks with Vim exclusively. Things went just fine. I like Emacs more, but if you're already familiar with Vim, there is no reason to not use it unless you just want to learn Emacs. |
| 17:18 | brehaut | technomancy: i got to try some panama geisha coffee through a chemex at my local café recently. it was amazing |
| 17:18 | cemerick | fryguy: what, I'm not authoritative enough for you? ;-) https://twitter.com/#!/cemerick/statuses/147438804800782336 |
| 17:18 | TimMc | I still don't use SLIME. |
| 17:18 | fryguy | Raynes: perfect. that's just the answer I was looking for |
| 17:18 | technomancy | fryguy: I'd actually rate paredit as equal or superior to slime in terms of productivity boost. |
| 17:18 | Raynes | I repeat, as an avid Emacs user, I am also fond of Vim after using it for a while, though I like it less than Emacs (because I'm Raynes). |
| 17:18 | Raynes | There is also a paredit for Vim. The keybindings are pretty convoluted, but it is usable (and of course, customizable). |
| 17:18 | technomancy | especially when measured by win:setup-pain ratio |
| 17:19 | technomancy | fryguy: if anything makes you switch to Emacs, it should be vimscript, not Clojure. =) |
| 17:19 | fryguy | paredit and structural editing stuff sounds really nice, but I think my overall existing speed with vim, plus surround.vim, plus finding suitable plugins to do things _like_ paredit means I'm more interested in "the other things", like connecting to a running session, debugging, etc. |
| 17:20 | Borkdude | Emacs vs Vi learning curve: http://bc.tech.coop/blog/060302.html |
| 17:20 | Raynes | fryguy: Like I said, there is a paredit for Vim as well. |
| 17:20 | fryguy | Raynes: right |
| 17:20 | Raynes | Not as complete as the Emacs version, I wouldn't think, but usable and helpful. |
| 17:20 | raek | _ulises: sure, you can either store it in the state or in the closure of the actual function that is applied inside the agent (which, if I understand you correctly, you build with receive) |
| 17:21 | _ulises | raek: indeed. I also thought that perhaps the agent should have a state something like {:name name :handler fn} |
| 17:21 | technomancy | brehaut: the places around here that have chemex are great because the baristas can tell when you're interested and go on and on about the process, the specific characteristics of the bean, etc. |
| 17:21 | brehaut | technomancy: thats excellent :) |
| 17:21 | brehaut | technomancy: id love to work at my local roastery/café but sadly they have no public Wifi |
| 17:22 | _ulises | raek: but right now if the handler does something like (! actor msg *agent*) and the handler is along the lines of (receive {:foo (fn[sender] (! sender :gotcha))}) then it's all good |
| 17:22 | technomancy | brehaut: no 3G? |
| 17:22 | technomancy | oh, kiwi telcos are awful with their caps and such, right? |
| 17:22 | brehaut | technomancy: in new zealand? i'd be selling my kidneys before the week was out |
| 17:22 | technomancy | ouch =( |
| 17:23 | brehaut | yup :( |
| 17:23 | brehaut | technomancy: i can get 50megs a month for $6 bucks, and/or pay through the nose |
| 17:23 | brehaut | what in the hell kind of cap is 50 megs? |
| 17:24 | brehaut | i might as well train up a saint bernard to operate a usb disk and send all my packets as batch jobs |
| 17:24 | technomancy | that's actually interesting since nobody in the US is interested in taking your money unless it's USD30+/mo |
| 17:24 | jodaro | the "no porn on your phone" cap |
| 17:24 | technomancy | I wonder how many IRC channels you could follow on 50 MB/mo |
| 17:24 | TimMc | Pfft, not this one. :-P |
| 17:24 | _ulises | and I thought that 3G in the UK was bad. Right now I have 15GB for £15 (approx. 20-22 USD) |
| 17:25 | jodaro | TimMc: beat me to it |
| 17:25 | technomancy | Raynes: how big is lazybot's log for the last month uncompressed? |
| 17:25 | Raynes | technomancy: For what channel? |
| 17:25 | technomancy | I was thinking this one |
| 17:26 | brehaut | theres just not enough competition in NZ for cellphones to not be insane |
| 17:26 | accel | is there a clojure smtp server? |
| 17:26 | accel | I want to roll my own email server that does some weird things |
| 17:26 | accel | for handling spam |
| 17:26 | jodaro | the java mail stuff might have that |
| 17:26 | accel | in particular; implementign somethign like hashcash in clojure |
| 17:27 | Raynes | technomancy: http://www.raynes.me/logs/irc.freenode.net/clojure/ Break out the calculator. |
| 17:27 | technomancy | Raynes: cool; thanks |
| 17:27 | Raynes | I'd actually tell you, but I suck at bash. |
| 17:28 | technomancy | dude |
| 17:28 | brehaut | baha the entire history (minus a couple of bot outages) of #burningwheel is 5.4 meg |
| 17:28 | technomancy | rectangle-kill |
| 17:28 | jodaro | A: No, the JavaMail API package does not include any mail servers. |
| 17:28 | jodaro | or not |
| 17:28 | technomancy | 1.7 MB |
| 17:28 | technomancy | I imagine the overhead of IRC might add a bit to that, but the ballpark number is good |
| 17:28 | jodaro | accel: http://code.google.com/p/subethasmtp/ |
| 17:29 | technomancy | anyway, I'd pay $6/mo for 3G on my phone if it could co-exist with a prepaid voice plan. |
| 17:29 | technomancy | even at 50MB |
| 17:29 | brehaut | technomancy: whats a prepaid voice plan? |
| 17:29 | hiredman | my log #clojure is 139mb |
| 17:29 | hiredman | my of #clojure |
| 17:29 | hiredman | damn it |
| 17:30 | technomancy | brehaut: I dump USD100 onto my SIM; each call is billed at $0.05/min, and then six months later I top it off again. |
| 17:30 | brehaut | technomancy: wow. $0.05/min? how much are SMS? |
| 17:30 | technomancy | same, I think |
| 17:30 | TimMc | Better write them quickly, then. :-P |
| 17:30 | wastrel | http://24.media.tumblr.com/tumblr_lw5xr6GefR1qb15g0o1_500.jpg |
| 17:30 | technomancy | hehe |
| 17:31 | technomancy | brehaut: can't tell; is that high or low for you? |
| 17:31 | brehaut | technomancy: exceedingly low |
| 17:32 | brehaut | technomancy: i think my calls are either $1.00 or $1.50 a minute |
| 17:32 | technomancy | holy smokes |
| 17:32 | brehaut | technomancy: SMS is 20c a pop |
| 17:32 | TimMc | technomancy: What carrier do you use? |
| 17:32 | technomancy | before that I was using SIP on my 3G data plan, which was $0.015 |
| 17:32 | technomancy | TimMc: t-mobile |
| 17:33 | technomancy | it may be 10c for out going and 5c for incoming, but I don't really make any outgoing calls. |
| 17:33 | technomancy | apart from voip anyway |
| 17:34 | Vinzent | has somebody used clojure with oracle? |
| 17:34 | TimMc | Almost certainly. |
| 17:35 | Vinzent | i mean, as a scripting language, for writing stored procedures |
| 17:36 | Raynes | ~anybody |
| 17:36 | clojurebot | No entiendo |
| 17:36 | Raynes | Oh my God. |
| 17:36 | technomancy | weavejester: it appears "I was thinking about factoring a lot of $X out into a small library" is your catchphrase. |
| 17:36 | technomancy | ~anyone |
| 17:36 | clojurebot | Just a heads up, you're more likely to get some help if you ask the question you really want the answer to, instead of "does anyone ..." |
| 17:36 | Raynes | That's the one thing that I use with clojurebot. |
| 17:36 | Raynes | Oh. |
| 17:36 | Raynes | Duh. |
| 17:36 | technomancy | heh |
| 17:36 | weavejester | weavejester: Hahaha |
| 17:36 | weavejester | Uh |
| 17:36 | weavejester | technomancy: Hahaha |
| 17:36 | weavejester | Now I'm laughing at myself for some reason |
| 17:36 | Raynes | weavejester: Talking to yourself again? |
| 17:37 | weavejester | Raynes: Apparently so! |
| 17:37 | technomancy | "Oh man... I think I need to factor this out into a separate library." / "Sounds like a job for ... weavejester!" |
| 17:37 | technomancy | just need a costume and/or theme song. =) |
| 17:37 | jodaro | or medication |
| 17:37 | technomancy | hahahah |
| 17:37 | technomancy | weavejester: did you end up using lein-sub for ring? |
| 17:38 | weavejester | My only problem now is that "ring-server" sounds like "ring-serve"... I think I need to rename "ring-serve" |
| 17:38 | weavejester | technomancy: Yep |
| 17:38 | technomancy | weavejester: how's that working out for you? |
| 17:38 | weavejester | technomancy: Testing is easier, but I don't think it handles interdependent submodules very well when pushing. |
| 17:39 | technomancy | weavejester: pushing to clojars? |
| 17:39 | weavejester | technomancy: Yeah. It seems to read all the project files first, and then execute the subtasks |
| 17:39 | weavejester | So if foo.A depends on foo.B |
| 17:39 | weavejester | Then even if you specify the submodules as [foo.B foo.A] |
| 17:39 | weavejester | It fails to push, because it tries to resolve both project.clj files before pushing. |
| 17:40 | technomancy | tries to resolve them remotely? |
| 17:40 | technomancy | maybe a round of install across the board before pushing, or would that have the same effect? |
| 17:40 | weavejester | Yeah, so... ring-servlet depends on ring-core for example. |
| 17:40 | Vinzent | I know, but I don't have "a question". I just winder if someone has any experience in making such thing work and can point me to a relevant article or just say is that ok or not |
| 17:41 | weavejester | So I update all the versions to 1.0.0, but no matter how I arrange it, it doesn't seem to work. |
| 17:41 | weavejester | ring-servlet complains that ring-core 1.0.0 doesn't exist, even if ring-core 1.0.0 is scheduled to be pushed first. |
| 17:41 | technomancy | tricky |
| 17:42 | technomancy | seems like you'd almost want to perform the install task immediately after reading projects |
| 17:43 | weavejester | Yeah... it seems from the source code that it does do that... |
| 17:44 | weavejester | But maybe the laziness of map and reduce are playing tricks here. |
| 17:44 | weavejester | Since reduce has an slightly unintuitive evaluation order |
| 17:45 | technomancy | ah, yeah could be a bug |
| 17:45 | technomancy | easy bug to overlook since getting it right once means that you won't notice future breakage |
| 17:46 | weavejester | Let me double-check that I didn't just do something wrong |
| 17:46 | weavejester | Well... I'll do it later. No hurry. |
| 17:46 | Raynes | Oh man. |
| 17:46 | Raynes | clojure.template is awesome. |
| 17:47 | weavejester | Anyone have any good suggestions for the name of a library designed to start Ring servers in a REPL like SLIME? |
| 17:47 | weavejester | clojure.template? |
| 17:47 | clojurebot | clojurebot is not a benchmarking platform |
| 17:47 | Raynes | http://clojure.github.com/clojure/clojure.template-api.html |
| 17:48 | weavejester | Oh, I see |
| 17:48 | technomancy | ring-toss |
| 17:48 | weavejester | Huh... |
| 17:48 | weavejester | That's a good suggestion :) |
| 17:48 | Raynes | wedding-ring |
| 17:49 | weavejester | I like ring-toss. It's kinda like throwing up a quick ring server |
| 17:49 | weavejester | Although I don't know what I'd call the function that runs the server :) |
| 17:49 | Raynes | toss |
| 17:49 | weavejester | Currently (serve handler) |
| 17:50 | Raynes | (toss handler) |
| 17:50 | weavejester | Well, I'm British, so I'd rather avoid the term "toss" :) |
| 17:51 | Raynes | Makes sense. |
| 17:51 | TimMc | heh |
| 17:51 | Raynes | You guys say crap like "He was a right tosser!" |
| 17:51 | weavejester | Yeah |
| 17:51 | technomancy | hah; nice |
| 17:52 | weavejester | I actually like the (serve blah) syntax... |
| 17:52 | weavejester | But ring.util.server seems the best name for, well, running a Ring server. |
| 17:52 | samaaron | Raynes: mind your language ;-) |
| 17:52 | weavejester | Maybe (run blah) ... |
| 17:52 | weavejester | ring-run... |
| 17:53 | Raynes | (not -derogatory |
| 17:53 | Raynes | (not-derogatory-toss blah) |
| 17:53 | weavejester | Haha |
| 17:53 | samaaron | ring-toss just sounds wrong on soooo many levels |
| 17:54 | TimMc | How many levels? |
| 17:54 | weavejester | I think I might go with ring-run |
| 17:54 | technomancy | ring-hurl? no wait... |
| 17:54 | weavejester | (hurl bad-sushi) |
| 17:54 | TimMc | This reminds me of the condition system naming stuff. |
| 17:54 | weavejester | Who was it who said... |
| 17:54 | Raynes | samaaron: Go play with overtone. |
| 17:54 | weavejester | "There are only 2 hard problems in computer science: cache expiration and naming things" |
| 17:55 | samaaron | Raynes: I have been. I'm about to go to bed now |
| 17:55 | samaaron | weavejester: that's not quite right |
| 17:55 | samaaron | "There are only 2 hard problems in computer science: cache expiration, naming things and off-by-one errors" |
| 17:56 | weavejester | samaaron: I was quoting... someone... I think :) |
| 17:56 | samaaron | hehehe |
| 17:56 | samaaron | quoting someone off the internet hey? |
| 17:56 | technomancy | two hard problems: naming thiconcurrencyngs and |
| 17:56 | samaaron | hahahaha |
| 17:57 | weavejester | Oh |
| 17:57 | weavejester | http://martinfowler.com/bliki/TwoHardThings.html |
| 17:57 | weavejester | Looks like the off-by-one is an official extension :) |
| 17:58 | weavejester | I still haven't figured out what to call my defmigration library I'm going to base on ragtime... |
| 17:58 | samaaron | night night |
| 17:58 | weavejester | I guess I should write the ragtime leiningen plugin first |
| 17:58 | weavejester | night |
| 18:08 | cemerick | weavejester: Is there an official way to produce a clojure.xml stuffs from hiccup stuffs? |
| 18:08 | cemerick | If not, would you be interested in a patch containing one? |
| 18:08 | weavejester | cemerick: I have a branch for it... let me try and find it... |
| 18:09 | weavejester | https://github.com/weavejester/hiccup/tree/refactor |
| 18:09 | weavejester | But it's not finished. |
| 18:09 | cemerick | I wrote one in anger earlier this week because I wanted to mess about with hiccup in an app that uses enlive everywhere else. |
| 18:09 | clojurebot | hiccup is both https://github.com/weavejester/hiccup and http://tinyurl.com/426og7n |
| 18:10 | weavejester | cemerick: could I take a look at your code? |
| 18:12 | weavejester | I've been thinking about combining enlive and hiccup |
| 18:12 | cemerick | weavejester: https://gist.github.com/2a64e0067c960ea86354 |
| 18:12 | cemerick | I've not cared enough about the problems to bother fixing them yet. |
| 18:13 | weavejester | I have a version here that should work: https://github.com/weavejester/hiccup/blob/refactor/src/hiccup/compiler.clj |
| 18:13 | weavejester | That compiles Hiccup code directly into clojure.xml |
| 18:13 | cemerick | Yeah, I was looking |
| 18:13 | weavejester | I haven't started on the renderer that will convert that into a string |
| 18:14 | weavejester | I was thinking of releasing the current Hiccup as Hiccup 1.0.0, and then using the refactor as 2.0.0 |
| 18:14 | cemerick | That seems very sane. |
| 18:14 | weavejester | Not sure if 2.0 will be as fast as 1.0, but it should be more modular |
| 18:14 | cemerick | Have you ever benchmarked hiccup vs. enlive? |
| 18:14 | weavejester | And you could plug in rendering engines that create indented HTML |
| 18:15 | cemerick | Real men use XSLT to pretty-print XML and HTML. :-P |
| 18:15 | TimMc | By the way, I forked enlive to add a switch for outputting HTML-style self-closing tags like <link>. |
| 18:15 | weavejester | cemerick: I think I did a while ago. It really depends on how optimized the Hiccup code is. Hiccup can be very fast, because it compiles. |
| 18:16 | weavejester | So (html [:p {} x]) => (str "<p>" x "</p>") |
| 18:16 | TimMc | https://github.com/timmc/enlive Gonna see if cgrand will take a pull request. :-) |
| 18:17 | cemerick | Now that I properly appreciate hiccup, what I really want is to be able to provide hiccup-style bits as input to e.g. enlive/content and such. That should be pretty easy. |
| 18:18 | cemerick | TimMc: Are those tags still self-closing in html5? |
| 18:18 | TimMc | Yeah. |
| 18:18 | weavejester | Well, the current Hiccup engine is geared up around creating strings, and it's a bit of a mess. Not very clear code. |
| 18:18 | TimMc | and the W3C validator gets angry at Enlive's default output. |
| 18:18 | weavejester | The refactor is a lot cleaner, but currently only renders to clojure.xml format. |
| 18:19 | cemerick | I recall Christophe saying that the big win for him in optimizing for enlive 1.0 was to never produce strings at all. I presume that's what you're aiming for with this new compilation? |
| 18:20 | cemerick | or, to never produce new strings, I should say |
| 18:21 | cemerick | hrm, yup, seems like it |
| 18:23 | cemerick | weavejester: amazingly, that little function I gisted is working well enough in the corner of my app that's using hiccup. Looking at your new compiler, I presume it's going to break any second now? |
| 18:24 | weavejester | cemerick: No idea... it's been a while since I looked at it. It might be that my refactor was 95% clean-up. |
| 18:24 | brehaut | weavejester, cemerick: i think it would be fantastic if enlive and hiccup were better friends. doesnt seem like they need to be mutually exclusive |
| 18:24 | weavejester | cemerick: The current Hiccup code I'm not happy with... |
| 18:25 | weavejester | brehaut: My theory was that I could use enlive to insert components into pages |
| 18:26 | weavejester | Like... Say you had a library that handled authentication and logins |
| 18:26 | weavejester | You could have some middleware that used enlive to insert a login box into your page. |
| 18:27 | brehaut | weavejester: i agree |
| 18:27 | weavejester | I kinda think that there isn't enough vertical separation in web-apps |
| 18:28 | cemerick | weavejester: That makes a lot of sense to me. |
| 18:28 | guns | lang |
| 18:28 | weavejester | MVC is kinda separating out horizontal layers |
| 18:28 | guns | oops |
| 18:28 | weavejester | But you can only go so far with that approach |
| 18:28 | cemerick | Enlive seems to be at its best in defining the broad structure of pages, and hiccup seems at its best populating them. |
| 18:28 | weavejester | If your web app size doubles, you can't add more layers |
| 18:29 | weavejester | cemerick: Yeah |
| 18:29 | cemerick | or, producing the content to populate them |
| 18:29 | brehaut | weavejester: another middleware i would liek to get around to implementing is something akin to typogrify for django |
| 18:29 | cemerick | selectors are badass |
| 18:29 | weavejester | I figure that Hiccup+Enlive is a good idea because originally I thought it was a terrible idea :) |
| 18:29 | brehaut | lol |
| 18:29 | weavejester | I thought the same about Ring until I tried it. |
| 18:29 | weavejester | Funny as that sounds now. |
| 18:30 | cemerick | same here |
| 18:30 | cemerick | I've been down on hiccup for, oh, years. Now I'm absolutely convinced a union is ideal. |
| 18:31 | weavejester | It's on my todo list, but that's kinda long :) |
| 18:31 | weavejester | If anyone else wants to take a look at the refactor branch, it should be a lot clearer than the master branch of Hiccupe |
| 18:32 | brehaut | weavejester: how far away do you think 1.0.0 of compojure is? im going to update my ring post for ring 1 and clj 1.3, and id like to cover compojure 1.0 at the same time |
| 18:33 | weavejester | brehaut: If no-one reports any issues, I'm going to turn 1.0.0-RC1 into 1.0.0 this weekend. Maybe tomorrow night. |
| 18:33 | brehaut | weavejester: excellent :) i guess i better get editing |
| 18:35 | cemerick | brehaut: ping me with that url when you're done :-) |
| 18:35 | brehaut | weavejester: one other question; i havent looked at compojure in a while, but does it have reversable urls ? |
| 18:35 | brehaut | cemerick: ok :) |
| 18:37 | weavejester | brehaut: Could you clarify what you mean? |
| 18:37 | weavejester | Like, if you have "/foo/:id" and {:id 10}, can you turn it into "/foo/10" |
| 18:37 | weavejester | Or are you saying can a handler tell which function is called by which route? |
| 18:39 | jkkramer | weavejester: is that hiccup refactoring faster, or just cleaner code? |
| 18:39 | brehaut | weavejester: in django you can 'reverse' a url route; ie provide the name of the route, and the components to fill in the gaps and it gives you back a url |
| 18:40 | brehaut | weavejester: yeah, like that example |
| 18:40 | weavejester | jkkramer: Cleaner, and it compiles clojure.xml before strings |
| 18:40 | jkkramer | weavejester: btw, after having recently tried to grok the hiccup source, it does look much cleaner and easier to understand |
| 18:41 | weavejester | brehaut: No, but I've been meaning to add it. Noir has something like it, but its just a search-and-replace. I think I can make something a bit more robust... |
| 18:42 | weavejester | I haven't hugely thought about it, though. |
| 18:42 | brehaut | weavejester: ah sure. i know moustache doesnt have it (and i expect it would be pretty challenging to add) |
| 18:42 | brehaut | but i do miss it from django |
| 18:42 | weavejester | You'd have to name the route, though |
| 18:42 | jkkramer | weavejester: somewhat related, I discovered recently that hiccup was a significant bottleneck when generating a page with ~400KB of HTML. I replaced it with my own hack that does more aggressive macro-time string combination, trading off flexibility. it ended up being like 10x faster |
| 18:43 | weavejester | So... (def foo "/foo/:id") (GET foo [id] ...) |
| 18:43 | brehaut | weavejester: i wonder if its actually suitable for meta data |
| 18:43 | weavejester | jkkramer: Did you try optimizing the hiccup code for speed? |
| 18:44 | weavejester | jkkramer: For instance, [:em {} x] is faster than [:em x], because in the latter case it doesn't know if x is a map or not. |
| 18:44 | jkkramer | weavejester: a little. i reached a point where i was replacing hiccup structures with literal strings and wrote my hack |
| 18:45 | weavejester | jkkramer: In theory, removing the ambiguity from Hiccup structures should be the same as literal strings. |
| 18:45 | weavejester | jkkramer: Did you use defhtml as well? |
| 18:45 | jkkramer | weavejester: i'll play with it some and see if i can come up with simple test cases to demonstrate the issues |
| 18:45 | weavejester | jkkramer: Okay |
| 18:46 | amalloy | weavejester: oh, does defhtml expose some kind of metadata about what kind of thing it returns? |
| 18:46 | jkkramer | weavejester: no, just (html) and (html5) |
| 18:46 | weavejester | amalloy: No, it's just a string. |
| 18:47 | weavejester | amalloy: It's like (defn ~name ~args (html (do ~@body))) |
| 18:47 | jkkramer | if that's the case, i don't think it would help my situation much |
| 18:48 | weavejester | jkkramer: So all your functions returned strings? |
| 18:48 | amalloy | fair enough. seemed like since you were talking about removing ambiguity, you might expose a special-defn that lets hiccup know what kind of thing is returned, thus removing embiguity |
| 18:49 | jkkramer | weavejester: insofar as (html …) was able to return strings -- loops and such notwithstanding. my hack tries hard to turn things into literal strings, rather than runtime-generated ones |
| 18:49 | weavejester | amalloy: That might be possible, but isn't implemented. |
| 18:50 | weavejester | jkkramer: Hiccup tries to convert things into literal strings when it can |
| 18:50 | weavejester | jkkramer: So (html [:p "foo"]) is the same as "<p>foo</p>" |
| 18:50 | weavejester | jkkramer: And (html [:p {} x]) is the same as (str "<p>" x "</p>") |
| 18:50 | amalloy | yeah, i remember being really impressed when i saw that in the source |
| 18:51 | weavejester | The source isn't that nice, though. Hence the refactor. |
| 18:51 | jkkramer | weavejester: i was having issues getting that to work fully. maybe it's due to me leaving out the attr maps |
| 18:51 | amalloy | i've been at lunch, didn't know a refactor was coming |
| 18:51 | weavejester | amalloy: Well, eventually. When I get around to it :) |
| 18:53 | weavejester | jkkramer: If the attr maps are left out, then: (html [:p x]) becomes (if (map? x) (str "<p " (render-attrs x) "></p>") (str "<p>" x "</p>")) |
| 18:53 | jkkramer | weavejester: k. i will experiment. thanks for the pointer |
| 18:54 | amalloy | it seems pretty unlikely that the map? test is any kind of bottleneck at all though, compared to the rest of what's going on |
| 18:55 | amalloy | and it's not like the uncertainty bubbles up: the result of (html [:p x]) is known to be a string |
| 19:01 | technomancy | amalloy: quick once-over of github-percentile before I deploy? |
| 19:02 | Raynes | TimMc: Who is it that is so gungho about getting rid of hiccup in trycljs? |
| 19:03 | amalloy | sure, one sec while i pull, technomancy |
| 19:03 | Raynes | TimMc: "all that hiccup is going to give me hiccups". What could possible the benefit of using enlive to replace such a small hiccup code base? Feeling smug about having rewritten a portion of a project? |
| 19:03 | Raynes | :p |
| 19:04 | amalloy | technomancy: a lot of exceptions about lacking favicon.ico, but otherwise looks great |
| 19:04 | technomancy | amalloy: oh good call |
| 19:04 | amalloy | actually, let me turn the "longer than X has" into a link to their github profile |
| 19:05 | technomancy | of course |
| 19:05 | Raynes | amalloy: I'll get 4clojure prepared to deploy to heroku when I update it to 1.3 and move it to noir. |
| 19:05 | Raynes | Which I should start soon. |
| 19:05 | Raynes | Like possibly tonight soon. |
| 19:07 | Raynes | TimMc: Oh, it was you. |
| 19:07 | Raynes | TimMc: So yeah, I'd definitely like to hear the rationale for that that isn't "it's giving me hiccups". |
| 19:07 | Raynes | Enlive is giving me hives. |
| 19:10 | Turtl3boi | semperos? |
| 19:10 | Turtl3boi | semperos can you show me how to get started with making GUIs in Clojure |
| 19:15 | weavejester | technomancy: wrap-keyword-params turns those strings into keywords |
| 19:15 | technomancy | weavejester: oh good call |
| 19:16 | weavejester | technomancy: By default, url-encoded parameter names can include any character, so can't be keywords by default |
| 19:16 | technomancy | ah, makes sense |
| 19:19 | technomancy | now with 50% more shine: http://github-percentile.herokuapp.com/ |
| 19:26 | weavejester | (html (doctype :html5) ...) is the same as (html5 ...) |
| 19:27 | technomancy | weavejester: ah cool; I was just cribbing from abedra's sample app |
| 19:28 | weavejester | There are a few tricks, like [:div {:id "results"} ...] is the same as [:div#results ...] |
| 19:28 | brehaut | my github %ile is lame |
| 19:28 | weavejester | Mine is 52% apparently |
| 19:28 | weavejester | I'm almost average :) |
| 19:28 | brehaut | 70% |
| 19:29 | brehaut | extremely tardy |
| 19:29 | weavejester | [:h1 {:class "content"} ] is [:h1.content] |
| 19:29 | technomancy | weavejester: do classes and ids compose? |
| 19:30 | weavejester | Oh, and (compojure.handler/site your-handler) adds a bunch of useful middleware like wrap-params |
| 19:30 | weavejester | technomancy: Yes, but I believe the id has to come first |
| 19:30 | weavejester | So [:div#foo.bar] |
| 19:30 | brehaut | weavejester: thats something to ensure round trips with enlive |
| 19:30 | weavejester | No reason for that other than the regex was written that way |
| 19:31 | weavejester | brehaut: Oh right |
| 19:31 | brehaut | i imagine it'll be piece of cake, i think the selector syntax is the same as the element shorthand, but it'd be a bit stink if it wasnt |
| 19:31 | technomancy | weavejester: good stuff |
| 19:32 | mabes | is their a macro like defnk that will assert required keys in option maps? (to prevent against typos, etc..) Just looking for prior art in-case I don't have to write my own... |
| 19:43 | gfredericks | mabes: wouldn't required keys normally get changed into proper arguments? |
| 19:44 | mabes | gfredericks: I prefer named arguments for functions with more than 3 arguments |
| 19:45 | mabes | gfredericks: having a lot of arguments may be a code smell itself I suppose |
| 19:49 | gfredericks | in any case I've never heard of such a thing. It sounds like it could be rather complex in the most general case. Maybe all I mean by that is nesting. |
| 19:50 | gfredericks | it just occured to me that in the cases where you're passing in a literal map, you could use the macro to check at compile-time... |
| 19:50 | gfredericks | that would bring the disadvantage of all your functions being macros though, which is of course terrible |
| 19:51 | gfredericks | clojurebot: which is of course terrible |
| 19:51 | clojurebot | Ik begrijp |
| 20:12 | TimMc | Raynes: I like my HTML to be HTML, and my code to be code. Also, something about complecting. |
| 20:12 | TimMc | So there. |
| 20:13 | Raynes | TimMc: I guess. If you really want to rewrite trivial Hiccup, be my guest. |
| 20:16 | cemerick | TimMc: You're not wrong — except when you need HTML to be data, in which case clojure.xml is a cumbersome notation at best. |
| 20:24 | brehaut | i dont think weve seen some of the really cool things you can do with enlive really get talked about |
| 20:24 | brehaut | yet |
| 20:26 | cemerick | I think that's true for about 114 different Clojure libraries / abstractions / etc. |
| 20:26 | brehaut | hah definately :) |
| 20:26 | brehaut | i think enlive has one big clear win though: stop emphasising deftemplate to new users |
| 20:26 | brehaut | id rather add a ring middleware that calls emit* |
| 20:37 | scgilardi | ~botsnack |
| 20:37 | clojurebot | Thanks! Can I have chocolate next time |
| 20:40 | sritchie_ | Raynes, here's a lein-newnew template for noir: https://github.com/sritchie/noir-template |
| 20:41 | sritchie_ | I'm going to pass it over to ibdknox so he can work his wonders |
| 20:43 | hiredman | ~ping |
| 20:43 | clojurebot | PONG! |
| 20:49 | Raynes | sritchie_: https://github.com/Raynes/lein-noir |
| 20:50 | sritchie_ | cool, this one is meant to become a pinot-oriented template |
| 20:50 | Raynes | We planned on releasing it along with the next noir version. |
| 20:51 | sritchie_ | this one should probably exclusively target pinot, then |
| 21:02 | Raynes | Did prxml get moved somewhere? |
| 21:03 | amalloy | Raynes: got moved to "don't use it; use data.xml; oh wait that will never be released" |
| 21:03 | brehaut | amalloy: is data.xml that dire? |
| 21:03 | Raynes | amalloy: That's unfortunate, since we need it or something like it for 4clojure. Any ideas? |
| 21:04 | amalloy | brehaut: no, it's totally working except for whitespace formatting, and has been for months |
| 21:04 | Raynes | chouser: Release that. Now. |
| 21:05 | amalloy | but hudson won't release it with a test failure; chouser and i can't repro the failure locally; and reasonably enough chouser doesn't want to remove valid tests |
| 21:05 | brehaut | oh :( |
| 21:07 | amalloy | and fliebel asked on clj-dev about helping with data.xml. i was like, "maybe we need some namespace help?" and there was a flurry of messages about how data.xml needs to be the be-all/end-all of xml processes, supporting 100% high-fidelity round-tripping to xml-text including the N different ways you can specify namespaces |
| 21:08 | Raynes | amalloy: So we can like, use it? I mean, I'll release it myself if we can use it. |
| 21:09 | amalloy | Raynes: a number of people have already done that. i think ninjudd has a release |
| 21:09 | amalloy | http://clojars.org/org.clojars.ninjudd/data.xml |
| 21:09 | Raynes | Works for me. |
| 21:09 | Raynes | amalloy: Fork it, rename it, release it, make it your own. ;) |
| 21:10 | amalloy | that's not a bad idea |
| 21:10 | Raynes | It really isn't. |
| 21:11 | Raynes | Without prxml and people being nuts about data.xml, there isn't really an xml generation story for Clojure right now. |
| 21:11 | amalloy | thread is at http://groups.google.com/group/clojure-dev/browse_thread/thread/dff8e406b7502a0b/0997aaf57a2d4c75?show_docid=0997aaf57a2d4c75 btw, if anyone wants to read up on the history |
| 21:14 | Raynes | "I just want to clarify a non-technical point: I have no particular |
| 21:14 | Raynes | interest in being the owner (whatever that means) of data.xml." -- chouser |
| 21:14 | Raynes | That newline there was unintentional. |
| 21:15 | amalloy | Raynes: i'm not going to take ownership of the project, which i assume is your implied suggestion. i don't understand 2/3 of the code in that file |
| 21:16 | Raynes | Wasn't implying that, no. |
| 21:17 | cemerick | amalloy: to be fair, all the issues and hidden corners are legit. I remember the same misery happening when lxml in python-land was being beaten around. |
| 21:18 | cemerick | A metric ton of tools depend upon particular serializations of a given XML model; there's no way to get it half-right. |
| 21:18 | clojurebot | xml is like violence; if it's not working, you're not using enough of it. |
| 21:19 | Raynes | \_/ <-- empty care cup. /me just needs a little trivial xml. ;) |
| 21:20 | amalloy | cemerick: only if you're actually targeting those tools. i'm more interested in producing xhtml that renders in browsers and works in pom.xml files, and i suspect most data.xml users are too |
| 21:20 | cemerick | heh |
| 21:21 | amalloy | which is why the storm of "data.xml needs to do X in order to be useful" comments don't really interest me at all |
| 21:21 | cemerick | well, trivial xml is trivial to generate; maybe Raynes/trivial-xml is needed. |
| 21:21 | Raynes | The day I write a low level XML generation library is the day I start wearing a tie and using Netbeans. |
| 21:22 | cemerick | amalloy: That's fair, but I wouldn't expect the contrib process to produce partial solutions. |
| 21:23 | cemerick | If it did habitually, then its usefulness is significantly diminished IMO. |
| 21:23 | Raynes | I'm pleasantly surprised when the contrib process produces anything at all. |
| 21:25 | cemerick | Raynes: waitaminute, no one should be more cynical than me. |
| 21:28 | brehaut | i copied prxml from core into necessary evil and put my own hacks into it to make it do what was needed for xmlrpc :P |
| 21:28 | brehaut | Raynes is cynical beyond his years |
| 21:30 | cemerick | s'ok, I'm optimistic shy of my years, so we balance each other out. |
| 21:31 | cemerick | hrm, that rhetorical inversion didn't quite work |
| 21:32 | Raynes | cemerick: Is your lein dependency tree thingy available anywhere? |
| 21:33 | cemerick | [com.cemerick/pomegranate "0.0.2"] |
| 21:33 | Raynes | Oh. |
| 21:33 | cemerick | A plugin isn't possible because of arcane conflicts between aether and lein 1.x maven-ant-tasks |
| 21:33 | cemerick | thus, 2.0-only |
| 21:34 | cemerick | hrm, actually, it may be possible |
| 21:34 | cemerick | though I don't know that I'd bother |
| 21:34 | Raynes | Man. Why does every maven command I ever use result in 10 thousand plugins being downloaded? |
| 21:35 | Raynes | ls |
| 21:35 | Raynes | Note to self: IRC is not a terminal. |
| 21:35 | brehaut | Raynes: its the maven way |
| 21:39 | amalloy | Raynes: each plugin has four interfaces and one line of code |
| 21:39 | Raynes | I figured as much. |
| 21:39 | brehaut | and of course, each plugin uses a different xml applicaiton, and thus needs subtly different parser |
| 21:40 | Raynes | And data.xml is not high-fidelity enough to be appropriate. |
| 21:40 | amalloy | brb guys, gotta slit my wrists |
| 21:40 | Raynes | Take your time. |
| 21:43 | brehaut | amalloy: vertical works better than horizontal |
| 21:44 | amalloy | brehaut: not if i'm just doing it for attention |
| 21:44 | brehaut | amalloy: these days you can just grow a really long fringe and listen to poor quality pop rock |
| 21:45 | amalloy | "fringe". you crazy englishers |
| 21:45 | Raynes | And by poor quality pop rock, he means anything I listen to. |
| 21:45 | brehaut | Raynes: you arent yet 20, your _expected_ to listen to crap |
| 21:46 | brehaut | except you are allowed to understand it |
| 21:46 | Raynes | And you're over 20, and thus expected to differentiate between 'your' and 'you're'. |
| 21:46 | brehaut | baha |
| 21:47 | brehaut | :( |
| 21:47 | amalloy | Raynes: i'm glad to see someone give brehaut the beatdown he deserves grammar-wise |
| 21:48 | brehaut | amalloy: i thinkg you mean 'grammaur' |
| 21:48 | brehaut | you cant just go dropping the 'u's from english words because you cant be bothered typing them |
| 21:50 | amalloy | s/bothered/arsed |
| 21:53 | cemerick | holy crap, this channel turns into proggit after hours these days ;-) |
| 21:53 | brehaut | hahah |
| 21:53 | Raynes | cemerick: Only today. |
| 21:53 | brehaut | is that better or worse than turning into HN ? |
| 21:53 | Raynes | Christmas is nigh. |
| 21:53 | cemerick | unknown |
| 21:53 | cemerick | I've actually been trolling around reddit some lately. |
| 21:53 | cemerick | classin' it up, y'know? |
| 21:54 | brehaut | haha |
| 22:26 | symbole | I've created a project with a log4j.properties in src/. I then launch a REPL using clojure-jack-in, and use clojure.tools.logging to fire off a bunch of log messages. I don't see any of my log messages printed to the log files. What could be the problem here? |
| 22:28 | lancepantz | symbole: you also need to have log4j as a dependency |
| 22:29 | lancepantz | symbole: [log4j "1.2.15" :exclusions [javax.mail/mail javax.jms/jms com.sun.jdmk/jmxtools com.sun.jmx/jmxri]] |
| 22:29 | lancepantz | |
| 22:29 | lancepantz | add that to your :dependencies |
| 22:33 | symbole | lancepantz: Thanks! That worked. |
| 22:33 | lancepantz | symbole: you're welcome |
| 22:33 | symbole | This should be documented somewhere. |
| 22:34 | lancepantz | i remember having to deal with it a couple of years ago, don't remember how i figured it out |
| 22:34 | lancepantz | but the point is that the log engine is pluggable |
| 22:35 | symbole | Looking at the POM file of clojure.tools.logging, I can see why I'd need to bring it in. |
| 22:35 | woohoo_erc | Greetings! Any Emacs user experience weird/inconsistent behaviour by ParEdit, especially for brackets []? |
| 22:36 | symbole | Maybe I'll shoot an email to the developers. Thanks again. |
| 22:51 | wolfjb | Do I need :aot? my project isn't building as far as I can tell |
| 22:53 | lancepantz | wolfjb: can you be more specific? |
| 22:54 | wolfjb | well, my project.clj doesn't have :aot in it, but when I run lein compile I get the message No namespaces to :aot compile listed in project.clj |
| 22:54 | lancepantz | wolfjb: no need to compile |
| 22:54 | wolfjb | oh |
| 23:02 | technomancy_ | i should probably suppress that message for everything but direct invocations of the compile task |
| 23:03 | technomancy_ | but I can't think of a good way to distinguish between direct invocations and indirect |
| 23:03 | wolfjb | well, and as a n00b, it is a bit confusing, but I don't know how to help |
| 23:04 | technomancy_ | maybe suppress it altogether |
| 23:04 | lancepantz | technomancy_: could you check the command line args? |
| 23:05 | technomancy_ | lancepantz: yeah, but if you said "lein test, compile", the indirect compile from test wouldn't still pick it up from *command-line-arguments* |
| 23:07 | alexbaranosky | is there something wrong with this attempt at using core.incubator from my project.clj? [org.clojure/core.incubator "0.1.1"] |
| 23:09 | cemerick | lancepantz: FYI, log4j 1.12.16 doesn't have those absurd dependencies you need to exclude in 1.12.15. |
| 23:10 | amalloy | alexbaranosky: that version isn't released |
| 23:10 | lancepantz | ah cool, thanks cemerick, i'll bump it up |
| 23:10 | amalloy | http://build.clojure.org/job/core.incubator/ then follow a few links to http://build.clojure.org/job/core.incubator/lastBuild/org.clojure$core.incubator/ |
| 23:11 | Raynes | alexbaranosky: Make sure you keep opposing the trycljs enlive change. We need to protest this shit. |
| 23:11 | cemerick | lancepantz: only took FOUR YEARS, but hey… |
| 23:11 | cemerick | :-) |
| 23:11 | lancepantz | hehe |
| 23:11 | clojurebot | It's greek to me. |
| 23:12 | cemerick | Remember, Apache ensures project quality. |
| 23:13 | alexbaranosky | amalloy, thanks, I got it to work like such: [org.clojure/core.incubator "0.1.0"] |
| 23:14 | lancepantz | alexbaranosky: is that not what you were trying already? |
| 23:14 | lancepantz | alexbaranosky: ah, version, nm |
| 23:19 | alexbaranosky | is there a version of `rotations` in some contrib project? I'm trying to finish off the final move from 1.2 to 1.3... we still have some code just copy n pasted into the project |
| 23:20 | Turtl3boi | hi alex |
| 23:20 | Turtl3boi | do you enjoy your real job |
| 23:20 | lancepantz | lol |
| 23:21 | alexbaranosky | yeah |
| 23:21 | lancepantz | what would you say your quality of life is? |
| 23:21 | alexbaranosky | lol |
| 23:21 | lancepantz | :P |
| 23:21 | alexbaranosky | no time for this line of inquiry -- too busy being awesome ;) |
| 23:21 | Turtl3boi | is 30 years of age too late to switch careers |
| 23:22 | Turtl3boi | note: it would be a *slight* change of career, not drastic |
| 23:23 | alexbaranosky | life has nothing to do with that stuff |
| 23:23 | alexbaranosky | just focus and do the work |
| 23:23 | alexbaranosky | and then you'll get there |
| 23:30 | technomancy_ | amalloy: I think we missed an opportunity by not putting a "tweet your results" button in github-percentile. =) |
| 23:31 | amalloy | technomancy_: true that. i'm so glad i added a Tweet button to 4clojure the night before someone noticed the site |
| 23:34 | technomancy_ | nice work on the org support: http://github-percentile.herokuapp.com/clojure |
| 23:34 | amalloy | nice work plugging it for me in #clojure |
| 23:35 | technomancy_ | I'm just gonna link to http://tinyurl.com/37qn7r6 before this gets out of hand |
| 23:36 | dnolen | what does the github percentile number mean? |
| 23:37 | amalloy | dnolen: nothing much really. just a measure of how long you've had your account. for example if you look up amalloy, you see "87% of Github employees have had an account longer than amalloy has" |
| 23:37 | amalloy | technomancy made it up on a lark this morning and i took it as a spur to learn heroku, so now it's an app |
| 23:42 | mindbender | amalloy: I'm also in the process of learning heroku could you please give me some pointers that helped you |
| 23:42 | lancepantz | ummm, dudes |
| 23:42 | lancepantz | what is there to "learn"? |
| 23:42 | lancepantz | just to be an asshole and all, like i am |
| 23:42 | amalloy | mindbender: http://devcenter.heroku.com/articles/clojure and /msg technomancy_ |
| 23:42 | mindbender | I want to deploy a traditional j2ee app on heroku |
| 23:43 | technomancy_ | mindbender: heroku doesn't provide an application container, but if you want to bundle one in your app it's doable |
| 23:44 | technomancy_ | there are a couple limitations, the most pressing being a single process may only listen on a single port. if you can live with that and you can live with the idea of disposable nodes on EC2 you should be set. |
| 23:44 | technomancy_ | TBH I'm not really even sure what a traditional j2ee app looks like |
| 23:44 | lancepantz | and no websocket support! |
| 23:45 | lancepantz | get on that shit :) |
| 23:45 | technomancy_ | yeah, that's true. =\ |
| 23:45 | cemerick | hrm, I hadn't noticed the single port restriction. No remote REPLs? |
| 23:46 | technomancy_ | cemerick: you can do it using reverse SSH tunneling, or by keeping the repl in its own process. |
| 23:46 | mindbender | technomancy_: that's what I read I mean not really needing a server for deployment and I want it the easy way but I can't just figure how to do it |
| 23:46 | cemerick | technomancy_: The latter seems like it defeats the purpose? |
| 23:47 | mindbender | like jboss and maybe a war file |
| 23:47 | technomancy_ | cemerick: not really; if requests are just maps and each process is stateless it's trivial to reconstruct the state you need for debugging. |
| 23:49 | cemerick | That's fair. |
| 23:49 | technomancy_ | unless you mean for hot-patching in production, but I think that kind of stuff is better handled by a message queues |
| 23:50 | lancepantz | ninjudd's portal project may be useful there |
| 23:50 | technomancy_ | mindbender: heroku requires containerless apps, so you'd need to embed jetty |
| 23:50 | cemerick | No, most of my remote REPL-ing involves stuff like "WTF happened to this 2GB document", so in-process is a must. |
| 23:50 | lancepantz | i think it uses tcp though, not sure if that's allowed |
| 23:51 | technomancy_ | lancepantz: unfortunately that's still in private beta, which is why I'm looking into outbound reverse SSH |
| 23:51 | cemerick | S'ok though. Not everything needs to be everything to everybody all the time. |
| 23:51 | cemerick | :-) |
| 23:51 | cemerick | I actually have a bunch of low-traffic stuff that would be perfect to offload to heroku. |
| 23:52 | technomancy_ | it's been strongly webapp-centric so far, we don't even have rabbit out of private beta yet either |
| 23:52 | lancepantz | technomancy_: i see, i managed to get a real time app working on heroku using html5 server-sent events |
| 23:52 | lancepantz | one-way, but it worked really well |
| 23:53 | Raynes | technomancy_: You can use heroku for non-webapp stuff? |
| 23:53 | technomancy_ | lancepantz: I am hopelessly behind the times; sounds like I have some reading to do |
| 23:53 | lancepantz | works because it's essentially an http streaming response |
| 23:53 | Raynes | lancepantz: Did you know that tryclj runs on heroku? |
| 23:53 | technomancy_ | Raynes: sure; you can use it for background workers off a queue, but right now resqueue is the one people usually chose, which is kind of lame compared to rabbit. |
| 23:54 | lancepantz | Raynes: yep |
| 23:54 | technomancy_ | I keep bugging them to release the rabbit addon, no dice yet |
| 23:54 | technomancy_ | lancepantz: yeah, I've been playing with streaming chunked HTTP with mcgranaghan; it's really underappreciated. |
| 23:55 | lancepantz | technomancy_: agree, beats the hell out of comet |
| 23:55 | technomancy_ | we're doing json-map-per-line streaming into netty; it's really the best of both worlds |
| 23:55 | lancepantz | awesome |
| 23:56 | lancepantz | technomancy_: give this a read when you have some time http://dev.w3.org/html5/eventsource/ |
| 23:56 | technomancy_ | will do; thanks |
| 23:56 | Raynes | amalloy: You should do all sorts of stats. |
| 23:56 | Raynes | Make them think tentacles is the answer to life, the universe, everything. |
| 23:57 | amalloy | Raynes: heroku and github are both free, so feel free to fork and add some lame features |
| 23:57 | technomancy_ | 3D visualization of project fork DAGs please |
| 23:57 | cemerick | technomancy_: couch does the same thing for replication and such. Dunno if it'd be worth looking at to steal impl detail hints. |
| 23:58 | technomancy_ | cemerick: the json line-by-line thing? |
| 23:58 | cemerick | yup |
| 23:58 | technomancy_ | cool |
| 23:58 | technomancy_ | is it a design goal of nrepl to work over http? |
| 23:59 | cemerick | it's a design goal to provide protocol(s) so different transports can share the same backend, pass through semantics as much as possible, etc. |
| 23:59 | technomancy_ | so it should be possible even if an adapter isn't included out of the box? |
| 23:59 | cemerick | absolutely |
| 23:59 | technomancy_ | great |