#clojure logs

2013-04-29

03:18rodnaph_is it possible to specify leiningen options (eg :source-paths) via the shell? lein -Dsource-paths=X or something... (doesn't seem to be but asking incase i've missed it in the docs)
03:22thm_proverdumb question, suppose I have something like (cond (test1) (expr1) (test2) (expr2) (test3) (expr3)) .. suppose furthermore that testX is an expensive op. Is there a way to refer to the result of testX in exprX ?
03:26ucbthm_prover: you could memoize testN and re-use that in exprN?
03:26thm_proverucb: whoa, this is a neat trick
03:26thm_proverhow would I do this?
03:26ucbthm_prover: (def m-test1 (memoize test1))
03:26thm_proveri.e. eventualyl, I need to gc the memoizaition right?
03:27ucbthen (m-test1) (expr1 (m-test1))
03:27ucbthe first time m-test1 is eval'ed, it'll be expensive, the second time it won't be
03:27thm_proveroh boy, what if, I want these tests to be anonymous
03:27thm_proverso I don't have to do a def ... for every line of my cond
03:27ucba word of caution is that testN has to be idempotent or you're going to have a bad time
03:27thm_proveri.e. I'd want to refer to the testN as "it"
03:28thm_proversomethign like: (testN) (exprN ... it ... ); where the "it" takes on the value evaluation of (testN)
03:28ucbthen you're probably better of with a let or something along those line
03:28ucblines*
03:29tomojthm_prover: what's a testN actually look like?
03:29thm_proverhttp://hpaste.org/86801
03:29thm_provermaybe I am solving the wrong problem
03:30tomojuse condp
03:30thm_proverhmm, the :>> to a #( ... % ) ?
03:31thm_proverthis looks badass
03:32tomojso (condp re-find line #"^user" :>> println ...) ?
03:32tomojI don't think I've ever used :>>
03:33thm_proverthis is fucking amazing
03:37thm_provertomoj: you should write a (short < 20) page of clojure idioms. I would read it.
03:39arrdemtomoj: defuq is :>>?
03:39arrdem,(doc :>>)
03:39clojurebot#<ClassCastException java.lang.ClassCastException: clojure.lang.Keyword cannot be cast to clojure.lang.Symbol>
03:39tomojjust a keyword :)
03:39tomojcondp magic
03:39arrdemI noticed :p
03:39tomoj:/
03:40noidi,(doc condp)
03:40clojurebot"([pred expr & clauses]); Takes a binary predicate, an expression, and a set of clauses. Each clause can take the form of either: test-expr result-expr test-expr :>> result-fn Note :>> is an ordinary keyword. For each clause, (pred test-expr expr) is evaluated. If it returns logical true, the clause is a match. If a binary clause matches, the result-expr is returned, if a ternary clause matches, i...
03:40thm_prover:>> looks like santa claus
03:41arrdemoh so :>> implicitly applies the fn..
03:41thm_proversomeday, clojure will have more syntax than Perl.
03:41arrdemawesome
03:41arrdemthm_prover: as long as we don't have sigils I'll be OK.
03:42tomojthm_prover: I'm working on a theorem proved called "thm", coincidentally (-- or did I subconsciously steal the name from you?)
03:42thm_provertomoj: let's talk, I want to implement a basic verifier in clojure too (rather than Coq)
03:42tomojprover
03:43thm_proverI feel like Isabelle/Coq hides the "simple verifier core"
03:43arrdemok so the question I hopped on to ask: static HTML in files, or static HTML in a database as I'm rewriting my blag?
03:43thm_proverand instead, like sicp has a 10 line scheme interpreter, similarly theorem proving should have a 10-20 line verifier
03:43thm_proveron which all else can be built
03:44arrdemthm_prover: looked at ACL2?
03:45tomojso far I have core.logic relations for wffs and substitution
03:45thm_provertomoj: is this on github
03:45thm_proverarrdem: does it have a short core?
03:45tomojnope, just started working on it
03:46thm_proveris this related to Milner's LCM system?
03:46thm_proverand the type system that ended up being Ocaml's type system?
03:46tomojI dunno much of anything about non-manual theorem proving so I'll probably run out of steam soon
03:47tomojI was planning to try the tableaux method next
03:49arrdemthm_prover: nope ACL2 is big as hell. I just mentioned it 'cause the author teaches here and it seems to be one of the few automated proof systems which is used at all.
03:49tickingif you guys want to start a clojure acl solver please do so
03:50tickingI needed one 2 days ago but couldn't get one
03:51tgoossensis it correct to say that for managing data in clojure. I should think more like in a relational database. More concrete: less refs: more id keywords on maps ?
03:51tgoossensand put everything in one big atom then or what?
03:53arrdemtgoossens: the "big atom" is to be avoided where possible, but yes keywords and "id" values in stead of references is a Good Idea (TM)
03:53tomojI think I remember looking at ACL2 long ago now that I think about it
03:53tgoossensarrdem: i have a lot of difficulties "grasping" it.
03:53tgoossensI mean in java i create an object that references another object etc
03:54tgoossensin clojure if you have a ref that refers to another ref. then the concept of value makes no sense anymore
03:54tomojticking: what's a "clojure acl solver"?
03:55arrdemtgoossens: the important thing here is that Clojure is all about data. The paradigm is to draw a line in the sand between data (state) and the code which manipulates it.
03:56arrdemconsequently a common design pattern is the "god map", which is functionally an object representing the state of the program.
03:56tickingtomoj: sorry by brain mixed up alc with acl. alc is the logic behind owl.
03:56tgoossensAnd what does that give me?
03:56tgoossenswhat is for example I want to be notified when a certain part gets updates of the ref
03:56tgoossens(add-watch)
03:57tgoossensif i have a god map and i'm only interested in certain parts
03:57tgoossensthen i have to filter everytime another part gets updated
03:58tomojI have a case where (apply = (first (run 1 [x y] (fooo x y)))) but not (seq (run 1 [x y] (fooo x y) (== x y)))
03:58tomojgotta be a bug, right? or is there some way that makes sense..
03:58arrdemhum... that suggests that you want to be chaning updates to the map unless you intend to deal with user defined code
03:58arrdem*chaining
03:59tgoossenshmm?
04:00arrdemrather than have bar which is invoked on an update and foo which produces an update, you want to use baz which composes foo and bar.
04:00arrdemthe arrow macro is a beautiful thing for this.
04:04tomojpedestal's god map has some kind of focus thingy
07:12edoloughlin,
07:12clojurebot#<RuntimeException java.lang.RuntimeException: EOF while reading>
07:12juxovechi, I created file sprint_is/modules/json.clj, inside is text (ns sprint-is.modules.json)
07:13juxovecwhen I try to import it in test with (:use sprint-is.modules.json), I tells me the namespace doesn't exist
07:13hanDerPederany one here using lein-junit? Trying to spit out xml format with one file per test class, but im only getting it to write all output to stdout.
07:13juxovecI get only: Exception in thread "main" java.lang.Exception: No namespace: sprint-is.modules.json found
07:36juxovecnow I got really confused. when I leave only (ns sprint-is.test.json) in my test, it still throws the Exception, do you have any idea why this is happening?
07:37juxovecI run it with lein midje :autotest
08:39juxovecDamn, I was trying to import 1 fucking ns for two hours. Unsuccessfully. Next try tomorrow.
08:44ucbjuxovec: mind pasting the code somewhere?
08:46juxovechere it is https://bitbucket.org/jiriknesl/sprintis
08:53clgvis it possible to use definline with primitve type hints?
08:55clgvjuxovec: there is no namespace called "sprint-is.modules.json"
08:55juxovecI renamed files, moved files from folder to parent folder and tried a lot of things
08:55clgvjuxovec: maybe you meant sprint-is.json-export" ?
08:56ucbyeah
08:57juxovecAnd I still get http://pastebin.com/zFNMU6XB
08:57juxovecNo namespace: sprint-is.json-export found
08:57juxovecWhen I remove (ns sprint-is.json-export) and let the file without any NS, midje runs but does nothing
09:04murtaza52how do I find the index of a given element in a seq ? (index? [:a :b :c] :b) => 1
09:10florianover@dakrone can you help me out again?
09:12ucbmurtaza52: don't know if there's a core fn for that, but you could try with something like this (second (first (drop-while #(not= :b (first %)) (partition 2 (interleave your-seq (range))))))
09:13florianoverFrom the documentation it looks like i have to use multipart like this:
09:14florianoveror let's do this simpler….
09:15florianovercurl https://bla.com -H "Authorization: Bearer myAccessToken" -F filename=@test.jpg -F parent_id=740143156
09:15florianoverwhat would it look like in cli-http?
09:18clgvmurtaza52: why would you want to do that? remember that you cannot access that element with the index efficiently for arbitrary sequences
09:18florianoverwhen i try it this way: {:multipart [["title" "Foo"]
09:18florianover ["Content/type" "text/plain"]
09:18florianover ["file" (clojure.java.io/file "/tmp/missing-file")]]
09:19gdev[ANN] my code is bad and i feel bad
09:19florianoveri get the error: java.lang.IllegalArgumentException: Name may not be null
09:19murtaza52clgv: I have a seq of 2-3 elems, and need to know the position of the elem
09:20gdevprotip, if you're trying to prevent the database from doing all the heavy lifting, don't put your update statement in a doseq
09:21clgvmurtaza52: what do you do with the index afterwards?
09:22murtaza52clgv: I process the elem differently given its index in the seq. There is a diff fn for each index.
09:23clgvmurtaza52: ok.
09:24gdevhere is the tkprof of my trace file, 1:1 ratio of rows and sql queries...no good http://pastebin.com/cxH3L9H7
09:25murtaza52ucb: thanks
09:26ucbmurtaza52: keep in mind that that can be simplified probably
09:27krlanyone using the disk-storage of clucy? i'm getting errors, and it's not really covered by the tests it seems
09:29krlor are there any other nice text-indexing databases around? preferably in-process
10:12pl6306How do I use the pr function to save an object to a text file? Do I overwrite *out* first?
10:12pl6306I meant clojure map i.e. data structure
10:16rbxbx`pl6306: you can just use `spit` http://clojuredocs.org/clojure_core/clojure.core/spit
10:16tomojI don't understand why pr-on is private
10:17pl6306Man that was simple. Thanks!
10:18tomojif you use spit you'd better pr-str
10:18pl6306how do I read it back into a data structure?
10:19tomojhttps://www.refheap.com/paste/92a555b5987606bc69d0819d0
10:21tomojto match (spit f (pr-str x)) you'd do (read-string (slurp f))
10:22tomoj(btw, you must trust f)
10:22pl6306Thanks! It is all my work so it is safe
10:25tcrayfordas in, none of that comes from user data whatsoever?
10:25tcrayfordyou're probably ok then ;)
10:25tcrayfordjust to be safe, you prolly want to (binding [*read-eval* false] (read-string (slurp f))) anyway
10:26nDuffUsing a Clojure too old to have an EDN reader?
10:27pl6306How do I use EDN?
10:27pl6306I heard about it but I thought it was just built into the clojure reader
10:28tcrayfordif you're on clojure 1.5, clojure.edn/read
10:28pl6306Thanks
10:28tcrayford(that was from google, no idea if/how well it'll work)
10:33pl6306Any libraries in clojure that can let me work with zip files?
10:34nDuffpl6306: What's your actual use case? (The answer is "yes", but details matter re: deciding which is appropriate)
10:34pl6306I just want to compress and decompress text files
10:34pl6306Nothing fancy
10:35nDuffpl6306: One to an archive? Multiple?
10:35nDuffpl6306: Is this for consumption by 3rd-party tools?
10:35pl6306one to one
10:35nDuffIf it's one-to-one, zip is actually a pretty bad format choice
10:36nDuffGZip would be better if you care about portability / library availability, and an LZMA-based algorithm otherwise.
10:36pl6306yeah but I want to be able to unzip it using some other tools
10:36nDuffpl6306: Right -- that's why I suggested gzip.
10:37pl6306I will try that is there a clojure lib or should I just the java one
10:37nDuffpl6306: zip is an archival format which happens to have compression tacked on, not a compressor; among other things, that means there's more code involved in working with it (you have to figure out what file(s) you want within the archive, what you want to name things going in, how to handle corner cases when there are more files than you expect or directory structure, etc).
10:38nDuffpl6306: yup, just the java.util.zip.GZIP{Input,Output}Stream utilities
10:38tomojmy example with gzip https://www.refheap.com/paste/ad21887e84351ca13e73936c7
10:38pl6306I will try that one first thanks
10:45ppppaulwhy aren't numbers and strings functions in clojure?
10:45danlarkinbecause java
10:46ambrosebs,(let [do 1] do)
10:46clojurebotnil
10:47danlarkinppppaul: numbers and strings in clojure are java.lang.String/Double/etc and those don't implement IFn
10:47danlarkinso that's why
10:49tcrayfordalso, what sensible IFn instance have you got for numbers?
10:50tcrayfordI guess they could index like nth
10:50tcrayford(sorta like keywords do with maps)
10:50tcrayfordbut that seems weird as heck to me
10:51danlarkintcrayford: I'd imagine they could behave like keywords. That is, look themselves up in a map
10:51danlarkinbut it's a moot point because they can't be IFn :)
10:52tcrayfordyeah, I guess. It still seems weird, there are so many more things that you use numbers for other than accessing collections (wheras keywords are really only used for map keys (or maybe hierarchical tags occasionally))
10:52tcrayfordI guess strings could behave exactly like vectors (call them with an i
10:52tcrayford... an number, they index themselves at that point)
10:55ppppauli don't know what i was thinking
10:55ppppaulforgive me
10:55tcrayfordno offence, was just curious, I've thought about it before ;)
11:30gfredericksdoes reply let me embed a repl in my uberjar, with readline-y features? i.e., why would I use it instead of running clojure.main?
11:30trptcolinhttps://github.com/trptcolin/reply/wiki/Embedding-REPLy
11:30trptcolin:)
11:31gfredericks(inc trptcolin)
11:31lazybot⇒ 2
11:32gfrederickstwoptcolin
11:32rbxbx``trptcolin: neat, I didn't realize you rewrote lein's repl
11:36trptcolini actually just wrote that wiki last week - thanks to kim kinnear for some good questions & pointing out some bugfixes
11:38trptcolinhoping to get 0.2.0 out very soon. just an nrepl release away, i think.
11:39gfrederickswhich is the standard unit of time in clojureland
11:46tickingI wonder why clojure.zip/root never became clojure.zip/unzip, with root returning the root loc
11:46tickingseems like the better api
12:08dnolenanybody ever tried to AOT the CLJS compiler and looked into the issues?
12:09silasdavisrails
12:09ppppaulrails?
12:11silasdavismissing a /join #
12:11technomancy~praetorian guards
12:11clojurebotforget chouser: it's tougher with guards (arbitrary tests), where grouping is less clear. I need to work that out still.
12:11technomancyargm
12:11technomancyargh
12:12jaleyis there something I should use as content-type for edn?
12:12llasramargc, argv, argm, argh
12:13ambrosebsdnolen: does it work?
12:13dnolenambrosebs: I haven't tried myself but I've heard in the past that there are issues
12:14dnolenambrosebs: if CLJS was AOTable I think it would cut down times for one time compiles and the first compile.
12:14dnolenwhen auto building.
12:15wkellyjaley: application/edn seems to be in the proper rfc1341 spirit
12:15ambrosebsdnolen: yes. Hard to predict AOT problems, so hopefully someone's tried it.
12:16jaleywkelly: cool, thanks!
12:26gfredericksmaybe clojurebot should forget everything it knows that starts with "forget"
12:36jjttjj I'm trying to build an executable jar from a clojure program. I have a -main fn that set up and is working correctly when i do lein run, and I have a (:gen-class :main true) line in the ns declaration of that file, but i'm getting an error in ubuntu saying it's not marked as executable when i try to run it. Anything i might be missing?
12:37rlbjjttjj: how are you trying to run it?
12:38jjttjjright click jar, open with OpenJDK Java6 runtime
12:38nDuffjjttjj: Does it have the executable (+x) file permission?
12:38rlbnDuff: hmm, does it need them if it's being run via java?
12:39rlbjjttjj: what happens if you just do "java -jar foo.jar" from the command line?
12:39nDuffrlb: Depends on how Ubuntu implements its GUI.
12:39rlb(assuming it's a jar)
12:39nDuffrlb: ...but "not marked as executable" is how I'd read that error as a user.
12:39rlb(assuming it's a jar you can execute via -jar)
12:40rlbnDuff: I'm just not sure why the jar being executable would matter since it has to be run via java? (unless they're trying to run it via kernel exec signatures...)
12:40nDuffrlb: ...some Linux distros use binfmt_misc to execute jars that are +x, but if it isn't set up for java -jar, that won't work even with the executable permission set.
12:41rlbnDuff: ahh, exactly...
12:41rlbok.
12:41rlbjjttjj: anyway, I'd try making sure you can run it from the command line first.
12:42jjttjjrlb: chmoding +x causing it to fail silently, running from command line causing a NoClassDefFoundError: my/mainns exception
12:43dnolen_hmm
12:43rlbjjttjj: well, if you haven't created an uberjar, then you'll need to handle classpath issues.
12:43rlbi.e. "lein uberjar"
12:44gdevI got the same issue as jjttjj when I did an uberjar of my project
12:44rlbbut, the uberjar may be bigger than you want (if you want to rely on any shared /usr/share/java jars...
12:44jjttjjrlb: yeah I've made an uberjar
12:45gdevcalling lein run gives the same error, exception in thread main, java.lang.classnotfoundexception in myproject.core
12:46rlbwell, if lein run doesn't work, the uberjar's not likely to either
12:46rlbafaik
12:47gdevrlb:) yea, doing java -jar <mysatandalone.jar> gives an error: could not find or load main class
12:47gdevalso, it changed the dash in my namespace to an underscore, is that normal?
12:47jjttjjgdev: yes that's normal
12:48jjttjjgdev: the filenames should have undescores instead of dashes (the namespaces should have dashes instead)
12:49gdevjjttjj:) thanks, it was just weird because that's what my namespace was at first until i caught it and changed it; so seeing that again freaked me out
12:52arcatani don't know if scope if the right word for this.. but what's the scope of protocol extensions?
12:52arcatanif i extend a protocol for some type in namespace a, when can namespace b see it?
12:54gfredericksafter the code runs
12:54gfredericksit's a side-effecty thing
12:54gfredericksso once namespace a is loaded you should be good
12:54arcatanokay, thanks
12:54gfredericksor if you're talking about scope rather than time, then the answer is "globally"
12:55arcatanyeah
12:55gfredericksI'm starting to feel like protocols and multimethods are insufficient for library customization purposes :/
12:56gfredericksI keep wanting to use binding to temporarily extend something
12:57arcatanif two namespaces extend the same protocol for the same type, i guess the namespace that is loaded last wins?
12:57gfredericksyep
12:57dnolen_stuartsierra: hmm, does data.json AOT?
13:01jjttjjdo all my namespaces need to be AOT compiled to use as an executable?
13:01technomancyjjttjj: you don't have to do any AOT compilation if you can use clojure.main's -m option
13:02stuartsierradnolen_: you mean, is it possible to AOT it?
13:02dnolen_stuartsierra: yes
13:02stuartsierraI don't see why not.
13:02dnolen_stuartsierra: when I try to (compile 'clojure.data.json) I get a ClassNotFoundException JSONWriter
13:03stuartsierradnolen_: Do you have a clean 'classes' dir?
13:03gfrederickstechnomancy: thanks for that reminder. No more AOT for me.
13:04gfrederickswell. a tiny bit of acceptable AOT for me, rather.
13:04technomancythere is also lein-otf if you don't have control over your CLI args which might be the case in GUI situations
13:04dnolen_stuartsierra: yes I do, I'm looking into AOTing the CLJS compiler
13:05dnolen_stuartsierra: it would be nice to ship CLJS AOTed to avoid these startup time issues
13:05gfrederickstechnomancy: is there any reason to keep a :main around?
13:05stuartsierradnolen_: Make a ticket and I'll look into it.
13:05technomancygfredericks: elaborate plz?
13:05dnolen_stuartsierra: thx
13:07gfrederickstechnomancy: :main implies AOT, which I think I can disconfigure. I assume it also enables `lein run`. But the uberjar-main thing won't work w/o AOT; which is fine cause I don't need it, but was wondering if there's any reason really not to remove the :main option altogether
13:07technomancygfredericks: remove it from your own project.clj file or from Leiningen?
13:08gfredericksmy own, sorry
13:08gfredericksthose are definitely different questions :)
13:08technomancyyeah, the ":main implies AOT" thing is a bug. I tried to remove it from 2.0 but someone added it back without my noticing.
13:09dnolen_stuartsierra: is it difficult to setup build to produce a AOTed jar if these kinds of issues get ironed out?
13:09gfredericksthat's how you know you've made it
13:09technomancyif you're not using it then you should remove it I guess? =)
13:09stuartsierradnolen_: You mean, you want a release JAR in the Maven repository that has been AOT-compiled?
13:09gfrederickstechnomancy: I can't argue with that
13:11gfrederickshaha hooray for aliases
13:11dnolen_stuartsierra: yes
13:12stuartsierradnolen_: Easy enough to do. Not sure it's going to make that much of a difference in start-up time.
13:13dnolen_stuartsierra: it takes 3 seconds to compile CLJS
13:13dnolen_on my MacBook Air 11
13:13stuartsierradnolen_: Rich is also interested in speeding up the Clojure compiler.
13:15dnolen_stuartsierra: I think by caching a precompiled CLJS core lib + AOTing, I think we can dramatically decrease CLJS compile times.
13:16stuartsierraI won't argue with that.
13:18stuartsierradnolen_: The Maven builds for contrib libraries do AOT-compilation as a sanity check, so in theory there's no reason why it wouldn't work.
13:18dnolen_and above I really meant that (require '[cljs.closure :as cc]) takes 3 seconds, so that's a bit of a hit.
13:18dnolen_stuartsierra: OK cool
13:19krlin general when a lib pulled from lein complains about missing ava
13:19krl*Java classes
13:19gfrederickstechnomancy: was there a ^:skip-aot option for :main?
13:19krlwhat could be wrong?
13:20krllein deps finishes without problems
13:20technomancygfredericks: yes, I removed it when I removed :main-implies-aot, but I think I added it back in 2.1
13:20technomancykrl: usually a bug in the library
13:21krlit depends against clojure 1.3, so it could be breaking changes in the Java interaction stuff?
13:22arohnerwhen using clojure-test mode, I'm getting "namespace not found", when trying to run a single test
13:22arohnerbut run all tests (C-c ,) works just fine
13:22stuartsierradnolen_: In a fresh REPL with bare Clojure 1.5.1, (compile 'clojure.data.json) works for me.
13:23dnolen_stuartsierra: hmm, I'm also trying this with Clojure 1.5.1
13:24stuartsierradnolen_: Perhaps you have some other issue with stale .class files or the classpath.
13:24dnolen_stuartsierra: basically I bootstrap CLJS, creates the classes directly, script/repl, (compile 'clojure.data.json)
13:24dnolen_stuartsierra: no .class files that I'm aware of.
13:26noncomi now, i've been asking a similar question before, but... how do I just all jars from " jME3_2013-04-29.zip 29-Apr-2013 00:07 96M " at http://jmonkeyengine.com/nightly/ into my leiningen project without wasting a lot of time on pshing every single file to repository or stuff.. or how do I push them to my repo in 1 click/command?
13:27noncomi just want to use the java game engine in my project..
13:27stuartsierradnolen_: Is the `classes` directory on the classpath?
13:27stuartsierraClojureScript's script/repl doesn't set that.
13:27noncomwithout much irrelevant workings
13:28noncomplease help.. :)
13:28dnolen_stuartsierra: oh right, checking that
13:29dnolen_stuartsierra: works! I'll close that ticket
13:29stuartsierra:)
13:30dnolen_stuartsierra: thx
13:30stuartsierranp
13:30dnolen_sweet, CLJS appears to AOT just fine
13:36Glenjamincan anyone tell me what Reflection warning in `lein check` means?
13:36gfredericksGlenjamin: that the compiler can't tell what jvm types its dealing with and has to emit (slow) reflection code
13:36gfrederickspresumably you would consider adding type hints to fix the issue
13:37Glenjaminmakes sense, cheers
13:37Glenjaminwhat happens if i end up passing a different type than the hint?
13:38gfredericksa jvm cast error I believe
13:38gfredericksI think the only reason you'd be in that situation is if you're intentionally doing some kind of weird jvm duck-typing
13:40dnolen_stuartsierra: so if I want to AOT CLJS + add cached CLJS core lib to the jar, do I need to provide an Ant build.xml to do this?
13:41stuartsierradnolen_: No.
13:41dnolen_stuartsierra: so how should those steps be done?
13:42stuartsierradnolen_: The release build in hudson just runs script/build in the repo. You can do whatever you want there.
13:42dnolen_stuartsierra: oh, sweet
13:43stuartsierraHowever, I would recommend against releasing AOT-compiled code, at least for now, without some special signifier in the version string.
13:43stuartsierraClojure 1.4-1.5 is the first version change with documented binary compatibility.
13:43technomancystuartsierra: why not use a classifier?
13:43Glenjaminhrm, can't seem to get rid of the reflection warning for this: (.println ^Writer *err* ^String msg)
13:43stuartsierratechnomancy: A classifier is what I meant.
13:43technomancygotcha
13:43Glenjaminoh, nevermind - i see why
13:44stuartsierraCouldn't remember the term.
13:44technomancyI haven't done that myself but it seems like a good fit.
13:45stuartsierraBut I'm not sure there's much value in releasing a library JAR that is AOT-compiled. If you're invoking CLJS from within your app then you've already paid the start-up cost.
13:46stuartsierraIf you're invoking CLJS from the command-line, then you can build a local binary with AOT-compilation.
13:48dnolen_stuartsierra: I think a number of people don't invoke CLJS from their app
13:49stuartsierradnolen_: Then they're building CLJS locally, I assume?
13:49dnolen_stuartsierra: and it's not clear to me that a lot of people understand that you can build your AOTed CLJS. most people use lein cljsbuild - and startup time there is quite bad.
13:49stuartsierradnolen_: That seems like a problem for lein-cljsbuild to solve, then.
13:51dnolen_stuartsierra: hmm, true - like it could pull it's own AOTed jar?
13:51stuartsierradnolen_: Yes, or build it once and cache it locally.
13:52Jambatohttps://www.refheap.com/paste/14046 > does somebody know why the repl loops when next-player is called?
13:53amalloyJambato: nobody is going to read 118 lines of code to tell you why your program doesn't work
13:53Jambatofor example with (next-player [1 2 3 4]) the function should not enter the loop
13:54amalloytry finding a more minimal reproduction case
13:54Jambatoamalloy: I'm not expecting to do so
13:54dnolen_stuartsierra: hmm I suppose lein-cljsbuild could cache the precompiled core lib this way as well ...
13:54Jambato*expecting you
13:55Jambatoat worst just read the next-player function at the end of the file and call the function
13:55Jambatoif it bothers you that much
13:55Jambatoit is just that the last function I wrote doesn't behave the way I expected
13:56tcrayforddoes clojure GC strings?
13:56tcrayforduh
13:56tcrayfordstrings
13:56tcrayfordkeywords
13:56tcrayforddoes clojure GC keywords?
13:57llasramYes
13:57tcrayfordI ran this a bunch at a repl and it died eventually:
13:57tcrayford(doall (map (fn [_] (keyword (str (rand)))) (range 100000)))
13:57tcrayfordLike so
13:57stuartsierraClojure doesn't GC anything.
13:57tcrayfordException in thread "nREPL-worker-2" java.lang.OutOfMemoryError: PermGen space
13:57Ember-doall keeps the head
13:58Ember-try with (doseq [_ (map (fn [_] ....
13:58dnolen_tcrayford: keywords are interned into a WeakMap far as I know
13:58gfrederickstcrayford: permgen is for classes, no? keywords are all instances of one class
13:59stuartsierraClojure does interns the string names of keywords, which means they may get stored in the JVM's "Permanent Generation" heap, which gets garbage-collected far less often.
13:59Ember-GC can't collect anything which is held by reference and with doall you're keeping reference to the whole collection you're iterating through, no matter it's lazy originally
13:59stuartsierra,(identical? (name (keyword "foo")) (name (keyword "foo")))
13:59clojurebottrue
13:59tcrayfordstuartsierra: so the usual advice from other languages about not keywordizing arbitrary user data probably still holds, right?
13:59stuartsierratcrayford: correct
14:00justin_smithJambato: not the bug you mention, but fyi here is a simpler redef for player-represented: (fn [n s] (#{n} s))
14:00justin_smiththat will break if you decide a player should be represented by nil or false
14:00justin_smithbut otherwise is good
14:00tcrayfordstuartsierra: it's kinda wonderful that there is ring middleware that does this for compojure, along with a bunch of json parsers that do this by default (amongst other libs, those are just what I'm aware of)
14:01justin_smithJambato: n/m, I misread the code
14:01stuartsierraI've argued in the past that keywordization should not be a default.
14:01Jambatojustin_smith: I do not plan to implement a player as nil but thanks anyways
14:02justin_smithso I misread: (fn [n s] (#{s} n)) will do what player-represented? does in your code
14:02Jambatothe bug comes from the next-player funtion
14:02justin_smithyes, I know
14:02Jambatoeven when (all-players-represented?) evals to true, the reml hangs
14:02Jambato*repl
14:03gfrederickstcrayford: I use cheshire and a json middleware, neither of which do that by default
14:03technomancyI guess keywordization of params could open you up to a DOS slightly more easily, but it seems like a pretty low risk
14:04tcrayfordgfredricks: cheshire does if you pass "true" into the params :/
14:04winkanyone got a clue regarding mysql character sets and clojure.java.jdbc?
14:04gfrederickstcrayford: yes, that's about the opposite of "by default", no?
14:04technomancyheh
14:05tcrayfordgfredericks: except for libs that call cheshire with that without asking you ;)
14:05gfredericksdamn those libs
14:06gfrederickslet's switch the keyword impl to use ReallyWeakReferences
14:06tcrayford(I patched welle, which used to have this, but it still does pass true by default unless you override it)
14:06stuartsierratcrayford: data.json in the 0.2.x line does not create keywords by default.
14:06technomancykeywords as keys sounds like the right thing for a riak lib?
14:07Jambatojustin_smith: (fn [n s] (not (#{s} n))) rather
14:07tcrayfordtechnomancy: when you're deserializing json from values? It really depends what you're planning on storing (in my case some keys in json maps I store are user generated)
14:07Jambatogot to stop writing if true then true else false
14:07Jambato--'
14:08technomancytcrayford: oh yeah; I'm just thinking of top-level keys
14:09justin_smithJambato: with this def (defn player-represented? [n s] ((into #{} s) n)) I can make the true case come
14:09justin_smith* make that "I can trigger the true case" (I am englishing bad today)
14:13justin_smithJambato: also, it would have been helpful if you pasted only the code for next-player, all-players-represented, and player-represented? - the rest of the file is just noise as far as this problem is concerned
14:14tieTYT2man, clojure.typed seems more complex than the java type system to me
14:14gfredericksit probably is
14:14tieTYT2I wish it could work like haskell
14:15antares_tcrawley: next Welle version will be 2.0 so we may use the opportunity and change it
14:15justin_smithtieTYT: you mean Hindley-Milner?
14:15antares_oops
14:15tieTYT2justin_smith: I probably do, I'm not sure though
14:15technomancyjustin_smith: if only =(
14:15antares_tcrayford: ^^^
14:15tcrawleyantares_: glad to hear it :)
14:15tieTYT2I mean type inference where I define the type separate from the impl
14:15justin_smithyeah, Hindley-Milner is how Haskell does that
14:16antares_tcrayford: I just need to write a blog post to see how many people freak out by other breaking changes it will have :)
14:17Jambatojustin_smith: found it : ((comp not nil?) ((into #{} s) n))
14:17justin_smithwhy comp not nil? nil is already false
14:18justin_smithand everything else is already true
14:18metellus(except false0
14:18metellus)
14:18justin_smithyes :)
14:18justin_smiththat is why I asked him above if any player would ever be represented by false or nil
14:19Jambatojustin_smith: nil? evals to false when a player isn't represented in a pile
14:19Jambatoerr wait a sec
14:22Jambatoah yes there it is
14:22justin_smith(into #{} s) acts as a function returning nil if none of its members are in the argument
14:22justin_smithnil acts as false
14:23Jambatojustin_smith: without the not the function evals to false if a player is represented in a pile
14:23Jambatoand true if he isn't
14:23Jambatoit's reversed
14:23justin_smithI mean why test for nil
14:23justin_smithnil is already false
14:23justin_smithso drop the not and the nil? and you get the same logic
14:24justin_smiththe reason I argue for that is because the less your code does, the fewer places bugs can hide
14:24justin_smithso if you can remove two function calls and get the same result...
14:25Jambatowhat's the point of testing nil if it's false then?
14:25Jambatowhy does nil? exist then?
14:26justin_smithbecause sometimes you specifically want to test for nil, separate from false
14:26antares_Jambato: what if you need to tell between nil and false?
14:26Jambatohm ok
14:27justin_smith(:apple {:apple false :orange true})
14:27justin_smithin this case, :apple not being in the map may be different from apple being in that map and false, two different actions called for
14:28justin_smithwhich is why I asked if false would ever be a valid player
14:28justin_smithnil? makes sense there if a player may be false, otherwise it is just needless complication
14:28Jambatono nil or any bool won't be a player
14:29Jambato*no,
14:31Jambatoso I don't need nil?
14:31JambatoI got it
14:31Jambatothanks justin_smith
14:31justin_smithnp, sorry to be such a pedant about it
14:36justin_smithJambato: another way to do all-players-represented: (defn all-players-represented? [s] (let [s-set (into #{} s)] (-> #{1 2 3 4} (set/difference s-set) empty?)))
14:37Jambatojustin_smith: that's fine really
14:37justin_smiththe advantage: instead of having to add a clause to and if you have more players, you can just add to the set
14:37justin_smithor make the set another arg if the player list were dynamic
14:38noidiyou can do (set s) instead of (into #{} s)
14:38justin_smithtrue, that would probably be better
14:38justin_smithin that case
14:38noidiso you can get rid fo the let and use (set s) instead of s-set
14:38noidi*of
14:38justin_smithgood point!
14:40Jambatook all done
14:40Jambatothanks for the help but I got to go, I'll be back later
15:23gfredericksI'm pretty habitually putting a docstring in my deftest, which is presumably ignored
15:25Glenjamingfredericks: http://richhickey.github.io/clojure/clojure.test-api.html mentions a (testing) form, which might be relevant
15:25amalloygfredericks: i don't think it's a docstring, so much as a string evaluated for side effects while testing
15:31antares_Elastisch 1.1.0-rc1 is out: http://blog.clojurewerkz.org/blog/2013/04/29/elastisch-1-dot-1-0-rc1-is-released/
15:32gfredericksamalloy: it's a docstring to _me_
15:32gfredericksGlenjamin: yeah, I avoid that due to the extra nesting
15:33Glenjaminyou could do (defmacro defdoctest [desc & body] `(deftest (testing desc ~@body)))
15:41rlbwhat's the relationship if any between clojure.data.zip and clojure.zip?
15:45Glenjamindata.zip provides more functions for zipping around structures produced by zip
15:45Glenjamini think
15:50rlbGlenjamin: ok, right, thanks
15:58weavejesterOh wow, some of the clojure.core.cache functions are really, really slow
15:59amalloyweavejester: they do reflection
16:00amalloya great property for performance-improving code
16:00weavejesterA basic fifo cache is 100xto 150x slower than clojure.core/memoize
16:00weavejesterNo wait, I'm reading that wrong.
16:01weavejester1000x
16:01gfredericksphew
16:01gfredericksthat 5 went down to a 0
16:03pl6306How do I get this to return Integers instead of long (iterate inc 0)?
16:03Glenjaminoh wow, that sounds slow :o
16:03weavejesterOh, that's odd… the performance has changed again. Maybe there's something in the cache that causes it to get slower over time. I reset back to memo-fifo and it seems to be reasonable performance again.
16:03weavejesterI have had this REPL open a while.
16:04gfredericks,(->> 0 (iterate inc) (map int) (map type) (take 5))
16:04clojurebot(java.lang.Integer java.lang.Integer java.lang.Integer java.lang.Integer java.lang.Integer)
16:05weavejesterHuh, yeah, somehow the performance problems cleared themselves when I changed memoize caches and re-evaluated.
16:05weavejesterSomething must have been getting slower over time. I'll need to keep an eye on that and see if it happens again.
16:22justin_smithweavejester: hash collisions in a map?
16:22justin_smithjust a theory
16:25weavejesterjustin_smith: Well, it's a fifo queue of length 1, so in theory the map just contains one item.
16:25justin_smithoh, that probably rules that out then
16:25weavejesterYep :)
16:26justin_smithmaybe there is a function that could theoretically still access old fifo elements, preventing proper gc?
16:26weavejesterMaaaybe? I think I'll need to see if it happens again, and then run a few tests.
16:27justin_smithyeah, having the jvm trace memory allocation / gc will likely be informative, that is the most likely slowdown in a fixed length fifo
16:29weavejesterThere seem to be a few issues with the memoize library when used aggressively. memo-ttl has a race condition that causes a NPE under rare circumstances, for instance.
16:30weavejesterOverall it's pretty good though
16:39mthvedti'm profiling code, and there's a class in my stack traces that i don't know where it came from.
16:39mthvedtonly thing i can think of is if loop/recur created anonymous fns… does it?
16:40hiredmanif you nest a loop/recur in a loop/recur it (sometimes?) hoists the inner loop/recur in to a fn
16:40shriphaniclojure users. what is the best way to do string interpolation? Is that the wrong way of doing things ?
16:41mthvedthiredman: thanks, that's probably what is happening
16:41nDuffshriphani: http://clojuredocs.org/clojure_core/clojure.core/format
16:41nDuffshriphani: If you want a judgment about "right way" / "wrong way", though, you'll need to describe your use case.
16:43shriphaninDuff, I have a url where I need to keep updating exactly 1 parameter.
16:43justin_smithdepending on what you are doing, there are also things like moustache
16:43SegFaultAXshriphani: There is also the simple version of ##(let [a "foo" b "bar"] (str "Hello " a ", how are you? -" b))
16:43lazybot⇒ "Hello foo, how are you? -bar"
16:43justin_smithok, yeah, you don't need a templating utility like moustache for creating a URL
16:44SegFaultAXshriphani: There are libraries specifically suited to working with URIs.
16:45SegFaultAXshriphani: For example, https://github.com/cemerick/url
16:45shriphaniSegFaultAX, it is just 1 parameter so I didn't bother.
16:46SegFaultAXshriphani: Depending on the complexity of the URL, it might just be worth it.
16:48pl6306How would I get map to return  ((1 a 4) (2 b 5) (3 c nil) for (map list  [1 2 3] '(a b c) '(4 5))?
16:49gdevI have a lazy seq of persistentArrayMaps. I need to modify values in those maps. I'm just defining a new vairiable and storing the output of a doseq in it but I'm not exactly sure how to do it
16:51gdevugh, nevermind, I'll pastebin it in a second; keep forgetting that's easier than trying to write out explanations
16:53SegFaultAX,(list* (map vector [1 2 3] '(a b c) '(45)))
16:53clojurebot([1 a 45])
16:54SegFaultAX,(list* (map vector [1 2 3] '(a b c) '(4 5)))
16:54clojurebot([1 a 4] [2 b 5])
16:54SegFaultAXOh a lists of lists
16:54SegFaultAXDuh
16:55SegFaultAX,(map #(list* % ()) [1 2 3] '(a b c) '(4 5))
16:55clojurebot#<ArityException clojure.lang.ArityException: Wrong number of args (3) passed to: sandbox$eval104$fn>
16:59gdevhttp://pastebin.com/GhAWZ4K9
17:00arrdem~pastebin
17:00clojurebotNo entiendo
17:00arrdemgdev: clojurebot's failure asside, please use refheap over pastebin.
17:01SegFaultAXI'm drawing a blank, does something like (fn [& more] more) already exist?
17:01S11001001gdev: doseq doesn't have any results
17:02technomancySegFaultAX: clojure.core/list maybe?
17:02S11001001gdev: so mutated-sample will always be nil
17:02S11001001gdev: use map instead
17:04gdevS11001001:) thanks, yeah, the doseq is incomplete, I'm thinking that the same way that the database call was creating an sql string, it could just create the updated map
17:04gdevarrdem:) is there a reason for the preference?
17:05S11001001gdev: Billions of ads/dogfooding. And not everyone does/can run adblock.
17:05amalloy~nduff
17:05clojurebotPlease don't use pastebin.com: there are lots of annoying animated ads. Instead, try http://refheap.com, an ad-free pastebin written in Clojure.
17:05S11001001amalloy: nice
17:05SegFaultAXtechnomancy: Huh, that's what I thought too. But when I ran pl6306's code above it failed.
17:05amalloyi hope he doesn't mind that i used his nickname for that
17:05SegFaultAXI think it's actually because he has some weird hidden characters in there.
17:05gdevgotchat, yeah I forget how many annoyances adblock shields me from
17:06nDuffThat's another issue with pastebin.com -- it does character set conversion, even in the "raw" view, so if you've got bugs on the remote end caused by odd characters, there's often no way of knowing it.
17:07gdevvows to never use pastebin again
17:07arrdem~refheap
17:07clojurebotrefheap is gist.github.com
17:08rasmustoI'm trying to deleting files with (doall (map #(delete-file % true) list-of-filename-strings)), any potential problems with that?
17:08gdevfor some reason gist was not working for me at all the other day
17:08arrdemrasmusto: just doseq over the file list
17:08arrdemrasmusto: no reason to use a lazy seq and force it to evaluate
17:08SegFaultAXWhy is ~refheap linked to gist? :)
17:08justin_smithrasmusto: if you don't deref the results of the map, the deletes may not happen
17:09arrdemSegFaultAX: THIS IS YOUR DOING
17:09justin_smithn/m
17:09arrdemjustin_smith: no the doall should force it to evaluate...
17:09rasmustoarrdem: ok, justin_smith: that's what the doall does, right?
17:09nDuffjustin_smith: Eh? I'd expect the doall to do that, thus the need for doseq to be principally a readability thing.
17:09justin_smithsorry, let me say again, n/m
17:09justin_smithI missed the doall, my bad
17:09nDuff...but for readability reasons, I'd strongly prefer (doseq [filename list-of-filename-strings] (delete-file filename true))
17:09arrdem^ that
17:10amalloySegFaultAX: refheap is paste, paste is gist.github.com
17:10arrdem,(doc do*)
17:10clojurebotCool story bro.
17:10rasmusto*maybedo*
17:10arrdem... okay someone enlighten me
17:11justin_smithI think do* is meant to be a placeholder for doseq, doall, dosync, and then a bunch of not yet existing strict functions that start with do
17:12rlbis there anything idomatic like (remove #{"x" "y" "z} strs), but for regular expressions as the predicate set?
17:12rlb(via re-find)
17:13technomancyrlb: no, but not for good reasons
17:13technomancythis is a common rant topic for me; watch out
17:13rlbtechnomancy: ok
17:13gdevhere is the ref-heap https://www.refheap.com/paste/14052 which has the database version, the datastructure and what I'm trying to do
17:13rlbI'll bite...why am I bad? ;>
17:14technomancyrlb: no, I mean what you want is completely reasonable, and the reasons Clojure doesn't support it are silly
17:14arrdemrlb: it isn't you, I think technomancy is saying that core is being retarded
17:14rlboh, ok.
17:14technomancy(remove #"hello" list-of-strings) should work, but it doesn't, because of reasons
17:14technomancybut in this case you can just do (partial #"hello")
17:14technomancysorry
17:15technomancy(partial re-find #"hello")
17:15weavejesterIsn't the official reason because Patterns are final?
17:15arrdem,(fn? #"\w+")
17:15clojurebotfalse
17:15rlbtechnomancy: ahh, right I had just tried that here, i.e. (#"a" "a").
17:15arrdemokay that's idiotic.
17:15amalloytechnomancy: he's actually asking for (remove (in-regex-list #"hello" #"goodbye") list-of-strings), which wouldn't come automatically from making regexes functions
17:15technomancyweavejester: the official reason is because Rich doesn't want to create a new regex class for "interoperability reasons"
17:15technomancywhich no one has ever wanted
17:16weavejesterHum...
17:16rlbok, thanks -- I suppose it's not that hard to handle -- just wanted to make sure I wasn't missing something obvious.
17:16weavejesterAdmittedly I haven't see many Java methods in third-party libs that take a Pattern as an argument
17:17technomancyI guess you could do it in userspace these days with reader literals
17:17technomancy#reg.ex"hello" or something
17:17technomancy=\
17:17justin_smithreader macros seem underexploited in general
17:18SegFaultAXBut it does make regex feel second class in this case. They don't have quite the same flexibility as most of the other built in data structures.
17:18technomancymeh
17:18technomancySegFaultAX: rich says he doesn't use them, which could explain that =)
17:18gfredericksI want a spec for a pure edn-manipulation subset of clojure to be used as an embedded language
17:18weavejesterRegexs are second class, in the sense that they're Java classes rather than Clojure ones.
17:18gfredericksfirst application, a quasi-port of jq to edn
17:18SegFaultAXtechnomancy: Does he have to be a direct user of every feature for it to get into core?
17:19SegFaultAXweavejester: I think that's precisely technomancy's gripe, though.
17:19technomancySegFaultAX: not going to go there, sorry =)
17:19arrdemlol
17:19SegFaultAXtechnomancy: Haha.
17:20weavejesterSegFaultAX: Right. I'm just saying that it's not just that regexs *feel* like 2nd class, they *are* second class :)
17:20SegFaultAXweavejester: Oh, sure. Definitely.
17:20technomancygfredericks: in your stand-up comic routines?
17:20gfrederickstechnomancy: totes
17:20weavejester#uuid and #inst are good additions, but #url or #uri would be pretty useful as well.
17:20technomancy#uuid is boggling
17:21gfredericksboggling?
17:21SegFaultAXBut that's weird, considering we have special syntax to instantiate regexes, you'd think they could be better supported by the language.
17:21technomancyI just cannot understand it outside the context of "so you're wondering what kind of things you can use reader literals for? let me show you..."
17:21gfrederickstechnomancy: are you not a fan of reader literals in general?
17:22technomancygfredericks: I'm -0 on them
17:22SegFaultAXtechnomancy: At least we have a canonical example for when we're trying to describe the utility of reader tags.
17:22technomancygfredericks: having #inst return java.util.Date has prejudiced me against them. apart from returning mutable objects I don't have any concrete objections against them, but neither do I have any actual use for them.
17:23weavejesterI guess Rich prefers UUIDs over URLs in general, at least last time we sopoke he did.
17:23arrdemweavejester: shame that the entire internet is built on URLs then
17:23technomancyweavejester: the advantage of UUIDs is that they have an immutable implementation out of the box on the JDK
17:23weavejestertechnomancy: You can override that behaviour, but it's more difficult than it should be.
17:23technomancyURIs don't, but neither do Dates arguhoaeusrcg,ap
17:24gfredericks(def when-technomancy-wandered-off (Date.))
17:24arrdemgfredericks: that's just mean
17:24technomancy(doto *1 (.setMonth 10))
17:24technomancysorry; @*1
17:24weavejesterarrdem: Yes, although URLs are also mutable, or at least their data is :)
17:24technomancyand I meant 12
17:24SegFaultAXHaha
17:24technomancybecause that makes Dates asplode in hilarious ways
17:24gfrederickstechnomancy: ew, look what you've done to my object
17:24technomancygfredericks: serves you right
17:25SegFaultAXAre mutable dates fixed in Java 8? I seem to recall hearing that they're fixing date, but is that one of the changes?
17:25technomancySegFaultAX: they're introducing a new class that would re-obsolete Date
17:25technomancyfixing Date is off the table
17:25SegFaultAXAre they officially deprecating date?
17:26gfrederickshas it not been?
17:26arkxHeh, what would that deprecation mean?
17:26technomancyit's been deprecated like 2 or 3 times over?
17:26gfredericksarkx: "don't use it"
17:26technomancyyou're supposed to use Calendar, which is slightly less horrbile
17:26technomancybut even that has been replaced IIRC?
17:26rlbI thought you were supposed to use jodatime...
17:26technomancyrlb: FSVO "you" =)
17:26gfredericksrlb: depends on who's supposing
17:27weavejester#inst by default resolves to java.util.Date, which I guess is the complaint :)
17:27gfredericksweavejester: kind of a complaint against how it was implemented than the basic design though
17:27arkxgfredericks: hasn't most of java.util.Date already been deprecated? Hasn't slowed anyone down in the Java world afaict :)
17:27technomancyweavejester: yes, it would be much better if #inst threw an exception until you rebound it in data_readers
17:27technomancyI tried to talk rich out of it but failed =(
17:27gfredericksarkx: rich convinced me deprecation without removal is a meaningful thing to do
17:28technomancyhe didn't want to wait for 8
17:28SegFaultAXDoesn't @Deprecated generate warnings if you use the deprecated thingy?
17:28technomancygfredericks: not that meaningful if new languages with no legacy excuses ignore the deprecation =(
17:28arkxI don't believe in that, at least when the great masses are considered. Gah, sounding elitist, but seriously. :(
17:29gfredericksrun, it's the hoi polloi!
17:30arkxPHP is another language with tons of deprecated but not removed stuff. Yuck.
17:30gfredericksmanaging a language is a stinking pile of tradeoffs
17:30gfredericksI don't want to do it
17:31SegFaultAXWell in the case of Java we can throw warnings if you're using something that has been deprecated. If you continue to use it, that's your problem. But at least you KNOW you're purposefully doing something naughty.
17:31dcbI'm having trouble getting leiningen to include all of the aot'd .class files in the jar, it only includes one or two of the classes most of the time, Anyone have any ideas? Its for a library to be called from another java application
17:36technomancydcb: does `lein compile` place them in `target/classes`?
17:37dcbtechnomancy: No, just the class files that are included in the jar. It is weird, sometimes I can get it to compile everything and jar it all up, but it is not consistent. Most of the time it only compiles a subset of the classes.
17:38rasmustodoes "while" act like a doseq in terms of producing side-effects?
17:39SegFaultAXrasmusto: while just wraps a normal loop in a when.
17:40dcbtechnomancy: it seems to always compile a file that has a defrecord in it, but I have other files with gen-class and deftype that do not consistently compile. I have :aot :all in the project.clj
17:40rasmustoSegFaultAX: okay, thanks
17:41technomancydcb: if you can create a repro case please open an issue
17:41technomancydoesn't ring any bells though
17:41dcbtechnomancy: ok I'll see what I can do, thanks
17:53dcbtechnomancy: tracked it down to a circular dependency between the clojure and java application, the compile target would change depending on the state of the installed dependency. Thanks for the help
17:54technomancytricky
18:13seangrove$lastseen aphyr
18:15justin_smithany clue why lein would be creating an osx APP instance for my process? or more to the point how to make that not happen? I assume some dep causes it to happen, because it only gets spawned by our webapp framework
18:16Raynesjustin_smith: Are you running it with `lein ring`?
18:16justin_smithby "osx app instance" I mean it is creating an icon on the task bar and making "clojure.main" an app you can switch to
18:16justin_smithyeah
18:16justin_smithlein ring server-headless
18:16Raynesjustin_smith: That's why.
18:16hiredmanjustin_smith: yeah, if anything init's the swing gui subsystem using the osx java that happens
18:16RaynesWhat he just said.
18:16hiredmanjustin_smith: there is a headless option you can pass
18:16justin_smithyeah I use lein ring server-headless
18:16Raynes`lein ring` does this so that it can open a browser window.
18:16hiredman-Djava.awt.headless=true
18:17RaynesNo, he means java.awt.headless
18:17justin_smithahh
18:17justin_smithcool! thanks
18:17justin_smiththat is so annoying when it does that
18:17hiredmanyep
18:17hiredmanI dunno why you would ever want lein ring to popup a browser
18:17RaynesMe either. I hate that it is the default.
18:17Raynesweavejester: Make it the damned not default already,.
18:17technomancysrsly
18:18technomancywell, I never use lein-ring, so don't listen to me
18:18RaynesPlease listen to technomancy.
18:19technomancyRaynes: which time though
18:19RaynesI do use lein ring, and I lose a small bit of my soul every time I type `server-headless`
18:19RaynesThe first time.
18:19weavejesterRaynes: You can add :open-browser? false in your project.clj or profiles.clj
18:20RaynesBah, you rebel non-conformist.
18:20justin_smithgood to know, thanks!
18:20weavejesterRaynes: I've also been meaning to change it to "lein ring server :headless", for more consistency
18:20gf3You would
18:20RaynesMeet me outside at once for a duel.
18:20hiredmanyou should make headless the default
18:20hiredman"lein ring server :con-cabasa"
18:21RaynesYou may choose one weapon, but no firearms or projectile devices.
18:21weavejesterI guess I could make :open-browser? default to false
18:21technomancy:aliases {"ring" ["update-in" ":ring" "assoc" ":open-browser?" "false" "--"]}
18:21pl6306How do I keep the trailing empty strings in (split "A|B|C||||" #"\|")?
18:21pl6306Thanks
18:21weavejesterBut if you guys feel strongly about it, there is a global ~/.lein/profiles
18:22weavejestertechnomancy: There's an update-in command?
18:22technomancyweavejester: new in 2.1
18:22hiredmancabeza I guess
18:22Raynesweavejester: Could you also make it so that if it isn't opening a browser window it doesn't pull in the stuff that causes the app icon to pop up?
18:22technomancyit's slightly indulgent
18:22pl6306I..e how do I get an output of ["A" "B" "C" "" "" "" ""]
18:22RaynesJust conditionally require it, i gues?
18:22RaynesI guess*
18:22weavejesterRaynes: Hum, I thought it was...
18:23Raynesjustin_smith's problem seems to indicate otherwise. I can test myself.
18:23justin_smithmaybe I am using an out of date version
18:23Raynesweavejester: Oh, I guess you're right.
18:23Raynes$latest lein-ring
18:24lazybot[lein-ring "0.8.5"] -- https://clojars.org/lein-ring
18:24weavejesterRaynes: No, looks like it's not
18:24RaynesI'm using 0.8.2, justin_smith. What are you on?
18:24weavejesterOr is
18:24weavejesterhttps://github.com/weavejester/ring-server/blob/master/src/ring/server/standalone.clj
18:24weavejesterI mean, it requires it regardless. It probably shouldn't do that.
18:24justin_smithwe have a big dependency hell where changing versions of things is messy, let me check
18:24weavejesterChanging the version of plugins shouldn't make things messy...
18:25justin_smithI'll update to the latest lein ring in my profiles.clj anyway, can't hurt
18:25justin_smithyeah, forgot this was a plugin thing (oops!)
18:25weavejesterlein-ring works best as a per-project plugin, rather than as a global plugin
18:26justin_smithI'll look into doing it that way
18:28justin_smith0.8.5 creates a clojure.main osx app (that steals the UI focus without creating a window) even when server-headless is provided as an argument
18:28weavejesterThat might be because it requires clojure.java.browse regardless
18:28weavejesterPatches welcome
18:28technomancyis that specific to Apple's JDK or does OpenJDK do it on OS X too?
18:28justin_smithhmm
18:30justin_smithI'll make a note to install openjdk and check it out, alongside the possibility of submitting a patch to fix the issue
18:30justin_smithit is more an annoyance than a bug anyway
18:30hiredmanit is really annoying
18:31hiredmanit steals focus and everything
18:32justin_smithfor a while we were using lein-sub for a cms and api, so running an app meant three separate clojure.main apps got created, lol
18:44shriphaniHi. I have a tiny piece of code like this that uses recursion. What would be the clojure way of doing it? https://www.refheap.com/paste/14053
18:52nDuffshriphani: Looks like tail recursion, so you could use loop/recur to avoid consuming stack space. If you wanted to be more Clojure-y, one might think about making your functions map over lazy sequences... though the Thread/sleep (as a side effect) is a bit of a complicating factor.
18:52Raynesshriphani: https://www.refheap.com/paste/14055
18:53Raynesshriphani: Changes are you should be using doseq for this.
18:53RaynesTake a look at it.
18:54shriphaniRaynes, so the http call will return a seq ?
18:55justin_smithRaynes: recur works like that without a loop?
18:55gf3justin_smith: Yes, rebinds the function
18:55justin_smithcool, I had no idea
18:57shriphanigf3 what do you mean by rebind? I don't quite follow how it manages to loop without consuming stack and tail-call optimization. Am I missing something here ?
18:59tomojthat aset with more than one arg applies is sort of mind-boggling
18:59RaynesHe means nothing.
18:59tomojmore than one idx I mean
18:59justin_smithshriphani: I think he means that without a loop recurs as an optimized tail call ot the same function
18:59RaynesIf you put a recur in the tail position it just translates it into a loop under the hood.
19:00RaynesThus avoiding consuming the stack.
19:01justin_smithloop, optimized tail call, tomäto, tomâto
19:01gtrak... how.. would I walk two trees in parallel? Alternatively, how could I record paths in a tree during a walk?
19:08hfaafbcan I get some tips on my clojure code? question in comments https://www.refheap.com/paste/14056
19:08gtrakapply vector = vec
19:08gf3Raynes: R U SURE
19:08gf3Raynes: According to the docs it rebinds the whole function
19:09Raynesgf3: Write my LA Clojure meetup talk for me.
19:09gf3Raynes: I already have it done
19:09gtrakhfaafb: looks amenable to a 'for' comprehension
19:09Raynesgf3: Email it to me plz.
19:09gf3Raynes: UGHHH
19:10hfaafbthanks gtrak, i'll try that
19:11justin_smithalso map already means 2 things in clojure, so naming something x-map that is neither of those 2 may be less than ideal
19:12justin_smithif mailbox-map is absolutely the one normal thing to call the vector, disregard
19:13hfaafbthanks justin_smith, didn't even think about naming, i'll think of something better
19:14gf3Raynes: Turns out I don't have your email
19:14gtrakhfaafb: (partition 8 (for [x (range 8) y (range 8) :let [z (+ x (* 8 y))]] z))
19:14gtrak((0 8 16 24 32 40 48 56) (1 9 17 25 33 41 49 57) (2 10 18 26 34 42 50 58) (3 11 19 27 35 43 51 59) (4 12 20 28 36 44 52 60) (5 13 21 29 37 45 53 61) (6 14 22 30 38 46 54 62) (7 15 23 31 39 47 55 63))
19:15gtrakit's just rotated :-)
19:15Raynesgf3: It's gf3sendsfakepresentations@raynes.me
19:16gtrakhfaafb: doh, ignore that... silly me. I looked at your code again.
19:16hfaafb:D
19:17Raynesgf3: This is perfect. I'll definitely use this.
19:17gf3Raynes: Took me a couple nights to get the wording right
19:19pl6306I have string that I want to use regex to find that a line starts with an exact literal for example given string "abc=66\ndef=25\nhij=99" how do I find the line that starts with "ABC" and the one that starts with "def"?
19:22gtrakhfaafb: here's a start i think: https://gist.github.com/gtrak/5485591
19:26hfaafbgtrak: thanks a lot, the cons/conj part was the real pain point, that makes a lot more sense
19:27brehaut,(map #(re-find % "abc=66\ndef=25\nhij=99") [#"(?i)(\n|^)ABC" #"(?i)(^|\n)def"]) ;; pl6306, its a bit sloppy but it works. im sure theres probably flags thing you could use, or alternatively split the string first but whatevs
19:27clojurebot(["abc" ""] ["\ndef" "\n"])
19:27seangroveIn emacs I've done nrepl-jack-in, and nrepl appears to start (*nrepl-server* buffer looks good), but the *nrepl* buffer itself is completely blank
19:28pl6306wow I there might have been simplier way. Thanks!
19:28gtrakhfaafb: maybe get rid of the flatten, and switch the following map to mapcat
19:28brehautthers probably a simpler way still
19:28justin_smithpl6306: if it always starts with a literal (defn match-prefix [s] (condp (fn [b a] (= (subs a 0 (min (count b) (count a))) b)) s "def" :a "ABC" :b :c))
19:29hfaafbgtrak: woah cool. i have much to learn about the stdlib ;_;
19:30gtrakfull of treasures
19:31brehaut,(for [line (.split "abc=66\ndef=25\nhij=99" "\n") pref ["abc" "def"] :when (-> line .toLowerCase (.startsWith pref))] line)
19:31clojurebot("abc=66" "def=25")
19:31brehautpl6306: ↑
19:32l1xhi guys, is there a way to shift/turncate an integer in clojure?
19:32brehaut,(apropos 'shift)
19:32clojurebot(bit-shift-left bit-shift-right)
19:33gtrakhfaafb: can do one better/worse :-) https://gist.github.com/gtrak/5485628
19:36hfaafbgtrak++ go back to work now :P
19:46amalloyyou can do it rather more nicely without the filthy flatten and #(do ...), gtrak, hfaafb: https://www.refheap.com/paste/ad314fe5ce4338d9da6b351ff
19:48djwonkAny tips on this? http://stackoverflow.com/questions/16289991/outofmemoryerror-when-parsing-xml-in-clojure-with-data-zip
19:53amalloydjwonk: the entire <mediawiki> tag is read into memory at once in xml/parse, long before you even call count
19:53djwonk@amalloy you sure it isn't lazy? that would the sane thing to do -- and that is what others have hinted at
19:54amalloyclojure.xml uses the ~lazy sax parser to produce an eager concrete collection
19:54amalloyyou say it would be the sane thing to do, but processing xml lazily requires a lot more work than you think - and it would be work *you* do, not some magic clojure.xml could do for you
19:55amalloyfeel free to disprove by calling (count (xml/parse data-whatever))
19:57djwonkok, thanks. I don't see any conceptual limitation with processing XML lazily with the data.zip interface
19:58djwonkmaybe processing XML lazily requires more work than I think, yes... but so much in Clojure just works, I wouldn't have put it past Clojure for it to work out of the box
20:01djwonkany tips on how to change it to handle larger files?
20:01SegFaultAXDoes clojure.xml use javax.xml.parsers.SAXParser?
20:02SegFaultAXBecause that's really good for large XML files.
20:04djwonk@SegFaultAX looking at the source, I see :import (javax.xml.parsers SAXParser SAXParserFactory)
20:05SegFaultAXThen I'm surprised you're running into issues unless your or Clojure is doing something lame. I've processed multi-gig XML files with that library.
20:05djwonkthat's why I don't see any fundamental reason why what I'm trying isn't sane
20:05SegFaultAXyou or Clojure
20:05djwonkright! amalloy above said "clojure.xml uses the ~lazy sax parser to produce an eager concrete collection"
20:06brehaut"…produce an eager concrete collection…"
20:06nDuffdjwonk: You have vars holding onto the heads.
20:06brehautfor emphasis
20:06amalloySegFaultAX: the point is that clojure.xml uses SAX to produce for you a collection that's easy to work with, and that has to be eager. if djwonk wants to use SAX himself, he can do so, and that will be as lazy as he wants, but it will be a lot more work
20:06amalloynDuff: true, but not really relevant
20:06nDuff...oh, no
20:06nDuffI misread.
20:08SegFaultAXWell if it's just ease of use, you can't get much easier than DOM.
20:09SegFaultAXAnd if it's using SAX to eagerly load the collection anyway, does SAX provide any benefit at all?
20:09brehautweeell, python has an interesting lazy-semi dom library called pulldom i think
20:09SegFaultAXbrehaut: Yea but lxml
20:09brehautyou tell it what nodes you are interested in and you get them as a lazy stream
20:09djwonkbrehaut: that sounds like what I want
20:10brehauti have no idea if there is a clj equiv atm
20:10SegFaultAXbrehaut: Woudln't it still have to process the entire document to extract the stuff you want, though?
20:10brehautSegFaultAX: nope; it produces a generator that
20:10brehautonly tries to find another sub node on demand
20:10SegFaultAXbrehaut: Cool!
20:11brehauttheres obviously cases where a large node will still let you swallow all your ram, but its a nice middleground
20:11SegFaultAXThat's why using SAX to incrementally process your XML is awesome, though. :)
20:11brehautits also one of the few libraries ive seen that makes processing XMPP/Jabber not completely crazypants
20:12brehautyeah, obviously if you hit one of those cases, you need something like sax
20:13djwonknice discussion here: http://stackoverflow.com/questions/9939844/huge-xml-in-clojure
20:13SegFaultAXdjwonk: That looks closer to what you're looking for!
20:15SegFaultAXAssuming you're doing read-only operations.
21:12Raynesgf3: What ever happened to your refheap stuff?
21:12RaynesYou get me all excited and then take it all away?
21:12RaynesWhat kind of monster are you?
21:19callenRaynes: what sorta stuff?
21:19callenRaynes: also you should convert Refheap to using Clabango. >:D
21:19Raynescallen: He was working on a redesign of sorts. Changing colors and such.
21:19callensounds awesome.
21:20gf3Raynes: Fucking work, man
21:20Raynescallen: Man, I can't do that until at least after I give my laser talk at the LA clojure meetup on the 9th.
21:20gf3Raynes: Crazy project past the deadline :(
21:20callenRaynes: did you convert it to Laser?
21:20Raynes"Hey, here is this really cool library I wrote called Laser that I don't actually use cause lolbad, but you totally shoul."
21:20Raynescallen: Yes, ages ago.
21:20RaynesI showed you in fact because you were curious IIRC.
21:22sw2wolfCan clojure be used to build a Window Manager as stumpwm built with Common Lisp ?
21:23RaynesProbably, sure, but hell if I know why you'd want to.
21:23sw2wolfThe stumpwm is great but seems not active now
21:23Rayneshttps://github.com/abrooks/prion This is ancient, but was the beginnings of such a project
21:24RaynesYou should look into xmonad though. It's configured with Haskell instead of Lisp, but it's really quite spectacular.
21:25sw2wolfRaynes: xmonad is great. but i misses swank similar thing
21:29aduxmonad++
21:31sw2wolfadu: what is xmonad++ ?
21:32adusw2wolf: it means I would like to show my respect for xmonad
21:32sw2wolfadu: would you like show me your xmonad.hs ?
21:33sw2wolfs/like/mind
21:33sw2wolfmy poor English :)
21:36adusw2wolf: I don't use xmonad now
21:38sesam123can i ask why arguments are not evaluated lazily when passed to functions .. in that case it could replace a macro?
21:41tomojsesam123: you're suggesting ((fn [x]) (println "hello")) should not print anything?
21:43callenRaynes: I figured but my memory is poor.
21:43callensw2wolf: I use Xmonad, it's great.
21:43callenstatically compiled native binaries ftfw.
21:43sesam123tomoj: I'm not suggesting anything
21:43callensw2wolf: github.com/bitemyapp/dotfiles/
21:44sesam123is it just for side effects?
21:45sw2wolfcallen: thanks
21:45tomojsesam123: not sure I have a good answer, but I think side effects definitely have something to do with it, and sympathy with the jvm
21:49xeqisesam123: lazy argument evaluation allows some macros to be functions, but not all
21:49tomojcurious how rich would answer that. if there were no implementation difficulties would pervasive laziness be appealing?
21:51tomojlack of type system to guarantee purity seems problematic?
21:52sesam123xeqi: do you have an example?
22:08xeqisesam123: it is possible to write a `my-if` as a function in a lazy arg language, but would require a macro in clojure.
22:08xeqibut something doing syntax changes, such as ->, requires more then lazy arguments
22:11tomojor take clojure.core/for vs monad notation? :)
22:11tomojhmm. s#:)#:/#
22:13shriphanihi. does the io library contain routines for writing to gzip files? I want to write a string to a gzip file.
22:16arohnershriphani: you'll probably need to go into java for that
22:16arohnerlook at http://docs.oracle.com/javase/1.5.0/docs/api/java/util/zip/GZIPOutputStream.html
22:17ekoontzquestion about lazy-cat… i know i can do e.g. (lazy-cat (range 1 5) (range 5 10))
22:18ekoontzbut how can i do (lazy-cat (range 1 n) (range n n2) … )
22:18ekoontzfor arbitrary arguments..i guess i am needing a macro or something
22:19ekoontzi want to "explode" a list e.g. (a b c) into (lazy-cat exploded-list)
22:19tomojshriphani: incidentally I have this lying around from earlier https://www.refheap.com/paste/ad21887e84351ca13e73936c7
22:19ekoontz..so that (lazy-cat a b c) is evaluated
22:20brehautsadly lazy-cat is a macro, not a fn so you cant just (apply lazy-cat a-lazy-seq) :(
22:21brehautits possible (apply mapcat identity a-lazy-seq) would work though
22:21ekoontzbrehaut: surely there's some way to turn "(foo '(a b c)" into "(foo a b c)"
22:21brehautwee, without apply
22:21brehauts/wee/err/
22:21brehautyes, apply
22:21ekoontzlet me try that..
22:21brehautbut it doesnt work on macros
22:22tomojisn't that apply concat?
22:22brehauthah yes it probably is
22:22ekoontztomoj but i want it lazy
22:22tomojI don't think that makes sense
22:22ekoontzconcat is not lazy afaik
22:22brehautconcat is lazy
22:22brehautbut lazy-cat doesnt evaluate its arguments until needed
22:22brehautwhich makes it more lazier
22:23brehauti think is the difference
22:23ekoontzyeah
22:23ekoontzthat makes sense
22:23tomojbut if you already have a seq of seqs to concat, the second kind of lazy doesn't make sense?
22:23ekoontztomoj: but the seqs are lazy
22:23brehauttomoj: that makes sense
22:24ekoontzthemself
22:24ekoontzthemselves
22:24brehautim with tomoj; concat should be fine
22:24ekoontzso (apply concat?)
22:24tomojunless you have a list of _expressions_ and you want `(lazy-cat ~@exprs)
22:25ekoontzok let me play with it a bit..thanks guys
22:26ekoontzok here's the thing i don't get about ~@
22:27ekoontzhttp://pastebin.com/4d8Cgq7m
22:28ekoontzwhy am i getting a ClassCastException
22:28brehautbecause 1 is not a function, it is an integer
22:28ekoontzah ok
22:28ekoontzbrehaut: but you see what i'm trying to do there..
22:28ekoontzhow can i do it
22:29brehaut,`(foo ~@'(1 2 3))
22:29clojurebot(sandbox/foo 1 2 3)
22:29brehaut`(foo ~@[1 2 3])
22:29ekoontzah thanks
22:29brehaut,`(foo ~@(list 1 2 3])
22:29clojurebot#<RuntimeException java.lang.RuntimeException: Unmatched delimiter: ]>
22:29brehautbah
22:29brehautanycase, many are the ways
22:29ekoontzthanks
22:29brehautbut you should never really need to be unquote splicing a literal list
22:30brehaut,(let [l (list 1 2 3)] `(foo ~@l))
22:30clojurebot(sandbox/foo 1 2 3)
22:30tomojhere's a silly example https://www.refheap.com/paste/79e55f5594776b5bbb8a33bd7
22:31ekoontzbrehaut, true, not a literal list but something like (eval `(foo ~@(range 0 3)))
22:31tomojwhen I said (lazy-cat ~@exprs) I wasn't suggesting that's what you want, though!
22:34lfranchihey guys :) i'm trying to encrypt (for fun) some data in clojure w/ aes ecb 128, using BouncyCastle jars. The issue is I can't get my clojure/bouncycastle code to interop with openssl---i can't decrypt data that is output by the other, no matter what I try
22:34lfranchiany crypto nerds around who can help? :)
22:34lfranchii can decrypt it with BC in clojure (and i can decrypt openssl with openssl), but not vice versa
22:40xeqiI've been disappointed by the lack of documentation for BC
22:40lfranchiyeah, i have not really found much on line
22:40lfranchi*online
22:40lfranchiaes-ecb-128 should be the same whether it's BC or openssl doing it...
22:41lfranchino salt, turned off padding, how can it be different :)
22:42lfranchiI'd be happy with a way to do calls to openssl from clojure/java, but that seems even more of a PITA
22:44murtaza52can anyone explain what does the lazy-seq macro do in plain english ?
22:44murtaza52this is from the doc - Takes a body of expressions that returns an ISeq or nil, and yields
22:44murtaza52 a Seqable object that will invoke the body only the first time seq
22:44murtaza52 is called, and will cache the result and return it on all subsequent
22:44murtaza52 seq calls. See also - realized?
22:48xeqiit takes a form that will return a seq, and only evaluates the form when it needs to
22:48xeqimaybe http://clojuredocs.org/clojure_core/clojure.core/lazy-seq helps
22:53murtaza52xeqi: thans
22:55ekoontzmurtaza52: what helped me is looking at range
22:55ekoontze.g. (range 5)
22:55ekoontz(source range)
22:55ekoontzshows that it's using a lazy-seq
22:58murtaza52ekoontz: thanks let me have a look
23:04tomojrange is obscured by chunkiness though
23:04tomojI wish you could take unchunky code and automatically make it chunky
23:23j4x0nAs a clojure newb, (:require ... and (:use ... are confusing. I see projects use one or the other, or a mixture of the two. Is there a definitive reason for using one way or the other?
23:23technomancyj4x0n: :use is old; don't use it
23:24j4x0ntechnomancy: thanks
23:24j4x0nI guess there was a transition period where people were unsure?
23:25technomancyj4x0n: prior to clojure 1.4, :require didn't do everything, but these days :use is redundant
23:26j4x0ntechnomancy: Excellent. And hey, thanks for lein...it's a pleasure to use and makes using Clojure much easier for newbs like me.
23:27technomancyglad it's working out for you =)
23:34murtaza52technomacy: so is the usage of :require recommended over :use in all cases ? Any reasons its not preferred?
23:35technomancymurtaza52: the only time :use makes sense is if you need to target earlier versions of clojure
23:35technomancywhich you probably shouldn't =)
23:35technomancybut use as a function makes sense in the repl because it's short
23:36murtaza52technomancy: :) cool . Just for my understanding, why is require preferred over use?
23:38technomancymurtaza52: because it's confusing to have both, as evidenced above =)
23:39j4x0nIt's things like require vs use that really screw up new users. When you run into a few issues like that in an hour, a voice in the back of your head says "You could have been done with this whole thing in your comfy language". Persistence!
23:55j4x0nHere's another fun one: unsupported major/minor version 51.0. I'm guessing one of my dependencies was compiled using Java 7.
23:56technomancyouch, yeah =(
23:56j4x0nIt's amazing anything works.
23:56j4x0nI hate running into this stuff in my playtime hours.
23:56brehautversion 51? is that chrome or ffx?
23:57j4x0nIt's an internal number for java 7
23:59j4x0nIt was the postgres jdbc driver.