#clojure logs

2015-09-04

01:16neoncontrails,((fn [lum] (loop [sum 0 lum lum] (if (not (seq lum)) sum (recur (+ sum (first lum)) (drop 1 lum))))) '(1 2 3))
01:16clojurebot6
01:16neoncontrailsIs there a more natural way to destructively update a list on which you're recursing? I get errors when I omit the step of setting lum to itself
01:17neoncontrails,((fn [lum] (loop [sum 0] (if (not (seq lum)) sum (recur (+ sum (first lum)) (drop 1 lum))))) '(1 2 3))
01:17clojurebot#error {\n :cause "Mismatched argument count to recur, expected: 1 args, got: 2"\n :via\n [{:type clojure.lang.Compiler$CompilerException\n :message "java.lang.IllegalArgumentException: Mismatched argument count to recur, expected: 1 args, got: 2, compiling:(NO_SOURCE_PATH:0:0)"\n :at [clojure.lang.Compiler analyzeSeq "Compiler.java" 6891]}\n {:type java.lang.IllegalArgumentException\n :mes...
01:17neoncontrailsOr rather
01:18neoncontrails,((fn [lum] (loop [sum 0] (if (not (seq lum)) sum (recur (+ sum (first lum)))))) '(1 2 3))
01:18clojureboteval service is offline
01:18neoncontrailsSorry clojurebot. :( That expression never terminates
01:19gcommer,(+ 1 1)
01:19clojurebot2
01:19gcommerhe's fine :)
01:24gcommerneoncontrails, not sure I understand the question
01:24gcommerwhat do you consider not natural?
01:26neoncontrailslum is itself, of course. I'll set it to itself if I have to, but is there a better syntax?
01:27neoncontrails(do ... (dosync [sthg])) maybe?
01:28gcommerthat's the "cost" of coding in a tail recursive style
01:29gcommerAny reason not to just use reduce?
01:31neoncontrailsthis is just a toy example of a slightly more complicated problem, which is less amenable to reduce
01:33neoncontrails(predicate testing the uniqueness of elements in a list without creating a new data structure)
01:34gcommerWhy no new data structure?
01:35gcommerer, assuming that you meant optimizing for storage
01:35neoncontrailsit's just the constraint of the problem (from cracking the coding interview)
01:37gcommerso just O(n^2), right?
01:38neoncontrailsuhh I believe my solution to it actually runs in O(log N), depending on the time complexity of clojure's sort fn
01:38neoncontrailsbut I *could* be wrong
01:39gcommer... if you're sorting then you're over n log n anyways
01:39gcommerthough maybe I don't understand the full problem
01:39neoncontrailsi just sort the list and compare two elements at a time
01:39gcommeryeah, n log n then
01:39neoncontrailsif they're equal, then short circuit and return false
01:42gcommerI've done a loop like that recently actually
01:43gcommer,(partition 2 1 (range 6))
01:43clojurebot((0 1) (1 2) (2 3) (3 4) (4 5))
01:47gcommer(sorry if I gave it away, but that's how I'd do it, no loop'ing required :p)
01:55neoncontrailsinteresting. Is it correct to say the lower-bound time complexity of that approach is higher than it would be if you used an inner loop?
01:56gcommerI think asymptotic complexity should be equivalent
01:56neoncontrailsMy intuition says that will work unnecessarily hard on inputs like, say
01:57gcommerWhether (loop ..) vs (parition ..) is faster should be left to profiling
01:57neoncontrails,(partition 2 1 '(0 0 1 2 3 4))
01:57clojurebot((0 0) (0 1) (1 2) (2 3) (3 4))
01:57gcommerParition should be lazy
01:57gcommerI hope
01:58gcommeryep it's lazy
02:00neoncontrailsGotcha. So it's equivalent to iteratively, say, (take 2 (repeatedly ...))?
02:01ben_vulpesis it insane to want to be able to squirt clojure at a running instance from, say, bash?
02:02gcommerneoncontrails, I believe so
02:02ben_vulpesno, it totally is. nevermind.
02:02gcommerben_vulpes, not at all
02:13amalloygcommer: it's mostly lazy. try (ffirst (partition-by identity (repeat 1e7 0)))
02:15gcommerthat's a good edge case to know to be careful about
02:15gcommer(though I was using parition with a fixed split :p)
02:15amalloypartition is the same
02:15amalloy(ffirst (partition 1e7 (repeat 1e8 0)))
02:16amalloyspecifically, partitions can be requested lazily, but once you request a partition all the items in it have to be realized eagerly
02:18gcommerI see, they do (doall (take n s))
02:19gcommerI wonder why they chose to do the doall
02:23kavkazoh hey amalloy, a few days ago you were helping me and I thought your name was familiar. I just realized you're the creator of 4clojure (: the problem I was having was one of the challenges from your site
02:23amalloyi remember
02:23amalloy(and i knew it was a 4clojure problem)
02:23kavkazI've been really enjoying them
02:24gcommerman I gotta catch up with the new 4clojure problems
02:25amalloythere have been very few new ones in the last few years
02:27kavkazWell, there's also Lisp problems out there, Project Euler too
02:27kavkazamalloy: Do you do project euler problems?
02:28kavkazI've done about 24, some of them I would rather do without BigInteger, things like that
02:28amalloyi've done a few
02:29kavkazClojure kind of has a few things built in that I fear may take away from the experience and the challenge. Have you ever done these problems using clojure?
02:29kavkazAh okay
02:29kavkazI guess I'll just start using Clojure with the remaining problems and see
02:29kavkazI've really fallen in love with the language, it's been very interesting and fun to learn and to use it
03:04Emppericfleming: we are facing a problem with Cursive and latest ClojureScript
03:04Empperisuddenly Cursive doesn't recognize any of the core ClojureScript libraries or APIs
03:04Empperieg. 'defn' is unknown to Cursive
03:05Empperiwith an older version (the 0.0-xxx series) it works
03:34crocketI wrote a book review on clojure programming(2012) by O'Reilly Media. https://generalai.wordpress.com/2015/09/04/book-review-clojure-programming2012-by-oreilly-media/
03:35crocketGo check it out
04:23LeonidasI am trying to include a javascript library into my code, but I can't get the compiler to pick it up :-(
04:25LeonidasI've added :foreign-libraries to my deps.cljs but it is not picking up the file. Any ideas?
04:53mavbozoLeonidas, ideally the javascript library already packaged in http://cljsjs.github.io/
04:54mavbozoLeonidas, but you can try to package your javascript library according to instruction here https://github.com/cljsjs/packages/wiki/Creating-Packages
05:15Leonidasmavbozo: no, it isn't yet. It is a react datetime picker.
05:16LeonidasIt seems like it just ignores everything about my deps.cljs
05:28cflemingEmpperi: That's strange, I'll take a look
05:30LeonidasI've added a (prn "Hello") into my deps.cljs but it never got displayed anywhere
05:30Emppericfleming: just as a headsup, a co-worker says it works for him
05:30cflemingEmpperi: Does File->Invalidate caches help?
05:30Empperibut another co-worker has the same problem
05:30Empperidon't know, will try
05:33Empperiindexing.... will tell when it's ready :)
05:35cflemingThink of the indexing as forced hammock time :-)
05:35Empperiunfortunately it did not help
05:36Empperiwhere can I tell Cursive the version of ClojureScript to use?
05:36cflemingCan you send the cljs dependency vec from your project.clj to make sure I'm using the same one to test?
05:36Empperior does it just parse it from project.clj?
05:36Empperi[org.clojure/clojurescript "1.7.48"]
05:36cflemingIt uses whichever CLJS lib is attached to your project.
05:36cflemingThanks
05:37Empperihmm, I might have an idea
05:38Empperilet me check that one
05:38Empperiwe have a multi module project with several project.clj files
05:38Empperijust opened the "External Libraries" branch in project view
05:38Empperiinside it it says clojurescript:0.0-3196
05:38Empperinot 1.7.48
05:39cflemingIf you open your lein toolwindow and hit refresh, does that help?
05:40Empperijust updated all project.clj files to have the exact same version (the latest), refreshed via lein tool window
05:40Empperinow it shows correct cljs version in external libraries
05:40Empperiwill tell if it helped since right now idea is totally frozen :D
05:40EmpperiI see only grey screen after switching back to the desktop where my idea is
05:41cflemingThat's not good.
05:41Empperihad to kill it
05:42Empperiand now restarted it and now it shows the old version in external libraries again
05:43Empperialso reindexing yet again
05:44Empperibut now it's ok
05:44Empperiand now it recognizes 1.7.48 and it's API
05:44cflemingOk, go to File->Project Structure->Modules->(your problem module)->Dependencies and check that the right CLJS lib is attached there. The problem with the External Dependencies is that it shows the deps for the whole project.
05:44cflemingThat's weird.
05:44Empperiso it must have originated from having multiple modules with different versions in their project.clj files
05:44cflemingI suspect that the indexes got funky somehow... right.
05:44cflemingI'll set up a project to test that and see if I can reproduce it.
05:45Empperiyeah
05:45cflemingDo the modules that had the different versions depend on each other?
05:45Empperianyway got it working and can instruct my coworker how to fix his environment too
05:45Empperiyes
05:45Empperithere is a library module which has clojurescript defined as dev dependency
05:45oddcullyEmpperi: once it goes grey it takes a while but at some point will gather itself
05:46cflemingOk, yeah, that might cause weirdness. I'll check that.
05:50cflemingEmpperi: https://github.com/cursiveclojure/cursive/issues/1056 so I don't forget about it
05:50Empperigreat :)
07:10noncomdid anyone try to do modal windows with reagent + bootstrap on cljs ?
07:11Empperiyeah
07:11Empperior well, bootstrap...
07:11Empperimodal windows with reagent though, yes .)
07:34noncomEmpperi: what do you mean?
07:34noncomnoncom: i am trying to build a web app with cljs + bootstrap + reagent.. getting into many difficulties..
07:35noncomEmpperi: do you know how to make a table row clickable?
07:35Empperi[:rw {:on-click (fn [e] (js/alert "I was clicked!"))} [:td "some value cell"]]
07:36Empperiand :tr of course
07:36Empperinot :rw
07:36EmpperiI wonder where that came from
07:37noncomoh, right! thanks for this one!
07:38noncomEmpperi: did you use the reagent-modal library ?
07:38noncomEmpperi: i am using it as in the example and getting an error
07:38Empperinope
07:38Empperiwe built our own
07:38Empperiwhich isn't that hard
07:39noncomEmpperi: yes, the code of this library is under 100 LOC
07:39noncombut i am so noob in web
07:40noncomEmpperi: you know the om library? is it a full-scale solution so that i don't need reagent and other things if i use om and its accompanying om-* libraries?
07:43Empperiom and reagent solves the same problem at the same level so yes
07:43Empperiboth are built on top of react.js as a clojurescript interface for using react.js
07:44Empperidnolen is the author of Om
07:44noncomi see...
07:44noncomis everyone moving to om now?
07:44noncomi mean, is it considered superior?
07:45noncomif i start a new project, do i chose om whatever i have in mind?
07:46Empperino it's not superior
07:46Empperiit's different
07:46Empperiand besides, Om New is coming which changes some fundamental concepts in Om
07:46Empperior was it Om Next :)
07:46Empperiwhatever .)
07:47noncomoh, so i better then stick with what i have now and then look at on next when it arrives..
07:47noncomwhat is the eta?
07:47Empperino matter which one you use, Reagent, Om or Quiescent you'll get nice experience
07:48Empperiall have their strenghts in different kinds of applications
07:48Empperiand I have no idea what's the eta for Om Next
07:49EmpperiI'd say though that Reagent is the easiest
07:50noncomyes, reagent is cool
07:50Empperithere's very few concepts to learn
07:50noncomthe only downside is that i still cannot get modal to work
07:50noncomnow it silently does nothin
07:50__djo__Om Next is at least a few months away
07:51noncomoh, looks like i fixed the modal!
07:51noncom__djo__: is there any article about that?
07:51__djo__For now Om and Reagent are pretty good and fine for most projects.
07:51dstocktoni think om next will also force you to use datomic, unless someone writes a compatibility layer between your database and datomic pull syntax
07:51__djo__noncom: Don't call where I saw it, might've been HN.
07:51noncomah...
07:51noncomyeah, i'll google :)
07:52noncomhmmm datomic.. and it is paid for any real use
07:53dnolendstockton: this is absolutely not true
07:53dnolendatomic pull syntax is just recursive select-keys
07:53dnolenyou can interpret it however you like - this idea is very similar to falcor
07:54noncomwow
07:54dnolenif you want to actually understand Om Next read through Relay and Falcor documention, I'm just stealing ideas wholesale.
07:54__djo__Besides, Om Next remains in development, no point getting worked up about perceived features or flaws until there's a real public release.
07:55Empperithat would kinda wierd if Om Next would force you to use datomic :)
07:55dnolenNeither require any specific backend
07:55Empperiafter all, datomic is a database and Om Next is a frontend library
07:56dnolenthat said, yes if you use Datomic - Om Next is party time.
07:56noncomEmpperi: +1 :)
07:56dstocktonright, i didn't really mean force
07:56dstocktoni just understood that if you use datomic, the backend is more or less done for you
07:56dnolendstockton: but it won't even be hard
07:56noncomyeah, but nice that thanks to this now i know more of om next, datomic and them together
07:56dstocktonfair enough, that's good
07:56dnolenunlike Relay which requires some ridiculous interaction to work out of the box. Om Next is more like Falcor
07:57dnolenintegration with whatever backend you have won't be hard - microservices, SQL, whatever.
07:57dstocktoni'll read more into falcor then, i was thinking along the lines of graphql
07:58noncomi'll too be reading
07:59dnolenthe primary ideas taken from Relay are colocating the query with the component and using a compositional query form - in our case not graphql which does a lot more - just pull syntax.
08:00dnolenbut the cache and local/remote model is much more like Falcor
08:00Empperidnolen: I love the idea btw, we did that few years back in this product we built (back when backbone was in alpha, we built everything on top of jquery)
08:00Empperimade our lives so much easier
08:00expezdnolen: how likely is it that om.next comes out this year?
08:00Empperiit was nowhere as sophisticated as what you are planning for Om Next
08:00Empperibut it was essentially the same thing
08:01expezdnolen: and if someone wanted to increase the likelihood of that happening...Contribute patches to clojurescript?
08:03__djo__Same, the concepts behind Om Next are awesome.
08:04dnolenexpez: pretty likely but it will come out when it comes out
08:05__djo__dnolen: Thanks
08:06noncomsince js people are here, dare i ask: when i'm modifying my modal and i change the cljs code and figwheel updates everything, the modal window itself disappears, but the gray locking remains
08:06noncomi cannot do anything unless i f5 the page
08:06noncomis there any cure for that?
08:15dstocktonnoncom: there is a js-onload hook, maybe you can use that to close it
08:15dstocktonim not familiar with this particular modals implementation
08:16noncomhmmmm....
08:18dstocktonit's probably reloading your app-state which is storing whether the modal should be visible but the backdrop is triggered by something else
08:19noncomyeah, likely so
08:30luxbockwhich interface is the .get method located in?
08:31luxbockjava.util.Map I guess
08:36dstocktonluxbock: clojure.lang.ILookup is the clojure protocol for implementing get semantics
08:37luxbockdstockton: yeah that's what `get` uses, but I was wondering about `.get`
08:37luxbockILookup uses .valAt
09:08roelofany midje expert here ?
09:29roelofany midje expert here ?
09:30oddcullyroelof: sometimes it takes no expert. could you describe your problem and maybe someone is able to help
09:33roelofif I have this fact : (facts "do-a-thing" {:exercise 1 :points 1} can I make it work that only this test is shown
09:41roelofI tried lein midje :filter exercise 1 but then I still get all the output
10:02wombawombaI'm trying to write a macro for managing resources. Basically, I want the resources to live only for the scope of the macro (I've got this working). However, I also want to be able to nest the macro, and for 'inner' macro invocations to be able to know which resources have been previously allocated. What's a good way of accomplishing this?
10:04wombawomba(i.e. if I do (mymacro [thing] ... (mymacro [other-thing] ...)), I want to, in the second invocation, be able to access the results of the first invocation)
10:05chouserah, communication between macros. fun stuff.
10:05wombawomba:)
10:06chouserI think Racket has suite of powerful tools for this sort of thing. You have a few options in Clojure.
10:14wombawombaone thing I'm thinking I could do is just define some kind of collection, and rebind it with new results in each macro invocation
10:14wombawombawould this be a good idea?
10:15TMAwombawomba: where are you going to use the outer resources? in the ... or in the invisible part generated by your macro?
10:17TMAwombawomba: if you need to use them in the body (i.e. in the "..." part), you can just let the user name the resource. it then becomes easy to refer to them by their name
10:17wombawombawell, I want the calling code to be able to access the resources, but I also want the invisible part generated by my macro to know precisely which resources have been allocated
10:18TMAwombawomba: think of (let [a 1] (let [b 2] (+ a b)))
10:18wombawombayeah, I do let users name resources; in my example there would be a binding called 'thing' in the body of the outer macro invocation
10:19wombawombabut in the inner invocation, I also want to be able to access some kind of collection to tell which resources are currently allocated
10:20wombawombaso I'm thinking I'd both define the resources by name, *and* have something like (def ^:dynamic defined-resources #{}) that I can rebind at will
10:20TMAwombawomba: that's tricky; perhaps you would like to implement your own macroexpanding tree walker, treating your own macro specially
10:21TMAwombawomba: there is a problem with that scheme you are proposing
10:21roelof oke, apperently nobody who can help me ? :(
10:21TMAwombawomba: it is easy to add them to the defined-resources set
10:23TMAwombawomba: it is nigh impossible to remove them -- there is no hook you can use [that I know of] to tell you the moment "I am done with macroexpanding the form that came out as a result of expansion of this macro"
10:26wombawombaI think it's fine.. e.g. this seems to work:
10:26wombawomba(def ^:dynamic x #{}) (defmacro m [y & b] `(binding [x (conj x ~y)] ~@b)) (m "a" (println x) (m "b" (println x)))
10:27wombawombaI think maybe I was unclear with what I wanted to do, but yeah that does seem to do the trick
10:28wombawombais there any way to tell if a certain binding is defined or not? that way I could avoid defining x in advance
10:31TMA,(def ^:dynamic x #{})
10:31clojurebot#'sandbox/x
10:31TMA,(defmacro m [y & b] `(binding [x (conj x ~y)] ~@b))
10:31clojurebot#'sandbox/m
10:31TMA,(m "a" (println x) (m "b" (println x)) (m "c" (println x)))
10:31clojurebot#{a}\n#{a b}\n#{a c}\n
10:31TMAhmm
10:32TMAwombawomba: oh, I misunderstood. I thought you want to be able to have the info during the macroexpansion
10:33TMA,(defmacro m2 [y & b] (println x) `(binding [x (conj x ~y)] ~@b))
10:33clojurebot#'sandbox/m2
10:33TMA,(m2 "a" (println x) (m2 "b" (println x)) (m2 "c" (println x)))
10:33clojurebot#{}\n#{}\n#{}\n#{a}\n#{a b}\n#{a c}\n
10:58troydmwhat is a name of a function that checks all pred against collection?
10:59gilliard,(doc every?)
10:59clojurebot"([pred coll]); Returns true if (pred x) is logical true for every x in coll, else false."
10:59troydmgilliard: yeah right, thx, tend to forget the name
10:59gilliardme too. I want to call it "all"
11:02sdegutisIs it normal that a lexer for an INI file is about 120 lines of Clojure code?
11:02sdegutisIt seems way long.
11:06gilliardThat does seem like a lot of code but IDK how many quirks there are in ini format to account for. Is this code public?
11:08sdegutisNope.
11:10sdegutisMy technique was to use a recursive function taking in a single context-map including :state, :tokens, :characters, and :partial-string, and to do a top-level (case) based on state, with a (cond) inside each state to check the first (and sometimes second) current characters, and (usually) recur with an updated context-map with new tokens and (next characters).
11:10sdegutisThose (cond)s definitely made it feel bulky and slightly redundant, but I don't know how else to do it.
11:11gcommerdoing character-by-character parsing is usually overkill
11:12gcommerI prefer something more like: read in the file as a list of lines; filter out comments/blanks; map a string split over them
11:21gilliardINI format seems very line oriented so you can reduce over the seq of lines as gcommer says. A line is either: comment or blank, start of a new section, definition a kv pair.
11:45sdegutisgcommer: Thanks.
11:45sdegutisgcommer, gilliard: in this specific INI-variant, sometimes the line bleeds onto the next line, and I have to check for that.
11:45sdegutisIt's a confusing situation, similar to INI in some ways, different in others.
11:57chouserwombawomba: sorry, got distracted by, you know, work.
11:57chouserI think you actually want a lexical variable, not a dynamic one, for communicating from the outer macro to the inner.
12:01chouser,(def x #{}) (defmacro m [y & b] `(let [~'x (conj ~'x ~y)] ~@b))
12:01clojurebot#'sandbox/x
12:01chouser,(m 1 (prn x) (m 2 (prn x)) (m 3 (prn x) (m 4 (prn x))))
12:02clojurebot#error {\n :cause "Unable to resolve symbol: m in this context"\n :via\n [{:type clojure.lang.Compiler$CompilerException\n :message "java.lang.RuntimeException: Unable to resolve symbol: m in this context, compiling:(NO_SOURCE_PATH:0:0)"\n :at [clojure.lang.Compiler analyze "Compiler.java" 6704]}\n {:type java.lang.RuntimeException\n :message "Unable to resolve symbol: m in this context"\n ...
12:02chouserHm, well, that worked for me.
12:02chouseroh, I see.
12:02chouser,(defmacro m [y & b] `(let [~'x (conj ~'x ~y)] ~@b))
12:02clojurebot#'sandbox/m
12:02chouser,(m 1 (prn x) (m 2 (prn x)) (m 3 (prn x) (m 4 (prn x))))
12:02clojurebot#{1}\n#{1 2}\n#{1 3}\n#{1 4 3}\n
12:04chouser...depends on what you want to happen when fn f uses your macro and inside calls fn g which also uses your macro.
12:43felipedvorak(map inc #{1 2 3}) => (2 4 3)
12:43felipedvorakCan somebody explain this to me?
12:44hiredmansince that is how map works you will have to explain which part of it you find surprising and need an explanation on
12:44felipedvorakIf I run (inc #{1 2 3}) it outputs an error, but that map inc somehow outputs that value and I can't understand
12:44hiredmansure, inc works on numbers, and a set of numbers is not a number
12:45hiredmanmap takes a sequable collection and a lazy sequence result in apply the given function to each element in the seq of the collection
12:47felipedvorakBut, if the inner function outputs an error, why would map work with the output of that? Sorry, I'm only two days in
12:47hiredmanwhy would it generate an error?
12:48hiredman,(doc map)
12:48clojurebot"([f] [f coll] [f c1 c2] [f c1 c2 c3] [f c1 c2 c3 & ...]); Returns a lazy sequence consisting of the result of applying f to the set of first items of each coll, followed by applying f to the set of second items in each coll, until any one of the colls is exhausted. Any remaining items in other colls are ignored. Function f should accept number-of-colls arguments. Returns a transducer when no coll...
12:48emautonfelipedvorak: It's not an inner function, it's a function being passed as an argument and then applied to each element of the set you pass.
12:48emautonfelipedvorak: What resource(s) are you learning from?
12:48felipedvorakAlright, I get it now :D
12:49felipedvorakThanks, I'm learning from braveclojure.com
12:50felipedvorakBut I'm in love with the language so I'm twisting it and just stumbled upon this. This isn't in the websites material
12:51emautonCool. Chapter 3, search for "higher-order functions" and there are some notes on this that might help (including a map example like yours).
12:53felipedvorakgreat, I'll get there. I've been strugling with learning to program for a long time... I've tried so many stuff online, and this is the first resource that clicks me in.. I sleep thinking about it and wake up excited to continue, very high quality
12:54emautonThat's wonderful!
12:55pcnfelipedvorak: you're lucky if this is working for you. This is a fine language to get started with.
12:58felipedvorakpcn: I've tried many, many other languages before
12:58felipedvorakAnd yes, this language is ridiculously sexy
13:06blake__Is Seesaw a reasonable way to build a GUI for a modern Clojure app?
13:10justin_smithblake__: I've heard great things about reagent+atom shell
13:10justin_smithdon't google that, you just get a bunch of chemistry stuff
13:11justin_smithblake__: https://github.com/Gonzih/cljs-electron
13:11blake__justin_smith: Ha! And electron is very cool.
13:13blake__But it's Clojurescript and webby, and I'm looking for something I can use in my class without going into all that. We've JUST got the basics, and I want to build on those by introducing clojure + java libraries.
13:14blake__At the same time if seesaw is moribund, I don't want to go into that too much, either.
13:15justin_smithblake__: it uses the chrome engine for a local app - it's not a web thing
13:15justin_smithbut yes, it does use cljs
13:16justin_smithblake__: seesaw should be good if you want to have a jvm focused class though
13:16justin_smithblake__: I didn't realize yourother parameters
13:16blake__justin_smith: Yeah, my vagueness is often a hindrance to...things.
13:17winkwoo, I need offtopic help. again :/ Any of you guys a) an American b) without BSc/MSc c) and working as a programmer who could query me for a few non-personal questions? :)
13:17justin_smithlol README typos - "npm install electron-prebuilt -g # install electrob binaries"
13:17blake__wink: I'm an American without a BSc/Msc working as a programmer.
13:18blake__wink: As is my son. And was my father. =P
13:20winkblake__: It's about a German trying to get a grasp on CVs written by Americans. (If you ever saw a German one, you'd probably know already where I'm comign at)
13:21blake__wink: I actually wrote for Toolbox for years, so I have some familiarity with German antics.
13:23winkI'm just curious if it's pure coincidence or meaningful if someone puts a high school degree before their arts degree - because I've never eevr seen that before in the (few) CVs by Americans I read
13:23winkor if it's already integration here
13:26winkand apparently roughly 56% of Germans have a driving license, whereas 75%+ of Americans have one, that's why it's on the CV :P
13:27blake__wink: Never seen it. I would go so far as to call it "weird". Unless the high school was very prestigious, or maybe more relevant to the job somehow.
13:27blake__wink: And I've never seen driver's license on a CV.
13:27winkblake__: that's what I meant. It's pretty common here
13:27justin_smithblake__: I'd put it on there if I was applying to deliver pizza
13:28winkblake__: what if you're delivering... cookies?
13:28winkerr
13:28winks/blake__/justin_smith/
13:28blake__I confess I've never reviewed CVs for a pizza job. I was a driver and I didn't put it on my resume because OF COURSE I have a license.
13:28blake__But then, I live in L.A.
13:28winkdoes that mean anything for pizza? :P
13:30emautonwink: I'd try not to read too much into cultural CV differences; try to pick out whether the candidate looks like someone you want to interview despite them. :o)
13:31winkemauton: well sure, but if you stumble over something, why not try to get more info to be a better judge the next time? :)
13:31blake__wink: We have the best pizza. Don't tell the rest of the country.
13:31winkblake__: too bad I don't see myself being able to confirm that anytime soon
13:31emautonwink: Because human systems are even weirder than computer ones and life's too short? ;o)
13:32blake__I once reviewed a resume where the applicant had put on: 22" chrome rims.
13:32blake__wink: I was counting on that.
13:32Frozenlockblake__: but did he even lift?
13:33blake__Frozenlock: He did say he was "the total package", so, I would assume so. I told him we were going with a guy with 23" rims.
13:33winkemauton: we're not a huge shop. we don't have an HR machinery filtering them :P
13:33winkrofl
13:34blake__Honestly, I've always sided with aptitude and attitude above all. I hate the whole "You have to have X years of experience with Y..."
13:35emautonblake__: It's the short way of saying "we'd like the rest of the industry to train people for us", which to be fair seems to be working out fairly well for lots of the big shops. ;o)
13:35emautonOkay, er, *cough*Clojure*cough*
13:37blake__So, yeah, seesaw says "replace x.y.z with version (see below)" and below is no version info. But it looks like daveray is still working on it.
13:38winkblake__: agreed. but "I've never used anything of what you're using" is also a bit lacking :P
13:38winkbut no, that's also not a no per se, but if someone has an informed opinion about a piece of tech it's a lot easier to talk about it
13:39justin_smithon the other hand, if someone applied for a clojure job with my company and had a good haskell / scheme cv, I'd vote for hire
13:39blake__It's a dark art.
13:39justin_smithyou at least want to know they have some existing interest in the right ballpark though
13:40winkyep
13:40blake__I'm doubtless biased. I was a music major. =)
13:40winkblake__: oh, in many people's opinion that would qualify you a lot more than me (having done PHP for many years)
13:40justin_smithblake__: I'm double-biased, I'm a "never enrolled"
13:41blake__So, you guys know.
13:44emauton /j #clojure-adhoc-careers if you'd like to talk of such things without feeling like we're ruining #clojure's scrollback. :o)
14:45chomwitti have simple file with a simple ring handler. starting repl in the src dir being in the namespace i use other simple function defined in it. changed the handler a little (adding a with-out-str (clojure.pprint ...) and now my other functions are unresolved symbols not existing in the namespace as ns-intern shows to me. how could that happen?
14:48hiredmanyou have a source file on disk that contains code for a namespace and you didn't load that source file
15:01sobelcan anyone recommend a howto/example for using dbcp (connection pooling) w/clojure?
15:16amalloysobel: that seems like the kind of thing that you want a library for, not a how-to or example
15:17amalloyif you do it yourself it's not hard to mess up, whereas (for example) bonecp probably has the features you need implemented fairly well. maybe there's even something in the jre already
15:17amalloyhttp://stackoverflow.com/q/2835090/625403
15:22sobelamalloy: yeah, i poked around for libraries and found more than a few. i was hoping to get a recommendation from someone that uses it.
15:22sobeli already have dbcp in my app environment
17:37Rurikwhat does '*fn*' mean in clojure
17:38chrchrIt means lambda
17:39amalloyRurik is probably asking about earmuffs
18:24thiagofmtesting.
18:51nice_musicHi, I am trying to send Midi messages from Clojure to a sequencer like Reason and Ableton, is this possible using Overtone?
18:53devnnice_music: sure!
18:54nice_musicGood to know, I'm having quite some trouble setting it up devn.
18:54devnnice_music: whatcha doing currently? I haven't messed with overtone for awhile, but I did get it to pass midi IIRC.
18:55nice_musicdevn: I have Reason open and a REPL with Overtone autoloaded by Leiningen. Whenever I try to find find MIDI devices it doesn't find any..
19:00devnnice_music: im firing up a new project
19:00devnill see if i can make something work
19:00devn1sec
19:00nice_musicdevn: awesome!
19:01devnnice_music: what OS?
19:01nice_musicdevn: Mac OS X.
19:03devnnice_music: go into audio/midi preferences, then open up the MIDI studio (command+2 or select it under the Windows menu)
19:03devnWindow* menu
19:03devnCreate a network session
19:04devndouble click network, click the + under sessions
19:04nice_musicdevn: in what program should I open these audio/midi prefs?
19:05devnit's a built in preference thing, a GUI
19:05devnopen up spotlight, then type Audio, and select "Audio MIDI Setup"
19:06devnor in the terminal type: open /Applications/Utilities/Audio MIDI Setup.app
19:06nice_musicdevn: got it.
19:06nice_musicdevn: now open a network session?
19:06devnk, so create your session with the + button
19:06devnunder Sessions
19:07devnthe details there don't really matter
19:07devnjust make sure you can connect from "Computers in my directory"
19:07devnin the lower left
19:08nice_musicdevn: check.
19:08devnthen, if you restart your overtone REPL, (midi-connected-devices) should now show you something like this:
19:08devn{:sinks 0, :info #<MidiInDeviceInfo Session 1>, :name "Session 1", :overtone.studio.midi/dev-num 0, :version "Unknown version", :device #<MidiInDevice com.sun.media.sound.MidiInDevice@2b5ccb9>, :sources 2147483647, :vendor "Unknown vendor", :description "Network Session 1", :overtone.studio.midi/full-device-key [:midi-device "Unknown vendor" "Session 1" "Network Session 1" 0]}
19:09devnand in overtone, if you look at midi preferences, you'll see your network midi
19:10devnerr sorry not in overtone, in ableton
19:10nice_musicdevn: I see the information. Where can I see midi prefs in Overtone?
19:10nice_musicAh, I was trying Reason.
19:10devnah, well i bet it's similar
19:10devneither way the deal is this
19:10devnyou now can see the network midi session from overtone, and you can put events into it
19:10nice_musicdevn: true.
19:11devnon a midi channel in reason or ableton or whatever, make sure that the input for that channel is the network session
19:11nice_musicdevn: ah.. care to share an example? On how to send one note?
19:12nice_musicdevn: and how to hook it up to that particular channel/session in Overtone?
19:12nice_musicdevn: I did select it in Reason.
19:13devnheh, im working through this now, gimme a few
19:14nice_musicdevn: cool.
19:32devnnice_music: alright small change of plans
19:33nice_musicdevn: okay.
19:33devnnice_music: go drop that network session that you created in audio midi settings
19:33nice_musicdevn: ok.
19:33devndownload this: http://notahat.com/midi_patchbay/
19:35nice_musicdevn: done.
19:40devnnice_music: okay, so in midi patch bay click "Add Patch"
19:40nice_musicdevn: yes.
19:40devnthen for the MIDI input dropdown, click "Edit virtual inputs"
19:41devnclick New Input, name it Overtone
19:41nice_musicdevn: yes.
19:41devnclick on the Outputs tab, and name that Reason
19:41devnor whatever you want
19:41nice_musicdevn: done.
19:41devnrestart your overtone session and verify you see "Overtone" as one of the options when you run (midi-connected-receivers)
19:42devnin reason or ableton or whatever, set the channel to receive midi from the Overtone input on All channels
19:42devn(the channel with your instrument on it)
19:42TEttingerit's interesting how we don't often get overtone questions here, but a lot of people have experience with overtone it seems. I'm glad you can provide detailed help, devn!
19:42TEttinger(inc devn)
19:42lazybot⇒ 25
19:43devnhappy to help, it's a fun way (and if im being frank, a pretty difficult way) to get started with Clojure
19:43devnbut for simple enough stuff it's fun to start making noises
19:43devnjust using midi or whatever
19:44devnnice_music: i made a typo above
19:44nice_musicdevn: I see it in the REPL yes.
19:44devnin reason, you'll see "Reason" or "Ableton" or whatever you named it
19:44devnand in Overtone you'll see "Overtone" in that list
19:44nice_musicdevn: yes.
19:45abhir00pis it possible to have a function that only returns a value if the predicate is satisfied otherwise doesnt return anything(not nil)
19:46abhir00pconstraint without using remove and filter
19:48devnnice_music: https://gist.github.com/devn/691aa4f98912ea144468
19:48justin_smithabhir00p: no, the only way not to return is to throw
19:48justin_smithabhir00p: if you return, you return something
19:49devnnice_music: did that work for you?
19:51nice_musicdevn: I can see notes being scheduled. Also I can play the song, but I don't receive them yet at the Reason end. Might have to fiddle a bit there.
19:52devnnice_music: you ever share your screen? happy to help you out quick
19:52devnnice_music: zoom.us is an option
19:53nice_musicdevn: that's fine by me. Or maybe Skype?
19:53devnsure, ill ping you my skype info
20:17Rurik,(def foo ([] []))
20:17clojurebot#error {\n :cause "Key must be integer"\n :via\n [{:type clojure.lang.Compiler$CompilerException\n :message "java.lang.IllegalArgumentException: Key must be integer, compiling:(NO_SOURCE_FILE:0:0)"\n :at [clojure.lang.Compiler$InvokeExpr eval "Compiler.java" 3661]}\n {:type java.lang.IllegalArgumentException\n :message "Key must be integer"\n :at [clojure.lang.APersistentVector invoke "AP...
20:17justin_smithRurik: what are you trying to do there?
20:17Rurikjustin_smith, just trying to understand clojure source code
20:18abhir00pi am trying to write a function which filters out all the elements which stisfies a predicate
20:18abhir00pconstraint: not using filter or remove
20:18Rurikit does something like (defn vector ([] []) ...
20:18justin_smithRurik: I think you are misreading it
20:18abhir00pthe code i wrote is here http://pastebin.com/QXWhzUYf
20:19justin_smithalso defn and def are very different
20:19amalloyjustin_smith: well, (defn vector ([] []) ...) is perfectly reasonable
20:19Rurikah
20:19justin_smith,(defn foo ([] []))
20:19clojurebot#'sandbox/foo
20:19justin_smith,(foo)
20:19amalloyprobably the actual definition
20:19clojurebot[]
20:19justin_smithamalloy: right, he did def above, which is the confusion
20:19amalloyright
20:19amalloyit's just that you said he'd misread it *and* said def and defn were different
20:20justin_smithamalloy: there was a write skew on the "misreading it" comment
20:20RurikI keep using def in place of defn and keep getting confused
20:20amalloyha
20:21justin_smithabhir00p: what have you tried so far?
20:21abhir00phttp://pastebin.com/QXWhzUYf
20:21abhir00pbut i end up using remove in the end
20:22abhir00pbasically i want to know if its possible to have a function which returns nothing if predicate is not supplied
20:22justin_smithabhir00p: what about not doing the cons if the pred returns false?
20:22justin_smithabhir00p: no, as I said before, if you return, you return a value
20:24justin_smithabhir00p: (if (pred? (first aseq) (cons (first aseq) (my-filter pred? (rest a-seq))) (my-filter pred? (rest a-seq)))
20:24justin_smiththat's the long clumsy version, there are ways to make that more succinct
20:24justin_smithoh and I got my parens wrong up there
20:26abhir00pi though of this approach
20:26abhir00pbut it seems a little clumsy
20:27justin_smithless clumsy than walking the whole list a second time to remove nil results
20:27abhir00ptrue that
20:28justin_smithabhir00p: you can turn your if on line 7 to a cond
20:28justin_smithfirst test aseq
20:28justin_smiththen test pred
20:28justin_smithyou don't need predfun
20:29justin_smithyou can eliminate the repetition of (my-filter pred? (rest aseq)) via let
20:29abhir00pis (first a-seq) O(1)?
20:29abhir00pif not we can let that too
20:30justin_smithyes it is O(1)
20:30justin_smithoh, but using let to bind the recursive call could blow the stack :(
20:30justin_smithunless you use delay
20:33justin_smithor maybe not...
20:36amalloyjustin_smith: if you're not using lazy-seq you're blowing the stack anyway
20:36justin_smithamalloy: oh, right, if course
20:36amalloyand if you are, then adding a let-binding will not cause you to blow the stack
20:37justin_smithawesome, one day I'll get that stuff
20:37abhir00p@justin_smith beginner question is there any constrct similar to continue in clojure
20:37justin_smith(inc amalloy)
20:37lazybot⇒ 298
20:37abhir00pso what would you suggest @amalloy
20:37justin_smithabhir00p: no - not really - I mean we have reduced in the reduce function for "early escape" which is kind of similar...
20:38amalloyabhir00p: there's not much call for continue when you don't have while or for
20:38amalloy(we do, of course, have both of those, but they are quite different)
20:48raspasovhey guys, anyone using docker here?
21:03domokatoin the docs for pmap it says "Semi-lazy in that the parallel computation stays ahead of the consumption, but doesn't realize the entire result unless required."
21:03domokatoi'm not sure what this means
21:04justin_smithdomokato: it will realize N items at a time, but won't realize the whole thing. N is derived from a calculation that includes things like how many CPUs you have
21:04domokatoah okay
21:05justin_smithbecause how else could it go full parallel, right? it needs a bit of eagerness for that
21:05justin_smithalso
21:05justin_smith~pmap
21:05clojurebotpmap is requires syntax quoting which most of the time
21:05justin_smithman that factoid sucks
21:05domokatowat
21:05justin_smithanyway, pmap is kind of a gimick and usually you should be doing your own parallelization logic if you really need parallelization
21:06domokatooh okay
21:06justin_smithdomokato: there's another factoid liek "pmap isn't the right thing usually"
21:06domokatoah
21:06domokatoyeah, i'm trying to kick off a few parallel computations but not block the thread i'm on waiting for completion
21:07justin_smithlike if you can get and use results out of order, there's optimizations you can do that are not available with pmap. Or if you have your own idea of how many threads should be active with your collection.
21:07domokatodoes pcalls fall under the gimmick umbrella as well?
21:08justin_smithI don't actually know that one
21:08justin_smithlooking at the docs it looks OK - it just uses the future pool though
21:09justin_smithoh haha - check out the def https://github.com/clojure/clojure/blob/clojure-1.7.0/src/clj/clojure/core.clj#L6744
21:09justin_smithROFL
21:09domokatoaccording to the docs...it might work. i just need to bind it to a symbol and dorun it at the end of the thread I'm on to join everything
21:09domokatohaha dammit
21:10domokatowell, nevermind then
21:10domokatoi want them all to run immediately and as fast as possible
21:11justin_smithdomokato: the most flexible solution is to use a queue (I like the one from java.util.concurrent but there is one in clojure too) and a thread pool where every thread reads from the in queue and writes to an out queue
21:11justin_smithor some similar construction
21:11amalloydomokato: you don't really, though
21:11amalloybecause what if there are like a thousand items in the list. you don't want to start up a thousand threads
21:12domokatoamalloy: sorry, that's not what i meant
21:13domokatoamalloy: from my understanding of pmap, some of the computations may not run as soon as possible, instead waiting for realization to start
21:14amalloywell yes. for example, if there are a thousand things, only some smallish N of them will run, until you start consuming
21:14domokatoamalloy: i'd rather they all run as soon as possible (one per thread per core, not all at once on different threads)
21:14justin_smithdomokato: right, so really what you want is to figure out what your ideal parallelism is for the given code, and set up the workers that will maintain that effectively. pmap uses a default, but you can refine this with your own pool
21:14chomwitti start 'lein repl' , i'm in my projects main namespace but my namespace dont have any symbol in it! http://paste.ofcode.org/NNAqEDveX2NYXhb3B4GvGn if i remove the (with-out-str .. ) part then my namespace is ok!
21:15amalloythe thing about pmap is, it has to balance a lot of different concerns to be applicable in wildly differing use cases
21:15amalloyif you have a specific use case, you usually have a better answer available with your own thread pool
21:15chomwittwhat dont i get?
21:15justin_smithchomwitt: for starters, you should require clojure.pprint if you are going to use it
21:15justin_smithit's not automatically present
21:16justin_smith(though I guess lein often loads it)
21:16domokatookay, i'll try that. thanks guys!
21:16chomwittjustin_smith: one moment to try ..
21:20chomwitt(require clojure.pprint) didnt help. i still get nothing in my ns (i check with (ns-interns *ns*)
21:21justin_smithchomwitt: and no errors?
21:21justin_smithwhat ns does it start you in?
21:21Jabberzanyone have a recommendation for monitoring a clojure app on heroku? Any of the standard java offerings (like new relic) work okay or ?
21:21chomwitti get 'unable to resolve symbol: foo' if i try to evaluate in in repl
21:22justin_smithchomwitt: what ns is the repl in
21:23chomwittsorry i did get an error
21:23chomwitti missed it (fast scrolling.. )
21:24chomwitt#error {
21:25chomwitt:cause clojure.pprint /nl :via /nl [{:type clojure.lang.Compiler$CompilerException
21:25chomwitt:message java.lang.ClassNotFoundException: clojure.pprint, compiling:(basic_clj_ring_webapp/core.clj:2:1)
21:25chomwittand a page full trace follows!
21:25justin_smithchomwitt: your ns block should looke something like (ns foons.core (:require [clojure.pprint :as pprint]))
21:26justin_smithrequire at the top level is only for the repl, but it would look like (require '[clojure.pprint :as pprint])
21:26justin_smithwith the '
21:26justin_smithClassNotFoundException clojure.pprint would usually be caused by doing that repl version wrong
21:27chomwitti see. the require must be part of the ns expreassion
21:27justin_smithit should be - the second form is valid, but I think you should only use that in the repl
21:29chomwittthanks!!
21:29justin_smithso did that fix it?
21:29chomwittjustin_smith: yep
21:32amalloychomwitt: also, while it's polite to not do multi-line pastes into the channel, when giving an error message it is usually helpful to put the whole stacktrace on a pastebin site (eg, gist.github.com) and link to it
21:32justin_smithluckily that error has an easy to identify common cause though
21:33chomwitti'm learning and the site i got the idea for the small ring program didnt say how to do that rigth. it had a simple (ns .. ) command
21:33domokatoactually, pmap has all the logic i need for splitting the task onto separate cores, and i can dorun on it to get it to run immediately...if i just stick all that in a future and deref the future at the end of my main thread, I should get the desired effect
21:33chomwittamalloy: u r right . i'm sorry
21:33amalloychomwitt: no harm done. you didn't make a big paste, and justin_smith found your error without needing a full trace
21:34justin_smithI still need to make that "common error messages in clojure and what they usually mean" website
21:34justin_smithgod damned day jobs and laziness make it so nothing gets done
21:36amalloyerror message #1: website delayed by laziness
21:36justin_smithhaha
22:39mistabizsay I have a set of dominoes, [ 0 , 0 ] to [ 6 , 6 ], how would i write it to give me each dominoe combo
22:41TEttinger&(for [a (range 6) b (range 6)] [a b])
22:41lazybot⇒ ([0 0] [0 1] [0 2] [0 3] [0 4] [0 5] [1 0] [1 1] [1 2] [1 3] [1 4] [1 5] [2 0] [2 1] [2 2] [2 3] [2 4] [2 5] [3 0] [3 1] [3 2] [3 3] [3 4] [3 5] [4 0] [4 1] [4 2] [4 3] [4 4] [4 5] [5 0] [5 1] [5 2] [5 3] [5 4] [5 5])
22:41TEttinger&(for [a (range 7) b (range 7)] [a b]) ; rather
22:41lazybot⇒ ([0 0] [0 1] [0 2] [0 3] [0 4] [0 5] [0 6] [1 0] [1 1] [1 2] [1 3] [1 4] [1 5] [1 6] [2 0] [2 1] [2 2] [2 3] [2 4] [2 5] [2 6] [3 0] [3 1] [3 2] [3 3] [3 4] [3 5] [3 6] [4 0] [4 1] [4 2] [4 3] [4 4] [4 5] [4 6] [5 0] [5 1] [5 2] [5 3] [5 4] [5 5] [5 6] [6 0] [6 1] [6 2] [6 3] [6 4] [6 5] [6 6])
22:42mistabizso [0,1] [1,0] are the same dominoe
22:42clojurebotHuh?
22:43TEttingerah, now we're talking
22:45TEttinger&(distinct (for [a (range 7) b (range 7)] (sort [a b]))) ;; naive way
22:45lazybot⇒ ((0 0) (0 1) (0 2) (0 3) (0 4) (0 5) (0 6) (1 1) (1 2) (1 3) (1 4) (1 5) (1 6) (2 2) (2 3) (2 4) (2 5) (2 6) (3 3) (3 4) (3 5) (3 6) (4 4) (4 5) (4 6) (5 5) (5 6) (6 6))
22:45mistabizso now make the magic with no alternating pairs [0 1] [1 0] [1 2] [2 1]
22:45mistabizoop
22:46mistabizdistinct huh
22:46TEttingervery useful, similar to how sets work in clojure
22:46TEttinger&(into #{} (for [a (range 7) b (range 7)] (sort [a b]))) ;; naive way
22:46lazybot⇒ #{(2 2) (0 0) (2 3) (2 5) (0 6) (3 3) (1 1) (0 5) (3 4) (6 6) (4 6) (1 4) (1 3) (1 5) (0 3) (5 6) (5 5) (2 4) (3 6) (4 5) (0 2) (0 4) (1 6) (4 4) (2 6) (1 2) (3 5) (0 1)}
22:46TEttingerlooks like the same length, right?
22:46TEttingersame collection just unsorted
22:47mistabizcool
22:55mistabizthanks
23:28reutermjHow do you get metadata of a var from a macro?
23:29amalloyTEttinger: it's easier to just not generate the duplicates to begin with
23:29TEttingeryeah, I forgot how to do that
23:29amalloy,(for [a (range 7) b (range (inc a))] [a b])
23:29reutermjdoing (meta sym) gives me line number and files
23:29clojurebot([0 0] [1 0] [1 1] [2 0] [2 1] ...)
23:29TEttingerah!
23:29amalloy&(for [a (range 7) b (range (inc a))] [a b])
23:29lazybot⇒ ([0 0] [1 0] [1 1] [2 0] [2 1] [2 2] [3 0] [3 1] [3 2] [3 3] [4 0] [4 1] [4 2] [4 3] [4 4] [5 0] [5 1] [5 2] [5 3] [5 4] [5 5] [6 0] [6 1] [6 2] [6 3] [6 4] [6 5] [6 6])
23:30TEttinger(inc amalloy) ;; the usual
23:30lazybot⇒ 299
23:30TEttingergetting close!
23:30justin_smithreutermj: ##[(meta +) (mega #'+)]
23:30lazybotjava.lang.RuntimeException: Unable to resolve symbol: mega in this context
23:30justin_smitherr
23:30justin_smithreutermj: ##[(meta +) (meta #'+)]
23:30lazybot⇒ [nil {:added "1.2", :ns #<Namespace clojure.core>, :name +, :file "clojure/core.clj", :inline-arities #<core$_GT_1_QMARK_ clojure.core$_GT_1_QMARK_@35abfed1>, :column 1, :line 945, :arglists ([] [x] [x y] [x y & more]), :doc "Returns the sum of nums. (+) returns 0. ... https://www.refheap.com/109201
23:30amalloyi'm more looking forward to when justin_smith catches up, so i can give him the honorary final +1
23:31justin_smithaww, shucks
23:31justin_smith(identity justin_smith)
23:31lazybotjustin_smith has karma 293.
23:31justin_smithSO CLOSE
23:32rhg135I should go find a problem
23:43reutermjjustin_smith: Thanks!