#clojure logs

2011-01-25

00:00brehautdnolen: i grabbed the miniKanren thesis and the ~dec23rd copy of the repo and took it away over the holiday
00:00dnolenbrehaut: rad. it's come a long way since then :)
00:00brehautfrankly its very exciting, but i did have some trouble translating between the scheme notation and the clojure notation
00:00brehautyeah so i see :)
00:01dnolenbrehaut: notation is not set in stone. I'm open to changing some of that around.
00:01brehauti want to write a little blog post about it at some point; taking an algorithm from straight clojure, through a nondeterministic monad and then finally proper logical programming
00:01dnolenbrehaut: I look forward to that.
00:02brehautdnolen: the notation looked fine; i just had some trouble doing the translation
00:02brehautlead to more than one infinite loop
00:04dnolenbrehaut: the next few things will give a few more knobs to prevent common cases of divergence. but first I'm focusing on pattern matching so writing logic programs in miniKanren isn't so tedious.
00:04brehautdnolen: that sounds sensible
00:05scottjare there more/bigger logos examples than examples.clj?
00:05brehautright, i better go cook some dinner
00:07dnolenscottj: sadly not really. I can't say I'm an experienced LP programmer. Been focusing more on the details of implementing a logic engine. But key goal though is to make sure that I can easily convert most of Bratko's Prolog book into miniKanren.
00:08dnolenplenty of juicy real-world stuff in the Bratko book.
00:57scottjre discussion earlier about type inference/static typechecking in clojure, https://bitbucket.org/tarballs_are_good/lisp-random/src/e3c23510d062/HindleyMilner/tests.lisp
02:19amalloyi just had a probably-crazy idea. is it feasible to make j.u.regex.Pattern act like a predicate? eg (let [filters [#"puts" #"string"]] (some #(% "input string") filters)) to try a set of matches
02:21amalloyi realize that in this example it's not hard to change it to (re-find % "input string") but if you want to use them as HOFs it's inconvenient to create anonymous functions all the time
02:23brehautthat does seem sensible
02:23amalloybrehaut: i seem to recall that it's actually not feasible but i just wanted to check
02:23brehautreally?
02:23brehauthuh
02:24amalloyon account if IFn being an interface rather than protocol, for apparently-huge performance reasons
02:24brehautwas about to ask that
02:24amalloyand we can't make Pattern implement IFn
02:24brehautyeah
02:26LauJensenMorning
02:26brehautMorning Lau
02:26amalloybonjour lau
02:28brehauti really look forward to infoq not using flash for its videos
02:29brehautmy laptop is toasty warm now
02:32LauJensenbrehaut: What could change that?
02:32brehauthtml5 video tag
02:32brehautso my browser could offload to the hardware to decode
02:33brehautthis is at least partly apples fault for not letting adobe access its hardware api for video decoding
02:33LauJensenThat would be nice. Though in my experience I dont recall seeing less CPU usage
02:34brehautoh well
02:36brehautthe clojure website should probably link 'dev' (in the top right) to dev.clojure.org raher than the old assembla shouldnt it
02:39LauJensenYea
02:45brehauti should probably make a ticket or rsomething then
02:49amalloybrehaut: i am dazzled by your enthusiasm
02:55amalloyso dazzled that i'm falling asleep. night folks
02:57LauJensenbrehaut: man you dazzled him to sleep :(
03:07brehautthats how i roll
04:01kanzeon#MacPorts
04:40TobiasRaedermorning
04:40LauJensenmorning
04:44ejacksonHello everybody
06:49Licenseraloa
07:49Hali_303what's the closest concept in Clojure what's Enum in Java?
07:50Hali_303many cases I'd need keywords from a restricted set
07:53clgvKeywords would fit.
07:54clgvlike :foo or :bar or :foobar
07:55clgv&:foo
07:55sexpbot⟹ :foo
07:55Hali_303clgv: sure, however in that case there is no compile time check that the value is indeed a part of an enumeration
07:55clgvyou won't get a compile time check for that in a dynamic typed language, I suppose
07:56Hali_303clgv: yeah the problem is however, that it is very easy to mistype all these enumeration values and it would be cool if the compiler could catch that
07:56Hali_303so I know that even tough clojure is dynamic, there would be an enumeration type
07:57clgvyou might use java enumerations if you really need to
07:57Hali_303how else could someone catch all these mistyped keywords?
07:58clgvno idea. I had that problem too. I guess your IDE should support you in that matter.. that would be possible to a certain degree...
07:59clgvatm I try to copy the keywords to avoid typos
07:59Hali_303i see
07:59clgvor in some cases I can encapsulate the usage of keywords behing my function api
07:59clgvs/behing/behind/
08:00sexpbot<clgv> or in some cases I can encapsulate the usage of keywords behind my function api
08:02clgvas conclusion I'd say use the Java Enums in case you really need their strict behavior. you will have compiler checks with them.
08:03Hali_303clgv: I see, thank you
08:08LauJensenIs this still the best way to round up? ##(int (+ 0.5 (/ 11 2)))
08:08sexpbot⟹ 6
08:09mduerksenint isn't round, to be exact
08:09LauJensenmduerksen: Its an old trick for rouding, legendary
08:10mduerksenah, now i get you ^^
08:11mduerksenwhich rounding do you mean then? math rounding wouldn't be accomplished by that trick, economic rounding would (i'm not sure if it's called that way in english)
08:13LauJensenThe above rounds to 5 with (/ 10 2) and 6 with (/ 11 2) which is what I need for pagination, ie. round up if theres a remainder
08:13mduerksenok, then that should be okay. if you need something stochastically stable, it wouldn't be the right way
09:05fliebelmorning
09:08bsteuberdo type hints on protocols get used in the generated interface declaration?
09:14zmyrgelI'm making chess engine and it's still pretty slow
09:15zmyrgelIt takes about 15sec to calculate legal moves to depth of 4
09:16zmyrgelI was thinking that memoize could give nice boost in move generation and in check detection but I just can't seem to figure out how to accomplish that
09:17chouserbsteuber: hm, it doesn't look like it. I thought at least primitives would be generated where hinted, but apparently not. Everything is Object.
09:24robonobozmyrgel: is it a large codebase? I tried to write one in python last summer, but I didn't know enough about branch and bound to make it performant. What algorithm do you use?
09:26zmyrgelrobonobo: it's about 2000 lines at the moment
09:27chouserzmyrgel: are you aware of the memoize function?
09:27zmyrgelchouser: as I pointed out I'm aware of memoize, not enough to make it work :)
09:28zmyrgelsome peer review would be nice
09:28jweissi'm having an issue with leiningen where there's a newer SNAPSHOT on clojars, but it keeps copying in the old one from the local repository. is there a way to force it to update?
09:29jweiss(i know i can manually delete from my local repo, but i mean something in leiningen)
09:30robonoboi'm not sure dynamic programming would work with a set of possibities a large as with a chess game
09:30zmyrgelrobonobo: what do you mean/
09:30zmyrgel?
09:31robonoboif i' not mistaken, memoize is like automatic dynamic programming (if i am, just shout at me)
09:32zmyrgelI gotta admit that the term automatic dynamic programming doesn't ring a bell for me
09:32chousermemoize just maintains a map of function args to values for you
09:32robonobodynamic programming is keeping the values you already calculated in memory so you don't have to calculate them again
09:33chousercertinaly there are functions that can compute their results faster than memoize can look them up, in which cases it would be a poor choice.
09:33chouserrobonobo: I don't think that definition is quite right. That sounds specifically like memoization to me.
09:33zmyrgelI thought the 'sliders
09:34zmyrgelI thought memoize would help generating slider and knight movements on the game board
09:34chouserzmyrgel: for a function f that isn't self-recursive, these days I like: (defn f ...) (alter-var-root #'f memoize)
09:35robonobochouser: Isn't the difference that in what you would call dynamic programming you store them yourself, in memoization it does it for you?
09:36chouserrobonobo: "dynamic programming" to me sounds more like generating code at runtime, which is unrelated to memoization
09:36zmyrgelchouser: ok, lemme try that
09:37chouserzmyrgel: if f is self-recursize that probably won't do what you want. And also note that with stock memoize there's no control on the cache size -- it just grows.
09:37robonobochouser: i might be translating wrong (from dutch) , but that's what we call it in my algortihms class
09:37zmyrgelchouser: yep, that could be an issue with chess :)
09:38chouserrobonobo: interesting. saving previous results of a function for use later so you don't have to re-calculate sounds like exactly the definition of "memoize", and I don't think I've heard another word for it.
09:38chouserhm, though http://en.wikipedia.org/wiki/Memoization does at least mention dynamic programming
09:38robonobofrom wikipedia: The key idea behind dynamic programming is quite simple. In general, to solve a given problem, we need to solve different parts of the problem (subproblems), then combine the solutions of the subproblems to reach an overall solution.
09:40chouserrobonobo: well. You appear to be exactly correct.
09:40chouserrobonobo: thanks for teaching me something!
09:40robonobo\o/
09:41robonobonow I don't think memoization would do a lot of speeding up of a chess game
09:42robonobo i would think the nr of possibilities is just too big
09:43clgvrobonobo: you could use it with a caching strategy instead of storing everything and see if that speeds it up a bit. could be likely
09:44zmyrgelI was planning to see if I could cache the calls to slider move-generation and threaten checks
09:45zmyrgelas sliders can return to positions they have already occupied so I wouldn't need to re-calculate their moves again
09:46robonobosliders?
09:47zmyrgelbishop and queen moves as they 'slide' in the board
09:47clgvzmyrgel: what is your general approach? are you using a game tree?
09:47zmyrgeland rooks
09:48zmyrgelclgv: sort of, my ultimate plan would be to have lazy gametree and progress that once the game proceeds
09:48zmyrgelthe code is in github: https://github.com/zmyrgel/tursas
09:49clgvuhm does that make sense to try to get a lazy game tree? you have to evaluate it in some specified depth to be able to choose the current move.
09:50zmyrgelyes, it would make sense
09:50zmyrgelat least that's what I gathered from John Hughes 'Why Functional Programming Matters' paper
09:51zmyrgelalso, Land of Lisp seems to refer to same paper when making game tree though I haven't yet gotten to the lazy programming section
09:52zmyrgelits kinda difficult for a first lisp/functional programming project
09:54robonobozmyrgel: i would say so
09:54zmyrgelwell, its my bachelors thesis project, still have about 2 months to work on it
09:56robonobois there a reason you use (== x y) in stead of (= x y) ?
09:57zmyrgelonly my assumption that == would be faster as it only works for numbers
09:57raek"The word dynamic was chosen by Bellman because it sounded impressive, not because it described how the method worked."
09:57raekre. "Dynamic Programming"
09:57chouserheh
09:58chouser== is correct for numbers
09:58raekis there any difference between = and == for numbers in Clojure?
09:59chouseryes, though the specific differences depend on the Clojure version.
09:59raek,((juxt = ==) (int 1) (long 1))
09:59clojurebot[true true]
10:00chouserIn 1.3, ((juxt = ==) 1 1.0) returns [false true]
10:01raek= has clojure semantics and == java semantics?
10:01fliebelchouser: Why is that?
10:01chouserIn 1.2, == is much faster for numbers than = is.
10:01robonobo= calls .equals according to doc
10:01robonobo&(doc =)
10:01sexpbot⟹ "([x] [x y] [x y & more]); Equality. Returns true if x equals y, false if not. Same as Java x.equals(y) except it also works for nil, and compares numbers and collections in a type-independent manner. Clojure's immutable data structures define equals() (and thus =) a... http://gist.github.com/795023
10:02raek,(.equals (int 1) (long 1))
10:02clojurebotfalse
10:03chouserhttp://www.assembla.com/wiki/show/clojure/Enhanced_Primitive_Support -- I think "Update redux" is what's currently in 1.3
10:14fliebelHas anyone tried Amazon Beanstalk with Clojure? I'm still looking for my Heroku for Clojure. GAE is close, but I don't want to be tied to their API.
10:17chouserfliebel: tell me when you find it
10:18fliebelchouser: Beanstalk + lein war + AWS free tier, sounds okay...
10:20ejacksonYeah - I thought it was a pretty interesting development
10:20ejacksonthey apparently give you a tomcat to deploy right into
10:21chouser1 year limit?
10:21fliebelyes, after that, you start to pay €10/mo I think.
10:21ejacksonthats not much money
10:22fliebelThat's only the micro instance, last time I calculated, so I think you'll have to pay for S3 and what more as well.
10:24clgvProvided I have lazy sequence where entries 1 to n are already evaluated and the sequence is infinite, can I only iterate over the already evaluated entries?
10:25chouserIt looks like a reserved micro instance running constantly would cost $115.32 per year
10:25chouserclgv: you want to be able to detect what has been unrealized?
10:25fliebelchouser: Including all the extra bits required to boot it?
10:25clgvchouser: yes. it's for debugging purpose
10:28fliebelNow that I think about it, if lazy seqs are immutable, how does Clojure *not* evaluate them every time you do (take 10)?
10:28chouserclgv: for debugging I wrote this: https://gist.github.com/589694
10:28clgvchouser: well mnot really what has been unrealized. I want to know what has been realized and iterate over it to print it for example
10:28raekfliebel: they contain something mutable internally
10:29raekbut the user can only affect it indirectly
10:29chouserclgv: note that code is a giant hack and could break at any moment, but I sometimes find it useful
10:29dnoleninteresting. is it possible to get the following behavior from vectors or list?
10:30dnolen,(let [x '(2) y (cons 1 x)] (identical? x (rest y)))
10:30clojurebottrue
10:30chouserfliebel: it looks like that price does not include storage after the first year. :-P
10:31raek,(let [x (list 2) y (conj x 1)] (identical? x (rest y)))
10:31clojurebottrue
10:31chouser,(let [x (list 1 2)] (identical? (pop x) (pop x)))
10:31clojurebottrue
10:31fliebelchouser: That deems it as expensive for me. (I'd call myself a self-employed student)
10:31chouserfliebel: yeah, it's more than I'd like.
10:32raek,(let [x (vec (range 32)) y (conj x 1)] (identical? x (pop y)))
10:32clojurebotfalse
10:33chouserlists and Cons' retain the original "rest" value internally. vectors and maps don't, so that behavior is impossible for them.
10:33fliebelchouser: I can only hope to have a profitable web service by then.
10:33chouser:-)
10:35raekI don't think it's possible for vectors. in some cases, they can probably share the same tree, but iirc there's a "header" object that holds a reference to that tree and a new instance of that is constructed for each operation
10:35raeks/instance of that/header/
10:35sexpbot<raek> I don't think it's possible for vectors. in some cases, they can probably share the same tree, but iirc there's a "header" object that holds a reference to that tree and a new header is constructed for each operation
10:37fliebelHrm, so all of RoR, Django and CouchDB have IaaS with a basic free plan. How hard would it be to do Clojure? Even sexpbot can run my code ;)
10:37chouserright. and even if there's an identical tree inside, you never get to see that -- you only have access to the wrapper or root object which is different every time.
10:37clgvchouser: having checked the java-implementation I now udnerstand what your hack is doing.
10:38chouserclgv: great!
10:38clgvchouser: I think that "feature" could be easily supported by default
10:40chouserwell, my code demonstrates it can be done. The question then is should it?
10:41clgvI guess for general purpose you wont need it really often
10:41clgvI can think of anything else than debugging right now
10:41clgvs/can/can't/
10:41sexpbot<clgv> I can't think of anything else than debugging right now
10:44fliebelclgv: You could have a loop of growing size :) Not sure what that is good for...
10:45clgvfliebel: I am writing a debugging tool for myself and run into the issue that I used infinite lazy loops which is totally reasonable for the program but which the debuggingtool couldn't handle until now.
10:49clgv*lazy seqs I meant
11:04dnolenchouser: raek: very interesting. I suppose that's yet another reason for list and cons to exist. That's a very useful property for some applications.
11:34hoggarthanyone care to help me understand recur ?
11:34hoggarthtrying to implement sieve of eratosthenes
11:35hoggarth(defn seive [lst]
11:35hoggarth (lazy-seq
11:35hoggarth (cons
11:35hoggarth (first lst)
11:35hoggarth (seive (remove #(zero? (mod % (first lst))) (rest lst))))))
11:35hoggarth(defn primes []
11:35hoggarth (seive (map #(+ 2 %) (range))))
11:36hoggarthit works, but will give stack overflow with large numbers
11:36robonobohoggarth not an expert: recur works differently than recursion would work in other languages
11:37robonobo(i mean i'm not the expert)
11:37robonobowhen you do it the way you did, a new function gets put on the stack every time you call it
11:38hoggarthyep
11:38chouserhoggarth: the problem is that as you progress down the input seq, each element of your returned seq has more and more layers of (remove ...) around it
11:38robonoboif you would use (loop [...] ... (recur)), the program just 'rewinds' to that position with the new values given to recur and starts over
11:38clgvor you could use successive calls to filter
11:39pdkyou're trying to apply remove to the whole list after the current call to sieve
11:39robonobothe simplest example would be (loop [i 0] (if (< i 5) (recur (inc i)))
11:39pdkand again after the call after that etc etc
11:39chouserwhat he's got is essentially successive (that is, wrapped) calls to filter (remove in this case)
11:39robonobowhich does nothing but count to five internally
11:40chouserhoggarth: doing a *real* sieve of eratosthenes on an infinite lazy sequence is acutally rather tricky (in any language I'm aware of)
11:41hoggarthfigures
11:41fliebelOkay, now even I — who knows how recur works — lost track of 4 people explaining it at the same time ;)
11:41chouser:-)
11:41robonobohaha
11:42robonobomaybe just a pointer to some good tutorial would be in order
11:42hoggarththe take away I got was use loop with recur
11:42robonobohoggarth: yes
11:42robonobohoggarth: then you use that loop recur as you would any other recursive function
11:42fliebelNow I'd like to know what a *real* sieve of eratosthenes os… *googles*
11:43chouserhttp://www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf
11:44robonoboi think wikipedia has a nice animation
11:44fliebelI'm looking at it now...
11:44robonobomaaagical
11:49fliebelSo, why would it be tricky to implement a real one in a lazy manner, and what is the one posted above doing?
11:49clgvsmall version with loop-recur:
11:49clgv(defn sieve
11:50clgv [max]
11:50clgv (loop [primes [2] left-numbers (range 2 (inc max))]
11:50clgv (if (empty? left-numbers)
11:50clgv primes
11:50clgv (let [last-prime (last primes),
11:50clgv non-div (filter #(-> % (mod last-prime) zero? not) left-numbers)]
11:50clgv (if (empty? non-div)
11:50clgv primes
11:50clgv (recur (conj primes (first non-div)) non-div))))))
11:52fliebelI see...
11:54fliebelIt should be possible to do lazily, without the p^2 check of course.
11:55amalloydoesn't c.c.lazy-seq already do lazy primes, fliebel?
11:56hoggarth:)
11:56hoggarthi guess it does
11:56fliebelamalloy: Yes… but I'm not sure how.
11:56hoggarthMismatched argument count to recur, expected: 2 args, got: 1
11:56hoggarthoops
11:56robonobohttp://clojuredocs.org/clojure_contrib/clojure.contrib.lazy-seqs/primes
11:56hoggarthhttp://richhickey.github.com/clojure-contrib/lazy-seqs-api.html
11:59fliebelOh, right, the wheel, I studied this before :P
12:00clgvbetter just use filter on range with Miller-Rabin-Test ;)
12:19fliebelAre some, every? and not-every? all predicate functions for seqs?
12:22hoggarthi think so (according to http://clojure.org/sequences)
12:24amalloyfliebel: yeah, as well as not-any?
12:25amalloythough some technically isn't, since it doesn't return true/false unless the predicate you use with it does
12:28fliebelamalloy: Ah! I was looking for not-any, but that isn;t there ;)
12:28fliebel*any
12:39ejacksonI'm trying to parse a java object with a bunch of string properties into a clojure map, keyed off a simple mangling of the property time (ie x.m_name becomes :name). Is there a way for Clojure to give me a list of the objects properties to help here ?
12:40tonylmaybe bean
12:40ejacksoncool
12:41ejacksonthanks
12:41clojurebotGabh mo leithscéal?
12:43amalloyejackson: bean is the way to go if your object has getX methods; if you want to get the m_name field itself...well, you're probably wrong :)
12:44ejacksonamalloy: yeah, i'm making a wrapper over an API to stop being wrong :)
12:52zippy314hi folks, I'm having a weird situation where running a test with lein fails during compilation with: java.lang.IllegalAccessError: execute does not exist
12:52zippy314where execute if s a function that should exist.
12:52zippy314And the code runs fine not it test mode.
12:53zippy314The test file doesn't even have anything in it other than the simple ns declaration:
12:53zippy314(ns anansi.test.commands
12:53zippy314 (:use [anansi.commands] :reload)
12:53zippy314 (:use [clojure.test]))
12:54zippy314any thoughts?
13:03pdkmy favorite part of vimclojure
13:03pdkis how the parens matching is far from bug free
13:03hoggarthzippy314 you are sure the namespace is included?
13:04zippy314hoggarth: thanks, it turned out I had a circular reference. The file refered to a file which refered to it, which seems to be ok when you do lein run, but not when testing.
13:07amalloyzippy314: no thoughts re your error, but i love that you're writing something called anansi
13:07zippy314amalloy: thanks. It's gonna be very cool...
13:07zippy314:-)
13:14amalloychouser: i watched your thing on finger trees this morning, and while i didn't learn that i didn't know from reading the paper, i thought it was quite handy that conjr and consl are like real words with vowels missing. i mentally pronounce them as conjure and conzle
13:24LauJensenamalloy: link?
13:25amalloyLauJensen: http://twitter.com/#!/clojure_conj/status/29896738538000384
13:25zippy314Are assignments in a let block guaranteed to happen in the order they are declared?
13:25amalloyzippy314: yes
13:26hiredmanuh
13:26hiredmanassignments?
13:26amalloyhiredman: bindings, i assume he means
13:26zippy314yah.
13:27zippy314so (let [first "1" second (str first "2")] (println second)) should allways return "12"
13:27amalloyzippy314: yes
13:28amalloy&(use 'clojure.walk)
13:28sexpbot⟹ nil
13:28amalloy&(macroexpand-all '(let [first "1" second (str first "2")] (println second)))
13:28sexpbot⟹ (let* [first "1" second (str first "2")] (println second))
13:28amalloyaw, that doesn't make it clear like i thought. nonetheless it's true
13:29zippy314thx, so there's something else wrong with my code...
13:41mrBliss`I hope the slides are in sync with the speaker this time. It wasn't the case for at least 3 videos.
13:44fliebelWee, lazy primes. Not as sexy as c.c.lazy-seqs/primes(with wheels and stuff), but it works. https://gist.github.com/795374
13:45amalloymrBliss`: yeah it was perfect
13:59chouseramalloy: heh, interesting. unfortunately, both are gone in the current version.
14:00chousernow just use conj instead of conjr, and conjl instead of consl
14:01fliebelchouser: conjl is still a custom function?
14:01golevarwhat is the recommended editor/IDE for clojure?
14:01amalloygolevar: emacs, mostly
14:01golevarheh, could've figured
14:01amalloychouser: *sadface*
14:01amalloythough i do prefer conjl to consl
14:01ohpauleezgolevar: But there is great support for almost any editor
14:02ohpauleezvim, eclipse, IntelliJ
14:02fliebelExcept notepad ;)
14:02ohpauleezFor example, I use vim with vimclojure and paredit.vim
14:02golevarwhat about netbeans?
14:02fliebelccw
14:02fliebeloh, no
14:02fliebelccw is eclipse, right?
14:03brehautfliebel: yes
14:03brehautenclojure is netbeans?
14:04golevarYes, enclojure, anyone advising against it?
14:05tonyldid #clojure log stop saving the logs of the day?
14:12chouserfliebel: yeah, conjl is a protocol function that I assume would only make it into core if/when finger trees did
14:13fliebelchouser: Is that a possibility?
14:13chousertonyl: oh, sorry, that's my fault. the logs are being saved, it's just that the web isn't being updated at the moment. I'll fix that soon.
14:13chouserfliebel: maybe
14:14tonylchouser: thanks for that service, it is really welcome. :)
14:15pdk(doc if-let)
14:15clojurebot"([bindings then] [bindings then else & oldform]); bindings => binding-form test If test is true, evaluates then with binding-form bound to the value of test, if not, yields else"
14:16chousertonyl: thanks -- I always have grand plans for it, and rarely the motivation to put any time into making them happen. :-P
14:19fliebelIs there a way to do (apply concat) to an infinite lazy seq?
14:21chouserapply concat returns a lazy seq
14:23mefestoRaynes: ping
14:23Raynesmefesto: pong
14:23fliebelchouser: It's magic! How can apply stuff an infinite seq into a functions as arguments?
14:23mefestoRaynes: updated the tutorial
14:23chouserfliebel: you answered it yourself -- it's magic
14:24mefestoRaynes: on the repo if you wanna check it out. I don't have a 'Next' link in there yet so at the moment typing 'next' in the REPL will move you to the next screen.
14:24fliebelchouser: Java is not magic, where lies the trick? IN the source of apply or somewhere deep down IFn?
14:24chouserapply will call the function, passing a lazy seq to its & args
14:25fliebel&((fn [& a] (type a)) 1 2 3)
14:25sexpbot⟹ clojure.lang.ArraySeq
14:26Raynesmefesto: Cool stuff. I'll check it out in a moment.
14:26fliebelI always thought it'd be a vector...
14:26chouser,(apply (fn [a & b] (type b)) [1 2 3])
14:26clojurebotclojure.lang.PersistentVector$ChunkedSeq
14:27chouser,(apply (fn [a & b] (type b)) (range 50))
14:27clojurebotclojure.lang.ChunkedCons
14:27fliebelI see… Just any ISeq works.
14:27chouser,(apply (fn [a & b] (second b)) (range))
14:27clojurebot2
14:32fliebelI haven't figured out how and what, but I think Clojure is missing some iterating function. reductions is to reduce as loop is to ???
14:32fliebelno, wrong thinking...
14:32Licenseraloaeh
14:33fliebelLicenser: hi
14:33Licenserhi fliebel how is live?
14:33fliebel*snif* I got a little cold, but besides that, fine :) you?
14:34fliebel(you'll all get crazy when I type *snif* every time I *snif*)
14:42Licenserheh I am fine, got a little cold too but aside of that I'm great :)
14:42amalloyfliebel: the one that's missing is unfold imo, but i don't think that's what you're looking for
14:44chouserfliebel: lazy-seq?
14:47fliebelchouser: I don't know yet. I jus find myself in situations where I need the flexibility of loop/recur, but have it work like reductions or iterate, or...
14:48chouserI think someone once wrote a macro that looked like loop/recur but returned a lazy seq.
15:01hiredmanI have a macro that looks like loop/recur but instead queues up bodies to be run async style
15:12amalloyfliebel: https://gist.github.com/b549634b4d855cde88c2 is how you could use unfold if it existed. is that anything like what you want your loop/reductions hybrid to do?
15:16clojurebot#<RuntimeException java.lang.RuntimeException: javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated>
15:17fliebelamalloy: I don't know. I'm still trying to understand :)
15:19mefestoSeeking advice. I'm working on an internal json api and would like to transparently handle j.sql.Date and j.sql.Timestamp in a general way. I was thinking of representing them as ["date" year month day] or ["timestamp" year month day hour min sec ms tz] then extending c.c.json. Does this seem reasonable?
15:19fliebelamalloy: I think that is kind of what I was thinking of.
15:19amalloyfliebel: unfold is the opposite of reduce (and reduce is often called fold, so...)
15:20pdk(doc unfold)
15:20clojurebotTitim gan éirí ort.
15:21amalloypdk: clojure doesn't have unfold. that's why my gist implements it
15:22zippy314I'm getting this error:
15:22zippy314java.lang.IllegalArgumentException: No matching method found: printStackTrace for class java.lang.RuntimeException
15:22zippy314Shouldn't RuntimeException allways have printStackTrace?
15:22amalloyzippy314: you're probably calling it with arguments, when it should have none
15:22zippy314I only get that if I've set *er* to dev null
15:23zippy314(catch Exception e
15:23zippy314 (.printStackTrace e *err*)
15:23zippy314 (str "ERROR: " e)
15:23zippy314 )))
15:23hiredman*err* is not of the right type to pass to .printStackTrace
15:23amalloy&(class *err*)
15:23sexpbot⟹ java.io.OutputStreamWriter
15:24zippy314in my tests i'm:
15:24zippy314(binding [*err* (writer "/dev/null")]
15:24amalloyit wants a printwriter, not a streamwriter
15:24zippy314ahh
15:24amalloyhttp://download.oracle.com/javase/1.4.2/docs/api/java/lang/Throwable.html#printStackTrace%28java.io.PrintStream%29
15:26zippy314is there a way to create a printwriter through clojure.contrib.io?
15:27zippy314because actually it's working until I do the binding [*err* (writer "/dev/null")] which overrides the standard err
15:27amalloyzippy314: looks like no
15:28amalloybut ##(java.io.PrintWriter. (writer "some file")) should work (but i think sexpbot doesn't allow it
15:28sexpbotjava.lang.Exception: Unable to resolve symbol: writer in this context
15:31fliebelHrm, how comes these infinite cons constructions( ##(source take-nth) ) don't blow the stack, and mine does? https://gist.github.com/795374
15:31sexpbotjava.lang.Exception: Unable to resolve symbol: source in this context
15:32fliebel&(clojure.repl/source take-nth)
15:32sexpbotjava.lang.ClassNotFoundException: clojure.repl
15:32Raynesfliebel: Foiled by sexp!
15:33tonyl$source take-nth
15:33sexpbottake-nth is http://is.gd/N1aIyC
15:33RaynesThat wont work either.
15:34tonylwhy? it gave me the right source
15:34RaynesOh, take-nth.
15:34RaynesI thought you looked up the source to source.
15:34defn(require 'clojure.contrib.seq)
15:34tonyloh never tried that
15:34tonyl$source source
15:34sexpbotSource not found.
15:35amalloyfliebel: because the lazy seqs generated by take-nth are simple
15:35defn&(require '[clojure.contrib.seq :as s])
15:35sexpbotjava.io.FileNotFoundException: Could not locate clojure/contrib/seq__init.class or clojure/contrib/seq.clj on classpath:
15:36fliebelamalloy: Please clarify. Does that mean that if I do take-nth on big enough numbers, ti will fail as well, or does it mean my cal is maintaining some stack space somewhere, while take-nth doesn't?
15:36amalloyfliebel: sorry, i was working on a clarification
15:37fliebelTake your time :)
15:39amalloyfliebel: basically, i think, the issue is the remove. you wind up building a chain of (remove (remove (remove (remove ...)))) and realizing them all at once?
15:40fliebelBit take-nth is building chains of (drop (drop (drop))), so I'm not to sure about that.
15:41amalloytbh it's still sorta black magic to me, and it *looks* like yours should work (cf the drop chain you mention), but my experience has taught me that remove/filter are usually to blame when a lazy-seq blows the stack
15:42amalloydo you get a stack trace? it should be fairly clear what element is repeating
15:43fliebelYea, I had these stacking lazy problems before. But it seems stacks of something is the only way to make use of cons. I'm looking for the trace now
15:45fliebelamalloy: Yea, stack trace dominated by filter: at clojure.core$filter$fn__3714.invoke(core.clj:2130)
15:45fliebel at clojure.lang.LazySeq.sval(LazySeq.java:42)
15:45fliebel at clojure.lang.LazySeq.seq(LazySeq.java:56)
15:48fliebelI don't care to much about why my version explodes, but I wonder why other functions *do* work.
15:49amalloy&(nth (take-nth 1 (range)) 1e5)
15:49sexpbot⟹ 100000
15:49amalloy&(nth (take-nth 1 (range)) 1e6)
15:49sexpbot⟹ 1000000
15:49fliebelI tried up to 1e8
15:49amalloyjust testing that this is in fact the case
15:50fliebelCan we see a stack trace of a non-exploding function?
15:51fliebel1e9 is running now ;)
15:51amalloy&(map #(if (= 1e5 %) (throw (Exception.)) %) (range))
15:51sexpbotjava.lang.Exception
15:51amalloyfliebel: ^ for a stacktrace
15:52fliebelamalloy: But I'd have to raise the exception inside of cons to see what happens there.
15:54fliebelIt seems to consume stack up to sval, and that's it.
15:54fliebel at clojure.lang.LazySeq.sval(LazySeq.java:47)
15:54fliebel at clojure.lang.LazySeq.seq(LazySeq.java:56)
15:54fliebel at clojure.lang.RT.seq(RT.java:450)
15:54fliebel at clojure.core$seq.invoke(core.clj:122)
15:54fliebel at clojure.core$drop$step__3728.invoke(core.clj:2177)
15:54fliebel at clojure.core$drop$fn__3731.invoke(core.clj:2181)
15:54fliebel at clojure.lang.LazySeq.sval(LazySeq.java:42)
15:54fliebel ... 25 more
16:16raeksometimes, strategically placed 'doall' calls can solve the (f (f (f (f (f ...))))) problem
16:17brehautraek: say what
16:17raekthey eat stack because one forcing of a lazy seq element triggers another
16:21raekhrm, I can't find fliebel's old mail list thread...
16:22raek,(nth (iterate #(map inc %) [1 2 3]) 1000000)
16:23clojurebotExecution Timed Out
16:23raekresults in a stack overflow for me
16:23raek,(nth (iterate #(doall (map inc %)) [1 2 3]) 1000000)
16:23clojurebot(1000001 1000002 1000003)
16:24raekthe only difference here is that now, forcing the first element of the seq does not tigger a cascade of realizations
16:25raekI hope this made more sense... .-)
16:25brehautraek: yeah it does
16:26brehautthats quite a sneaky gotcha really
16:30raekyup
16:52shortlordhow can I get a vector that is like another vector with one element somewhere in the middle removed?
16:52shortlordthere must be a better way than using 'into' and to subvecs, right?
16:53raekshortlord: this cannot be done in constant time. in the worst case, you need to traverse everything after the removed element (i.e. linear time)
16:53raekshortlord: no, I think that's pretty much it...
16:54shortlordraek: phew, time is not important, the vector always has a length < 20
16:54amalloyshortlord: finger trees can do this in constant time
16:55amalloy(they are basically 100% magic)
16:55shortlordamalloy: uh, nice, magic is always good
16:56amalloyor maybe they can't? i know they can split into a left tree and a right tree (without the element in the middle) in log time, but maybe stitching those two back together into a single tree takes more time
16:57brehautshortlord: as an added bonus, the wizard has made video explaing his magic http://clojure.blip.tv/file/4614554/
16:57clojurebot#<RuntimeException java.lang.RuntimeException: javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated>
16:58hiredmanclojurebot: stop that
16:58clojurebotwe can't stop here! this is bat country!
16:58amalloybrehaut: act now and you'll get...?
16:58ossarehlol @ clojurebot
16:58brehautamalloy: in my case confision
16:59brehautchouser is clearly a couple orders of magnitude smarter than me
17:00shortlordbrehaut: uh, nice. thx :)
17:03zippy314whats the idiomatic way of getting a subset of a hash, i.e. would be like (subset {:1 1 :2 2 :3 3} [:1 :3]) => {:1 1, :3 3}
17:05hiredman(doc select-keys)
17:05brehautzippy314: (reduce dissoc myhash keys) ?
17:05clojurebot"([map keyseq]); Returns a map containing only those entries in map whose key is in keys"
17:06brehautman what was i thinking. thats completely wrong.
17:10zippy314clojurebot: ? I'm being noob, I don't get it: (def x {:1 2 :3 4}) ([x [:1]]) => Wrong number of args (0) passed to: PersistentVector
17:10clojurebotXmL is case-sensitive
17:11hiredman(doc select-keys)
17:11clojurebot"([map keyseq]); Returns a map containing only those entries in map whose key is in keys"
17:11zippy314tx
17:15tonylzippy314: wrapping a vector in parenthesis ([x [:1]]) makes it a function call. vectors are functions of their indexes ##([:a :b :c :d] 2)
17:15sexpbot⟹ :c
17:16zippy314tx
17:33pdk,(boolean nil)
17:33clojurebotfalse
17:34zippy314ok, not understanding dosync and alter:
17:34zippy314(def x (ref {:1 1})) (dosync alter x merge {:2 2})
17:34zippy314I would have thought @x should now be {:1 1 :2 2}
17:34zippy314but it's unchanged.
17:34pdk(dosync (alter x merge {:2 2}))
17:35pdkalter requires its own function call within the dosync
17:35zippy314zippy314 is slinking away embarassed
17:39amalloyzippy314: btw, if you change your def's to let's, you can use clojurebot/sexpbot to demonstrate to other people what behavior you're not understanding, like ##(let [x (ref {:1 1})] (dosync (alter x merge {:2 2})))
17:39sexpbot⟹ {:2 2, :1 1}
17:40zippy314testing ##(let [x 1] x)
17:40sexpbot⟹ 1
17:41zippy314(let [x 1] x)
17:41zippy314#(let [x 1] x)
17:41zippy314##(let [x 1] x)
17:41sexpbot⟹ 1
17:41zippy314Cool!
17:41amalloyzippy314: specifically, messages starting with , or & are interpreted by clojurebot and sexpbot respectively
17:41amalloyand ## can be used anywhere in a message to activate sexpbot
17:41zippy314&(let [x 1] x)
17:41sexpbot⟹ 1
17:41zippy314,(let [x 1] x)
17:41clojurebot1
17:42zippy314whats the difference between cojurebot and sexpbot?
17:42amalloydifferent authors, different feature sets, different...
17:42zippy314ah
17:43brehautthe biggest difference is that clojure-bot is part of big brother and hes recording everything you type
17:43amalloy$sed brehaut s/recording.*/watching over you
17:43sexpbot<> $sed brehaut s/watching over you
17:43hiredmanwell, actually my log is recording everything
17:43amalloydamn, i can never remember how that works
17:43hiredmanand piping into sqs
17:44amalloy$help sed
17:44sexpbotamalloy: Simple find and replace. Usage: sed [-<user name>] s/<regexp>/<replacement>/If the specified user isn't found, it will default to the last thing said in the channel. Example Usage: sed -boredomist s/[aeiou]/#/Shorthand : s/[aeiou]/#/
17:44amalloy$sed -brehaut s/recording.*/watching over you
17:44sexpbot<brehaut> the biggest difference is that clojure-bot is part of big brother and hes watching over you
17:45brehauthah
17:46hiredmanhttps://github.com/hiredman/Howler
17:47brehauthiredman: my immediate question is: Black Company?
17:48hiredmanwhat about it?
17:48brehautis that where the name is from?
17:48hiredmannope
17:49joegalloMaybe an x-files reference? http://x-files.wikia.com/wiki/Unruhe
17:50hiredmannope
17:50hiredmanit Howls at you over growl
17:50brehauthah awesome
17:51joegalloI've got it, you're a big fan of the Pittsburgh bar scene. http://howlerscoyotecafe.com/
17:51hiredmanjoegallo: fine, I admit it, you caught me
17:51joegallo:)
17:55Scriptordoes anyone know the name of the datastructure Clojure uses for hashmaps?
17:56raekpersistent hash trie, iirc
17:56brehautbagwell trie
17:56Scriptorah, thanks!
17:56raekhttp://blog.higher-order.net/2009/09/08/understanding-clojures-persistenthashmap-deftwice/
17:57raekthat one mentions "Array-mapped hash trie"
17:57brehautalso, doesnt the clojure implementation change the concrete type depending on the size of the map?
17:57raekin clojure-land, it is most often refered to as "persistent hash map"
17:58raekyes
17:58raekarray-map vs hash-map
17:59Scriptorso the O(log32(N)) comes from the fact that it's stored as a sort of tree?
17:59raekyes.
18:00Scriptorman, I need to finish reading functional data structures
18:00raekif you won't read Krukow's articles, at least take a look at the pictures. they are pretty informative, I think... :-)
18:01pdkwhere are these articles
18:01pdki know okasaki's book though this is news
18:02Scriptorhmm, I only have okasaki's thesis
18:02raekhttp://blog.higher-order.net/2009/09/08/understanding-clojures-persistenthashmap-deftwice/ and http://blog.higher-order.net/2009/02/01/understanding-clojures-persistentvector-implementation/
18:03Scriptorraek: thanks!
18:11dnolenhttp://lampwww.epfl.ch/papers/idealhashtrees.pdf
18:33arohnerhas anyone tried reading from *in* or System/in when using slime?
18:35amalloyarohner: yes, it is known to be hard
18:35arohneramalloy: is there a solution?
18:35amalloyi don't know, actually
18:41edoloughlinAny ideas appreciated: I've run into the same issue with clj-record and clojureQl when trying to insert a record containing an int value. I get a classCastException and a message: "transaction rolled back: java.lang.Integer cannot be cast to clojure.lang.IFn".
18:42hiredmanclojurebot: english?
18:42clojurebotEnglish is the official language of the universe
18:44raekedoloughlin: does the stack trace tell you that the exception is thrown from within clj-record/clojureQl or from your own code?
18:45edoloughlinraek: By the time the exception gets caught in my code the stacktrace is null. I'm pretty sure it's not in my code.
18:46raekedoloughlin: null? have you tried to look at the causes of the exception?
18:46edoloughlinraek: it's null.
18:46pdk,(for [i nil] (inc i))
18:46clojurebot()
18:46raekI don't understand.
18:46raek,(throw nil)
18:46clojurebotjava.lang.NullPointerException
18:47raekyou cannot even throw null
18:47edoloughlinThat's makes two of us. I get a ClassCastException with a message and no cause.
18:47raekwhat IDE?
18:47edoloughlinEclipse/CounterClockwise
18:48edoloughlinLine-by-line debugging is difficult in this environment
18:48raekok, I'm an emacs guy, but have you tried (.printStackTrace *e) in the repl?
18:49edoloughlinI need to figure out how to get a REPL when debugging - new to this :(
18:49raek(perhaps that only works if you eval the expression in the repl, I don't know)
18:50edoloughlinThanks anyway. I'll set some breakpoints in contrib.sql and see what I can find. At least it's not an obvious noob mistake...
18:51raekyou should be able to get more details from the exception somehow
18:51raekit should indicate the source lines for each call in the call stack
18:52edoloughlinDriving me nuts. Everything was tickety-boo until I tried to insert an int.
18:53raekyou will get the same kind of exception if you do something like this:
18:53raek,(1 :a :b :c)
18:53clojurebotjava.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.IFn
18:54edoloughlinHmm. Don't think I've done anything that silly. Will have a quick check
18:57raekif you can launch your code from the repl, (.printStackTrace *e) should be sufficient to get the whole stack trace
18:58raekthe info you are looking for is without doubt in the stack trace
18:58edoloughlinMight be a bit tricky. It's all buried in ring/compojure
18:59edoloughlinIs there a way I can invoke the repl from my code?
19:00raekedoloughlin: have you tried this? http://clojuredocs.org/ring/ring.middleware.stacktrace/wrap-stacktrace
19:00raekedoloughlin: yes. calling your handler function directly.
19:00edoloughlinOk. Will try. Thanks for the help
19:02raek(my-handler {:uri "/foo/bar", :request-method :get, :headers {}}) ; something like this maybe
19:02raekoh, read your utterance backwards. that would anser the question "Is there a way I can invoke my code from the repl?"
19:07edoloughlinThink I've isolated the code. It's choking on what looks like a valid record.
19:11edoloughlinraek: Found it. Noob mistake. Had (def someval 1) and was doing (assoc somerec :field (someval))
19:12edoloughlinraek: Sorry for wasting your time with something so dumb.
19:24nishantis this the right place for questions on clojure-hadoop?
19:25amalloynishant: i don't think there's a better place, but clojure-hadoop is not very up-to-date last i checked
19:25amalloyoh, or maybe it is and i was thinking of clojure-cassandra. don't take my advice :P
19:27nishantamalloy: the version I'm using (1.3.1-SNAPSHOT) seems to work, I was able to build it, and also run the example 1 from a java command line, but I am running into problems when I try to run a job from a slime repl.
19:56nishantcan I start "lein swank" with logging?
20:09zakwilsonMongo or Postgres... that is the question. Should I flip a coin?
20:18danlarkinzakwilson: that is a ridiculous question. do you choose between sandals and snow boots?
20:18danlarkinno, you use each when appropriate
20:19zakwilsonWell, if I don't really know what the weather's going to be like and probably won't until I've been walking for a while....
20:20danlarkinthere's your first mistake
20:20danlarkinhow can you expect to make correct decisions then?
20:21hiredman~google seattle weather
20:21clojurebotFirst, out of 2460000 results is:
20:21clojurebotSeattle, Washington (98101) Conditions &amp; Forecast : Weather ...
20:21clojurebothttp://www.wunderground.com/US/WA/Seattle.html
20:22zakwilsonI don't expect to make correct decisions. I think the best I can hope for is a lower probability of being wrong.
20:24danlarkinzakwilson: well if you want to just go hacking around then it doesn't really matter what you choose, does it? But if you want input on your decision (and I assume you do, since you asked in this public forum), then you really should be putting more thought into what data you want to model
20:24david`,(let [ab-adder (partial concat [:a :b])] (ab-adder [:c :d]))
20:24clojurebot(:a :b :c :d)
20:28zakwilsonWell, most of what I have to store will be in Clojure maps, for which MongoDB looks to be a good fit. I guess my real question is how good the respective Clojure libraries are. Both ClojureQL and CongoMongo look good at a glance with the former appearing a bit more mature.
20:30danlarkinwell if your sole criteria is maturity then I don't think you can beat jdbc
20:33symuynDoes anyone know off the top of their head what the hash-function of vectors is?
20:35zakwilsonIt isn't. Fitting naturally with Clojure is a major criterion. The importance of maturity isn't linear; I don't mind something fairly new, but I don't want breaking changes every weak or significant unreliability.
20:37danlarkinthen my (admittedly biased) opinion is to stay away from flavor-of-the-week datastores like mongro
20:38danlarkinand depending on your durability needs, you can just use clojure datastructures in memory
20:38danlarkinor contrib.datalog
20:42zakwilsonI can do most of the interesting stuff with Clojure data structures in memory, but I want a place to put them, queries without loading everything in to memory, indexing...
20:43hiredmanhttps://github.com/richhickey/sdb
20:43hiredmanif you are just hacking around, why bother with keeping your own database?
20:45zakwilsonI'm building an API to provide a text classifier as a web service. I don't want it tied to a specific hosting platform though I can see where SimpleDB would save effort.
20:53david`did Stuart's clojure conj talk ever get posted?
21:03danlarkinzakwilson: you should check out http://www.infoq.com/presentations/Enterprise-NoSQL
21:03zakwilsondanlarkin: thanks
21:16mec_If I have a regex that matches (.*=)?... is there a way to just return .* as in ((.*)=)? without the extra return in there as well
21:18mefesto(?:(.*)=)
21:18mefestomec_: non-capturing outer group but capturing the inner group
21:19mefesto,(re-find #"(?:(.*)=)" "key=val")
21:19clojurebot["key=" "key"]
21:21mec_interesting so (?...) is non capturing group?
21:21mefesto(?:)
21:21mec_ah, thank you
21:21mefestonp
21:36brehautdavid`: stuart halloway?
21:37brehautdavid`: http://www.infoq.com/presentations/Clojure-Java-Interop ?
21:47symuynIf I have a map whose keys are vectors, do the performances of assoc or get depend on the size of the vector keys?
21:52tomojyou have to compute the hash once for each vector to do those, I think?
21:53tomojand that requires hashing every element?
21:53tomojif you keep hold of the same keyset, the hash will always be cached
21:54symuynAlready, that makes sense
21:54symuynI mean, alright
21:55tomojI don't know if that hashing actually takes long enough to matter anyway
21:56symuynI'm thinking about the cost of memoization
21:56symuynOf a sort
21:56symuyn(And by "of a sort", I mean "of a kind", not "of an ordering", heh heh)
22:09mec_,(reduce (partial apply assoc) {} (map list [:a :b :c] [1 2 3]))
22:09clojurebot{:c 3, :b 2, :a 1}
22:09mec_is there a better way? there just has to be.
22:10mefesto,(zipmap [:a :b :c] [1 2 3])
22:10clojurebot{:c 3, :b 2, :a 1}
22:11mec_well then, thats not at all what i thought that did
22:11brehautmec_: is it possible you thought it was like haskell's zip but for maps?
22:12mec_I thought it had something to do with zippers, not sure why i didnt do a (doc) on it, i did on all the other map functions
22:13brehautmec_: the reduce portion of your code is roughly 'into' btw
22:14brehaut,(into {} [[1 2] [3 4]])
22:14clojurebot{1 2, 3 4}
22:14brehautthanks clojurebot
22:14mec_ah nice
22:14brehautsuper handy
22:15mec_i forgot about conj over assoc too
22:16mec_al look at that into is even defined as (reduce conj)
22:16brehauti live in fear of someone looking at some of my publicly available clj code and saying 'why did you do [big long mess]; you could just use [stdlib fn])
22:16mec_exactly, therefore my main assumption is there is always a better way to do whatever im doing
22:16brehautmec_: yeah, + a transient
22:16brehautyup
23:23brehautbeing able to define monads dynamically is awesome
23:24tomojare there monads in aleph?
23:25brehautive never looked at aleph
23:25brehautthats the event driven concurrency lib right?
23:28replacadavid`: I don't think it's up yet. They're working their way through the two days in order