#clojure log - Jun 23 2009

The Joy of Clojure
Main Clojure site
Google Group
List of all logged dates

0:10 ninjudd: can anyone here answer a question about zippers and clojure.zip?

0:12 specifically, i'm wondering why clojure.zip/down will descend into non-branches, while clojure.zip/next obeys the branch? function that is passed into zipper

1:01 cp2: hi there

1:01 local barns and noble has stuart's book

1:01 i flipped through it

1:02 pretty good for a new clojure programmer

1:02 good style etc

1:10 lowlycoder: in clojure, can i have threads that don't share haeaps?

1:10 i.e. shared nothing, that can communicate only via message passing?

1:36 justin`: Anyone know how I can change the directory my REPL is looking in with slime?

1:37 or at least how to find out where it's looking

1:37 Lau_of_DK: Java has a userDir variable as I recall, that'll tell you where you are

1:38 justin`: ehh sorry how do I phrase that in clojure? I'm still really new at this

1:42 xeno: Lau_of_DK: I don't remember if it has, but if not, it should be as easy as new File('.').getCanonicalPath();

1:42 only needs to be performed once, since there's no chdir

1:43 justin`: hmm so how would I say that in clojure?

1:44 xeno: I don't know, got my clojure book yesterday :)

1:44 justin`: lol k

1:44 Lau_of_DK: (.getCanonicalPath (java.io.File. "."))

1:44 justin`: I ordered mine today heh

1:44 Lau_of_DK: (usually you'll want to import java.io File though)

1:45 justin`: ok sweet that worked thanks a lot

1:46 Lau_of_DK: np

3:13 combas3d: sorry if this gets asked a lot, but I see that richhicky and kevinoniel both have clojure-contrib packages on github which do I use?

3:16 rich package is only 1mb and kevins is 2.9mb and the documents on installing clojure say to use kevins but that seems strange to me, can anyone explain the difference?

3:21 *crickets*

3:25 hiredman: combas3d: use richs

3:26 kevin's was an unofficial github mirror of the svn repo, but now clojure and contrib have moved to github

3:26 so outdated instructions my refer to kevin's mirror

3:27 combas3d: thanks that makes sense, just the difference in file size worried me and both seemed to be active so I was confuzled

6:45 frodef: I need to capitalize a string, but I'm not sure what's a good way to iterate over a string while building a new one..?

6:47 AWizzArd: frodef: strings are immutable. There is no other option that that.

6:48 frodef: Surely there's an option of building a new string that is a capitalized version of the old one?

6:48 mccraig: frodef: u no want the java method ? : (.toUpperCase "foo")

6:48 or u mean just cap the first letter

6:48 frodef: mccraig: right, first letter only, possibly first letter of each word.

6:49 AWizzArd: I was looking for this some days ago. I did not find a built in method to do that.

6:50 for code that does not need to be very time efficient you could call .split and .toUpperCase

6:50 frodef: but how would you do it yourself? With all this immutability, I only see rather awkward ways of doing it..

6:55 AWizzArd: for me it was not time critical, I just splitted at spaces, then built a sequence of capitalized strings and glued them together

6:55 there are also string buffers for doing this efficiently

6:56 frodef: ok, thanks.

6:56 AWizzArd: you could use something like this: (defn capitalize [string] (apply str (.toUpperCase (str (first string))) (rest string)))

6:57 and then (apply str (map capitalize array-of-splitted-strings))

6:57 it's not efficient, but easy and maybe enough

7:11 achim: str uses a StringBuilder internally, so it should be reasonably efficient

7:16 AWizzArd: yes, but first splitting the string means to create several new ones. Then reading the first element and stringing it also, then rebuilding it via toUpperCase plus building all the rest strings, and then in the end concatenating them again is not too efficient for some specific cases.

7:17 btw achim, are you still in the south or back in the west? :)

7:17 achim: still in the south :)

8:22 lisppaste8: guille_ pasted "What's up with this ArrayList?" at http://paste.lisp.org/display/82333

8:23 guille_: creating an ArrayList, clojure just 'gets' a Class, so it doesn't reach the .add method when doing reflection. what's wrong with this code?

8:28 found, i omitted the new func. over the class name

8:35 AWizzArd: I have (doseq [s ["hello", "world", "and", "moon"]] (println s)) with output "hello\nworld\nand\nmoon\n" but I want "1. hello\n2. world\n3. and\n4. moon\n" as output. What is the idiomatic way to do this?

8:43 Chouser: (use 'clojure.contrib.seq-utils)

8:43 achim: AWizzArd: how about (doseq [[i s] (indexed ["a" "b"])] (printf "%s. %s\n" (inc i) s)) ? indexed is from contrib.seq-utils

8:43 Chouser: achim: I have that loaded in my paste buffer. :-)

8:44 Oh, but I used println and str instead of printf. *shrug*

8:45 AWizzArd: Ah good, indexed sounds fine, didn't remember it.

8:45 danke

8:46 Chouser: "But, a few warts aside, I find very little to complain about with Clojure. It’s actually gotten me back into coding in my free time which I haven’t done in years." ...fascinating. I think that really says something.

8:46 achim: Chouser: heh - there's a reason why some IM apps do these "is typing" notifications

8:49 rhickey_: proposal for template/are: http://groups.google.com/group/clojure-dev/msg/2df101865a378156

8:52 Chouser: I've not used 'are', so my opinion here is worth even less than usual. ...but that doesn't mean I don't have one. :-D

8:52 rhickey_: and it is?...

8:52 Chouser: having said that, I really like the explicit arg list

8:53 _1 _2 seemed a bit ugly and awkward to me, even without the different arg counts compared to #()

8:56 rhickey_: the only excuse for #() is when the fn is tiny, it removes 2 grouping constructs #(foo) vs (fn [] (foo)), and thus enhances the readability of the enclosing block (at least when the body is small, when large not worth it), esp (map #() ...). For these tests it seems the test bodies and args etc dominate the size, and there isn't an enclosing context

8:57 the eval-once aspects of template surprised and confused me greatly

9:00 Chouser: I'd never looked at it closely enough to see that. In fact, I'd have to look at it more to understand.

9:01 Ah, that's the "Any sub-expressions without any _* variables are evaluated when the fn is created, not when it is called." part.

9:02 The few clojure-test tests I've written just used 'is' because I was too lazy to take the time to understand 'are'. :-P

9:03 though it's really great that someone built a good enough framework early enough that we can already have so many regression tests.

9:03 I think that puts Clojure in a better position that it otherwise would be now.

9:04 I have written a batch of JUnit tests in Clojure for work. Not so nice.

9:04 heh, #^lift is cute

9:05 AWizzArd: Now that the Summer has begun more people will become interested in programming again, and also into Clojure.

9:06 Chouser: AWizzArd: really?

9:06 AWizzArd: Between February and May lots of people lose their interest.

9:06 Chouser: Why is that?

9:06 mblinn: seasonal programming depression

9:06 AWizzArd: In many programming channels the number of users goes down. Also the number of posts in newsgroups.

9:06 * asbjxrn fondly remembers school holidays.

9:09 * rys fondly remembers not programming to financial year ends

9:12 rys: financial year seasonal programming disorder....sounds like a wikipedia page in the waiting

9:13 rhickey_: Chouser: yes, the tests and the framework are great to have, just trying to use care when moving across to clojure proper

9:14 Chouser: rhickey_: yes. I fully agree with being careful, but it can be hard to take having a lot of people concentrating on the weaknesses of your code -- I'd hate for anyone to feel belittled when nothing like that is intended.

9:15 So I just wanted to mention that it's good we have a testing code base like this to critique. :-)

9:19 nsinghal: I am doing gen-class, one of the method should return a String array (String[]). How can I define that in the :methods?

9:22 hoeck: WRT 'are': I have found it to be really useful in the last two days, though I would prefer a cleaner approach than the template expansion

9:23 Chouser: ,(class (make-array String 0))

9:23 clojurebot: [Ljava.lang.String;

9:23 Chouser: nsinghal: so probably use a string instead of a bare symbol: "[Ljava.lang.String;"

9:23 nsinghal: there may be a better way, but I think that will work.

9:30 nsinghal: (:gen-class :name MyClass :methods [#^{:static true} [getEntries [Integer] StringArray]])

9:31 Both [Ljava.lang.String; and (class (make-array String 0)) dont work here.

9:32 rhickey_: Chouser: yes, I'm familiar with that feeling :)

9:32 gotta run

9:35 lenst: #=(class (make-array String 0))

9:37 Chouser: :methods [#^{static true} [getEntries [Integer] "[Ljava.lang.String;"]]

9:41 lenst: ,'#=(java.lang.Class/forName "[Ljava.lang.String;")

9:41 clojurebot: [Ljava.lang.String;

9:45 kefka: ,(into-array (Byte/TYPE) [86 87 88])

9:45 clojurebot: java.lang.IllegalArgumentException: argument type mismatch

9:45 kefka: ,(into-array (Integer/TYPE) [86 87 88])

9:45 clojurebot: #<int[] [I@6231ed>

9:50 nsinghal: Thanks for help. #=(class (make-array String 0)) caused clojure.lang.PersistentList to be returned. "[Ljava.lang.String;" worked.

9:53 Chouser: you could also do something like: (defn array-type-str [t] (.getName (class (make-array (resolve t) 0))))

9:53 then use #=(array-type-str String)

9:57 nsinghal: Chouser: I am using (ns ... (:gen-class ... #=(array-type-str String)...): getting Can't resolve array-type-str. I will have to define it in some other library and than do ":use"?

9:58 Chouser: nsinghal: hm, I yeah that's a bit awkward isn't it.

9:58 the literal string that you already have working is probably the "normal" way right now.

9:59 if you want to use something like array-type-str, it would be best to put it in a specific other namespace first.

9:59 nsinghal: Chouser: thanks - using it and it works fine

9:59 yup

9:59 that can be a good utility fn

10:00 Chouser: ...and even then, you couldn't rely on a :require from the ns form you're doing :gen-class in to bring in that other namespace, because the #=() would happen too early.

10:01 a bit of a mess, altogether. Probably the right solution would involve adding a special case to gen-class for arrays.

10:02 nsinghal: yup - i like the simple solution you gave me before. could use a explicit special reader macro or something for gen-class

10:08 AWizzArd: I get a sequence of refs of hashmaps: (filter #(= (:type @%) :category) (find-objects word)). Should this line of code be embedded into a dosync? I would think yes, because in principle the refs returned by find-objects could be changed while filter is running.

10:10 Chousuke: if the hashmaps aren't independent, why not use single ref?

10:11 AWizzArd: They are small objects that may be changed.

10:12 Chousuke: they could still be in a single ref.

10:12 especially if they're small

10:12 Chouser: AWizzArd: the list itself won't change, but if you need a consistent snapshot of the values in the refs, then yes you want a dosync

10:14 Chousuke: if there are lots of threads working on the refs, but generally only change one or two refs per transaction, wouldn't it make sense to have lots of little refs?

10:15 If it was one ref, wouldn't that be an unnecessary bottleneck?

10:16 Chousuke: Chouser: but the transactions would be commutative wouldn't they? It might still work.

10:17 Chouser: it would work, but they'd have to go in order.

10:17 it would still be "correct" but I think it might be less efficient than it could be.

10:18 Chousuke: it'd be a lot simpler though :/

10:19 AWizzArd: I have a ref on a set of refs on hashmaps, and I need that.

10:21 Chousuke: if you're going to have things often "locking" all the refs for reading, it's going to hurt performance.

10:23 Chouser: but a dosync that just reads doesn't need to block writers or other readers.

10:23 Chousuke: does it need a dosync? wouldn't a (doseq [x refs] @x) do?

10:24 it has to be non-lazy, anyway

10:27 except not doseq but the other thing that returns the results :P

10:27 * Chousuke always confuses these

10:58 AWizzArd: yes, i think my example with filter from above would require a doall

10:58 what if my filter inside a dosync wants to return a lazy seq of two objects, i read one, wait 5 minutes and read the second?

10:59 Chouser: I assume returning a lazy seq to outside the dosync has the same kinds of problems as lazy seqs and any other dynamic scope.

11:00 that is -- the transaction will be gone, and you'll end up doing a flying read when the lazy seq is realized.

11:59 _hrrld: I've been using println to report some status to stdout, but now I don't want the newline, so I switched to print, but now it doesn't seem to be flushing the stream. Do I need to do something explicit to flush the stream when using print instead of println?

11:59 Chouser: yes. (flush)

12:00 _hrrld: heh, I should have guessed... Thanks, that works a treat.

12:00 gnuvince: (doc flush)

12:00 clojurebot: "([]); Flushes the output stream that is the current value of *out*"

12:00 gnuvince: neat

12:01 I always used the Java interop to do that

12:01 lpetit: Hi, a quick tour in #clojure for gathering more feedback for the new name of clojure-dev :-)

12:01 Chouser: it's amazing how long you can use clojure and still find new little tidbits like that.

12:01 I haven't fully integrated select-keys into my toolbox yet.

12:01 lpetit: welcome!

12:02 lpetit: this is the IntelliJ plugin?

12:02 lpetit: This is the eclipse plugin

12:02 Chouser: oh, sorry.

12:02 lpetit: no problem !

12:03 So far we have as candidates : cljdt (clojure development tools) , eclojure , eclipje , clojure-eclipse and some exotic variations : Clojipsy , eclojion

12:04 Some have argued that eclojure may be too close to enclojure (netbeans plugin), but I can't ban it since it seems to me very appropriate as a contraction of eclipse and clojure ... what do you think ?

12:06 Chouser: I agree it's too similar. I suppose eclipsjure or something might be ok.

12:07 Personally I'd vote for clojure-eclipse, though I'd understand if you found that too vanilla.

12:07 clojurebot: for is not used often enough.

12:08 lpetit: eclipjure ?

12:08 :-$

12:09 cemerick: cljdt is very eclipse-esque. I'm not in that world anymore though :-)

12:09 lpetit: well, sometimes you don't have a choice, and make the best you can with the tools you have :-)

12:10 cljdt is close to the matching criteria, but I'm looking for a way to make a more pronounciable variant of it ( some vowel would be welcome :-)

12:11 Chouser: cloj-dot

12:11 lpetit: what rationale behind cloj-dot ? (would'nt it be more appropriate for the visual studio dot net - still missing :-) - plugin ?

12:12 Chouser: just inserting vowels in cljdot

12:12 lpetit: ah ok you added the missing vowels

12:12 Chouser: :-)

12:12 not very original, I know.

12:14 Chousuke: makes me think of "clod" :P

12:15 lpetit: BTW , do you know, in the 'enclojure' name, if there is an implicit reference to netbeans ? (for example, if we choose cljdt, this will really be an implicit/cryptic reference to eclipse for even eclipse users that don't know JDT and CDT are the names of the java/c/c++ eclipse environments)

12:19 dhaza: cljdt looks like line noise

12:20 but i guess it would be good for getting relevant information from google searches

12:20 lpetit: eclipjure ?

12:21 Chousuke: no more jures please ;/

12:21 cp2: my local barnes and noble has stuart's book

12:21 i looked through it a bit

12:21 pretty good

12:22 lpetit: Well, we have enclojure , vimClojure , why should the eclipse plugin be excluded from the trend ? :-)

12:23 cp2: clojure-mode ;P

12:24 lpetit: Christophe suggested eclojion . What do native english speakers think about placing j and i so close ? would it be easy to spell ?

12:24 clojurebot: What is meta

12:25 lpetit: It's been a long time since I've been here on #clojure. Does clojurebot start to live its own life, or can someone explain me why it is intervening from time to time ? :-)

12:25 eclojion would avoid having another "jure" :-)

12:26 Chousuke: But it looks weird :P

12:26 dhaza: clojumbra

12:26 see what i did there

12:29 Chouser: ~I was trying to think of a good name, when suddenly...

12:29 clojurebot: CLABANGO!

12:30 justin`: what about Clabing, what lisp needs is a good rebranding

12:30 Chousuke: :P

12:31 lpetit: Chouser: did I miss something ?

12:32 Chouser: hm? I don't think so.

12:33 lpetit: Chouser: when you wrote with the side effect of having clojurebot say "CLABANGO!"

12:33 Chouser: did you just want to make this effect, or your sentence really was not ended ? :-)

12:34 _hrrld: ~hmmm, when suddenly...

12:34 clojurebot: CLABANGO!

12:34 Chouser: lpetit: just the effect. A joke. Unless of course you like the name clabango.

12:34 lpetit: _hrrld: yes, I have since understood how it works :-)

12:34 Chouser: It's a good name looking for a project.

12:35 dhaza: is cluje taken?

12:35 crajy

12:35 yo dis shit is crajy man

12:35 Chousuke: j is overused :>

12:36 lpetit: clabango would have little to do with eclipse and clojure (but still starts with cl) but it indeed looks nice. But I can see an already existing project created by Lau of DK on github :-(

12:36 well, Lau of DK == Chouser ?

12:37 no wait, sorry

12:38 yes, j is overused, jure is overused, but we're speaking about a project forced to change its name !

12:40 I must leave, thanks for sharing your thoughts (and since I don't track #clojure regularly, please answer to the "poll" on the clojure ml if you have an interesting suggestion, so that I don't miss it)

12:40 CU

14:13 technomancy: ow my eyes!

14:14 * technomancy just did ps awx | grep java while hadoop was running

15:23 vagif: Hello, any compojure users ?

16:06 ninjudd: anyone who can answer some questions about the clojure zipper library?

16:07 kotarak: ninjudd: well... just ask your questions and we'll see...

16:08 ninjudd: ok. i have some metadata stored on my nodes, and it seems like doing a replace and then a call to root is removing it

16:09 kotarak: The zipper library uses the metadata... Just a sec...

16:10 hiredman: and it uses with-meta

16:10 ninjudd: i can make the nodes a heavier structure and write my own branch? and children methods, but it seems like the metadata on nodes shouldn't be removed

16:10 hiredman: which overwrites the metadata map

16:10 ninjudd: unless clojure doesn't allow metadata on an array and items in the array

16:11 Chouser: zip-filter decorates zipper nodes with its own meta-data tag.

16:11 hiredman: ninjudd: do you really mean array, or do you mean vector?

16:12 metadata cannot be added to arrays

16:12 ninjudd: it seems like clojure.zip adds metadata to the zipper data structure (which is an array of two elements), but i can't see where it adds metadata to the nodes themselves

16:12 sorry.. i meant vector

16:12 hiredman: ninjudd: not an array

16:12 kotarak: hmmm... But zip uses metadata on a vector containing the node, that shouldn't affect the node itself, no?

16:12 ninjudd: kotarak: right, that's what i though

16:12 thought

16:13 hiredman: ah, right

16:14 kotarak: But up makes a new node. ninjudd: do you provide your own make-node?

16:15 ninjudd: no

16:16 i think that's it. i need to write my own make-node that preserves metadata

16:17 hmm.. it looks like i may have to patch clojure.zip/up and down to preserve metadata

16:17 kotarak: ninjudd: no. That should not be necessary.

16:19 ninjudd: kotarak: you're right. the problem is that vector-zip's make-node ignores the previous node altogether

16:20 so i can either patch vector-zip or call zipper directly

16:20 kotarak: It should probably transfer metadata if there is.

16:20 Chouser: kotarak: yeah, sounds right to me.

16:20 kotarak: Shall I add a ticket and provide a patch?

16:21 Chouser: kotarak: only rhickey can make that call.

16:21 ninjudd: yep, calling zipper directly works. i can submit a patch to seq-zip and vector-zip on github

16:21 Chouser: if rhickey doesn't respond here, you can mention it on the google group.

16:21 ninjudd: ok

16:22 one more question about zippers:

16:22 Chouser: ninjudd: a patch would be welcome if you've submitted a CA, but please see http://clojure.org/patches

16:22 ninjudd: it seems like zip/down will descend into things that aren't branches

16:22 while zip/next will skip them

16:22 kotarak: I have CA filed. I'll see, whether I get git running. :)

16:23 Chouser: Oops. I think "a patch will be welcome" is exactly what I'm not authorized to say. :-P

16:23 kotarak: ~bat light

16:23 clojurebot: It's greek to me.

16:23 kotarak: Hmm.. Ok.

16:23 ninjudd: kotarak: ok, i'll read the patches page first

16:24 kotarak: rhickey: should vector-zip and seq-zip move metadata if available when creating a new node?

16:26 ninjudd: kotarak: did you catch my second zipper question, or did it get lost in the stream?

16:27 kotarak: oeh... the one about down?

16:27 ninjudd: yeah

16:27 basically, zip/down doesn't obey branch?

16:28 rhickey: kotarak: yes, patch welcome

16:28 kotarak: k

16:32 hiredman: ninjudd: eh?

16:33 ninjudd: rhickey: thanks, i'll send a CA and submit the patch on github

16:33 hiredman: eh, what?

16:36 hiredman: how does down not obey branch?

16:37 ninjudd: vector-zip defines branch? to be vector?, but it will still descend into non vectors

16:38 hiredman: ah

16:38 explains why I never ran into that (never did zippers on vectors)

16:38 hmmm

16:39 seq-zip does it too

16:39 :(

16:39 well, I suppose that sort of makes sense

16:39 ninjudd: for example:

16:39 clojurebot: for is not used enough

16:40 ninjudd: (-> (clojure.zip/vector-zip '[(1 3) (2 4)]) clojure.zip/down clojure.zip/down)

16:40 => [1 {:l [], :pnodes [[(1 3) (2 4)] (1 3)], :ppath {:l [], :pnodes [[(1 3) (2 4)]], :ppath nil, :r ((2 4))}, :r (3)}]

16:40 it should not descend into the sequence, right?

16:40 hiredman: ninjudd: I agree

16:41 ninjudd: hiredman: seems like it should just return nil if you try to descend too far, right now it throws java.lang.IllegalArgumentException

16:44 maybe i'll work on a patch for that too

16:44 kotarak: ok. ticket created with patch attached.

16:45 I didn't find the "Choose an action..." though...

16:46 ninjudd: kotarak: is that a patch for the vector-zip thing? or something else?

16:46 kotarak: the metadata thing in the zipper

16:47 ninjudd: oh sweet, thanks!

16:47 kotarak: #134

16:47 bpattison: is there an easy way to get the count/length of a list?

16:47 kotarak: (doc count)

16:47 clojurebot: "([coll]); Returns the number of items in the collection. (count nil) returns 0. Also works on strings, arrays, and Java Collections and Maps"

16:48 bpattison: thanks

16:48 kotarak: beware of (iterate inc 0) ;)

16:49 bpattison: lol -- wouldn't be the first time I had a stack over flow

16:50 ninjudd: kotarak: what do you think about a patch for the branch? issue with zip/down?

16:51 kotarak: ninjudd: well.. that's rhickey 's decision. If you says, yes, I can provide one.

16:51 s/you/he/

16:52 ninjudd: rhickey: what do you think? should zip/down refuse to descend when branch? is false?

16:52 rhickey: ninjudd: it is refusing to descend

16:54 ninjudd: rhickey: are you sure? try (-> (clojure.zip/vector-zip '[(1 3) (2 4)]) clojure.zip/down clojure.zip/down)

16:57 rhickey: ninjudd: ah, I thought it threw and you wanted nil

16:57 ninjudd: or it could throw an exception

16:57 kotarak: down only checks whether there are children, vector-zip uses seq for children, it doesn't check for branch?

16:58 ninjudd: rhickey: right now, it just descends into the list

16:58 kotarak: oh right, this could also be fixed through a patch to children

17:00 kotarak: hmm... Is it better to check for branch? in down and throw an exception? Or should it just ignore the fact and return nil for children of nodes for which branch? is false?

17:02 ninjudd: if you do the check in (defn children... then you can keep the calls to zipper simpler and you get it for all future zippers too

17:04 perhaps.. (if branch? ((:zip/children ^loc) (node loc)))

17:09 rhickey: children could check if node is branch and throw if not

17:09 kotarak: rhickey: should it throw or return nil?

17:11 rhickey: throw

17:11 kotarak: k

17:25 ninjudd: yeah, throwing is more consistent with the rest of clojure.zip

17:26 kotarak: thanks for the quick response and patches!

17:26 kotarak: ticket #135 with patch created

17:26 np

18:55 krumholt_: how can i exit the repl?

18:57 ataggart: ctrl-D ?

18:58 krumholt_: oh thanks :) i tried (quit) and (exit) and lots of others

18:59 ataggart: heh

19:00 this would work too: (System/exit 0)

19:10 hiredman: I bought programming in clojure last night from amazon, today I was at barnse and noble and they had two copies, then when I got home my copy was waiting in front of my door

19:11 slashus2: It is neat that they have it at b&n.

19:31 cp2: hiredman: same

19:31 well, the b&n part

19:52 krumholt_: i am trying to run the ant.clj example. it is working but the window is not repainting. what could be the problem?

22:19 hiredman: http://sellmic.com/blog/2009/06/11/classpath-hell-just-froze-over/ <-- java module system

22:25 holmak: hiredman: !

22:25 hiredman: Good catch!

22:27 hiredman: nah, just repasted from #java

23:35 plymouth: ah friends, it doesnt matter if you're a man or a woman if you're in love with someone these are the words you've gotta learn to say

23:38 hiredman: clojurebot: ping?

23:38 clojurebot: PONG!

23:39 * cp2 dawns his I-SURVIVED-THE-NETSPLIT t-shirt

23:39 holmak: don't provoke the bot, man

Logging service provided by n01se.net