#clojure logs

2009-11-26

00:00somniumalexyk: for bootstrapping its probably faster to use java interop than congomongo, JSON/parse creates BasicDBObjects that you can pump straight into the collection
00:00somniumit must be faster, since congomongo just wraps it with a function call :p
00:01alexyksomnium: cool, will study
00:04alexyk_ato: about JIT, if you call things twice in repl, does it matter if it's the first time or second?
00:05alexyk'cause the stuff was slow the first time and fast the second time
00:05alexyksomnium: I have a clojure-new and contrib standing by :)
00:05_atoyeah, it'll get fast the first few times you call it
00:06_atocause the JIT doesn't optimise until it's seen a few runs through, as it does all this timing stuff to figure out how best to optimise it
00:07_mstisn't "a few" something like "a thousand" with -server?
00:08_atoyeah... "a few" means "a thousand" for a tight inner loop :p
00:08_mstheheh
00:09_atoas opposed to "a fair amount" which would be "a million" or "a lot" which would be "a billion"
00:10_mstso if I say "Hey _ato, could you lend me a few bucks"...
00:10_mstyou'll probably refuse
00:10zaphar_psis there a way to make private multi-methods?
00:11_atozaphar_ps: (defmulti #^{:private true} my-multi ...}
00:11_atothere might be a nice macro to do it in contrib
00:12_atonope looks like there's not
00:12_atosomeone should add one
00:12zaphar_ps:-)
00:13zaphar_psthat works
00:13_ato_mst: it's all relative. I'd lend you a few won :-P
00:13zaphar_psand your right someone should add one
00:14_atoI would, but it seems Rich still hasn't got my CA yet. :(
00:14_atomight have to send another one
00:15_atomaybe the Post couldn't read my terrible handwriting :p
00:19alexyknice, 100M twit scan stabilized at 8 GB RAM
00:20alexyksomnium: so the branch is just "new", right?
00:23somniumalexyk yeah, if you cloned clojure from github you should already have it
00:24alexykyep... then it's cooking, although with the old congomongo :)
00:25alexykwhy does clojure CPU usage jumps to 300-500% in a single-threaded program? I mean, may be one thread is loading from mongo, but 300-500%? Is it parallel GC?
00:26alexykit flips between 100% and 200-500%
00:29somniumalexyk: hmm, I seem to have misplaced it, but I should time to post it this weekend. It just mapped the coerce functions to protocols on IPersistentMap, ClojureDBObject, String ... seriously kills the function call overhead
00:29alexyksomnium: cool, let me know when you find/push it!
00:31alexykstill looks like clojure likes it RAM quite filling... 10 GB already for reducing into an update-in map with 5 million keys
00:31alexykor is it GC not bothering
00:32_atocould GC not bothering if you've got a large max heap
00:32alexykdo you guys recommend some GC option? I like to set -Xmx50g for these works
00:32hiredmanther are options you can pass to the jvm so it will print out GC statistics
00:32hiredman~google headius jvm flags
00:32clojurebotFirst, out of 249 results is:
00:33clojurebotHeadius: My Favorite Hotspot JVM Flags
00:33clojurebothttp://blog.headius.com/2009/01/my-favorite-hotspot-jvm-flags.html
00:33_atoif you've got 50G of RAM to burn, sure give it as much as you like
00:36alexykhiredman: nice options, thx
00:37alexykis using the "new" branch OK for everyday research coding? no deployment, no nothin'
00:39somniumit seems to work okay with compojure as long as everything is recompiled
00:39somniumthough I'm not qualified to answer that question :p
00:40alexykare the bug fixes merged from new to 1.1, or the other way?
00:41_atobugfixes from 1.1 will be merged into new
00:41alexyk_ato: so the development is on 1.1, and new is for purely experimental stuff?
00:42_ato"new" is just for types and protocols and reify related features. Those features used to be called "new new" as they used to be implemented using the the "new" special form
00:43_ato(new ...)
00:43hiredmanmost developement seems to be on new these days
00:43somniumthe way new is moving it feels like 1.0 could almost be deprecated
00:44hiredmanwithin the last two days or so there has been renewed interest in pushing 1.1 out the door, so 1.1 should kind of settle down for bugfixing
00:45hiredmansomnium: the new branch stuff will not be in the 1.1 release
00:46notallamai'm really liking protocols.
00:46somniumme too
00:50alexyksomnium: I'm pondering parallelization of mongo scan. Say I split my collection into 8, for the 8 cores I get. Or into 32, for the 32 actual ones (8 quad-cores). Then I create N threads, each opens a mongo connection to its collection, and they all start going. Possible?
00:51alexykthen in STM they all sync/merge their maps.
00:51somnium alexyk: its possible, but mongo is single threaded
00:51somniumalexyk: until 1.1.4 they say
00:51somniumalexyk: so they're all going to block while one talks to its cursor
00:51alexyksomnium: you mean one mongod will not serve more than one client thread??
00:51somniumyep
00:51alexykman...
00:51somniumon the brightside its very fast, but still, you have to created multiple mongods
00:52alexyksomnium: ah, I can do that.
00:52alexykI wish I woudln't have to shard manually.
00:52somniumI haven't experimented with that to much, but they have some utilities I think
00:53alexykWhen it becomes multi-threaded, I wonder how clojure can be used to do the split/merge I described automatically. E.g. creating N cursors into the same collection at offsets...
00:53somniumconcurrent reads will help a lot, writes will always lock the whole collection they say
00:53alexyksomnium: I write once, then just read. I can write derivatve results into new collections.
00:57somniumcreate size-of-db/num-of-cores futures maybe? It's not guaranteed to be in 1.1.4 unfortunately, but its scheduled
00:58somniumI expect clojure's STM will make it relatively painless
00:58alexyklooked at protocols -- smacks of OO to me! :)
00:59alexykI got tied up in Scala typesystem instead of doing work already once... :)
01:00somniumits kind of like a mix-in only compositional OO, very unique
01:00somniumI'm eager to see more examples of its use in the wild
01:02alexyksomnium: 100M twits done in 2800 secs, 13 GB max out of 20 GB allotted, not bad! :)
01:02alexykmongod load was 7% max
01:02alexykyou're not banging hard enough on it :)
01:02alexykor it's the java driver
01:03somniumshould it be higher?
01:03somniumhave to ask the mongodevs
01:03alexyksomnium: I dunno... I like high % :)
01:04alexykI mean, if we read faster than it can serve, it should go to 100% CPU
01:04somniumits all c++ and they have to make concurrent
01:04carkwell it's mostly doing io so i don't see why the processor would go crazy
01:05carki bet the bottleneck is your clojure processing
01:05alexykcark: true
01:05alexykdisk IO, forget 100%, 7% is good enough
01:06carkwhat's the charge on your java process ?
01:06alexykcark: it was 100% CPU to 750% at some point
01:06carkthere you go
01:07carkthat's _you_ not banging hard enough =P
01:07alexykcark: my first 2 lines of clojure doing work :)
01:07alexykof 100 lines of scala before it
01:07alexykunder the banner of "screw types"
01:08carkanyways don't worry about performances quite yet
01:08carkjust do what you want to do with this data
01:10alexykcark: I have too much of it, so the test here was if clojure is up to it at all, with immutable maps and all that. Scala has mutable maps which I can update like Perl, almost, after doing all types right; I could use immutable ones, too, but it's easy to get the mutable ones, here I have to reduce over all data.
01:10somniumthe real project is rewriting mongodb in clojure :p
01:10alexyksomnium: NO!
01:10alexykI need my json fast :)
01:11technomancyhttp://twitter.com/yukihiro_matz/status/5959547376 <= "I got to look into metadata in Clojure." (from Matz, of Ruby fame)
01:11somniumif the jvm propaganda is true, it should be equivalent to c++ in raw speed
01:12alexykhow do I sort a map of {int int} by value descending?
01:12somniumtechnomancy: that is awesome
01:12carkaldebrn: what do you want to sort, keys or values ?
01:12hiredmansomnium: the place it should shine in long running backends
01:13carkerr alexyk i mean
01:13alexykcark: values
01:13hiredmanbecause the jvm start up time can be ignored and the jvm has time to optimize
01:13carkwell you don't sort a map ....
01:13carkyou may sort the values
01:13alexykcark: I mean convert to tuples and sort those
01:13alexykas a vector
01:13_mstalexyk: looking at your original example, it seems that you could save a bit of GC overhead by reducing into a (transient {}) assuming it's all single-threaded
01:13cark(sort (vals my-map))
01:14alexykcark: I need keys too
01:14somniumyeah, + I wonder what the codebase reduction size alone would be, no garbage-collection and manual locks ...
01:14hiredman,(sort {:a 1 :b 2})
01:14clojurebot([:a 1] [:b 2])
01:14alexyk_mst: just that, (transient {}) ?
01:15alexykhiredman: and descending?
01:15hiredmanalexyk: reverse
01:15alexykhiredman: cheating :)
01:15carkthat's sorted by key then value hiredman
01:15hiredmancark: so?
01:16carkhe wants sorted by value
01:16_msthttp://paste.pocoo.org/show/153006/
01:16hiredman,(sort-by (comp > val) {:a 1 :b 2})
01:16clojurebot([:a 1] [:b 2])
01:16hiredman,(sort-by (comp < val) {:a 1 :b 2})
01:16clojurebot([:a 1] [:b 2])
01:16_mstsomething like that :)
01:16hiredmangrrr
01:16_mstoh, without (get-twits)--my test version, sorry
01:16hiredman,(doc sort-by)
01:16clojurebot"([keyfn coll] [keyfn comp coll]); Returns a sorted sequence of the items in coll, where the sort order is determined by comparing (keyfn item). If no comparator is supplied, uses compare. comparator must implement java.util.Comparator."
01:17hiredman,(sort-by val > {:a 1 :b 2})
01:17clojurebot([:b 2] [:a 1])
01:17hiredman,(sort-by val < {:a 1 :b 2})
01:17clojurebot([:a 1] [:b 2])
01:17cark,(sort-by (comp < second) {:a 1 :b 2})
01:17clojurebot([:a 1] [:b 2])
01:17cark,(sort-by (comp > second) {:a 1 :b 2})
01:17clojurebot([:a 1] [:b 2])
01:17hiredmanforget the comp
01:18alexyk_mst: ah, so it's kinda reusing the map in a mutable way?
01:18_mstyep, building it up initially then making it persistent at the very end
01:19cark,(sort (map (fn [[a b]] [b a]) {:a 1 :b 2}))
01:19clojurebot([1 :a] [2 :b])
01:20cark,(into (sorted-map) (map (fn [[a b]] [b a]) {:a 1 :b 2}))
01:20clojurebot{1 :a, 2 :b}
01:21carkthat's better !
01:27alexykcark: timings: 1st version: 52 sec , 2nd: 20 sec. Still *a lot* for just 7.5 million pairs!
01:28alexykI added reverse to both to get descending order
01:28carkwell it's constructing a tree
01:28alexykhow do I flatten the map first into a vector of pairs?
01:28carka map is a seq, so you may consider it flattened
01:29somnium,(seq {:a 1 :b 2})
01:29clojurebot([:a 1] [:b 2])
01:29hiredmanwoa
01:29hiredmanno
01:29hiredmanmaps are not seqs
01:29hiredmanthey are Sequable
01:29carkyeah sorry it's sequable !
01:29hiredmanso most sequence functions call seq on their arguments
01:31carki beleive sort uses java sort and copies everything in an array or something, so that would make it slow as well
01:32carkdid someone try making a merge sort in clojure ?
01:33alexyk(time (def us3 (sort #(> (%1 1) (%2 1)) (vec users)))) ; that's just 10 secs
01:35carknice =)
01:35alexykare vectors more suitable for sorting than lists?
01:36cark@def sort
01:36carkpff how did that work again hiredman ?
01:37hiredman~def sort
01:37carkthanks
01:37hiredmanclojurebot: source sort
01:38hiredmanetc
01:38alexykcute
01:38carkthat last one is easy to remember
01:38carkanyways you may test it with seq instead of vec
01:39hiredmanhmmmm
01:40carkshould be faster no ?
01:40hiredmanyou might look at doing some kind of in place quicksort with a transient vector
01:40alexykhah: http://twitter.com/yukihiro_matz/status/5883125759
01:42somniumwhat happens if you send a potentially block action to agent with send instead of send-off?
01:42rlbsomnium: you might block all the agent threads if you do it enough (I think)
01:43carkthere is only a limited number of threads
01:43somniumah, ok, send-off get its a dedicated thread
01:43rlbit's definitely not what you want to do.
01:43rlbsomnium: send-off pulls from an expandable thread pool
01:43alexykcark: seq is about the same is vec. if it's all sent off to Java, prolly doesn't matter much.
01:44carkvec does construct a vector, but it's very fast
02:04defnvec is faster than a seq
02:05defnalexyk: What does Matz mean "more conservative"?
02:05defnMaybe the word he was looking for was "slower"
02:06alexykdefn: probably)
02:06alexykhow do I sort a vec in place with transient?
02:08hiredmandon't know that there is anything existing for that
02:09defnany estimates on how long this will take: (time (reduce + (range 1 1000000000)))
02:10hiredmana long time
02:10hiredmanfor future reference
02:11hiredman,1e8
02:11clojurebot1.0E8
02:22defnhow the hell do i compile my .clj file
02:22hiredmanwhy?
02:23hiredmananyway
02:23defni dunno, my friend is giving me crap about using unix time versus (time)
02:23hiredman~compile
02:23clojurebotthe unit of compilation in clojure is the namespace. namespaces are compiled (not files). to compile a namspace the namespace needs to be on the classpath and so does ./classes/ (and the directory needs to exist) because clojure writes the class files to that directory. http://clojure.org/compilation
02:23hiredmandefn: I fail to see what that has to do with compilation
02:24defni need to run my clj file from the command line with `time`
02:24defn$ time java myfile
02:24hiredmanyou can do that without compilation
02:24defnoh? how?
02:24alexyk_mst: indeed, your ! version did it in 1900 secs, instead of the original 2800 secs
02:24hiredmantime java clojure.main file
02:25carkbut then you're benchmarking compilation
02:25hiredmanwhich does not take much time
02:25carkdepends on the program =/
02:25hiredmanunless you loading something complex, jvm startup time will drown out compile time
02:25defn (time (/ (* 1000000000 (inc 1000000000)) 2))
02:26hiredmanyou are
02:26defnthat's what im compiling
02:26hiredmandefn: that is dumb
02:26defni agree
02:26defnlike i said, im humoring him
02:26hiredmanso tell you friend to buzz off
02:26hiredmanyour
02:26defnif i tell him to buzz off, im down to 1
02:26defnlol
02:26hiredmanand go fork a github project or start one
02:27hiredmanor ignore his jibs
02:27carkhttp://github.com/cark/clj-exe-jar
02:27carkthat's a sample executable jar project
02:30defngod my friend is annoying
02:30defnthis guy thinks C > * no matter what
02:31hiredmanhave you ever heard of fan death?
02:31defnno
02:31defnwhat's that?
02:31hiredmanhttp://en.wikipedia.org/wiki/Fan_death
02:32hiredmana belief far stranger than "C > * no matter what" held by far more people
02:32defnhaha
02:33defni mean i can see why he'd believe that and all, but it doesn't change the fact that his 600 lines of gruelingly optimized C will only match my 100 lines of clj
02:34defnin short, this guy just absolutely despises it when he doesnt know something that someone else does, so he belittles it until he learns about it
02:34defnit's really annoying
02:35defni try to humor him and explain things, but he has things condescending attitude towards things he doesn't grok
02:35defnthis*
02:36defni need to move, no one here gets it
02:37hiredmanwho is more silly, the man who throws pearls before swine? or the swine who ignore the pearls for their slop?
02:37defnthe man
02:37defnhe knows better
02:38defnor..was that rhetorical? :)
02:38hiredmanI wasn't actually expecting an answer
02:38defni mean, a pig ignoring some pearls seems plausible, an idiot throwing them in front of pigs, now that's silly
02:38defnIMO
02:39carki think your friend is right, c is the best language for a lot of things. clojure is best for other things
02:40defnyeah and ive totally offered that, but the difference is i know some C, and he knows nothing of clojure
02:40defnhe calls some of the things ive explained to him about clojure "magic"
02:40carkanyway why do you need to convert him ?
02:40defn"impossible", etc.
02:40defni dont
02:41defnit's just discussion that comes up about projects we're working on, and he gets all "go more low level" on me
02:41defnbut he does this without any knowledge of clojure whatsoever
02:42defni think that's the main thing that aggravates me: he knows absolutely nothing about clojure and talks about it like he's an authority
02:42carki can understand that point of view, it sometimes amaze me to see how much memory or cycles i'm using with higher level languages
02:42carkthen i think at developement time, and i feel better =)
02:43defncark, yeah, i dont know, i wish you could have a conversation with the guy -- it's not so much the content of what he says, it's his lack of perspective that makes it all so suspect
02:43carkhehe i'd rather leave the guy to you =)
02:44defnhaha *stab*
02:46defnsorry for airing out the dirty laundry here, but this guy pisses me off when it comes to code, he thinks because he got his undergrad that he knows everything there is to know about CS, very arrogant with absolutely no public projects, no experience outside of his comfort zone, etc.
02:46defni think he's in for a rude awakening
02:46defns/think/hope ;)
02:47carki don't think having public projects is a good measure of a programmer's worth
02:47carkit only makes it visible
02:48defni get the sense that he has no projects
02:48defnother than critiquing other people's projects
02:49defncark, you're right to play devil's advocate, i am probably being too harsh, but i'm reminded of Alan Kay's quote:
02:49defnPerspective is worth 80 IQ points.
02:49cark=)
02:52defnso cark, what's up?
02:52defnhow goes the clojue?
02:53defnclojure*
02:53carkheh well currently doing the last touches to a clojure application that's already running at a customer's
02:53carkstill using 1.0
02:54defnnice. 1.1.0 is looking pretty promising
02:54carki want new !
02:54defnwhat sort of app>
02:54defn?*
02:54carkthat's a web app, talking to telephony equipment
02:55carkand managing customer/agents/pricelists all that stuff
02:55defnlike muxes?
02:55carklike voip switches
02:55defnahhh
02:56defntouchy stuff
02:56defnSLA's and all of that
02:56carkpretty boring actually !
02:56defnyeah but if it goes down...
02:56carkhehe yes, we have lots of testing going on
02:56defnoh man, black friday
02:56defndont get me started
02:57defnclients are losing their minds, conference bridges for 4-12hrs per day
02:57defnmassive testing, etc. to get ready for xmas
02:57carkmhh i'm pretty well insulated from end-users
02:58carki have the filter of my direct customer
02:58carkhe takes care of interaction with end-users
02:58defn*nod*
02:58carkthat's very convenient believe me =)
02:59defnI am not so lucky -- living where I do I'm stuck providing support
02:59defnLike I said before, I need to move...
02:59defnare you W. coast?
03:00carki'm from europe =)
03:00defnah, wherabouts?
03:00carkbelgium
03:00defnbeautiful country
03:00defnI visited there in 2003
03:00carknice, where are you from ?
03:00defnThe states, WI
03:00carkthat's quite a trip !
03:01defn:)
03:01defnHave laptop. Will travel.
03:01defnhttp://en.wikipedia.org/wiki/Have_Gun_–_Will_Travel
03:01carki've spent a couple months in texas working for a small telco
03:02carkthat remains a great memory
03:02defnwhere in TX?
03:03carkSan Antonio, that year the spurrs won
03:03defnhaha, Dennis Rodman!
03:03carkthough i don't know a bit about basketball, it was fun to see the poeple go crazy =)
03:04defnthat was what? 1997? 98?
03:04carki'm not quite sure
03:04carkwas before 2000
03:04defnDo you guys still refer to telcos as PTTs?
03:05carkit has been a while since i heard that =)
03:05defnhehe
03:05carkwe sy providers, carriers etc
03:05carksay
03:05defnI worked with a German guy who refused to call them anything but PTTs
03:06defnas if our teclos provided telegraph service
03:06defnlol
03:06defntelcos*
03:06carkerm well they did not so long ago
03:06defnyeah i think they stopped in the late 90s
03:06defnbut still, pretty ancient tech. :)
03:06carkhehe yes
03:06carki think we catched up tho
03:08defnsure you did!
03:08carkyou know what, while in texas, i was working on a web site interfacing with telephony switches .... looks like i am time warping =/
03:09defnthe infrastructure is there i suppose
03:09defnit's easier now
03:09defnthat's for sure
03:10carkim' really not much in infrastructure/cable stuff. customer wants something i get it done, i'll never touch the telephony/networking stuff
03:11defni get the firehose of alerts and alarming for all of the telephony/networking for my company
03:11defnand need to develop monitoring systems to distribute that info appropriately
03:11carkah man, that must be sometimes annoying
03:11defnvery.
03:12defnbut it is rewarding also
03:12carki changed direction when i first received a call on new year's eve
03:12carkthat day i decided it wouldn't do
03:12defni will eventually move in a different direction
03:12carkah sure when you save the day, it's very rewarding
03:13defnim slowly learning about concurrency and and parallelism and all of that business
03:13defnmy goal is to make that sort of thing my du jour
03:13defnmove away from the reactive stuff
03:13defnand go more towards the proactive development side
03:13defnthat's where my passion is
03:14carkwell there's always a reactive part, and pressure from customers and such
03:14defnparse 1,000,000,000 log entries in 10min, that sort of that
03:14defnyeah im sick of that TBQH
03:14carkthat never goes away =)
03:14defnour customers dont know how good they have it, i am frequently abused
03:15defnwhat got you into the PTT stuff?
03:15carkman that's quite a story
03:16carki've always played with computer, and programming
03:16carkbut never thought about making it my job
03:16carkmy brother the same
03:16carkone day some guy calls my brother and ask him to do a "quick software" for him
03:17carkhe says, i won't do that, talk to my brother ... i spent 10 years writing and perfecting that software
03:18carkit sold quite well too =)
03:18carkand there i was in the loop
03:18defnhehe, that is quite the story! :) I felt the same way when I realized I could make money from programming
03:19defnI was studying music, guitar performance, jazz guitar, and then I realized that all of the time I wasn't playing guitar I was spending on my computer doing XYZ, tinkering
03:20defnguitar is my love that should be protected from financial gain
03:20defnand programming is my passion which ought to be exploited!
03:20carkhehe
03:21carkthen you have programmers that don't touch a computer excpet between 8:00 and 16:00
03:21defncome one, come all! exploit me!
03:21defnyeah i dont understand that
03:21defnand i never will
03:21defnto me they are phonies
03:21carkor maybe we're monomaniacs =)
03:21defnhahaha
03:22defn*maybe*
03:22defnI mean, if you had to choose the person writing you software where you have an agreement with a client to guarantee 99.99% uptim
03:22defnuptime*
03:23defnwould you want a 9am-5pm guy? or would you want a 24/7 guy?
03:23defnit seems like a no brainer
03:23carkright, but what they want is not 99.99%
03:23carkthey want it cheap and for yesterday
03:24carkunless you're working for google i guess
03:24defnthat's a dilemma as well, I suppose
03:25defnbut even in that scenario, it is implied that 99.99% uptime is a requirement
03:25defnAND that they wanted it yesterday, for free
03:25cark=)
03:25carkthere's the famous "cheap, quick, quality : pick 2 of these"
03:27defnsometimes you will meet someone with vision though
03:27defnsomeone who has some long term vision who can justify spending more to get what he needs for 5 years
03:27defnversus what he needs tomorrow
03:28defnthose are the good managers
03:28carki had not much chance in that regard i guess
03:29defnive had 2
03:29defnthey understood that what i did was important to me, and that i worked hard to make it good
03:30defnand they told the customer to piss off when they rushed me
03:30defnunfortunately it seems like those guys move around a lot
03:31carki don't think that this is a good survivalbility skill for a manager these dys
03:31carkdays
03:32carkit's all about quick time to market
03:33carkanyways, it's time for me to go
03:33carkgood err nnight i guess
03:33carknice talking to you
03:35defnyou too cark -- good night :)
07:07esjalright - too quiet in here. I'll ask a question: In the docs the performance of the collection datastructures is spec'd like "Vectors support access to items by index in log32N hops." Am I correct to understand that this is log_32(N), and not log(32*N), and that by hops we're talking about the lookup to go down a level in the trie ?
07:14Chousukeyeah, it's log_32
07:14esjthanks, this makes more sense now.
07:16RingdingI have a related question: given two huge trees which differ by exactly one element, is it possible to find this element efficiently?
07:17RingdingI.e., can I access the trie's internal structure?
07:24_atoRingding: that's an interesting idea
07:24AWizzArdWas suggested several times. Currently it is not decided how to output such information.
07:28the-kennyhm strange.. I have jsr166y.jar in my classpath, but if I do (import 'clojure.parallel), I get an exception.
07:29the-kennyClassNotFound: jsr166y.forkjoin.ParallelArray
07:29AWizzArdIs this class in the .jar file? Can you check (System/getProperty "java.class.path") and see if it *really* includes this .jar?
07:31the-kennyAWizzArd: It's included in java.class.path. I'll have a look into the .jar..
07:31the-kennyhm.. I see no classfile for ParallelArray.
07:33the-kennyIf I look at the source it's in /jsr166/src/extra166y
07:43AWizzArdthe-kenny: maybe the .jar was not the right one? Perhaps there is a more complete version somewhere.
07:43the-kennyAWizzArd: hm.. It's the .jar mentioned on clojure.org
08:07AWizzArdYesterday the NEW branch (git) was merged so that it now also includes the updates of the Master branch. Now when I compile (defn #^bytes foo [] ...) I get an error message that bytes is already defined in clojure.core.
08:07AWizzArdHow can I type hint that a function returns an array of (native) bytes?
08:07the-kennyAWizzArd: That should be #^bytes
08:08the-kennyAWizzArd: (defn #^bytes foo ...) is working for me.
08:08AWizzArdIn the repl or in a .clj file?
08:09AWizzArdok, so I assume this error message comes from somewhere else
08:10SergeyDidenkohi. Could anybody suggest a shorter way to write (not( nil? arg))
08:11the-kennyAWizzArd: In a REPL
08:12SergeyDidenkooh, I see probably there is no such way, because it's nothing to gain in space
08:12the-kennySergeyDidenko: Just arg? Or (boolean arg), if you want a boolean.
08:12the-kenny,[(boolean 42) (boolean nil)]
08:12clojurebot[true false]
08:13SergeyDidenkothanks Kenny, I see
08:17AWizzArdseems that contribs http-agent is broken
08:18AWizzArdyup
08:18AWizzArdit defines the function bytes which now was introduced into core
08:29the-kennyAWizzArd: I think that has been fixed in one of the latest commits to contrib
08:29the-kennyAWizzArd: Ha! http://github.com/richhickey/clojure-contrib/commit/5055f41c8bc99747392396d622f17f723470858e
08:34AWizzArdthe-kenny: yes, that fix makes http-agent compile. But when you (use http-agent) in your ns then you will also have to exclude bytes.
08:38chouserAWizzArd: don't 'use' namespaces :-P
08:39chouserat least not without listing the specific vars you want to bring in
08:43the-kenny(use [clojure.contrib.http-agent :as hagent]) :)
08:43Chousukethe-kenny: I think in that case you're supposed to use require :P
08:47the-kennyHeh, ok
08:47the-kennyI have to go to school now... second time today ;) I'll be back later
08:50AWizzArdchouser: often I require them. It just sometimes is more convenient to simply use a ns.
09:02chouserseems more convenenient, but it's a lie. :-)
10:44ambientso if i want to have an up to date Clojure dev environment in emacs, is there a list anywhere what do I need? swank-clojure-project... what else?
10:44ambientit's a bit hard to keep up with all new stuff
10:45the-kennyambient: clojure-mode is helpful too ;)
10:45ambientyeah, i know that one too :P
10:45the-kennyambient: swank-clojure and clojure-mode is enough... I don't know if there is anything else. (But I never searched for more)
10:45ambientintegrating all the pieces together is what's hard
10:46ambientbecause there are so many ways that how things are, they could be done in a more convenient manner, and I bet somebody has already done that, but it's somewhere deep inside the web where I can't find it
10:46ambientthere's no reason that starting a new project and loading third-party libraries should be so difficult
10:47ambientperhaps what I'm asking is hand-holding so I digress and will dig some more
10:48ambientusually the answer to a question is as good as the question and my question is very vague :)
10:49hoeckambient: if you're on windows, you can try clojurebox, and then replace the installed packages with newer ones from github or so
10:49ambientcurrently on ubuntu 9.10, the drivers actually work now and I'm exstatic :)
10:50ambienti installed with emacs-starter-kit and swank-clojure
10:50ambientbut how to manage my libraries and projects, that's whole another thing
10:50the-kennyambient: Just check out one or two clojure projects on github.
10:51hoeckambient: yeah, at home I'm on Ubuntu too and I was amazed that everything (including suspend to ram) worked out of the box : )
10:51Chousukewell, there's the build tool leiningen, which probably works well with swank-clojure-project as they're written by the same person :P
10:51Chousukethough I'm not sure if there's any real integration yet.
10:51ambientthe-kenny: well i've already done that, installed and even used penumbra. it's just the management and convenience, letting the computer do the boring stuff for me
11:06Ringdingthe-kenny: I've setup my Emacs/Clojure environment last week and found that all tutorials and HOWTOs out there did not work...
11:07RingdingI've got a running setup now, but it took a lot more time than I had expected
11:07RingdingOh sorry, I meant ambient
11:07ambienthave you documented any of your work?
11:08RingdingUnfortunately, I have to leave now. Will be back in ~15 hours
11:08Ringdingambient, sorry, no
11:08ambientheh, ok
11:08RingdingI can jot it down for you if you're patient till tomorrow :)
11:09ambienti just need the final steps
11:09ambienti already know how to install the bare essentials
11:35churibstupid beginner question: why doesnt (deref (future (println "hello"))) prints anything?
11:35ambient,(print "foo")
11:36clojurebotfoo
11:36ambienthmm
11:36ambientprint should return nil
11:36churibyeah, thats printed at the repl, but no "hello"
11:37ambient,(deref (future "foo"))
11:37clojurebot"foo"
11:38krumholt_churib, do u use emacs?
11:38churibyes
11:38krumholt_churib, look in the *inferior-lisp* buffer
11:38krumholt_the hello should be there
11:39churibaah, there it is
11:39churibwow, thanks!
11:39krumholt_churib, np
11:40AWizzArdHow can I type hint the return type String[] ?
11:41krumholt_AWizzArd, i think you can't because String is not primitie, but i might be wrong
11:42krumholt_primitie = primitiv
11:44Chousukehmm
11:44Chousuke,(make-array String 0)
11:44clojurebot#<String[] [Ljava.lang.String;@bea6af>
11:45Chousukeso use #^"[Ljava.lang.String"
12:11qedI had a dream about clojure last night, something about #^
12:12dysingerI had a dream about clojure too - only I was just up at 3am writing code - oh wait - that was work
12:12qedlol
12:47ambientwhen i try swank-clojure-project and input the correct project root with correct directory structure it just spams message "Polling "/tmp/slime.11785".. (Abort with 'M-x slime-abort-connection'.)" and nothing seems to happen :\
12:49the-kennyambient: Take a look at *inferior lisp*.
12:49the-kennyThat mostly means that swank-clojure has failed to start
12:49ambientno class found: clojure/main
12:50the-kennyOh, and you can stop the polling with M-x slime-abort-connection
12:50the-kennyambient: Looks like clojure.jar isn't in your classpath ;)
12:51ambientone would think that swank-clojure knows where to find it because it's in .swank-clojure and it automatically installed them all
12:51the-kennyswank-clojure is hard to install, yes, but it gets better with every release.
12:53ambientif i manually created my project with maven it would perhaps be easier to attach swank-clojure into that?
12:53the-kennyYes, I use this alot
12:53Knekkcd /var/www/virtual/jorge.hotoldermale.com/app
12:53Knekkerr
12:53Knekkhaha
12:53the-kennyJust make sure the files for swank-clojure are in the classpath
12:54the-kennythen (require 'swank.swank) (swank.swank/start-server "/tmp/swankport" :port 4242) and do a M-x slime connect
12:54the-kennyM-x slime-connect
12:55Knekksorry about that
12:55the-kennyIf you supply :dont-close true to start-server you can connect with multiple repls from emacs
12:56ambientthanks, i shall try that
13:49alexykwhat does @ mean in: (@shelves shelf-name) ?
13:50the-kennyalexyk: it's a synonym for deref
13:50the-kennyUsed by agents, refs etc.
13:50esjprobably that @shelves is an atom or such being deref'd
13:50esjto a map
13:50alexyka ok
14:36dysingerambient:
14:37dysingerif your project was started with maven - just run "mvn depenency:copy-dependencies" and restart swank-clojure-project
14:37dysingerwe have swank setup to look for jars in target/dependency
14:38dysinger"mvn dependency:copy-dependencies"
14:38dysingertypo 1st time
16:15hiredmanlisppaste8: url?
16:15lisppaste8To use the lisppaste bot, visit http://paste.lisp.org/new/clojure and enter your paste.
16:16lisppaste8hiredman pasted "fn minus" at http://paste.lisp.org/display/91148
16:50miltonsilvaHi
16:51jevgenihello. just wonder - is there a possibility to do reversible debugging with clojure?
16:52miltonsilvais it possible to do something like (defmethod xxx "/join" [] (println "joining")) and what fn would I pass to the multimethod ?
16:54ordnungswidrigmiltonsilva: you whant to dispatch on the string value?
16:54miltonsilvaexactly
16:58miltonsilvaI could map the strings to keywords.. but that would defeat the purpose.. what I what is to dispatch on value without adding unecessary code, but I have no idea what fn I would put in the multimethod in order to achieve that
16:58ordnungswidrigmiltonsilva: i'll pastebin sth
17:02lisppaste8ordnungswidrig pasted "multimethod dispatch on value" at http://paste.lisp.org/display/91150
17:02ordnungswidrigmiltonsilva: there you go
17:02ordnungswidrighttp://en.wikibooks.org/wiki/Clojure_Programming/Examples/API_Examples/Multimethod
17:04miltonsilvathanks (to late)
17:05qedhmmm
17:06qed((read-json (PushbackReader. (InputStreamReader. (get-stream)))) "text")
17:06qedhow do i turn this into a lazy-seq?
17:07qedThis gets one tweet from the twitter stream, I want to (take n coll) from it, which I am guessing will require making it a lazy-seq
17:09hiredmanmaking it a lazy seq like that would be pretty horrible
17:10hiredmana single http connection per tweet
17:11qed(take 5 (lazy-seq (repeatedly #((read-json (PushbackReader. (InputStreamReader. (get-stream)))) "text")))) would work, but yeah, you're right, this ain't gonna work the way it currently stands
17:11hiredmandmesg
17:12qedthe unix application?
17:14miltonsilva:( I still dont know how to dispatch on string values... there is no coerce to string :p
17:23qedhiredman: not sure i see what you're getting at with "dmesg"
17:27ordnungswidrigre
17:28miltonsilvaordnungswidrig: thanks but I still don't know how to dispatch on string values
17:28ordnungswidrigis there a way to alias a namespace like (ns (:require x [foo :as bar])) does?
17:28ordnungswidrigmiltonsilva: so it didn't work for you?
17:29miltonsilvaordnungswidrig: it works.. just not for strings for ints you put int chars.. char etc... but strings :S
17:29ordnungswidrigsaw my example at paste.lisp.org ?
17:29_atoeh?
17:30_atowhy would you ints or chars to dispatch with?
17:30hiredmanqed: wrong window
17:30miltonsilvaI would like to dispatch on strings for the sole reason of not doing (cond etc etc etc )
17:32_atoright... but what does coercion have to do with it? You don't have to coerce anything to use a multimethod
17:33lisppaste8ordnungswidrig annotated #91150 "add missing defmulti" at http://paste.lisp.org/display/91150#1
17:33miltonsilvaI know hence the :p what I would like is something like (defmulti tes str)
17:33ordnungswidriglisppaste8: there you go
17:33ordnungswidrigmiltonsilva: argh. the paste was for you
17:33miltonsilvayes thats what I need thank you very much
17:36ordnungswidrigmiltonsilva: I think you where confused by the pattern to use "int" to dispath on integer values like the fib example does
17:36Guest15038Hi there, i'm trying to do an http request that requires http authentification
17:36Guest15038what would be the best way to do that with clojure ?
17:37miltonsilvaordnungswidrig: one more question the fn this code passes to defmulti return the same value it receives... it seem a bit counter intuitive
17:37_atomiltonsilva: it returns the first value it receives
17:37_atoassuming that's the one you want to dispatch on
17:37_atoif you wanted to dispatch on the second arg you could make it return the second arg it receives
17:37_atoetc
17:38_atoif there's only one arg to your methods then you could just use "identity" instead of that functin
17:39lpetitHi
17:39ordnungswidrighi
17:39lpetitWhere is it specified in the docs that the regexp pattern literal syntax does not need to double anti-slashes ?
17:40_atoGuest15038: I'd first try doing: http://user:pass@host/path
17:40Guest15038oh :( i didn't even know this could work with http
17:40the-kennyGuest15038: Wait, I gave some sample cod
17:40Guest15038thank you very much gonna test that
17:41the-kennyGuest15038: http://gist.github.com/243175 That's an example for twitter. The interesting part is the .setRequestProperty
17:41qedhttp://gist.github.com/243698 : Could anyone give me a hint as to how I can treat the stream of tweets as a lazy-seq?
17:41qedthe-kenny: is it you that gave me this code? :)
17:41the-kennyThere is another way to identify with HttpUrlConnection through java.net.Authenticator, useful if you don't have direct access to the connection-object
17:42the-kennyqed: Yesterday? Yes
17:42qedhehe, im playing with it now, see comment above
17:42Guest15038the-kenny: well i kind of hoped i could get away with http.agent in clojure contrib, and not use any java stuff directly
17:42Guest15038taking a look at your code thank you very much
17:43the-kennyqed: I don't know, sorry.
17:44Guest15038nice it looks quite simple
17:44qedthe-kenny: ah, bummer, right now that line 24 works, but it creates 5 separate http connections i think
17:44the-kennyGuest15038: Yes, looks like you can get away with http.agent
17:44_atoqed: they're what one per line right?
17:44the-kennyGuest15038: Take a look at the doc of the function http-agent, there is a parameter :headers
17:45qed_ato: the "tweets"?
17:45the-kennyGuest15038: Identifying in http isn't more than just a header
17:45_atoyeah
17:45the-kenny_ato: Yes, one tweet per line
17:45_ato(take 5 (map read-json (line-seq (PushbackReader. (InputStreamReader. (get-stream)))) "text"))
17:45qed((read-json (PushbackReader. (InputStreamReader. (get-stream)))) "text") -- That gives me the text of what someone wrong in their tweet for one tweet
17:45qedahhhhh!
17:46_atoor does read-json not work from a string?
17:46qedit does work from a string
17:46qed,(doc read-json)
17:46clojurebot"clojure.contrib.json.read/read-json;[[] [s] [stream eof-error? eof-value]]; Read one JSON record from s, which may be a String or a java.io.PushbackReader."
17:46Guest15038the-kenny : thanks it seems to be working :)
17:46Guest15038with http.agent
17:46Guest15038i'm so lost when it comes to http, didn't even know authentication was a header
17:47the-kennyGuest15038: You're welcome :)
17:48_atoalso since you're pulling duck-utils you could probably cleanup the ugly reader stuff too: (take 5 (map read-json (line-seq (reader (get-stream)))))
17:48_atoor some such
17:48the-kenny_ato: It's a continuous stream which doesn't end (except for maintenance etc)
17:49the-kennyOh wait.. forget what I've said
17:49hiredman_ato: that won't work
17:49qedit does work
17:50hiredman_ato: that may or may not working depending on the format of the json you recieve
17:50_atohiredman: it's one {...} per line
17:50_atoit's not a json list
17:50qedI keep getting 401s
17:51the-kennyqed: You have to enter your twitter username and password ;)
17:51qedhaha yes
17:51hiredman_ato: sure, for this particular instance, but you are depending on being serverd not just valid json, but valid json in a particular format
17:51qedit will work one time, and continue to work for a minute, and then it will start giving me 401s
17:51hiredmanqed: twitter only allows a certain number of api requests per hour
17:52hiredmanor something, I forget exactly
17:52_ato"Each account may create only one standing connection to the Streaming API. Subsequent connections from the same account may cause previously established connections to be disconnected. Excessive connection attempts, regardless of success, will result in an automatic and temporary ban of the client's IP address."
17:52hiredmanyou need to batch your queries
17:52_atoso a good thing you're not doing that one connection per tweet thing anymore :p
17:52qedhahaha
17:53the-kennyhiredman: He's using a new feature of the api, a continously open stream where the server "pushes" new tweets. He doesn't do real "queries"
17:54qedwell, when i create a connection im querying
17:54qedso all my testing is what's causing the problem
17:54qednot the number of tweets i take in a given connection
17:55the-kennyhm.. I never had problems during early testing
17:56qed_ato thanks for the java cleanup
18:01the-kennyqed: Your defn on Github, right?
18:03qedyessir
18:03the-kennyqed: Is this your real twitter password in your gist?
18:04qedannddd deleted
18:05qedyou can post as me if you like, the-kenny, lol
18:05ordnungswidrigqed: you'd better change your password, not :-)
18:05ordnungswidrigs/not/now/
18:05ordnungswidrigqed: or your account will be sold on eBay...
18:05the-kennyqed: heh, I won't do something like this
18:06qedlol, im not too worried about my twitter pass
18:06qedbut thanks for telling me :)
18:07qed(defn take-tweets [#^int n]
18:07qedis that a valid type hint?
18:07ordnungswidrigqed: someone who pastes ones password on a ghist is suspect of using the same password everywhere ;-)
18:07qedordnungswidrig: lol, i invite you to find out where else that pass is used :)
18:08the-kennyqed: Can I try too? :)
18:08Chousukeqed: functions can't have primitive arguments
18:08Chousukethey're always boxed
18:08qedChousuke: so would I even use a type hint there?
18:09Chousukeprobably not
18:09qedif it was #^Integer that'd be different though, yes?
18:09_atoqed: there's not much point using a type hint there, connecting to the server etc is going to much slower
18:09Chousukemaybe if you call some methods of Integer you can typehint it as #^Integer
18:09ordnungswidrigfrom time to time I thought of a service that will check _all_ web services for a given user / pw combination. I was a lazy boy, too, and I'm sure there a some i-forgot-about services where my former default user/pw combination would work.
18:09Chousukebut I doubt it's going to make a difference:P
18:09qedk, I was sort of under the assumption that it was good practice
18:10qedbut i guess clojure then needs to find out where I use that variable in my fn every time i call it
18:10_atoit's good practice to only do it when necessary (or when you get a warning from *warn-on-reflection*)
18:10_atomost of the time type hints aren't going to make the slightest bit of difference
18:10qedordnungswidrig: there's a service out there like that
18:10qedIIRC
18:10the-kennyqed: I think it's a bit ugly sometimes... I try to avoid it. However, I had one point in my code where I was forced to use it
18:10ordnungswidrigqed: you name it?
18:11qedits been awhile, it basically checks a bunch of services for a valid login, cant remember the pass :\
18:11qederrr if it does pass
18:12qedbut no i dont remember the name
18:12qeditd be real evil if they did it for bank accounts :)
18:12Chousukehmm :P
18:13ordnungswidrigqed: hehe, as long as the use their account number and not the same username
18:13qedhaha sure
18:13Chousukemy bank account password is actually pretty weak but you wouldn't be able to log in even if you knew it.
18:13qedyeah my bank has little questions you have to answer
18:13Chousukeor well, you could but all you could do is look at my saldo ;(
18:14qedi once forgot my password and they wanted me to recite my secret phrase
18:14Chousukewhich is not very impressive.
18:14ordnungswidrigafter the last leaks of customer data with bank account numbers, birthday and so on I'm sure there is abuse
18:14ordnungswidrigqed: at my cell phone provide I need a customer password. It makes the people laugh every time. I thought it was for web only.
18:14qedmy secret phrase was: inside-out cocoons in a monsoon filled with baboons bending silver spoons
18:15ChousukeMost banks here use a key card. they give you a number and you look up the corresponding one on the key card.
18:15ordnungswidrigqed: +1
18:15qedi got about halfway and she's liek "OKAY OKAY"
18:15qedlol
18:15the-kennyMy bank here forces everyone to use a 5 letter password for online banking.
18:15ordnungswidrigqed: I wonder that the cobol application was able to store such long value
18:15ordnungswidrigqed: for a passphrase
18:15qedhaha
18:15Chousukethe-kenny: anything besides that though?
18:15Chousukethe-kenny: because username/password is *not* enough for online banking
18:16Chousukeit's too weak.
18:16ordnungswidrigI like the mobile tan (sms) transaction authorization
18:16qedagreed
18:16ordnungswidrigIt's the sth you know + sth you have thing.
18:16the-kennyChousuke: They use pin/tan if you're logged in etc... but for logging in there is just username/password. (I'm in Germany)
18:16_atomost banks here SMS you with a code to confirm any transaction and some of them you can apply for a code generator dongle thing
18:16_atoyah
18:16qedi wonder if anywhere that delivers food is open on thanksgiving...
18:17ordnungswidrigqed: anywhere in germany for sure
18:17Chousukemy bank uses username/password + one time password
18:17qedhaha ordnungswidrig
18:17ordnungswidrigChousuke: paper otp?
18:17qedChousuke: RSA?
18:17Chousukeordnungswidrig: a key card kind of thing.
18:18qedive never seen those
18:18ordnungswidrigqed: I think the only delivery turkeys, right?
18:18qedit looks like that's the case
18:18Chousukeordnungswidrig: the bank application asks for a password corresponding to a certain index and you look it up on the card, type it in then it's used up
18:18ordnungswidrigqed: paypal did send RSA tokens for shipping cost about 2 years ago. never used it but it still keeps generating numbers.
18:19qedreally? that's pretty cool
18:19qedthose keys arent that cheap
18:19ordnungswidrigChousuke: that's the standard tan method in germany. I think it's call I-Tan (for indexed TAN)
18:19qedIIRC
18:19Chousukeordnungswidrig: yeah. I think it's a fairly good system
18:20qedi think they're about 50$
18:20ordnungswidrigqed: a quick google told me they tokens would be about 60 USD per User.
18:20ordnungswidrigqed: :)
18:20qedstill, not very cheap for what they do
18:21ordnungswidrigqed: I think the process at the manufacturer and keeping the secret think secret it what makes the price. The hardware will be some dollars, I suppose.
18:21qedso, while we're talking about things i lug around at work all day (RSA Fob), i recently found out my boss had an RFID tag implanted into the skin between his thumb and index finger
18:22ordnungswidrigqed: scary. How did you find out? Are you wardriving on RFIDs?
18:22_atodoes that mean he has to wear tin foil gloves all the time to prevent being tracked? ;-)
18:23ordnungswidrigha ha
18:23qedhahaha nah, a guy i work with who has been there longer told me about it, and i looked it up, and it's apparently not that uncommon, well, i mean, he's not the only one, it's DEFINITELY uncommon
18:23qedyou go to a tatoo parlor where they do ball bearings in your arm, and wear stuff like that
18:23qedand you get them to wrap it in some medical coating, and pop it in
18:24ordnungswidrigqed: but why? Ball bearings I can understand, but RFID?
18:24qedyou can put stuff on it i guess, like store a tiny bit of data IIRC
18:24qedhe set it up to act as his badge
18:24ordnungswidrigbut why :-)
18:25qedso he waves his hand in front of our card scanners, and walks in
18:25ordnungswidrigbetter they steal my card than my hand, I think.
18:25qedhaha
18:25qedidk, it's the only sort of tatoo i think id be up for
18:26qedit'd definitely solidify my nerdiness, if that hasnt been done already
18:26the-kennyYeah, it's pretty cool.
18:26ordnungswidrigqed: but only in combination with a pin code. and a second card you can hand out to a robber
18:26qedi think qed as a nick, hanging out in #clojure pretty much sealed the deal
18:26ordnungswidrig#clojure is nerdy?
18:26qed:X
18:27qedi should qualify that i dont buy into that crap about nerd vs geek terminology, i use them both interchangeably, and with pride
18:28ordnungswidrighmm, what if your boss changes the job. can his token be used at the new job or will he have to get another one :-)
18:28the-kennyordnungswidrig: Aren't these chips writable?
18:29_atoI dunno, I'm only getting implants when they actually do something useful like IRC
18:29_atoOh wait... that's probably not useful
18:29ordnungswidrigthe-kenny: if they talk the same protocol
18:29qedyeah you can write it
18:29_atoYou may as well just get a ring with an RFID tag in it instead of sticking it in your hand with chance of infection etc
18:29qednow there's an idea
18:29ordnungswidrig_ato: that sounds nice.
18:30ordnungswidrigringfid
18:30qedit has to be a cool looking ring though
18:30the-kennyhttp://xkcd.com/644/ :)
18:30ordnungswidrigone ring to identify them...
18:30ordnungswidrigthe-kenny: :-)
18:30qedi think this is probably what my boss got http://www.hvwtech.com/products_view.asp?ProductID=605&amp;utm_source=Google&amp;utm_medium=Product+Search&amp;utm_campaign=Product+Search+(Nov09)
18:30qedsomething like that
18:31ordnungswidrig* Not a medical tag – not for implanted use in humans or animals
18:31qedif it broke that would /suck/
18:32ordnungswidrigthere exist injectable rfid tags for animals
18:33qedahhh yeah, good point
18:33_atoyeah, it's quite common here to get pets tagged in case they lose their collar and someone finds them
18:33qedbut umm, i doubt there are strict standards for rfids injected into pigs
18:34qedi suppose if we're chopping our animal's genitalia off, we may as well implant them with gadgetry as well
18:34_atohttp://www.flickr.com/photos/nadya/54670483/
18:34qedi want my cat to hum 2600
18:35the-kennyThat's a fairly big needle in my opinion
18:36qedi dont see what the concern is with privacy for rfid, there are so many ways to disrupt something like that
18:36_atoahh.. here we go, a video of tag being injected into someones hand: http://www.youtube.com/watch?v=mr0ozY2HWdM
18:37qedhttp://www.youtube.com/watch?v=fhOSV84RbVk&amp;NR=1
18:37qednext step, heroin
18:37qed"My First Self-Injection"
18:38_atoyeah, I hit up with 5 RFID tags a day
18:38qedlol
18:38qedtie the belt around my bicep
18:38qedtime to get my fix
18:39the-kennyIt'd be funny if you get the tag into a vene... "Wait, I have to search where it is now..."
18:39the-kennys/vene/vein/
18:39qedyeah that'd be awesome until it gets stuck in your heart
18:39ordnungswidrigthe-kenny: lol
18:40ordnungswidrighttp://www.youtube.com/watch?v=vsk6dJr4wps
18:40ordnungswidrigthe self-injection variant.
18:41qedhttp://www.youtube.com/watch?v=TcPOLRAfQOA&amp;feature=related
18:41qedhahahaha
18:41qedExxonMobil Speedpass using his implant
18:47ordnungswidrigwill sleep now. hibernate or like that. cu tomorrow
22:32burnyAny clue's on how I can fix this stackoverflow, I think I need to make the evaulation lazy?
22:32burnyhttp://pastie.org/716780
22:33carkuse recur
22:34carkin the if : (recur (functor ...))
22:38carkerr (recur (/ iu 2) ...
22:38carkand (recur (+ (* ....
22:38burnygotcha
22:40hiredmanno coments on fn minus (http://paste.lisp.org/display/91148) all day
22:41carkhuh what's this thing ?
22:44hiredmanit's a fn replacement built on deftype
22:44hiredmanwell, fn*
22:44carkbut what's the goal ?
22:45lisppaste8hiredman annotated #91148 "add ignored symbols" at http://paste.lisp.org/display/91148#1
22:46hiredmancark: well, there is no goal per se
22:46hiredmanthe fn stuff is currently in written in java
22:46carkdid you check performances of this version ?
22:46hiredmannope
22:47hiredmanit was just something that popped into my head when I woke up this morning
22:48carkthere is a bunch of missing ancestors tho
22:49hiredmancark: yeah, Callable and Runnable are the main ones
22:49hiredmanbut that's easily done
22:49hiredmanyou want to replicate all of AFn
22:50carkclojure in clojure ... =)
22:50hiredmanexactly
22:51hiredmanAFn could be a protocol
22:51hiredmancd
22:56notallamahiredman: i was just looking at that hydra thing you pasted. how does that "future" part work? it looks like it throws away the value.
22:57hiredmannotallama: the future part just spins up another thread that takes care of moving values from the input queue to the output queues
22:57hiredmanI think there is an extra delay in the imlementation on lisppaste
22:58JAS415oh cool
22:58JAS415so fn- holds onto the source
22:58hiredmanoh yeah
22:58hiredmanI forgot about that part
22:59notallamaah yes, i now see what future actually does. i thought it did the body the first time it was deref'd.
23:04JAS415i figured out how to combine yaws and clojure :-D
23:04JAS415need to write some macros or something now