2011-01-24
| 00:14 | Raynes | mefesto: pong |
| 00:25 | mefesto | hey |
| 00:25 | mefesto | i have some basics of an interactive tutorial in there. |
| 00:26 | mefesto | i can push to my fork or is there some other preferred method? |
| 01:04 | Raynes | mefesto: Damn it. |
| 01:05 | Raynes | mefesto: You ping me while I'm gone, I ping you while your gone, rinse, repeat. |
| 01:05 | mefesto | Raynes: still on? |
| 01:06 | Raynes | Yessir. |
| 01:06 | Raynes | You can push to your fork and then issue a pull request when you think it's ready to go into tryclj. If you just want me to take a look, I'll check it out in your fork. |
| 01:07 | mefesto | ok one sec. |
| 01:11 | mefesto | ok should be there: http://github.com/mefesto/tryclojure |
| 01:11 | mefesto | i changed the handler so that it would return the evaluation results as a json object. |
| 01:12 | mefesto | this way from the javascript side the tutorial can compare the expression and results then determine if the user should move on to the next page |
| 01:15 | Raynes | mefesto: Looks like you put quite a bit of work into this. :o |
| 01:15 | brehaut | ive forgotten how to use fnil again. |
| 01:15 | mefesto | Raynes: had some spare time today :) |
| 01:19 | Raynes | mefesto: This looks really cool. |
| 01:20 | mefesto | along the lines of what you wanted? |
| 01:20 | mefesto | just as an example you can type 'back' if you got a page or two into the tutorial |
| 01:20 | Raynes | mefesto: Precisely. It would be nice to be able to see a list of the 'lessons' and be able to switch between them somehow. Other than that, this looks great. |
| 01:20 | Raynes | Oh. |
| 01:21 | Raynes | Sorry, I judged the Javascript merely on length. Didn't actually pay much attention to it. ;) |
| 01:22 | mefesto | heh. I _think_ the lesson setup (similar to tryhaskell's) should work. But I only got that 3 page thing going so far. |
| 01:22 | Raynes | mefesto: Could you make examples clickable like the old tutorial examples were? |
| 01:23 | Raynes | One problem with jquery-console is that it doesn't allow pasting. Apparently, purposely, thus not likely to change any time soon. |
| 01:23 | Raynes | Other than that, this looks pretty solid. |
| 01:23 | Raynes | I like it. |
| 01:23 | Raynes | This is the one thing that tryclojure is missing. |
| 01:24 | mefesto | ok that shouldn't be too hard. so clicking on a code block will add that to the console and eval it? |
| 01:24 | Raynes | Just add it, not eval it. |
| 01:24 | Raynes | mefesto: Also, /j #sexpbot |
| 02:03 | brehaut | i wrote a special form to do a more general if-let with better error handling and its cleaned up the ugliest piece of code in my xml-rpc lib |
| 02:03 | brehaut | https://github.com/brehaut/necessary-evil/commit/a225d2026c3e5b6e223597ab796a85768a6948a3#L0R23 |
| 02:06 | amalloy | brehaut: just got caught up with the #clojure backlog. still care about fnil? |
| 02:09 | amalloy | if so, a semi-canonical example: ##(reduce #(update-in %1 (fnil inc 0) [%2]) {:a 1 :b 4} [:b :c]) |
| 02:09 | sexpbot | java.lang.UnsupportedOperationException: nth not supported on this type: core$fnil$fn__5593 |
| 02:11 | amalloy | &(reduce #(update-in %1 [%2] (fnil inc 0)) {:a 1 :b 4} [:b :c]) |
| 02:11 | sexpbot | ⟹ {:c 1, :a 1, :b 5} |
| 02:13 | brehaut | amalloy: sorted my self out, but cheers |
| 02:13 | brehaut | clojuredocs saved me :) |
| 02:16 | brehaut | amalloy: i spent a while trying to work out how to use it in an -> but in the end realised that a) i was using it wrong and b) 'or' worked better |
| 02:16 | amalloy | heh |
| 02:23 | brehaut | where is -?> defined? |
| 02:25 | amalloy | brehaut: clojure.contrib.core |
| 02:25 | brehaut | amalloy: cheers |
| 02:38 | brehaut | amalloy: did anyone submit your macro writing macros page to hn? |
| 02:38 | amalloy | brehaut: no idea |
| 02:38 | clojurebot | Cool story bro. |
| 02:38 | amalloy | i'm barely informed enough about social-y sites to know whether i've made it to twitter :P |
| 02:39 | brehaut | http://www.backtype.com/page/hubpages.com%2Fhub%2FClojure-macro-writing-macros |
| 02:39 | brehaut | two tweets and no HN :) |
| 02:40 | amalloy | brehaut: that |
| 02:40 | amalloy | s handy |
| 02:40 | brehaut | yeah |
| 02:40 | brehaut | and clojure powered :) |
| 02:41 | amalloy | hubpages has something similar built in: we track referrer domains for you so i can see if twitter is getting me much traffic, but directly seeing if it's been mentioned at all is neat |
| 02:42 | brehaut | thats pretty cool |
| 02:42 | amalloy | brehaut: wow, and i'm actually getting google traffic, apparently. what on earth are people searching for |
| 02:42 | brehaut | i used to use google analytics on my site but it doesnt really give me much useful info |
| 02:42 | brehaut | people search for the strangest things |
| 02:43 | amalloy | yeah, if i get interested enough i'll hijack the corporate GA account to see how my hubs are doing :P |
| 02:44 | amalloy | brehaut: ah, apparently it's my first hub getting more "reputable" over time |
| 02:44 | brehaut | curious. is that a feature of hubpages? |
| 02:45 | amalloy | brehaut: an artifact of google's pageranking, i think |
| 02:45 | brehaut | oh right |
| 02:54 | xkb | hi |
| 02:55 | xkb | Is it possible to mock out a static Java method call using clojure.contrib.mock? |
| 02:55 | xkb | trying it gives me lookup errors |
| 02:55 | xkb | "unable to resolve var" |
| 03:00 | amalloy | xkb: i don't think so. i don't use mock, but i think it's basically changing the var root, which won't work if there's no var |
| 03:01 | amalloy | you can instead write a pure-clojure function that calls out to that static method, and mock/stub the function |
| 03:03 | xkb | ah.. I thought so. The error was indeed a lookup to a var |
| 03:03 | xkb | no binding possible without one |
| 03:03 | xkb | amalloy: thanks |
| 03:12 | amalloy | blugh, night all. why am i even still awake |
| 03:12 | brehaut | night |
| 03:48 | Licenser | morning |
| 03:50 | brehaut | evening +1300 |
| 03:52 | LauJensen | clojurebot: UGT? |
| 03:52 | clojurebot | ugt is Universal Greeting Time: http://www.total-knowledge.com/~ilya/mips/ugt.html |
| 03:52 | brehaut | thats awesome |
| 03:53 | brehaut | i particularly like the note at the end |
| 03:55 | Licenser | UGT is hard to explain |
| 03:55 | LauJensen | Licenser: You're the only guy we've ever had problems explaining it to :) |
| 03:55 | brehaut | Licenser: clearly you understand it well enough to use it correctly |
| 03:55 | Licenser | LauJensen: that is because i'm special! |
| 03:56 | LauJensen | Licenser: Thats right, like your momma always told you :) |
| 03:56 | Licenser | exactly and my momma is the best! |
| 03:57 | Licenser | LauJensen: btw, awesome article on the clojure redit clone |
| 03:57 | LauJensen | Licenser: Thanks! |
| 03:58 | Licenser | So you could put in a warning that putting a reload hook on the core file is a bad idea :P |
| 03:59 | Licenser | Then again I'm propably the only person having trouble with that |
| 03:59 | LauJensen | haha... Yea I hope so :) |
| 04:00 | sandGorgon | LauJensen, same sentiment here: awesome articlt - please keep on adding to it (like Sandbar support). I think its now the go-to place for web app development with clojure |
| 04:00 | LauJensen | sandGorgon: I'll never use Sandbar, but I'd be happy to extend it further |
| 04:00 | sandGorgon | LauJensen, oh.. any reason why ? or is there an alternative ? |
| 04:01 | LauJensen | sandGorgon: Firstly, sandbar seemed custom made for Compojure and secondly I just wasnt happy with the design when I went over it. I think I might release my own 'dunebar' which is more in tune with Moustache |
| 04:02 | brehaut | there needs to be a library called Dali that works with moustache |
| 04:02 | sandGorgon | LauJensen, awesome. I think auth was one of the critiques about your article . |
| 04:02 | LauJensen | sandGorgon: Why the hate though? I showed how to build your own security middleware, thats much more valuable than seeing me pull in sandbar |
| 04:04 | sandGorgon | LauJensen, not so much as hate - I think people (which includes me) are wary of anything that touches security. I mean given the choice between writing raw SQL and rolling my own auth, I would take SQL anyday. I know that I am naive enough that I want to seek out and build upon other people's efforts. |
| 04:05 | LauJensen | In most cases I agree. In this case, I think I should just hurry up and write Candybar |
| 04:06 | sandGorgon | dunebar or candybar - choices, choices .. ) |
| 04:07 | LauJensen | Or Twinky |
| 04:09 | Licenser | hmm is there a way to tell ring to allow path's like /edit/42 where 42 is a ID? |
| 04:10 | brehaut | Licenser: thats higher level than ring is concerned with isnt it?? |
| 04:11 | Licenser | not sure |
| 04:11 | brehaut | Licenser: im only a noob, but that sounds like routing (ie moustache or compojure) to me |
| 04:11 | Licenser | I'd not have a problem to pick the stuff apart myself, but I didn't even managed to make a edit/* thingy |
| 04:12 | LauJensen | Licenser: I think I demo that in the post you just mentioned actually |
| 04:12 | LauJensen | But its a quality of Moustache or Compojure, not Ring |
| 04:13 | Licenser | hmm might have missed it |
| 04:14 | Licenser | ah yes true :) missed that grrrrr evil me |
| 04:14 | LauJensen | (app ["user" id] (delegate do-user id)) ... (defn do-user [req id] ..) |
| 04:14 | brehaut | Licenser: ring is really simple from a code consumer point of view; it worries about different http servers and converting an incoming request into a map, calling your handler with that map as an argument, and taking the map you return and converting it back into the stuff that particular server wants for a response |
| 04:15 | Licenser | *nods* |
| 04:15 | brehaut | Licenser: your handler function is a black box to ring |
| 04:16 | brehaut | moustache is basicly a (excuse the term) DSL for bundling a bunch of handlers together as a single handler |
| 04:16 | brehaut | with routing and middleware rules |
| 04:17 | brehaut | i cant speak for what compojure does these days because i havent used it since 0.3 |
| 04:19 | brehaut | bah. apparently i have a brain disease. im wondering if moustache is a monad |
| 04:22 | brehaut | i think it is |
| 04:24 | brehaut | thats a sure sign i need to go to bed |
| 04:24 | brehaut | gnite |
| 04:41 | LauJensen | Since nobody really knows what a monad is, I guess it could be a monad :) |
| 04:44 | Licenser | for nobody knowing what it is there is many talks about monads |
| 04:44 | ejackson | morning all :) |
| 04:45 | Licenser | morning ejackson |
| 04:49 | mduerksen | greetings. monads were discussed on HN not long ago (i haven't invested the time to digest it): http://news.ycombinator.com/item?id=1997341 |
| 05:14 | ejackson | I just put up a blog post with the word 'monad' in it :) Feeling very manly. |
| 05:31 | LauJensen | :( |
| 05:34 | ejackson | Don't be sad Lau, its Monday. |
| 05:35 | LauJensen | Good job on the post though |
| 05:37 | ejackson | thanks, you were right that i'd been a bit lazy on that front |
| 05:39 | LauJensen | (doall ejackson) |
| 05:39 | ejackson | well, I spent last week trying to snowboard on ice, so, not really. |
| 05:43 | TobiasRaeder | morning :) |
| 05:44 | TobiasRaeder | anybody using a tweaked zenburn around here? |
| 05:47 | LauJensen | TobiasRaeder: I was, then I inevitably went back to charcoal-black |
| 05:49 | TobiasRaeder | @LauJensen interesting, never heard of it. were the tweaks in your blog? i thought so wasn't able to find them with a quick google tho |
| 05:51 | LauJensen | No I never commented on zenburn, didnt use it long, didnt like it too much |
| 05:51 | LauJensen | ;(setq zenburn-bg "#1f1f1f") |
| 05:51 | LauJensen | That was the tweak |
| 05:53 | LauJensen | TobiasRaeder: ^ |
| 05:53 | TobiasRaeder | @LauJensen ah, thanks |
| 05:54 | TobiasRaeder | @LauJensen but ill checkout charcoal-black i guess |
| 05:54 | LauJensen | Its in the standard color-theme library, M-x color-theme-charcoal-black |
| 05:55 | LauJensen | TobiasRaeder: http://bestinclass.dk/index.clj/2009/09/layout-emacs-etc.html |
| 05:58 | TobiasRaeder | ill give it a try, thanks :) |
| 06:00 | raek | in addition, this is awesome: http://alexpogosyan.com/color-theme-creator/ |
| 06:06 | LauJensen | wow, that is pretty epic |
| 07:19 | TobiasRaeder | yeah, that is really awesome, thanks |
| 07:19 | TobiasRaeder | and lau, the charcoal doesn't look bad at all :D |
| 08:35 | timvisher | hi all |
| 08:36 | timvisher | is anyone using elein? |
| 08:37 | TobiasRaeder | never actually heard of it |
| 08:37 | TobiasRaeder | what exactly is it? |
| 08:38 | timvisher | it's a set of emacs wrappers around lein so that you can interact with lein via M-x commands |
| 08:38 | timvisher | https://github.com/remvee/elein |
| 08:38 | TobiasRaeder | ah nice |
| 08:39 | timvisher | it does indeed look quite nice |
| 08:39 | TobiasRaeder | i just tried durendal a bit which seems to do the same on first glance |
| 08:39 | timvisher | although i'm not quite clear as to what advantages it offers me over just executing lein commands via M-! |
| 08:40 | TobiasRaeder | autocompletion i guess? |
| 08:40 | TobiasRaeder | apart from that im not sure either |
| 08:40 | timvisher | problem is that I'm having trouble getting it to work on my mac |
| 08:40 | timvisher | i was hoping for a guru to magically appar in the ether. ;) |
| 08:41 | TobiasRaeder | hehe what problems exactly? |
| 08:41 | timvisher | I can't get the swank server to run |
| 08:41 | TobiasRaeder | ill give it a try real quick |
| 08:41 | TobiasRaeder | not using os x tho |
| 08:41 | timvisher | in the source I read that 'elein-standalone-swank-command "~/.lein/bin/swank-clojure"' is how it tries to execute swank, maybe |
| 08:42 | timvisher | but I'm not sure how to set that up |
| 08:42 | timvisher | I'm fairly new to both lein and elein so I don't really grok it's structure yet |
| 08:42 | TobiasRaeder | interesting, i dont even have a bin folder in ~/.lein |
| 08:43 | timvisher | exactly |
| 08:43 | timvisher | I don't either |
| 08:43 | TobiasRaeder | so it's probably something custom the author wrote (would be my guess atleast) |
| 08:43 | timvisher | and the post I was reading about getting it set up (http://blog.gaz-jones.com/post/2486737162/setting-up-clojure-development-on-osx-using-emacs-and) doesn't mention anything about creating it. |
| 08:44 | timvisher | I'm assuming the same |
| 08:45 | timvisher | aha |
| 08:45 | TobiasRaeder | mhm? |
| 08:46 | timvisher | interestingly, I had forgotten to include swank-clojure in the project.el file |
| 08:46 | TobiasRaeder | oh you need a project.el for elein aswell? |
| 08:46 | TobiasRaeder | mhm |
| 08:46 | timvisher | doing that and then running lein deps (via M-!) and then running elein-swank leaves me with 'error in process filter: Symbol's function definition is void: slime-set-inferior-process' |
| 08:47 | TobiasRaeder | do you have slime and slime-repl setup? |
| 08:47 | timvisher | yeah |
| 08:47 | timvisher | that all works fine |
| 08:47 | timvisher | at least as far as I've been able to tell |
| 08:47 | timvisher | I was mostly doing dev with inferior lisp until about a week ago |
| 08:47 | TobiasRaeder | well if you can do lein swank in a shell and slime-connect it should be alright ;) |
| 08:48 | timvisher | that's true. I'm just intrigued by elein and I'm trying to follow this tutorial just for fun (http://blog.gaz-jones.com/post/2501842155/interactive-clojure-development-in-emacs-with-leiningen) |
| 08:49 | TobiasRaeder | yeah |
| 08:49 | TobiasRaeder | well what seems a bit 'weird' to me right now is that you apparently have to create and maintain a project.el aswell? |
| 08:49 | TobiasRaeder | which seems a bit unneeded atleast for me right now |
| 08:50 | timvisher | the idea at the moment seems to be that once you're in a lein project, created via `lein new` I suppose, you can use elein to transparently communicate with it. |
| 08:50 | timvisher | seems to be being more trouble than it's worth at this point. |
| 08:50 | TobiasRaeder | yeah |
| 08:50 | TobiasRaeder | right now it does |
| 08:50 | TobiasRaeder | you might wanna try durendal tho, no support yet for most lein commands but starting a swank server, connecting to it etc works just fine |
| 08:51 | TobiasRaeder | and the deps etc should be fairly easy to implement yourself really |
| 08:51 | TobiasRaeder | and it doesn't require you to keep track of project.el etc |
| 08:51 | TobiasRaeder | https://github.com/technomancy/durendal/ if you care |
| 08:51 | timvisher | i've actually installed that via elpa |
| 08:51 | timvisher | haven't messed with it yet thouugh |
| 08:52 | timvisher | the only reason I'm checking out elein is because of the tutorial |
| 08:52 | TobiasRaeder | ah okay :) |
| 08:52 | timvisher | I'm used to switching to the Terminal to interact with my build tool so the rest would just be icing |
| 08:52 | TobiasRaeder | whats really nice (atleast i like it) is the durendal-sort-ns |
| 08:52 | timvisher | annoying icing at this point. ;) |
| 08:52 | TobiasRaeder | ;) |
| 08:53 | timvisher | that does read like a nice addition |
| 08:53 | timvisher | well we shall continue to explore... ^_^ |
| 08:56 | TobiasRaeder | :D |
| 08:57 | TobiasRaeder | if you wanna have something like elein-deps https://gist.github.com/793238 |
| 08:57 | TobiasRaeder | it's really badly hacked together but it works for now ;) |
| 09:14 | AWizzArd | http://www.skuro.tk/2011/01/24/performance-boost-in-clojure-1-3/ |
| 09:16 | tonyl | thanks for the share, I'll take a look |
| 09:20 | LauJensen | tonyl: It was like 2 minutes ago. AWizzArd posted on in here, old chap |
| 09:23 | tonyl | LauJensen: hehe yes, thanks for the logic, I guess I meant before AWizzArd posting it. Brings back memories |
| 09:26 | LauJensen | I know - Was making a joke :( |
| 09:29 | tonyl | I am poor at understanding jokes by text :S something I haven't get used to |
| 09:40 | LauJensen | tonyl: Its a common thing. Usually when I make a joke in one of my blogposts, HackerNews is consumed by rage for about 12 hours at a time because they dont see the humor in it :) |
| 09:40 | LauJensen | I cant be annoyed though, since its just more hits for me :) |
| 09:41 | fliebel | LauJensen: I missed the first bit. You said something controversial again? :) |
| 09:42 | LauJensen | fliebel: I just said that its a common thing that people dont get my jokes |
| 09:42 | fliebel | Oh, right. |
| 09:49 | jweiss_ | looking for a little advice writing an error handling lib similar to clojure.contrib.condition - i want to avoid any unnecessary overhead of setting up error handling when no error is actually thrown. would it be more efficient to just store the handler function *forms* at the start, and only evaluate them if an error occurs? |
| 09:50 | jweiss_ | i somehow envision getting bitten by that |
| 09:50 | Chousuke | that sounds complicated |
| 09:51 | jweiss_ | you think the performance boost might not be worth it? |
| 09:51 | Chousuke | Can't you just have the handlers be functions and call them only when an error occurs? |
| 09:52 | jweiss_ | Chousuke: yes, that's what i am doing now. but since my with-handlers macro doesn't HAVE to even create those function objects at the start, i thougt maybe it shouldn't. |
| 09:52 | Chousuke | jweiss_: the function objects are created at compile time, they're pretty much free. |
| 09:53 | jweiss_ | ah that's right |
| 09:53 | Chousuke | probably more memory-efficient than storing the forms, too. |
| 09:54 | jweiss_ | ok good then i am done :) thanks Chousuke |
| 09:58 | fogus` | Have I lost my mind, or are these needed/missing from Clojure? https://gist.github.com/790187 |
| 10:00 | opqdonut | yeah they're missing |
| 10:01 | fogus` | Maybe there is an obvious way to get the same that I am missing? |
| 10:03 | chouser | fogus`: I suspect they're missing more because they've not been needed much rather than because there's a tidy way to write them when they are needed. |
| 10:05 | fogus` | chouser: Do you know of a tidier way in any case? |
| 10:06 | chouser | haven't thought of one in the last 5 minutes. :-) |
| 10:07 | fogus` | I'll take that as a win. ;-) |
| 10:07 | timvisher | In Java, i'm used to declaring pretty much all of my functions as private and then bumping their visibility when that becomes a problem. I like how my public contract sort of emerges that way. Is it non-idiomatic to do similar things in clojure i.e. declaring all of my functions with defn- and only bumping them to def when I need access to them outside the namespace? |
| 10:08 | fogus` | chouser: Think it's worth pitching as inclusions to 1.3? |
| 10:08 | chouser | fogus`: the normal route used to be to put such things in contrib first and let demand build from there. |
| 10:09 | chouser | I dunno if that's still the best route or not, with new contrib. |
| 10:09 | fogus` | chouser: Hmmm. I'm a little foggy on how to get things into the new contrib :-( |
| 10:10 | fogus` | Although, I assume the pitch is the same, but with contrib as the target (duh) |
| 10:10 | arkh | if anybody has time to glance at this, I've been unable to get this exception handling to work : / https://gist.github.com/793340 |
| 10:11 | chouser | yeah. certainly worth a pitch somewhere. I don't see even an old contrib namespace that looks terribly appropriate, though. |
| 10:11 | chouser | seq-utils might be the closest, except of course there are no seqs involved so it's a pretty poor fit. :-P |
| 10:13 | fogus` | Maybe wherever things like curry/uncurry go? Actually, I am not sure if they even exist in contrib either. :-( |
| 10:13 | LauJensen | Why was http.agent deprecated from contrib? |
| 10:15 | LauJensen | Was it because chouser tried to stuff it in seq-utils again? |
| 10:17 | chouser | (and (every? pos? coll) (every? even? coll)) meh |
| 10:20 | shortlord | I quite often have the problem that I need to manipulate certain vars in through methods and don't want to pass these vars (e.g. I have defined a board and want to perform actions on this board from other namespaces without always having to pass the board as an argument). But that would mean that I'd constrain function reusability, right? |
| 10:20 | shortlord | is there any good way to do this or do I have to define 2 functions every time, one generic and one who wraps the other and passes some predefined arguments? |
| 10:25 | LauJensen | Could we please get some more votes on http://dev.clojure.org/jira/browse/CLJ-714 ? |
| 10:29 | Fossi | shortlord: how did you define your vars? globally? |
| 10:29 | chouser | is there a way to un-vote? |
| 10:32 | fogus` | hear hear |
| 10:34 | shortlord | Fossi: yes, they are globally defined in one namespace (the board namespace), not I'd like to call something like 'change-board' from another namespace without always specifying the board |
| 10:35 | LauJensen | fogus`: ? |
| 10:36 | Fossi | sounds like it's breaking the functional programming idea quite a bit and will be ugly in testing etc anyway |
| 10:37 | Fossi | but, yeah, i guess defining 2 functions would be the way to go |
| 10:37 | Fossi | at least you can at least write a with-board or such for testing |
| 10:37 | Fossi | -at least |
| 10:39 | shortlord | Fossi: how would I write the whole thing without breaking functional paradigms? |
| 10:40 | devn | maybe im missing something, but why are you averse to passing around a var? |
| 10:44 | mefesto | does leiningen have a :repl-init-script but for lein swank ? |
| 10:44 | shortlord | devn: that would mean that every single time I want to place something on the board, I'd need to pass the board as an argument |
| 10:45 | shortlord | devn: worse, the board is only one of the things that need to be passed as arguments, there is also a list of buildings, a placement of a special token, the inventory of players. there are methods who need all of these as arguments, it would be quite clunky to call them always directly with all the arguments |
| 10:46 | chouser | shortlord: you might consider putting all those things together in a single value, such as a map or record. |
| 10:46 | shortlord | devn: but I guess the right way to do it would be to turn all these functions into closures and pass them the value once and then use the closure to avoid passing these things again, right? |
| 10:46 | chouser | then it's easy to pass them as a single arg, and as a bonus you have a single value that descibes the state of your system. |
| 10:47 | Fossi | yeah, generally, you *want* to pass all those all the time, so that your code is stateless/functional |
| 10:47 | shortlord | chouser: the board is already a rather complicated map, the same is true for the player inventory and the list of buildings. I had planned to use the namespace as some sort of capsulation for these things instead of putting them all into an even bigger map |
| 10:48 | Fossi | if you have to pass all the stuff all the time chances are that your design is flawed somewhere |
| 10:48 | fogus` | LauJensen: I don't care too much for #| ... |# |
| 10:48 | LauJensen | fogus`: why not? |
| 10:49 | Fossi | for example for a game loop i have written, i don't modify the data directly, but create an array of modification operations |
| 10:49 | fogus` | I think it goes about solving that problem in the wrong way |
| 10:50 | LauJensen | fogus`: What would be the right way ? |
| 10:51 | fogus` | We already have #_ so might it be better to modify that to completely ignore the internal form? |
| 10:51 | fogus` | (btw, I don't know the right answer... I'm soliciting advice) |
| 10:51 | shortlord | Fossi: well, this kind of "modify indirectly" could be done through closures, right? So that I have a generic build function and then generate a more specific build function that is bound to a specific board, that is passed exactly once |
| 10:52 | LauJensen | fogus`: Thats a good idea |
| 10:53 | Fossi | well, most of the time you want to avoid to carry around state somewhere where it's not so visible |
| 10:54 | Fossi | stateful global vars are gonna bite you in the behind sooner or later |
| 10:55 | Fossi | i tried to keep the modifying of state out of the 'business logic' by passing in an immutable state and the 'events' and returning said modifying operations |
| 10:55 | Fossi | then in another pass i go over the objects and apply those |
| 10:56 | wjlroe | I have a problem using clojure.string/replace and running a test against it. When I test equality in the repl using (= ... it works, but using a deftest, I get this error: |
| 10:56 | wjlroe | expected: (= "faxes" (apply-sxz ["fax"])) |
| 10:56 | Fossi | makes for easy debugging |
| 10:56 | wjlroe | actual: (not (= "faxes" "[\"fax\"]es")) |
| 10:56 | fogus` | LauJensen: Great... I'm glad to know that I'm not totally out of my mind. Think it would help if I added a similar comment to the case? |
| 10:56 | shortlord | Fossi: wow, that's quite a nice idea |
| 10:56 | LauJensen | fogus`: I think so, yes |
| 10:59 | shortlord | is it not possible to use 'nil' as a test-statement in a case expr? |
| 11:02 | fogus` | LauJensen: Added |
| 11:05 | mrBliss | shortlord: http://dev.clojure.org/jira/browse/CLJ-702 |
| 11:06 | jweiss_ | anyone have an opinion on this - i have a macro where in practical use, the first arg will be the same 99% of the time (the kw :type) I could create another tiny macro for convenience but giving it a meaningful name would end up as more typing for the programmer than just specifying the argument every time. on the other hand, an extra macro seems like better documented code. |
| 11:10 | ordnungswidrig1 | hi, how can I empty (truncate) the simple repl buffer? |
| 11:10 | robonobo | jweiss: make the macro without the :type kw the one with the longer name? |
| 11:10 | robonobo | ordnungswidrig: do you mean clear it? put the prompt at the top? |
| 11:11 | ordnungswidrig | robonobo: yes, there a currently 78k lines which make my emacs slow |
| 11:12 | robonobo | ah, in emacs |
| 11:14 | robonobo | i've been looking to do that as well, not because it makes emacs faster, but because i'm ocd about having my prompt at the top |
| 11:15 | robonobo | with the lein repl it's just Ctrl-L, like in bash |
| 11:16 | ordnungswidrig | I forgot how to do that. I know there was a command |
| 11:17 | robonobo | the trouble is that in slime, C-l doesn't do what you'd expect. |
| 11:18 | mrBliss | ordnungswidrig: try C-c M-o or C-c C-o for the last output |
| 11:19 | ordnungswidrig | mrBliss: ah, nice. thank you! |
| 11:22 | LauJensen | Am I correct in saying that the Apache Commons Http Client PUT method can only send a file OR a string but not both as POST can ? |
| 11:29 | robonobo | mrBliss: yes! finally! |
| 11:32 | AWizzArd | Does Clojure use Red-Black trees to implement sorted sets and maps? Are these "ordinary" RBTs or are they left-leaning RBTs? |
| 11:33 | chouser | AWizzArd: yes. I don't know. |
| 11:33 | leafw | AWizzArd: the source code would tell you right? |
| 11:33 | AWizzArd | LauJensen: while we are at it: how can I add a body for DELETEs? |
| 11:33 | AWizzArd | chouser: oki thanks, so they are RBTs. |
| 11:35 | AWizzArd | LauJensen: for HttpPut/HttpPost 'm' I can do a .setEntity. Example: (.setEntity ^HttpEntityEnclosingRequestBase m (StringEntity. body "UTF-8")) |
| 11:36 | robonobo | should a JPanel agent that is sent messages to have it draw something on itself behave like normal? the draw-function calls fillRect on the graphics of the panel and then returns panel unchanged. |
| 11:47 | LauJensen | AWizzArd: I think (hope) that both PostMethod and PutMethod can accept an array of parameters, which can be both FilePart and StringPart |
| 11:47 | LauJensen | It works well for PostMethod |
| 11:56 | technomancy | mefesto: :repl-init-script works for swank too in recent versions |
| 11:56 | ordnungswidrig | AWizzArd: I don't think a DELETE request body is encouraged by the spec |
| 11:59 | ordnungswidrig | AWizzArd: "The DELETE method requests that the origin server delete the resource identified by the Request-URI." says RFC2616. I don't see what a request body can add to this |
| 12:00 | shortlord | can you recommend any books that teach functional programming principles? It doesn't need to be for any particular language (although clojure/lisp/haskell would be fine), but it should contain a detailed description of the ideads behind functional programming like closures and currying and so forth |
| 12:00 | mefesto | technomancy: i'm keeping my init.clj script under test, is that not good? |
| 12:01 | mefesto | technomancy: in project.clj i have :repl-init-script "test/init.clj" |
| 12:01 | technomancy | mefesto: yeah, that makes sense |
| 12:01 | mefesto | technomancy: lein repl works find but when i do a lein swank and connect from emacs it doesn't seem to load |
| 12:01 | mefesto | work *fine |
| 12:01 | Raynes | chouser: Aw, you don't support the multiline comment proposal. :< |
| 12:01 | technomancy | mefesto: maybe an old swank? |
| 12:02 | mefesto | technomancy: swank-clojure 1.2.1 |
| 12:03 | technomancy | try 1.3.0-SNAPSHOT |
| 12:04 | robonobo | Raynes: where might i find this proposal? |
| 12:04 | Raynes | http://dev.clojure.org/jira/browse/CLJ-714 |
| 12:04 | mefesto | technomancy: that was it. thanks. |
| 12:06 | Raynes | The only reason not having them feels reasonable is if #_ works like fogus proposed in comments. I know this adds complexity, but it's a comment form. I'm not sure how complex you can get with that. |
| 12:09 | robonobo | why not stick with the common list syntax for comments? |
| 12:10 | Raynes | I'm not sure I follow. |
| 12:10 | robonobo | s/list/lisp |
| 12:10 | sexpbot | <robonobo> why not stick with the common lisp syntax for comments? |
| 12:10 | Raynes | The syntax that patch adds *is* the Common Lisp syntax for comments, I believe. |
| 12:14 | robonobo | Raynes: I think I got the names in Jira vs irc mixed up |
| 12:14 | Raynes | I don't really expect it to be accepted. #_ is 'close', it's just that 'close' but no cigar irks the hell out of me. |
| 12:16 | robonobo | I don't really get the syntax complexity argument, when it's been in CL since the dawn of man |
| 12:17 | Raynes | robonobo: Admittedly, CL isn't the pinnacle of marginal complexity. ;) |
| 12:18 | robonobo | yes, of course |
| 12:18 | robonobo | but it would be a nice addition for those coming from there |
| 12:20 | robonobo | is it a stated goal of clojure's to adhere to the lisp syntax as much as possible? |
| 12:21 | devn | Raynes: I like your comment on the literate programming tools |
| 12:21 | Raynes | Not really. Clojure tries to relieve itself of painful Lisp syntax in a lot of cases. |
| 12:21 | Raynes | devn: I'm not sure if this would actually be helpful, but it feels like it would. |
| 12:22 | technomancy | robonobo: if you are talking about Common Lisp you should use its full name. calling it "lisp" is confusing. |
| 12:22 | devn | Reading down the comment list, I agree with chouser && fogus |
| 12:22 | devn | The additional syntax is unecessary |
| 12:22 | Raynes | I don't think it's the syntax that is the problem here as much as it is the *addition* of syntax, and I can understand the desire to keep such things out. But it is a missing feature. |
| 12:23 | Raynes | It's a free country. |
| 12:23 | msappler | hey is there some automated way of renaming a namespace across multiple files |
| 12:23 | amalloy | msappler: perl :P |
| 12:23 | Raynes | Perl. |
| 12:23 | Raynes | amalloy: o/ |
| 12:23 | devn | msappler: someone wrote something like that, his github handle starts with a b |
| 12:23 | devn | that's all the info I have :D |
| 12:24 | Raynes | amalloy and I actually did use perl to do that in sexpbot once. |
| 12:24 | Raynes | It worked surprisingly well. |
| 12:24 | amalloy | msappler: $ find . | xargs perl -pi -e 's/foo\.bar/foo.baz/g', but don't quote me on it |
| 12:24 | devn | I think I have a script lying around somewhere that does it actually |
| 12:24 | amalloy | won't work if, eg, you're doing stuff like (use (foo bar sam)) |
| 12:25 | msappler | or is there a way to do that in clojure? Edit files on the form-level not string level maybe? |
| 12:25 | Raynes | devn: I'm tempted to agree with fogus as well. If #_ worked the way he proposed, it would be fine. |
| 12:25 | amalloy | Raynes: i just added a comment replying to fogus; i don't think that's possible really |
| 12:25 | ohpauleez | For simple find and replace/rename, I'd just use sed |
| 12:26 | msappler | well its not simple ... because it depends on the package |
| 12:26 | Raynes | amalloy: Regardless, *if* it worked that way, I wouldn't mind. |
| 12:26 | amalloy | Raynes: that's probably fair |
| 12:26 | msappler | i want to reuse my game.utils.misc to game.utils.core and there are other namespaces called misc |
| 12:26 | msappler | *reuse -> rename |
| 12:27 | amalloy | msappler: try my perl thingy at the bash prompt? |
| 12:27 | msappler | nope I have no perl ;) and dont understand it ^^ |
| 12:28 | ohpauleez | msappler: sed should easily do that for you |
| 12:28 | msappler | what is sed? |
| 12:28 | ohpauleez | are you on a *nix OS? |
| 12:28 | msappler | nope windows ^^ |
| 12:28 | ohpauleez | hmm, nvm then |
| 12:28 | ohpauleez | sed is a stream editor |
| 12:29 | ohpauleez | it performs a macro edit on all files you pass to it as a stream |
| 12:29 | ohpauleez | much like how the perl was working up above |
| 12:30 | msappler | i read a lot of developers use linux instead of windows ... someone can explain the advantages ? |
| 12:30 | msappler | something i missed maybe ? ^^ |
| 12:31 | ohpauleez | msappler: Unix and unix-like operating systems are basically just a big ol' tool chest for developers |
| 12:31 | robonobo | msappler: lots of devtools (like sed) |
| 12:32 | fliebel | msappler: You don't have sed, nor GCC. and I heard emacs is a pain on Windows. |
| 12:32 | ohpauleez | the philosophy of how tools can be linked together, piped, combined, is a very similar philosophy to how functions are written and applied in Clojure |
| 12:32 | robonobo | make, gcc, all major scriping languages out of the box, emacs, |
| 12:33 | ohpauleez | additionally, accessing and monitoring the raw resources and interfaces on your computer are much easier |
| 12:33 | msappler | is there some place where I can start reading about linux and the advantages/tools that is gives me as a developer |
| 12:33 | ohpauleez | for example, I can "cat" (read) the stream of data from my mouse to the console/command-line |
| 12:35 | amalloy | ohpauleez: i could probably use a lot less perl in my life if i knew how to use sed |
| 12:36 | ohpauleez | msappler: I'd just thumb through the RSS streams for Linux Journal and Linux Magazine. If you like books, there's an older book called The Practice of programming by Rob Pike |
| 12:36 | fliebel | amalloy: have you tried 'cake filter'? |
| 12:36 | ohpauleez | amalloy: Yeah, sed rocks pretty hard. I rarely use perl for substitutions like that |
| 12:37 | robonobo | amalloy: sed is nice for onliners, but a complete pain to use for anything complicated |
| 12:37 | tonyl | awk |
| 12:37 | ohpauleez | amalloy: This is very true ^ |
| 12:37 | robonobo | tonyl: yes. much better |
| 12:37 | fliebel | tonyl: Thanks! I was lookign for the name... |
| 12:37 | amalloy | ohpauleez: tbh though i'm pretty comfortable with perl and don't care about the extra...what, 20 characters it takes over sed? |
| 12:37 | amalloy | fliebel: cake filter is neat. i forgot all about it |
| 12:38 | ohpauleez | I have yet to really get any sort of mastery with awk. If it's more than a one-liner, I fall back to Python or Perl |
| 12:38 | tonyl | although I don't use it that often, but oh it saves me precious time when needed |
| 12:38 | ohpauleez | msappler: Also take a look at Rob Pike's "The Unix Programming Environment" |
| 12:39 | Raynes | ohpauleez: I wrote a shell script in Clojure to compile the sources of my book to a PDF for me. |
| 12:39 | ohpauleez | again, these books are dated, but the philosophy is still there |
| 12:39 | Raynes | :D |
| 12:39 | ohpauleez | Raynes: Out. of. control. |
| 12:39 | ohpauleez | haha |
| 12:39 | msappler | thanks very much i will look into that |
| 12:40 | ohpauleez | msappler: I'm happy to help |
| 12:43 | fogus` | amalloy: I responded to your comment, but as a summary I would just say "so be it." ;-) |
| 12:48 | devn | sed + awk, the original |
| 12:48 | ohpauleez | yes |
| 12:48 | ohpauleez | the combo really is the trick |
| 12:52 | Raynes | Does anyone know if *current* swt jars are kept in any maven repository somewhere? |
| 12:53 | jweiss_ | anyone have any experience publishing to their own (on a corporate network) maven repo? afaict, leiningen doesn't seem to do this |
| 12:54 | jweiss_ | i know a maven repo is just a filesystem, but it's not exactly trivial to create the right directory structure. |
| 12:54 | amalloy | jweiss_: lein install |
| 12:55 | amalloy | installs it locally, then you can just tar/untar in the other repo |
| 12:56 | jweiss_ | amalloy: yeah, but i don't want to tar/untar the entire repo, just the thing i just installed |
| 12:56 | jweiss_ | how can i even tell where it went? |
| 12:56 | jweiss_ | i mean, i could browse the repo myself, but i want to grab it programmatically |
| 12:57 | amalloy | jweiss_: you could check out the source of cake's "release" task |
| 12:57 | amalloy | which pushes to clojars specifically, i think |
| 12:58 | technomancy | jweiss_: 1.5.0-SNAPSHOT has a lein deploy task for pushing to archiva and friends. |
| 12:59 | amalloy | and it looks like cake deploy is designed to push to whatever server that supports ssh, if you pass it the right options. i'm not sure how hard it would be to supply those options |
| 13:00 | jweiss_ | clojars lets you push with scp without having to specify where everything needs to go |
| 13:00 | jweiss_ | maybe i should just run clojars myself |
| 13:01 | jweiss_ | i was trying to avoid adding another piece of software |
| 13:01 | technomancy | jweiss_: archiva is a lot easier to set up than clojars, plus it does proxy caching |
| 13:03 | jweiss_ | hm, i guess i can't get away with just a plain filesystem |
| 13:03 | jweiss_ | i'll have to add tomcat to the mix |
| 13:04 | jweiss_ | technomancy: you mentioned somewhere a while back that it wasn't that hard to get hudson to publish to my own maven repo - i looked around but i couldn't figure it out |
| 13:05 | jweiss_ | http://stackoverflow.com/questions/3468461/push-to-nexus-using-leiningen |
| 13:06 | jweiss_ | i already have a hudson server running |
| 13:07 | technomancy | sure, you can just have your hudson task execute "lein install" as the last step, then use nginx or whatever to serve hudson's ~/.m2/repository over static HTTP. archiva is nice for other reasons, but hudson+static is simplest. |
| 13:07 | jweiss_ | technomancy: the problem with that is, ~/.m2 is on the hudson slave, not on the master hudson server. |
| 13:08 | jweiss_ | and we have many slaves, it's nondeterministic which one will do the build |
| 13:08 | technomancy | ok, in that case you'll need to use lein deploy. |
| 13:08 | jweiss_ | technomancy: ok thanks |
| 13:14 | mattmitchell | could someone point me in the right direction for simply connecting to mysql and selecting etc.? |
| 13:15 | LauJensen | mattmitchell: http://clojureql.org |
| 13:15 | LauJensen | (use 'clojureql.core) @(table db :users) will run SELECT * FROM users on the connection 'db' |
| 13:15 | mattmitchell | LauJensen: you prefer that over clojure.contrib.sql ? |
| 13:15 | LauJensen | mattmitchell: definitely |
| 13:15 | mattmitchell | LauJensen: ok i'll have a look. thanks! |
| 13:16 | LauJensen | np :) |
| 13:31 | melipone | what does DSL mean in the context of clojure? I read about building DSL but I don't know what that means |
| 13:31 | semperos | Domain Specific Language, more than likely |
| 13:32 | semperos | building in abstractions unique to your problem that make coding the application feel more "domain specific" than default Clojure |
| 13:32 | melipone | semperos: thanks |
| 13:32 | semperos | np |
| 13:32 | melipone | ok, I guess that's what Lisp and now Clojure do well |
| 13:33 | semperos | technically, Clojure is a Lisp, and yep, Lisp's facilitate it very well |
| 13:40 | mattmitchell | LauJensen: OK trying clojureql now, but keep getting this error: java.sql.SQLException: No suitable driver found for jdbc:mysql://127.0.0.1:3306/providence_development (db.clj:15) |
| 13:40 | amalloy | mattmitchell: you need to install a jdbc driver. i think clojureql tells you how to do that somewhere |
| 13:41 | amalloy | but basically it's just a one-line addition to project.clj |
| 13:41 | mattmitchell | amalloy: ok great thanks! |
| 13:43 | LauJensen | mattmitchell: Use this for MySQL [mysql/mysql-connector-java "5.1.6"] |
| 13:43 | LauJensen | I think its the most recent |
| 13:43 | mattmitchell | LauJensen: excellent thank you |
| 13:44 | mattmitchell | LauJensen: awesome, working :) |
| 13:45 | LauJensen | Great - If you have any questions feel free to shoot here or join us in #clojureql |
| 13:46 | mattmitchell | LauJensen: cool just getting ready to go there now |
| 13:46 | LauJensen | But as you can see, ClojureQL is so elegantly designed that even amalloy can figure out how to use it |
| 13:48 | LauJensen | amalloy: still waiting for the PHP version? :) |
| 13:57 | amalloy | LauJensen: you bet |
| 14:03 | Scriptor | a PHP version of clojureql, you say? |
| 14:04 | amalloy | Scriptor: yeah, php has HOFs and parentheses, it should be a trivial port |
| 14:04 | amalloy | for someone of LauJensen's calibre |
| 14:05 | LauJensen | Scriptor: I was just messing with amalloy who's a leading authority on PHP |
| 14:06 | Scriptor | I figured :) I should look more into relational algebra anyway |
| 14:08 | LauJensen | Yea its pretty sweet |
| 14:24 | Licenser | aloa |
| 14:48 | devn | aloha |
| 14:49 | raek | Introducing my new blog: http://blog.raek.se/2011/01/24/executors-in-clojure/ |
| 14:51 | LauJensen | looks a little boring, especially I find the blogroll lacking ... :( |
| 14:52 | fliebel | raek: At least it's not twentyten... |
| 14:57 | fliebel | raek: Do you mind if I steal the read eval blog loop for a command line blogging client? :) But I think I will use another reading function. (are you blogging Clojure forms?) |
| 14:57 | chouser | raek: I like the clean presentation. |
| 14:57 | chouser | raek: typo: taks |
| 14:57 | fliebel | chouser: It's Automattic. |
| 14:58 | raek | LauJensen: lacking a certain blog from Scandinavia? ;-) |
| 14:58 | raek | don't worry. I added you. |
| 14:58 | LauJensen | raek: oh yea now that you mention it :) |
| 15:00 | raek | chouser: thanks! |
| 15:01 | raek | to bad WP-Footnote does not support nested footnotes... |
| 15:01 | LauJensen | raek: Nice read - Look forward to seeing more from you |
| 15:03 | fliebel | http://blog.raek.se/wp-content/themes/thematic/readme.html doh, I should stop doing that... |
| 15:05 | fliebel | raek: You should consider this to spice up your blogroll :) http://wordpress.org/extend/plugins/rss-blogroll/ |
| 15:33 | timvisher | Sorry for the stupid easy question, but how can I turn `(:width |
| 15:33 | timvisher | "1024" :height "1024")` into `{:width "1024" :height "1024"}`? |
| 15:33 | timvisher | I've tried `(into {}...` and `(apply map...` but I'm missing |
| 15:33 | timvisher | something obvious |
| 15:33 | technomancy | apply hash-map |
| 15:34 | timvisher | technomancy: brilliant. :) |
| 15:34 | timvisher | wow |
| 15:34 | timvisher | I was about to ask "is there even a map function" and just realized that I was trying to use map i.e. map/reduce... |
| 15:34 | timvisher | I'm an idiot... |
| 15:34 | timvisher | ^_^ |
| 15:35 | timvisher | ah well, all in the name of project |
| 15:35 | timvisher | progress* |
| 15:35 | technomancy | there are only so many English words out there |
| 15:43 | Raynes | LauJensen: ping |
| 15:48 | melipone | okay, now I have my functions working in a .clj file. I put (myfunction args) at the end of the file. How do I execute that now in batch? |
| 15:49 | raek | melipone: with or without cake/lein? |
| 15:50 | technomancy | melipone: move (myfunction args) into the -main function, then use "lein run" or create an uberjar depending on how you want to launch it. |
| 15:51 | technomancy | top-level forms that don't start with "(def ..." are almost always not what you want |
| 15:51 | melipone | Is it possible to run it without lein? |
| 15:52 | technomancy | possible but probably not worth the effort |
| 15:52 | melipone | I don't understand what "move (myfunction args) into the -main function" means |
| 15:52 | technomancy | unless you're talking about distributing to users; that's what uberjar is for |
| 15:52 | tonyl | http://www.glenstampoultzis.net/blog/2010/06/01/self-running-clojure-batch-file/ |
| 15:55 | melipone | does that mean that I give my .clj as an argument to clojure.main? |
| 15:56 | tonyl | moving it to main like (defn main [args] (myfunction my-args)) has the same special case as the main function in a java class |
| 15:57 | melipone | I didn't know that, thanks. |
| 15:57 | tonyl | if you want to keep it simple use lein or cake or a similar program to run the clojure code |
| 15:57 | raek | aren't the args passed as separate parameters? i.e. (defn -main [& args] ...) |
| 15:57 | tonyl | or java -cp clojure.jar clojure.main myfunction.clj |
| 15:58 | tonyl | raek: you might be right |
| 15:58 | tonyl | double checked and raek is right on that one |
| 15:58 | Raynes | tonyl: It's -main, with the hyphen, and there aren't any special cases. it just so happens that if you name a function -main and then gen-class it, a Java class with a main method corresponding to your -main function is created. |
| 15:59 | tonyl | thank Raynes for clarifying :) |
| 16:00 | technomancy | there is a special case actually: java -cp [...] clojure.main -m my.namespace targets my.namespace/-main without AOT involved |
| 16:00 | melipone | do i still need to do that when passing it as an argument to clojure.main? |
| 16:00 | Raynes | technomancy: In what version of Clojure? |
| 16:00 | melipone | technomancy: that answered my question |
| 16:00 | melipone | 1.2.0 |
| 16:01 | technomancy | Raynes: new in 1.3.0 |
| 16:01 | Raynes | technomancy: So your patch got accepted? Cool. |
| 16:01 | technomancy | even though the patch was written aaaages ago =\ |
| 16:01 | Raynes | technomancy: Shhhh, or this will end up on Hacker News. ;) |
| 16:04 | fliebel | tonyl: The hyphen is the prefix for AOT'ing methods, by the way. So It's just main compiled to a method, nothing special on the Clojure side. |
| 16:05 | tonyl | so instead of creating a class out of -myfun it compiles to a java method? |
| 16:05 | amalloy | anyone have suggested syntax-highlighting colors for clojure? |
| 16:07 | amalloy | fliebel: i'm adding clojure-oriented css to something and my colors are always ugly |
| 16:07 | LauJensen | Raynes: pong |
| 16:07 | Raynes | LauJensen: Never mind. |
| 16:08 | fliebel | amalloy: I like browns, greens and purples, not to bright. What is the CSS for? |
| 16:08 | LauJensen | amalloy: Just follow the lead of charcoal black |
| 16:08 | fliebel | LauJensen: Does ClojureQL do transactions? |
| 16:08 | LauJensen | fliebel: Right now you can use contribs transaction macro, but Im putting in my own soon |
| 16:09 | amalloy | fliebel: i've started writing bloggish things like http://hubpages.com/hub/What-is-Clojure, and the syntax-highlighting module doesn't have any lispy-languages yet |
| 16:09 | LauJensen | Thats a problem most people run in to. One solution is htmlize |
| 16:10 | fliebel | … or Gist |
| 16:10 | amalloy | fliebel: would if i could |
| 16:10 | fliebel | amalloy: what prevents you? |
| 16:10 | amalloy | hubpages only gives authors limited control over the html |
| 16:10 | fliebel | ah, no JS and stuff... |
| 16:10 | amalloy | right |
| 16:10 | Raynes | fliebel: I used gist once, and about 5 seconds after I hit 'publish', Github had a major database catastrophe. |
| 16:11 | amalloy | i work there so i can add some backend highlighting support for any code marked as "clojure" |
| 16:11 | Raynes | Never again. |
| 16:11 | amalloy | but i can't let users in general do it |
| 16:11 | fliebel | Raynes: I'm on Posterous, and they do horrible things to your code if you paste it in an email. |
| 16:12 | Raynes | fliebel: So does Wordpress if you use the visual editor. Which is why I wish Raynes would get off his ass and write that offline blogging client he talks about so much. |
| 16:12 | fliebel | But the stupid thing is that they do horrible things to your whole post if you try to export and go to Wordpress, or something else... |
| 16:13 | fliebel | Raynes: I havn't heard you about it. Tell me more :) |
| 16:13 | tonyl | fliebel: don't you just post the link to the gist and posterous formats it for you? |
| 16:13 | Raynes | fliebel: All blogging clients suck. My wont. Explanation complete. |
| 16:14 | fliebel | tonyl: They just embed the gist basically, but for feeds, they do render a static version, which never looks like it is supposed to, with tables and missaligning line numbers... |
| 16:14 | Raynes | Mine* |
| 16:15 | fliebel | Raynes: But is it a baker? |
| 16:15 | Raynes | Baker? |
| 16:15 | fliebel | Static site generator. Basically Markdown in, HTML out, end of story. |
| 16:16 | Raynes | I haven't actually figured out how I plan to do it. In any case, there wont be a 'visual editor', because those things are nothing but trouble. Markdown is a nice idea. |
| 16:16 | fliebel | I attempted one with devn… twice. It still lives at https://github.com/pepijndevos/utterson |
| 16:19 | fliebel | It work much like an automated version of me, maintaining a static website. When I edit the Markdown, it uses Enlive to *edit* the website. So editing the HTML structure can be done on the site itself, and using Enlive to replicate the changes to the other files. |
| 16:20 | fliebel | It would be cool to make it based on the lenses principle, so that editing the content updates the markdown files as well :) |
| 16:20 | fliebel | Raynes: I think there are Markdown editors for Wordpress around... |
| 16:22 | fliebel | http://michelf.com/projects/php-markdown/ |
| 16:26 | LauJensen | fliebel: There's also an extended PHP markdown, which is much better |
| 16:52 | brehaut | morning (UGT) |
| 16:53 | tonyl | greetings |
| 16:58 | tibbe | Anyone have insight why PersistentHashMap2 is better than PersistentHashMap? My guess is that it's either faster, smaller or both but I'd be curious about the insights that led to the new design. Anyone knows? |
| 17:01 | chouser | tibbe: where are you seeing that? |
| 17:01 | hiredman | cgrand has a clojure fork with a leafless branch |
| 17:01 | chouser | ah |
| 17:01 | tibbe | chouser: in the GitHub repo e.g. https://github.com/clojure/clojure/commit/eedcf35479737ab1136e3b8a00b2759190a73fdb |
| 17:02 | tibbe | hiredman: the current version looks leafless to me. do you have a link to that particular repo, maybe the commit messages have more info |
| 17:02 | nickik | i guess is black magic |
| 17:02 | hiredman | possibly I am confused |
| 17:03 | chouser | wow, a lot less code |
| 17:04 | fliebel | What is new about this second coming of the PersistentHashmap? |
| 17:04 | chouser | oh, nm, I misread the patch |
| 17:04 | chouser | this is from 2009 |
| 17:04 | tibbe | @seen cgrand |
| 17:05 | hiredman | the license change from bsd back to epl |
| 17:05 | tibbe | fliebel: it might not be that new |
| 17:05 | chouser | that sounds like it was circa transients |
| 17:05 | tonyl | $seen cgrand |
| 17:05 | sexpbot | cgrand was last seen quitting 1 week and 2 days ago. |
| 17:05 | chouser | hm, maybe not that either. |
| 17:06 | hiredman | interesting to look at the history of a single file |
| 17:06 | hiredman | I wasn't aware it was ever bsd licensed |
| 17:09 | chouser | that may have been done to allow the standalone java project and/or porting to use with Scala |
| 17:09 | tibbe | seems like the leafless version is a bit faster, especially in the transient case |
| 17:09 | hiredman | right, but then the change back? |
| 17:13 | fliebel | hiredman: That change was reverted? Or do you mean the license? |
| 17:15 | chouser | I think I saw someone ask if the license change back to EPL was intentional and if it would stay that way, and Rich said "yes" |
| 17:15 | chouser | though I'm not finding that now. |
| 17:16 | chouser | ah, here it is: http://groups.google.com/group/clojure-dev/msg/92e068cd2c5bbed7 |
| 17:21 | mattmitchell | what's the recommended json library for clojure? |
| 17:21 | mattmitchell | i've seen clj-json |
| 17:22 | mattmitchell | oh i guess there's one in contrib |
| 17:22 | ohpauleez | mattmitchell: I'd use clj-json |
| 17:22 | ohpauleez | it's much faster than the contrib lib |
| 17:22 | mattmitchell | ohpauleez: oh really? cool thanks. |
| 17:22 | ohpauleez | it uses Jackson under the hood |
| 17:39 | djpowell | anyone online with clojure-dev@googlegroups admin abilities? |
| 17:42 | phenom_ | can someone help me out with this error when binding a function to something new? http://pastie.org/1494322 |
| 17:43 | amalloy | phenom_: you must be using clojure 1.3 |
| 17:43 | amalloy | vars aren't automatically rebindable as of 1.3; you want (defn ^:dynamic with-log [...] ...), i believe |
| 18:19 | shortlord | when should '!' be used in function names? whenever they have side effects? |
| 18:21 | ohpauleez | shortlord: Yes |
| 18:22 | ohpauleez | anytime manipulation/descruction happens (ie: there are side effects), you should append a ! to the function name |
| 18:22 | ohpauleez | destruction* |
| 18:23 | shortlord | ohpauleez: so why have so few of clojures built-in functions the exclamation mark? ref-set or println for example |
| 18:24 | ohpauleez | shortlord: those happen in a transaction |
| 18:24 | ohpauleez | so the do-sync is sort of liek one big ! |
| 18:24 | ohpauleez | dosync* |
| 18:26 | shortlord | ohpauleez: ah, makes sense (except for the println ;)) thx :) |
| 18:26 | ohpauleez | shortlord: np, glad I could help |
| 19:03 | shortlord | what are good books to get a deeper understanding of functional programming? On Lisp? (does not necessarily have to be about Lisps) |
| 19:06 | brehaut | shortlord: The Little Schemer, Real World Haskell, SICP |
| 19:07 | brehaut | the second two are available on the net for free |
| 19:10 | shortlord | brehaut: thx :) |
| 19:14 | brehaut | whenever i see the 'fs' library mentioned, i expect it to contain (def fs (repeat \f)) |
| 19:14 | brehaut | i have no idea what it really is |
| 19:15 | pdk | file system? |
| 19:15 | peregrine81 | this may be off-topic but does anyone have experience using screen over ssh and screen is black and white but the term is colored? |
| 19:15 | brehaut | oh. of course |
| 19:16 | brehaut | peregrine81: ssh has options to send terminal settings to the host machine, maybe the wrong ones are getting sent (or not sent) |
| 19:17 | brehaut | i cant tell you waht they are because ive completely forgotten it all |
| 19:18 | peregrine81 | brehaut: i'm using my cr-48. when I ssh in the base ubuntu terminal is colored. but when I use screen its black and white. Everything within screen is greyscale everything detached is colored |
| 19:19 | brehaut | peregrine81: im out of my depth sorry |
| 19:20 | peregrine81 | brehaut: ha, thanks, more help then i got from #ubuntu... most of that channel is "my youtube doesn't work" |
| 19:21 | brehaut | peregrine81: thats depressing |
| 19:21 | brehaut | #screen perhaps? |
| 19:21 | peregrine81 | good idea! |
| 19:34 | chouser | !who |
| 19:34 | chouser | er, sorry |
| 20:17 | devn | peregrine81: i'd make sure your TERM and TERMCAP are correct |
| 20:52 | Scriptor | in Clojure/other functional languages, how common is it that you have to iterate through a map, as opposed to just fetching items? |
| 20:55 | amalloy | Scriptor: pretty common, i should think |
| 20:56 | tomoj | surely common in clojure |
| 20:58 | Scriptor | thought so, trying to figure out how clojure optimizes it now |
| 20:59 | brehaut | they just implement seq like everything else |
| 21:00 | tomoj | for hash maps, order doesn't matter, so the seq can just wrap over internal arrays |
| 21:01 | amalloy | and sorted maps are pretty easy to iterate over too |
| 21:01 | tomoj | huh, that doesn't look very optimized though |
| 21:01 | Scriptor | hmm, going through the source and it doesn't seem like Persistentmap implements Seq, though I'm probably just not finding it |
| 21:01 | Scriptor | it does implement Iterable |
| 21:02 | amalloy | &(supers (class {})) |
| 21:02 | tomoj | ISeq |
| 21:02 | sexpbot | ⟹ #{clojure.lang.IPersistentCollection java.lang.Object clojure.lang.IFn java.lang.Runnable java.io.Serializable clojure.lang.AFn clojure.lang.Associative clojure.lang.IMeta clojure.lang.IObj java.lang.Iterable clojure.lang.MapEquivalence clojure.lang.IPersistentMap cl... http://gist.github.com/794381 |
| 21:02 | tomoj | ignore Iterable |
| 21:02 | tomoj | see the seq() implementation |
| 21:02 | amalloy | tomoj: it doesn't implement ISeq either |
| 21:02 | amalloy | it implements Seqable |
| 21:03 | tomoj | oh, yes, ISeq is the return value |
| 21:04 | amalloy | right |
| 21:04 | Scriptor | that just means it can be converted to a Seq, but it's not how iteration is done, right? |
| 21:04 | tomoj | the ISeq implementation is also in PersistentHashMap.java |
| 21:04 | amalloy | Scriptor: that is how iteration is done, yeah |
| 21:05 | amalloy | &(for [[k v] {1 2 3 4}] (+ k v)) |
| 21:05 | sexpbot | ⟹ (3 7) |
| 21:05 | amalloy | &(for [[k v] (seq {1 2 3 4})] (+ k v)) |
| 21:05 | sexpbot | ⟹ (3 7) |
| 21:06 | amalloy | many, many of clojure.core's functions turn their argument into a seq and then iterate over that; anything Seqable can be worked with |
| 21:06 | chouser | And even some things that are not Seqable, such as Java arrays, Strings, etc. |
| 21:06 | tomoj | seqs from maps don't appear to be chunked |
| 21:06 | Scriptor | ah, so it's still converting it, but it's just done without you directly noticing it |
| 21:06 | amalloy | it's just often implicit; the seq call itself is hidden within some macro (like for) or function |
| 21:07 | Scriptor | right, that makes sense |
| 21:07 | tomoj | or are they, somewhere else? hmm |
| 21:07 | chouser | tomoj: no, none of the map seqs are chunked |
| 21:07 | amalloy | tomoj: there would be no point |
| 21:08 | tomoj | really? |
| 21:08 | chouser | tomoj: vectors and range are -- I'm not sure if anything else is currently. |
| 21:08 | amalloy | you can't "realize" an element of a seq that comes from a map, because maps are not lazy and all the data is in memory already |
| 21:09 | tomoj | why would vectors be chunked, then? |
| 21:09 | chouser | amalloy: I'm not sure it would be pointless. |
| 21:09 | amalloy | tomoj: that's a good point. maybe it's not pointless |
| 21:09 | tomoj | my intuition was that for large maps it would speed up iteration |
| 21:09 | tomoj | avoiding creating a new NodeSeq every step |
| 21:10 | tomoj | or at least unfolding some of the loop onto the internal arrays somehow.. not sure how it would actually work |
| 21:10 | chouser | but I think there's still the possibility that pods may obviate chunked seqs |
| 21:10 | tomoj | I still have no clue what pods are :1 |
| 21:11 | chouser | nah, I go nuthin' |
| 21:11 | chouser | got |
| 21:11 | amalloy | chouser: boooo. okay, ta-ta then |
| 21:12 | tomoj | I know that when the idea is ready it will be easy to learn about |
| 21:12 | semperos | wasn't there a brief mention? |
| 21:12 | semperos | http://p.hagelb.org/pod.jpg |
| 21:12 | semperos | or is this something different? |
| 21:12 | Scriptor | is a chunked seq simply when it lazily gets the values for several items at a time, instead of one at a time? |
| 21:13 | semperos | and this http://www.infoq.com/interviews/hickey-clojure-protocols |
| 21:14 | hiredman | more or less |
| 21:14 | semperos | there's a link that jumps to the part about pods |
| 21:15 | Scriptor | ah, nvm, found a pdf about chunked seqs |
| 21:28 | arkh | Scriptor: could you share the link to the pdf? |
| 21:29 | Scriptor | arkh: http://goo.gl/nISD7 is the PDF, though http://www.infoq.com/news/2009/12/clojure-11-rc1-transients has more text |
| 21:33 | arkh | Scriptor: thank you |
| 21:33 | Scriptor | no problem |
| 22:03 | mefesto | Raynes: ping |
| 22:03 | Raynes | mefesto: pong |
| 22:04 | mefesto | Raynes: hey, i added that clickable code block thing as well as a little fading effect on page transition |
| 22:04 | Raynes | Nice! |
| 22:04 | mefesto | Raynes: i forget was there something else on the list? |
| 22:05 | Raynes | Being able to jump to 'lessons' and a way to view a list of all the lessons is all that I can think of. |
| 22:06 | mefesto | Ok, well I think that'll be doable with how it is now. Do you have some pre-written lessons somewhere? |
| 22:07 | Raynes | mefesto: The ones in tutorial.clj are all that's been written. Once this is done, I'm going to start from scratch. |
| 22:07 | mefesto | Raynes: ok well i'll check that out |
| 22:10 | mefesto | Raynes: good stuff. i'll put all this in the javascript thing and commit later tonight (hopefully). |
| 22:16 | accel | is there a variant of clojure that provides compile time type checking? |
| 22:16 | accel | (pehraps written as a macro system or something) |
| 22:17 | amalloy | accel: that would be a huge effort |
| 22:18 | amalloy | (map str [1 4 6]) |
| 22:18 | amalloy | even that simple example will be hard to do "right" with static typing. what are the return and argument types of map? |
| 22:19 | tomoj | in the case where the collection type is mixed, you're screwed I guess |
| 22:19 | tomoj | but str is tagged with String |
| 22:19 | accel | well, haskell can do mixed types |
| 22:19 | accel | as can ocaml |
| 22:19 | tomoj | but this isn't haskell or ocaml :) |
| 22:20 | tomoj | huh |
| 22:20 | accel | yeah; but clojure is powerful |
| 22:20 | tomoj | map doesn't look particularly easy to analyze, anyway |
| 22:20 | accel | and i'm trying to figure out what can easily be done in clojure |
| 22:21 | brehaut | accel: what do you mean by 'easily be done in clojure' |
| 22:22 | tomoj | that would maybe be easier after there is a clojure compiler written in clojure? |
| 22:22 | accel | well, it'd be a clojure DSL |
| 22:22 | accel | that had milner typing |
| 22:22 | accel | it wouldn't be hacked into clojure's compiler, |
| 22:22 | amalloy | tomoj, accel: this quickly turns into just ugly java: public <In,Out> List<Out> map(List<In> coll, Function<In,Out> f) {...} |
| 22:22 | accel | it'd be a DSL on top of clojure |
| 22:22 | amalloy | and that's ignoring the multiple arities of map |
| 22:22 | accel | amalloy: I don't understand what your example proves |
| 22:22 | accel | plus, map exists in haskell & ocaml |
| 22:22 | brehaut | accel: subtypes make one hell of a mess of HM typing |
| 22:23 | tomoj | oh, you mean you'd have to infect (if you will) _all_ the clojure you want type-checked with this new typed language? |
| 22:23 | amalloy | tomoj: either that or not gain anything |
| 22:23 | amalloy | if you have to cast all the time to go back and forth from "real" clojure to "typed" clojure... |
| 22:24 | Scriptor | accel: what would the DSL look like, a macro that goes through everything and tries to typecheck it? |
| 22:24 | tomoj | well, a clojure program could certainly look at normal clojure code and detect _some_ type errors |
| 22:24 | accel | not necessairly a macro |
| 22:24 | accel | you'd write sexps still |
| 22:24 | tomoj | but you wouldn't gain much, sure |
| 22:24 | accel | err the macro/DSl would then take the sexp, type check it |
| 22:25 | accel | and then report potential errors |
| 22:25 | Scriptor | so like (type-check (map str [1 2 3])) ? |
| 22:27 | amalloy | tomoj: sure. (map (comp inc str) [1 2 3]) you could probably catch with just the existing type-hints |
| 22:27 | accel | Scriptor: why not? |
| 22:28 | Scriptor | accel: cool, just wanted to make sure I understood clearly |
| 22:29 | amalloy | actually i guess not. comp would have to be parameterized<In, Out> for that to work |
| 22:31 | amalloy | i guess i should learn haskell. static-typed functional languages seem like a tremendous pain, but i understand it's not an issue there |
| 22:32 | Scriptor | I've only briefly looked at it, but it's pretty nice |
| 22:32 | brehaut | amalloy: the static typing in haskell is actually pretty managable 90% of the time |
| 22:32 | Scriptor | typeclasses and type variables (or whatever they're called in the signatures) make things very nice |
| 22:32 | brehaut | i think the hardest part of haskell is the terminology |
| 22:33 | brehaut | and the heavy use of operators |
| 22:43 | brehaut | amalloy: if you do look at haskell, real world haskell and the typeclassopedia are good sources of information |
| 22:44 | Scriptor | learn you a haskell isn't bad either, but it's especially helpful in teaching the mindset of functional programming |
| 22:44 | Scriptor | which probably isn't necessary here :) |
| 22:46 | brehaut | Scriptor: the additional text around some of the more abstract abstraction still wouldnt go amiss |
| 23:02 | Scriptor | amalloy: so since we were joking about clojureql in PHP earlier, I thought this might be relevant |
| 23:03 | Scriptor | I'm working on a lisp to php compiler, it's kinda like clojure, so maybe its possible to implement it there? |
| 23:05 | amalloy | Scriptor: an interesting project |
| 23:06 | amalloy | i think clojure would be an excellent language for that, even if what you want to translate is actually CL |
| 23:07 | amalloy | i'm not sure it's worthwhile though since you'd have a terrible time trying to get halfway legible/idiomatic php |
| 23:07 | amalloy | so it's not useful for humans; and computers can do just fine with clojure |
| 23:07 | Scriptor | it's more similar to clojure actually, at least in the sense that I know it better |
| 23:09 | Scriptor | true, the PHP emitted is more or less legible, or at least tries to be, and things might be better with some debugging support added |
| 23:26 | brehaut | has anyone here submitted the contributor aggrement? |
| 23:27 | replaca | I have, why? |
| 23:27 | brehaut | what happens once you put it in the mail? |
| 23:27 | replaca | the postman takes it to rich, assuming you've put a stamp on it :) |
| 23:28 | brehaut | yeah thats the theory |
| 23:28 | Raynes | brehaut: Once it's been Richified, you'll be added to the contributor list. |
| 23:28 | brehaut | does he email you or anything |
| 23:28 | hiredman | post person |
| 23:28 | brehaut | ok cool |
| 23:28 | replaca | then the government puts you on a list of potential subversives who are undermining the capitalist system by making free software |
| 23:28 | brehaut | haha |
| 23:29 | brehaut | your government or mine? |
| 23:29 | replaca | it's all really a trick - before you know it, you're packed off to the gulag |
| 23:29 | brehaut | crap |
| 23:29 | replaca | probably mine. They seem to be most everywhere |
| 23:29 | neilcj | this explains my lack of productivity: survival instinct |
| 23:29 | replaca | you didn't really send it in, did you? |
| 23:30 | brehaut | better hope the international mail system is as bad as its reputation |
| 23:30 | replaca | :) |
| 23:30 | Scriptor | yep, only the procrastinating programmers have survived the generations |
| 23:30 | replaca | no really, he just puts your name up on the list on the site |
| 23:30 | replaca | and that's how you know |
| 23:30 | brehaut | ok cool |
| 23:31 | replaca | you can just annotate your first patch submission or whatever with the "I've sent my CA in and Rich should have it" |
| 23:31 | replaca | if he hasn't gotten around to it |
| 23:32 | brehaut | thats good to know |
| 23:32 | brehaut | assuming he can read my chicken scratch handwriting :/ |
| 23:33 | replaca | well, if it never got there, I assume you can just do it again |
| 23:33 | brehaut | cheers for the info anyway |
| 23:33 | replaca | though, I notice that this is a hurdle that cause a lot of people real problems |
| 23:35 | brehaut | the hand writing bit? |
| 23:35 | amalloy | submitting a CA and waiting, i would assume |
| 23:35 | brehaut | sure |
| 23:37 | replaca | amalloy: something about snail mail and the written document rubs some folks the wrong way. Too high a bar. |
| 23:37 | amalloy | replaca: i didn't like it either |
| 23:38 | Scriptor | isn't the signature required for some legal purposee? |
| 23:38 | brehaut | Scriptor: yes; ensures rich has certain controls over your contributions |
| 23:39 | brehaut | for example he can relicense without requiring he tracks down everyone who has contributed |
| 23:39 | brehaut | the part i dont like is having to trust at least two mail services |
| 23:44 | rt | Anyone mind recommending one of the Clojure books for someone with previous lisp experience? |
| 23:45 | rt | no previous lisp experience* |
| 23:46 | dnolen | rt: Funtional Programming experience? |
| 23:46 | rt | Some, yes, just not any lisps |
| 23:46 | amalloy | (nb: Functional Programming doesn't mean programming with functions, like C. i thought it did for a long time) |
| 23:46 | rt | No, I've worked with scala (as a fp) and some erlang |
| 23:47 | brehaut | rt ive found joy of clojure (pdf beta thing) to be a good book |
| 23:49 | rt | Thanks for the advice, I'll check it out |
| 23:51 | dnolen | rt: if you know/like Scala and Erlang, you should feel at home in Clojure. Clojure is an interesting dynamic lang - it's dynamic type classes are really a killer feature IMO. |
| 23:53 | rt | I'm def. intrigued. Having never worked with lisp, it's a little intimidating, hence the desire for a good book to help me understand how to wrap my head around it. |
| 23:54 | brehaut | rt, what are you finding intimidating? |
| 23:54 | rt | hmm, hard to say honestly. For starters, it's just hard to read for me. I'm sure that will go away with experience, but initially it's a challenge |
| 23:55 | brehaut | rt what editor are you using? |
| 23:56 | rt | basic vi right now…might look for a clojure bundle for textmate or look at getting vi more configured for it |
| 23:56 | brehaut | textmate's clojure story is lagging behind the other major editors |
| 23:56 | brehaut | i use textmate for everything but clojure |
| 23:57 | brehaut | i understand that the vi mode is good though |
| 23:57 | brehaut | dnolen (i think) might be able to give you a better status on textmate support |
| 23:58 | rt | Honestly, I've more been playing with the repl than working with an editor to this point |
| 23:58 | dnolen | brehaut: sweet! I've totally dropped the ball on that, busy with work, and in my free time, Logos. |
| 23:58 | brehaut | dnolen, sweet? |
| 23:58 | dnolen | brehaut: I interpreted you as saying that you might be working on textmate stuff :) |
| 23:59 | brehaut | no sorry |
| 23:59 | brehaut | i have been dabbling with logos though ;) |
| 23:59 | dnolen | brehaut: cool! :D |