#clojure logs

2011-07-03

07:48Dranikhow to import java.io.File/separator as separator?
07:54babilentechnomancy: ping (Debian packaging)
08:09teromDranik: I think you can't, but you could always (def separator java.io.File/separator)
08:11teromIf you (import 'java.io.File) then you can of course use File/separator
08:24Dranikthanks!
12:07technomancybabilen: bout to head out, but what's up?
12:18avartanianI have a quick newbie question.
12:18avartanianHow the heck do I load the clojure.contrib.math library?
12:19avartanianI'm doing: java -cp clojure.jar;clojure-contrib.jar clojure.main
12:19avartanianAnd then (:require clojure.contrib.math)
12:19avartanianBut
12:19avartanianjava.io.FileNotFoundException: Could not locate clojure/contrib/math__init.class or clojure/contrib/math.clj on classpath: (NO_SOURCE_FILE:4)
12:20gfrlogah ha
12:21gfrlogwelp...I have no idea why (:require clojure.contrib.math) did that -- I would expect you'd have to (require 'clojure.contrib.math). But anyhow, the other thing that looks strange is that you used a semicolon in the -cp arg instead of a colon. Unless that's a windows thing.
12:22avartanianIt might be Windows thing.
12:23avartanianWith the colon I can't even get the REPL.
12:23gfrlogokay. that part is probably right then.
12:24gfrlogso I get the same result you do with (:require clojure.contrib.math). It doesn't surprise me at all that it doesn't work, but the error message itself is quite surprising. Regardless, (require 'clojure.contrib.math) works like I would expect, so try that.
12:24gfrlogthere's a difference between how you use/require/import in a standalone function call versus with a (ns) expression
12:25gfrlogso I imagine that's why you were doing it the other way
12:25gfrlogactually now that I look a little closer my error message is different from yours, and mine I can make sense out of
12:26avartanianuser=> (require 'clojure.contrib.math) java.io.FileNotFoundException: Could not locate clojure/contrib/math__init.class or clojure/contrib/math.clj on classpath: (NO_SOURCE_FILE:0)
12:27gfrlogit is behaving as if the contrib jar is not on your classpath -- you're sure you got the name right and everything?
12:27avartanianDouble checking.
12:27avartanianuser=> (. System (getProperty "java.class.path")) "clojure.jar;clojure-contrib.jar"
12:28avartanianclojure-contrib.jar is right there in the same folder as clojure.jar
12:28gfrlogwhere did you get these jars?
12:28avartanianDownloaded from the Programming Clojure web site.
12:28avartanianIs that my fatal flaw?
12:29avartanianhttps://github.com/stuarthalloway/programming-clojure/tree/master/lib
12:29gfrlogI guess I can try to reproduce then.
12:30avartanianGosh, thank you so much for your help.
12:30avartanianDo people usually rebuild clojure-contrib from source?
12:30gfrlogno problem. If I can't figure this out I'll recommend you try leiningen :)
12:31gfrlogI use leiningen for all my clojure stuff. So I'm almost never calling "java" correctly, or finding jars
12:32gfrlogit has tasks for creating new projects, compiling, launching repls...
12:33gfrloghmm. Requiring works fine for me with those two jars. So I'm not sure what's going on with you :(
12:34gfrlogI know very little about java on windows, so if there's some kind of OS difference I'm not really able to guess what it would be
12:34gfrlogI wouldn't think there should be though
12:36avartanianThis is bizarre.
12:36avartanianUsusally I can rename a jar file
12:36avartanianinto a zip and crack it open
12:36avartanianbut when I try to open clojure-contrib.jar it complains that the file is invalid
12:36gfrlogthat sounds like a good clue :)
12:37gfrlogdoes windows have any hash function utilities that we can compare with?
12:37gfrlogmd5? sha1?
12:37avartanianLemme see.
12:39avartaniandownloading fciv now
12:41avartanian827c0b06655f06cab6f1c9929ebbf9b9 clojure-contrib.jar
12:41avartanianI believe that's the MD5
12:41gfrlog1ee08937e34732b60ab3b3d975ee1399 clojure-contrib.jar
12:41gfrlogfafd2654c66d6299219b56a909326bea clojure.jar
12:41gfrlogcheck your clojure.jar to see if it matches?
12:42avartanianWell I'm on version 1.2 of clojure.
12:42gfrlogif we both got the jars from halloways git repo, then they should match
12:42avartanianOh my clojure.jar is from elsewhere.
12:43avartanianNot the halloway git
12:43avartanianabdf685c42f362dfe0f36e325b8dc724 clojure.jar
12:43avartanianBut it's weird that our MD5s on contrib don't match.
12:43gfrlogah. Could you try using his clojure.jar then? maybe it's some kind of incompatibility...
12:43avartanianyes
12:43avartaniantrying now
12:43gfrlogI don't mean only ever use his jar, but test to see if his two jars work together for you
12:44gfrlogthe Programming Clojure book is the oldest of the clojure books, and while good, it's a bit dated I think.
12:44avartaniane12b163a04a6da02431218c9bb342369 clojure.jar
12:44gfrlogthat's what people say anyhow. I haven't looked at it for a year or two.
12:45gfrlogokay well apparently our md5 programs are different :) that's awesome.
12:45gfrlogbut try running the repl and requiring using those two jars
12:46avartanianWow
12:46avartanianit's not working
12:46avartanianwith just those two jars
12:46avartanianthere is something messed up about these jars
12:47avartanianI can't open clojure.jar either.
12:47avartanianOkay, how do people usually get clojure-contrib?
12:47gfrlogavartanian: when I use leiningen it fetches both jars for me
12:47gfrlogI can unzip clojure.jar just fine
12:48avartanianok
12:48avartaniangfrlog thank you for your help
12:49gfrlogsounds like everything you try is weird :)
12:49gfrlogyou're welcome; sorry about the trouble.
13:16gfrlogIs there a subtle reason that #() cannot be nested, or is it just to prevent certain mistakes?
13:18opqdonutjust to prevent mistakes I guess
13:18gfrlog:/
13:19opqdonuteven if it were allowed it wouldn't be very useful since one couldn't refer to arguments of the outer closure from within the inner one
13:19gfrlogyou don't always need to
13:19opqdonutsure
13:19gfrlog(def inc-my-nums #(map #(+ % 1) %))
13:20opqdonut(def inc-my-nums (partial map (partial + 1)))
13:20opqdonut(or just (partial map inc) ...)
13:20gfrlogyes that particular example can be done better :)
13:20gfrlogbut I just came across this situation
13:20opqdonutbut of course partial isn't always applicable
13:20opqdonutsomething like "rcurry" from common lisp would be a nice addition
13:21gfrlogI wanted a function to transform [{:id 1 :foo "bar} {:id 2 :foo "baz"}] to {1 {:foo "bar"} 2 {:foo "baz"}}
13:21opqdonutthat is, ((rcurry f x y) z) == f z x y
13:21gfrlogwhich I was going to write as #(zipmap (map :id %) (map #(:dissoc % :id) %))
13:22gfrlogbut was forced to make the outer one a (fn [r] ...)
13:22opqdonutwhy not (into {} (map #(vector (% :id) (dissoc % :id))))
13:22opqdonuter, missing the final argument
13:22gfrlogI think zipmap is more natural than into, and either way that'd be the same sort of expression
13:23opqdonut,(let [x [{:id 1 :foo :bar} {:id 3 1 "hello" 2 "hi"}]] (into {} (map #(vector (% :id) (dissoc % :id)) x)))
13:23clojurebot{1 {:foo :bar}, 3 {1 "hello", 2 "hi"}}
13:23gfrlogopqdonut: but I wanted a function, not just the expression itself
13:23opqdonutsure
13:23gfrlogso it'd still be nested
13:23opqdonutI'm just going off on tangents here
13:24gfrlogalways welcome :)
13:24opqdonut(I dislike using zipmap like that, first taking apart something and then pasting it together again)
13:24gfrlogbut you're taking things apart too...and creating a bunch of pairs
13:25opqdonutyeah but I'm processing one element at a time
13:25opqdonutbut whatever, this is a minor thing :)
13:26gfrlogyeah. For this kind of stuff I'd really like an HOF like (defn map-from-fn [ks f] (zipmap ks (map f ks)))
13:26opqdonutI've just seen people use overly complex zipmap invocations
13:26opqdonutyeah I usually define something like that
13:26gfrlogopqdonut: I used to do it your way. Then I discovered zipmap and decided it felt better that way.
13:26opqdonut:)
13:27gfrlogI think for the same reason I like (for) more than (map) when I can get away with it
13:27gfrlogreabability maybe
13:27gfrlogread
13:27gfrlogreadadility
13:27gfrlogreapapility
15:51__name__Haha, classic: http://img264.imageshack.us/img264/1397/lispnd7.png
15:51jaoSomelauw, as you surely know, there's also (fn [_] nil)
15:52SomelauwYes, but what is the idiomatic one?
15:53jaoi prefer constantly. i don't know if i'm idiomatic, though :)
15:55terom(assoc-in matrix [2 3] nil)
15:55teromIf the nil is really the thing you want...
16:07amalloyyes, assoc-in for sure. but, don't talk about vectors and call them arrays; for arrays you'd use aset
16:08amalloySomelauw: and for atoms there's reset!, but it's fairly rare that you should actually set an atom without regard to its previous value
16:15Somelauwoh thanks, assoc-in is what I should have used.
16:19SomelauwOkay, I finally found a use for ->. assoc-in only takes 3 parameters.
16:20amalloySomelauw: bet you a dollar there's a better way to do it than ->
16:22kephalechouser: do you work on Gentoo?
16:23SomelauwA better way? My code looks pretty beautiful already, I think.
16:25amalloySomelauw: well, you haven't yet said how you're doing it. just that assoc-in takes three params
16:25amalloyso i can't really prove something's better
16:27Somelauwamalloy: http://pastebin.com/jr6ZWVkL
16:32amalloySomelauw: well, fair enough. a matter of taste, but consider https://gist.github.com/1062579
16:37SomelauwNot bad, but I prefer mine because of readability.
16:39SomelauwAlso I switch the oldx and oldy, so they are not completely the same.
16:40amalloyoh, bizarre. why are you storing the board in row-major order and taking positiong in column-major?
16:41SomelauwWell for chess you write e.g. e1 so the horizontal thing comes first.
16:42SomelauwBut when defining my var called initial-chess-board, it is easier to define it row after after.
16:42amalloySomelauw: i'd transpose the initial-board once at definition time, rather than every time you use it
16:42SomelauwBecause I have functions like (king-row player) and (pawn-row player)
16:43amalloyhm
16:43AWizzArdI have a question for the Java/OOP experts here. Clojures proxies can not call overwrite protected methods. Clojures defrecords and deftypes can work with protocols and interfaces. So, in general Clojure heavily encourages Java APIs to do as much as possible with interfaces, instead of inheritance and methods in classes. My question is: why?
16:44AWizzArdAn example: In Java I define a class A with the methods m1 to m9. Now someone can create a proxy instance 'p' of my class and provide an implementation for m1. For the other 8 methods no implementation is given. But I am still able to call .m2 to .m9 on p.
16:44jsnikerisJust downloaded lein, and I'm getting a no class def found error: http://pastebin.com/EChCqUE8. What am I doing wrong?
16:45AWizzArdIf I reify an interface, then where do the default implementations m2-m9 come from?
16:45AWizzArdMaybe amalloy and dnolen know about it? :)
16:46amalloyAWizzArd: interfaces don't get default impls
16:46AWizzArdexactly
16:46AWizzArdSo why does Rich encourage interfaces anyway?
16:46dnolenAWizzArd: inheritance is not worth the trouble, http://www2.parc.com/csl/groups/sda/projects/oi/towards-talk/transcript.html
16:46AWizzArdIt would require a totally untypical Java programming style to create APIs that are nicely usable from Clojure.
16:47dnolenAWizzArd: that's why detype and defrecord and protocols are not about interop ... at all
16:47amalloyAWizzArd: a lot of people encourage programming to interfaces in java as well
16:47AWizzArddnolen: is the "that's why" referring to your link?
16:48dnolenAWizzArd: yup
16:48AWizzArdamalloy: yes, and I don’t argue against it. I just would like to 1) understand why (hopefully dnolens link will help) and 2) have a way that I can suggest to Java guys, what design pattern they can use to end up with code that is nicely usable from Java *and* Clojure.
16:49dnolenAWizzArd: Clojure and Java are philosophical odds, thus we have real interop features ... gen-class & proxy.
16:49AWizzArdRich must have had good reasons to do it the way he did, and I am not criticizing it. But currently I am writing some libs against some Java libs and am confronted from time to time with an API where they want to create an anon subclass and overwrite some methods.
16:49amalloyAWizzArd: http://pragmaticjava.blogspot.com/2008/08/program-to-interface-not-implementation.html is a random sample i found while searching for "java program to interface"
16:50jsnikerisanswering my last question: /usr/bin/java was pointing to some other, non-sun java
16:51amalloypart of the problem is that it's so *easy* in java to use concrete inheritance in ways that create maintenance nightmares later
16:51AWizzArddnolen: proxy is great, but it won't let me overwrite protected methods. When I ask the implementors of Java libs they tell me it would be unclean to make their protected methods public.
16:51AWizzArdSo that would mean I have to use AOT via gen-class, which I try to avoid.
16:52dnolenAWizzArd: Clojure does it best to work with Java's messes w/o adopting bad ideas.
16:53AWizzArddnolen: after I understand why the clojure way is better I still need some concrete suggestions for the Java guys. When I file Jira issues and complain this is not nice, but when I offer them some solutions it would be much more probable they will implement that, and thus make their lib much more usable from Clojure.
16:55dnolenAWizzArd: I'm beginning to think such things are worth the effort. Inheritance sucks, but if that's the best abstraction you have, you're going to use it because it is powerful and it's better than nothing. Trying to convince people otherwise won't help because they don't have better tools. Avoiding inheritance in Java is a big pain in the arse.
16:55dnolennot worth the effort.
16:56AWizzArdMaybe that is what they will decide. In that case I will have to use gen-class or write some Java wrappers into which I can inject my Clojure fns.
16:56AWizzArdIn the end interfaces only serve the purpose to pass around function objects.
16:56AWizzArdNot closures even, but code.
16:57AWizzArdIt is just the model for default implementations that brings in the problems. One example that I saw today: http://fxexperience.com/2011/07/worker-threading-in-javafx-2-0/
16:57AWizzArdThere is the headline "Service" about in the middle of the page, and it provides a code example where they implement a protected method. I can not do this with a proxy.
17:00dnolenIf Java was Objective-C + final, everyone would be a lot less brainwashed.
17:01AWizzArdhmm
17:01AWizzArdDidn't Apple implement its iTunes server software in Java?
17:01dnolenJava is basically a crappy Objective-C IMO.
17:02amalloyAWizzArd: interfaces can be closures
17:02amalloyignoring java's atrocious syntax for it
17:02amalloyor rather, implementations of interfaces can be closures
17:03AWizzArdamalloy: ah yes okay, with some final keywords in Java I think, something like that.
17:33pcavsWhat's the current stable release of clojure and contrib?
17:33pcavs1.2.1 for core, and 1.2.0 for contrib?
17:33amalloyyes
17:34pcavsthanks
18:26nathanmarztechnomancy: hey, i noticed you changed how "native-path" works in leiningen
18:27nathanmarztechnomancy: i was using that for zeromq/jzmq, i was wondering what your suggestion is for moving to the new native deps model in leiningen
20:11parasebaIn clojure.java.jdbc there is a transaction function, which is supposed to rollback if the passed body throws an exception, but it only does that in case of an Exception, not any Throwable. What's the rationale behind this?
20:11parasebaI'd want my transaction rolledback in case of any errors
20:12parasebaseancorfield: maybe you can explain me this?
20:53amalloyparaseba: catching Errors is generally a bad practice. i'm not saying it's wrong all the time, but Errors are often unrecoverable anyway
20:53amalloyeg, "You ran out of heap space! I can't even allocate memory to throw an exception!"
20:54parasebabut, even in the worst conditions, shouldn't we try to rollback the transaction? is not better that commiting in this unexpected error condition?
20:55parasebawe can then rethrow the Throwable, after trying to rollback
20:55lucianparaseba: i don't think the db will commit if it gives you an error
20:55lucianand as amalloy, errors like OOM are best solved with exit()
20:55parasebalucian: it will ... jdbc is catching Exception and rolling back in that case .... but it commits in a finally
20:56parasebaso, if you have an Error thrown, it will commit
20:56parasebaI guess that's more surprising than a rollback
20:57parasebathe logic is .... (try do-your-thing (catch Exception roll-back) (finally commit))
20:57lucianparaseba: well, then maybe you don't want to commit in finally?
20:57parasebaI don't, not if I got an Error
20:58amalloylucian: i think he's upset that a library he's using is committing on error
20:59parasebaamalloy: I can solve it easily by wrapping my operations in a catch Throwable -> rollback -> rethrow, but I think it's not the right behavior for the library
20:59parasebaI would expect a commit only if the block ended without any kind of exceptions or errors. don't you agree ?
21:01amalloyparaseba: meh. all kinds of weird stuff can happen if an Error occurs; i wouldn't be entirely certain that an attempt to "recover" makes things worse due to some weird program state caused by the Error. i mean, my completely-unresearched opinion is that catching Throwable would be better, but you can't really rely for your program's correctness on anything that happens after an Error
21:02parasebabut, we are forcing a commit after an Error
21:04parasebathe usual logic should be .... (do do-your-thing (commit)) if do-your-thing throws anything ... no commit is done. Puting a commit in a finally enforces the commit, even after Errors
21:06amalloyyeah, i think i agree
21:08parasebaamalloy: ok, I'll report an issue, thanks
21:18jsnikerisAnyone familiar with enlive/compojure? I'm trying to find a way to have my template sources (HTML) look like an example page when opened directly through my file-system. And then when my app serves them, they will of course be customized. Does that make any sense?
21:20jsnikerisThe idea being that a designer could create the templates w/out actually having to run the app, and then they could be simply dropped in my resources directory unmodified.
21:22NikelandjeloI have test web application with ring. It contains index.html file. How can I serve this static file, if I'm going to create war file and deploy it?
21:23ihodesNikelandjelo: wrap-file middleware
21:23ihodesjsnikeris: not quite sure what you're asking
21:24ihodesjsnikeris: what woud need to change each time? you should be able to open a plain HTML file via your fs...?
21:24jsnikerisright, but the images, stylesheets, etc won't show up
21:25ihodesjsnikeris: ah that's what you mean. yeah that's a pain. you can use relative paths to your FS when you're hard-coding them, and then have envlive replace them with relative paths for your web-app. make sense/
21:25ihodes?
21:26jsnikerisihodes: I'm glad you understood that, because I had a hard time figuring out how to explain the problem
21:27ihodesjsnikeris: haha, well i think you got the point across. did i? does that make sense?
21:27jsnikerisihodes: yes I understand. it looks like I can just tell enlive to modify every "src" attribute I see, and remove the initial relative path
21:28ihodesjsnikeris: that should work, for sure
21:28jsnikerisI tried defining a route: (route/resources "../public/")
21:28jsnikerisbut that didn't seem to work
21:29jsnikeris <img src="../public/images/plus_icon.png" alt="Plus button"/>
21:29ihodesi'm not familiar with compojure, i've used moustache some though. it seems wrong to use crgrand's lib for one thing but not th=e other ;) (he did moustache & enlive)
21:30jsnikerishmm, I haven't really checked out moustache
21:30jsnikerisgood experiences with it?
21:31ihodesjsnikeris: absolutely. there's a nice overview of the whole stack by brehaut; have you seen it?
21:31ihodesjsnikeris: http://brehaut.net/blog/2011/ring_introduction
21:34jsnikerisihodes: have not. thank you
21:34ihodesjsnikeris: that should get you started. similarly, lauj wrote a ncie overview of the stack a while ago. it's has some more example code than brehaut's, but they're both definitely worth a look.
21:35ihodesjsnikeris: http://bestinclass.dk/index.clj/2011/01/building-a-social-media-site.html
21:38jsnikerisihodes: great, thanks for the help.
21:38ihodesjsnikeris: no problem at all; enjoy! it's a ton of fun to write, and once you get the hang of it it moves very quickly.
22:04amalloyhiredman: http://groups.google.com/group/clojure/browse_frm/thread/1971db3689f631ef sounds like exactly the kind of post you were talking about the other day. someone assign him a contrib library
22:13NikelandjeloI have war file, containing "WEB-INF" dir (with all code) and "static" dir" containing "index.html" file. Ring handler has middleware "wrap-file" with argument "static". When I try to deploy this war on jetty and load page, it throws "java.lang.Exception: Directory does not exist: static". How can I fix it?
22:52xiaolongxiaHello, I have a young friend who I am teaching about programming/computers for the first time. I am setting him up an Ubuntu workstation and I am trying to decide on languages. I love the SICP based courses like this one: http://www.youtube.com/watch?v=GAHA0nJv8EA&amp;playnext=1&amp;list=PL9EE9B6729909489D
22:52xiaolongxiabut I'd rather teach him clojure right from the start
22:53xiaolongxiadoes anybody have a recommendation on material for teaching somebody clojure as a very first programming language?
23:00amalloyxiaolongxia: i know there have been efforts to port SICP to clojure
23:02ihodesxiaolongxia: there probably isn't a great way to do that without considerable oversight. i'd recommend sticking with racket/scheme, honestly, and i think your friend wouldn't have much trouble transferring those ideas to clojure once s/he got to that point
23:03Scriptorxiaolongxia: at what level is your friend mathematically? It's often useful to tie ideas from it to programming
23:04lucianxiaolongxia: even if your friend were to keep using racket, it would be little loss. it's also a very nice language :)
23:13pdkscheme is good for not really overwhelming a new coder
23:13pdkperhaps aside from when you try to learn continuations
23:13pdkreally effective clojure coding is probably best learned by already having some background in lisp and java
23:14pdkplus you're learning new stuff like concurrency constructs, lazy evaluation, immutability, explicit TCO, java interop considerations etc right away
23:22xiaolongxiaScriptor: sorry for the delay in response. my friend graduated high school an average level mathematically and has not taken any college level mathematics
23:23Scriptorxiaolongxia: that's good, the functional style may seem more natural to him
23:24ScriptorI used Haskell as pseudocode while trying to teach my friend to to recursion in Python
23:24Scriptornever thought I'd see thath happen
23:25xiaolongxiathe idea here, is to just get his feet wet and see if he has an interest. the only thing i'm worried about .. is with clojure at least i could show him practical applications quickly
23:25xiaolongxialike deploying to GAE using compojure+enlive to write a webapp
23:26lucianxiaolongxia: if your friend has little to no programming experience, he might prefer Python fist, instead
23:27xiaolongxialucian: i'm really of the opinion that clojure will be a viable career option in a couple years, in the way that ruby/python are now. I'm not sure if I want to start them thinking in python/ruby when they could learn first in LISP
23:28lucianxiaolongxia: as you wish. it is however less likely that a "layman" will hate Python than a Lisp
23:28lucianI'm saying this as a Python developer that really likes several lisps
23:29Scriptorlucian: I'd think experienced imperative programmers are more likley to hate lisps
23:29xiaolongxiai generally agree with Scriptor
23:29amalloyhugod, technomancy: either of you give me a hand getting marmalade installed? i have package.el, but the add-to-list expression at http://marmalade-repo.org/ is barfing
23:29Scriptorpython just seems intuitive once you're used to it, but it's not all that much better when you have no experience
23:30xiaolongxiaalso, i just feel like 'from scratch' LISP is a lot easier to grasp than python/ruby/et al
23:30lucianScriptor: perhaps to your first assertion. not sure about the second
23:30luciananyway, he's your friend xiaolongxia :)
23:30technomancyamalloy: http://code.google.com/p/marmalade/issues/detail?id=20
23:30xiaolongxiathanks for the input guys
23:32amalloytechnomancy: do i have to have emacs 24? (require 'package) and (package-initialize) both succeed fine (and have been in my .emacs for ages), but i still can't add the marmalade repo
23:32technomancyamalloy: you can use it with http://bit.ly/pkg-el23 but not with the one from tromey.com
23:33technomancyI have been bugging tromey for like six months to update the version of package.el on his site; no luck. =(
23:36amalloyman, i have all kinds of weird crap from when i installed emacs and didn't know how it, or clojure, worked
23:37amalloytechnomancy: can i just replace .emacs.d/elpa/package.el, or do i have to do something more exciting?
23:37amalloyi'm afraid to touch this mess
23:37technomancyamalloy: that should be fine
23:38technomancyyou should check out justinlilly's Seajure hackfest scripts for a "minimum viable clojure emacs" setup if you want to sort things out and start from scratch
23:43amalloytechnomancy: link? i seem to have messed things up anyway, may as well try a clean start
23:45technomancyhttps://github.com/Seajure/emacs-clojure-vagrant
23:54alandiperttechnomancy: that's awesome
23:57technomancyalandipert: yeah, no more excuses!
23:58hugodshould be able to do one of those with pallet very shortly
23:58technomancyhugod: that would be pretty cool
23:59technomancydoes jclouds hook into the vbox API?