#clojure log - Jun 10 2009

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

0:32 hiredman: clojurebot: what do you have to say about the reader syntax of collections?

0:47 Q - How exactly does an agent protect its "state" from concurrency

0:47 issues, particularly race conditions since I do not see any locking on

0:47 agents.

0:47 * hiredman giggles

1:19 cataska: is this possible ? (defn 1+ [x] ... )

1:21 Cark: defn |1+| would be possible, but that doesn't help much =)

1:21 anyways you have the inc function

1:21 ,(doc inc)

1:21 clojurebot: "([x]); Returns a number one greater than num."

1:23 hiredman: (let [+1 inc] (+1 1))

1:23 ,(let [+1 inc] (+1 1))

1:23 clojurebot: java.lang.Exception: Unsupported binding form: 1

1:23 hiredman: bah

1:23 Cark: that's not common lisp =)

1:24 hiredman: ,(let [++ inc] (++ 1))

1:24 clojurebot: 2

1:25 hiredman: ,(let [+1+ inc] (+1+ 1))

1:25 clojurebot: Invalid number: +1+

1:25 cataska: so in clojure, cant define a method that number characters have precedence ?

1:27 Cark: mhh i don't understand your question

1:28 cataska: sorry, poor english

1:28 Cark: hehe no problem, my english is pretty bad too

1:28 cataska: like 1+ function, so can't define method named 1step, 2more etc in clojure ?

1:30 Cark: looks like you can't do that

1:31 cataska: mmm

1:32 feel sad

1:35 replaca: ,(let [_1+ inc] (_1+ 7))

1:35 clojurebot: 8

1:35 replaca: not beautiful, but...

3:15 frodef: am I supposed to fetch clojure contrib by svn, or does it come prepackaged somewhere?

3:17 replaca: mostly you grab it by svn

3:18 there is also a github mirror, if you prefer

3:22 frodef: ok, thanks. I thought maybe I'd missed some obvious other source.

3:47 rys: Yeah, I think most people build it themselves from current head

4:02 opqdonut: does nested doto work properly?

4:04 Cark: opqdonut : yes

4:04 though it does not make sense to have them directly nested

4:05 (doto something (doto bleh does not make sense

4:05 opqdonut: (doto something (foo) (doto (.getOther) (bar)))

4:05 Cark: well this does not make sense

4:06 the first parameter of your second doto will be replaced with "something"

4:06 you should try to macroexpand and understand how that works

4:07 opqdonut: macroexpand doesn't expand macros in subforms

4:07 clojurebot: Holy Crap.

4:07 opqdonut: but yeah, i see the problem

4:08 hmmh.

4:08 Cark: it does not matter that the second doto is a macro or not, it gets macro expanded after we're done with the first doto

4:10 mhh i see what you want to do .. i guess you'll have to use a let

4:18 opqdonut: Á/act

4:18 oops

4:18 yeah, i'll use a let

7:23 cemerick: despite my ravings w.r.t. swing, clojure + netbeans/matisse + a REPL + a good cells impl is a wonderful way to build UIs.

7:26 jdz: give screenshots!

7:27 cemerick: heh

7:27 oh, it's not pretty, just functional

7:28 asbjxrn: Which cells implementation are you using?

7:28 jdz: nvm then. we want pretty screenshots :)

7:28 cemerick: I'm by no means a designer, so it's definitely lacking a certain something. Using substance helps spruce things up, though (and targetting just one L&F is a great way to simplify one's life).

7:29 asbjxrn: our own. We needed some specific characteristics for our core functionality, but it's worked out to be very useful in general.

7:32 At some point, I suppose we could open-source it, but I'm guessing people would find it a little odd -- in particular, the state transitions are event-based, which allows us to keep a "redo log" to support reasonable runtime given nondeterministic workflows.

8:33 opqdonut: is there an easy way to proxy an already constructed object

8:33 instead of constructing a new one?

8:34 i just want to wrap a few utility methods into this object i get from somewhere else

8:34 Chouser: you could create a new instance that delegates to the given object

8:35 ...using proxy.

8:36 I've done that for a specific class -- I suppose with some reflection you could make a utility that does it automatically.

8:36 opqdonut: yeah

8:36 there's a ton of methods to proxy, reflection would be the way to go

8:51 cemerick: Chouser: have you ever considered maintaining a git repo of the #clojure transcripts? That would save your server from my occasional scraping runs. ;-)

8:51 Chouser: ha

8:51 !

8:52 I actually did think of that in the last couple days.

8:53 cemerick: google search is just so friggin' crummy in a lot of contexts...there's often no substitute for having the thing on disk.

8:53 Chouser: I'm working on the log stuff these days -- I have plans for getting the page to update withing seconds instead of once a day.

8:54 cemerick: what's actually doing the logging? is it just your local irc logs?

8:54 rhickey_: github vs assembla+git vs assembla+github?

8:54 cemerick: local irc client logs, I mean

8:54 Chouser: cemerick: yeah, right now it's the logs from the irssi client I'm typing in right now.

8:55 cemerick: we've got a bus problem ;-)

8:55 Chouser: cemerick: the code's all on github now at least

8:57 cemerick: I'm kind of surprised that freenode doesn't offer a logging service. I'd think that'd be a great revenue stream for them.

8:59 Chouser: well, anything that didn't require me to write and maintain could would be nice.

8:59 code

8:59 rhickey_: trying to choose a new host for use with git. github seems to have a dearth of tools, and their pages always mess with my browser. I like assembla's tool suite. They can host git or update tickets from github. I guess the main difference would be browser-hosted source viewing

9:00 cemerick: rhickey_: this is for your "real work"?

9:00 rhickey_: this is for Clojure

9:00 Chouser: assembla doesn't provide source viewing in the browser?

9:00 cemerick: oh. I didn't realize a move from google code was in the cards.

9:00 rhickey_: Chouser: it does, but I imagine differently from github

9:00 cemerick: move to git implies move from google code

9:01 cemerick: rhickey_: I thought you were just going to use git-svn. Fine by me, though! :-)

9:01 rhickey_: I imagine github being the most git savvy, also has the social aspects of git nailed

9:01 asbjxrn: Speaking of browser and messing up, the top of the clojure.org page looks funny from my office. (Where I have the choice of using IE6)

9:01 rhickey_: cemerick: git-svn didn't really deliver benefits of git

9:02 cemerick: yeah, that's an understatement

9:03 I'd say +1 for github. assembla is nice, but they're definitely svn-focussed

9:03 Chousuke: gitorious might be good too

9:03 rhickey_: cemerick: the nuanced choice is assembla+github: http://www.assembla.com/catalog/13-Assembla-Ticketing-for-Github-Package

9:04 cemerick: oh, that must be relatively new

9:04 Chousuke: do you happen to use it locally?

9:05 rhickey_: cemerick: I really want a place we can use to collaborate - tired of emails and other primitive things. Assembla milestones, logged chat, messages, wysiwyg wiki, etc are highly desired by me

9:05 cemerick: we currently use gitosis, but would much prefer something like gitorious. Unfortunately, setting it up turned out to be nontrivial.

9:05 Chousuke: cemerick: nah, but it looks interesting

9:05 cemerick: rhickey_: well hell, if the integration is there, then by all means

9:06 best of both worlds, if I'm to be taken by the sales copy :-)

9:06 rhickey_: cemerick: I don't know what the loss is, and as I said, find github's code browsing web interface troublesome

9:07 Chouser: when do you browse sources on the web?

9:08 duck1123_: I use github's code browsing over google's currently when i need to refer to clojure source

9:08 Chouser: I do that mostly on projects that I haven't yet cloned -- reading examples, copying snippets, evaluating the project.

9:08 rhickey_: Chouser: more often then I thought - when pointing someone at some code, looking at contrib I haven't yet pulled, history, etc

9:09 Chouser: hm. I guess if you'll be evaluating repos to consider pulling patches from them into clojure, you'll only be doing more of it.

9:10 Can we not just fix that one page, if that's your biggest issue with github?

9:10 rhickey_: github is definitely not enough, but it could host the source

9:11 bbl

9:11 Chouser: rhickey_: you don't happen to use greasemonkey or stylish, do you?

9:11 swingandamiss

9:13 cemerick: it's too bad jira studio doesn't have github integration. Though JIRA probably isn't Rich's style.

9:15 mccraig: github's network view is really interesting... do other git hosts have similar ?

9:16 rys: I think there's a lot to be said for github. The connected view/network, tracking and pull request stuff is really good, and the code and diff browsing has always worked for me

9:18 cemerick: I'd imagine that they can't be far away from offering a complete solution. It's surely a common set of requirements.

9:19 opqdonut: gah, what causes java.lang.ClassCastException: clojure.lang.PersistentList cannot be cast to clojure.lang.Symbol

9:19 clojurebot:

9:19 opqdonut: when loading a file

9:22 Chouser: opqdonut: That means some piece of code is expecting a symbol and finding a list instead

9:22 I would guess it's incorrect arguments to a macro, but that's just a guess.

9:22 opqdonut: yeah i found the problem

9:22 annoying to debug these

9:22 line numbers would be nice

9:23 Chouser: you should get a line number

9:23 did you look at a full stack trace?

9:23 asbjxrn: rhickey_: The chat/messaging features: do you consider it an addition or replacement for google groups/freenode?

9:24 opqdonut: Chouser: yes i did, the line number was 1 but the error was much later in the ns macro

9:24 Chouser: oh, I see.

9:41 rhickey_: it looks like assembla internal git ticket integration is the same as assembla+github

10:33 sh10151: Hi -- any reason :refer-clojure :exclude might not work per the docstring in Clojure 1.0 ?

10:34 Chouser: sh10151: nope, ought to work.

10:34 sh10151: well feh

10:35 Chouser: (ns foo (:refer-clojure :exclude (map))) ...then type map at the repl and it fails to resolve

10:35 sh10151: I've got (ns myns (:refer-clojure :exclude [replace])) and it still fails to compile based on using clojure.core/replace

10:40 Chouser: looks right to me. note that won't remove 'replace' if the namespace exists already

10:41 sh10151: ah that's probably it

10:41 thanks

10:41 Chouser: so if you were already running clojure, you'll either have to remove 'replace' manually or restart clojure.

10:43 sh10151: does changing the parameters to ns do anything if the namespace already exists, or is it just this one :refer-clojure :exclude that doesn't work?

10:43 Chouser: that's actually a rather interesting question

10:43 sh10151: e.g. I want to add some :imports and whatnot :)

10:43 Chouser: I think it'll do "additive" things

10:44 in general 'ns' is meant to be run once per namespace, but of course reloading a file that include 'ns' isn't prevented in any way.

10:45 adding new :imports or :requires, etc. should work. but adding more :excludes probably won't.

10:49 stuartsierra: You can also call import/require/use directly.

10:50 sh10151: well, I am trying to write a script and don't want to accidentally depend on some state of the repl when I was writing it.

10:50 maybe I should add remove-ns to whatever runs when I do C-c C-k in slime

10:56 well, I don't think that was a good idea

10:56 didn't seem to work after I did a remove-ns manually once

10:58 ah, nm, I had it set up with a forward reference -- same problem as before, the namespace already existed when compiling

11:02 rhickey_: hmm... who took clojure on twitter?

11:03 gnuvince: "took it"?

11:03 the username?

11:04 rhickey_: gnuvince: yes

11:07 gnuvince: Hmmm

11:07 I don't know who that is

11:09 rhickey_: seems like keeping the git repo in assembla and mirroring on github might give us the most flexibility

11:17 sh10151: What's a good way to get the effect of forward references? My script reads better with the more declarative part at the top and the implementations at the bottom.

11:20 stuartsierra: sh10151: (declare var1 var2 ...)

11:21 sh10151: thanks

11:26 danlarkin: apparently the palm pre runs java5 SE

11:26 apache harmony

11:34 leafw: 5

11:34 ~5

11:34 clojurebot: Excuse me?

11:34 leafw: ~'5

11:34 clojurebot: No entiendo

11:36 Chouser: ,5

11:36 clojurebot: 5

11:36 Chouser: ,'5

11:36 clojurebot: 5

12:19 rzoom: is it possible to "unpack" a list/vector to be args for a function?

12:19 technomancy: clojurebot: tell rzoom about destructuring

12:19 clojurebot: destructuring is http://clojure.org/special_forms#let

12:20 technomancy: ,((fn [[a b c]] (+ a c)) [1 2 3])

12:20 clojurebot: 4

12:21 technomancy: rzoom: like that; just put a vector inside the arguments vector

12:21 Chouser: rzoom may actually be asking for apply

12:21 rzoom: I think that technomancy is right

12:21 technomancy: this is also possible.

12:21 rzoom: technomancy: thank you! I will take a look at this.

12:21 technomancy: np

12:22 Chouser: ,(apply (fn [a b c] (+ a c)) [1 2 3])

12:22 clojurebot: 4

12:22 technomancy: apply does the same thing if you want to "unpack" it on the caller side rather than the fn definition

12:22 rzoom: ahh. I see.

12:23 I think that I will go for the "apply" version since it doesn't change the function definition, will keep the intent of the function more clear.

12:29 hmm. this makes me wonder though, could you expand a list for creating a struct?

12:29 e.g. (defstruct s :a :b)

12:29 then: (struct s (1 2))

12:30 but that just sets :a to (1 2)

12:30 not :a=1 and :b=2

12:31 dnolen: rzoom: struct is a function you can use apply

12:31 (apply struct s [1 2])

12:32 rzoom: dnolen: perfect! thanks.

13:37 rhickey_: hmmph - assembla code browser has no .clj syntax highlighting

13:39 Chouser: github was impressively early with that.

13:40 rhickey_: are they using Pygments?

13:41 I can't tell what Assembla is using, just found one message asking for Fortran :)

13:41 technomancy: I think they use pygments, yeah

13:42 something like 35 languages supported

13:44 I like how three of the top-5-watched Java repositories are for other languages: http://github.com/languages/Java

13:44 (ioke, clojure, and couchdb-lucene)

13:44 and jruby was on that list last time I checked.

13:46 cemerick: that's a very interesting stat

13:46 I should checkout ioke, I know nothing abou tit

13:47 Chouser: there's seriously more ObjC in github than there is Clojure?

13:47 rsynnott: is that surprising?

13:47 gnuvince: Chouser: is that really surprising?

13:47 technomancy: cemerick: it's pretty influenced by io, I think.

13:47 rsynnott: objc is the primary language used to write software for macs, which are 10% of the desktop market

13:47 cemerick: heh, another language I know virtually nothing about :-)

13:47 technomancy: biggest difference so far seems to be that you can actually google for it

13:47 clojurebot: for is not a loop

13:48 technomancy: cemerick: basically: prototype-based OO without the insanity of JS.

13:48 cemerick: I took the basic -> CL -> scheme -> java -> python -> scala -> clojure path

13:48 Chouser: I guess NeXT lives on...

13:48 rsynnott: Chouser: as the basic of MacOS X and the iPhone, yep

13:48 technomancy: also: github is very mac-dominated

13:48 gnuvince: cemerick: no C?

13:49 The jump from BASIC to CL is also interesting

13:49 cemerick: JS has been my sole exposure to prototype-based OO, so maybe that accounts for my poor opinion of it.

13:49 gnuvince: yeah, a very little C in the very beginning (and scattered about when I've been unlucky), as well as assembler on the C64.

13:49 rsynnott: MacOS X is basically a pretty NextSTEP with a bunch of compatibility APIs

13:50 (many macos apps can actually be compiled using openstep)

13:50 cemerick: gnuvince: I was using realbasic on the Mac to build custom apps while in high school, and then was dropped straight into CL when I started college.

13:50 gnuvince: rsynnott: what do you mean "pretty NeXTSTEP"? I think it was a very nice interface.

13:50 rhickey_: what's the best recipe for one-time conversion of svn to git?

13:50 * rsynnott started with Pascal. Scarred for life :P

13:51 rsynnott: (not nice modern pascal, the one where a 40 character string was an entirely different thing to a 41 character string :) )

13:51 cemerick: rhickey_: best recipe I've seen, used it at least 20x times so far: http://blog.zobie.com/2008/12/migrating-from-svn-to-git/

13:51 gnuvince: rsynnott: ouch :-/

13:52 cemerick: rhickey_: note that the nifty sed/script one-liners he provides to convert svn tags/branches depend on bash. tsch chokes on them.

13:53 technomancy: cemerick: can't git-svn figure out the branches/tags by itself now?

13:54 cemerick: technomancy: it does, but it puts those refs under a different directory structure than "native" git branches/tags

13:54 technomancy: iirc there's a git-svn clone flag saying "this svn repo just follows the standard trunk/tags/branches layout" that takes care of that for you

13:54 cemerick: oh, gotcha.

13:54 cemerick: I'll bet you could just mv the refs in one shot without the sed one liners, but they work, so I use them :-)

13:54 technomancy: it's been a while for me, even when I was tracking svn repos I was doing all my branches in git, so I wasn't concerned with that.

13:55 * rhickey_ groans

13:56 technomancy: kevinoneill on github has got his mirror all set up; you could probably just use that.

13:57 eevar: just clone kevinoneill's repo ;)

13:57 rhickey_: what about: http://github.com/jcoglan/svn2git/tree/master ?

13:57 eevar: no branches in there?

13:58 or nm

13:58 cemerick: yeah, we have a constantly up-to-date repo as well. *shrug*

13:58 eevar: bah

13:59 technomancy: I guess the one downside of kevinoneill's repo is that it keeps the authors in SVN style. if it's important to have that formatted properly then you should do your own import, otherwise use his.

14:00 rhickey_: it seems authors, branches and tags are issues over and above git-svn

14:00 technomancy: right, but kevinoneill has got branches/tags figured out.

14:00 svn2git looks like it's at least worth a try

14:01 cemerick: rhickey_: FWIW, the recipe I linked to describes how to handle all of that, and it does work.

14:02 rhickey_: cemerick: it's much more complicated than other recipes that claim to do the same

14:02 * cemerick stopped looking once he found something that worked, apparently :-)

14:03 cemerick: thankfully, I don't have any other svn repos to convert anymore.

14:03 technomancy: cemerick: yeah, rub it in. =)

14:04 cemerick: technomancy: yeah, even better, those svn repos that I follow in general are moving to git themselves, so I won't even be using git-svn for very long.

14:04 Chouser: contrib already has a couple set of author ids, I think. One from sourceforge and one from google code.

14:05 rhickey_: Chouser: I guess we'd need everyone's git identities?

14:05 I guess base on Google IDs

14:06 technomancy: it's just name and email, right?

14:06 rhickey_: but not necessarily the same for some folks

14:07 stuartsierra: I don't have a personal github acct.

14:07 rhickey_: assembla wants the email you register with them to match user.email

14:07 in git config

14:08 technomancy: you don't need a github account for this

14:08 Chouser: git itself doesn't tie any permissions or anything to the author id, I think.

14:08 rhickey_: right

14:08 eevar: also, users can assign any email address they control to their git account

14:08 Chouser: eevar: github?

14:08 I think the same is true of assembla

14:08 eevar: assumeing we talk github, yea

14:08 -e

14:11 rhickey_: I don't know that we can presume contrib authors will use the same gmail email with assembla and in their git user.email config

14:11 eevar: people might have issues with their email being published, tho

14:13 mrsolo: too bad partial only work first agrument.

14:13 rhickey_: eevar: does it get published as a result of being in user.email?

14:13 mrsolo: rather can't skip argument hmm

14:13 technomancy: mrsolo: you could probably write partial that filled in args from the right pretty easily

14:13 rhickey_: mrsolo: try #()

14:13 technomancy: rpartial

14:14 ataggart: is there anything partial will do for you that #() won't?

14:15 stuartsierra: no

14:15 partial predates #()

14:15 mrsolo: no

14:15 but partial is build in vocab..it is nice :-)

14:15 Chouser: some things you can do with partial would require something like #(apply foo a y %&)

14:16 ...in which case partial may look cleaner

14:16 hiredman: ataggart: partial is a nice higher order function, which are good for you, like wheaties

14:16 ataggart: ah like (partial + 5) == #(apply + 5 %&) ?

14:17 eevar: rhickey: email addresses would be accessible from the repo

14:17 if you use those as git IDs

14:18 mrsolo: technomancy: yea can be done easily oh well will dump this in my util ns.. rpartial and npartial :-)

14:21 rhickey_: eevar: oh well, seems like it's required

14:29 eevar: don't know. think you can stuff any crap you want into the identity fields, if they are even required

14:31 rhickey_: eevar: no, assembla won't take pushes without emails + ssh keys matching your user profile, which is a validated email

14:32 which is a non-problem as far as I'm concerned - people shouldn't write open source in anonymity

14:32 cp2: hi rhickey_

14:32 rhickey_: cp2: hi

14:37 eevar: rhickey: having my main address harvested by spammers would suck. i'm not a contributor, tho. ;)

14:38 rhickey_: eevar: it just has to be a valid address you own, not your main one

14:40 eevar: yea, thinking of existing contributors and their svn -> git username mapping, if you go that route

14:41 rhickey_: eevar: that goes to my point, we can't presume what email they'll want to use with git

14:42 cemerick: there can't be that many...?

14:42 by that I mean, each contributor can just declare their preference.

14:43 rhickey_: cemerick: sure, I just can't make up the authors file right now

14:45 replaca: rhickey_: also, most of the contributors probably also have an email set up for github (I know I do)

14:47 eevar: possible to just push the repo with svn user names for now, and rewrite history when/if contributors set up github/assembla accounts?

14:48 rhickey_: eevar: I'm not going to start off by rewriting history :)

14:48 eevar: would probably wreak havoc on the people who cloned the repo, yea ;)

14:49 technomancy: that's fine for just experimenting, but you wouldn't want to make that public.

14:49 there's only a handful of people with commit rights anyway, it shouldn't take long to get a preferred address for all of them

14:50 replaca: rhickey_: I'll start your translation file with tomfaulhaber at google == github_com at infolace.com on github

14:51 technomancy: wait, rich is still the only committer for clojure itself, right? so this is only an issue for contrib?

14:52 replaca: technomancy: yeah

14:53 * technomancy thinks clojure could go first with contrib following once the data has been collected

14:53 technomancy: no need to have a simultaneous migration

15:00 rhickey_: contrib members have been invited to assembla

15:08 replaca: rhickey_: saw it. Hey, do we know anything about hacking the wiki programmatically? On google I just did it through svn

15:08 rhickey_: replaca: just looking at that!

15:09 there's an API: https://www.assembla.com/wiki/show/breakoutdocs/Document_REST_API

15:09 but I don't see wiki push

15:14 replaca: rhickey_: I was looking in the same place, but it didn't seem right

15:16 mrsolo: is there an easier way to do this? http://paste.lisp.org/display/81665

15:26 Chouser: mrsolo: you don't know the class of (time-now) at compile time?

15:26 replaca: rhickey_: of course, it doesn't have to be wiki. If they supported another type of doc that got rendered as html, that would be OK too. We might be able to do something on github along the lines of the blogs and stuff folks have put there

15:26 mrsolo: well except it is from same class hierachy

15:26 no

15:27 it can be either datetime or timestamp or subclass

15:27 Chouser: and you want to make a new instance of whatever it is?

15:27 mrsolo: yes

15:27 construct works.. just want to know if there is another better way to do it

15:29 Chouser: maybe: (clojure.lang.Reflector/invokeConstructor (class (time-now)) (to-array [234]))

15:31 cemerick: would one git commit per IRC post be too much?

15:31 then you could either look at the file contents, or just read the history backwards.

15:33 * hiredman puts on his safari hat and goes in search of NPE

15:34 mrsolo: chouser: exploded No matching ctor found for class java.util.Date hmm let me check out what invokeConstructor does

15:36 cemerick: Chouser: heh, that'd be great

15:36 good test of git :-)

15:37 Chouser: I'd rather just use wave, but I guess we're not quite there yet.

15:38 mrsolo: (clojure.lang.Reflector/invokeConstructor (class (u/time-now)) (to-array [(long 234)])) works..thanks :-)

15:38 Chouser: ah, great.

16:08 hiredman: ugh

16:09 I had something like (+ 10 (cond ...)) and no else in my cond clause, so it was returning nil

16:10 Chouser: we'll get AOT type checking some day

16:11 hiredman: (doc compare)

16:11 clojurebot: "([x y]); Comparator. Returns 0 if x equals y, -1 if x is logically 'less than' y, else 1. Same as Java x.compareTo(y) except it also works for nil, and compares numbers and collections in a type-independent manner. x must implement Comparable"

16:14 ataggart: anyone present that is using the intellij clojure plugin?

17:29 mrsolo: too bad there is no seg-utils/group-by-with-cmp ..copy n paste

18:05 how do one catch java exception?

18:08 nm

18:11 replaca: mrsolo: (try .... (catch class var stmnts*))

18:14 mrsolo: ya found it under special form..

20:00 rhickey: woo-hoo! my Kindle DX has shipped

20:00 mtd: :)

20:00 rhickey: now I have someplace to put my 1400 pdfs

20:03 technomancy: rhickey: I think your suggestion to read Out of the Tarpit is the last thing I needed to get me to buy one.

20:03 read half of it on my laptop, but my eyes can't take too much.

20:03 rhickey: I want all of my research papers with me all the time

20:04 unfortunately I've already printed most of them because I can't deal with reading screens

20:04 technomancy: having a high-resolution screen helps, but only so much.

20:07 is there a trick to get clojure.xml or contrib's prxml to sanitize input so control characters don't sneak into the XML?

20:28 * technomancy found (.replaceAll my-string "\\p{Cntrl}", "")

20:28 technomancy: nice that they've got a regex class for it

20:33 replaca: rhickey: I'll be intereste dto hear how you like the kindle for tech papers. That's my interest in it as well.

20:33 rhickey: replaca: I have high hopes, I like the Kindle screens, as long as the pdfs fit, I'm good

20:35 replaca: yeah, my concern was the quality of the pdf rendering

20:36 googling for "out of the tarpit" gives you: Attack of the Big-Buxomed Bikinied Bimbos Part II

20:36 and Rich Hickey on Testing

20:36 bet you didn't think those were related!

20:38 cp2: replaca: perhaps it's best if people don't know about his former job ;)

22:17 hiredman: ~ping

22:17 clojurebot: PONG!

22:30 DTrejo: ~ping

22:30 clojurebot: PONG!

22:30 DTrejo: ~pong

22:30 clojurebot: Titim gan éirí ort.

22:30 durka42: ~marco

22:30 clojurebot: Pardon?

22:30 DTrejo: ~pong

22:30 clojurebot: excusez-moi

22:31 durka42: ~marco is <reply>POLO! nya nya you can't see me

22:31 clojurebot: Ack. Ack.

22:52 hiredman: good golly miss molly, 3 gigabytes of video?

22:54 that'll take from now till the heat death of the universe to download

23:14 DTrejo: ~marco

23:14 clojurebot: POLO! nya nya you can't see me

23:15 DTrejo: ~penis

23:15 clojurebot: No entiendo

23:16 DTrejo: http://code.google.com/p/lightbotclojure/ is this clojurebot?

23:16 stuhood: ~where are you?

23:16 clojurebot: http://github.com/hiredman/clojurebot/tree/master

23:17 DTrejo: cool thanks

23:21 http://mattsears.com/2009/6/6/20-clojure-links-to-get-you-up-to-speed

23:37 hiredman: lightbot seems to have a lot of .java files for a clojure project

23:38 *cough*

Logging service provided by n01se.net