#clojure log - Feb 07 2013

The Joy of Clojure
Main Clojure site
Google Group
List of all logged dates

0:17 Deece: Sorry if this is OT for #clojure, but I read on the google group a while ago the mention of a new-ish (>2009?) lisp unrelated to Clojure. it had pattern matching. it was called something er, vaguely "buddhist"-sounding?

0:18 Wondering if it rings a bell for anyone.

0:19 technomancy: there's Qi, which is a lisp with interesting ideas about static types and a horrible license

0:19 or Shen rather

0:19 alisdair: joxa or lfe? the erlang lisps? they have pattern matching

0:21 Deece: technomancy: it was Shen, thank you. The shen license looks.. weird, but not too bad.

0:23 technomancy: depends what you're going to use it for I guess

0:24 not the kind of thing I'd invest a lot of time in if someone else is going to tell me what I can use it for

0:30 shaunxcode: what uses does the license prohibit?

0:35 technomancy: distributing anything based on Shen which doesn't pass the spec

0:35 among other things

0:35 kinda similar to the way oracle restricts openjdk forks with the compatibility kit

0:36 Guest76208: isnt that a good thing? J++?

0:37 amalloy: ask apache about harmony

0:37 tmciver: technomancy: it doesn't sound too restrictive if you're only creating apps with it: "the code you write which rides on the top of our code is not bound by our license, this is yours."

0:38 technomancy: Guest76208: in the case of Oracle it's very bad, since they don't let you even have the compatibility kit unless you're their pal

0:39 shaunxcode: I think the most interesting thing about shen is KL, I have been waiting to see if anyone else uses it as a target for other lisps (or languages in general)

0:39 technomancy: Guest76208: in the case of Shen, it's bad because they won't even let you base your work on it if you change the name. it's not like they're just out to avoid confusion or anything.

0:40 if you read the reasoning behind the license, you can tell he's just bitter about his inability to make a living from the software he's written

0:40 Oracle's is worse because if you get on their bad side they've got a big pile of patents they'll use against you, of course. Shen is just silly.

0:41 (silly about compatibility)

0:42 shaunxcode: yeah the notion of anything beside MIT licensing just seems odd to me but I'm a simple kind of guy

0:42 (for open source/languages that is)

0:42 technomancy: ugh; MIT's a bit of a mess when it comes to patents though

0:42 someone can submit a patch to your MIT-licensed codebase, get bought by oracle, and then sue your pants off

0:43 most licenses longer than a page avoid that

0:44 shaunxcode: hah really? I guess I should pay more attention - is their a case where something like that has happened?

0:45 technomancy: not sure if it's happened with MIT specifically, but it has no patent provisions at all, which is foolish for anything high-profile.

0:47 amalloy: does anyone know if every contrib requires patches come exclusively through jira? ISTR rich saying at some point that as long as you only take patches from people with CAs you're okay

0:48 i ask because i have some small fixes to tools.reader and don't fancy sticking my hand into the jira bag of scorpions

0:57 shaunxcode: anyone have thoughts on how to pretty print a map with a literal tag in it e.g. for creating datomic schemas programatically? I have a quaint work around, but now I am intrigued as to how you can do it

1:04 callenbot: yogthos: next time you're around, I have some potential additions/improvements to Luminus to discuss.

1:04 yogthos: I'd just do a PR, but I'd rather discuss them with you first

1:18 fsvehla: I have a deconstructuring question, is it possible to get a map with {key, (the-vector 1), other-key (the-vector 2), ... from a vector?

1:18 Ember-: the-vector meaning element at index x?

1:18 fsvehla: I currently use { :host (fields 0) :timestamp (fields 1) :url (fields 2) ...

1:19 Ember-: Yes

1:19 Of course starting with 0

1:20 I was looking over the destructuring examples of jay fields, but I don’t actually think that’s possible...

1:20 amalloy: (zipmap [:host :timestamp] v)

1:21 fsvehla: Actually I think locals following the let form would be even nicer

1:21 zipmap, thanks

1:22 Ember-: I'm not sure if that's possible via destructing

1:22 it's a one liner otherwise though

1:24 ,(map-indexed hash-map ["a" "b" "c" "d"])

1:24 clojurebot: ({0 "a"} {1 "b"} {2 "c"} {3 "d"})

1:24 Ember-: wasn't that what you wanted?

1:24 no it was not

1:24 almost!

1:26 fsvehla: The zipmap solution works to return a map with the specified keys :)

1:27 I just wasn’t sure if that isn’t possible via destructing, because it is a kind-a obvious feature

1:33 amalloy: fsvehla: nonsense. destructuring isn't for building objects, it's for tearing them apart. and you asked to build a map

2:09 durka42: what on earth does that mean

2:09 "PLASMA warning: plasma_init(): PLASMA re-initialized"

2:09 (using incanter)

4:03 AtKaaZ: has anyone found a solution for this or is it impossible? &(#(var %) prn)

4:03 &(#(var %) prn)

4:03 lazybot: java.lang.RuntimeException: Unable to resolve var: p1__12841# in this context

4:04 AtKaaZ: &(#(var-get %) prn)

4:04 lazybot: java.lang.ClassCastException: clojure.core$prn cannot be cast to clojure.lang.Var

4:04 durka42: wait what are you trying to do

4:05 Sgeo: var-get should be a function like any other

4:05 AtKaaZ: to be able to give a symbol to a function and get the var, if that even makes sense

4:05 Sgeo: resolve?

4:05 clojurebot: Unable to resolve symbol: pst-elem-str is you have an old version of clj-stacktrace somewhere. see the Troubleshooting section of the swank-clojure readme.

4:05 Sgeo: (doc resolve)

4:05 clojurebot: "([sym] [env sym]); same as (ns-resolve *ns* symbol) or (ns-resolve *ns* &env symbol)"

4:05 Sgeo: (resolve 'resolve)

4:05 ,(resolve 'resolve)

4:05 clojurebot: #'clojure.core/resolve

4:05 AtKaaZ: something like: (fn [func] (add-hook func #'incTimes_hook))

4:06 durka42: ,(class #'prn)

4:06 clojurebot: clojure.lang.Var

4:07 AtKaaZ: where func needs to be a var

4:07 but I don't want to pass a var, I want to pass a symbol

4:07 Sgeo: AtKaaZ, what's wrong with resolve?

4:07 AtKaaZ: Sgeo, don't know how to use it in this context

4:07 Sgeo: If what you're doing is even sensible, which I don't know

4:08 Pass it a symbol, it finds the var that would be named by the symbol in the current namespace

4:08 AtKaaZ: oh it has to be quoted, wait

4:11 &(#(resolve (quote %)) prn)

4:11 lazybot: java.lang.SecurityException: You tripped the alarm! resolve is bad!

4:11 AtKaaZ: i don't know how:)

4:13 maybe from a macro, trying...

4:14 durka42: you'll need a macro, by the time #(resolve (quote %)) gets prn it has already been resolved into #'clojure.core/prn

4:14 ,'(prn)

4:14 clojurebot: (prn)

4:14 durka42: hmm, maybe not?

4:15 AtKaaZ: my problem is, I think, that it's passing p1__9968# to the macro, by I want its value instead

4:16 so instead of p1__9968# it would pass prn

4:16 i wish

4:19 in other words, I want the symbol which was passed to the anon function, but I can't unless the function is a macro, i see

4:20 ie. (xx prn) when xx is a macro will get me prn inside the macro, but (#(xx %) prn) will never get me "prn" but only things like p1__13332# or #<core$prn clojure.core$prn@741854be>

4:23 unless there's a way to get "#<core$prn clojure.core$prn@741854be>" to "prn" ?

4:23 ,prn

4:23 clojurebot: #<core$prn clojure.core$prn@37f8ff58>

4:24 AtKaaZ: that's one way, but I want the opposite way

4:29 ok, I got what I wanted for, thanks , if anyone cares it's this: https://github.com/DeMLinkS/demlinks/blob/92379ca7f955033d18a3b8eec677ce1cc1e7db25/src/runtime/q.clj#L673

4:31 (ignore that :pre btw xD)

4:37 right that makes sense why you can't resolve backwards from #<core$prn clojure.core$prn@37f8ff58> to prn because more than one symbol maybe be associated with that #<core$prn clojure.core$prn@37f8ff58>

4:40 OscarZ_: if i want to define a function with multiple arities, do I have to use defn or is it possible with just fn ?

4:53 AtKaaZ: OscarZ_: you can use fn

4:53 nonuby: i dissoc a key from a map and save that into mongo via monger, mongodb has the document with the key set to null, is there an alternative to dissoc

4:56 ignore i was doing something stupid

4:58 can i use update-in to update multiple keys

5:40 lpetit: Hello there

5:40 cemerick: hi :-)

5:40 lpetit: What is the best available library for file manipulation / folder creation, etc., etc. over there ? (beyond plain use of java API)

5:40 cemerick: you're everywhere :-)

5:41 cemerick: maybe Raynes' fs lib?

5:41 I've never used it

5:41 lpetit: or maybe just plain old apache commons io ?

5:49 ejackson: lpetit: I've been using Raynes' fs

5:49 its good

5:50 lpetit: ejackson: thanks for the feedback. And I also see that it has apache commons compress as a dependency, so hopefully it will provide me with not so low level APIs for e.g. unzipping files

6:13 pepijndevos: If the default lein template includes a .gitignore, why doesn;t it come with the git repo right away?

6:13 durka42: you might be like me and create the lein project inside a larger extant git repo

6:17 pepijndevos: hm

6:20 I like the idea of drip, but it doesn't seem to help me much. lein repl still takes several seconds to start.

6:21 In fact, there is not decernible difference on either my mac or linux laptop. drip ps does show a ton of vms running. I don't get it.

6:30 the-kenny: pepijndevos: I remember problems with drip & lein2

6:30 pepijndevos: ew

6:30 the-kenny: lein2 used some caches which changed the command line of the JVM so drip couldn't cache

6:30 dunno if that was fixed

6:31 pepijndevos: oh, it says you need to build it yourself

6:31 all the way down: https://github.com/flatland/drip/wiki/Clojure

6:31 oh, the other way around

6:31 you need to build leiningen

6:32 clgv: pepijndevos: well latest snapshot after preview 10 should be included in 2.0.0

6:33 aroemers: pepijndevos: Also make sure you have the latest version of drip. With some earlier version, drip had a bug that it did not reuse any spawned VM.

6:34 pepijndevos: bottom line: version hell

6:36 * pepijndevos brew upgrading

6:39 pepijndevos: oh, I have lein 2.0.0--SNAPSHOT, and a pretty old one at that, I guess

6:39 $ lein upgrade

6:39 The upgrade task is only meant for stable releases.

6:51 clgv: pepijndevos: install leiningen manually

7:01 pepijndevos: hm, the brew seems to be cray broken

7:01 stable is 1.7, devel is 2.0.0 and HEAD is 2.1.0-SNAPSHOT, which is not on S3.

7:09 AtKaaZ: is there some testbed that causes my function f that I pass to swap! to be call more than once? i need to test that somehow and see what happens

7:09 pepijndevos: grrr, I'm now on a checkout version of drip and the latest leiningen that I can get. Nothing

7:10 AtKaaZ: pepijndevos: is that lein from github master branch?

7:11 pepijndevos: AtKaaZ: no, just 2.0.0 :(

7:12 there is no such thing as 2.1.0-SNAPSHOT on amazon

7:12 AtKaaZ: no idea how that works, I take it you can't compile it there?

7:13 ~logs

7:13 clojurebot: logs is http://clojure-log.n01se.net/

7:13 pepijndevos: I suppose I can. I don;t know. It refers to a nonexsistant hacking section of the readme

7:14 clgv: pepijndevos: lein 2.0.0 is stable

7:14 AtKaaZ: maybe you wanted this: https://github.com/technomancy/leiningen/blob/master/CONTRIBUTING.md#bootstrapping

7:17 pepijndevos: clgv: so do I need master for drip?

7:18 clgv: pepijndevos: take that on: https://raw.github.com/technomancy/leiningen/stable/bin/lein

7:18 pepijndevos: clgv: that is what I have

7:19 clgv: pepijndevos: if that does not work you then maybe something for drip was broken again in 2.0.0

7:20 pepijndevos: I'm going to try lein trampoline, that always fixes stuf… oh, no, maybe not

7:21 AtKaaZ: if anyone cares, on win7 this is what I use to build leiningen from master https://gist.github.com/AtKaaZ/4730559

7:27 wunki: how would I get the metadata of a namespace. `(meta *ns*) keeps returning `nil`

7:27 AtKaaZ: ,(meta (var *ns*))

7:27 clojurebot: {:ns #<Namespace clojure.core>, :name *ns*, :added "1.0", :doc "A clojure.lang.Namespace object representing the current namespace.", :tag clojure.lang.Namespace}

7:28 AtKaaZ: that's not it xD

7:29 wunki: AtKaaZ: nope :(

7:33 clgv: try ##(meta (the-ns 'clojure.set))

7:33 lazybot: java.lang.SecurityException: You tripped the alarm! the-ns is bad!

7:36 pepijndevos: <inappropriate terms> I'm now running checkout versioins of both drip and leiningen. Still takes like ten seconds to do lein repl, while having a dozen jvms running, each consuming over 50MB of RAM

7:39 AtKaaZ: wunki: that actually works if the ns has meta, (meta *ns*)

7:40 wunki: like https://www.refheap.com/paste/10994

7:40 wunki: AtKaaZ: I think I found my problem, maybe the `ns` doesn't get recompiled in Emacs. A fresh `lein run` seems to find the meta now

7:41 AtKaaZ: wunki: yes I had to restart my ccw repl also

7:44 wunki: AtKaaZ: thanks for checking it out

7:45 AtKaaZ: wunki: np, I enjoyed it

7:46 pepijndevos: wut, where did my Java prefs go in OS X 10.8?

7:47 uh, found it.. It's in system prefs, but it's not

7:51 wut, no more java 6 I guess

7:53 or, just chaos. I can no longer select the version, like I could in the utilities java thing. the prefs say 7, the terminal says 1.6

7:57 http://reviews.cnet.com/8301-13727_7-57533880-263/java-preferences-missing-after-latest-os-x-java-update/

8:35 TimMc: I wonder if core.logic could be used to solve this puzzle: http://www.coinheist.com/rubik/a_regular_crossword/grid.pdf (PDF warning)

8:39 clgv: TimMc: hmm you would have to normalize it I think

8:40 TimMc: you can use the regexps as predicates but you have to determine the domains for the fields

8:45 TimMc: but a real unification would be difficult I guess

8:49 progo: did some of the clojure books have a venn diagram of clojure's essential sections I could use in a presentation?

8:50 hyPiRion: progo: Essential sections?

8:51 http://clojure.com/ has a diagram with focus, empowerment and simplicity.

8:51 abp: Oh, great: https://codeq.io/

8:52 progo: hyPiRion: like that but less enterprisey, and in a book that has better authority in citations :P

8:54 noidi: progo, the joy of clojure has one

8:54 on page 4

8:55 progo: noidi, great. I was just at page 16 walking backwards :D

8:56 noidi: :D

9:22 octagon: hello, does anyone know of a document that describes how the case* special form works? i see it in the macroexpansion for case, but it's very confusing and the java code is sort of without comments

9:24 https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Compiler.java#L8362 <-- that is the java implementation

9:26 https://gist.github.com/micha/4731233 <-- macro expansion of a case expr

9:34 luxbock: is there a way to auto-load some code when nrepl starts itself in Emacs?

9:35 for example I would like to have Pomegranate loaded everytime by default in case I need to install any new libraries

9:44 rhickey: When we support #bin"base64" - which base64 and why? http://en.wikipedia.org/wiki/Base64

9:45 `fogus: oh my... I had no idea that there were so many choices.

9:48 rhickey: http://tools.ietf.org/html/rfc4648 ?

9:48 Is there a Java lib that does rfc4648?

9:49 hyPiRion: $google java rfc4648

9:49 lazybot: [RFC4648 - jinahya - RFC-4648 Implementation. - Jinahya's Java ...] http://code.google.com/p/jinahya/wiki/RFC4648

9:55 stuartsierra: Apache Commons Codec is probably the most commonly-used Java lib, it claims to comply with RFC 2045.

9:55 jkkramer: other std libs: ruby - rfc 2045, python - rfc 3548, php - rfc 2045

9:55 rhickey: stuartsierra: yeah, but http://www.ietf.org/rfc/rfc2045.txt looks gross

9:55 jeremyheiler: what does data.codec implement?

9:56 aroemers: rhickey: whatever the choice, I am happy to see #bin will become part of edn. :)

10:00 rhickey: I like filename/url compatible and no fixed line lengths

10:00 clgv: ssh seems to use RFC2045 for keyfiles

10:00 rhickey: no fix/max

10:00 TimMc: rhickey: Strong preference for +/

10:01 rhickey: TimMc: because?

10:01 TimMc: It's the original, so basically every base64 tool I've seen uses it.

10:02 The URL/Filename stuff is just... I don't know, a special transport-dependent encoding.

10:02 rhickey: and yet, most newer ones don't, for good reasons

10:02 transport-dependent? transport compatible

10:02 TimMc: Sure.

10:03 Could you support both? It doesn't look ambiguous.

10:03 One danger is that you would misread (say) _- variants instead of rejecting them.

10:04 (because it uses the same alphabet as -_)

10:04 hyPiRion: Wouldn't it be smarter to use the standard used by most other languages? As long sound implementations of the standard exists, it will be both easier and simpler to extend/implement EDN on those platforms then. Unless there's significant issues with the most popular, I don't see a reason why this should be a discussion.

10:04 rhickey: hyPiRion: "I don't see a reason why this should be a discussion." - then don't participate

10:04 TimMc: That's rude.

10:05 rhickey: I don't see a reason why this should be a discussion. is rude

10:05 TimMc: I think he's asking you to justify the bikeshedding.

10:05 rhickey: I think the existence of the variants demonstrates the bikeshedding is not due to me

10:06 TimMc: You expressed a preference for filename/URL compatible variants -- why?

10:06 pepijndevos: technomancy: ping

10:07 hyPiRion: rhickey: You lost the head of that sentence. What I meant was that if there's minor differences between the characters used, then use the most popular one.

10:07 Disclaimer: I have no knowledge on base64.

10:15 aroemers: One could always add a #my/rfc2045 data reader oneself of course, if the default is not to one's liking.

10:16 TimMc: #base64-_

10:16 (not entirely serious)

10:17 ,(javax.xml.bind.DatatypeConverter/printBase64Binary (.getBytes "k\ueff3"))

10:17 clojurebot: "a+6/sw=="

10:23 pepijndevos: Is (:require :refer) the same as (:use :only) ?

10:28 saolsen: pepijndevos: yep, and :refer :all would be the same as just :use

10:29 pepijndevos: I was hoping I could use slamhound to develop with :use and publish with :only/refer

10:29 That way, a reader knows where everything comes from, and I don't have to spell it out

10:30 hyPiRion: (:require [foo :refer [bar]]) would make it possible to use foo/baz as well

10:35 gfredericks: what's a use case for evaling IFns? i.e., why does (eval (list + 1 2 3)) work?

10:36 nDuff: gfredericks: Sorry? (list + 1 2 3) is just a PersistentList, not an IFn.

10:36 danielglauser: hyPiRion: How so? Just tried at the repl, if I :refer [bar] I can't access anything else from foo besides bar

10:37 hyPiRion: danielglauser: what?

10:37 ,(require '[clojure.pprint :refer [cl-format]))

10:37 clojurebot: #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: Unmatched delimiter: )>

10:37 hyPiRion: ,(require '[clojure.pprint :refer [cl-format]])

10:37 clojurebot: nil

10:38 hyPiRion: ,(cl-format true "~R" 150)

10:38 clojurebot: one hundred fifty

10:38 hyPiRion: ,(clojure.pprint/pprint {:a 1 :b nil})

10:38 clojurebot: {:a 1, :b nil}\n

10:38 danielglauser: hyPiRion: Got it, didn't realize you were talking about using the fully qualified namespace

10:39 hyPiRion: oh

10:39 Sgeo: http://ideone.com/O0LqJy

10:39 Huh. That's simpler than I expected

10:41 gfredericks: nDuff: yes but + is an IFn, and it's not quoted

10:41 clgv: Sgeo: what?

10:41 Sgeo: clgv, using deftype to store data

10:41 (I need it to be a type to distinguish from other kinds of data)

10:42 clgv: Sgeo: you can also use maps with :type metadata for that ^^

10:42 Sgeo: I'm just writing a version of trampoline which requires the loop to be ended with (done blah) rather than just blah, meaning functions can be returned

10:42 It's for my blog post

10:42 clgv: &(type (with-meta {:a 1} {:type :blubb-type}))

10:42 lazybot: ⇒ :blubb-type

10:43 Sgeo: That argues that that sort of thinking is a good thing

10:43 nDuff: gfredericks: eval would be confusing to use if it didn't behave that way. Would you _really_ want to force folks to pass '+ instead of +?

10:45 Sgeo: IFns functioness is only meaningful at the beginning of a list (or when something calls it, say, if you're passing it in to a higher order function)

10:45 hyPiRion: Well..

10:45 Sgeo: (+ 1 2 3) this, as a list, sees + at the beginning is an IFn, so evaluates it

10:45 clojurebot: #<RuntimeException java.lang.RuntimeException: java.lang.NumberFormatException: For input string: "+">

10:45 Sgeo: ..?

10:45 (+ 1 2 3)

10:45 clojurebot: *suffusion of yellow*

10:45 hyPiRion: Sgeo: no, that resolves the symbol

10:45 ,('+ 1 2)

10:45 clojurebot: 2

10:45 clgv: (+ 1 2 3),

10:45 clojurebot: *suffusion of yellow*

10:45 clgv: oops

10:46 ,(+ 1 2 3)

10:46 clojurebot: 6

10:46 hyPiRion: (eval (list 'foo 1 2)) returns "unable to resolve symbol: foo in this context"

10:46 Sgeo: Well, yeah, symbols get resolved first

10:46 hyPiRion: Whereas double-quoting it resolves that issue

10:47 Sgeo: What's the problem exactly?

10:47 hyPiRion: Sgeo: I have no issue with it, really. Behaves as I expect.

10:47 Sgeo: Someone seemed like they were having an issue?

10:47 Don't mind me, I'm tired

10:48 And forcing myself to stay awake so I can stop sleeping in the middle of the day

10:48 hyPiRion: Sgeo: yeah, gfredericks mentioned something I didn't quite grasp

10:49 Sgeo: <gfredericks> what's a use case for evaling IFns? i.e., why does (eval (list + 1 2 3)) work?

10:49 gfredericks, all Clojure code is data

10:50 First it's read in, which turns "(+ 1 2 3)" for example into a list containing a symbol +, a number 1, a number 2, a number 3

10:50 Then that list is evaluated

10:50 (Or whatever the result of reading it is)

10:50 ,(read "(+ 1 2 3)")

10:50 clojurebot: #<ClassCastException java.lang.ClassCastException: java.lang.String cannot be cast to java.io.PushbackReader>

10:50 Sgeo: :(

10:50 (doc read)

10:50 clojurebot: "([] [stream] [stream eof-error? eof-value] [stream eof-error? eof-value recursive?]); Reads the next object from stream, which must be an instance of java.io.PushbackReader or some derivee. stream defaults to the current value of *in* ."

10:50 hyPiRion: read-string

10:50 Sgeo: ,(read-string "(+ 1 2 3)")

10:50 clojurebot: (+ 1 2 3)

10:51 Sgeo: That + is a symbol, which then gets resolved, in this case, to a function

10:51 hyPiRion: Ooh. But (list + 1 2 3) doesn't do that. It resolves + into the function plus.

10:51 the-kenny: ,(list + 1 2 3)

10:51 clojurebot: (#<core$_PLUS_ clojure.core$_PLUS_@463bb30a> 1 2 3)

10:51 Sgeo: Ah, so, in that case, eval is seeing the function object directly, rather than the symbol

10:52 the-kenny: ,(#<core$_PLUS_ clojure.core$_PLUS_@463bb30a> 2 3 4)

10:52 clojurebot: #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: Unreadable form>

10:52 Sgeo: Well, that's part of what evaluation means

10:52 Evaluation on a symbol resolves the symbol and evaluates the result

10:52 Erm, wait, it... hmm

10:53 So resolving is not theoretically a separate step from evaluation, it's what it means to evaluate a symbol

10:53 although, hmm. (list 'quote 'foo) gets evaluated to foo but the foo symbol doesn't get evaluated

10:54 I guess quote says "don't evaluate this" and symbols say "go ahead and evaluate the result"

10:54 hyPiRion: Sgeo: I think it's because functions are values.

10:55 Sgeo: It bothers me though that Clojure doesn't accept arbitrary objects in forms

10:55 hyPiRion: (= (eval 1) (eval '(quote 1))), same applies for functions

10:56 A value resolves to itself, whereas a symbol doesn't.

10:56 Sgeo: (def foo 'foo)?

10:57 ivaraasen: hyPiRion: ever tried test.generative BTW?

10:57 Sgeo: I think there's some sort of phases mechanism that I'm forgetting about

10:58 Or... not quite phases

10:58 hyPiRion: Sgeo: You meanie. A symbol resolves to the value it refers to in the context it is evaluated in.

10:58 ivaraasen: Not generative, I'm afraid

10:58 just tesrt

10:58 *test

10:59 ivaraasen: hyPiRion: pretty sweet stuff. using it to test array-utils.

10:59 hyPiRion: ivaraasen: What is its use case?

10:59 Does it generate data to work with?

10:59 /s/work/test/

11:00 clgv: hyPiRion: there are two steps: resolve and var-get (or calling the symbol)

11:00 I meant: *the var

11:00 ivaraasen: hyPiRion: yeah, in my case it just generates tons of different long-arrays and double-arrays to test the rigidity of the exposed API

11:01 Sgeo: ...I forgot about vars

11:01 ivaraasen: so things that shouldn't be mutated aren't mutated, et cetera.

11:01 Sgeo: derpderpderpderpderpderp

11:01 * Sgeo is a derp

11:01 hyPiRion: ivaraasen: Oh, that sounds valuable.

11:01 At least for some stuff.

11:02 ivaraasen: hyPiRion: discovered a bug in afill! (and afill-bounded!) thanks to this, actually.

11:14 gtrak: anyone have a working phonegap/android clojurescript repl or know of a technical reason why it wouldn't work? (eg, does phonegap or android disallow eval or something weird like that?)

11:16 matthavener: gtrak: its my understanding that android doesn't preclude clojure, but the gc pressure is a little high for the dalvik jvm

11:16 gtrak: ah, yes, that's why I'm considering clojurescript as an alternative. Real clojure would be nice, but impractical.

11:17 cemerick: gtrak: clojurescript does not have eval, unless you're talking about kanaka's fork

11:17 gtrak: I see a bunch of getting-started things, but no browser-repls on google

11:18 cemerick: 'eval' in the sense of browser-repl, doesn't it rely on JS eval?

11:18 cemerick: no

11:18 gtrak: ah

11:18 cemerick: The ClojureScript compiler is implemented in Clojure.

11:18 gtrak: I get that, I'm talking about the browser repl

11:18 it somehow sends forms over the wire and runs them

11:19 cemerick: The browser-repl is just a different runtime environment for cljs; it still needs a cljs compiler.

11:19 pimeys: btw. let's build a browser with llvm support :)

11:19 gtrak: yes, I have the cljs compiler part working :-)

11:19 pimeys: just came to my mind while I'm writing javascript here again :(

11:19 gtrak: not the browser-repl part (works locally, not on phonegap)

11:20 alexnixon: how is Clojure (the language itself) built and deployed? Does it come from a CI machine or is it built and pushed manually on someone (rhickey's?) personal machine?

11:20 cemerick: gtrak: You might want to check out kanaka's fork, he's been working on it for quite a while now (and perhaps using it in real stuff?)

11:20 gtrak: ie, I've compiled a cljs file into javascript that *should* connect to lein trampoline cljsbuild repl-listen, but silently breaks

11:21 cemerick: alexnixon: see http://build.clojure.org

11:21 gtrak: Whatever the issue there, you'll still need a Clojure runtime to compile cljs to drive a browser-repl.

11:22 gtrak: that's what lein-cljs repl-listen does

11:25 alexnixon: cemerick: thanks for that - just trying to figure out the best way of managing build/releases internally

11:26 cemerick: gtrak: oooh, you just want to run browser-REPL with cljs running on android, not have a self-hosted cljs

11:26 gtrak: yes! :-)

11:26 cemerick: The joys of short-form textual communication.

11:27 gtrak: silent failure might sound like you're violating the same-origin policy

11:27 gtrak: ah, I was just thinking it could be a security policy

11:28 the android emulator has a hook for to refer to the host IP, that's what address I'm trying to connect to

11:28 when every other cljs example I've seen is localhost, (won't work in this case)

11:29 cemerick: gtrak: If you can get the same file to work when loaded from localhost (*not* file:/), then yeah, you're running into a phonegap/network/browser security restriction.

11:29 You can't just throw a random URL into your browser repl connection call

11:29 gtrak: that makes sense

11:29 cemerick: it has to be the same host as where the cljs was loaded from

11:30 gtrak: I will hack it :-)

11:37 cemerick: looks like the browser-repl indeed uses js eval? just curious now: (js* "eval(~{block})"))

11:39 along with some crazy string interpolation macro trick

11:40 gfredericks: Sgeo: hyPiRion: I just noticed the long conversation I spawned; was there any resolution?

11:40 cemerick: gtrak: oh, cljs does use js eval, but not in service of compiling cljs->js

11:41 which is what I thought you meant

11:42 gtrak: ah, yea, no. cljs-eval js-eval browser-repl-eval clojure closure google-closure, I think we need some more ambiguity :-)

11:42 Sgeo: My own personal conclusion is that I need more sleep.

11:46 pepijndevos: Any carmine users around? I'm confused about how it does pipelining. Am i correct that any command ran inside a car/with-conn actually returns nil and only returns the result at the end?

11:47 alexnixon: cemerick: with the Clojure release process, what is to prevent a sneaky commit being pushed by someone in the second before rhickey clicks the "release" button in Jenkins? Is it safe because rhickey is the only guy with push-to-master privileges?

11:48 cemerick: alexnixon: AFAIK, only he and Stuart Halloway have commit. That might be outdated info, but it's a very limited set in any case.

11:50 alexnixon: cemerick: thanks for the info - that sounds plausible

11:51 Chousuke: stuff like that is probably the main reason I like git

11:51 everyone has commit access, so you only need to decide whose collection of commits you like best

11:52 alexnixon: git definitely makes a bunch of different workflows possible

11:52 it's just tricky finding the "right" one for the situation

11:52 Chousuke: I find working with svn so awkward because I can't save my code before I'm ready to publish it :/

11:53 fortunately git-svn exists

11:54 though I've found that often I end up with a bunch of crappy commits and then svn dcommit them all. :P

11:56 that's still marginally better than having a huge bunch of code uncommitted in the working copy, however

11:59 And I tend to use branches so often that I find it hard to imagine working without them :P

11:59 gfredericks: I can't imagine not viewing a git repo as a graph

12:00 Chousuke: that's what it is

12:00 gfredericks: yes I mean for looking at it visually

12:00 the default format of `git log` seems so worthless

12:00 Chousuke: I mostly use git log -p

12:01 to review changes

12:01 gfredericks: I use git log --graph --all --format=\"%h[%t] %d %an--%s\"

12:02 those backslashes are probably unhelpful

12:02 Chousuke: branches make everything so carefree in git

12:02 gfredericks: my favorite is debugging by creating a `wtf` branch and deleting half of the code at a time until the error is isolated

12:02 nDuff: they're certainly unhelpful.

12:02 Chousuke: have a cool new idea? branch. need to fix something? branch. hard merge/rebase? branch

12:03 nDuff: Use the slashes like that and the shell will string-split the contents

12:03 gfredericks: nDuff: I needed them in the .gitconfig as an alias

12:03 nDuff: so your command becomes: git log --graph --all '--format="%h[%t]' '%d' '%an--%s"'

12:03 Ahh.

12:04 Chousuke: the way I usually do rebases is branch -> rebase -i -> ff merge to original. sometimes with several branching steps

12:05 so I end up for foo-rebase-1 through 10

12:05 the amusing part is that you don't even have to do that manually since git keeps all the information in the reflog anyway

12:06 but somehow it still helps

12:08 technomancy: pepijndevos: hi

12:10 pepijndevos: technomancy: I was playing with slamhound, hoping it would allow me to turn (:use) clauses to (:require :refer) ones. So far, it just crashes

12:10 technomancy: oh, that's a drag

12:10 pepijndevos: what do you mean?

12:11 technomancy: oh, just that it's unfortunate

12:11 pepijndevos: oh

12:11 nDuff: Heh; the joys of using slang on an international forum

12:11 pepijndevos: My use case is that when reading code, I like to see where stuff comes from, but when I write code, I don't want to specify every little function.

12:12 technomancy: is that something slamhound could do, if I got it to work?

12:12 technomancy: pepijndevos: oh yeah, definitely

12:12 pepijndevos: cool

12:13 hammer__: if i'm looking at a seq and want to compare an element to its previous element

12:13 how do i do that sort of comprehension?

12:13 pepijndevos: Failed to reconstruct: #<File src/asky/core.clj>

12:13 java.lang.RuntimeException: Unable to resolve symbol: == in this context, compiling:(NO_SOURCE_PATH:1:139)

12:13 technomancy: pepijndevos: ok, yeah the regex for exceptions needs tweaking

12:13 rasmusto: hammer__: partition might be of use

12:14 pepijndevos: technomancy: what does that mean?

12:14 technomancy: shouldn't be too tricky; I think it assumes missing vars are going to be compliant with the symbol name restrictions on clojure.org

12:14 hammer__: oh that's exactly what i was look for, thanks rasmusto

12:14 (inc rasmusto)

12:14 lazybot: ⇒ 1

12:14 technomancy: pepijndevos: this explains how slamhound works: http://technomancy.us/148

12:15 pepijndevos: ok, will read

12:15 technomancy: basically it looks at the message for each exception to see what var is missing

12:15 rasmusto: hammer__: (partition 2 1 someseq) is something I use a lot

12:15 technomancy: so it can search for it and add it into the candidate ns

12:15 so it's just a matter of tweaking the regex

12:15 pepijndevos: ah, nice. So all the 2 namespaces I tried must have defeaten the regex in some way

12:16 for the other one it says: nth not supported on this type: Symbol

12:16 technomancy: that's the thing about regexes... they never cover all the possibilities

12:16 craigbro: hmm

12:17 core.logic issue

12:17 if I do (run N ...

12:17 will it repeat results into I get N?

12:17 pepijndevos: craigbro: no

12:17 hiredman: I don't think so

12:18 maio: OT: native english speakers - is it possible to say word raweri? :)

12:18 craigbro: hmm

12:18 hiredman: but depending on your program you can have duplicate results

12:18 pepijndevos: &(#(println %&) 1 2 3)

12:18 lazybot: ⇒ (1 2 3) nil

12:18 nDuff: maio: I don't know -- it's hard to know how it should be pronounced from only seeing it spelled. :)

12:18 pepijndevos: My new favourite syntax

12:21 desertmonad: Chousuke: I'm still a bit of a git novice. At work SVN is mandated, but I am able to use git-svn. Do you know of a work flow that would let me git clone a repository that was created by git-svn?

12:22 I can do the clone, of course, but git svn dcommit rebases to change the log messages (afaik)

12:22 Chousuke: hmm, yeah

12:22 desertmonad: and so the git clone diverges

12:22 * nDuff notes that this is one of the places where bzr-svn does better than git-svn

12:22 gfredericks: maio: depends on what you mean by "possible" I guess; looks like pronounced "rah WHERE ee"

12:23 but definitely looks foreign

12:23 Chousuke: desertmonad: probably easiest to have two separate git-svn clones and just work with them treating them as two SVN committers (with occasional sending of patches back and forth)

12:23 nDuff: (though it does so only because bzr changed their backend to accomodate better SVN interop)

12:23 s/only//

12:25 desertmonad: Yeah, I've thought about doing that. My goal is to not publish to SVN if I'm in the middle of tweaking something… best I've come up with is using rsync, which is less than ideal.

12:26 gfredericks: has using println with a lazy seq always given reasonable results?

12:26 (as opposed to str)

12:26 hiredman: yes

12:28 ln2: Hi all. =)

12:28 * gfredericks huhs

12:28 ln2: Do you guys have any recommended reading other than "The Joy of Clojure"?

12:29 gfredericks: "because I hate the joy of clojure" or "because I've already read the joy of clojure"?

12:29 hiredman: read clojure.org

12:29 http://clojure.org/documentation http://clojure.org/rationale http://clojure.org/features

12:30 etc

12:30 ln2: "Because I just started reading The Joy of Clojure and I am excited to line something up in front of it. =)

12:30 hiredman: Thank You!

12:32 brainproxy: ln2: Clojure Programming pub'd by O'Reilly was a great read, imo

12:32 ln2: I do have one dilemma though. I've never programmed in *any* language before. So I guess my question should be more along the lines of. "Is there a Clojure for Dummies?".

12:32 hyPiRion: ln2: Depends. If you want to learn Clojure, then Clojure Programming is great.

12:32 brainproxy: one of the best O'Reilly books I've ever read, in terms of quality of the writings and examples, and the depth of learning

12:33 ln2: brainproxy: The one with the big bird on the front? Haha

12:33 gfredericks: has anybody heard any anecdotes of new programmers learning clojure?

12:33 ln2: Is that the same thing as horror stories?

12:34 gfredericks: :)

12:34 brainproxy: ln2: this one http://www.clojurebook.com/

12:34 Sgeo: Is Clojure really a good idea for a starting language?

12:34 hyPiRion: ln2: I am not sure if any Clojure book is "not programmed anything yet" friendly. I do know that there are some python books out there for people completely new to programming, but I can't tell you which ones to choose.

12:35 cemerick: gfredericks: borkdude is a prof IIRC; Lee Spector also teaches total noobs Clojure. *shrug*

12:35 ln2: I'm starting to learn the difference between Clojure and the more popular languages as I go. But again... I've never programmed in any language. (advantage?).

12:35 dnolen: Sgeo: IMO it's about as good as any other.

12:35 Natch: ln2: programming clojure 2nd edition by halloway and bedra is great. clojure programming from oreilly seems good but it has 3-4 annotations per page and is extremey annoying to read, imho..

12:35 Sgeo: dnolen, well, there's the whole Java interop that is around that could cause issues

12:35 ln2: To help I'm trying to learn Lambda Calculus also. I'm sure it will help. Probably... haha

12:35 Sgeo: Which is not the case with most languages

12:35 dnolen: Sgeo: doing anything useful in any language is pain.

12:36 rasmusto: ln2: could be partially an advantage, might make you take less notice of unique clojure features though

12:36 Natch: *extremely

12:36 ln2: Natch: Thank you! I will get that one also. =)

12:36 cemerick: Natch: sorry about that; it's O'Reilly house style, something we fought tooth and nail about, but lost

12:36 gfredericks: "If you haven't programmed before I recommend starting with clojure and the lambda calculus."

12:37 pbostrom_: ln2: you also might try some exercises on http://www.4clojure.com/ to reinforce your book learning

12:37 ln2: gfredericks: Is this sarcasm? Haha

12:37 pbostrom_: I've never seen this site! Thank you!!!

12:37 rasmusto: ln2: clojure koans are good too (on github), it's slightly more structured than 4clojure

12:37 Natch: cemerick: that's a shame

12:38 cemerick: because it seemed really nice otherwise

12:38 ln2: rasmusto: I am working through the Clojure Koans right now as we speak. =)

12:38 rasmusto: ln2: cool :)

12:39 Frozenlock: I just realized why the docstring is before the arguments in clojure, as opposed to say elisp... For when you have multiple arity.

12:39 * Frozenlock is multiple years late to the party

12:39 rasmusto: Frozenlock: oo, I was wondering that too. Good point

12:40 creese: Has anyone read the new o'reilly book on cljs?

12:40 ln2: I was a little turned off aesthetically to the massive amounts of parens in Clojure until I saw lamda calculus. Maybe I should be thankful? O_o

12:40 gfredericks: ln2: a little bit. nothing wrong with being ambitious though :)

12:41 technomancy: SKI or go home

12:41 hyPiRion: ln2: If you're that far (doing Clojure Koans) and never programmed before, I'd go with Clojure Programming as a book for learning Clojure. You sound like a smart and motivated guy, so it shouldn't be a problem.

12:42 ln2: gfredericks: Maybe the next generation of programmers it will be ambitious to try and comprehend object oriented languages! We can all hope...

12:42 Frozenlock: ln2: http://www.thejach.com/imgs/lisp_parens.png

12:42 Sgeo: Fun fact: There's more to OO than you would think just by looking at the most popular languages

12:43 The style of you see in Java and C# and C++ is not the only one out there

12:43 gfredericks: Sgeo: just because something is rich and subtle doesn't make it good :P

12:43 pimeys: sicp teaches objects in chapter three

12:43 Sgeo: *style of oo

12:43 pimeys: and of course you can do the same with clojure

12:43 ln2: hyPiRion: It may seem that way... O.o. In reality I'm only average at logic and seriously inept at higher math (pretty good at mental). I'm not having the easiest time with visually following a fn embedded into a fn taking two fn ect. ect.

12:43 pimeys: having a function with inner functions, message passing and returning a closure

12:43 ln2: I'm really really trying to go slow. xD

12:44 Sgeo: message sending implies single-dispatch I think (but not certain)

12:44 I'm not especially a fan of single dispatch, but I'm not sure what I would like

12:44 pimeys: me neither

12:44 but it's possible

12:44 and one way of building your app

12:44 I think that the hardest part with lisps is that it doesn't force you to anything

12:44 hyPiRion: ln2: Being smart is not the same as being knowledgable. Being smart is about learning rapidly and being open to new ideas :)

12:45 pimeys: you can use whatever style you prefer

12:45 technomancy: for most people the hardest part of learning clojure is unlearning bad imperative habits

12:45 Sgeo: pimeys, which gets annoying when you try to mix different OO systems together

12:45 Say in Scheme if one person is using TinyCLOS and another is using, I don't know, coops

12:45 pimeys: technomancy: but you can also use your imperative habits

12:45 keep state etc.

12:45 Sgeo: Tcl has this problem too

12:45 pimeys: Sgeo: yep

12:46 technomancy: pimeys: arguably then you haven't really learned it =)

12:46 Sgeo: Although Snit tries to solve it by saying that anything that looks like an object is an object

12:46 ln2: For example. This Koans got me. I cheated and got the answer from a YouTube series.

12:46 Sgeo: I think

12:46 pimeys: technomancy: well, who says so :D

12:46 * technomancy judges not, lest he be judged

12:46 pimeys: lisps are not so much of functional languages, I'd say

12:46 ln2: http://tny.cz/7feb3618

12:46 dnolen: ln2: go slow

12:46 Sgeo: pimeys, depends on the Lisp

12:46 pimeys: but they have a nice way of giving you that possibility

12:46 Sgeo: Trying to categorize them all into one mold seems like a fool's errend

12:46 technomancy: actually that's not true, I judge all the time

12:47 ln2: Even worse. The explanation on YouTube was basically. "That was convoluted... lets move on now!"

12:47 Sgeo: Lisp is a style of syntax and metaprogramming, imo

12:47 gfredericks: technomancy: and I'm going to judge you either way so you can't really avoid it

12:47 ln2: O.o

12:48 I'm assuming all of you can solve that one pretty easily?

12:48 pbostrom_: creese: I read it, it's pretty light on content, but that's reflected in the price, probably worth if if you're brand new to cljs, but if you're already up and running, you won't learn anything new

12:48 Sgeo: Took me a bit more thinking than it should have, to be honest. But yeah

12:49 Think about what the fn is supposed to be doing. What is its role, what is its job there?

12:49 ln2: To remove words that don't meet certain conditions?

12:50 Sgeo: reduce isn't a mover, it's a thing that takes a list and gives a result. And the fn you pass into it is supposed to take a result so far and an item, and return a new item-so-far

12:50 *reduce isn't a remover

12:51 (also, saying "list" was a bad choice of words on my part)

12:51 ln2: Oh right. Because nothing can / should be "removed". Just returned.

12:51 Because "removing" is a mutation.

12:51 Sgeo: Well, there is a function that returns a copy with some stuff different in the copy. Removed if it doesn't meet a condition. But that's not what reduce is for.

12:52 dnolen: Sgeo: message sending isn't necessarily single dispatch, look at Cecil, also the whole idea behind CLOS was being able to support different OO systems under the same roof.

12:53 ln2: I suppose it's starting to make more sense now. I wish there was an easier way to format these but there really isn't because it's a single expression.

12:53 Maybe this IS what draws people to OO?

12:53 Sgeo: I think what draws people to OO is the fact that it's one of the first things they learn

12:54 ln2: Then maybe.. really.. we only have public schools to blame...

12:54 Sgeo: As far as formatting goes, that's not really much of an OO vs. functional thing. There are ways to split things up in functional languages

12:54 But imperative languages do admittedly tend to partition into separate statements more than having an expression

12:54 ln2: Sgeo: Really? I'm interested in that!

12:55 Sgeo: ,(doc let)

12:55 clojurebot: "([bindings & body]); binding => binding-form init-expr Evaluates the exprs in a lexical context in which the symbols in the binding-forms are bound to their respective init-exprs or parts therein."

12:55 ln2: I wonder if I could reason how to split up that koans... might be a fun exercise.

12:55 Sgeo: ,(let [a 5 b 6] (+ a b))

12:55 clojurebot: 11

12:56 Sgeo: Other functional languages have other approaches. And you can usually drag an fn out and give it a name

12:56 (although not always)

12:56 enquora: anyone from prismatic here? is the Graph library Clojurescript-friendly?

12:56 Sgeo: But at least with this koan, it's just a matter of fill in the blank

12:56 I promise that for this one, the blanks are very simple, they won't complicate the expression at all

12:56 ln2: Binding... I was watching a talk about binding and how it do it without Macros.

12:57 Sgeo: ,((fn [a b] (+ a b)) 5 6)

12:57 clojurebot: 11

12:57 ln2: I don't actually know what let / binding do yet.

12:57 Sgeo: ^^roughly equivalent to the above let

12:57 ln2: Wait a minute. Theres a REPL in this channel?

12:57 Sgeo: Two, although imperfect

12:58 ln2: Ha! That is amazing!

12:58 brianwong: that is amazing

12:59 i didnt know that

12:59 (doc let)

12:59 clojurebot: "([bindings & body]); binding => binding-form init-expr Evaluates the exprs in a lexical context in which the symbols in the binding-forms are bound to their respective init-exprs or parts therein."

12:59 brianwong: err

12:59 ln2: ,(* 2 2)

12:59 clojurebot: 4

12:59 brianwong: ,(doc let)

12:59 clojurebot: "([bindings & body]); binding => binding-form init-expr Evaluates the exprs in a lexical context in which the symbols in the binding-forms are bound to their respective init-exprs or parts therein."

12:59 ln2: It's fast too. *giggles like a schoolgirl*

12:59 And it has the doc namespace!

13:00 Does an XMPP REPL exist?

13:00 technomancy: clojurebot used to have an XMPP interface

13:00 I think it was removed though

13:00 ln2: =(

13:02 callenbot: enquora: I sincerely doubt it, and why would you want it to be?

13:03 enquora: need to build a PDF report generator to run in both browser and on server

13:04 it's a non-trivial task, just thinking now how to structure it

13:04 hyPiRion: enquora: What do you mean by "in browser"?

13:05 enquora: HTML browser

13:05 hyPiRion: Should the PDF be build by ClojureScript, or could it be sent from the server to the browser?

13:05 built*

13:05 enquora: must run offline

13:06 it's a distributed system

13:07 ln2: Do most of you guys use LightTable?

13:07 enquora: the web browser app is a cached HTML app, or browser extension

13:07 craigbro: not I

13:07 but I'm an emacs curmudgeon, so may not be representative, and is no judge of LT

13:08 TimMc: ln2: Most folks here use emacs or vim.

13:08 LT is very young.

13:08 nDuff: *nod*. It's a very neat toy, and has promise.

13:09 * nDuff donated to the kickstarter, and is glad to have done so.

13:09 shaunxcode: I seem to recall there was a pure js pdf gen tool floating around recently

13:09 ln2: Having zero programming background I'm not sure I could bring myself to use tools like emacs and vim. I'm really impressed by some of the features I've seen from both of them though, features I did not expect in cli apps.

13:09 TimMc: ln2: Learn one thing at a time.

13:09 Both emacs and vim have long learning curves.

13:09 ln2: TimMc: That's the method I'm trying to use. LightTable is helping me get going fast. =)

13:10 TimMc: Good.

13:10 nDuff: ln2: If you want to be blown away, watch the Emacs Live intro video. http://vimeo.com/22798433

13:10 shaunxcode: ln2: the nice thing about using a generic text editor when starting is you learn the difference between what is language magic v.s. what is ide magic v.s. build tool wizardry

13:10 TimMc: I had to try learning emacs 3 times before it stuck; the first two times I was trying to learn a new programming language at the same time, so it sucked. :-P

13:11 ln2: One thing I would really like to have is some way of auto-correcting my parens. Light table color codes them. But I think it was emacs that actually does parens for you?

13:11 dnolen: ln2: yes paredit

13:11 rasmusto: ln2: paredit.el or paredit.vim

13:12 TimMc: ~paredit

13:12 clojurebot: paredit is not for everyone, but what you need to understand ís how to become the kind of person that paredit ís for.

13:12 TimMc: :-P

13:12 shaunxcode: codemirror has paredit mode http://htmlpreview.github.com/?https://github.com/achengs/subpar/blob/master/demo/normal.html

13:12 technomancy: clojurebot: botsnack

13:12 clojurebot: Thanks! Can I have chocolate next time

13:12 ln2: Did the bot just talk? O_O

13:12 TimMc: I triggered a factoid.

13:12 technomancy: as long as it obeys the Three Laws clojurebot can do anything

13:12 ln2: Aahhhhahha!

13:12 Is the bot as opinionated as Hickey? xD

13:13 TimMc: The bot is opinionated as the people who care to feed it things.

13:13 Also it randomly picks up quotes from the channel, which can be... odd.

13:14 ln2: It's also a Furby? O _ O

13:14 Sgeo: Paredit is awesome

13:14 I wish I had paredit in here

13:14 technomancy: Sgeo: (add-hook 'erc-mode-hook 'paredit-mode) ; =D

13:14 jballanc: clojurebot: litany against cons

13:14 clojurebot: litany against cons is "I must not cons. Cons is the perf-killer. Cons is the little death that brings total obliteration. I will face my cons and permit it to pass over me and through me, and when it has gone past I will turn my GC to see its path. And where it has gone there will be nothing; only I will remain."

13:14 Sgeo: technomancy, heh

13:14 craigbro: conj

13:14 hyPiRion: It replies to certain things. right clojurebot???

13:14 lazybot: hyPiRion: Yes, 100% for sure.

13:14 hyPiRion: oh, that's the wrong one.

13:15 llasram: technomancy: I just tried it, and paredit is unhappy lingering emoticons :-(

13:15 Sgeo: Close all emoticons! (:)

13:15 (:-)

13:15 technomancy: llasram: yeah, show-paren-mode is good enough for me

13:16 Bronsa: show-paren-mode is awesome

13:20 hyPiRion: I prefer highlight-parentheses.

13:23 aaelony: does anyone know of a tutorial or link that describes how to profile a clojure program running at the repl via yourkit ?

13:24 or running a jar produced by lein uberjar ?

13:24 hyPiRion: aaelony: running a jar? java -jar name-of-uberjar

13:25 aaelony: hyPiRion: how to profile that running jar though?

13:25 ln2: http://tny.cz/f15ac6b4

13:25 I'm trying to understand how this "inline function" can be expressed in a way that is easier to read. What am I missing?

13:26 hyPiRion: aaelony: I'm afraid I don't know that. I saw the questions as two decoupled ones.

13:27 aaelony: hyPiRion: thanks anyways. yeah I have a jar I am running that I'd like to profile. I have an evaluation license for yourkit and trying to get it to analyze my jar.. Youkit's docs say I should do this: java -jar yjp-controller-api-redist.jar localhost 10001 capture-memory-snapshot but unsure what host and port and how it knows to analyze the uberjar running...

13:28 http://www.yourkit.com/docs/12/help/command_line_tool.jsp

13:31 owengalenjones: a few minutes late, what's wrong with cons?

13:31 technomancy: this is pretty sweet: http://schneems.com/post/42508340989/open-source-in-your-inbox-code-triage

13:32 owengalenjones: nothing apart from the fact that allocating memory is often at odds with performance

13:33 nobody should be following the litany against cons unless they're neck-deep in profiling =D

13:35 owengalenjones: ok, heh hadnt seen that before and was curious

13:35 technomancy: it's mostly an excuse to quote Dune I guess?

13:36 desertmonad: the litany against fear got me through some final exams in years past :)

13:38 Sgeo: Huh. So that's where "politics is the mind-killer" came from, I guess

13:38 Dune reference

13:41 desertmonad: Dune is one of my all time favorites. That and Neuromancer.

13:41 technomancy: the bot's gotta have some neuromancer quotations in there somewhere, but I can't think of any off the top of my head

13:42 gtrak: isn't cons pretty obvious? cache-thrashing... java programmers know arraylist is generally always faster than linkedlist

13:44 nishant: Hi! Is there a way to comp a function with itself n times? Something with this behavior - (f(inc, 5), 0) => 5 ?

13:44 gtrak: iterate?

13:44 technomancy: ,((apply comp (repeat 5 inc)) 0)

13:44 nishant: Iterate almost works, except it returns a seq of all the intermediate results too

13:44 clojurebot: 5

13:44 gtrak: ,(doc iterate)

13:44 clojurebot: "([f x]); Returns a lazy sequence of x, (f x), (f (f x)) etc. f must be free of side-effects"

13:45 owengalenjones: IANA java progrrammer

13:45 AimHere: (nth #(iterate inc 0) 5)

13:45 ,(nth #(iterate inc 0) 5)

13:45 clojurebot: #<UnsupportedOperationException java.lang.UnsupportedOperationException: nth not supported on this type: sandbox$eval77$fn__78>

13:45 gtrak: nishant: it's lazy, don't keep the head

13:45 nishant: Ah, thanks!

13:45 AimHere: Oops

13:45 gtrak: ,(nth (iterate inc 0) 5)

13:45 clojurebot: 5

13:46 gtrak: not sure why returning a seq would be anything other than convenient

13:46 technomancy: clojurebot: oinc

13:46 clojurebot: oinc is octo-inc: (apply comp (take 8 (repeat inc)))

13:46 technomancy: hm; that must predate repeat's second arity

13:48 dnolen: `fogus: ping

13:49 brainproxy: I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me.

13:49 * brainproxy recites that and takes a deep breath before working on protocol-monads source code

13:57 ln2: I am trying to re-write one of the Clojure Koans from section 8. What is going on here? Haha

13:57 http://tny.cz/6ad1b8bc

13:58 gtrak: ln2: you need to return an accumulator

13:58 (reduce (fn [acc next-element] do-something-to-acc) source-seq)

13:59 ln2: "source-seq" is the accumulator?

13:59 gtrak: acc

13:59 ln2: Sorry for all of the questions! You guys have been a massive help. =D

13:59 gtrak: that's just kinda what reduce does :-)

14:00 ln2: The Koans are amazing but I wish there was a detailed explanation of each problem somewhere. Not a cheat sheet but just some information. xD

14:01 gtrak: well, the doc for reduce is helpful ##(doc reduce)

14:01 lazybot: ⇒ "([f coll] [f val coll]); f should be a function of 2 arguments. If val is not supplied, returns the result of applying f to the first 2 items in coll, then applying f to that result and the 3rd item, etc. If coll contains no items, f must accept no arguments a... https://www.refheap.com/paste/11004

14:05 ln2: If I wanted to make this two functions then I could create one that takes an input and does a reduce with an acc. Then call that function from another function that checks if one word is larger than another?

14:10 *crickets*

14:11 gtrak: it is two functions, whether they're both bound to a vars or not

14:12 but I think what you described seems inverted

14:12 TimMc: &(reduce (fn [accum next-thing] (str accum ", " next-thing)) "0" [1 2 3 4])

14:12 gtrak: reduce is the control-flow, it's calling the aggregator or whatever you wanna call it

14:12 lazybot: ⇒ "0, 1, 2, 3, 4"

14:17 ln2: Thanks a lot guys! I think I'm managing to figure it out through trial and error. I'm not sure this would be possible without a REPL. Haha

14:17 jimduey: brainproxy: LOL

14:17 ln2: I have it reduced to a "key must be an integer" error. Hmm.

14:17 To google!

14:18 amalloy: ln2: you're attempting to call a vector as a function, and passing it a non-integer

14:19 ln2: amalloy: I think I'm trying to pass a vector TO a function. I wonder how I managed to pass it AS a function. O.o

14:21 TimMc: ,([:a :b :c] 0)

14:21 clojurebot: :a

14:27 ln2: Alright I think my problem is that I have two functions "lengthycheck" which uses the if statement to determine which is longer (a or b). "lengthyness" uses the reduce function. The values a and b are being passed to "lengthyness" but not to "lengthycheck". I need to read more about embedding functions. =(

14:37 dnolen: lynaghk: ping

14:49 ln2: TimMc: I had my first extremely minor programming victory. I turned your expression into a function!

14:49 (defn first-in-list [a]

14:49 ('[a] 0))

14:49 amalloy: errrrr, that always returns the symbol 'a, ln2, ignoring its input

14:50 ln2: CRAP!

14:50 TimMc: What you probably want is `first`.

14:51 amalloy: TimMc: really? it looks to me like he was writing identity

14:51 ln2: TimMc: I can't just express the function in the same simple way? ([:a :b :c] 0) ?

14:51 TimMc: amalloy: Not with the name "first-in-list".

14:51 amalloy: oh

14:52 TimMc: ln2: (fn [a] (a 0)), which works if a is a vector

14:52 amalloy: i never read function names. easier to just run them on all possible inputs in my head, observe the outputs, and derive the function's meaning thereby

14:53 ln2: TimMc: Holy sh* that did it! My function was calling [a] the vector and not a the value. Thanks!

14:53 svedubois: How I can write these 2 lines:

14:53 (show image1)

14:53 (show image2)

14:53 in only 1 line?

14:53 (show image1 image2)

14:54 ln2: This has the behavior I was looking for.

14:54 (defn first-in-list [a]

14:54 (a 0))

14:54 Thanks guys! I'm not as proud now though because Tim solved it for me. =(

14:54 rasmusto: ln2: ,(first [1 2 3])

14:55 ln2: rasmusto: I figured that there was an easier way to do this. I am just trying to understand the language so I'm rebuilding various expressions as functions. Thank you though!

14:55 rasmusto: ,(first [1 2 3])

14:55 clojurebot: 1

14:55 Guest14889: i saw recently there is a server specially for clojure, forgot the name

14:56 can anyone help?

14:56 ln2: In a lot of ways it is like lamda calc. Even the most basic operations has to be reduced to logic. Instead of calling + or * you need an expression.

14:56 joegallo: Guest14889: immutatnt

14:56 rasmusto: ln2: first/rest are interesting because they work on more than just one type of sequence. They'll work on vectors, maps, seqs, etc.

14:56 Guest14889: what wevserver do people commonly deploy to?

14:56 joegallo: typo

14:56 immutant

14:56 Guest14889: joegallo: thats the one, thanks

14:56 technomancy: jetty is the most common

14:57 but immutant can be good if you need to integrate into certain environments

14:57 ln2: rasmusto: I know about rest from the Koans problems. I'm going to write a basic rest function manually right now. =)

14:57 Guest14889: im open to anything, i want to deploy it on a new vps

14:58 amalloy: ln2: you can't really write first or rest without in fact using first and rest. they're the primitives of sequence manipulation

14:58 Guest14889: i'd probably go with jetty unless immutant offered significant benefits

14:58 technomancy: jetty is the simplest

14:59 amalloy: you can write versions that only work on vectors, as you did for first, but it's not very useful even as an exercise

14:59 akhudek: immutant is a lot more than just a web server. You may or may not need the extra features it has. Jetty is good for a straight forward web server.

15:00 ln2: amalloy: This function does not always return the first character?

15:00 (defn first-in-list [a]

15:00 (a 0))

15:00 amalloy: try it with (list 1 2 3)

15:00 Guest14889: also, is pallet the favourite for automated deployments? or do people generally use a non-clojure tool?

15:00 ln2: (first-in-list [:a :b :c]) returns :a for me

15:01 Guest14889: if anyone has any simple pallet scripts that deploy a basic app on jetty/immutant i'd be interested i seeing one

15:01 technomancy: Guest14889: pallet is a bit less polished than other tools, but the underlying models it uses are much, much better-designed.

15:01 rasmusto: ,(get '(1 2 3) 0)

15:01 clojurebot: nil

15:02 Guest14889: technomancy: interesting, i'll probably give it a try at least

15:02 maybe i can help polish it

15:02 amalloy: ln2: so, you're saying you did not do what i suggested and try (first-in-list (list 1 2 3))

15:03 the-kenny: (list 1 2 3) is doesn't implement the same interfaces as [1 2 3]

15:04 ln2: amalloy: That fails. But "(first-in-list [1 2 3])" succeeds.

15:04 amalloy: as i said, you invented a solution that works only for vectors

15:04 technomancy: Guest14889: I'm sure they'd appreciate feedback and help. they were very responsive when I had questions.

15:05 ln2: amalloy: Interesting.

15:05 llasram: &((fn [[x]] x) (list 1 2 3))

15:05 lazybot: ⇒ 1

15:05 llasram: Hehe

15:05 ln2: amalloy: However. Rest is possible with only vectors also correct? I need to use increment?

15:05 nDuff: Hugo _is_ responsive. On the other hand, the amount of ground Pallet needed to make up to cover a lot of my use cases when last evaluated was pretty overwhelming.

15:06 Then again, if I were amenable to a nuke-and-pave cloud deployment model, that wouldn't so much be the case.

15:06 (and it's been a long time since I took a close look)

15:07 hyPiRion: ln2: rest is possible with anything you can do `seq` on and return a sequence

15:07 hugod: nDuff: if you want incremental edits of config files, that's a hard problem

15:08 hyPiRion: ,(seq (list 1 2 3 4))

15:08 clojurebot: (1 2 3 4)

15:08 hyPiRion: ,(seq (vector 1 2 3 4))

15:08 clojurebot: (1 2 3 4)

15:08 hyPiRion: ,(seq (hash-map 1 2 3 4)) ;; Don't worry about this for now, just be aware of it

15:08 clojurebot: ([1 2] [3 4])

15:08 hugod: nDuff: or was it something else you needed?

15:09 ln2: Rest is more difficult because apparently this is impossible.

15:09 (defn rest-of-list [a]

15:09 (a (> 0))

15:10 nDuff: hugod: Not so much editing _files_ incrementally as configurations which could span multiple files / be determined only by invocation of queries or commands (example: Determining an edit list of invocations of vendor-provided tools to move from current state to desired configuration)

15:10 ln2: hyPiRion: Just noticed your response. Yes I think I do need a sequence. =)

15:10 technomancy: ln2: interesting idea. for that to work, a would have to take a predicate on the index of the element, you could do it like so: (a (partial > 0))

15:11 the-kenny: Reminds me bit of logic programming

15:11 nDuff: hugod: ...it's not an easy problem, granted, which is why I spent so much of my time a few jobs ago working on toolage to tackle it.

15:11 hugod: nDuff: so updating based on querying the current system status?

15:12 nDuff: *nod*.

15:12 hugod: ok, 0.8 should be much better at that

15:13 you can use the return values of actions in flow control, etc

15:13 nDuff: Nice. I'll definitely need to reevaluate, then.

15:13 hugod: should be released before clojure/west, I hope

15:14 ln2: technomancy: I'm still getting a "key must be an integer" exception. =(

15:14 technomancy: ln2: oh, I didn't mean that would work; I meant if vectors took predicates it would work.

15:15 ln2: Hahaha!

15:15 technomancy: I was noting that your assumption it did was interesting from an API design point of view.

15:15 ln2: technomancy: Well thank you very much. I try to be interesting. ;)

15:16 technomancy: I'm determined to get this to work. I'm pretty sure I need to create a sequence to index the input data and ignore the first entry?

15:17 technomancy: there are a bunch of ways you could do it; that's a decent place to start.

15:18 assuming you have a vector, anyway

15:18 ln2: technomancy: A bunch of ways huh? Well you really know how to make someone feel smart. ; )

15:19 technomancy: ln2: well, think of it as an artistic expression more than a puzzle.

15:20 ln2: technomancy: Now I feel a ton better! If I fail I'm simply not artistic. xD

15:21 nDuff: ln2: One easy way to do that (without the obvious thing of using first, of course) would be destructuring.

15:21 technomancy: heh; I was restraining myself from saying that =)

15:22 let him get it working this way first so he'll appreciate that more =)

15:22 lynaghk: dnolen: pong

15:22 dnolen: I just saw your core.logic push on github. Looking forward to checking it out---might be able to this afternoon

15:22 hyPiRion: ln2: You're looking at it wrong. You're unfamiliar with the paintbrush you use. In fact, you're unfamiliar with anything which involves paint. It's not about being artistic or not, it's about knowing the details of the paintbrush.

15:22 lynaghk: finally back in Portland

15:22 dnolen: lynaghk: some significant changes to simple unifier in master

15:23 TimMc: technomancy: And then I can show ln2 the swearjure approach to rest, and we can *all* appreciate the standard way more. :-P

15:23 dnolen: lynaghk: only thing left to do is to distinguish vector & sets of symbols -> constraints

15:24 lynaghk: dnolen: awesome. I'll take things around for a spin and if I'm feeling lucky I'll take a crack at the vector+sets constraints

15:24 ln2: hyPiRion: I think that is pretty much right. Compared to actual painting I'm accomplishing what amounts to a poorly drawn stick figure. Only been programming for 4 days!

15:24 nDuff: Thank you for the suggestion! I will do it that way after I figure out another way of doing it first. =)

15:24 jsabeaudry: What are the popular choices for doing parameter validation on your rest api?

15:25 hyPiRion: TimMc: yeah, I used a similar version of your rest to get quicksort working. It's not really quicksort though, since it's O(n^3) when the seq is already sorted.

15:25 But if we assume rest is constant time, it's quicksort :)

15:28 TimMc: :-P

15:28 DerGuteMoritz: hello, I think I found a bug in clojurescript's core.cljs which requires a one-line fix. I haven't got a CA, yet, nor do I intend to get one right now. does anyone here care about it and wants to submit it as their own patch perhaps?

15:28 lynaghk: DerGuteMoritz: what is it?

15:29 DerGuteMoritz: lynaghk: I think the if-not in https://github.com/clojure/clojurescript/blob/master/src/cljs/cljs/core.cljs#L4428 is missing an else branch

15:29 with a (recur (inc i) init) call

15:30 I may be mistaken though!

15:31 hm, maybe I should take this opportunity and do the CA dance once and for all

15:31 lynaghk: DerGuteMoritz: How did you come across this? If you're just reading core.cljs for fun, then yeah, you should totally get a CA = )

15:32 hyPiRion: ^ +1

15:32 DerGuteMoritz: lynaghk: I am actually porting PersistentHashMap to Scheme right now hehehe

15:32 ok I shall, then

15:32 lynaghk: DerGuteMoritz: ah. Yeah, I don't know enough about the internals to say if that's a bug or if someone used if-not when they meant when-not

15:32 amalloy: DerGuteMoritz: i wouldn't be surprised if this code is correct, though i'm not familiar with the internals

15:33 ie, it seems unlikely to me that there would be a nil node followed by a non-nil node

15:33 DerGuteMoritz: let's see

15:33 well

15:33 but the correct thing to return then would be init, then, wouldn't it?

15:33 hyPiRion: A repro case is usually sweet to have.

15:33 DerGuteMoritz: yeah, I agree, that would be best

15:34 I will follow the code path completely again, maybe I overlooked something

15:34 amalloy: good point

15:34 TimMc: It could be a masked bug, i.e., not actually demonstrable until some other code changes and reveals it.

15:36 DerGuteMoritz: TimMc: yeah might be!

15:41 amalloy: for the record: empircally it seems to be possible that an ArrayNode has gaps

15:41 TimMc: That expression really points to the need for a let-loop-if-let-if-let-if macro.

15:42 DerGuteMoritz: absolutely

15:42 so this CA means I assign the copyright of contributions to Rich?

15:44 amalloy: DerGuteMoritz: you give him joint copyright, which is basically permission to do whatever he wants with it

15:44 DerGuteMoritz: ah yes, I just read the text

15:45 hyPiRion: DerGuteMoritz: It's there so that you cannot submit a patch, get it accepted and sue afterwards if you have a patent on the thing you submitted. IIRC.

15:45 ln2: (defn rest-of-vector [a]

15:45 (subvec a 1))

15:45 hyPiRion: Though don't quote me on that.

15:45 ln2: 8)

15:46 amalloy: hyPiRion: that is the main reason it exists, yes

15:46 TimMc: hyPiRion: Also for relicensing.

15:46 jsabeaudry: out of curiosity, why don't I need a CA for contributing to the linux kernel?

15:46 DerGuteMoritz: hmmm so does that mean we could lose clojure completely if Rich decides to go proprietary? :-)

15:46 TimMc: Nah.

15:47 amalloy: DerGuteMoritz: no, because he's already licensed existing versions of it

15:47 you could lose access to his latest and greatest new ideas if he decides not to share them with you, but that's hardly unusual

15:47 TimMc: In short, it would create a fork.

15:47 hyPiRion: amalloy: You won't lose access, you wouldn't get them to begin with.

15:48 DerGuteMoritz: ah, so it can't be used to change the past, good :-)

15:48 ln2: Is there any alternative to his database that is open source?

15:48 ^Datomic

15:48 ravster: hello all

15:48 amalloy: ln2: postgres

15:48 DerGuteMoritz: ok guys, I gotta leave for a bit, I'll get back to you later when I know more about the possible bug

15:48 thanks for your feedback so far!

15:48 amalloy: mongodb. millions of open-source alternative databases. i realize this doesn't answer the question you meant to ask, but it's kinda a silly question :P

15:48 ln2: amalloy: Is it possible to mimic the same ideas with postgres? An accumulating data structure with timestamps ect?

15:49 amalloy: I was under the assumption that Datomic was unique.

15:49 ravster: Hello. =)

15:49 amalloy: *shrug* everything is unique

15:49 dnolen: DerGuteMoritz: that's one for Michal Marcyk to look at, if you open an issue and assign it to him he will probably respond pretty quickly.

15:49 ln2: amalloy: I was under the assumption that Datomic had capabilities that other databases didn't have?

15:49 amalloy: if you've been programming for four days i'd save worrying about datomic's licensing for later

15:50 gtrak: ln2: you can run datomic on postgres if you like.. what do you mean by possible to mimic the same ideas?

15:50 hyPiRion: ln2: Well, he has explained how Datomic works, so it's possible to create an open version of it.

15:52 ln2: amalloy: Understandable. The reason I'm drawn to Clojure is because I agree with the basic concepts. Even with programming for two weeks I think it's reasonable to start working with databases. No point in working with databases that don't agree with the basic concepts of the langauge. =)

15:52 DerGuteMoritz: dnolen: I can't open an issue without having signed the CA though, right?

15:52 hyPiRion: DerGuteMoritz: You can.

15:52 dnolen: DerGuteMoritz: anyone can open an issue

15:52 DerGuteMoritz: ah, cool, then I misunderstood that part

15:53 ln2: hyPiRion: That is what I was getting at. I understand that Datomic ultimately uses other databases as raw data stores. But the way that it places and organizes that data is unique (time based, imutable, ect.).

15:53 DerGuteMoritz: then I shall do that, thansk!

15:53 afk now for real :-)

15:53 hyPiRion: ln2: It unique in this moment, yes :)

15:54 ln2: gtrak: Yes. More along the lines of "Have those ideas been copied yet". It looks like the answer is no unfortunately.

15:55 gtrak: 'a particular set of design tradeoffs', anything can do anything if you try hard enough

15:56 ln2: I wish I was a more competent programmer. I would help implement FreeTomic. ; )

15:57 It's unfortunate that Rich didn't kickstart Datomic, open source it and profit from support and solutions.

15:58 hyPiRion: Is there something missing from this or will this actually rest any vector?

15:58 (defn rest-of-vector [a]

15:58 (subvec a 1))

16:01 hyPiRion: ln2: It will indeed rest any vector.

16:01 ln2: hyPiRion: Sweet! I ran a bunch of tests but I wasn't sure if I had missed something stupid / obvious.

16:01 hyPiRion: Well, it won't return a seq, but it will return a collection without the first element

16:02 oh right, we may have an odditiy.

16:02 ,(subvec [] 1)

16:02 clojurebot: #<IndexOutOfBoundsException java.lang.IndexOutOfBoundsException>

16:02 hyPiRion: Yeah, you need to handle that case.

16:02 ln2: An empty vector.....

16:02 TimMc: &(pop [])

16:02 lazybot: java.lang.IllegalStateException: Can't pop empty vector

16:02 hyPiRion: ,(rest [])

16:02 clojurebot: ()

16:03 ln2: & is an anonymous function?

16:03 lazybot: java.lang.RuntimeException: Unable to resolve symbol: is in this context

16:03 TimMc: ln2: No, & is lazybot's eval trigger.

16:03 ln2: Rest also fails against an empty vector? Interesting.

16:03 amalloy: hyPiRion: he only needs to handle that case if it's part of the function's contract, and he's making it up himself

16:03 TimMc: ln2: What do you mean by "fails"?

16:04 ln2: ,(rest [])

16:04 clojurebot: ()

16:04 hyPiRion: ln2: Doesn't fail, it returns ().

16:04 Raynes: That isn't failure.

16:04 There is no rest of nothing.

16:04 ln2: I see it. Read the responses in the wrong order. =)

16:04 amalloy: there *ain't no rest of nothing

16:04 TimMc: heh

16:04 holo: hi

16:05 ln2: amalloy: Interesting. I'm trying to understand contracts. It really just means the "purpose" of the function as defined by me?

16:05 amalloy: yes

16:06 ln2: amalloy: If that purpose never involved empty vectors then theres no problem. I am still curious enough to try and fix that case.

16:07 gtrak: maybe being broken on empty it is part of the contract, conveniently, since that's what it does

16:07 ravster: cemerick: in 'friend', does the users data have to be a map of stuff that has username as a key and in the map itself?

16:08 ln2: gtrak: Maybe I just need to find a more productive problem to solve now that I *mostly* solved that one. Haha

16:09 holo: in korma, when a defentity users has-one email, this singular name "email" refers to a defentity email? or does it follow a plural names convention and it refers to defentity emails?

16:11 cemerick: ravster: maps are just convenient credential fns; see https://github.com/cemerick/friend/#credential-functions-and-authentication-maps

16:13 ln2: I tried a google on this one but can't seem to figure it out. What is the difference between the values 1 and :1?

16:13 Int vs Str?

16:13 jsabeaudry: Is validateur the defacto standard for parameter validation in a rest webapp ?

16:13 amalloy: jsabeaudry: no such standard has arisen yet

16:14 jsabeaudry: amalloy, what are the other top dogs?

16:15 amalloy: hell if i know. i just validate stuff by hand

16:15 Raynes: amalloy, jsabeaudry: lib-noir has a tiny validation thingy that I've never used and have nothing to do with.

16:17 ravster: cemerick: thanks

16:19 ppppaul: weavejester, you here?

16:20 SurlyFrog: Has anyone ever gotten a `ClassNotFoundException org.apache.http.impl.conn.PoolingClientConnectionManager` when trying to require clj-http.client ?

16:20 craigbro: nope

16:20 however, if it was working previously...

16:20 amalloy: i'm guessing at least one person has

16:20 craigbro: sometimes rming target helps clean up confusion about deps

16:21 SurlyFrog: I'll try that

16:21 craigbro: gets me alot when switching between branches of a project that has different deps on different branches

16:21 holo: jsabeaudry, i think i lost several days trying and making market study with many of the validation solutions, only to end up rolling my own validation module. I still use the lib-noir email validation e.g., but i don't use it's stateful errors

16:22 weavejester: ppppaul: Yep

16:22 callenbot: Raynes: we need to talk.

16:22 ppppaul: what would be the easiest way to deal with having singular and pluralized routes map to the same fn?

16:22 callenbot: Raynes: but first: http://www.youtube.com/watch?v=7tOo2OMUhB8

16:23 weavejester: ppppaul: What do you mean?

16:23 callenbot: ppppaul: what like "/page/:id" and "/pages/:id" ?

16:23 ppppaul: yup

16:23 callenbot: weavejester: exercise a little imagination mate :)

16:23 weavejester: callenbot: Yes, but why would that be a problem?

16:24 Raynes: callenbot: Talk

16:24 callenbot: Raynes: what's the deal with signed cookies in lib noir?

16:24 Raynes: callenbot: EH?

16:24 SurlyFrog: removing target didn't help

16:24 jsabeaudry: holo, Interesting, what made you reject the libraries you found?

16:24 callenbot: Raynes: you can see the values.

16:24 Raynes: it's key and key__s or whatever

16:24 gtrak: validateur seems to me no better than apply

16:24 callenbot: Raynes: and it just nukes the k/v pair if the __s doesn't match the value

16:25 Raynes: callenbot: I didn't write that, so *shrug*.

16:25 I guess ibdknox likes broken shit?

16:25 callenbot: Raynes: balls. Enjoy the Misty Mountain Cold anyway. who do I harass?

16:25 oh this is his fault?

16:25 I'd better write a patch.

16:25 Raynes: Well, ibdknox wrote it but he won't be able to fix it.

16:25 callenbot: I know, that's why I realized I have to write it

16:25 * callenbot curses under breath

16:26 Raynes: I'd take a patch to fix it, but I don't have time to do so myself anytime soon, especially since I don't know squat about cookies.

16:26 gtrak: "(numericality-of :age :even true)" I mean seriously? how about (even? x)

16:26 callenbot: Raynes: they're a sticking point / bugbear of mine. I'll fix it.

16:26 weavejester: ppppaul: Could you explain why plural vs. singular would be a problem?

16:26 And for that matter, why you'd want it.

16:26 callenbot: weavejester: legacy URL compatibility?

16:26 ppppaul: it's not a problem. i'm just wondering how i would deal with this in as little code as possible

16:27 callenbot: weavejester: unless there's a legitimate x-y problem going on, it's usually a waste of time to pushback on peoples' stated needs. Sometimes they don't have a choice.

16:27 weavejester: ppppaul: Well, there's https://github.com/r0man/inflections-clj

16:27 ppppaul: legacy URL compatability is actually what i would like to deal with

16:27 weavejester: callenbot: Getting more information about the cause of the issue is almost never a bad idea.

16:28 callenbot: weavejester: maybe so but I've had a lot of bad experiences with time wasted questioning needs and having to re-explain an irrelevant use-case over and over.

16:28 ppppaul: in many cases in my app singular and plural don't have meaning for the api

16:28 holo: jsabeaudry, some were hard to understand, others did too much, and all of them (obviously) assumed i had to specify what kind of validation to run against each field. because i had to change constraints in the db, and repeat the process in the code, i built my own constraint map extracted from the db

16:29 rasmusto: hyPiRion: thanks for the leiningen patch (`lein clean`)

16:30 technomancy: ln2: for the record, clojars uses a data store that has the same assumptions of immutability and append-only as datomic, but since the data set is small (and not distributed) it's much easier to implement.

16:30 oops

16:31 weavejester: callenbot: I've mostly had the opposite problem. Asking one or two questions before leaping to answer a problem is often a sound idea, and usually doesn't take up much time.

16:31 holo: jsabeaudry, i also use conventions of my own extracted from the database (but not constraints) to validate for errors that are not available from constraints. e.g. validate for email when a field's name has *email* in the name

16:31 ppppaul: thanks for the link weavejester, however i'm talking about matching routes. do i have to duplicate my routes then? clout can't handle something like what i'm asking for?

16:32 callenbot: weavejester: fair. also if I'm first person to notice the sucky cookies implementation then how have you been doing auth/saved-signin all this time?

16:32 gfredericks: what kind of storage does datomic free use? some opaque internal thing?

16:33 hiredman: gfredericks: looks like hsql

16:33 gfredericks: but that is just a guess since I'g gotten hsql exceptions from broken datoic free setups

16:33 desertmonad: so is it "day-tom-ic" or "duh-tom-ic"?

16:33 weavejester: ppppaul: Hum. You could look for directory paths in the path and setup some regular expression to match both parts.

16:33 callenbot: Sucky cookies implementation?

16:34 callenbot: What do you mean?

16:34 ppppaul: Or… maybe a "normalize route" middleware.

16:35 ppppaul: Split a route up by /, then pluralize any singular words.

16:35 gfredericks: hiredman: cool thanks

16:35 callenbot: weavejester: signed cookies in lib-noir upsets me :)

16:35 gfredericks: desertmonad: this is english, so yes

16:36 jsabeaudry: holo, I see, do you remember the names of the better ones you considered? (besides validateur and lib-noir)

16:36 weavejester: callenbot: I hadn't seen that before. I don't have a lot of interation with lib-noir.

16:37 What's the purpose of put-signed?

16:37 callenbot: weavejester: okay fine but that wasn't my question

16:37 weavejester: I was asking you how you kept users logged in

16:37 weavejester: callenbot: With cookies? I'm not sure I understand the question.

16:37 callenbot: weavejester: you do use cookies?

16:38 weavejester: callenbot: Yes, but not lib-noir.

16:38 callenbot: weavejester: what do you save, an id or something? How do you keep them from tampering with the cookie?

16:38 are you signing them yourself?

16:39 weavejester: callenbot: It depends. Ring has several different cookie stores. The most common mechanism is to generate a UUID and link that to a database value that contains session data.

16:39 amalloy: callenbot: everyone just sends the user an id, and keeps the real data server-side somewhere

16:39 callenbot: amalloy: a db-backed session id?

16:39 weavejester: callenbot: But Ring also has a cookie-store implementation that encrypts the session data with AES and HMACs it with a secret key.

16:39 ppppaul: weavejester, i think i'll use multiple contexts with inflections-clj that point to the same route

16:39 callenbot: weavejester: wait wait, where's this cookie-store implementation?

16:39 holo: jsabeaudry, i can't precise it now after so much time, but it's safer to go to clojuresphere.com and check how many projects are using foo and bar validation libs. if no one is using it, suspect something is wrong with the lib :)

16:40 callenbot: weavejester: that's what I need. is something that hides the kv pairs.

16:40 weavejester: callenbot: https://github.com/ring-clojure/ring/blob/master/ring-core/src/ring/middleware/session/cookie.clj

16:40 callenbot: I don't like db-backed session stores.

16:40 weavejester: callenbot: Also read: https://github.com/ring-clojure/ring/wiki/Sessions

16:40 I believe lib-noir has a stateful session implementation based on top of Ring's sessions.

16:41 hyPiRion: rasmusto: Oh, you're welcome :)

16:42 jsabeaudry: holo, oh wow thanks, I didn't know about clojuresphere

16:42 technomancy: hyPiRion has been on fire recently =)

16:42 weavejester: callenbot: (wrap-session handler {:store (cookie-store secret-key)})

16:42 callenbot: weavejester: yeah I see it. I'm pondering how to make the wrapping work with my template rendering

16:42 holo: jsabeaudry, you're welcome

16:42 callenbot: weavejester: thanks for the pointer, it's much appreciated.

16:43 technomancy: http://www.generationgamerz.com/images/post/361/nbaj_02.jpg

16:43 rasmusto: technomancy: that symlink? code seems like it should exist somewhere else, are symlinks just not used frequently in clojure projects? (my case may have been special)

16:43 weavejester: callenbot: No problem. You can take the session data out and put it into a binding, of course. And lib-noir provides stateful session functions.

16:43 callenbot: technomancy: damn dude, now I want to play that.

16:44 gtrak: technomancy: sb3j3c2 nyhkhbs is a cheat-code for some reason I can never forget. haven't played in 13 years.

16:44 holo: jsabeaudry, i would gladly provide you my module, but unfortunately it has too much code smell, and is coupled with database details

16:44 weavejester: So you could write: (wrap-noir-session handler {:store (cookie-store …)})

16:44 callenbot: weavejester: I don't like the stateful session stuff in lib-noir. I have my own cookie and request context stuff floating around

16:44 weavejester: And then (noir.session/get "foo")

16:44 (noir.session/put! "foo" "bar")

16:45 technomancy: rasmusto: it'd be nice if it were in clojure.java.io, but it's small enough that it's probably not worth the effort that would take

16:45 weavejester: Behind the scenes it uses an atom that exists for the duration of the request.

16:45 I usually prefer a more functional approach, however.

16:46 TimMc: hyPiRion: Nice solution.

16:46 callenbot: weavejester: I have my own atom thing I'm using that does that.

16:46 hyPiRion: TimMc: Chinese wall of Apache Commons solution, praise them.

16:46 holo: weavejester, are you able to sanely not use session state?

16:47 rasmusto: technomancy: understood

16:48 TimMc: hyPiRion: I was trying to work something like that out yesterday. I didn't think of taking the canonical parent and sticking the last path element back on.

16:48 weavejester: holo: I just use session state for holding the user ID.

16:48 holo: I've never needed anything more.

16:49 callenbot: weavejester: I do the same thing.

16:49 weavejester: I do need a RequestContext thingamajig to keep from getting pissed off though.

16:49 hyPiRion: TimMc: Well, now you know that trick!

16:49 gtrak: how do you expire a cookiestore session without another store?

16:49 weavejester: callenbot: Did you implement that?

16:50 gtrak: Cookies have their own expiration mechanism.

16:50 holo: weavejester, amazing! after some unsuccessful refactorings, i came with the same conclusion (yesterday) - just store the user ID

16:50 hyPiRion: To be fair, I was hoping for a cleaner solution, but the "Java on all platforms" kind of breaks down when you're dealing with system specific things.

16:50 gtrak: ah, tell the browser to expire it and hope it complies

16:51 weavejester: gtrak: Well, if you want to be certain about it, you can set an internal timestamp and check it.

16:51 TimMc: hyPiRion: "Runs on all platforms" is like "it's Turing complete!".

16:52 callenbot: weavejester: yes but it's not an original idea. I based it on Django/Flask RequestContext and data lifecycles

16:52 gtrak: ah

16:52 holo: weavejester, ok, that's a lie. i actually store the username too, but the ID is the most important since it's reliable cause it never changes

16:52 weavejester: holo: I can't really think of anything else you'd want to store. People give examples like shopping baskets and such, but they're usually better implemented as resources on the server.

16:52 callenbot: weavejester: I implemented it myself because none of the people who hadn't used Python before had any idea what the hell I was talking about.

16:53 weavejester: callenbot: I'd encourage you to release it as middleware, if you have time.

16:53 callenbot: weavejester: you people will hiss at me because it's not functional.

16:54 rbarraud: You people?! <ninja_pose> (Me, myself and Irene) :-/

16:54 holo: weavester, i store the username, cause every page salutes the user >.> .. i thought it would be slugish to make a query on every page change hehe.. and it's not a big deal if the username is not up to date with the db for this purpose

16:54 rbarraud: Rofl

16:54 technomancy: we wouldn't do that

16:54 we have bots to do the hissing for us now

16:54 TimMc: $hiss

16:54 :-(

16:54 rasmusto: clojurebot: hiss

16:54 clojurebot: Gabh mo leithscéal?

16:54 callenbot: technomancy: :D (btw, I was talking to me best friend who also moved to Cali about Seattle. He might follow me there if I move)

16:54 TimMc: clojurebot: boo is <reply>hiss

16:54 clojurebot: In Ordnung

16:55 weavejester: callenbot: Sometimes one has to depart from pure functional code, but pure functions are very nice to work with.

16:55 rbarraud: Clojurebot: rant

16:55 weavejester: holo: Caching the username seems reasonable.

16:55 callenbot: weavejester: alright I'll do it. Do you use lib-noir?

16:55 rbarraud: Fail...

16:55 weavejester: callenbot: Nope.

16:56 callenbot: weavejester: you said you didn't right? okay.

16:56 I'll try to keep it ring-only then.

16:56 TimMc: clojurebot: rant is http://www.ccs.neu.edu/home/shivers/rants/

16:56 clojurebot: You don't have to tell me twice.

16:56 rasmusto: clojurebot: rant

16:56 clojurebot: rant is http://www.ccs.neu.edu/home/shivers/rants/

16:56 weavejester: callenbot: I'm not advocating avoiding lib-noir. If it's useful, by all means, use it :)

16:57 But lib-noir tends to advocate a slightly less functional approach than Ring.

16:57 callenbot: weavejester: I'm just saying that I'll strive for reusability and composability.

16:57 weavejester: callenbot: I'm all for that :)

16:57 abp: callenbot: That's need a (def (atom ..)) per namespace!

16:57 weavejester: Which reminds me...

16:57 rbarraud: clojurebot: rant

16:57 clojurebot: rant is http://www.ccs.neu.edu/home/shivers/rants/

16:58 weavejester: I need to release crypto-password

16:58 callenbot: abp: what?

16:59 abp: yea the sentence was f**d up

16:59 callenbot: abp: wat

17:00 abp: callenbot: For reusability and composability you need at least one (def x (atom ...)) per namespace. :P

17:00 gtrak: I thought the point of dynamic binding was that it wasn't composable?

17:00 callenbot: abp: no I don't

17:00 abp: my thingy works fine.

17:01 abp: I were joking.

17:01 callenbot: I use it to shoot stuff from pre-processing middleware to the templates.

17:01 abp: I don't have a sense of humor.

17:02 abp: And I shouldn't do jokes based on my opinions in a technical irc-channel, probably.

17:02 holo: callenbot, i find the defpages from noir really sweet

17:02 callenbot: holo: I don't do webapps that way.

17:02 holo: most of my web work is collaborative/team based

17:03 aka I'm working with a frontend guy...that doesn't know Clojure.

17:03 gtrak: Vars shouldn't be in libraries. I hate it when people make assumptions about lifecycles for me.

17:03 abp: So no hiccup for you?

17:03 callenbot: gtrak: so don't use it. boohoo.

17:04 gtrak: I need it and so do a lot of web apps.

17:04 hyPiRion: callenbot: The obvious solution is to learn them Clojure.

17:04 callenbot: gtrak: it's just ring middleware.

17:04 hyPiRion: we don't want to repeat this conversation.

17:04 hyPiRion: I've been working and running teams long enough to know what's in the cards and what ain't

17:04 gtrak: callenbot: just saying, vars are more useful for an application... and not talking about you specifically, other libs have the same problem

17:04 callenbot: hyPiRion: guess what? it ain't in the fucking cards.

17:05 gtrak: well I need a way to shoot data around the handlers. so blah.

17:05 abp: callenbot: That can't be put into the request-map?

17:05 gtrak: yes, I actually like vars more than most of my colleagues, just at the top

17:05 weavejester: gtrak: You mean like with-connection or something?

17:06 gtrak: weavejester: I think so?

17:06 callenbot: abp: hrm. I just got an idea.

17:07 TimMc: &(format "%02x" (int \#))

17:07 lazybot: ⇒ "23"

17:07 gtrak: weavejester: yea. I prefer to write extra glue than do surgery on a namespace

17:07 brianwong: (for [x (range 4)] (println x))

17:07 abp: callenbot: Around getting rid of state? :D

17:07 brianwong: is the reason the nils are at the end in REPL because of the lazy evaluation?

17:07 abp: mutable*

17:08 weavejester: gtrak: Agreed. I don't like side channels, especially when they're not written by me ;)

17:08 holo: any good advice for a unix shell script lisp? or i will just try fish. it looks nice

17:08 brianwong: as in the side-effects are not guaranteed to happen before the next item is returned?

17:08 gtrak: I really like vars that I write :-)

17:08 gfredericks: brianwong: yeah

17:08 brianwong: the side effects happen as the repl walks through the lazy seq to print the nils

17:09 brianwong: wrap the thing in doall to see a different effect

17:12 ubuntu1: hi

17:12 gfredericks: hi.

17:12 holo: hi

17:12 brianwong: gfredericks: why doesnt the (for [x (range 4)] (println x)) print anything?

17:13 hiredman: ~for

17:13 clojurebot: for is complected

17:13 hiredman: ~for

17:13 clojurebot: for is not used often enough.

17:13 hiredman: ~for

17:13 clojurebot: for is not a loop

17:13 nDuff: brianwong: for creates a lazy sequence.

17:13 brianwong: a list comprehension

17:13 gfredericks: hiredman: oh oh is there inference on "is not"? :D

17:14 nDuff: brianwong: ...if you want it to execute immediately, and you aren't looking for side effects, you should probably be using doseq instead.

17:14 gfredericks: nDuff: s/aren't/are/?

17:14 nDuff: err, right.

17:14 brianwong: i see

17:15 gtrak: sequences are about values, side effects aren't

17:15 gfredericks: laziness and side effects aren't comfortable together

17:15 they fight a lot

17:15 hiredman: gfredericks: I think the verb there is |is| so you would have to say "not a loop is xyz"

17:15 brianwong: (doc doall)

17:15 clojurebot: "([coll] [n coll]); When lazy sequences are produced via functions that have side effects, any effects other than those needed to produce the first element in the seq do not occur until the seq is consumed. doall can be used to force any effects. Walks through the successive nexts of the seq, retains the head and returns it, thus causing the entire seq to reside in memory at one time."

17:16 brianwong: it says that the side effects of a lazy sequence would happen after the sequence is consumed

17:16 gfredericks: the "other than those needed to produce the first element" sounds wrong?

17:16 brianwong: so shouldnt (for [x (range 4)] (println x)) produce the side-effects?

17:16 nDuff: brianwong: What's consuming it?

17:16 brianwong: even at the end?

17:16 ahhh

17:16 nDuff: i see your point

17:16 nothing is using the lazy sequence

17:17 nDuff: Exactly.

17:17 brianwong: (btw, it's generally "during" rather than "after")

17:17 ...and actually, can even be before with chunked sequences

17:19 hyPiRion: The only promise is that the side effects will be done before the element is realized.

17:19 gtrak: brianwong: also, seqs are read in chunks ##(first (for [x (range 4)] (println x)))

17:19 lazybot: ⇒ 0 1 2 3 nil

17:20 gtrak: notice first makes all four happen

17:20 gfredericks: gtrak: only chunked seqs

17:20 gtrak: gfredericks: sure :-), the point is to foster a healthy paranoia

17:20 gfredericks: phew

17:21 brianwong: interested

17:21 interesting

17:22 thanks for the help guys

17:22 gtrak: ##(first (for [x (range 50)] (println x)))

17:22 lazybot: ⇒ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 nil

17:23 gfredericks: por eso estamos

17:30 thalassios_xelon: heloo guys:)))

17:30 ,(+ 1 2)

17:30 clojurebot: 3

17:30 holo: maybe some girls are present too

17:31 thalassios_xelon: girls are not clever :P

17:31 hello holo :)

17:31 holo: hi!

17:31 * nDuff looks around for someone with kick/ban privileges

17:31 thalassios_xelon: holo u girl?

17:31 nDuff: ...eh, easier to /ignore

17:31 brianwong: hahah

17:32 holo: i'm a male

17:32 gfredericks: don't treed the folls

17:33 thalassios_xelon: holo are you blond and sexy clojure geek?

17:33 holo: >.>"

17:33 tmciver: thalassios_xelon: I'm a blond and sexy geek . . . but I'm a guy. ;)

17:33 thalassios_xelon: bye :*

17:34 gtrak: (votekick thalassios_xelon)

17:34 thalassios_xelon: gtrak, dont be evil

17:34 gfredericks: (dec thalassios_xelon)

17:34 lazybot: ⇒ -1

17:34 TimMc: C'mon, don't feed. Just /ignore.

17:34 gfredericks: TimMc: good point. done.

17:34 nDuff: (inc TimMc)

17:34 lazybot: ⇒ 34

17:35 holo: (inc holo)

17:35 TimMc: (And if you're an op, kick.)

17:35 lazybot: You can't adjust your own karma.

17:36 TimMc: gtrak: I think I've heard of IRC clients where /ignore is broadcast/made available to other clients.

17:36 arohner: given defrecord foo, is there an existing way to find its (map->Foo) fn?

17:36 brianwong: (brianwong)

17:36 TimMc: A quorum makes compliant clients auto-ignore.

17:36 gfredericks: arohner: find it?

17:36 technomancy: inc

17:36 ivan: )/whois thalassios_xelon

17:36 brianwong: ##(inc 1)

17:36 lazybot: ⇒ 2

17:36 gtrak: TimMc: ah, fun, it's like git vs svn

17:36 brianwong: ##brianwong

17:36 amalloy: TimMc: i would want that so hard

17:36 brianwong: i guess i have no value

17:37 that makes me sad

17:37 xeqi: $karma brianwong

17:37 lazybot: brianwong has karma 0.

17:37 arohner: gfredericks: I want a fn like (resolve-map-fn Foo) that returns the result of (resolve 'map->Foo)

17:37 gtrak: can we build a git repo for /ignores and have a web of trust?

17:37 arohner: but I want to pass arbitrary records in

17:37 it looks possible using (.getName record) and (.getSimpleName record), but that's a total hack

17:37 gfredericks: arohner: you want to pass in an instance? or the class?

17:37 arohner: the class

17:37 sjl: Do Leiningen and Drip work together yet? I followed the instructions but I'm not really seeing any speed boost

17:37 holo: $karma holo

17:37 lazybot: holo has karma 0.

17:38 nDuff: gtrak: Hmm. There'd have to be standards established in terms of tolerance. I've got a lot of entries on my /ignore list from time-wasters as opposed to outright trolls, for instance, but others might not want that.

17:38 gfredericks: arohner: yeah I'm not sure there's anything for that beyond what you're doing

17:38 nDuff: we could say /troll

17:38 TimMc: nDuff: Another problem is that ignores make you blind to a problem, they don't remove it.

17:38 gtrak: nDuff: easily solved with an int rating

17:38 aaelony: hyPiRion: fyi, figured out the command i needed earlier for profiling. java -agentpath:/path/to/YourKit_Java_Profiler_12.0.2.app/bin/mac/libyjpagent.jnilib -jar my-uberjar.jar

17:39 technomancy: sjl: they're supposed to, but I've seen reports of non-workage. are you on lein 2.0.0 final?

17:39 ivan: jcowan/Chouser/rhickey can add people to the access list

17:39 ravster: what would a credential-fn look like for the http-basic workflow in 'friend'?

17:39 thalassios_xelon: good night room :)

17:40 sjl: technomancy: http://paste.stevelosh.com/51142d5509b5f60007000001

17:40 I think that means 2.0.0 final?

17:40 just says 2.0.0

17:40 technomancy: sjl: yeah, that's the latest

17:40 amalloy: and 0.2.3 is latest drip, i'm fairly sure

17:40 technomancy: sjl: sorry; haven't used drip myself, but I saw some patches go in right before lein 2.0.0 landed.

17:40 sjl: it does seem to start the extra JVM: http://paste.stevelosh.com/51142d2109b5f60007000000

17:41 hyPiRion: aaelony: oh, sweet.

17:41 arohner: gfredericks: I just wrote: https://gist.github.com/arohner/4734884

17:41 sjl: doesn't really speed up much though

17:41 aaelony: :)

17:41 amalloy: sjl: looks like https://github.com/flatland/drip/issues/57

17:42 ninjudd is out of the country for the week, and i'm not really qualified to fix anything, so this will probably get fixed less quickly than usual

17:42 sjl: so the answer is no, they still don't work together

17:42 hah

17:44 technomancy: there is also https://github.com/technomancy/leiningen/issues/968

17:44 which doesn't exist yet

17:44 actually I think I have a stash for that; I should at least put it on a branch

17:45 amalloy: sjl: what if you time lein trampoline test?

17:45 i'm thinking that lein test should be using two JVMs (right, technomancy?), and only one of them is being controlled by drip

17:45 technomancy: amalloy: yeah

17:46 sjl: amalloy: same thing -- user time drops but real time is (roughly) the same

17:46 technomancy: sjl: `export LEIN_FAST_TRAMPOLINE=y` should allow trampoline calls to avoid launching Leiningen's own JVM entirely for trampolined invocations.

17:46 gfredericks: arohner: coo

17:46 jweiss: is there a better way to split a list of ints at the max value, other than using map-indexed (or otherwise producing a structure that contains indices)?

17:46 technomancy: there's also my eshell launcher that avoids the bash script entirely and uses nrepl

17:46 which doesn't work either

17:47 hyPiRion: jweiss: Is there only one max value?

17:47 technomancy: anyway, the point is there are a bunch of ways to do it and none of them work all that well, in conclusion yay open source

17:47 amalloy: jweiss: i don't think that's possible lazily

17:47 jweiss: hyPiRion: no, there could be more than 1, but it should be split at the first.

17:47 sjl: technomancy: no difference

17:47 technomancy: sjl: sorry, I meant repeated calls should be faster


17:48 sjl: oh

17:48 yes they are, a bit

17:48 like 1s instead of 3

17:48 technomancy: repeated calls to the exact same command anyway

17:48 sjl: yeah

17:48 technomancy: what's the downside to setting this var?

17:48 technomancy: it memoizes the resulting form to call from that task

17:48 sjl: it's not well tested

17:48 sjl: ah

17:48 technomancy: at some point it should default to on though

17:48 hyPiRion: ,(let [orig (repeatedly 6 #(rand-int 4000)), m (reduce max orig)] [orig (split-with (partial not= m) orig)])

17:48 clojurebot: [(3109 1760 1057 2537 1965 ...) [(3109 1760 1057 2537 1965) (3144)]]

17:49 jweiss: hyPiRion: thanks!

17:49 technomancy: sjl: there are probably some cache invalidation issues with it where the memoized command would end up being out of date

17:49 hyPiRion: jweiss: Not sure if it's better, per se.

17:49 sjl: technomancy: makes sense

17:49 hyPiRion: But it's at least without indices

17:49 technomancy: if that happens; `lein clean` will take care of it

17:49 jweiss: hyPiRion: i think that traverses the list twice though.

17:49 technomancy: but changes to project.clj should get picked up

17:49 sjl: cool

17:49 technomancy: but (for instance) new versions of a snapshot won't

17:49 amalloy: jweiss: you can't help but traverse the list twice

17:50 technomancy: because project.clj doesn't change, but the proper command does

17:50 hyPiRion: yeah, you have to find the max.

17:50 technomancy: Fraught with Peril™

17:50 jweiss: amalloy: can't you split a vector at an index without traversing it?

17:51 find the max should be the only traversal

17:52 hyPiRion: jweiss: is it a vector we're talking about?

17:52 amalloy: unless your first traversal is to put it into something random-accessible

17:52 eg, you could reduce over the sequence, putting it into a vector and finding the max element; then split up the resulting vector with two subvec calls

17:52 actually, i tell a lie. of course you can do this in one pass

17:52 jweiss: that's what i just said. if you put it into something random-accessible

17:53 jweiss: ok thanks

17:54 gfredericks: twiceish

17:55 use split-at and do it in 3 traversals!

17:56 amalloy: jweiss: https://www.refheap.com/paste/abcc0036c84dc85622b0f69ce is one way that's interesting, if not necessarily good

17:56 gfredericks: I guess split-with has that property too

17:56 hyPiRion: &(first (reduce-kv (fn [[i max :as init] j v] (if (< max v) [j v] init)) [-1 -1] [1 2 10 3 4]))

17:56 lazybot: ⇒ 2

17:56 hyPiRion: then do subvec from there.

17:58 amalloy: but really in a lazy language thinking about the number of times you traverse something is very confusing

17:58 dnolen: unifier in core.logic is getting fancy - http://gist.github.com/swannodette/4735012

17:58 gfredericks: we need a contest where we try to maximize CPU-cycles / source-char

17:59 it'd be like clojure golf but with an anti-performance component

17:59 amalloy: gfredericks: that'd be a short contest

17:59 gfredericks: amalloy: sleeping doesn't count

17:59 amalloy: (#(recur))

17:59 gfredericks: hrm

17:59 amalloy: also you have to solve the problem at hand

17:59 like splitting a list at the max element

18:00 ppppaul: i have a destructuring issue that i would like help with. https://gist.github.com/boxxxie/4735021 :D

18:00 gtrak: (dotimes [x 1000] (future (recur)))

18:00 999, rather

18:01 gfredericks: ppppaul: ah ha

18:01 ppppaul: so line 7

18:01 wait are you trying to make something equilavent to line 2?

18:01 ppppaul: gfredericks, yes

18:02 gfredericks: ppppaul: okay remove the curly braces around {:keys [body content-length]}

18:02 amalloy: gfredericks: you might find http://en.wikipedia.org/wiki/Busy_beaver entertaining, then

18:02 gfredericks: amalloy: man I gave a lightning talk on that

18:02 I don't think I did it well though

18:03 ppppaul: gfredericks, can you post on my gist?

18:03 gfredericks: specifically it was about the "busy beaver sequences grows faster than any computable sequence" part

18:03 ppppaul: yeah

18:03 dnolen: lynaghk: pretty much done w/ vector & set syntax

18:04 ppppaul: thanks gfredericks

18:04 gfredericks: np

18:06 amalloy: i apparently don't even know what noncomputable really means

18:06 lynaghk: dnolen: awesome!

18:07 gfredericks: amalloy: is it mentioned in the article?

18:07 lynaghk: dnolen: I've been in meetings and haven't had a chance to look yet =/

18:07 amalloy: gfredericks: yes

18:07 gfredericks: amalloy: any sequence of numbers you can write a function to compute will provably grow slower than the busy beaver sequence

18:07 dnolen: lynaghk: the biggest change is that unifier only really takes 1 or 2 args now. in 1 arg case no options - just sequences of terms to unify. 2 args case first arg is the options.

18:08 lynaghk: set & vector syntax both support giving a single constraint, or a seq of constraints

18:08 gfredericks: amalloy: the proof is a one-line reduction to the halting problem

18:08 dnolen: lynaghk: there are tests for these different cases - let me know if they don't make sense.

18:09 lynaghk: dnolen: okay, will do.

18:22 gfredericks: json with cheshire should be a faster serialization than pr-str/read-edn, right?

18:23 hiredman: gfredericks: I don't think there is an inherent reason it should be so, but I believe it is

18:23 dxeh: _veer,

18:23 super_?

18:23 clojurebot: contribute is http://clojure.org/contributing

18:23 hiredman: e.g. someone should write a high performance edn codec

18:24 gfredericks: I wonder if rhickey still wants tools.edn since he added read-edn?

18:24 _veer: dxeh: ?

18:24 mrb_bk: dnolen: oooh nice unifying

18:24 dxeh: do you have another alias "super_"

18:24 technomancy: sjl: highly experimental: https://github.com/technomancy/leiningen/issues/968

18:25 dnolen: mrb_bk: yes, should make the unifier a lot more useful.

18:25 _veer: dxeh: why?

18:25 dxeh: cause if you do then maybe you know me _veer :P

18:26 _veer: okay

18:29 mrb_bk: dnolen: we should grab a beer and talk about how i can help with some documentation stuff soon

18:30 dnolen: mrb_bk: hey, that sounds like a great idea!

18:31 mrb_bk: dnolen: awesome, I'll drop you an email

18:32 i made my first proper minikanren goal in core.logic and almost jumped out the window in excitement

18:32 dnolen: mrb_bk: haha, it's pretty great when it clicks.

18:35 technomancy: wow, vimclojure ships with vim now

18:36 that should help a lot considering installation has been somewhat involved from what I hear

18:36 mrb_bk: technomancy: confirmed

18:37 technomancy: I guess that means vim doesn't have a CA policy; good for them =)

18:37 clojure-mode will never ship with Emacs unfortunately due to that

18:40 bawr: CA?

18:40 clojurebot: CA is Contributor Agreement: http://clojure.org/contributing

18:41 bawr: Oh, that's useful.

18:50 rasmusto: if I turn a map into a seq, what's the good way to turn that back into a map? I'm mapping a function to my map, returning a seq of k/v vectors, then wanting to turn that into a map

18:50 amalloy: (into {} kvs)

18:51 rasmusto: amalloy: ok, thanks

18:56 DerGuteMoritz: ok I think I found a way to hit the potential bug

18:57 now I wonder how to test my patch

18:57 i.e. how do I run the cljs test suite?

18:58 does anyone know?

18:58 ah, script/test I guess

19:03 Raynes: In case anyone wonders why refheap suddenly has 11k pastes vs the 9k it used to have, it's because someone spammed the crap out of it recently, apparently. https://www.refheap.com/paste/11032 is the last 1000 or so pastes.

19:04 And congratulations to whoever did this act of elite hackery, pat yourself on the back for spamming the most un-ratelimited pastebin in history.

19:05 technomancy: mad skillz

19:06 Raynes: Unless of course, as amalloy just pointed out, it could be unintentional. If that's the case, please let me know and complain about there not being a sandbox for testing API stuff so I can point you to the sandbox for testing API stuff.

19:07 technomancy: it doesn't look spammy spam

19:08 amalloy: yeah, it looks like someone is running https://github.com/killswitch/dunn/blob/master/plugins/git.js and has it configured to automatically refheap exceptions

19:09 shaunxcode: someone asked earlier if graph supported clojurescript - mid way down the readme: "Also, stay tuned for a ClojureScript version of Graph, coming soon."

19:09 Raynes: Hrm

19:09 amalloy: Raynes: https://github.com/killswitch/dunn/blob/master/libs/irc.js#L90

19:09 Raynes: I see.

19:09 So this is a totally valid usage.

19:10 amalloy: well, valid usage run amok by him having too many errors. i'd get in touch with him and ask him to chill out

19:10 technomancy: depends on your TOS =)

19:10 Raynes: I mean, maybe not sending 1k pastes.

19:10 abp: technomancy: In Emacs, can I open the readme.md of a dependency of a Clojure-project I'm working on? M-. let's me jump to a symbols definition. But then from there, I can't further navigate in the jars context apparently.

19:10 Raynes: But I don't have any rules.

19:10 technomancy: abp: M-. into a file in a jar will open both that file and the jar itself

19:11 so look in your buffer list

19:11 abp: that said, we don't include readmes inside the jars right now. there's an open issue for it though.

19:12 abp: technomancy: Oh ok. Also the jar isn't in my buffer list. But this is on windows..

19:12 technomancy: shouldn't matter. are you sure you've opened a .clj file in a jar?

19:13 if so C-x C-f would default to being deep inside .m2/repository

19:14 abp: technomancy: yes, buffer-list points into .m2/.. C-x C-f is in there too

19:14 technomancy: But C-x C-f context being right is enough. I somehow got the impression thats not the case.

19:15 dxeh: clojure seems quite the interesting language, coming from c/java programming its quite the switchup which is nice

19:15 syntax wise, that is

19:15 technomancy: huh... I guess that might vary by OS then; that is surprising to me.

19:16 abp: technomancy: Should the jar be opened like a dired buffer..?

19:16 technomancy: abp: yeah, that's how it works here

19:16 ravster: abp: jars in emacs open automatically for me.

19:16 technomancy: you can see all the .class files and stuff

19:16 ravster: I don't need to do anything special

19:19 abp: technomancy: I'm fine with it, I can walk into the jar from the files context, dired-like.

19:19 technomancy: ok, cool

19:20 feel free to chime in here on the topic of including readmes: https://github.com/technomancy/leiningen/issues/880

19:21 ravster: I'm trying to make a credential-fn for 'friend' for the project I'm working on, but I'm getting 'wrong number of args passed [0]' errors. How do I make sure that the cred-fn gets the map of user and password thats coming in from the request? I'm using http-basic workflow.

19:21 abp: technomancy: Using emacs for two days now, preceded by a few days of reading the tutorial, memoizing basic bindings, reading .emacs.d's, now using emacs-live. I'm extremely impressed and addicted. :)

19:22 technomancy: cool; have fun =D

19:23 brehaut: waitaminute, you read the documentation‽ thats not doing it right!

19:24 technomancy: brehaut: you're supposed to write documentation, not read it.

19:24 brehaut: technomancy: wait, you sure you are in the right community?

19:25 dxeh: what is reading?

19:25 technomancy: brehaut: sorry, "you're supposed to chide people for not writing documentation, not for not reading it"

19:25 Raynes: You guys sound like antares all of a sudden.

19:25 technomancy: now I'm just confused

19:25 brehaut: technomancy: PHEW

19:26 tanzoniteblack: shaunxcode: the clojurescript comment was obviously way too unclear...I mean it's in its own paragraph in the readme, how could someone possibly notice it?

19:27 * tanzoniteblack is currently reading the plumbing readme

19:27 abp: Readme's being way to long with more then one sentence will be all the rage soon.

19:27 dxeh: is it true there is a "clojurescript" which compiles clojure to js rather than java lmao

19:28 technomancy: lol its true

19:28 shaunxcode: tanzoniteblack: hah I read the whole thing as it is absolutely solving a problem I face

19:29 tanzoniteblack: shaunxcode: I'm doing the same; less because it solves a problem I currently face, but more because it might be useful in the future and my brain hurts from debugging all day

19:29 https://github.com/Prismatic/plumbing in case anyone is wondering what readme we're referring to

19:29 dxeh: technomancy, you wrote leiningen?

19:30 technomancy: dxeh: guilty as charged

19:30 craigbro: as transcribed to him by aiwas

19:30 rather, whispered into his ear

19:30 dxeh: impressive technomancy

19:30 craigbro: just like Aleister Crowley

19:30 abp: shaunxcode: Something related to your datomic workspace?

19:31 dxeh: technomancy, i was just like lets look up some random people on github and i laughed so hard when i typed in your name and saw leiningen

19:34 amalloy: i think he's calling you random, technomancy

19:34 dxeh: the world is a random place

19:34 tommo: what does a : denote before something in clojure, e.g. [:a :b]

19:35 brehaut: tommo: keyword literal

19:35 tanzoniteblack: tommo: http://clojure.org/data_structures#Data%20Structures-Keywords

19:35 brehaut: (a keyword is a symbol that refers to itself rather than something else)

19:38 ravster: cemerick: how should I go about making a credential-fn for http-basic that hooks into a function that I already have that checks usernames & passwords against those in a DB?

19:38 shaunxcode: abp: yes actually, I have actually started working on feature enhancements in the coffeescript branch whilst I wait til I am happy with "best practice" in cljs branch

19:39 cemerick: ravster: you just need to create a fn that calls what you already have, and returns an authentication map on success

19:40 cbp: howdy

19:40 headshot: howdy

19:40 cbp: anyone here preparing or planning to prepare for google codejam?

19:41 dxeh: cbp, google codejam?

19:41 ravster: I'm trying that, the code I have is at https://www.refheap.com/paste/11034 , but I'm getting a 'wrong number of args passed [0]' error.

19:41 headshot: coding competition

19:42 hyPiRion: cbp: Yeah

19:42 cbp: dxeh: http://code.google.com/codejam/

19:42 abp: shaunxcode: Sounds reasonable. Getting a satisfying cljs-environment in terms of libs etc. is a lot of work.

19:43 dxeh: cbp, reverse engineering?

19:43 DerGuteMoritz: http://dev.clojure.org/jira/browse/CLJS-467 <- if anyone is interested in my findings with regards to the bug I mentioned earlier

19:43 hyPiRion: dxeh: algorithm and data structures

19:44 cbp: I just solved a problem that was taking me over 2 hours with (memoize fn) and got excited

19:44 I was considering using a more iterative language for the contest but now I think i'll stick to clojure

19:44 ravster: cemerick: this function should return a map with {:name, :identity, :roles, etc}. That counts as a valid authentication map, right?

19:45 xeqi: ravster: are you useing `:credentials-fn friend-authenticate` ?

19:45 dxeh: im just picking up clojure, heard about it a year or 2 ago and have seen code snippets but never really looked into it

19:45 hyPiRion: cbp: I'd recommend going polyglot. I go Java for things like Floyd-Warshall and Dijkstra, but Clojure if there's combinatorics or permutations

19:45 dxeh: seems quite cool though

19:45 shaunxcode: abp: yeah, I am definitely heavily devoted to building the cljs ecosystem but I also want to "ship" features as I do that.

19:46 hyPiRion: Though I've realized you can get very far with just Clojure.

19:46 dnolen: DerGuteMoritz: thanks looks right to me, I've assigned the Michal to confirm

19:46 assigned to

19:46 DerGuteMoritz: dnolen: alright, thank you!

19:46 ravster: xeqi: arrghh, no. I had that inside parens.

19:46 dnolen: DerGuteMoritz: please do send in your CA ;)

19:46 DerGuteMoritz: that's a good catch, could use more of those.

19:46 ravster: xeqi: thanks :$ thats embarrassing

19:47 xeqi: ravster: np, happens to everyone at some point

19:47 cbp: hyPiRion: yes I'll probably do that

19:52 DerGuteMoritz: dnolen: yeah I'll try to do that as soon as possible, might take a moment though coming from Germany. on a different note, do you happen to know what license restrictions apply when I port code from cljs core to another language?

20:14 abp: Now there's an opportunity to beat the shit out of everyone who took the read*-issue lightly (like me): (alter-var-root #'*read-eval* (constantly :unknown)) on the top-level of every public ns of your libraries. :D

20:15 technomancy: abp: `lein new app mythingy` already includes that =)

20:15 amalloy: technomancy: i think you missed the joke there

20:16 abp: technomancy: read closely, and have a look at richs latest commits. :P

20:16 technomancy: uh oh

20:16 abp: Hm, I can't resist joking in here.

20:17 amalloy: abp: i'm not clear on how that's a more interesting "attack" than putting (/ 1 0) at the top level of all your namespaces, though

20:17 xeqi: I prefer ziping everything in src/ and sending it to a web server

20:17 abp: amalloy: Not attack, more in spirit of teaching a lesson. Secure your reads, a*

20:18 amalloy: Via explicit *read-eval*-binding like loudly proposed

20:31 Any pointers on how to start learning git, preferably with magit, if that makes any sense?

20:32 hiredman: abp: http://mirror.linux.org.au/pub/linux.conf.au/2013/ogv/Git_For_Ages_4_And_Up.ogv

20:32 technomancy: abp: magit has a screencast that's good

20:34 abp: hiredman: technomancy Thanks!

20:59 charlietanksley: abp: I don't know about learning git, but the magit user manual is pretty thorough: http://philjackson.github.com/magit/magit.html

21:00 abp: I try to pick some random thing I find myself doing on via the cli every week or so, looking it up there, and trying to add just that to my magit workflow.

21:05 lynaghk: charlietanksley, abp: whenever I get into a new mode in emacs I always "C-h m" to see what commands are available. (I do pretty much everything in magit now.)

21:07 abp: charlietanksley: Sounds good, since I'm new to Emacs I try to learn it as broad of an replacement as possible. I haven't done much with git on the console anyway, so going magit from the beginning will work or not.

21:08 charlietanksley: lynaghk: good call.

21:09 abp: I'm not sure how that will work. Good luck with it!

21:09 abp: lynaghk: sam is crazy, he's rebound C-h to delete in emacs live.

21:10 technomancy: eep

21:11 abp: Oh and made it M-h

21:13 lynaghk: Thanks, thats really cool!

21:13 lynaghk: abp: yeah, no problem. it's the only emacs trick I really know, but you can use it to find out all of the other tricks =)

21:13 abp: Still can't believe I've procrastinated on learning Emacs until now...

21:14 cemerick: lynaghk: welcome back :-)

21:14 lynaghk: abp: you have taken the first step on the journey of a lifetime...

21:14 abp: Actually, people I've pushed into Clojure pushed me into Emacs in return.

21:14 lynaghk: cemerick: thanks! I'm so happy to be back in PDX. The Internet is now on a screen larger than 10 inches

21:14 technomancy: returning the favour =)

21:15 cemerick: lynaghk: were you gone long enough to start going a bit bonkers?

21:19 lynaghk: cemerick: yeah, especially in the more rural parts of New Zealand

21:20 cemerick: also traveling with the same person for six weeks, that was a bit intense. I did swing by SF on the way back for a week though and got to visit a lot of folks there

21:20 brehaut: lynaghk: whats 'more rural'?

21:21 lynaghk: cemerick: in San Francisco the Internet is, like, a real thing. With billboards and everything

21:21 brehaut: Riwaka on the South Island, which is a suburb of Moteuka

21:21 brehaut: lynaghk: i am from the south island ;)

21:21 lynaghk: brehaut: sorry I didn't get in touch, by the way. We were pretty busy for the days when we were in Auckland

21:21 brehaut: lynaghk: thats no problem at all

21:21 cemerick: brehaut: dude, don't trip over the village's internet wire

21:22 lynaghk: brehaut: ah, cool. Are you coming out to Clojure/west by any chance? A lot of the stuff I saw in the South Island reminded me a lot of Oregon.

21:22 brehaut: cemerick: theres only one. we are all very careful with it

21:22 lynaghk: sadly no. way too far to travel

21:22 i might make it to YOW!/Lambda Jam

21:22 cemerick: brehaut: my mental image is too hilarious for words

21:23 brehaut: cemerick: until kim dotcom builds a second cable, there is literally only one internet cable

21:23 part of the reason everythign down here is slow as molasses

21:23 cemerick: really? I thought there was a whole aws region in NZ?

21:24 lynaghk: brehaut: I was talking with some nerds in Wellington and they said there was plenty of capacity, but that the provider basically just charged a ton for everything---whenever there is a credible threat that someone will build another cable the Internet cost mysteriously goes down

21:25 brehaut: lynaghk: yeah providers charging insane amounts is basically par for the course here

21:25 not enough demand to create real competition

21:25 cemerick: oh, the AP region is in Sydney, my bad

21:26 tommo: what does # denote for example infront of a set?

21:26 brehaut: lynaghk: im not surprised riwka / moteka reminded you of oregan

21:26 thats hops country

21:27 (and riwaka is also a variety of hop)

21:28 tommo: in front of a set? ##{:a :b}?

21:28 lazybot: ⇒ {:a :b}

21:28 lynaghk: brehaut: re: beer, I'm tempted to buy a case of Moa's St. Joseph. That stuff was awesome

21:28 tommo: brehaut: yeah

21:28 cemerick: tommo: #{} *is* a set

21:28 {} is a map

21:28 brehaut: lynaghk: its pretty good eh, i quite like their five hops in mid summer too

21:29 tommo: cemerick: ohh ok, i thought i seen them used elsewhere, that makes sense, ty

21:31 brehaut: lynaghk: did you get a chance to try any renaissance or 8wired beers there?

21:39 gfredericks: TimMc: hyPiRion: if neither of you are going to be at clojure/west I will submit a lightning talk on swearjure.

21:43 craigbro: new AUtechre album!

21:46 gfredericks: lein will not let me create a project in an existing directory? :/

21:55 TimMc: gfredericks: You have my blessing.

21:55 abp: O R G

21:57 When I memoized those org-todo key-bindings ST2 travels into trash and everything's E

21:57 technomancy: =D

21:58 abp: brb, sleepersisting those bindings.

23:44 cemerick: bizarre; I think a particular rev of firefox is what was causing my ff/browser-repl problems a few weeks ago

Logging service provided by n01se.net