#clojure logs

2013-03-06

00:00TimMcdcolish: futures implement j.u.c.Future
00:01dcolishok thats what i thought
00:01aduwhat does j.u.c stand for?
00:01dcolishjava.util.concurrent
00:01aduah
00:02dcolishalthought it looks like future does a dispatch to some thread pool or executor too
00:03TimMc~j.u.c.
00:03clojurebotexcusez-moi
00:03TimMcRaynes: You can make it up to me by explaining how clojure.core/promise gets away with only implementing one arity of invoke for IFn.
00:04Raynes*shrug*
00:04dcolishah it submits to an actor
00:04dcolishhaving the source in the docs is a nice feature
00:05dcolishi've wanted that in javadoc over xrefs
00:08dcolishits too bad clojure-guava only wraps the guava collections
00:09TimMcRaynes: I guess the JVM allows instances of classes that have abstract methods, even though Java doesn't.
00:14amalloyTimMc: i think java allows you to use instances of such classes too, just not compile them
00:14TimMcamalloy: Create them via reflection? Sure.
00:15TimMcBut I would be surprised if you could link against them.
00:15amalloyTimMc: well, i meant "invoke methods on them when passed them from somewhere else", but i think that's actually a pretty silly distinction
00:17TimMcI'm not even sure how to look this up or test it out.
00:17TimMc(The linking question.)
00:18TimMc,((promise) 1 2)
00:18clojurebot#<AbstractMethodError java.lang.AbstractMethodError: clojure.core$promise$reify__6354.invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;>
00:21dcolishhmm, i think the jvm will enforce instantiation of abstract classes
00:21dcolishits one of the access flags for the class file format
00:29amalloyTimMc: https://www.refheap.com/paste/9ed6c6cdbad1b47596d9be371 compiles fine, and runs fine with java -cp .:clojure.jar tmp.core - there's no special "clojure-specific" linking going on at that point, just the jvm linking with a .class file that claims to implement j.u.List but doesn't have all the methods
01:00technomancyclojurebot: java.util.concurrent?
01:00clojurebotjava.util.concurrent is "When I find myself in times of trouble / Prof. Doug Lea comes to me / Coding lines of wisdom / j.u.c."
01:00technomancybetter late than never, eh
01:00jeremyheilerThat's great.
01:01technomancyI stole it from Ted Nyman
01:01dcolishamalloy: neat
01:02technomancythere's also a version that goes "When I find myself in times of trouble / Col. Sanders comes to me / Cooking breasts of chicken / K.F.C." but that one is less relevant to this channel
01:03jeremyheilertechnomancy, I went to Oswego, so it makes me laugh because it's so true.
01:04technomancyoswego?
01:04jeremyheilerSorry. Doug Lea teaches at Oswego.
01:04technomancyoh, nice
01:05jeremyheilerI stayed an extra semester so I could take is Parallel Computing class. Worth every dime.
01:05jeremyheilerhis*
01:05technomancyhe may not be aware that he has a copyright-infringing theme song, but maybe you can advise him of the fact the next time you visit your alma mater
01:06technomancyhuh: http://gee.cs.oswego.edu/dl/html/jcp22oct10.html
01:06jeremyheilerhaha
01:06jeremyheileroh, yeah, that was interesting
01:07technomancygo openjdk
01:09jeremyheileryea seriously
01:11technomancyrockin' stache too
01:11jeremyheilerusually has the full Einstein look.
01:15jeremyheilerit's funny. he once said he '
01:15jeremyheiler"programs in java-ese and then translate it into java so we all can understand it"
01:16jeremyheilerspeaking about juc of course.
02:26noidiambrosebs, it doesn't work for me now either. somehow it did work for me on monday, which is odd. maybe I had my repl in some weird state that made it work :)
02:27ambrosebsnoidi: It should be easy to support, probably just needs a flag that says which namespaces are currently being checked.
02:28noidithat would be nice
02:28noidiotherwise you'd need a unit test running check-ns for each namespace to get automatic type checking
02:29ambrosebsnoidi: namespace management is also something that's lacking.
02:29ambrosebsI might include a "typed-ns" macro which names dependencies and automatically has check-ns invoked in its mexpansion.
02:31noidiso you'd use typed-ns instead of ns?
02:31ambrosebsUm, probably not.
02:31ambrosebsI was thinking of both.
02:31ambrosebsMight not be the best idea.
02:31amalloyyou can't really avoid having ns
02:31ambrosebskinda.
02:31noidiyeah, that's what I thought
02:32noidiyou'd still have to get a hold of the custom ns-replacement somehow :)
02:33ambrosebsperhaps you could provide leiningen with which namespaces should be type checked.
02:36ambrosebsThere's also some interesting contract wrapping that could be done. I basically want all references to a particular var untyped.ns/foo from a namespace typed.ns to be wrapped in a particular contract. But it does not affect other namespaces. Any ideas?
02:37ambrosebsMaybe the easiest would be to create a new def typed.ns/foo which is untyped.ns/foo wrapped in a contract.
02:38noidiso you'd use the typed-ns macro to rewrite typed code (to add contracts, etc.)?
02:39ambrosebsSomething along those lines. We don't really need the ns macro, just provide a typed-require.
02:39ambrosebsTwo ns macros kinda sucks.
02:47noidimaybe the contract checking should happen on the caller side. then it would also work when calling functions passed in as arguments.
02:48noidiotherwise untyped code could call typed code and pass in a function with the wrong contract
03:42dEPyWhat is reify in clojure? O_ô
03:47illiuxDEPy: It creates an instance of an anonymous type
03:48illiuxerr dEPy
03:50dEPyam, naonymous type is what? like an interface?
03:52tsdhIs there a way to define the order of execution of deftests in a test file when run by "lein test"? It seems the order is arbitrary.
03:53Foxboronambrosebs: yeah i have. Interesting tbh. But i don't really know how the whole type system works, so kinda unknown territory ^^
03:56ambrosebsFoxboron: Well if you feel it might be useful, I've started some tutorials http://clojure-doc.org/articles/ecosystem/core_typed/home.html
04:06illiuxdEPy: Not an interface, but closely related. riefy you provide implementation methods for a set of protocols and interfaces, it returns and instance of the type defined by that implementation.
04:06illiux*an instance
04:21ciphergothInside a running web server process (Aleph) I want to poll for something every second. Is the right thing to fork off a thread that calls (Thread/sleep 1000) after every poll?
04:23mpenetciphergoth: use scheduled executors in j.u.c
04:24mpenetor is it tied to the requests/responses? (ex: long polling)
04:24ciphergothAs a server, we allow our clients to long poll so they don't have to worry about this sort of nonsense. Sadly the services we're using don't offer that.
04:25ciphergothhmm, https://github.com/overtone/at-at
04:25mpenetok, so java.util.concurrent or a wrapper ex: https://github.com/mpenet/knit#scheduledfuture
04:25mpenetor at-at yes
04:27ciphergothI'm strongly influenced in my choice of library by things like nice colours in the README.md and the words "build:passing" after the name :)
04:27mpenet:)
04:27ciphergoththey tend to correlate with being the good library!
04:27ciphergothit's not quite as shallow as it seems!
04:27mpenetwell the tests in knit are weak, but it works (I am using it in a few libs in production)
04:27mpfundsteinare you guys using classes in clojure?
04:29clgvmpfundstein: deftypes and records when needed
04:29mpenetat-at should be just as good, it's just a different api, matter of personal preference
05:23mpfundsteincan i somehow pass a sequence like this as an argument to assoc? (:id 33333 :time 1362565416258 :priority 3 :action "hehe" :args nil :group nil)
05:24Kototamampfundstein: (apply assoc m s)
05:24mpfundsteinKototama: thx
05:24Kototamampfundstein: see also (merge
05:49augustlwith clojure.xml/parse, is it possible to manually specify encoding? We get an utf-8 encoded file but the xml file says its encoding is utf-16 so parsing fails
06:34squidzdoes anybody know what my javascript file is being read in as a html document? I am using compojure with clostache. I have two <script type="text/javascript" src="..."></script> calls. The first refers to a url which loads fine. The second call refers to a js file in my resources/public folder. I also added (route/resources "/") to my defroutes
06:35squidzI am getting a 404 not found while trying to load the second local js file
06:39faust45squidz: you can use firebug to debug your app
06:41squidzfaust: yes I think it is a problem with my setup on the compojure side. I now see that I might have to specify the resources-path in my project.clj
06:43squidzmaybe not
06:51squidzokay when I change my route addresses that preced my (resources "/") call then it works. I just changed a previous GET call from (GET "/p" [] (page-call)) to (GET "/" [] (page-call)). Can anybody explain why this affected my (route/resources ...) call?
06:57faust45squidz: i think this kind of questions you can debug by self
07:01squidzfaust45: Yeah, I already have it solved, but I should state my solution, and out of curiosity ask to get a deeper understanding
07:46justinleitgebrubygems
09:01TimMcamalloy_: (java.lang.reflect.Modifier/isAbstract (.getModifiers (class (reify java.util.List (size [this] 10))))) -> false
09:02TimMcamalloy_: The question, is what would *javac* do upon encountering such a class file that a .java file was referencing. I know the JVM itself is all hunky-dory with it.
09:03TimMcIs there some way I can persist a runtime class object to disk as a .class?
09:08jcidahohi - anyone using elastisch or clj-elasticsearch - am wondering if either of these give the ability to limit the fields that come back from es, using http://www.elasticsearch.org/guide/reference/api/search/fields.html...
09:43clgvTimMc: yes set *compile-files* to true
10:01fbernierHow could I split a sorted-map into two collection of keys and values while keeping the order
10:01clgvfbernier: do `keys` and `vals` not work?
10:03fbernierclgv: no, they return a hash which is not guaranteed to keep the order
10:04fbernieruser=> (keys {:a 1 :b 2 :c 3})
10:04fbernier(:a :c :b)
10:05rplacafbernier: that's not a sorted map
10:05clgv,(keys (sorted-map :a 1 :c 3 :b 2))
10:05clojurebot(:a :b :c)
10:06clgv,(vals (sorted-map :a 1 :c 3 :b 2))
10:06clojurebot(1 2 3)
10:06fberniersweet
10:06fbernierthanks
10:28jcromartieso I found a very simple solution to the "no println output when running a compjure server in Emacs/nREPL" problem
10:29jcromartiesimply wrap your handler with bound-fn when starting Jetty...
10:29jcromartienow what are the potential problems with this?
10:40jtoycan anyone point me to a webpage that explains how to interpret this or can someone explain it to me: [& {:keys [file user]}]
10:40jtoythat is options for a function i see
10:41andreaslundahljtoy: http://clojure.org/special_forms#Special%20Forms--Binding%20Forms%20(Destructuring)
10:42mikerodjtoy: Another link I like for clojure destructuring is http://blog.jayfields.com/2010/07/clojure-destructuring.html
10:44jtoythanks
10:51degI've just moved from Clojure 1.4 to 1.5, and the (pst) function seems to have disappeared??
10:51lazybotdeg: Uh, no. Why would you even ask?
10:52aroemersheh, there's your answes :)
10:52aroemers*answer
10:52deg?? Why did Lazybot trigger on that line?
10:53aroemersJust randomly
11:08rahcolaanyone around who knows about the internals of nrepl?
11:13jtoyhow do I create a sequence with one item in it? (map ( fn[x] '(x)) [1 2 3]) doesnt seem t owork
11:13llasramjtoy: ##(map vector [1 2 3])
11:13lazybot⇒ ([1] [2] [3])
11:16jtoyllasram: i think i need an actual seq, im testing now though
11:17llasram&(seq? [1])
11:17lazybot⇒ false
11:17llasramOh, heh
11:17mpfundsteini love clojure
11:17mpfundsteinperiod
11:17llasramjtoy: Then ##(map list [1 2 3])
11:17lazybot⇒ ((1) (2) (3))
11:17gtrak,(seq [1])
11:17clojurebot(1)
11:18llasramYeah. Vectors are seqable, but don't directly implement ISeq (apparently)
11:18gtrakquoting doesn't work because it quotes what's inside the s-exp
11:19gtrakdoes the :parent key in a lein2 project map have practical use in a multi-module project? How would I go about doing something like that?
11:22jtoyparenedit vim question, if I am at the |: [|(re-pattern x)] , how do I add parens so it becomes: ( [(re-pattern x)] )
11:34gadgetjtoy: i put my cursor over the left bracket and type <leader>W(
11:39gadgetjtoy: sorry, i should have typed it out first before respondign. you can either do <leader>W or <leader>w(
11:39jtoygadget: cool, im still learning paredit
11:40babilenSpeaking of paredit ... Is there a nice cheat sheet somewhere?
11:40spligakMaking a request using clj-http with :throw-exceptions false and :as :json, when the response would normally throw an exception (say, status 400+), it doesn't honor the :as :json and decode the body. Anyone else experience this?
11:41spligakI don't mind decoding the body manually, just seemed odd.
11:41ToBeReplacedbabilen: first google result http://emacswiki.org/emacs/PareditCheatsheet
11:41jtoygadget: that only puts around the current symbol, that doesnt go around the whole piece im trying to add it around, do I then just need to move it manually?
11:43babilenToBeReplaced: ... for vim (as was previously discussed)
11:44gadgetjtoy: i'm not sure i understand, you wanted it to look like ([(re-pattern x)]) right? what does it look like to you after wrapping it in the extra parens?
11:44babilenToBeReplaced: sorry, I should have stated that more clearly rather than relying on the assumptions that people will interpret that question in the context of the ongoing conversation
11:45gadgetbabilen: i just use the paredit.txt file in the ./vim/bundle/paredit-0.9.7/doc directory
11:45gadgetif you're using pathogen that's where it would be at least
11:46babilengadget: yeah, sure. I can read that easily with ":help paredit.txt", but Emacs' paredit has a very helpful cheatsheet that might have been translated for the vim version already
11:46gadgetbabilen: oh sorry i don't know of one
11:46babilengadget: Take a look at the cheat sheet ToBeReplaced linked earlier and you might realise how that comes in handy during the initial learning period
11:46NeedMoreDesuI'm still interested in hot code swapping on .class/.jars. Any help would be appreciated.
11:50NeedMoreDesuhttp://stackoverflow.com/questions/15145721/clojure-hot-code-swapping-for-uberjars-classes
11:53dakronespligak: let my see if I can reproduce it
11:55spligakdakrone, I'm using the 'request' function directly, passing in a handful of options in addition to those two. happy to throw up a gist if you'd like.
11:56TimMcclgv: Thanks! *compile-files* is exactly what I needed.
11:57clgvTimMc: good. :) you have to use alter-var-root though
11:57clgvTimMc: `set!` won't work...
11:59degI've just moved from Clojure 1.4 to 1.5, and the (pst) function seems to have disappeared?? Is this a known issue?
12:02kittylystAnyone recommend a good Clojure project for parsing Apache logs?
12:03spligakdakrone, hah. get it? "throw" up a gist? *rimshot*
12:03S11001001deg: clojure.repl/pst is still defined in clojure-1.5.0
12:03zodiakdeg, yeah, pst is definitely still in 1.5
12:03dakronespligak: heh, a gist would be helpful if you could get one to me
12:04TimMcamalloy_, clgv: Yep, you can totally compile Java against a class with abstract methods: https://gist.github.com/timmc/5100962 Color me surprised.
12:04spligaknot a problem at all. one minute.
12:05zodiakkittylyst, surely you could jst open up a clojure.java.io/reader and run over it
12:05zodiakkittylyst, if it's really big, and always appending, you could always play around with storm ;)
12:05clgvTimMc: duck typing with java ^^
12:05clgvargs with jvm ;)
12:06kittylystzodiak: Homebrewing with regexps was precisely what I was trying to avoid :)
12:07zodiakregexps ? surely you jst use clojure.string/split, and then decompose what you want out from there
12:07zodiakyour regex would be " " :)
12:07owengalenjonesdoes anyone use clj-soap? is this project dead forever?
12:07zodiakor rather, #"\s+" (if you prefer)
12:09zodiakclj-soap is dead ?
12:09gfredericksSo (let [nums (range)] (#(dorun nums))) leaks, but (let [nums (range)] ((^{:once true} fn* [] (dorun nums)))) does not
12:09owengalenjonessean corfield has stated he has given up on it
12:09gfredericksis the :once metadata a supported feature? should it be encouraged in macros that create thunks that are only called once, e.g. clojure.java.jdbc/transaction ?
12:10zodiakowengalenjones, must have missed that.. do you have a problem with the implementation, or is missing something ?
12:11owengalenjoneszodiak: I have the same issue listed in this thread (which I using as a test) https://groups.google.com/forum/#!topic/clojure/dewY8-Ao9AE, sean's last comment appears to be him giving up on it :/
12:12zodiakinteresting. reading
12:12kittylystzodiak: Your regex fails on the first line of my log file, e.g.:
12:13kittylyst123.125.71.102 - - [03/Mar/2013:06:31:19 +0100] "GET / HTTP/1.1" 302 299 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)&quot;
12:13mikerodIf I want return a function that has a to-be-determined number arguments/formal parameters, I have determined this works for me (eval `(fn [~@params] ~expr)). I do not think this is a clean solution (it uses eval). What I'm wanting to be able to do is to spread out some list of params into the param vector of the anonymous fn.
12:14kittylystzodiak: And I can make it fail in pretty much arbitrary ways if I can't control the date format
12:14zodiakkittylyst, the apache regex wholly and totally depends on how ~you~ have configured apache and it's log format
12:15zodiakperl-mongers have some pretty nice regex's on this mind you. don't see why a regex (posix compliant) shouldn't jst map across (no pun intended)
12:15clojurebotmap is slightly retarded
12:15zodiak+1 internets clojurebot
12:15kittylystzodiak: Yes, I'm an old perl monkey, so I'm aware of some of them I just hoped there were nicely wrapped versions
12:16kittylystE.g. "^([\\d.]+) (\\S+) (\\S+) \\[([\\w:/]+\\s[+\\-]\\d{4})\\] \"(.+?)\" (\\d{3}) (\\d+) \"([^\"]+)\" \"([^\"]+)\"" - which is not quite right, but isn't a bad start
12:16kittylyst\
12:16spligakdakrone, https://gist.github.com/jasonjohnson/5101078 -- let me know if that helps.
12:16owengalenjoneszodiak: anyway what I was attempting to do is use magento's soap api as their rest api only is available to half their customers, everything seems to work using their examples but clj-soap chokes: http://d.pr/n/fbKI
12:16spligakappreciate you checking it out. love the library.
12:16S11001001mikerod: it's not meaningful to build a non-variadic function if you don't know the arity until runtime, so you might as well just use & args and apply
12:16hiredmankittylyst: there are a number of parser combinator type libraries around on github, but none of them seems to be very good, and they often end up abandoned
12:17spligakdakrone, I'm using clojure 1.4.0 - that's just what lein spit out when I created the sample. updating that.
12:17dakronespligak: looking through the tests, apparantly this is on purpose right now, because many errors don't come back as json when a 503 or whatever is hit, so I'm thinking of adding a {:coerce #{:always :unexceptional :exceptional}} setting to force behaviour
12:18dakronespligak: what version of clj-http?
12:18zodiakowengalenjones, yeah.. I don't think the "cool kids" use soap much these days (sorry). It's kinda strange/worrying that the author seemed to hit a bump and then say 'eff it'
12:18hiredmanthere is always http://meshy.org/2009/12/13/widefinder-2-with-clojure.html
12:18owengalenjonesI dont blame him, this is my first experience with soap, its giving me an ulcer after only a day of looking at it. thanks for your time
12:19zodiakowengalenjones, no worries. Yeah. soap is .. pretty nasty (especially all that automagically wsdl stuff).
12:19spligakdakrone, using 0.6.4 in my project. and that's totally cool - just making sure I wasn't using it improperly.
12:19dakronespligak: okay, I'll work on a fix
12:22mikerodS11001001: I understand what you are saying. I have a strange use-case for this. I writing a DSL in Clojure and at what ends up happening in this case is that I need a function with unknown number of args and unknown formal parameter names, however, this function will end up being called from java with the IFn#invoke(args).
12:23zodiak"Magento Core API supports the SOAP and XML RPC protocols. It does not support REST" .. how old IS this magento thing ?! xml-rpc ? mercy (that maybe a LOT easier to get running in clojure btw)
12:23zodiakowengalenjones, I suspect you can find a fair few xml-rpc libs
12:23S11001001mikerod: if your DSL is, by nature, a builder of fresh clojure code, then perhaps it ought to do so by way of macroexpansion?
12:24erikokittylyst: this rough parser is for cachefly logs, but they're derived from the Apache format. YMMV: https://gist.github.com/erikols/5101134
12:25noidiis it OK to leave the project name empty on the Contributor Agreement, if I want to be able to contribute to any project requiring a CA?
12:25kittylysteriko: Thx. I've arrived at this for general Extended Common Log Format:
12:25kittylyst#"([^ ]*) ([^ ]*) ([^ ]*) \[([^]]*)\] \"([^\"]*)\" ([^ ]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\""
12:25kittylystYou can do better for the apache case, by doing better for the case of first-column-is-an-IP
12:25noidiI'd hate to send a new CA every time I want to send a patch to a new core project...
12:26mikerodS11001001: I agree, macroexpansion is usually the best place to do something like this. I will take a look at what I'm doing a bit more closely and see if I can restructure it into a macro. Thanks for the help.
12:27erikokittylyst: Cool, thx!
12:36owengalenjoneszodiak: thanks, Im looking into https://github.com/brehaut/necessary-evil (its got an awesome name)
12:36zodiak*laughs* that's all sorts of good naming :D
12:43owengalenjoneszodiak: omg thank you, it appears to have worked for my tests, work can continue. I never would've tried that, I dont even know the difference between soap xml-rpc all this junk...
12:44zodiakowengalenjones, nw. yeah. soap is the heavier cousin of xml-rpc. it's "technically" better (betamax vs vhs - which is an urban myth, I know ;) but. meh.
12:44zodiakwhatever works. works.
12:46zodiakback to simcity 2013 for me :D
12:47owengalenjoneszodiak: enjoy your tiny 2k*2k city plots :)
12:52rplacanoidi: just put "Clojure and Contributed Libraries" and you'll be set
12:52noidirplaca, thanks!
12:53rplacanoidi: np
12:54noidi:)
12:57noidiI wish Clojure used something like echosign, like the Chef project http://wiki.opscode.com/display/chef/How+to+Contribute
12:58technomancyit's been discussed many times, but there doesn't seem to be much motivation to actually make contribution easier
12:58noidisending information by moving physical objects seems so archaic :)
13:00noidiI don't think I even have any envelopes or stamps at hand, so that means a trip to the post office
13:01noiditechnomancy, I've seen the discussions, and I've always wondered why Clojure/Core does not see this as an issue
13:02technomancyhttp://p.hagelb.org/mystery.gif
13:04llasramMaybe because the current process is already yielding more patches than rhickey wants personally review?
13:06technomancy#firstwordlproblems
13:06noidillasram, that's a good problem to have and should be solved by scaling the approval process, not by making it harder to contribute
13:07llasramnoidi: I don't disagree -- just generating hypotheses
13:40thearthurarohner: I sent a pull request porting clj-r53 to 1.4.0, It was crashing for me with 1.4.0 :-/
13:41thearthurarohner: If I buy you beer sometime will ya release it as 1.0.2 soon?
13:41arohnerthearthur: great!
13:43thearthurI tested it on create and update record
13:45arohnerthearthur: cool. releasing soon
13:49arohnerthearthur: 1.0.2 is released
13:49arohnerthanks for the patch
13:51TimMcnoidi: You're not sending information by physical object in the CA process -- you're applying Color to existing information: http://ansuz.sooke.bc.ca/entry/23
13:51thearthurarohner: and thanks for the quick turnaround, I hate releasing with forks... much appreciated
13:52TimMcIt's a legal ritual that "blesses" the data.
13:53TimMc,(dorun (range))
13:53clojurebotExecution Timed Out
14:01amalloyso i noticed something interesting about delays yesterday. if you delay an expression that throws an exception, then forcing it multiple times does not always yield the same result
14:02amalloyspecifically, the first time you get the exception you threw; after that you get a NPE in the middle of clojure.lang.Delay
14:02llasramThat seems to have a low probability of being intended/desirable behavior
14:02RaynesMhm
14:03amalloyindeed. it's possible to work around it, either in your code or in c.l.Delay, so that it saves the first exception and rethrows it. it's not possible to make it actually retry in case some mutable state has changed
14:03llasramYeah. Re-throwing is what I'd expect to happen
14:06amalloywell, i should be more specific. not *every* exception-throwing delay expression causes this. it has to be one that refers to some lexical locals in the scope of the delay
14:20tomojis it me or are url locals bound in a strange place by moustache?
14:20tomojI mean, the locals it gives you for url segments
14:21tomojit seems you have to pass them into functions that return handlers
14:21RaynesThose words don't make sense to me.
14:22tomoj(app ["foo" id] (foo-handler-generator id))
14:22tomoj(fn foo-handler-generator [id] (fn [req] ...))
14:22tomojthat's the only way I can see to make use of the 'id binding
14:23RaynesOh.
14:23Raynestomoj: Yeah, I thought you were talking about mustache.
14:23RaynesI'm not a fan.
14:25RaynesMan, I love hating on cgrand's stuff.
14:25tomojI don't think I am either
14:25RaynesI'm waiting for him to challenge me to a duel.
14:26danneuif you /quit
14:26danneuwhoops
14:27rabbit_airstrikelisp duel
14:28tomojon the other hand compojure seems to make a sort of opposite error..
14:30tomojI want (route :get ["foo" :id]) to be a middleware that routes and adds an :id param or url-param to the request
14:30tomojmaybe compojure can do something very close to that?
14:35tomojah, make-route
14:38amalloytomoj: it's called context. i forget what compojure namespace it's in
14:38amalloy(context "/foo" [id] some-route)
14:40tomojoh wait
14:40tomojI guess moustache assoc's onto the request too
14:42tomojnot usefully afaict
14:43yogthosRaynes: speaking of I've got a quesiton ;)
14:44yogthosRaynes: can't seem to get wrap-file-info to work with uberjar
14:45yogthosRaynes: I did (wrap-resource "public") and in the uberjar you end up with a public directory under it, so what am I missing there
14:45yogthosRaynes: works fine in wars
14:46Raynesyogthos: No idea.
14:46yogthosRaynes: I guess I'll have to find weavejester for this mystery :)
14:47yogthosRaynes: I'm going to be so glad when I have that app-handler working properly, nesting middleware can be so brittle
14:47yogthosRaynes: nobody should have to do that again :P
14:48Raynesyogthos: So the problem is that your resources aren't being seen at all?
14:48yogthosRaynes: they are but the mime type isn't set
14:49RaynesDoes that even make sense?
14:49yogthosRaynes: if I don't add wrap-resource or wrap-file-info then mime types are set
14:49RaynesSo you *can* access the resources?
14:49RaynesIt just doesn't set the mime type?
14:49yogthosRaynes: yeah
14:49RaynesYeah, that's way above my pay grade.
14:49yogthosRaynes: hehe
14:50yogthosRaynes: what's weirder is that it *sets* the mime type if you don't put wrap-file-info at all
14:50yogthosRaynes: so I wonder if there's some alternate mechanism that gets invoked
14:53sujeetdevn, where u b dawg
14:55jrobiefor what operations does nil NOT raise a n exception if used as an operand - just for conditions and for functions specifically designed to handle it?
14:59amalloyjrobie: lots of things. collection operations, especially
15:00jrobieamalloy, thanks - is there an easy way to look up the collection operations for which nil is defined?
15:00amalloyi don't think so. it's basically all of them
15:01jrobiethanks. but i assume all math functions, string functions, aggregate functions, etc. raise exceptions for nil, are there any other big groups of functions besides the collection functions that i should think of?
15:04amalloyjrobie: what language? if it's one you're building from scratch, i recommend not including nil
15:04technomancyinc
15:04jrobieamalloy, we need something like nil for xquery to support json, imho
15:04technomancyif you want inspiration, look at a language with a proper type system like OCaml or Haskell
15:04jrobiewe have empty sequences
15:04jrobiebut we need something that occupies a position
15:05amalloyno you don't. you can use a special null value for the json library; it doesn't have to be part of the language
15:05amalloyTony Hoare, inventor of the null reference, has a presentation called: "Null References: The Billion Dollar Mistake"
15:05jrobieamalloy, good to know
15:06jrobiei do need a special null value
15:06amalloyfor example, haskell's json library defines what is basically an enum for the six-ish kinds of values json can have
15:06amalloyand for operations outside of json, which in clojure or java might return either a value or nil, it instead returns Maybe value
15:06S11001001Maybe is cool
15:07jrobieok. xquery doesn't have a maybe value
15:07zodiakjrobie, well, now, null was only "required" in the case that you had missing data. C.J Date proposed everything having a "default value" (which I am sure has Codd spinning in his grave). maybe that's another solution ?
15:07zodiakbut yeah.. a maybe monad could be the ticket
15:08jrobiewe don't have anything like maybe in xquery, and what we mostly need is an item that can occupy a position and represents the lack of a vlaue
15:08jrobiei'd like to keep this as simple as we can
15:09jrobiexquery uses empty sequences as the rough equivalent of a sql null, but an empty sequence can't occupy a position in a sequence
15:09solussd_is it possible to extend a keyword's ability to look itself up in a map? How is that ability defined?
15:10jrobiezodiak, i've spent much too much of my life debating how sql nulls relate to xquery ;->
15:11jrobiecodd, date, and chamberlin definitely disagreed on that issue
15:11zodiakjrobie, I believe you :)
15:11jrobiechamberlin was a co-inventor for xquery, so guess whose view won in xquery?
15:11zodiakoohh.. tough q ;)
15:13zodiakit could be you have an impedence mismatch that's not easily solved.. in which case you may jst be better off either one of (a) not taking null's in the first place, (b) default value if null or (c) maybe monad (although then you are pushing the complexity to the user/next fn to deal with)
15:13zodiakprobably a few more solutions but.. it's not going to be pretty ;)
15:14Apage43solussd_: Keywords can look themselves up in anything that implements ILookup
15:14Apage43-or- anything that clojure.lang.RT.get works on
15:14Apage43https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Keyword.java#L132
15:14solussd_thanks
15:15jrobiezodiak, we're trying to minimize the damage ...
15:16Apage43which means java.util.Map works too
15:16zodiakjrobie, minimize and pass upstream or wrap and deal with it ?
15:16jrobiehmmmm, Maybe is looking better than i had expected at first blush ...
15:17zodiakmonads ftw (jst don't tell #haskell that ;)
15:18arkhwhat's the next best option to a multiple bind (when-let [ ... ]) ?
15:18arkhbecause when-let only allows for a single binding
15:20jimkcardoes anyone in here work for Relevance?
15:21rabbit_airstrikeone of the things I like about R is the granularity of NULL, NaN, NA, and the Infs
15:22zodiakarkh, well.. you could always jst pass in a hashmap into the vector
15:22zodiak(when-let [data {:a 9, :b nil}] (println (:a data) (:b data)))
15:22jrobiezodiak, amalloy - opinions on Python's None?
15:22amalloyrubbish. it's no different from nil
15:22zodiakjrobie, not much really, jst another form of nil, null from my understanding
15:23arkhzodiak: I like it - thanks!
15:23zodiakarkh, more than welcome
15:36sisciaHi, I am having problem to understand protocols, namespace, and implementation of the protocols themselves...
15:36sisciado you suggest any good resource ?
15:39hiredmana protocol is a named group of named functions that are polymorphic on their first argument's type
15:40hiredmanthe names of protocols and the functions that are part of protocols are vars
15:40hiredmanvars exist in namespaces
15:41hiredmanthe impl is not something to concern yourself with
15:42hiredman(vars themselves also have names, which are namespaced symbols)
15:54solussd_anything wrong with extending a protocol to a clojure.lang Interface? E.g. IPersistentMap
15:55sisciahiredman, sorry i didn't hear the bip of xchat
15:55solussd_wait… dont records have marker interfaces now?
15:56sisciahiredman, still something no completely clear
15:57sisciahiredman, I define a protocol in a namespace (call it "A")
15:57sisciahiredman, (in-ns B (:use A))
15:58siscia(extend-type java-class somenthing-in-A (function [_]) (f2 [_]))
15:59sisciahiredman, if now I (:use A) in another namespace i should be able to call (f2 java-class)
15:59sisciait is right ?
16:02frommorf(filter #(zero? (mod n %)) (range 1 n)) ; Why does this result in a outofmemory for large n? isnt it lazy?
16:03nDufffrommorf: You're clearly evaluating it somewhere.
16:03nDufffrommorf: If I define it without evaluating or printing it, I get no memory error.
16:04TimMcsolussd_: If you own the protocol, that's fine.
16:04frommorfnDuff: i evaluate it at the repl
16:05solussd_TimMc: I want to implement a protocol on all things that act like maps, so I'm thinking about extending MyProto to clojure.lang.ILookup
16:05nDufffrommorf: Exactly.
16:05nDufffrommorf: I imagine that if you only grab a few items of the beginning with take, you have no problem.
16:05solussd_too bad I cant extend a protocol to a protocol.. :)
16:06amalloyhttp://dev.clojure.org/jira/browse/CLJ-1175 is the jira issue i just created for the weird behavior of clojure.core/delay, if anyone wants to look at it or, say, vote for it
16:07frommorfnDuff: yes, but i need all the items. is there a way to optimize it?
16:08sisciafrommorf, how big is n ?
16:08frommorf600851475143
16:08frommorfsiscia: 600851475143
16:08sisciafrommorf, are you looking for the divisor of that number ?
16:09frommorfsiscia: all the factors of that number, I know there's a better algorithm. But i am wondering why it so slow this way
16:09ninjuddeveryone should go vote for amalloy's issue
16:09nDuffErr. The slow part doesn't seem surprising at all.
16:10sisciafrommorf, me neither...
16:10nDuffRunning out of memory, on the other hand, was surprising (if not holding onto the head).
16:11sisciafrommorf, a quick fix could be something like (filter #(zero? (mod n %)) (range 1 (int (sqrt n))))
16:11frommorfI'm very new to clojure so I dont know what is going on.
16:11edwI'm looking to write some code that needs to be evaluated eventually, but I really want to treat it as "fire and forget"; is it kosher to do something like (dorun (for [batch (partition 10 1 nil xs)] (future (frobinate batch))))?
16:12sisciafrommorf, you are making a lazy seq (you know what that is?) and you try to print it all...
16:13frommorfsiscia: yes i do. but i thought since it was lazy it wouldnt need to store the whole thing in memory?
16:14sisciafrommorf, yes that is the point of the lazyness, however if you try to print it
16:15sisciathe sequence has to be somewhere...
16:15sisciait has to be realized in order to print it...
16:16frommorfsiscia: right, sorry my brain is not working today.
16:17sisciafrommorf, :-)
16:19TimMcWho's the main Clojure JIRA wrangler? It looks like the version tag "Release 1.5" is still marked as Unreleased.
16:24ohpauleezTimMc: I'm not 100% sure but Sierra or Andy
16:26nDuffHrm; in clojure-mode, (avout/dosync!! *avout-client* <NEWLINE> indents the next line to be with the *avout-client*; is there a straightforward way to configure emacs to only indent one level (two spaces) there, rather than aligning with the first parameter?
16:26TimMcstuartsierra: FYI, the CLJ Jira project still has "Release 1.5" marked as Unreleased.
16:27TimMcnDuff: Something about M-x customize-variable RET clojure-defun-indents
16:29stuartsierraI disavow all responsibility for JIRA. ;)
16:31nDuffTimMc: useful; thanks
16:39amalloywhew! it's nice to not be the only one who recommends defun-indents, TimMc
16:40TimMcamalloy: I still haven't used it, and if nDuff breaks his leg and comes running to me, I'm going to point him at you.
16:41nDuffTimMc: ...for what it's worth, my leg appears to be intact
16:41nDuff(and my code well-formatted).
16:41TimMcstuartsierra: Andy is the one, then?
16:41jimkcarrunning with a broken leg would be impressive
16:41TimMcamalloy: Is there some sort of modeline thingum that can be used to make it portable?
16:41amalloyif anyone is interested, https://www.refheap.com/paste/0bccc08fbe2924fd38fa38b88 sets up git to provide custom hunk headers for clojure files in diffs. so the diff header tells you what function the diff is in the middle of
16:41stuartsierraTimMc: Probably. Email clojure-dev.
16:41amalloyTimMc: huh?
16:42TimMcamalloy: 404
16:42TimMcInterlocutor Not Found
16:42amalloythis world makes no sense any longer
16:42amalloyi resign
16:43TimMcamalloy: 404 on your refheap link, actually.
16:43amalloyreally? it works fine for me, even clicking on it now
16:44TimMcOh, huh!
16:44jimkcarI get "Insert fancy 404 image here."
16:44TimMcgnome-terminal was including the space after the URL
16:44TimMcGot a weird char in there?
16:44RaynesI don't see any 404/
16:45llasramnon-breaking space between the URL and 'sets'
16:45amalloyyou're right, it looks weird to me too. must be some weird character
16:45jimkcar<space> sets was coming up as part of the url
16:45amalloytry https://www.refheap.com/paste/0bccc08fbe2924fd38fa38b88
16:45TimMchttp://lab.brainonfire.net/whatchar/identify.php?data=https%3A%2F%2Fwww.refheap.com%2Fpaste%2F0bccc08fbe2924fd38fa38b88%C2%A0
16:45amalloymy browser (or my irc client?) was apparently stripping out that extra character at the end
16:45TimMcNon-breaking space.
16:46TimMcamalloy: Sp, re: clojure-defun-indents, is there a way to make it so that collaborators get the same indentation rules?
16:46TimMc*So
16:46amalloy$google dir-locals.el
16:46lazybot[Directory Variables - GNU Emacs Manual] http://www.gnu.org/s/emacs/manual/html_node/emacs/Directory-Variables.html
16:47stuartsierraYou can also use file-local variables.
16:47amalloyi found it a bit fiddly to get everything lined up just right so that those work, TimMc, but it's definitely possible
16:47TimMcOh, so it's a modeline thingy.
16:47amalloyno it's not. i don't know why you keep talking about the modeline
16:48TimMcI think that's what vim calls that.
16:48amalloywell, emacs has something called the modeline, and it's something other than whatever you're talking about :P
16:48TimMcOh right, that term is overloaded.
16:49TimMcPolymorphic across editors. :-P
17:03gfredericksSo (let [nums (range)] (#(dorun nums))) leaks, but (let [nums (range)] ((^{:once true} fn* [] (dorun nums)))) does not
17:03gfredericksis the :once metadata a supported feature? should it be encouraged in macros that create thunks that are only called once, e.g. clojure.java.jdbc/transaction ?
17:07edwMy app is not exiting after creating agents (and awaiting them too). Is there something I need to do to let the JVM die a natural death?
17:07amalloygfredericks: thunks that are called only once are delays
17:07amalloyie, don't write them yourself, use the one that already exists
17:08hiredmanamalloy: the problem with delays is they memoize their results
17:08hiredmanwell, I guess not a problem in gfredericks's example
17:08nDuffedw: there's a call to shut down the agent pool.
17:09amalloyright, i think for anything you only call once that memoization won't be a problem
17:09amalloybut i could be wrong
17:09hiredman"the problem with using delays with lazy-seqs is ..."
17:09nDuffedw: (shutdown-agents)
17:09edwAh, I was just staring at the cheat sheet on my iPad.
17:09edwThanks.
17:12amalloyhiredman: if you let the delay get GCed, that shouldn't be a problem, right?
17:12amalloy,(let [d (delay (range))] (dorun @d))
17:13clojurebotExecution Timed Out
17:14amalloyie, if it's really called only once, you can arrange to call it in a place where the delay itself is GCable, and the memoization doesn't matter then
17:15hiredmanamalloy: sure, but if you do something like (let [d (delay (produce-seq))] some-complicated-logic-with-d) it is very easy to end up holding on to the head of the seq by holding on to d
17:19amalloygfredericks: speaking of delays, did you see my jira issue earlier today about (what is arguably) a bug in c.l.Delay? http://dev.clojure.org/jira/browse/CLJ-1175 - vote early, vote often!
17:19llasramIsn't it vote early, vote only twice?
17:19llasramOf course, I have no idea how many tickets I voted on
17:20amalloyllasram: rich suggested that policy, but since it's based on rich believing that clojure developers will follow the honor system, of course it can never work
17:21hiredmanI think the reports andy generates do some kind of fractional weighted voting
17:21amalloylast week andy fingerhut started counting how many issues you've voted on, so that if you've voted five times then each vote counts as 1/5 of a vote
17:21llasramAh, interesting
17:21amalloythus everyone "counts" as one vote, distributed as thinly as you like
17:21llasramThat sounds like a better approach
17:21amalloymuch
17:21technomancytime to start creating sock puppets
17:22amalloyyeah, i know
17:22llasramAnd have them submit CAs?
17:22amalloytechnomancy: but sock puppets can't fill out CAs
17:22amalloyso this is 100% secure
17:22llasramSock Q Puppet III
17:22cemerickhas anyone yet abused the BigDecimal implementation in gwt-math with ClojureScript? The references to it aren't exactly encouraging.
17:22technomancyamalloy: good point, that would involve signing something which is false, which as we know is a logical impossibility.
17:23hiredmantechnomancy: well for bots
17:23llasramMechanical Turk
17:23hiredman~truth
17:23clojurebotTitim gan éirí ort.
17:24trptcolinmore like mechanical JERK
17:24trptcolinok, i'm done, sorry
17:24augustlwhat's the simples way to turn a map into a map with a type I can use to extend a protocol?
17:25llasramaugustl: Existing protocol, or your own?
17:26augustlllasram: my own, so I can pass in a map to a protocol function and have it run my implementation for my specific type
17:26augustlessentially I just want a map with a type I specify so I can implement a protocol for that type
17:26llasramIf it's your protocol, could you just use multimethods instead?
17:27llasram&(map type [{} {:type :foo})
17:27lazybotjava.lang.RuntimeException: Unmatched delimiter: )
17:27llasram&(map type [{} {:type :foo}])
17:27lazybot⇒ (clojure.lang.PersistentArrayMap clojure.lang.PersistentArrayMap)
17:27llasramfail, me
17:27llasram&(map type [{} ^{:type :foo} {}])
17:27lazybot⇒ (clojure.lang.PersistentArrayMap clojure.lang.PersistentArrayMap)
17:28llasramHuh. That should have worked
17:28llasram&(map type [{} (vary-meta {} assoc :type :foo)])
17:28lazybot⇒ (clojure.lang.PersistentArrayMap :foo)
17:28llasramAnyway
17:29llasramSo there's a builtin approach to using multimethods dispatching on the type of a value, or on some other arbitrary token you specify via metadata
17:30augustlhere's an example of what I want to do: https://www.refheap.com/paste/12180
17:31augustlthe idea is that I have some routing code but I don't want it to be ring specific, i.e. I don't want to assume that request contains ":request-method", but also allow for just :method (which I actually use, since I have a system where I use HTTP-like routing over a message queue, no Ring
17:31augustl)
17:31augustlso the default implementation assumes a Ring map, but I want uses to be able to extend it
17:31augustlnot sure if protocols are a good fit though :)
17:32llasramProtocols dispatch on concrete JVM types. If you don't already have concrete types or need the speed their implementation in terms of interfaces provides, then they probably aren't the right fit
17:33llasramYou could create a macro which generates new `deftypes` which are basically just trivial map implementations, but it doesn't seem like the right solution to me
17:33augustlI do have just a normal map, yeah
17:33llasramThen multimethods seem like a much better fit
17:34augustlnot sure what I should dispatch on since they're always just normal maps
17:35llasramIf you were already contemplating wrapping them in some other type, you can just assoc in a dispatch key instead, or add :type metadata
17:35llasram:type metadata has other implications for e.g. printing though
17:35augustlhmm
17:36augustltypes seems cleaner.. Not that I know what I'm talking about, though
17:36augustland a protocol also means the methods will be neatly grouped
17:36brehautaugustl: concrete implementation types are only clearer if they already exist; if you are going to map all your data to a concrete type just for dispatch, multimethods are better
17:37llasramTypes are only cleaner if you really need a concrete type for some reason, which I don't believe is the case here
17:37llasramAs for grouping together, you can create a macro which lets you define groups of related multimethods
17:37llasramI don't have it published publicly anywhere ATM, but I use such a macro pretty extensively in my work codebase
17:38llasramFor ex: https://www.refheap.com/paste/12181
17:39augustlwhy do that when protocols work just fine? (Except I'm not sure they do, since I'm still not sure how to create a special map that's a map except a different type)
17:40llasramaugustl: Basically, you could implement protocols in terms of multimethods, but not vice versa
17:40llasramGrouping together related functions is just a nicety, making code a bit easier to read by making the relationship clearer
17:41llasramBut the fundamental machinery of multimethods is more powerful and flexible
17:41llasramI'd even argue that protocols only define functions together because they *need to*, due to their JVM implementation in terms of interfaces, which requires that all the functions be known at once
17:41augustlyou can defmethod for defmultis from another namespace, right?
17:41llasramYes
17:47jimkcaris there a white paper or something that shows how Datomic uses the key-value storage underneath. i.e. what do the keys and values look like
17:48jimkcaror is that proprietary?
17:51bbloomjimkcar: it's likely proprietary, but it's not that difficult to imagine what it looks like if you understand a bit about how datomic indexes work
17:52bbloomjimkcar: in short, key-value or other storage is used like a big hash table
17:52bbloomjimkcar: you don't store one datum per key, you store many
17:52gfredericksamalloy: hiredman: whoops I ran away; thanks for the discussion :)
17:53bbloomjimkcar: so basically, you name the key after some identifier for a page of data
17:53jimkcaryeah that's kind of what I figured. I work a lot with the Apache Accumulo project and was wondering how difficult it would be to adapt Datomic to use it.
17:53augustljimkcar: all I know is that it's a 3 level deep tree structure
17:53bbloomjimkcar: i assume not that difficult, considering they already support other sorted key value stores
17:53augustlthe actual data they put in storage, that is
17:54hiredmanit sounds like the main requirement is conditional writes
17:54bbloomaugustl: what are those levels?
17:54augustlsupporting key/value stores is not necessarily easy. For riak, they need to use zookeeper as well, to keep track of things
17:54bbloomaugustl: i assume the correspond to elements of EAVT
17:55augustlbbloom: I'm not sure..
17:55hiredmanaugustl: zookeeper is used to enable conditional put on riak
17:56jimkcarDoes Datomic have any sense of permissions like Accumulo? There can be a lot of data in Accumulo, but you may not be able to access it all.
17:56augustlno, none at all afaik
17:59bbloomyeah, i think lack of permissions is an intentional design decision
17:59hiredmanjimkcar: you might check out cascalog, since it looks like Apache Accumulo plays well with hadoop
17:59bbloomthere are many types of permissions systems and you can build them on top if you want
17:59augustlllasram: seems another reason not to use defrecords "in place of" maps is that records aren't callable, like (my-map :key)
17:59hiredmancascalog is a datalog like layer on top of serveral other layers on top of hadoop
18:00jimkcaryeah I've played with cascalog a bit. Full disclosure, this is me: http://hadoopsummit2013.uservoice.com/forums/196821-enterprise-data-architecture/suggestions/3714766-managing-hadoop-and-accumulo-with-clojure
18:00bbloomaugustl: whoa, i didn't believe you, but you are right...
18:00augustlindeed, it's very common to build APIs (with authentication etc) on top of datomic peers.
18:00augustlbbloom: wut? :)
18:01bbloomaugustl: i did (defrecord Point [x y]) and then ((Point. 5 10) :x) and was astonished to see an exception cannot be cast to clojure.lang.IFn
18:01augustlah right
18:01dakronespligak: just released 0.6.5 with this commit: https://github.com/dakrone/clj-http/commit/426049c93eba360c6eca92fc542b70627a7d2be3
18:02jimkcaraugustl: the problem with that is that the peers have the data in hand, regardless of the permissions
18:02augustljimkcar: indeed
18:03augustlI'm not sure about the specifics, but I guess that the fact that peers gets transactions pushed to them is one of the reasons there are no permissions on that level
18:03augustlto avoid fancy routing on the transactor to correctly distribute data based on permissions
18:05jimkcarI really need to grok Datomic a bit more.
18:05bbloomwhat fucking year is it that jira still breaks my fucking back button!?! argh.
18:05augustljimkcar: feel free to ask :)
18:05amalloybbloom: really? i've had many problems with jira, but not that one
18:06bbloomamalloy: if you issue a "quick search" query, you get an "Issue Navigator" results page
18:06bbloomamalloy: the URL does not contain your search terms
18:06bbloomif you click an issue and then press back, Chrome warns about content resubmission
18:06amalloybbloom: well, there's your problem: you're using jira's search feature
18:06jimkcaraugustl: well i don't really understand how it can scale. If the index is at the peer for searching, doesn't that limit your index size quite a bit? How do you deal with Petabytes of data in your store?
18:07bbloomamalloy: how dare i attempt to use software
18:07augustljimkcar: datomic is not a good fit for that
18:07augustljimkcar: if by petabytes of data you mean petabytes of data in use
18:07augustlif you need to average or count a petabyte of numbers, with datomic you need to have a petabyte of memory available. So you're better off with something like map/reduce in that case
18:08bbloomaugustl: datomic can still be useful for that, but you just need a layer above it to coordinate the subprocesses
18:08jimkcaraugustl: so what is the most common Datomic use?
18:08augustljimkcar: however, datomic has a LRU cache for data on the peer. So say you're building a project management system. Projects that haven't been active for a while (for example, due to limiting number of active projects in the app to 10 and having an archive function that makes the project inaccessible from the app) makes the data for those projects disappear
18:08augustlfrom the cache
18:08augustl</randomexample>
18:09bbloomjimkcar: datomic is designed to be a better foundation for the use cases you'd traditionally use a SQL database for
18:09augustlpartitions can also help, if you have completely unrelated domain objects that typically are used in separate peers for each partition
18:09augustljimkcar: you need to have the active data set in RAM anyway for most databases, to get good performance ;)
18:09spligakdakrone, hey thanks! that's really helpful when working with things like couch. allows me to define that meaningful/exceptional line nicely (and in the correct layer, IMHO)
18:10dakronespligak: thanks for the report, it's a nice feature to have
18:10jimkcarI guess good performance is relative.
18:10augustlbbloom, jimkcar: yeah, there's aggregation right?
18:10RoxxiAside from Cascalog and Clojure-hadoop, are there any other popular clojure map-reduce libraries that people commonly use?
18:10jimkcaraugustl: yes there is aggregation
18:11jimkcarRoxxi: not that I've used
18:11augustldon't have a good answer to your guess :)
18:18jimkcaraugustl: so there is only ever a single transactor in play?
18:19augustljimkcar: yes
18:19technomancyRoxxi: it's easy to roll your own over a queue: https://github.com/technomancy/die-roboter
18:19augustljimkcar: you can have failover transactors ready and waiting to avoid having to wait for JVM startup etc
18:20augustljimkcar: but only one is running at a time, in order to achieve ACID
18:20augustljimkcar: so if you need arbitrary write scale (in other words, you can't have ACID), Datomic is not a good fit
18:21augustlnote however that because the transactor only does writes, it is likely easier to scale than an ACID database where the same process/server/whatever does both reads and writes
18:22jimkcaraugustl: yes I see. I wonder if you could have both. Accumulo is highly optimized for data ingest. A single Transactor wouldn't be able to keep up.
18:23jimkcaris it possible to make bulk updates to the transactor indices?
18:23corecodei think clojure will become my next favorite language
18:23augustlthe actual indexing operation is eventual. The ACID transaction only writes a log to make it fully ACID, then it's eventually merged into the index tree
18:26augustl..if that's what you mean
18:28jimkcaraugustl: So I'm thinking it would just be an app service along side your main data store.
18:37ayia_Hi guys! Can I wrap some code in other code depending on a condition? I have a parameter to my function. If it is a seq then i should evaluate some code. If it is a string I should wrap this code in (apply str ...).
18:39brehautayia_: maybe https://github.com/flatland/useful/blob/develop/src/flatland/useful/fn.clj#L30-L48 is what you are after
18:41janiczekhi guys, having a trouble with namespaces :/ i want to use this https://github.com/clojure/java.jdbc - no trable so far, [org.clojure/java.jdbc "0.2.3"] in project.clj, (:use clojure.java.jdbc) in (ns), but when I want to use clojure.java.jdbc.sql, it screams at me... how should I refer to it? ( https://github.com/clojure/java.jdbc/blob/master/src/test/clojure/clojure/java/test_sql.clj )
18:44technomancyjaniczek: that's a test namespace
18:45ayiabrehaut: thanks... so, there is no "standard" way...
18:46janiczektechnomancy: I'm not requiring clojure.java.test-sql, but clojure.java.jdbc.sql
18:46brehautjaniczek: i wasnt aware that the jdbc.sql was in a released version yet
18:47technomancyyeah, you're looking at the master branch rather than the release
18:47janiczekaha ... so it's just on a github but not in clojars yet?
18:47brehautand its also pretty experimental
18:48janiczekcan I refer to it as 0.2.4-SNAPSHOT, or is 0.2.3 the most I'll get from leiningen?
18:49technomancyjaniczek: that varies by project. typically contrib projects don't deploy to clojars, so it might be more difficult to track down
18:50janiczektried it, clojars don't have 0.2.4-SNAPSHOT. hmm ... so right now my chances are a) just don't use it, b) copy the file from github to my project?
18:50augustljimkcar: that could work, yeah. As long as you don't try to alter what datomic puts in storage for itself :)
18:50technomancyjaniczek: you could ask the maintainer to deploy a snapshot or install it locally from a checkout
18:50brehautjaniczek: https://oss.sonatype.org/index.html#nexus-search;quick~java.jdbc
18:51brehautjaniczek: "0.2.4-20130227.030138-16" appears to be on the sonatype snapshot repo
18:51technomancythat's weird; I thought the next version was going to be 0.3.0
18:52brehauttechnomancy: true, i thought so too
18:52janiczekhow do I make leiningen see that repo? it says it can't find the artifact in clojars, so it's probably only searching that
18:53janiczekor should I just download that jar?
18:53technomancyjaniczek: see `lein help sample`; look for :repositories
18:54brehautjaniczek: 'just download the jar' is almost never the right idea with leiningen / maven
19:04janiczekYES, did it :) thank you!
19:17augustlhmm, I'm not able to sign stuff for "lein deploy" it seems. I generated a key, and "lein deploy" prompts me for "Enter passphrase:". I enter it, and nothing happens. If I hit enter one more time, I get "gpg: Invalid passphrase; please try again ...". Running OS X. Any suggestions?
19:21augustlare there any getting started guides for using leiningen to deploy to clojars from os x?
19:23Frozenlockseancorfield: Do you have some tips on references in mongo/congomongo? I have some collections that are becoming quite big (>Go) and was thinking about spliting them at each 'keyword'. For example {:main {:a data :b data :c data}} ----> {:main ref_a ref_b ref_c} {:a data} {:b data} {:c data}.
19:23TheBusbyaugustl: I did it last night for the first time and it as pretty simple
19:23TheBusbyaugustl: had to use macports to get gnupg installed, and then setup a gpg key
19:24seancorfieldFrozenlock: I haven't had cause to use references in MongoDB yet, sorry
19:25augustlfixed it by not having a passphrase for the gpg key
19:29augustlhow do I find my gpg public key to paste into the clojars profile page?
19:33xeqiaugustl: gpg --armor --export $KEY_ID
19:33amalloyFrozenlock: have you read http://docs.mongodb.org/manual/applications/database-references/ already? it seems quite likely to me that you only need manual refs, which are not hard
19:34augustlxeqi: hmm, I don't have $KEY_ID in my env
19:35xeqiaugustl: `gpg --list-keys`, find your 'pub' one, use 8 characters after "/"
19:36augustlxeqi: thanks!
19:37xeqitechnomancy: ^ has that been documented anywhere besides your inital mailing?
19:37technomancyxeqi: no, it should be added to clojars
19:37technomancybut right now that's only used for promotion, which is basically on hold
19:38technomancyI mean, it's documented as part of GPG of course
19:48amalloytechnomancy: it looks to me like LEIN_IRONIC_JURE's error message doesn't match its behavior. its regex doesn't match "clojure", but its message says "clojure" isn't allowed. it also says it doesn't allow *jure, when really it means *jure* as far as i can tell: eg, jurey-duty is forbidden by that check
19:51technomancyamalloy: the check for "clojure" is outside the regex
19:51technomancybut yeah, I'd take a pull req for the latter
19:51technomancywe kept getting confused newbies who named their own projects "clojure" =\
19:52technomancyI should probably go in and replace that message with something more sarcastic
19:52amalloytechnomancy: that's my point. this cond-clause never "fails" for the name "clojure", so why does its error message tell you about it?
19:52technomancyoh, gotcha. dunno. I took a pull request for that and didn't read it carefully.
19:52amalloythe other clause, which matches specifically clojure, has the right error message
19:52technomancystory of my life
19:54amalloytechnomancy: a friend notes: "words you can't use: abjure, adjure, conjure, injure, objure, perjure. so much for my lawyer-themed wizard-hospital simulator!"
19:54technomancyheh
19:54brehautha
19:54technomancyconjure and I think perjure are taken; my condolances
19:54amalloyabjure too
19:55technomancythere was one particularly outrageous one that prompted me to add that check where before I had only been thinking about it
19:55TimMc$dict objure
19:55lazybotTimMc: : To swear.
19:55technomancyan objective-C bridge IIRC
19:55technomancyCouverjure argh
19:55amalloyugh. already this discussion has induced semantic satiation for the syllable "jure". none of these look like words
19:55TimMcOh man, that's what I should have called swearjure.
19:56gfredericksTimMc: crap.
19:56TimMctechnomancy: http://static.tvtropes.org/pmwiki/pub/images/stopallthis_5242.png
19:56amalloyTimMc: abjure is a good name for some kind of security service
19:58technomancyTimMc: http://p.hagelb.org/outrage.jpg
19:59gfrederickstechnomancy: why your domain name gotsta be so cool :(
20:00technomancythat's the thing with domains
20:00technomancygotta act fast
20:00gfredericksI had lolwaffle.com for a year or so but never figured out how to make a million dollars with it.
20:01TimMcI own oddlyshapedrock.com for no good reason.
20:01technomancyI assume roflwaffle was taken?
20:01brehautahaha
20:01gfrederickstechnomancy: too explicit
20:02gfrederickslolwaffle's users are sophisticated and do not need to be spoonfed the joke
20:03gfredericksthey are also X for any property X
20:03TimMcWhat joke? I don't get it!
20:05TimMcThere's also nextnewsound.com, which would probably be awesome for I dunno, maybe a music reviews site?
20:08brehautTimMc: markov based music reviers using pitchfork.com's reveiws to generate fictional reviews of bands you havent heard of yet
20:08brehaut(and pitchfork so that they are snarky)
20:08TimMcThat's... that's a really good idea.
20:08TimMcLook, if anyone wants to write that I will host the shit out of it.
20:08technomancyI always had a dream of putting together a compilation album where real artists would each submit a track as a fictional band.
20:09brehautkind of like the gorillaz and new order
20:09brehautbut more people
20:09amalloyif that's what living in seattle does to you, i think i'll stay in california
20:09gfredericksif a band makes real music in what sense could it still be fictional?
20:09amalloyright? seattle is where the music hipsters are? maybe that's portland
20:09technomancygfredericks: no, I mean like musicians who are established from an existing fictional universe
20:10TimMctechnomancy: Somehow this feels related: http://www.thesecretknots.com/2012/12/06/how-to-make-an-album-with-people-instead-of-songs/
20:10technomancylike the Tenmen or Jason Taverner
20:10rabbit_airstrikeI think Seattle, Portland, and Brooklyn compete for music hipsters
20:10gfrederickstechnomancy: heck if I know of any fictional musicians but I get it now
20:10brehautTimMc: if i was smart enough at the markov stuff, i'd totally be building that for you
20:10TimMcbrehaut: The core of it is super easy. I just don't feel like doing all the plumbing.
20:10brehautreal musical hipsters come from towns you've never heard of
20:11technomancyTimMc: interesting
20:11technomancyamalloy: portland still holds the crown
20:11metellusI'm sure someone else has done the Markov work somewhere
20:11rabbit_airstrikepsychic tv did a double album where all of the listed artist credits were of people who were not psychic tv
20:12TimMcI'd probably just throw all the data together and use Dissociated Press, which is easier, albeit a bit slower.
20:12gfredericksseattle is the _____ of portland
20:12technomancyI had a bunch of other bands I would include too, but I've forgotten now
20:12technomancypossibly Sex Bob-omb, but that's been done now.
20:12rabbit_airstrike"bigger, gloomier, more urban sister of"
20:12gfredericks"texas"
20:13amalloytechnomancy: i think youo'd have to include at least one real band that everyone makes fun of, "because they've never released any real music"
20:13TimMcgfredericks: What do you suppose France's Paris is?
20:13technomancyamalloy: in this alternate fictional universe featured on this band's web site, $BAND are a creative, dynamic group of artists
20:25ambrosebstechnomancy: I don't think I'll be using metadata as the primary storage for static types. The main worry I have is whether vars exist at all at the point I do the static type checking. A secondary worry is I want complete control over when and how my types are updated.
20:26devnhey all
20:27technomancyupdating metadata after the fact is easy
20:27brehautambrosebs: I've started dabbling with c.typed on a new project; ive hit on some code thats very Any-full. Am i right in assuming that you can't do much with Any?
20:27technomancyI don't understand the use case for wanting to annotate non-existing vars though
20:29devnsimplest way to do pagination in a compojure+ring+lib-noir web app?
20:29ambrosebsMy point is I can freely put my type annotations wherever I want, and it doesn't matter whether I've compiled the relevant namespace for the var to exist.
20:29devnwithout writing the damn thing myself
20:29TimMcdevn: Like, first/prev/next/last?
20:29ambrosebsSo it can't be the primary storage, but I'm ok with adding redundant metadata.
20:29technomancyI understand what you mean, I just don't see the value.
20:30hiredmanyou can annotate non-existant vars by creating the vars
20:30devnTimMc: Yeah -- I'm using elastisch and right now I have it returning 25 results from the offset which I'm calculating
20:30hiredman,(doc intern)
20:30clojurebot"([ns name] [ns name val]); Finds or creates a var named by the symbol name in the namespace ns (which can be a symbol or a namespace), setting its root binding to val if supplied. The namespace must exist. The var will adopt any metadata from the name symbol. Returns the var."
20:30technomancyto me, having to refer something at compile time is extra overhead
20:30technomancyI would expect to be able to add annotations to a file that has none without touching my ns form
20:30technomancyotherwise I'll be less inclined to actually do it
20:31TimMcdevn: Well, this is a thing I wrote that computes some stuff based on page number + total results: https://github.com/timmc/handy/blob/develop/src/org/timmc/handy.clj#L137
20:31devnTimMc: but im not calculating the number of pages, and so on. I'm just looking for a simple way to have a "model-like" thing so I can get pudding-simple pagination without a lot of messing around.
20:32devnTimMc: it would be nice if there was some kind of convention for adding pagination to "model-like" things in clojure web apps
20:32TimMcYeah, pagination is surprisingly... involved.
20:32devnin rails (hold your sighs) things like will_paginate and so on have always been very popular
20:33devnit would be nice if we could just allow people to define a basic pagination partial in their templating language of choice, and then let the person using the library provide it with a couple of required params
20:33technomancydevn: take and drop on lazy seqs are *so* close to getting you that
20:33technomancysadly there is no way for drop to signal that a given section of the lazy seq is going to be discarded
20:33hiredmantechnomancy: devn is talking about generating pages
20:33devntechnomancy: yeah, but with elasticsearch you say: "give me 25 results, from the following offset"
20:33technomancyI know
20:34TimMcdrop and give me 50
20:34devnyou could get them all, but idk, just give me some simple pagination brothers
20:35devnTimMc: technomancy: hiredman: Does it seem ill-advised or wrong to have a library, let's call it "paginatjure" just to irk technomancy
20:36TimMcpaginature
20:36ambrosebstechnomancy: Yes, that would be cool.
20:36TimMcoh, yes: paginatjure
20:36devnwhere you basically say: here is the basic paginate function. it takes a template you specify where prev, next, last, first, and so on are specified
20:36qbgpajinature
20:36TimMcdevn: It's *hard*. There are three basic cases: No results, page out of bounds, and valid page.
20:36devnhonestly i dont know what it looks like, im just trying to think of a way to provide a very general pagination library where someone using hiccup, enlive, whatever, can use it
20:37ambrosebstechnomancy: I'm not sure how I'd recognise the type annotations though. Right now I check for dummy invocations of core.typed vars, which signify where type annotations are.
20:37TimMcdevn: After that, you have to have or not have a link for each of first/prev/next/last, and maybe even swap out images for each of those.
20:37TimMcThe template looks like a goddamn mess when you're done with it.
20:38devnTimMc: that's totally fine though! what im suggesting is that there is a library of disgusting templates written in various templating languages
20:38TimMcheh
20:38TimMcHere's what I ended up doing for my photo gallery, UI-wise: http://gallery.brainonfire.net/filter/run?tag[Content][]=flower
20:39devnand consumers of the lib can say: (:use [paginatjure.templates.hiccup :only (pagination-controls)])
20:39TimMcIt was easier to write. :-P
20:39TimMcpaje
20:39devnand then you just have [:html [:body [:div#pagination (pagination-controls)]]]
20:39devnor something
20:40devnpagination-controls takes a few args
20:40devnbut it offloads as much of the bs as it can
20:40TimMc(pagination-controls 50 0 7145)
20:40TimMc+ a link builder function, I guess
20:41devnTimMc: i know this is needed, just not sure what the right way would be to do it for consumers
20:41devnmaybe just assume you're using hiccup at first?
20:41TimMcAnd you'd have to tell it where to find images, if you're using images...
20:42devnthat's extra puddin'
20:42TimMcI dunno, I'd want something pretty generic.
20:42devnat first it's just a damned (range 1 (calculated-max-num-pages))
20:45qbgMaybe you'd want a collection of page number to label mappings?
20:48devnhttp://getclojure.org/search?q=comp+AND+juxt&amp;num=2
20:48devnhttp://www.github.com/devn/getclojure
20:48devnTimMc: you can see the nastiness im doing for pagination. basically it doesn't work for lots of things. i just unconditionally assume there's 10 pages of results.
20:49devnit also needs some design love, but it's seeded with 32k records or so and returns results and plays nice with query strings
20:50TimMcOh, this is that thing.
20:50devnTimMc: that thing :)
20:51devnTimMc: patches very welcome. i'd like to make it really nice to use.
20:51devnthat includes adding some kind of a rating system so people can rate examples based on a couple of dimensions
20:51TimMcdevn: Well, the org.timmc/handy thing will certainly tell you how many pages of results you have, and what the next record offset will be.
20:51devnlike "idiomatic", "concision", etc.
20:52TimMcdevn: "swearjure"
20:52devnhaha
20:52TimMc"someone trying to break a bot"
20:52devn"abomination (but still fun anyway)"
20:52TimMcI guess those are more categories than ratings.
20:53devn"thus spake rhickey"
20:53devnetc.
20:53SgeoWhat's an abomination?
20:53devnlike definitionally?
20:53devnor what we were referring to?
20:53SgeoWhat you were referring to
20:53devnwe were talking about swearjure
20:53SgeoAh
20:54devnI kid the swearjure people. I think it's cool, just trying to guard poor defenseless newbs from running away screaming when they see it.
20:55devn(#(% %) #(% %))
20:55devnstill my favorite
20:55SgeoThat's pretty famous (that concept, not the swearjure), I think
20:55ghadishaybanarrgggh local clearing bug in 1.5: https://gist.github.com/w01fe/5088279
20:55devnyeah, i just like the symmetry in swearjure
20:56devnit looks nice
20:56ghadishaybancan't figure out whether it was my code that is blowing the heap or the bug...
20:56SgeoThe Haskell version of that uses letters
20:57Sgeo(\x -> x x) (\x -> x x)
20:57SgeoAlthough that can be written as
20:57Sgeoapp id id (app id id)
20:57SgeoI think
20:57Sgeo(According to lambdabot)
20:58yedihow painful is the process of working with nodejs through cljs
20:59Sgeoerm, not app, ap
21:00ghadishaybanyedi: check bodil stokke's wonderful work on github, and her video https://www.youtube.com/watch?v=MTxNnYfWHOw&amp;list=PLZdCLR02grLoyWsKpovatiBYJyf-RKx0c
21:00Sgeoid<*>id$id<*>id
21:00SgeoShould be the same
21:00SgeoDon't know how to get rid of id there
21:00yedighadishayban: many thanks
21:00SgeoAlso, apparently this is not actually valid Haskell
21:01ghadishaybanyedi: github/bodil/cljs-noderepl
21:01SgeoBot is manipulating things that don't actually type
21:01SgeoMy head hurts
21:04SgeoCan write a function that can take itself
21:04Sgeo(id can take itself)
21:04SgeoBut can't write (\x -> x x) which can only take a function that can take itself
21:12gfredericksghadishayban: I had a memory leak a week or two ago which was very similar to the bug but I think just regularly my fault
21:14ghadishaybangfredericks: yeah - it's hard to tell sometime
21:15ghadishaybangfredericks: when you reduce over a large file under a with-open, then try/catch on the inside as well...
21:30gfredericksRaynes: dangit you got me using ^:private now
21:30Raynesgfredericks: Good, good.
21:31gfredericksbut it will scare the n00bs
21:33ambrosebstechnomancy: Sorry I'm slow. I finally figured out your beef was with the massive dependency that is all of core.typed. Is it you'd rather core.typed just didn't exist at runtime (production?) and just leaves a trace of type annotations on vars?
21:34ambrosebsI was thinking about the actual type checking strategy.
21:36ambrosebsbbl
21:43gfredericksis there a good local name for hiccup data?
21:46devnbest JS syntax hilighter for clojure?
21:46devnamalloy_: Raynes: opinions?
21:46Raynessyntaxhilighter
21:46Raynesbrehaut wrote a great lexer for it.
21:46devnis that still the one to use?
21:46devnthe one from a couple years ago?
21:46RaynesProbably.
21:47devncool, didn't know if something had moved into its place
21:47brehauti dont think anybody else has been insane enough to bother
21:47devni just finished doing cleanup on (clojure.string/join "|" (map (comp str :name meta second) (ns-publics 'clojure.core)))
21:48yogthossyntaxhilighter is pretty fantastic :)
21:48devnfor a giant regex
21:48devntrying to use google prettify and am getting more and more disappointed
21:48devnshould have stuck with syntaxhighlighter, but it adds way more markup than prettify
21:48devnprobably for good reason
21:50brehautthe clojure brush is structurally aware though, which i like to think makes up for it
21:50devnbrehaut: yeah, that's important actually
21:50devnim getting some weird issues with prettify highlighting this:
21:51devn(let [-' [10]] (clojure.core/seq (clojure.core/concat -')))
21:51devnit misses the outer closing ] in the let binding form
21:51brehautmy clojure brush misses #= stuff
21:52devnbrehaut: that could be an issue for me :X
21:52brehautpatches welcome ;)
21:52devnhahaha
21:52devnbrehaut: what's the link to your highlighter?
21:52brehautmostly i jest; theres quite a large loop you'd have to tackle
21:52devninc-clojure-brush?
21:52brehauthttps://github.com/brehaut/inc-clojure-brush
21:52brehautyeah thts it
21:52devnk cool
21:54brehautits probably actually not too hard to add; mostly it'd be like supporting #_
22:28gfredericksis anybody on the latest CLJS? I got an NPE when the first form in my file was (foo.bar "docstring")
22:28gfrederickswould like to report it as a "bad error" bug
22:34devnbrehaut: what's the proper way to wrap with your brush?
22:35gfredericksto the beat
22:35devnbrehaut: is that a css override i should use? basically, in some cases the code is an extremely long line. I'd like to wrap it for viewing purposes. Is there a good way to wrap?
22:35devngfredericks: well played
22:35devn(inc gfredericks)
22:35lazybot⇒ 16
22:35gfredericksa hypercube!
22:36brehautdevn: yeah i think you can add an overflow declaration to something syntax highlighter adds. just a moment
22:36devn(-> with-wrapper the-beat)
22:36devnbrehaut: i can show you what i mean, one sec
22:37brehautdevn: sure. actually, if you want it to wrap rather scroll, you might be out of luck. thats outside the scope of the brush itself
22:39devnbrehaut: deploying right now
22:39devnbrehaut: yeah. i figured. it doesn't *have to* be that way
22:40devnim just looking for a way to display long lines in a way that doesn't suck
22:40tomoj&(reduce-kv #(assoc %1 %3 %2) {} [:foo :bar :baz])
22:40lazybot⇒ {:baz 2, :bar 1, :foo 0}
22:40tomoj&(clojure.set/map-invert [:foo :bar :baz])
22:40lazybotjava.lang.UnsupportedOperationException: nth not supported on this type: Keyword
22:40devneither that means changing to something like opening the code in a new window or something
22:41devnbrehaut: http://getclojure.org/search?q=comp+AND+juxt&amp;num=0
22:41devnsee the first result for example
22:41brehautdevn: i think you are limited to scrolling horiz; syntax highlighter outputs a table with two columns, one for line numbers, one for code. it limits options :/
22:42devnbut i could do a collapse and truncate the line or something
22:42devnwith jTruncate
22:42brehautdevn: if you are happy with not having line numbers, you'll probably just be able to use some css
22:42devnidk, requires some imagination
22:42brehautjust a moment
22:42devnjust trying to get an idea of what is usable
22:43devnone other unfortunate bit is that i think SyntaxHighlighter kills my pretty printing of clojure code using code-dispatch
22:43devn:(
22:43devnoops, no, nevermind, still works
22:44devnsee: ((comp (juxt (juxt first second) (juxt (comp first rest rest) (comp second rest rest ...))))
22:44devnon the above URL
22:45brehauti dont know what it should look like?
22:45devnheh, nor do i
22:45devnim soliciting suggestions
22:46devnbasically, what would be a good thing to do for disgustingly long values or output?
22:59pppaulyou juxt my heart away
23:01RaynesOh stop, you're making amalloy blush.
23:36devnyou (comp)lete me
23:42Raynesdevn: Maaaaaaaaaaarry me.