2012-02-02
| 00:00 | arohner | cmajor7, Tcepsa: there's no performance difference between defn/recur and loop/recur |
| 00:00 | kilborn | dnolen: it does, and that's what I came up with. It just felt heavy-handed and since I'm very new to clojure (scheme background) I figured there might be some language facilities i'm not aware of for exactly this sort of thing |
| 00:00 | kilborn | Guess not |
| 00:01 | dnolen | kilborn: if you're doing something stateful, use the stateful facilities. they're pretty simple :) |
| 00:02 | cmajor7 | Tcepsa, arohner: thank you. so then if a function only does one thing (and needs to be recursive), there is no point to use a "loop/recur"? |
| 00:03 | Tcepsa | kilborn: That makes sense. In this case, though, yeah, I'd say it seems like a namespace-level atom would be a good fit. |
| 00:03 | dnolen | kilborn: you could probably do something fancy with reify + atom, then you don't have mutate at the REPL directly |
| 00:04 | dnolen | you'd get back a type that you can call fns on that do the work |
| 00:04 | nuclearsandwich | ? |
| 00:04 | nuclearsandwich | whoops. Mouse fumble. |
| 00:05 | dnolen | kilborn: but even then I'm not sure what that buys you over interacting on the atom via top level fns in your namespace. |
| 00:05 | Tcepsa | cmajor7: In my opinion, no. |
| 00:05 | arohner | cmajor7: right. loop is solely for the times when you want to recur, but not go to the top of the fn |
| 00:06 | cmajor7 | arohner, Tcepsa: great, thanks guys |
| 00:06 | arohner | and btw, loop is exactly identical to 'let', except it's also a recursion point |
| 00:06 | Tcepsa | cmajor7: My pleasure! ^_^ |
| 00:07 | Tcepsa | (and I learned some new things too!) |
| 00:08 | kilborn | dnolen: I can do some macro magic to wrap all the atom instantiation and emulate a setter call, or maybe implement an agent which gets messages and mutates it's own state, but that's all so heavy when the function itself is 2-3 lines. It just feels wrong. |
| 00:08 | kilborn | Tcepsa,Dnolen: thanks for your help |
| 00:08 | dnolen | kilborn: might be a good idea to ask this question on the overtone mailing list, I bet they've done something like this before. I'm probably babbling non-sense :) |
| 00:08 | Tcepsa | kilborn: You're welcome--good luck with Overtone; it's a really nifty project ^_^ |
| 00:09 | kilborn | dnolen: If you know live-coding, solving problem with overly complicated yas snippets is a form of cheating... :) |
| 00:10 | dnolen | kilborn: I bet! I'm sure samaaron will have some good pointers. |
| 00:11 | kilborn | dnolen: yeah, mailing list is the next stop |
| 00:21 | kilborn | is there a special let form for doing ycombinator-like things such as (let f #( (after 1000 f)))? |
| 00:23 | dnolen | kilborn: letfn will let you do that I'm pretty sure. |
| 00:34 | kilborn | dnolen: yep, tks. |
| 01:02 | dnolen | I'm sure someone could chime in about Lein work flow on this post http://oblong-code.blogspot.com/2012/02/unpretty.html |
| 01:06 | G0SUB | dnolen, checkout dependencies? |
| 01:13 | dnolen | G0SUB: that's what I thought I just never use that myself so not sure about the details. |
| 01:17 | G0SUB | dnolen, I have used it. Works as advertised. |
| 03:01 | tsdh | Is there a way to let pprint print long vectors/seqs in such a way that every line has as many items as possible according to *print-right-margin* instead of only one item per line? |
| 03:49 | Blkt | good morning everyone |
| 03:50 | ordnungswidrig | good morning |
| 03:50 | Blkt | :D |
| 04:04 | tsdh | good morning |
| 04:56 | G0SUB | this channel needs 1000 more users to be elite :-) |
| 04:58 | ordnungswidrig | G0SUB: the other way round: it's no longer elite if it has over 1000 users. |
| 04:58 | G0SUB | ordnungswidrig, ;-) |
| 08:34 | Borkdude | Is it safe to say that + is a symbol which is used to denote a var, and this var points to a value which is a function that can add numbers? |
| 08:34 | Borkdude | I'm always a bit confused about Symbols and vars |
| 08:34 | solussd | anyone have any suggestions for ruby/clojure socket or http communication? Basically, I have a rails app that will need to request information from and process the response of a clojure app which will likely, but not necessarily, be running on the same server. |
| 08:34 | solussd | symbols name things |
| 08:34 | ordnungswidrig | solussd: rpc? |
| 08:35 | solussd | I've been looking at aleph, but not sure how to talk to it from the ruby side |
| 08:36 | samaaron | Borkdude: that's how I see things |
| 08:43 | the-kenny | solussd: Do you need bidirectional communication? |
| 08:44 | solussd | the-kenny, just request/response, so no. |
| 08:44 | solussd | the clojure code doesn't need to call into the rails app |
| 08:45 | the-kenny | I'd use a simple REST interface with compojure then |
| 08:45 | the-kenny | aleph is nice too, but it's more useful for streaming of data |
| 08:46 | solussd | k |
| 08:46 | solussd | thanks |
| 10:54 | semperos | using swank-clojure, when I C-c C-k a namespace once, everything is fine; if I do it a second time, Clojure throws an error saying that a function I've defined in a protocol is not implemented by a record I'm using |
| 10:55 | semperos | possible reasons? |
| 11:05 | compj | semperos: does it work when you dont compile? C-c C-l ? |
| 11:06 | semperos | every time I do record/protocol work, I tend to mess up the syntax a bit, probably the case here |
| 11:06 | semperos | here's a gist of what I'm doing: https://gist.github.com/1724259 |
| 11:07 | semperos | doesn't make a difference |
| 11:08 | semperos | on first compile/load, works fine; on second, claims I haven't provided an implementation for my function |
| 11:10 | compj | ok, then my idea is wrong |
| 11:12 | compj | maybe a last try, delete all aot compiled files and do the C-c C-l again |
| 11:12 | compj | in a new repl |
| 11:12 | semperos | yeah, I've tried that |
| 11:12 | semperos | thanks, though |
| 11:12 | pjstadig | semperos: can you post the imports too |
| 11:13 | semperos | sure, I'll include the ns decl |
| 11:13 | pjstadig | it might be that the .start within the start function is being interpreted as a call to the start protocol fn, instead of the start method on Server |
| 11:13 | pjstadig | maybe a type hint would help? |
| 11:13 | semperos | ah |
| 11:13 | pjstadig | i'm not sure |
| 11:13 | semperos | interestin' |
| 11:13 | semperos | didn't know you could do type hints on protocol fn's... |
| 11:14 | compj | question is, why does it work the first time |
| 11:14 | pjstadig | although it is complaining that there's no impl for the RemoteServer defrecord |
| 11:14 | pjstadig | not the Server class |
| 11:15 | semperos | pjstadig: https://gist.github.com/1724259 |
| 11:15 | semperos | ns included |
| 11:15 | semperos | renaming fn's is No Big Deal, I'll try that |
| 11:16 | pjstadig | i guess having the ns is a start, but now I'd have to track down all the deps to try the code myself :/ |
| 11:16 | semperos | :) |
| 11:16 | semperos | it's the library I maintain, clj-webdriver |
| 11:16 | semperos | but no need to do all that work |
| 11:16 | pjstadig | just give me all your code :) i promise i'll be good |
| 11:16 | pjstadig | ah |
| 11:16 | semperos | this code isn't committed in the state it's in, initial dev |
| 11:17 | semperos | don't worry about going to those lengths, was just looking for a sanity check |
| 11:17 | compj | tried doing loading manually? (use :reload ...)? |
| 11:18 | semperos | well, I'm actually *in* the namespace |
| 11:18 | semperos | I'm not using it |
| 11:18 | semperos | though I could try from a different ns and do that... |
| 11:18 | compj | just to eliminate a possible swank bug i think |
| 11:19 | semperos | sure |
| 11:19 | semperos | I just upgraded to 1.4 the other night |
| 11:23 | semperos | tried going back to swank-clojure 1.3.4, same issue... |
| 11:24 | compj | but from a different ns works? |
| 11:25 | semperos | compj: no, doesn't work regardless |
| 11:25 | semperos | only on second compile |
| 11:33 | semperos | so it looks to be a bug with the version of slime that is pulled down by swank-clojure |
| 11:33 | semperos | rolling back to 1.3.4 and making sure the correct slime checkout was loaded solved the issue |
| 11:38 | semperos | hmm, perhaps I was wrong |
| 11:38 | semperos | in my slime session, I instantiate a RemoteServer and then do (start) on it |
| 11:39 | semperos | works the first time |
| 11:39 | semperos | do a recompile with C-c C-k, hop back to slime and run start again, I get the failure describe |
| 11:39 | semperos | *described |
| 11:39 | semperos | however, if I re-instantiate a RemoteServer record and do start again, it works fine |
| 11:40 | semperos | or rather, doesn't work, just says "Evaluation aborted." |
| 11:41 | hugod | every time you compile a record or protocol, it generates a new type, so any existing objects no longer implement the protocol |
| 11:41 | semperos | hugod: makes sense |
| 11:41 | semperos | but why, when I instantiate a new instance of the record, do I just get "Evalution aborted." instead of a successful run? |
| 11:42 | semperos | whereas it works perfectly on the first compile and run |
| 11:42 | hugod | does *e give you anything? |
| 11:42 | semperos | heh |
| 11:42 | semperos | yes... |
| 11:43 | semperos | hugod: thank you, that tells me exactly why it fails |
| 11:43 | semperos | though I wonder why the exception doesn't pop open an sdb buffer |
| 11:43 | compj | what was the problem? |
| 11:44 | semperos | my lack of understanding about how recompilation affected records and protocols |
| 11:44 | semperos | I always assume my own ignorance when I hit these snags, was just wondering where the hole was this time, thanks compj hugod and pjstadig |
| 11:45 | semperos | and the fact that a java.net.BindException wasn't popping up in an sdb buffer, so I was just seeing "Evaluation aborted" at times without knowing why |
| 12:05 | mrevil | is there an easy way to wrap a lazy sequence so I can do something like obtain a lock at the beginning and at the end release it? |
| 12:08 | lucian | mrevil: why lock it? |
| 12:12 | jkdufair | when i have a slime session connected to a remote swank server and i compile a defun, say with C-c C-c, it gets sent to the remote server, right? |
| 12:12 | zakwilson_ | Yes |
| 12:12 | jkdufair | ok, thx |
| 12:12 | lnostdal | hi guys, figured i'd to some upgrades .. but after doing lein install in the swank-clojure checkout here and symlinking ~/.lein/plugins/ |
| 12:13 | lnostdal | ~/.lein/plugins/swank-clojure-1.5.0-SNAPSHOT.jar to the file in .m2 lein swank still says it's missing |
| 12:13 | clojurebot | Titim gan éirí ort. |
| 12:13 | lnostdal | "That's not a task." |
| 12:15 | zakwilson | Compiling a local file doesn't work properly on a remote server though, jkdufair; use slime-eval-buffer instead. |
| 12:15 | lnostdal | i guess lein does some "magic" with its lein plugin install thingy ... |
| 12:17 | jkdufair | zakwilson: thank you! i'm struggling to understand this. that helps immensely |
| 12:19 | zakwilson | jkdufair: I'm pretty sure slime-compile-and-load-file calls (load-file ...) on the server, while slime-eval-buffer and slime-compile-defun sends the contents of the file or function to the server. That help? |
| 12:20 | jkdufair | yes |
| 12:20 | jkdufair | perfect |
| 12:20 | jkdufair | thanks a bunch |
| 12:43 | technomancy | lnostdal: a symlink won't work anyway because the plugin is an uberjar |
| 12:43 | technomancy | the symlink won't get you clj-stacktrace, cdt, and friends |
| 12:48 | lnostdal | technomancy, ah, thanks .. uberjar worked .. had to rename it slightly tho |
| 12:49 | lnostdal | uhm, i think |
| 12:50 | lnostdal | nvm |
| 12:56 | technomancy | lnostdal: 1.5.0-SNAPSHOT isn't any different from the 1.4.0 release though iirc; might as well do it the easy way |
| 12:58 | lnostdal | how? |
| 12:58 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.Cons cannot be cast to clojure.lang.IPersistentStack> |
| 13:02 | technomancy | lein plugin install swank-clojure 1.4.0 |
| 13:03 | lnostdal | ok |
| 13:07 | perezd | mac users: what emacs do you use? (anything special? noob here) |
| 13:09 | erewhon | 24.0.91 via homebrew |
| 13:09 | perezd | brew wants to install 23 |
| 13:09 | perezd | is that okay still? |
| 13:11 | erewhon | I think 23 is ok, but IIRC there were things that worked better in 24. There are some switches to brew to get it to build 24. |
| 13:11 | perezd | k thanks, I'll check it out |
| 13:11 | duck1123 | Is there any good documentation for, or projects that make good use of annotations in Clojure? Most of the pages I've found are from 2009-10. |
| 13:11 | erewhon | like 'brew install emacs --cocoa --use-git-head' or something like that |
| 13:11 | perezd | erewhon: any books/resources you recommend for learning emacs? |
| 13:12 | erewhon | gosh... it's been a while. I thought there was a tutorial built-in. |
| 13:12 | perezd | maybe so |
| 13:13 | erewhon | there are probably only a handful of key sequences i use continuously. besides moving around, undo (C-x u or C-_), save C-x C-s, open file C-x C-f. but there's a lot there. |
| 13:14 | perezd | interesting |
| 13:14 | perezd | okay |
| 13:14 | erewhon | the Emacs starter kit (hi technomancy!) is a nice add on if you're starting from 0 (or starting over). |
| 13:14 | erewhon | emacs wiki is a handy resource |
| 13:14 | perezd | gonna just install --HEAD |
| 13:14 | perezd | that appears to be the only way to get 24 |
| 13:15 | erewhon | right |
| 13:16 | erewhon | you can use it just as a development editor, but it's easy to get sucked into it and start doing everything in Emacs. |
| 13:16 | erewhon | (since there are packages that do just about anything) |
| 13:16 | perezd | erewhon: thats what I hear…I actually don't really know much about emacs whatsoever…thats why I was looking for a book |
| 13:16 | perezd | I use vim poorly |
| 13:17 | perezd | but now that I am lisping |
| 13:17 | perezd | emacs probably makes better sense |
| 13:17 | compj | try also emacs-prelude |
| 13:17 | erewhon | there's also the Emacs manual. i haven't read that in a long time, but as I recall there was lots of info in there |
| 13:17 | perezd | compj: what is that |
| 13:17 | compj | second that, read it a few months ago, you can get it at gnu.org |
| 13:18 | compj | perezd: it's an alternative to emacs starter kit |
| 13:18 | compj | a nice selection of modes and settings |
| 13:18 | perezd | oh cool |
| 13:18 | perezd | thanks all, this is really useful |
| 13:19 | perezd | lol |
| 13:19 | compj | http://batsov.com/articles/2011/11/30/the-ultimate-collection-of-emacs-resources/ |
| 13:19 | erewhon | I first used it on a timeshared Unix machine via dialup in 1986.... |
| 13:19 | perezd | og neckbeard cred |
| 13:20 | compj | the builtin tutorial is also nice for a quick start imho |
| 13:20 | perezd | yeah, I'll start there |
| 13:27 | TimMc | perezd: There's also my "Emacs n00b start" <http://www.brainonfire.net/blog/emacs-n00b-start/>, which is a quick walk through some commands you should know *before* your first tutorial. |
| 13:27 | perezd | tahnks! |
| 13:54 | technomancy | guys... I just committed my first type hints ever |
| 13:55 | technomancy | thought I'd share that with you |
| 13:56 | tmciver | Another Red-Letter date in software engineering history...and I was there. |
| 13:56 | muhoo | nice. commit? |
| 13:57 | technomancy | https://github.com/heroku/pulse/commit/486f9845257d4ae1e |
| 13:57 | emezeske | technomancy: next thing you know, you're gonna be committing a protocol (!) |
| 13:57 | technomancy | noooooo |
| 13:58 | TimMc | technomancy: Write an agry, passive aggressive rant on your blog. |
| 13:59 | TimMc | talking about how the github devs hate you. |
| 13:59 | technomancy | the "noooooo" was re: protocols, not github fwiw |
| 13:59 | technomancy | TimMc: maybe I could coin the phrase NoGithub |
| 13:59 | technomancy | it'll catch on like wildfire in the NoOps and NoSQL crowd |
| 13:59 | TimMc | haha |
| 13:59 | TimMc | NoOps? |
| 14:00 | technomancy | ugh; don't get me started |
| 14:00 | TimMc | Is that as stupid as it sounds? |
| 14:00 | TimMc | ...yup. |
| 14:01 | TimMc | "whine whine whine, I hate communication" |
| 14:01 | muhoo | sounds like a no-op to me :-) http://en.wikipedia.org/wiki/NOP |
| 14:02 | TimMc | ~rimshot |
| 14:02 | clojurebot | Badum, *tish* |
| 14:03 | muhoo | funny, i got into emacs because of lisp. a friend was teaching me scheme years ago, and i got annoyed trying to work in a repl without history and sufficient scrollback, and he said, "you need comint mode and emacs", and from there i was hooked. |
| 14:03 | TimMc | technomancy: So, why the type hints? Was reflection slowing something down? |
| 14:03 | technomancy | TimMc: yeah, it was in a tight loop |
| 14:04 | muhoo | the comit says "Remove reflection warnings " so i guess you were getting some kind of console spew? |
| 14:09 | TimMc | muhoo: You can turn that spew on optionally. |
| 14:09 | technomancy | ah yes, I suppose that commit message is not terribly accurate |
| 14:09 | technomancy | it was the reflection that I intended to remove, not the warning thereof =) |
| 14:10 | jsabeaudry | emezeske, cljsbuild 0.0.10 works with the dependencies without any problem so far |
| 14:10 | technomancy | emezeske: hey, have you tried lein 1.7 yet? |
| 14:15 | emezeske | jsabeaudry: thanks a bunch! |
| 14:15 | emezeske | technomancy: no, I want to thought, just haven't had time |
| 14:15 | emezeske | s/thought/though |
| 14:16 | amalloy | technomancy: fix warnings: "make the code better". remove warnings: "add 2>/dev/null to the makefile" |
| 14:17 | technomancy | amalloy: it's my first time using type hints; I plead noobism |
| 14:21 | amalloy | technomancy: if you're looking for another reason to be sad about typehints, check out http://dev.clojure.org/jira/browse/CLJ-865 |
| 14:21 | technomancy | yow |
| 14:21 | TimMc | ouch |
| 14:22 | TimMc | I never even thought to transfer metadata. |
| 14:23 | amalloy | and you shouldn't have to :P |
| 14:27 | muhoo | that's beautiful. i went searching on "noops" and found this http://siliconangle.com/blog/2012/02/01/noops-a-big-lie-or-a-political-shift/ which yeilded this: http://prn.s3.amazonaws.com/doh.jpg |
| 14:28 | TimMc | ops! |
| 14:28 | ibdknox | lol |
| 14:28 | ibdknox | ~rimshot |
| 14:28 | clojurebot | Badum, *tish* |
| 14:28 | muhoo | (recursive irony since i'm using aws to host that image) |
| 14:29 | perezd | hey, so I tried to setup emacs-prelude, but the daemon mode errors with exit code 2 now :( |
| 14:29 | perezd | not sure how to fix. |
| 14:29 | cemerick | amalloy: but without such things, what would book authors talk about :-P |
| 14:30 | amalloy | oh whoops, i forgot to copyright my jira comments so cemerick can't steal them |
| 14:31 | cemerick | word-for-word |
| 14:49 | erewhon | perezd: specify full path for emacs: /usr/local/Cellar/emacs/HEAD/bin/emacs |
| 14:49 | perezd | erewhon: yeah, I just reinstalled it |
| 14:49 | erewhon | perezd: or don't use daemon mode |
| 14:49 | perezd | somehow it fixed it |
| 14:49 | erewhon | :) |
| 14:53 | Licenser | Raynes it is your fault I have no cake for your birthday! |
| 14:54 | perezd | who in here is using emacs-prelude ? |
| 15:02 | jsabeaudry | Question about best practices regarding rich webapps. Do you actually serve html or just javascript and the javascript takes care of generating html? |
| 15:03 | ibdknox | typically a combination |
| 15:04 | mintsoup | though alot of sites seem to be tending to the javascript extreme.. |
| 15:05 | ibdknox | got that t-shirt |
| 15:05 | ibdknox | don't recommend it |
| 15:06 | technomancy | depends on your requirements for graceful degredation I guess |
| 15:08 | ibdknox | it depends on lots of things unfortunately :( Not the least of which is how complicated your templating is, the levels of dependency between your models, how much you want to poke yourself in the eye... |
| 15:08 | tjgillies | after learning more about identity and state it scares me how much mutation of state i have going on in my non clojure apps |
| 15:08 | ibdknox | technomancy: btw, I have no idea why, but just setting xmx fixed that issue, memory usage is totally normal now |
| 15:08 | technomancy | ibdknox: whew; glad to hear it |
| 15:09 | technomancy | if you're using a client JVM I think it will default to a lower Xmx, which could explain the discrepancy |
| 15:09 | technomancy | got a fix in the pipeline for JAVA_OPTS though, glad we caught that |
| 15:09 | ibdknox | yeah |
| 15:10 | technomancy | the JVM is famous for using as much memory as it thinks it can get away with |
| 15:11 | gf3 | hey guys, not sure if one of you runs the blog |
| 15:11 | gf3 | http://www.clojure.net/2012/02/02/Monads-in-Clojure/ |
| 15:12 | gf3 | small typo |
| 15:12 | gf3 | (appy concat (map ... )) → "apply" |
| 15:12 | brehaut | gf3: that would be jimduey i think |
| 15:12 | gf3 | ahh, thx |
| 15:12 | gf3 | jimduey ↑ |
| 15:12 | jimduey | yep. I'll fix. Thanks. |
| 15:13 | gf3 | jimduey: great article, thank you |
| 15:14 | amalloy | (apply concat (map ...)) -> (mapcat ...) |
| 15:14 | amalloy | i've only glanced at the article, so i can't tell if that's off-topic :P |
| 15:16 | jimduey | Yeah, I specifically avoided mapcat for pedagogical reasons. |
| 15:17 | jimduey | Going to be (apply union ...) when we look at the set monad. |
| 15:24 | triyo | What is the best way to extend an existing class and add a new constructor in clojure now days? |
| 15:37 | amalloy | triyo: assuming it's possible, gen-class is what you'll need to use. but personally, if i ever found myself needing to do this, i'd prefer to just do it in java where it's common, natural, and easy |
| 15:38 | triyo | True, was thinking about that now to go with java/src option |
| 15:42 | triyo | Also the class I want to extend is part of a library utilized by other java developers. This would make it easier to share the java source of improvements. |
| 16:31 | TimMc | tmciver: I'm going to rename the import-static GitHub project to "imports" |
| 16:35 | Licenser | out of curiosity has anyone a dedicated server with a decent network connection to run a httperf for me to test something? |
| 16:36 | Licenser | httperf --server=82.210.31.101 --uri=/ --num-conns=50 --num-calls=100 is what I am running |
| 16:37 | TimMc | I can try from a university machine... |
| 16:38 | Licenser | would be great I really have a hard time to figure where the bottleneck is, from the same machine I get about 600 req/s |
| 16:38 | TimMc | Nope, can't -- httperf not installed. |
| 16:38 | Licenser | which in itself isn't great but it is at least semi expected |
| 16:38 | Licenser | heh thanks non the less tim |
| 16:39 | TimMc | Well, let's see what this shitty laptop at home can do. |
| 16:39 | Licenser | heh |
| 16:40 | Licenser | I am counter trying clojure.org to see if I get a better result there |
| 16:40 | Licenser | that way at least I can test if it is my machine that is slow |
| 16:40 | brehaut | its taking quite a while on my VPS |
| 16:40 | Licenser | VPS? |
| 16:41 | brehaut | virtual private server |
| 16:41 | TimMc | Over 44 seconds, I got 8.5 req/s :-P |
| 16:41 | Licenser | ah I see |
| 16:42 | Licenser | not really great |
| 16:42 | TimMc | What's the goal, looking for errors? |
| 16:42 | Licenser | TimMc trying to find the bottleneck |
| 16:43 | Licenser | so it's hard when I have to choose between A) my laptops HW, B) My internet Connection, C) the internet up to my Server, D) The VM's internal network, E) the VM itself |
| 16:43 | Licenser | so I try to eliminate parts |
| 16:43 | TimMc | OK, trying from work... |
| 16:43 | Licenser | okay clojure.org gives me 4.5r/s |
| 16:43 | Licenser | so I start to think it is my connection in the first place |
| 16:44 | TimMc | 5.6 req/s |
| 16:44 | TimMc | and it's a fast machine with a reasonable connection |
| 16:45 | brehaut | Request rate: 5.7 req/s (176.9 ms/req) for me |
| 16:45 | TimMc | I guess there's some jitter because multiple people are hammering on it. |
| 16:45 | TimMc | There's no way my craptop on a home connection beats my work machine. |
| 16:45 | muhoo | 26003 fu 20 0 21624 1676 1204 R 99.2 0.2 1:17.87 httperf |
| 16:45 | Licenser | *nods* |
| 16:46 | Licenser | heh |
| 16:46 | muhoo | httperf is a cpu pig |
| 16:46 | Licenser | my problem is that httperf on my machine eats 100% CPU and gets 25-30 req/s |
| 16:46 | Licenser | given the serer is 'next door' as in just 20 km from my home |
| 16:46 | muhoo | Licenser: yes, you now basically have a DDoS attack on that server |
| 16:46 | TimMc | Licenser: Hire a bot net. |
| 16:46 | Licenser | :P |
| 16:46 | TimMc | Get 4chan mad at your server. |
| 16:46 | muhoo | use loic |
| 16:46 | devn | ima loadin muh lazerz |
| 16:47 | Licenser | heh |
| 16:47 | Licenser | well I will ask a colegue tomorrow I think |
| 16:47 | Licenser | thanks mates :) |
| 16:47 | Licenser | it was at least insightful |
| 16:47 | muhoo | Request rate: 5.2 req/s (192.4 ms/req) |
| 16:49 | devn | Request rate: 4.6 req/s (219.1 ms/req) |
| 17:12 | mrevil | must cascalog always operate on tuples or can I supply a hash? |
| 18:22 | arohner | anyone have experience with resque-clojure? |
| 19:31 | pandeiro | any way to check for browser features (eg window.localStorage) in cljs? |
| 19:32 | TimMc | pandeiro: Besides the usual way? |
| 19:33 | TimMc | What happens if you ask for (. window -localStorage) or whatever the syntax is these days? |
| 19:33 | pandeiro | at the repl it blows up |
| 19:35 | pandeiro | TimMc: nevermind, this time it didn't... using js/localStorage throws an exception but the (.-localStorage js/window) syntax works |
| 19:41 | arohner | what is the 1.3 replacement for c.c.prxml? |
| 19:42 | TimMc | Interesting. (def a 5) (do (in-ns 'temp) (def b 10) (in-ns 'user)) works from the REPL -- a is only visible outside the 'do, b is only visible inside. |
| 19:42 | TimMc | But if you turn that 'do into a 'let, you don't escape the original namespace. |
| 19:43 | arohner | have I mentioned how much I hate the 1.3 switchover? and the total lack of a migration path? |
| 19:44 | TimMc | arohner: Were you here for yesterday's regularly-scheduled argument about the clojure contribution process? :-) |
| 19:45 | arohner | TimMc: yes, I was :-) |
| 19:45 | arohner | but this is an orthogonal issue |
| 19:45 | brehaut | arohner: http://dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Go says it evaporated |
| 19:45 | arohner | brehaut: sigh. thank you |
| 19:45 | brehaut | arohner: it may have migrated into the core xml lib |
| 19:46 | brehaut | https://github.com/clojure/data.xml |
| 19:47 | TimMc | arohner: It's sort of orthogonal... there might actually be maintainers for more of those if people felt they could contribute. |
| 19:48 | arohner | TimMc: absolutely true, but I wish the 1.3 contrib switchover didn't happen at all without a better migration strategy |
| 19:48 | TimMc | Definitely. |
| 19:48 | arohner | brehaut: thanks. I was hoping for a direct port. I'm upgrading https://github.com/leadtune/clj-airbrake to 1.3 |
| 19:48 | TimMc | Contri was a bad idea in the first place, though -- and I think that's most of the pain. |
| 19:48 | brehaut | arohner: i thought you might. the whole xml space seems to be a quite in-flux area atm |
| 19:49 | brehaut | arohner: would hiccup work? |
| 19:49 | TimMc | arohner: Do you need proper namespace support? |
| 19:50 | arohner | TimMc: doesn't look like it: https://github.com/leadtune/clj-airbrake/blob/master/src/clj_airbrake/core.clj |
| 19:50 | brehaut | arohner: looking at the usage of prxml you might be able ot get away with it |
| 19:50 | brehaut | time for cricket |
| 19:54 | TimMc | alexbaranosky: You said that midje haa some utility for sandbox namespaces? |
| 19:56 | TimMc | alexbaranosky: I might end up just using clojail. >_< |
| 20:13 | technomancy | sjl: nice app =) |
| 20:14 | sjl | technomancy: which one? |
| 20:14 | technomancy | typkov |
| 20:14 | sjl | technomancy: ah, yeah, that was fun. Thanks1 |
| 20:15 | technomancy | just saw it on the intertweets |
| 20:15 | sjl | technomancy: heh, I recorded all ~3hours of me making it as a screencast here: http://youtu.be/uTwnoZEw7FE -- It's a fun usability study of Clojure/Noir/Vim/etc |
| 20:16 | technomancy | three hours; wow |
| 20:16 | TimMc | Wow. I can't concentrate for more than |
| 20:16 | sjl | yeah, I pretty much started screenflow and just went until I finished |
| 20:20 | TimMc | Did that include doc and tests? |
| 20:20 | sjl | nah, and I still had to clean up a few things afterword too |
| 20:22 | technomancy | what worked well for me doing the peepcode was to break it up into chapters corresponding to git branches |
| 20:22 | technomancy | course I had it all scripted out ahead of time |
| 20:22 | technomancy | but it makes it nice for folks following along at home |
| 20:23 | sjl | yeah, this was more of a "well I'm making it anyway, may as well record it" |
| 20:29 | TimMc | In a line, what is it? |
| 20:30 | sjl | TimMc: the app? It lets you paste in text you've written and created random typing lessons for you based on that text |
| 20:38 | TimMc | Ha, cool. |
| 20:45 | dgrnbrg | Suppose I want to have a public macro that, when expanded, calls some function private to the macro's namespace (something impl-specific). When I do this with defn-, it complains about the visibility. Is there another way? |
| 20:48 | TimMc | Yeah, someone I know was complaining about that. |
| 20:49 | technomancy | need to either go through a var or mark it an ^:internal instead of private |
| 20:49 | TimMc | Maybe if you make the defn public and just hint it with :^internal?> |
| 20:49 | TimMc | bah |
| 20:50 | dgrnbrg | what does ^:internal do? |
| 20:50 | dgrnbrg | technomancy, is it recognized by the compiler? |
| 20:50 | dgrnbrg | or runtime? |
| 20:51 | TimMc | dgrnbrg: It's just for your audience. |
| 20:51 | technomancy | dgrnbrg: recognized by human readers =) |
| 20:51 | dgrnbrg | I see |
| 20:51 | dgrnbrg | Is there any library for executing a dependency graph of functions? |
| 20:51 | technomancy | honestly :private is entirely about communicating intent too |
| 20:51 | technomancy | it just has the compiler help it out a little extra |
| 20:52 | dgrnbrg | yeah |
| 20:52 | dgrnbrg | well, i'll go with the public soln for now |
| 20:52 | dgrnbrg | I have an input that needs to get processed through a little graph |
| 20:52 | dgrnbrg | I could just have the functions call each other in turn |
| 20:53 | dgrnbrg | but I was wondering if there's a bit more elegant way, perhaps by specifying their deps in a standard way? |
| 20:54 | technomancy | monads! |
| 20:57 | technomancy | or -> |
| 20:57 | TimMc | dgrnbrg: But you want to do it efficiently, yeah? |
| 21:01 | TimMc | I wrote a cascading mutater at some point that worked from a DAG of nodes that knew how to update when their dependency nodes were updated. |
| 21:02 | TimMc | but you probably want something functional, yeah? |
| 21:02 | TimMc | (ugh, I hate how repetitive my writing is) |
| 21:07 | dgrnbrg | TimMc, I'm not terribly concerned about functionality |
| 21:07 | dgrnbrg | technomancy, I think I'd like more flexibility, in case I parallelize it later |
| 21:07 | dgrnbrg | Is there a zipper for maps? |
| 21:09 | TimMc | dgrnbrg: Check ou thte cascade.clj file in my HW3 prohjec ton github |
| 21:11 | dgrnbrg | TimMc, that's quite good |
| 21:12 | dgrnbrg | Is there some kind of functional data structure like a zipper but for a map? |
| 21:13 | TimMc | dgrnbrg: It's a bit weird, should maybe be rewritten inside out. |
| 21:14 | dgrnbrg | what do you mean inside out? |
| 21:18 | TimMc | Well, since it mutates stuff, the client code really shouldn't responsible for storing the returned object back into a ref or whatever. |
| 21:18 | TimMc | and someone suggested having it watch atoms instead of calling dirty! on it. |
| 21:27 | TimMc | dgrnbrg: So, is this a DAG of processing functions where an input goes in and you get a bunch of outputs out? |
| 21:38 | dgrnbrg | TimMc, it's almost more of a sequence of validity checks |
| 21:38 | dgrnbrg | and the data must get verified |
| 21:38 | dgrnbrg | and some passes won't make sense until a previous pass has ran |
| 21:38 | dgrnbrg | and other passes rewrite the data |
| 21:39 | dgrnbrg | and there's a path it should take to get an answer or an error |
| 21:45 | TimMc | dgrnbrg: You want to shortcut on errors? |
| 21:45 | TimMc | Or collect all the errors? |
| 21:55 | dgrnbrg | TimMc, collect them all |
| 21:55 | dgrnbrg | (man, I don't have notifications set up properly |
| 21:56 | dgrnbrg | very hard to chat in a timely manner) |
| 22:04 | TimMc | dgrnbrg: Let's see, you do a topo sort of the graph, and start with the first (input) layer, then work your way layer by layer to the end. For each node in a layer, if its dependencies are all valid, run the validator/transformer and collect the result or error. At the end, you have zero or more errors accumulated from the layers, and maybe a value for the output. |
| 22:05 | TimMc | dgrnbrg: I bet you could do something clever with promise/deliver or futures, too. |
| 22:05 | TimMc | (if you only wanted the end result) |
| 22:12 | tmciver | TimMc: have you been doing any work on imports? |
| 22:13 | tmciver | TimMc: I'd like to try tackling something you're not doing. |
| 22:14 | TimMc | tmciver: Just the testing. It's not going well. :-P |
| 22:15 | TimMc | tmciver: So go for it. Oh, what do you think of syntax like (import+ (java.awt Color (geom :rename {Point2D$Double P2D}))) ? |
| 22:15 | tmciver | TimMc: Ahh! When you said "import plus" I imagined import-plus |
| 22:15 | TimMc | Nesting packages, renaming without having to list the class redundantly in both the imports and renaming. |
| 22:16 | tmciver | Is it more idiomatic to use a vector? (import+ (java.awt Color (geom :rename {Point2D$Double P2D}))) |
| 22:16 | tmciver | wait |
| 22:16 | tmciver | Is it more idiomatic to use a vector? (import+ (java.awt Color [geom :rename {Point2D$Double P2D}])) |
| 22:17 | TimMc | Probably. |
| 22:17 | TimMc | clojure.core/import doesn't, though |
| 22:17 | TimMc | It's a little inconsistent. |
| 22:18 | TimMc | We don't actually have to choose, just check for a sequential? and allow either. |
| 22:18 | tmciver | Ugh. Let the confusion begin (coninue?) |
| 22:18 | TimMc | That cuts off some future syntactic additions, but I'm not too worried. |
| 22:19 | tmciver | s/coninue/continue |
| 22:19 | TimMc | tmciver: It would have confusion-parity with 'require and 'use, yes. |
| 22:19 | tmciver | Oh, well since you put it that way... |
| 22:20 | tmciver | So you're going to be tackling the renaming? I could make an attempt at importing static methods as functions. |
| 22:21 | TimMc | Renaming is totally something that can be folded in afterwards. |
| 22:21 | tmciver | Sure |
| 22:22 | arohner | with midje, how do you stub a function to throw an exception? |
| 22:22 | TimMc | tmciver: Making functions is a good first step, but I think the killer feature would be hinting. Not sure how that would work *precisely*, but it would rock. |
| 22:24 | tmciver | TimMc: so, what would the hinting do here? |
| 22:26 | TimMc | Well, you'd effectively want (defn ^double sqrt [^double x] (Math/sqrt x)) |
| 22:26 | tmciver | TimMc: OK, that's good. |
| 22:26 | TimMc | I guess the macro to produce that would use with-meta on the forms it produces. |
| 22:27 | TimMc | It'll take some fancy footwork to extract the type information from reflection and munge it into a form Clojure likes, but again, that's down the road. |
| 22:27 | arohner | alexbaranosky: is it possible to make a midje fake that throws when called? |
| 22:28 | tmciver | TimMc: BTW, I fixed my warped keyboard tonight :D |
| 22:28 | TimMc | Haha, good! Was there a hamster or something under there? |
| 22:29 | tmciver | TimMc: I had improperly replaced a bracket causing it to stick up. |
| 22:29 | tmciver | TimMc: Nothing a hammer couldn't fix. |
| 22:35 | alexbaranosky | arohner, it looks like the answer is no. But you really should be able to... imho. It might be fairly straightforward to add a syntax like this: (provided (foo) =throws=> (Exception. "boom")) |
| 22:37 | arohner | alexbaranosky: thanks. One more question while I'm at it: is there a way to avoid specifying how many arguments a function is called with? |
| 22:37 | arohner | I don't want to do (provided (foo anything anything anything anything anything)), I want (provided (foo any-number-of-arguments)) |
| 22:38 | alexbaranosky | arohner: no sugar for that (yet)... add your approval to the issue (https://github.com/marick/Midje/issues/56) |
| 22:39 | alexbaranosky | so far I've been the only one to care about this idea, so it hasn't gotten done |
| 22:39 | alexbaranosky | arohner, I'm going to look at =throws=> right now |
| 22:40 | arohner | alexbaranosky: thanks |
| 22:49 | devn | heya alexbaranosky |
| 22:54 | Raynes | devn: I don't know if you're aware of this, but I recently became an old man. ;) |
| 22:54 | clojurebot | Huh? |
| 22:54 | devn | Raynes: You got married?! |
| 22:55 | Raynes | No, but that's certainly an interesting conclusion. |
| 22:55 | devn | Raynes: I don't mean that to sound incredulous: of course you got married. |
| 22:55 | Raynes | I turned 18. |
| 22:55 | devn | Bahahahahaha |
| 22:55 | Raynes | I figured that was clearer than it actually was. :p |
| 22:55 | devn | Damnit Anthony. |
| 22:56 | devn | an "old man" |
| 22:56 | devn | versus being 18 |
| 22:56 | devn | one of them is more likely for someone of my ripe old age |
| 22:56 | tmciver | Raynes: congrats. Too bad you have to wait a few more years to legally drink a beer. |
| 22:56 | Guest33786 | not in New Zealand! |
| 22:56 | Guest33786 | err |
| 22:56 | Raynes | Heh |
| 22:56 | devn | not in 1960 in the US! |
| 22:56 | ivan___ | so need to sort out my nick |
| 22:56 | devn | ivan___: haskell? |
| 22:57 | ivan___ | haskell? |
| 22:57 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.Cons cannot be cast to clojure.lang.IPersistentStack> |
| 22:57 | devn | ivan___: i just know an old nick from #haskell which was ivan |
| 22:57 | devn | is that you? |
| 22:57 | ivan___ | nah ive never been on that |
| 22:57 | devn | k, nvm |
| 22:58 | ivan___ | they are changing the law here to 20 if you want to buy from a bottle shop, but bars and stuff will still be 18 |
| 22:58 | ivan___ | it got changed to 18 6months before i turned 18 :) |
| 22:58 | tmciver | ivan___: that's they way it should be. |
| 22:59 | devn | Kim Dotcom ruined it for everyone, eh ivan___? |
| 22:59 | devn | ;) |
| 22:59 | ivan___ | you can drink in bars at any age if you have your guardian with you anyway.. so 18 should be the age which you can drink in bars |
| 23:00 | ivan___ | devn: heh, yeah especially because we have 3 strikes laws for torrents |
| 23:00 | tmciver | ivan___: torrents? |
| 23:01 | ivan___ | tmciver: if we get 3 dmca notices for using bittorrent over 3 months we can be disconnected and/or fined $10k |
| 23:01 | tmciver | ivan___: whoa! |
| 23:02 | ivan___ | although it costs the companies $25 to issue those notices so they havent been spamming them |
| 23:02 | devn | tmciver: just move that traffic through malaysia and no problem! :) |
| 23:03 | tmciver | cheaper and easier just to buy your movies/music. |
| 23:03 | devn | debatable |
| 23:03 | devn | also defeatist |
| 23:04 | devn | also, demerol |
| 23:05 | alexbaranosky | arohner, looks like I coded up =throws=>... that was ease, nice! |
| 23:05 | alexbaranosky | Just need to give it some error checking, and test the error checking |
| 23:05 | TimMc | I like to listen before I buy. |
| 23:05 | alexbaranosky | arohner, and... ya know, deploy iy |
| 23:06 | tmciver | TimMc: get a radio! :) |
| 23:06 | TimMc | tmciver: They don't play what I like! |
| 23:06 | alexbaranosky | TimMc, thief! |
| 23:06 | alexbaranosky | ;) |
| 23:06 | tmciver | ~guards |
| 23:06 | clojurebot | SEIZE HIM! |
| 23:06 | TimMc | I like it when bands do this: http://www.gaiaconsort.com/lyrics.html |
| 23:07 | TimMc | (Basically, you can download all their music for free.) I've donated like $50 to that group, *after* listening to their stuff. |
| 23:08 | ivan___ | tmciver: yeah i dont pirate generally, i used to when i was a student but then i stopped |
| 23:08 | TimMc | And this is a fantastic idea for ebooks: http://fictioncircus.com/news.php?id=407&mode=one |
| 23:08 | tmciver | Well, that's awfully nice of them. But you don't pay for a sandwich after you've eaten it. Not sure why you'd expect that from other industries. |
| 23:08 | ivan___ | so really the 3strikes laws dont effect me |
| 23:09 | TimMc | tmciver: IP vs. tangible property. They're different. |
| 23:10 | tmciver | As long as artists/authors get paid for their work (on their terms) I'm happy. |
| 23:10 | TimMc | Me too. |
| 23:10 | TimMc | The question is whether any of the existing models are sustainable. |
| 23:10 | ivan___ | tmciver: that being said, im sure piracy would go down here if we had legal alternatives :) - but that arguement still doesnt make it right, legally or morally |
| 23:11 | devn | test.generative is great, but it's just quickcheck, no? |
| 23:11 | tmciver | I don't have a problem with artists giving away their stuff; just as I don't with artists who wish to charge for it. |
| 23:11 | devn | whoops, nvm |
| 23:11 | TimMc | *just* quickcheck, he says... |
| 23:11 | ivan___ | TimMc: it doesnt matter if its not sustainable in the long run. If people STOPPED buying media, those companies would die out |
| 23:11 | devn | TimMc: haha, I was not trying to downplay how cool it was |
| 23:12 | ivan___ | and new ones would take there place |
| 23:12 | ivan___ | that had a different distro model |
| 23:12 | alexbaranosky | devn, from my understanding QuickCheck is much more fully-featured than test.generative |
| 23:12 | TimMc | ivan___: I'm referring to the distro model of groups like Gaia Consort, too. |
| 23:12 | TimMc | Maybe people wouldn't donate enough. |
| 23:12 | clojurebot | Gabh mo leithscéal? |
| 23:12 | devn | alexbaranosky: specifics? |
| 23:12 | tmciver | I don't think a system that relies on donations is sustainable. |
| 23:13 | ivan___ | TimMc: oh i see, it might be sustainable for one group, but if others start doing it.. |
| 23:13 | TimMc | Right, the novelty wears off. |
| 23:13 | _carlos_ | hi! |
| 23:14 | TimMc | Anyway, off to bed. tmciver, I expect to see a fully hinted renaming import+ by the morning. :-P |
| 23:14 | arohner | alexbaranosky: awesome, thanks |
| 23:14 | tmciver | TimMc: OK (he didn't say *which* morning ;) ) |
| 23:15 | tmciver | TimMc: see you in the morning. |
| 23:15 | _carlos_ | if this is a defmacro, why doesn't this expression need the "list" form? -> http://pastebin.com/3u4TCpPz |
| 23:16 | _carlos_ | (defmacro randomly-2 [& exprs] (nth exprs (rand-int (count exprs)))) |
| 23:16 | _carlos_ | I just noticed it was small enough ^^ |
| 23:17 | _carlos_ | I just wonder.. when using "list", this macro definition stops working.. why suddenly such an exception? |
| 23:19 | tmciver | _carlos_: where did this come from? It doesn't appear to do the right thing for me. |
| 23:19 | _carlos_ | (defmacro randomly-2 [& exprs] (list 'nth exprs (list 'rand-int (list 'count exprs)))) <- this doen't work properly |
| 23:19 | _carlos_ | tmciver: just a second |
| 23:19 | _carlos_ | tmciver: oh sorry, I will give you an example |
| 23:19 | tmciver | _carlos_: If I call it, it just returns what I gave it... |
| 23:20 | tmciver | _carlos_: Oops, I was wrong; it does work |
| 23:20 | _carlos_ | tmciver: (randomly-2 (println "spam") (println "foo") (println "bar")) |
| 23:20 | _carlos_ | oh |
| 23:21 | alexbaranosky | devn, as far as I know test.generative doesnt have shrinking |
| 23:21 | devn | alexbaranosky: what is that? |
| 23:21 | alexbaranosky | devn, shrinking is where it attempts to reduce the failure case into the smallest possible case |
| 23:21 | tmciver | _carlos_: I'm not sure why it's a macro; it appears to do it's own body: (nth exprs (rand-int (count exprs))) |
| 23:21 | _carlos_ | tmciver: anyway, do you find it natural to not require "list"? |
| 23:21 | alexbaranosky | and in QuickCheck the shrinking correlates to the particular generator used |
| 23:22 | alexbaranosky | I could be wrong, and test.generative does implement that.... |
| 23:22 | tmciver | _carlos_: I think it's a bad macro example. You'd just write that as a function. |
| 23:23 | _carlos_ | tmciver: it is a macro, because if you want to print inside the body, using a function will eval print when binding at the call, which is unintended |
| 23:23 | _carlos_ | tmciver: println expression is just an example |
| 23:25 | _carlos_ | tmciver: was my explanation clear? |
| 23:26 | _carlos_ | tmciver: it doesn't print all the body, just one randomly selected, in the example of a print expression |
| 23:27 | tmciver | _carlos_: Hmm, interesting. Yes. I'm still learning macros myself. I'm not sure why the three println's above don't evaluate before being passed to the macro. |
| 23:29 | _carlos_ | tmciver: if you (doc xxx) each of the functions inside, it will become clear. actually my doubt is not about the logic. usually macro expressions begin with (list ... in every expression, but this one doesn't need one. I fail to untderstand this |
| 23:30 | muhoo | i cannot get myself motivated to do anything except read clojure books and docs and such |
| 23:30 | _carlos_ | tmciver: oh, I understand your question. because expressions are not evaled when entering a macro. they replace! I think that is one of the main advantages! |
| 23:31 | tmciver | _carlos_: Yes. This macro does not return s-expressions to be eval'd; the body is eval'd right away. I think the only reason it's a macro is to stop the evaluation of the args. |
| 23:32 | tmciver | _carlos_: since it's not return sexp's to be eval'd, it does not need any quoting. |
| 23:34 | _carlos_ | tmciver: I suspected that, but I cannot abstract it. arrrgh I want to kill my brain. 5 minutes. I need to think about it |
| 23:35 | tmciver | _carlos_: Ha! Don't do that. |
| 23:35 | _carlos_ | tmciver: thinking about the problem, not killing the brain |
| 23:45 | muhoo | braaaaaaiiiiin! |
| 23:50 | _phil | is there a way to see if the outer function of some closure is still in progress when the closure gets called? |
| 23:51 | _phil | (except wrapping it with (reset! progress true) ... (reset! progress false)) |