2013-08-25
| 00:01 | bja | I sorta think the correct thing to do is to implement an sldb-style debugger on top of fireplace |
| 00:02 | bja | basically, expose the remaining middleware that fireplace doesn't handle automatically |
| 00:16 | ToBeReplaced | anyone know if there's a way to warn on cache misses with core.memoize/core.cache? |
| 00:24 | amalloy | ToBeReplaced: implement the cache protocol by wrapping an existing cache and issuing a warning? |
| 00:31 | ToBeReplaced | amalloy: yep, cheers |
| 01:33 | callen | If I wanted to monkeypatch a defn from another library (not my own), do I have any alternatives to alter-var-root? |
| 01:33 | callen | with-redefs isn't acceptable. |
| 01:43 | ToBeReplaced | callen: i don't know of other options, not that they don't exist |
| 02:19 | kab3wm | I'm having an issue trying to insert some rows containing int array (postgresql) types using clojure.jdbc. It complains about being unable to infer the SQL type. Here's a snippet of the code & schema if you care to look - http://pastebin.com/zGF5th8u |
| 02:25 | ivan | kab3wm: total guess, try (int-array [1 2 3]) |
| 02:25 | callen | devn: getclojure is broken again. |
| 02:27 | SegFaultAX | kab3wm: The error is pretty explicit about what you need to do. The driver doesn't what db type PersistentVector maps to. |
| 02:28 | SegFaultAX | (Arrays are an extension of the standard so it isn't surprising that this wasn't accounted for in Clojure's JDBC wrapper) |
| 02:28 | SegFaultAX | pg specific extension, that is. |
| 02:35 | kab3wm | SegFaultAX: Ok, I'm pretty sure I understand what you said, however being new to clojure I'm not clear on whether this is something I can work around with some other syntax, or if it's just not possible without changes to clojure.jdbc? |
| 02:36 | SegFaultAX | kab3wm: I don't know enough about the implementation of clojure.jdbc to know how to fix it in that context. But the error you're receiving is clear enough (it has nothing to do with Clojure per se) |
| 02:40 | kab3wm | SegFaultAX: Ok. I will keep playing.. maybe I can do (.setObject int-array) or something. Thank you for your help. |
| 02:57 | akurilin | Is it safe to assume that if I want to connect to a running ring application in an uberjar then I need to explicitly have it run a nrepl server? |
| 02:57 | akurilin | As in, that's not turned on by default? |
| 02:58 | SegFaultAX | akurilin: Let's hope that it isn't turned on by default. ;) |
| 02:59 | SegFaultAX | akurilin: Check out cemerick's drawbridge. It's pretty neat. |
| 03:01 | akurilin | SegFaultAX, that's cool, thank you. Think I'll start with boring old ssh + local repl, but that's an interesting option once I have time to secure it properly |
| 03:03 | SegFaultAX | akurilin: There are certainly more robust solutions for running an nrepl server inside a production app. The novelty of drawbridge is that it's tunneled over HTTP. |
| 03:06 | akurilin | SegFaultAX, that's fair |
| 03:06 | akurilin | thank you |
| 03:06 | akurilin | bbl |
| 06:44 | noncom | dissipate: hi, r u here? |
| 06:49 | instilled | muhoo: if you're setting up things from scratch maybe you want to give this a shot: https://github.com/instilled/clojure-bee |
| 06:50 | instilled | muhoo: I do not claim that it works or that it is complete but it provides quite a few things for clojure development out of the box. |
| 06:51 | instilled | muhoo: I use it with evil-mode as well |
| 06:52 | instilled | miql: sorry that was intended for you |
| 06:55 | noncom | why on clojuredocs the latest clojure version is 1.3.0 and such things as (add-watch) are marked as "Alpha - subject to change" ? |
| 06:56 | noncom | what is the recommended source of reference for clojure, in spirit on clojuredocs but the most recent? |
| 06:56 | noncom | s/on clojuredocs/of clojuredocs |
| 06:58 | glosoli | noncom: Community driven docs, probably not updated that often |
| 07:02 | andyfingerhut | noncom: I have read that the creators of that site (currently deployed version developed using Ruby on Rails) are planning to, or in the process of, rewriting the server in Clojure. I'm not sure how far that might be. |
| 07:09 | noncom | i see.. looks like them having hard times... long i didn't see changes... |
| 07:10 | noncom | however, i am looking at clojure atlas http://www.clojureatlas.com/ did anyone try it yet? |
| 07:11 | noncom | looks like very interesting, i think i will reside to it.. |
| 07:13 | noncom | oh, it is for clojure v 1.4.x yet... |
| 07:13 | andyfingerhut | noncom: Clojure 1.4 and 1.5 are not terribly different. |
| 07:14 | andyfingerhut | Even most of the stuff on ClojureDocs.org site is still useful. |
| 07:14 | noncom | yeah, that is true, and that could make for a good reason to update it to 1.5 :) |
| 07:15 | noncom | though, i understand what you mean :) i've been using clojuredocs for the whole while of my clojuric life and it was enough in 98% of the cases |
| 07:15 | noncom | and them are for 1.3.0 |
| 07:16 | andyfingerhut | They may update it some day, but it is difficult to predict if or when. |
| 07:16 | noncom | its like (agent) itself :D |
| 07:40 | noncom | is there a way to reset an agent, just like an atom? |
| 07:40 | noncom | i want to send something to the agent, without caring for its current sate |
| 07:41 | noncom | i.e. i do not want to make the function to consider the current agents status in its args |
| 08:43 | jaley | can anyone tell what I'm doing wrong? does .. not work the same in CLJS? (.. event -toElement -innerText) doesn't seem to return what I expect? |
| 08:46 | coventry | noncom: Does (send target-agent (constantly desired-new-val)) not DWYW? |
| 08:48 | jaley | (scratch that, yes it does, I'm just blind) |
| 08:59 | noncom | jaley: weehee! thanks! |
| 09:00 | coventry | I can see abstractly that clojure must forbid recur in a try/catch/finally because it's messing with the stack, but I'm having trouble imagining an explicit example where it's a problem. Anybody got one? |
| 09:00 | jaley | noncom: did i do something? :s |
| 09:01 | coventry | I think he meant me, in which case, np. |
| 09:01 | noncom | omg sorry |
| 09:01 | noncom | sure, conventry, it was you! :) |
| 09:01 | coventry | Don't sweat it. :-) |
| 09:04 | jtoy | anyone know of a library that has time functions to do : " X days ago" ? |
| 09:15 | noncom | jtoy: ummm not sure what you mean.. clj-time i think has it |
| 09:32 | glosoli | hello folk |
| 09:32 | m4dm4n | anybody here that know reverse engineering? |
| 09:32 | Okasu | Hello boyo. |
| 09:34 | noncom | for them are told being a drawman |
| 09:45 | jtoy | noncom :( oops, I just wrote one |
| 09:45 | jtoy | I mean change a timestamp to 4 days ago, 2 hours ago, 1 month ago,etc |
| 09:46 | noncom | jtoy: yep, afaik clj-time does that |
| 10:00 | clj_newb_2345 | anyone here coding with emacs live? |
| 10:00 | clj_newb_2345 | it seems ridiciously powerful, but also ridiciously undocumented |
| 10:01 | glosoli | I know Emacs, but what's Emacs Live |
| 10:01 | noncom | i tried enacs live, looks fine. it has its docs on its page no? |
| 10:02 | noncom | emacs live is that ide for overtone |
| 10:02 | glosoli | noncom: it's fully dcoumented |
| 10:02 | glosoli | documented" |
| 10:02 | glosoli | http://overtone.github.io/emacs-live/documentation.html |
| 10:02 | kmicu | clj_newb_2345: It's self documented, what's the problem? |
| 10:02 | noncom | yeah, i found it pretty-docced |
| 10:02 | clj_newb_2345 | i'm also new top emacs |
| 10:02 | noncom | s/-/ |
| 10:02 | clj_newb_2345 | what is self documented? |
| 10:02 | glosoli | Emacs Live is something like some already configured for you, so you would not need to care about how it works ? |
| 10:03 | kmicu | Yes. |
| 10:03 | kmicu | http://overtone.github.io/emacs-live/doc-shortcuts.html |
| 10:04 | kmicu | "If you’re new to Emacs, it’s worth taking the time to read the tutorial." |
| 10:05 | kmicu | clj_newb_2345: http://www.youtube.com/playlist?list=PLxj9UAX4Em-IiOfvF2Qs742LxEK4owSkr |
| 10:05 | clj_newb_2345 | kmicu; nice, thanks |
| 10:06 | kmicu | If you want fast start with clojure and emacs, then emacs-live is pretty well documented. |
| 10:07 | glosoli | kmicu: Yeah it took me like week to do it on my own and I am still learning something every day |
| 10:08 | clj_newb_2345 | http://overtone.github.io/emacs-live/doc-clojure-interactive-editing.html pressing "C-x C-z" froze my emacs. I'm running Emacs as a gui window, not inside of a terminal window |
| 10:08 | clj_newb_2345 | hitting C-g doesn't cancel anything |
| 10:09 | kmicu | Ctrl key + g always cancel anything :) |
| 10:10 | glosoli | clj_newb_2345: What makes you think it does not cancel anything ? |
| 10:11 | noncom | i have a clojure program that, according to the profiler, generates loads of char[] (over 60% of total generation), is that typical for clojure? |
| 10:12 | clj_newb_2345 | glosoli noting is happening |
| 10:12 | clj_newb_2345 | the bottom of my buffer continues to say "C-c C-z" |
| 10:12 | clj_newb_2345 | it's as if the emcas session has hanged |
| 10:13 | glosoli | clj_newb_2345: Hm what kind of Emacs are you using and which platform ? |
| 10:13 | clj_newb_2345 | ubuntu 13.04; emacs 24 + emacs live from emacs live github |
| 10:13 | glosoli | clj_newb_2345: how much CPU does it use while "hanged" ? |
| 10:14 | clj_newb_2345 | actually |
| 10:14 | clj_newb_2345 | C-x C-z is bound to "suspent frame" |
| 10:14 | clj_newb_2345 | which is probably why it looks "suspended" |
| 10:14 | glosoli | yeah lol |
| 10:14 | clj_newb_2345 | I'm an idiot |
| 10:14 | clj_newb_2345 | sorry about that |
| 10:15 | glosoli | clj_newb_2345: For me it does not suspend , or probably it does, but also hides it in the tray lol |
| 10:15 | clj_newb_2345 | what it he inverse of "suspend frame"? |
| 10:16 | glosoli | clj_newb_2345: for me it's just opening Emacs windows from it's application tray heh , |
| 10:17 | clj_newb_2345 | i'm running xmonad |
| 10:17 | glosoli | good luck then |
| 10:18 | kmicu | clj_newb_2345: I'm also running xmonad, simply switch to other window. |
| 10:19 | clj_newb_2345 | actually, I just ent and and disabled suspend-frame |
| 10:19 | clj_newb_2345 | and rebound \C-x\C-z to nil |
| 10:20 | kmicu | If you do not use emacs in terminal it is a good way to go :) |
| 10:22 | coventry | Even in a terminal I find it's handy to use C-z as the screen/tmux binding, because with the default settings I hit C-z by accident way more than I mean to. |
| 10:24 | clj_newb_2345 | https://github.com/clojure-emacs/nrepl.el <-- why are teh prefixes for evaluation so damn inconsistent? :-) |
| 10:26 | kmicu | Legacy reason. |
| 10:27 | clj_newb_2345 | so basically a bunch of other progs took a bunch of bindings |
| 10:27 | clj_newb_2345 | and peiople's fiiingers are used to those bindings |
| 10:27 | clj_newb_2345 | thus forcing emacs live to take otehr bindins, whatever is free? |
| 10:28 | kmicu | emacs-live has the same bindings like nrepl.el |
| 10:28 | kmicu | You can rebind them, it's not worth any discussion ;) |
| 10:34 | clj_newb_2345 | whoa |
| 10:35 | clj_newb_2345 | I can create separate emacs frames, and have them be in the same session, so they can take different parts of my xmonad setup |
| 10:35 | clj_newb_2345 | this is insane |
| 10:35 | kmicu | frames or windows? |
| 10:36 | kmicu | Ah, two frames in one window, with the same xmonad.hs |
| 10:37 | kmicu | yes, frames and buffers are independent |
| 10:37 | kmicu | You can even C-M-[ and C-M-] to move content of other frame |
| 10:38 | kmicu | without leaving current frame |
| 10:40 | kmicu | You can do whatever you want with emacs :) |
| 10:52 | coventry | kmicu: are those xmonad or emacs keybindings? C-M-[ becomes M-ESC for me, and C-M-] is undefined in my emacs. |
| 10:55 | kmicu | Yes. |
| 10:56 | kmicu | Binding is defined in emacs-live, but you should have scroll-other-window-down from window.el |
| 10:56 | coventry | Oh, an emacs-live binding. Thanks. |
| 10:57 | coventry | Huh, I didn't know scroll-other-window-down worked across frames like that, because I always have at least two windows per frame. :-) |
| 10:57 | kmicu | https://github.com/overtone/emacs-live/blob/master/packs/live/bindings-pack/config/default-bindings.el#L158 |
| 11:01 | coventry | Wow, lots of cool stuff in there. Definitely going on the distractions list. |
| 11:03 | kmicu | Yes, two windows per frame. |
| 12:29 | seangrov` | kmicu: What command is C-M-[ bound to for you, scroll-other-window-down? |
| 12:36 | coventry | seangrov`: It's in the github URL he sent. |
| 12:37 | coventry | What's a good tool for parsing a string of clojure code and keeping track of the position of its sexps in the original string? |
| 12:49 | coventry | Looks like tools.reader is the place to start. |
| 13:16 | gfredericks | is it weird that there aren't any visible clojure libs for complex numbers? is there any reason I shouldn't try to make one? |
| 13:17 | bbloom | gfredericks: numerics are hard? :-) |
| 13:17 | gfredericks | bbloom: no specifics in that vein? |
| 13:18 | bbloom | well shit. my irc client crashed. wutcha say? |
| 13:19 | gfredericks | bbloom: "no specifics in that vein?" |
| 13:19 | bbloom | gfredericks: well, generic dispatch isn't free & jvm doen't have user-defined non-reference types, so perf is basically always terrible for numeric code that doesn't unroll everything to array hackery |
| 13:20 | gfredericks | bbloom: shouldn't have to be generic though |
| 13:20 | bbloom | yeah, you can write a complex math library that gives you the basics, but it's much harder to play nice w/ all the other number types |
| 13:20 | gfredericks | bbloom: are you suggesting a two-element array is faster than a deftype? |
| 13:21 | bbloom | no, i'm suggesting a large array of N*2 elements is faster than a deftype :-) |
| 13:21 | bbloom | or rather an array of deftypes |
| 13:21 | bbloom | not to discourage you from building such a library. it would be useful to have |
| 13:21 | gfredericks | bbloom: I know genericity is hard, but I'd think special-purpose functions would be useful regardless |
| 13:22 | bbloom | gfredericks: i won't argue with that |
| 13:22 | gfredericks | I'm not sure if there is hairiness around exactness though |
| 13:23 | TEttinger | http://stackoverflow.com/questions/11824815/fast-complex-number-arithmetic-in-clojure someone's already trying some kind of complex number thing in clojure |
| 13:23 | gfredericks | TEttinger: oh I've done it before too; it's writing a well-designed library that I'm pondering |
| 13:24 | gfredericks | https://github.com/fredericksgary/qubits/blob/master/src/com/gfredericks/qubits/complex.clj |
| 13:26 | TEttinger | =ish is a great idea |
| 13:27 | gfredericks | TEttinger: that's how you know you're working with doubles :) |
| 13:27 | dnolen | bbloom: gfredericks: it seems like there are really good ideas about doing efficient symmetric multimethods on the JVM in the Fortress literature |
| 13:28 | TEttinger | is fortress still around? |
| 13:28 | bbloom | dnolen: fortress was on the jvm? |
| 13:29 | dnolen | gfredericks: haven't had time to dig into it, but this looks cool "Implementing Fully Modular, Statically Typed, Symmetric Multimethod Dispatch" |
| 13:29 | dnolen | bbloom: yes |
| 13:29 | dnolen | TEttinger: no |
| 13:29 | bbloom | huh. didn't realize that |
| 13:30 | gfredericks | dnolen: I think I might read this whole thing just to see what happens. |
| 13:32 | TEttinger | X10 is also on the JVM, is in the same niche, and has much more accessible syntax to Java programmers I would think. no unicode fanciness. |
| 13:32 | dnolen | "moreover, delegating dynamic dispatch on arguments other than the receiver object to the runtime allows greater opportunity for dynamic code optimization (an area that deserves further exploration)" |
| 13:32 | dnolen | https://blogs.oracle.com/projectfortress/entry/fortress_wrapping_up |
| 13:35 | gfredericks | at the moment I'm more interested in having anything at all, and I think I also want exact complex numbers |
| 13:36 | glosoli | hmm how does one set to make nREPL Stack trace error appear in background buffer instead of popping out in any of the open buffers ? |
| 13:38 | TEttinger | gfredericks, (sqrt -2) |
| 13:38 | bbloom | gfredericks: if you want exact math, you really have no other choice but to go symbolic |
| 13:39 | TEttinger | bbloom, so (sqrt -2) would eval to '(sqrt -2) ? |
| 13:40 | TEttinger | I can see that being handy |
| 13:40 | bbloom | TEttinger: or (complex (sqrt 2) 1) |
| 13:40 | tomjack | "go symbolic" = "don't eval" ? |
| 13:41 | dnolen | bbloom: ok I'm starting grok the ANF stuff, in your version how come you're passing around an explicit continuation parameter k like in Matt Might's Racket source? |
| 13:41 | dnolen | bbloom: I mean why are you *not* passing around k |
| 13:41 | TEttinger | clojure has continuations? |
| 13:41 | bbloom | tomjack: or just eval differently :-P |
| 13:41 | bbloom | dnolen: 1 sec, let me reboot my brain on the implementations |
| 13:41 | dnolen | bbloom: I see now that the let merging is not that important, ANF does the proper thing for what I want to fix |
| 13:43 | bbloom | dnolen: ok, now i recall this…. soooo |
| 13:43 | gfredericks | TEttinger: bbloom: I'm 96% sure I have a decent application of exact complex numbers that won't use any of the inexact functions |
| 13:43 | bbloom | basically, matt might's implementation is written in continuation passing style b/c that achieves a more complete normalization |
| 13:44 | bbloom | in my case, i only needed a few very specific places normalized & didn't need the more general approach |
| 13:45 | bbloom | actually, i'm not 100% convinced the continuation passing style helps for ANF, but it helps much more generally. it's a way you can achieve generic traversals |
| 13:45 | gfredericks | bbloom: ironically that application is an representation of algebraic numbers; so if that works then (sqrt -2) doesn't have to be symbolic :) |
| 13:45 | gfredericks | "an exact representation"* |
| 13:47 | bbloom | dnolen: you'll notice that they call "k" wherever i call "anf" for recursive cases |
| 13:49 | dnolen | bbloom: ok, so by not using continuation passing style I don't see how you can unnest lets the way Matt Might's code does. |
| 13:49 | dnolen | continuation passing style allows you rewrite the code inside out |
| 13:50 | bbloom | dnolen: https://github.com/scala/scala/blob/master/src/continuations/plugin/scala/tools/selectivecps/SelectiveANFTransform.scala |
| 13:51 | bbloom | that's the a scala ANF i was mimicking |
| 13:54 | dnolen | bbloom: ok, though I don't yet see how that addresses my point |
| 13:55 | dnolen | bbloom: or maybe you're saying you only did enough for CPS transform, not full normalization? |
| 13:55 | bbloom | dnolen: yeah, i didn't do a full/robust ANF, just enough for the next transformation i wanted to do: the selective CPS transform (which i never finished) |
| 13:55 | gfredericks | dnolen: I have already learned a thing from this paper |
| 13:57 | SegFaultAX | gfredericks: Which paper are you reading? |
| 13:57 | gfredericks | SegFaultAX: Implementing Fully Modular, Statically Typed, |
| 13:57 | gfredericks | Symmetric Multimethod Dispatch |
| 13:57 | gfredericks | admittedly the thing I learned is about java :) |
| 13:58 | SegFaultAX | gfredericks: Have a link? |
| 13:59 | gfredericks | SegFaultAX: no I don't because google won't give me an unobfuscated link |
| 13:59 | sinistersnare | http://www.cs.ucla.edu/~todd/research/iandc.pdf this? |
| 13:59 | bbloom | dnolen: you'll see in my code that the anf-application function calls (map anf* args) in it |
| 13:59 | bbloom | dnolen: that's the recurisve/fixed-point step that emulates the continuations |
| 13:59 | gfredericks | sinistersnare: that looks pretty different |
| 13:59 | sinistersnare | oh sorry |
| 13:59 | sinistersnare | :p |
| 14:00 | coventry | bbloom, dnolen: where are you planning to use this? |
| 14:00 | bbloom | dnolen: see also "expansion passing style" |
| 14:00 | dnolen | coventry: ClojureScript |
| 14:01 | bbloom | coventry: i was just experimenting about a year ago, but now we have reason to believe an ANF transform before generating javascript from the cljs compiler will yield better performance b/c of fewer function closures of the form (function() {})() |
| 14:01 | dnolen | bbloom: yeah I can see how your version works, one giant set of let bindings :) |
| 14:01 | coventry | bbloom, dnolen: thanks. |
| 14:03 | bbloom | dnolen: what you're not seeing here is that this ANF transform i wrote is about 100X simpler than it was before i force fed you a few cljs patches :-) |
| 14:03 | dnolen | bbloom: heh I remember |
| 14:04 | bbloom | dnolen: i'd like to, if at all possible, accomplish this transform w/o gensym |
| 14:04 | bbloom | dnolen: or at least w/ a repeatable symbol source, so that re-analysis & re-transform is stable |
| 14:47 | fbernier | What is the best way to have command line arguments persist across other namespaces in clojure ? |
| 14:48 | hyPiRion | fbernier: The simplest way is to pass the arguments to the functions. The easier way is to bind them to a dynamic var. |
| 14:50 | fbernier | hyPiRion: passing as arguments seems weird in my case ... I'd need an argument used in the "handler" and "converter" namespaces |
| 14:50 | fbernier | https://github.com/fbernier/taz-clj/tree/master/src/taz_clj |
| 14:51 | fbernier | command line arguments |
| 14:54 | gfredericks | oh man; there's a weird kind of mutual dependency between clojure.core and the namespaces it uses |
| 14:55 | callen | I learned about a nifty way to handle "configuration" with protocols the other day via Cheshire's source code. |
| 14:55 | gfredericks | callen: howzat? |
| 14:56 | callen | gfredericks: well adding to the protocol is just extension, but for removal, you alter-var-root the protocol and filter out the removed impl. |
| 14:56 | bbloom | gfredericks: bootstrapping a core library is tricky/circular :-) |
| 14:56 | callen | gfredericks: I was curious as to how they did it, because people complained about some use of global atoms (I also use closures sometimes) for configuration but didn't really proffer any alternatives. |
| 14:57 | gfredericks | callen: configuration of libs or apps? |
| 14:57 | callen | so the subject is rattling around my brain. Just trying to find better ways. |
| 14:57 | callen | gfredericks: gods, libs. |
| 14:57 | callen | gfredericks: totally unnecessary in an app. |
| 14:57 | callen | I'm not a total philistine, give me a little credit. |
| 14:58 | gfredericks | callen: I don't quite understand the issues yet; I'm trying to learn, not criticize |
| 14:58 | callen | gfredericks: ah, gotcha. I thought you might know of something I didn't. |
| 14:58 | callen | but that's basically the bag of tricks I've so far, atoms, closures, and alter-var-root'ing a damned protocol var. |
| 14:58 | gfredericks | callen: so the main trouble is you want the library to be able to be used in multiple ways/configurations, no? |
| 14:58 | callen | and the latter only applies...if it's a protocol. |
| 14:59 | callen | gfredericks: yeah but I have a nifty pattern for that in Bulwark. handles closed over config *and* global atom. |
| 14:59 | callen | needs both, in fact. |
| 14:59 | gfredericks | I have this issue with cheshire because I want to be able to use it from another library, without affecting any global config |
| 14:59 | callen | yes, I know I could've destructured it. Fix it later. https://github.com/bitemyapp/bulwark/blob/master/src/bulwark/core.clj#L83-L85 |
| 15:01 | gfredericks | callen: okay I see what you mean; that style wouldn't easily apply to cheshire would it? unless you have parser-constructors etc. |
| 15:01 | callen | gfredericks: I wasn't trying to address your problem, just talking about the generality. I could give some thought as to how to make global protocols modular thoguh. |
| 15:01 | callen | though* |
| 15:02 | callen | gfredericks: are you trying to use cheshire in two different ways or something? is having an extra protocol going to break something? |
| 15:02 | gfredericks | callen: I want to use it from a logging lib |
| 15:02 | gfredericks | and I need to support custom types from there |
| 15:02 | callen | oh I see, without affecting a potential user. |
| 15:02 | gfredericks | exactly |
| 15:03 | gfredericks | I think I "solved" it by doing my own type conversion before calling cheshire |
| 15:03 | gfredericks | which required an ugly enumeration of all the types cheshire defaultly supports |
| 15:03 | callen | I'd say the concern is premature for now, given my druthers, but the most straightforward way to avoid affecting your user is to have specialized types. |
| 15:03 | callen | ...right. |
| 15:03 | callen | that being in mind, a "with-protocol" function might be in order. |
| 15:04 | gfredericks | well the idea is to be able to log arbitrary data; so I don't control what types come in |
| 15:04 | callen | gfredericks: you're writing your own logging lib? |
| 15:04 | gfredericks | callen: I wrote a wrapper for tools.logging that uses data instead of strings |
| 15:04 | callen | I could think of a few uses for that. |
| 15:04 | gfredericks | yeah it's been super nice |
| 15:04 | callen | I am about to work on a logging micro-lib thing. |
| 15:05 | gfredericks | the cool part is having a dynamic var *data* that has default data to be merged in |
| 15:05 | callen | gfredericks: if I wanted to hook into jdbc and log the queries and time-to-execute of everything that hits the execute! fn, I'm looking at using alter-var-root to wrap it, aren't I? |
| 15:05 | gfredericks | so you can alter-var-root it with your git sha and env |
| 15:05 | gfredericks | callen: sounds right |
| 15:05 | callen | okay, so I wasn't off the mark. |
| 15:06 | gfredericks | callen: I think an AOP lib for adding logging to vars could be really nice, but haven't settled on a comprehensive design |
| 15:06 | callen | gfredericks: I still haven't figured out precisely what sort of breakage scenario you're worried about, but I'll give some thought to a with-protocol sort of thing for Cheshire or in general. |
| 15:06 | fbernier | In the "run-server" function call here, why is a reader-macro used? http://http-kit.org/server.html#routing |
| 15:06 | smnirven | anybody out there have some experience using amazonica dynamodbv2? |
| 15:06 | callen | gfredericks: most universal way would be to figure out a way to decorate the IFn behavior, no? |
| 15:07 | dnolen | bbloom: re: ANF gensym, do you mean the names that need to be introduced by ANF? |
| 15:07 | gfredericks | callen: having trouble seeing what you mean by that |
| 15:07 | callen | smnirven: is this a Clojure question? |
| 15:07 | bbloom | dnolen: yeah. right now i just do something like (gensym "__anf") |
| 15:07 | callen | gfredericks: Dreaming of evil, don't sweat it. The more useful thought is "with-protocol" |
| 15:08 | gfredericks | callen: I don't understand that one either :P |
| 15:08 | gfredericks | callen: temporary protocol extensions? |
| 15:08 | callen | shadow the protocol? |
| 15:08 | callen | yeah. |
| 15:08 | callen | for the block of scope. |
| 15:08 | dnolen | bbloom: do you have any ideas how to avoid that? |
| 15:08 | bbloom | dnolen: but ideally, the names would be labeled consistently. i *think* that just numbering arguments 0,1,2 etc with some fixed strategy is sufficient. you'll get shadowing, but the next stage will unique-ify the names |
| 15:08 | gfredericks | callen: that couldn't be thread-local though could it? |
| 15:08 | dnolen | bbloom: yes you're only worried about capture |
| 15:09 | bbloom | dnolen: i think b/c the names are only used once… and *immediately* you can just (for [i (range (count args))] (symbol (str "arg i))) |
| 15:09 | dnolen | bbloom: since our compilation unit is a function, I don't think this is a problem in practice. |
| 15:09 | callen | gfredericks: my intent is for block locality. |
| 15:09 | dnolen | anf__0 and counting up compilation unit |
| 15:09 | gfredericks | callen: i.e. you don't care if it's not thread-local? |
| 15:09 | bbloom | dnolen: yeah, so to avoid (unintentional) capture just use something like (str "anf$" i) |
| 15:09 | dnolen | "up per" |
| 15:10 | callen | gfredericks: I try to avoid thread local stuff when I can, but I don't have any strong opinions there. Semantically the thread-ness shouldn't matter if it's block scoped only. |
| 15:10 | gfredericks | callen: oh so it's a lexical thing? |
| 15:10 | callen | that's the hope. |
| 15:10 | gfredericks | callen: how is that different from merely let? |
| 15:10 | bbloom | dnolen: i don't think it even needs to be per compilation unit, since the names are always used right after they are declared. you can just do it per every ANF usage as long as any recursive ANF transforms happen in a nested let where the names will go out of scope |
| 15:10 | callen | gfredericks: if let works for your problem, why didn't you do that? |
| 15:10 | gfredericks | callen: this has nothing to do with the var holding the protocol? |
| 15:10 | bbloom | (let [arg0 (let [arg0 x] (f arg0))] (g arg0)) |
| 15:10 | callen | it could if desired. |
| 15:11 | gfredericks | callen: I don't think let works for my problem, I'm still trying to understand what you're proposing |
| 15:11 | bbloom | dnolen: gensym was just the quickest route to avoiding thinking about that :-) but gensym introduces non-determinism effects in to an otherwise pure compiler pass |
| 15:12 | callen | gfredericks: I'm being a CL hippie again. I wouldn't sweat it for now. I have to run some errands anyway, I'll be back 'round. |
| 15:12 | gfredericks | callen: I can't tell if you're talking about temporarily modifying an existing protocol, or generating a temporary protocol, or something else |
| 15:12 | gfredericks | callen: have fun |
| 15:12 | callen | generating a temporary protocol that is lexically scoped |
| 15:30 | coventry | How can I arrange for a utility function to always be present in the namespace of a repl started with lein? |
| 15:30 | dnolen | bbloom: have you seen this http://research.microsoft.com/en-us/um/people/akenn/sml/CompilingWithContinuationsContinued.pdf? |
| 15:31 | bbloom | dnolen: yes, but i don't think it's worth the cost to us to go full CPS in out compiler since our output is javascript & not machine code |
| 15:31 | dnolen | bbloom: agreed was just curious |
| 15:32 | bbloom | dnolen: sure, there are plenty of cool optimizations enabled by full CPS compiler techniques, but step 1 is just getting the current passes disentangled |
| 15:32 | coventry | (I keep putting (println (apply str (repeatedly 72 (constantly "*")))) to separate the outputs from repeatedly recompiling the current buffer with C-c C-k. It would be nice to have this function in one place, or if there is a better workflow that would be good to know, too.) |
| 15:32 | bbloom | dnolen: also, there is good evidence that delimited continuations can be used to enable the cps-style optimizations to be accomplished in direct-style |
| 15:33 | dnolen | bbloom: interesting, references? |
| 15:33 | dnolen | bbloom: yeah, I think disentangling the compiler is going to have to be done piecemeal. |
| 15:33 | bbloom | dnolen: i can find at least 2 for you, one moment. it's pretty recent research & i'll give you a 10 second brain dump on how this would make sense |
| 15:33 | bbloom | dnolen: http://okmij.org/ftp/meta-programming/index.html#bti |
| 15:34 | bbloom | so basically that's a really simple demonstration of how binding-time analysis gets better in CPS |
| 15:34 | bbloom | dnolen: but oleg mentions Bondorf in the references, who's paper explains how to get that improvement by writing the *specializer* in CPS instead of the original program in CPS |
| 15:34 | benkay | i just renamed my nrepl.el buffer - how do I tell emacs that it should be looking for the renamed buffer instead of *nrepl-2*? |
| 15:35 | dnolen | bbloom: in the near term it seem desirable to have the ANF stuff be a library in ClojureScript which we load we load as a selective pass in the current compiler to isolate the amount of chances to the output we introduce - focus on if/let for now. |
| 15:35 | bbloom | dnolen: he also mentions lawall & danvy, who show how to use delimited continuations to write the specializer in direct style & still get the benefit |
| 15:35 | dnolen | s/chances/changes |
| 15:35 | bbloom | dnolen: i have this theory that the Eff effects/handlers stuff is *directly* applicable to this. instead of explicitly passing a continuation, you install a handler & defer to it |
| 15:36 | bbloom | dnolen: then you still explicitly call "recuse with the current transformer on this thing" and the handler will take care of keeping that in direct style |
| 15:36 | dnolen | bbloom: that's likely, the number of citations to the original The Essence of Compiling With Continuations is quite large |
| 15:36 | bbloom | dnolen: yeah, it's seminal work |
| 15:36 | dnolen | bbloom: one of them is a Handler Effects paper w/ Plotkin on it. |
| 15:38 | bbloom | dnolen: yup. consider you have "operation" normalize and generic function "normalize-form". you can write a handler for normalize, whose signature is [x k] where normalize-form's signature is just [x] |
| 15:38 | bbloom | dnolen: so then inside a method of normalize-form, you can install a dynamic handler for normalize |
| 15:39 | bbloom | dnolen: so instead of having to pass the continuation all the time, you just store it in the stack :-) |
| 15:41 | bbloom | dnolen: among my many hobby interests, i'd really love to have a language w/ a runtime-extensible partial evaluator :-) |
| 15:41 | dnolen | bbloom: heh |
| 15:41 | bbloom | i think basically everything is a interpreter/compiler problem if you squint right! |
| 15:44 | dnolen | bbloom: have you seen the book "Partial Evaluation and Automatic Program Generation"? |
| 15:45 | bbloom | dnolen: no, it's on my list. have you read it? |
| 15:46 | dnolen | bbloom: only perused, I thought it was cool that it's comes w/ working Scheme code and mentions the techniques in relation to Prolog |
| 15:46 | bbloom | dnolen: yeah, ultimately you need a logic engine to do proper abstract interpretation |
| 15:48 | dnolen | bbloom: link to book http://www.itu.dk/~sestoft/pebook/jonesgomardsestoft-a4.pdf |
| 15:48 | bbloom | dnolen: i already got it, thanks tho :-) |
| 15:49 | coventry | Looks like the answer to my question is to do something like {:user {:repl-options {:init (load-file "/path/to/replrc.clj")}}} in ~/.lein/profiles.clj |
| 15:52 | coventry | Gah, but ritz-nrepl ignores it. |
| 15:59 | seangrov` | dnolen: This looking closer to what you described? https://gist.github.com/sgrove/6335798 |
| 16:00 | seangrov` | simple2.clj is the input file, repl.clj shows the command to compile simple.clj and the resulting *constants-table*, and analyzer.clj shows the implementation so far |
| 16:04 | d0c0nnor | Hi, I'm going through the Pedestal tutorial and I've come across this construct (services/->MockServices (:app app)) .. can anybody tell me what it means ? |
| 16:05 | d0c0nnor | This is MockServices: |
| 16:05 | d0c0nnor | (defrecord MockServices [app] |
| 16:05 | d0c0nnor | p/Activity |
| 16:05 | d0c0nnor | (start [this] |
| 16:05 | d0c0nnor | (receive-messages (:input app))) |
| 16:05 | d0c0nnor | (stop [this])) |
| 16:07 | `cbp` | d0c0nnor: read up on clojure records |
| 16:08 | valyagolev | do you know what -> macro does? |
| 16:09 | valyagolev | not sure why is it imported from services though, maybe that does something weird |
| 16:11 | dissipate | noncom, did you ping me earlier? |
| 16:11 | coventry | valyagolev, d0c0nnor: That is not the -> macro, that is defrecord syntax. http://tinyurl.com/mt58k7d |
| 16:11 | valyagolev | hmm thank you! |
| 16:13 | d0c0nnor | Nice one, thanks! |
| 16:14 | coventry | I went through the first part of the tutorial in some detail a little while ago. |
| 16:17 | mpenet | If there are some cassandra users interested in core.async, I just added support for it in mpenet/alia. Feedback welcome |
| 16:29 | gfredericks | I think I figured out a not-terrible solution to CLJ-1237 |
| 17:05 | TimMc | gfredericks: Oh yes? |
| 17:05 | TimMc | Co-routines? :-D |
| 17:05 | TimMc | And yeah, that's a nasty bug. |
| 17:05 | gfredericks | TimMc: https://github.com/fredericksgary/clojure/commit/8248a04acd70286d9c43d03758d3327def8fae23 |
| 17:06 | gfredericks | I guess it's somewhat of a trampoline |
| 17:06 | gfredericks | using clojure.core/trampoline would have been gross though |
| 17:07 | gfredericks | oh snap I committed whitespace changes |
| 17:12 | gfredericks | TimMc: clojure.core/trampoline would be gross because then every impl would have to return its value wrapped |
| 17:15 | seangrov` | dnolen: Think I'm wrapping my head around everything: Here's the function and example output for the keywords constants table: https://gist.github.com/sgrove/6336233 |
| 17:16 | seangrov` | Then there's some changes to be done to the Keyword deftype, and they should be able to be used independently from String |
| 17:16 | dnolen | seangrov`: looks like you're getting there, but I would avoid wrapping keywords in symbols, I don't think we need to preserve that bit from CLJ JVM |
| 17:16 | dnolen | er wrapping keywords around symbols |
| 17:16 | seangrov` | dnolen: Ah, alright, was doing a relatively straight port |
| 17:17 | seangrov` | Presumably keywords need to have a name and namespace in their constructor - anything else? |
| 17:19 | also | is there a standard way to generate a buildable pom.xml using leinengen? |
| 17:19 | dnolen | seangrov`: the original strings, the concatenated string and hashCode - more or less like Symbols |
| 17:19 | gfredericks | also: `lein pom`? |
| 17:19 | dnolen | seangrov`: only keywords don't take metadata |
| 17:21 | seangrov` | What's the concatenated string, :ns/original-string ? |
| 17:21 | also | gfredericks: i thought that pom was just for publishing? did |
| 17:21 | also | did that change in a recent version of leiningen? |
| 17:22 | also | https://groups.google.com/forum/#!topic/clojure/oPWYZTmHC6U |
| 17:22 | gfredericks | also: you might be right; I don't know about the distinction so I probably can't be helpful |
| 17:25 | dnolen | seangrov`: look at Symbol |
| 17:25 | dnolen | seangrov`: yes, but not leading : |
| 17:25 | dnolen | s/not/no |
| 17:27 | akurilin | Is lein repl able to connect to drawbridge apps over https by default, or do I need a plugin of sorts for that? |
| 17:38 | seangrov` | Output for keywords constants-table: https://www.refheap.com/18017 |
| 17:38 | gfredericks | TimMc: I attached a patch. I'm curious to see what rich thinks of it. |
| 17:38 | seangrov` | Woops, pasted the buffer, not the region |
| 17:39 | gfredericks | mostly because I don't have a good guess either eway |
| 17:39 | seangrov` | Proper compiled output for keywords constants-table: https://www.refheap.com/18019 and modified Keyword deftype (not tested yet): https://www.refheap.com/18018 |
| 17:43 | dnolen | seangrov`: nice |
| 18:18 | seangrov` | dnolen: Any hints on how to get the table to be emitted after the clojurescript support and before the user-supplied code? |
| 18:19 | dnolen | seangrov`: not really, you're just going to have to splice that into the compilation process somehow |
| 18:19 | seangrov` | Yeah, looking through closure.clj for a clean place |
| 18:22 | dnolen | seangrov`: there are some things to consider in that it should probably be a real file that needs to change when any other files change |
| 18:22 | dnolen | seangrov`: to support incremental recompile |
| 18:25 | seangrov` | dnolen: Yeah, I'm outputting it to "out/constants_table.js", I think I'll hard-code it to depend on the "cljs.core" ns when cljs.analyzer/*real-keywords?* is true |
| 18:26 | TimMc | gfredericks: I wonder if there's a generalization of this strategy. |
| 18:27 | dnolen | seangrov`: we'll probably want to tweak how it's enabled, but don't worry about that yet, we can tweak details when you have a working patch |
| 18:36 | weavejester | Does anyone know of a library for generic data structure functions that aren't in clojure.core but might be commonly required anyway? |
| 18:37 | weavejester | Like… (defn map-val [f m] (reduce-kv #(assoc %1 %2 (f %3)) {} m)) |
| 18:37 | weavejester | for instance |
| 18:39 | mpenet | weavejester: flatland/useful |
| 18:40 | weavejester | mpenet: Oh, of course, I should have remembered that one. |
| 18:43 | weavejester | Hm, no invert-map. Should I submit a patch, I wonder? Or is useful too big... |
| 18:44 | callen | weavejester: Useful is probably a good place for it to live, I would think. |
| 18:45 | weavejester | callen: Useful does a lot more stuff than I really want, though. I feel like a library just for missing data structures would be lighter and more focused. However, I recognise that in practise the size of the library probably doesn't matter... |
| 18:57 | akurilin | Does leiningen expose a way to query what profiles are currently being used, or would I do that through a combination of :env + something like environ? |
| 18:58 | akurilin | My use case is checking to see if I'm running lein test, in which case I do NOT want nrepl server to start. |
| 19:11 | callen | weavejester: well, I'm working on something for expanded set operations and joins on Seqs. |
| 19:11 | callen | pretty small library. not sure exactly what you're looking for? |
| 19:11 | weavejester | callen: I'm not sure. I just find myself using a small set of functions a lot, all to do with data. |
| 19:12 | weavejester | It's a pity the name "sundry" is already taken for a clojure library :) |
| 19:20 | XPherior | Am I remembering wrong, or are go blocks supposed to absorb work on calling other functions that use <! >!? |
| 19:29 | XPherior | Hm, yeah I think I just remembered wrong. I remember, perhaps dnolen or Rich, mentionining that it was one of the cons of go blocks. |
| 19:42 | dnolen | XPherior: not really a cons a design choice, shallow yield is a good tradeoff |
| 19:45 | amalloy | akurilin: shouldn't you just put the nrepl init in -main, which won't be called in tests? |
| 19:57 | seangrov` | dnolen: Ok, have real keywords working locally in the repl and the browser, will get the tests to pass now |
| 19:57 | dnolen | seangrov`: wow awesome |
| 20:04 | SegFaultAX | Is lib-noir mostly incompatible with http-kit and other event'd servers? |
| 20:08 | callen | SegFaultAX: only the bits that rely on thread locality. |
| 20:09 | callen | SegFaultAX: I rewrote neubite to be http-kit safe while retaining similar functionality, so that might be a place to look into. |
| 20:12 | dnolen | bbloom: http://twitter.com/cgrand/status/371780258074476544 lazy incremental hash codes |
| 20:14 | SegFaultAX | callen: It seems several of the helpers do depend on thread locality. :( But ok, thanks. I'll take a look at neubite now. |
| 20:14 | SegFaultAX | (Pervasive use of dynamic vars seems to be a common-ish theme in web libs for Clojure) |
| 20:18 | ddellacosta | SegFaultAX: agree and share your (what I interpret as) general dislike of it, although I've mostly encountered it in noir/lib-noir |
| 20:20 | callen | The default assumption is thread-per-request lifecycle. That's the reason for dynamic vars - they double as request context. |
| 20:20 | callen | I replaced it with a macro and a contract. |
| 20:21 | callen | aka "thou shalt always have the Ring request in scope" |
| 20:22 | ddellacosta | callen: yeah, I can't really fault that I guess. I just find that, even within the scope of the request cycle, mutability can be tough to manage. |
| 20:22 | SegFaultAX | But that's not webscale. |
| 20:22 | ddellacosta | haha |
| 20:23 | ddellacosta | conversely, I find that I sidestep some problems simply by only working with the request as it passes through middleware/handlers, but I suppose it introduces other problems. |
| 20:23 | SegFaultAX | I don't really consider dynamic vars to be about mutability. At least not in the typical sense. |
| 20:23 | callen | ddellacosta: "working with the request" is the aforementioned contract. Assuming, "we are using Ring" is fine. |
| 20:24 | SegFaultAX | It's just thread-local shadowing (eg a top-level let that is only in scope for the current thread) |
| 20:24 | ddellacosta | callen: yeah, assuming we are using ring, I should have been clear. |
| 20:24 | callen | I can handle doing things either way, but I'd prefer more universal solutions in lib-noir, BUT, the current alternative I have places more constraints/demands on the user of the library. |
| 20:24 | callen | only other alternative is to force http-kit et al to use thread affinity. |
| 20:24 | SegFaultAX | Which sucks. |
| 20:24 | callen | and I already know Shen Feng doesn't care about pleb problems like that. |
| 20:24 | callen | so I enforce a contract instead. |
| 20:25 | callen | I'm quite happy with my solution, if I'm honest. |
| 20:25 | callen | bitemyapp.com is running on http-kit right now, thanks to rejiggering. |
| 20:25 | ddellacosta | callen: sorry, what does "thread affinity" mean? |
| 20:26 | ddellacosta | one google search later…this concept? http://en.wikipedia.org/wiki/Processor_affinity |
| 20:26 | callen | uhm, no. |
| 20:26 | callen | thread affinity |
| 20:26 | callen | ddellacosta: "if you pause the work I'm doing so you can reassign the thread (asynchrony + thread pool), make certain you bring back the thread I had before" |
| 20:26 | callen | it makes things like a dynamic var work in the presence of thread pooling in an async framework. |
| 20:26 | ddellacosta | ah, okay |
| 20:27 | ddellacosta | thanks for the explanation. |
| 20:27 | callen | it's more work to implement for the authors of things like http-kit, but allows more flexible data management. |
| 20:27 | callen | no problem. |
| 20:27 | callen | if it makes you feel any better, Ruby and Python people deal with dopey versions of these problems (like thread locals) too. |
| 20:27 | callen | I say dopey, because these are first world problems comparatively and we have the tools to deal with it. |
| 20:27 | callen | (like macros, threads, etc) |
| 20:28 | ddellacosta | I dunno about Python, but when I was writing Ruby I tried to pretend like threads didn't exist |
| 20:28 | callen | SegFaultAX: I move to SF in 2 days. |
| 20:28 | callen | ddellacosta: yeah, and it bites them anytime they want something better than Unicorn :P |
| 20:29 | ddellacosta | yep. Heard the story has changed with 2.0, but dunno much about it. But I digress. |
| 20:29 | SegFaultAX | callen: Awesome, where? |
| 20:30 | callen | SegFaultAX: dunno yet, trying to AirBNB a place right now. |
| 20:30 | callen | no luck yet. I may end up couchsurfing. |
| 20:30 | SegFaultAX | callen: No shame in that. Did your roomie move already? |
| 20:31 | callen | ddellacosta: the contract is simple, the data lifecycle management shifts from dynamic vars getting changed inside the threads to a bucket brigade made easy. |
| 20:31 | callen | SegFaultAX: he moved 3/4s like a week ago, but popped in today. |
| 20:31 | callen | ddellacosta: contract is, "if you call this macro, you must have a Ring request var in scope named `request`" |
| 20:32 | callen | the middleware assoc their respective data into the Ring request so that it reaches the handlers and macros. |
| 20:32 | callen | ddellacosta: https://github.com/bitemyapp/neubite/blob/master/src/neubite/views/common.clj |
| 20:32 | SegFaultAX | callen: https://github.com/bitemyapp/neubite/blob/master/src/neubite/routes/admin.clj#L100 |
| 20:32 | callen | cleans up the code such that it's only concerned with handling a request, no weird floaty per-request global state. |
| 20:32 | SegFaultAX | callen: You could probably refactor that pretty easily. |
| 20:32 | ddellacosta | callen: thanks, I'll check it out. I need to think about different models of managing the request cycle more. |
| 20:33 | callen | SegFaultAX: that is a topic of conversation here. We've been discussing a macro. |
| 20:33 | SegFaultAX | callen: Turn superuser-only into a middleware. |
| 20:33 | callen | I considered that. I wasn't certain I wanted to move auth away from route definitions. |
| 20:33 | callen | I really just wanted a macro to decorate groupings of routes with middleware. |
| 20:34 | SegFaultAX | callen: Sure, but just have it decorate the entire context. |
| 20:34 | callen | Your suggestion for middleware is the more immediate way to handle it, but then you've still gotta be careful with ordering relative to the user-middleware. |
| 20:34 | SegFaultAX | Much cleaner that way. |
| 20:34 | callen | SegFaultAX: that's the goal. |
| 20:34 | callen | haven't written the macro yet. |
| 20:34 | SegFaultAX | Do you need a macro for that? |
| 20:34 | callen | I've pinged like 5 different fairly active Clojure web people |
| 20:35 | SegFaultAX | It's just a redirect if they aren't authed. |
| 20:35 | callen | none of them could think of anything that did what I wanted...so...yes? |
| 20:35 | callen | Sure but that doesn't change that I want a handler decorator separate from the global middleware. |
| 20:37 | ddellacosta | callen: I suspect I know what you'll say, but what about using friend? It has easy ways to decorate a context in the way you guys are discussing. |
| 20:37 | callen | ddellacosta: I'd take a swan dive into Mount Doom or become a janitor first. |
| 20:37 | ddellacosta | hahaha |
| 20:37 | callen | but I'm happy to steal the useful bits. |
| 20:37 | callen | SegFaultAX: testing Clojure + Datomic for something at work. Pretty excited. |
| 20:37 | bbloom | dnolen: oh fuck yes. |
| 20:38 | bbloom | that's awesome. |
| 20:40 | SegFaultAX | I'm jelly. I want to use Datomic + Clojure at work. |
| 20:42 | SegFaultAX | callen: Anyway, couldn't you just do (defroutes admin-routes (superuser-only (context ...)))? |
| 20:43 | muhoo | anyone using [clj-aws-s3 "0.3.7"] getting inexplicable "The request signature we calculated does not match the signature you provided. Check your key and signing method" errors? |
| 20:43 | muhoo | i dunno wtf they're talking about signing method, but the keys are koshe |
| 20:44 | muhoo | augh, sadly weavejester appears gone now :-/ |
| 20:47 | callen | SegFaultAX: good question, maybe. |
| 20:48 | muhoo | trying to figure out if amazon changed something which may have broken it |
| 20:48 | callen | SegFaultAX: the wrapper isn't the only redundancy in the routes definition I want to eliminate. That's why I'm mumbling about a macro. |
| 20:48 | muhoo | or, worse, some impossible-to-find library version conflict |
| 20:48 | SegFaultAX | callen: Try it. Just change superuser-only to work like a normal middlware. Also, put a date on your copyright. |
| 20:48 | SegFaultAX | callen: Sure, there are other nice refactorings you could do. But that's an easy one. :) |
| 20:48 | callen | SegFaultAX: sadly you're many thousands of words of exchanged conversation short of context for what I'm talking about :( |
| 20:49 | callen | SegFaultAX: true. I do want to clean up Neubite holistically though. |
| 20:49 | callen | and get some reusable code out of it. |
| 20:49 | callen | hrm. yes. year. |
| 20:50 | SegFaultAX | (I was going to open a PR but there isn't a license attached so I'll just tell you instead, haha) |
| 20:50 | callen | muhoo: do you know of anywhere to get a shikibuton in SF other than Tokyo Futons? |
| 20:51 | callen | SegFaultAX: licensing with - "Distributed under the Eclipse Public License, the same as Clojure." |
| 20:51 | callen | I didn't expect anybody to use any code *from* Neubite, just learn from it. |
| 20:51 | callen | any code I extracted for my own purposes would just get spun off as a library. |
| 20:53 | callen | ddellacosta: I prefer things like github.com/bitemyapp/bulwark/ to Friend, if you're wondering what the alternative is. |
| 20:53 | callen | for basic user auth...just the user-middleware in neubite is descriptive enough. |
| 20:53 | ddellacosta | callen: but, bulwark is attacking a different problem, isn't it? |
| 20:54 | ddellacosta | callen: I mean, it wholly depends on what your goals are I suppose. |
| 20:54 | ddellacosta | callen: there is certainly a strong argument to be made for different authn/authz models for different apps |
| 20:54 | ddellacosta | callen: which can be handled in very different ways, using different libs |
| 20:58 | callen | ddellacosta: you're right that it's not totally isomorphic, but it's a similar sort of problem. |
| 20:59 | ddellacosta | callen: don't get me wrong, I'm not disputing that it is appropriate for the task at hand, and friend could very much be overkill. I think I tend to use it all over the place because I'm familiar with it, more than anything. |
| 21:01 | callen | ddellacosta: I still think Friend is an overreaction, like a immune system overreacting ala Lupus. An overreaction to having tangled with some obscene enterprise ERP ACL system. |
| 21:01 | ddellacosta | haha |
| 21:01 | callen | when I encounter somebody tangling with something like that, *THEN* I point them towards Friend |
| 21:01 | callen | 99% of web apps? Just write an fn :( |
| 21:01 | SegFaultAX | I really really like warden. I think it's awesome. And I think friend is the closest port to Clojure I've seen of warden... |
| 21:02 | callen | Friend requires a vision quest and a stash of psychedelics to understand |
| 21:02 | SegFaultAX | But the implementation is IMHO ugly and overly complex. |
| 21:02 | callen | and when you're done writing the code, you've forgotten it all again. |
| 21:02 | ddellacosta | SegFaultAX: yeah, exactly--for my part, I was coming from a love of the plug-and-play nature of devise, built off of warden (which may largely deserve the credit, actually) |
| 21:02 | callen | it merits a do-over with a more "progressive" interface that allows for varying degrees of involvement on the part of the user, depending on the problem being solved. |
| 21:03 | SegFaultAX | Devise is essentially just a collection of default strategies for warden. |
| 21:03 | SegFaultAX | Warden is all the rack middleware goodness. |
| 21:03 | ddellacosta | I mean, friend has some crufty parts, but I feel like it is the right direction, or it maps to what I want to do a lot of the time. So I'm interested in extending it and improving it. |
| 21:03 | callen | hrm. Jose Valim was involved in Warden. I need to talk to him about that. |
| 21:03 | SegFaultAX | callen: #elixir |
| 21:04 | callen | SegFaultAX: #elixir-lang actually, and I'm already in there. |
| 21:04 | ddellacosta | on a related note, I've spent the last few weeks wrapping up Apache Shiro, and that has been an education |
| 21:04 | callen | SegFaultAX: I was advising him on template library design a couple days ago. |
| 21:05 | callen | spreading the gospel of Selmer/DTL. >:) |
| 21:05 | SegFaultAX | Jinja is probably more canonical for that style of templating. |
| 21:05 | SegFaultAX | Or even django templates. |
| 21:06 | callen | SegFaultAX: Selmer's implementation very closely mimics that of the actual DTL. |
| 21:06 | callen | not intentionally. Convergent design. |
| 21:06 | callen | same preprocessed iterable -> runtime dispatch on nodes. |
| 21:07 | callen | I have to go buy quarters, bbs. |
| 21:15 | muhoo | callen: my futon purchases have been from a place on chavez at evans |
| 21:16 | muhoo | tho, best futon deals/selection are in berkeley |
| 21:16 | muhoo | berkeley is ground zero of futons |
| 21:18 | muhoo | futon stores in berkeley are like starbucks in the downtown sf, three on every corner |
| 21:23 | callen | muhoo: I'm talking shikibutons though, not western futons. |
| 21:23 | callen | not the furniture thingies. |
| 21:25 | callen | C |
| 21:42 | muhoo | dunno man. japantown, or, i still think berkeley is yer best bet |
| 21:42 | callen | muhoo: it's mostly that I don't trust the discretion of students in quality futons. |
| 21:43 | muhoo | students from japan? |
| 21:44 | muhoo | lemme tell you, the discretion of those students in indian food is tip top |
| 21:44 | TEttinger | is this the right place to ask Light Table questions? My seesaw/swing app is not playing nice with the instarepl |
| 21:44 | callen | I've had good Indian food in Berkeley. |
| 21:44 | muhoo | indian food in berkeley is plentiful cheap and good |
| 21:44 | callen | I could live on Indian food forever ;_; |
| 21:45 | TEttinger | callen, isn't "Indian food" an incredibly broad category? |
| 21:45 | callen | TEttinger: yes, and I've enjoyed almost every single form of it I've tried. |
| 21:45 | callen | TEttinger: including South Indian food in Malaysia, North Indian here in the bay area, and everything in between. |
| 21:45 | callen | Indian food made old-style without tomatoes, Indian food made new-style with cream and tomatoes, anything. |
| 21:46 | callen | I love it all. O_O |
| 21:46 | callen | I can think of no other cuisine that I have so consistently enjoyed as Indian food. |
| 21:46 | TEttinger | I don't like curry, but naan is better than a lot of bread here. my experiences are limited though |
| 21:46 | callen | TEttinger: where are you? |
| 21:46 | TEttinger | southern california |
| 21:46 | TEttinger | san gabriel valley area |
| 21:46 | callen | I don't know if I had any Indian food in LA or not. |
| 21:46 | TEttinger | there's a pretty good amount |
| 21:47 | callen | I don't think so. Had some good Thai food though. |
| 21:47 | TEttinger | oh yes. |
| 21:50 | TEttinger | the gas company gives notices in 5 or 6 languages, one of them vietnamese. thai and vietnamese food in the general area is nice. you can get korean bbq on taco trucks too. my brother had live octopus at a korean restaurant here; that's kinda a sign that the food is authentic when it is something very few "traditional american restaurants" would consider. |
| 21:50 | callen | TEttinger: easy enough to know how authentic the food is here - look around for natives. |
| 21:50 | TEttinger | (literally live, still moving as he ate it) |
| 21:51 | callen | are you sure it wasn't that salt activated post mortem thing? |
| 21:51 | muhoo | TEttinger: persian food in glendale.... best i've had |
| 21:51 | TEttinger | no, actually, not sure |
| 21:51 | TEttinger | muhoo, oh yeah, I've had some killer baklava in glendale |
| 21:51 | callen | where it jiggles from the salts in the soy sauce. |
| 21:51 | callen | muhoo: tehran-dale? |
| 21:52 | SegFaultAX | Multigrain cherios are delicious. Just sayin. |
| 21:53 | TEttinger | there's one place my egyptian friend swears has the best baklava he's ever had, and it's in glendale IIRC |
| 21:53 | callen | TEttinger: there's a turkish place near where I live in MV that has good baklava. |
| 21:53 | callen | I don't know that I'd call it the best I've ever had though. |
| 21:53 | muhoo | callen: little armenia, really. mostly persian-armenians, who arrived after 1979 |
| 21:53 | TEttinger | trying to remember MV |
| 21:54 | callen | muhoo: oh that's interested. Left because they were armenian christians? |
| 21:54 | callen | interesting* |
| 21:54 | callen | TEttinger: Mountain View |
| 21:54 | TEttinger | oh |
| 21:54 | muhoo | i learned to curse in persian AND armenian when living there. |
| 21:54 | SegFaultAX | My coworker is teaching me how to curse in Turkish! |
| 21:55 | muhoo | supposedly hungarian has the most curse words of any language, dunno where i picked up that factoid. |
| 21:55 | TEttinger | Armenia was the first officially christian nation, even before Rome became the Holy Roman Empire. the more you know... |
| 21:56 | callen | muhoo: I'd curse a lot if I was Hungarian too. |
| 21:57 | TEttinger | SegFaultAX, turkish has some really weird letters. BİTKİLERİN İYİLİĞİ |
| 21:57 | SegFaultAX | Yes indeed. |
| 21:57 | muhoo | ok well, we got our world history squared away. i gotta get back to clojure hacking now. |
| 21:57 | TEttinger | some turkish tea was very hard to google for because of that http://dogadan.com.tr/ |
| 21:58 | SegFaultAX | I'm almost done with 4clojure... |
| 21:59 | SegFaultAX | Just 11 more to go. |
| 22:00 | TEttinger | the last one: write code that will hack our database to erase any records of you completing 4Clojure problems |
| 22:01 | callen | TEttinger: I wouldn't worry about that, 4clojure is using MongoDB - Mongo will do the job of erasing the data for you. |
| 22:01 | ddellacosta | callen: I know where to get you some futons. ;-) |
| 22:02 | TEttinger | *not allowed: let, fn, map, apply, filter* |
| 22:02 | callen | ddellacosta: that's just cheating man. but not out of the question. |
| 22:02 | ddellacosta | heh |
| 22:04 | callen | ddellacosta: there's a sizeable and long-running Japanese community in the bay area, I refuse to believe I cannot acquire a proper shikibuton and kakebuton. |
| 22:05 | ddellacosta | callen: honestly I'm not too knowledgeable about it, but certainly a good way to do it is find someone that is part of the community and pick their brain. |
| 22:06 | ddellacosta | callen: it may be possible to get them shipped via rakuten too, dunno: http://search.rakuten.co.jp/search/mall/敷布団/-/ |
| 22:10 | ddellacosta | SegFaultAX: that is awesome. I stopped after I hit the "medium" difficulty ones I think, but I've been meaning to get back on that horse. |
| 22:12 | SegFaultAX | ddellacosta: I like puzzles. |
| 22:13 | ddellacosta | SegFaultAX: Have you gone back and re-written any of your previous answers at times? I have a lot of older answers that I think are much clunkier/longer than they need to be. |
| 22:13 | SegFaultAX | ddellacosta: Rarely. |
| 22:13 | SegFaultAX | ddellacosta: But all my answers are also publicly available. |
| 22:15 | SegFaultAX | 150 is tricky. |
| 22:16 | ToxicFrog | This function starts out (let [...] (binding [...] (let [...] .... |
| 22:16 | ToxicFrog | There has got to be a better way to do this. |
| 22:18 | ddellacosta | ToxicFrog: no way to bind outside of the first let, then merge the lets into one? …without knowing what you are doing, it's hard to say. |
| 22:22 | clj_newb_2345 | what does datomic use for it's backend to actually store the data |
| 22:22 | clj_newb_2345 | is it entirely self contained, relying on nothing but the JVM ? |
| 22:23 | callen | clj_newb_2345: Datomic has a pluggable storage backend. You should read the documentation, it answers your questions. |
| 22:26 | ToxicFrog | ddellacosta: the first let destructures the return value of a function that returns a list; I need all of the values later but only need to bind one of them. |
| 22:26 | ToxicFrog | Then I bind it, then I let the result of calling a function that needs the binding, then I do things. |
| 22:27 | ToxicFrog | In other news, I hate namespaces. |
| 22:27 | seangrov` | callen: I'd say go down to Santa Clara for Korean futons... expensive, but good |
| 22:27 | seangrov` | I'm sure somewhere in Japantown has them too though |
| 22:28 | callen | seangrov`: I'm in Mountain View right now, now is the time to get anything I need in SC. What's the difference re: korean futons? |
| 22:28 | clj_newb_2345 | ToxicFrog: how would you improve namespaces ? |
| 22:28 | seangrov` | callen: Same idea, generally same quality, generally same price |
| 22:29 | callen | seangrov`: oh I see. I'll keep that in mind as an option, thank you. |
| 22:29 | ddellacosta | ToxicFrog: dunno, again, would have to look at a refheap or something. But don't see what it has to do with namespaces being hateful |
| 22:30 | callen | Anybody that dislikes namespaces hasn't been bereft of them. |
| 22:30 | ddellacosta | I rather feel like namespaces are excellent in generally |
| 22:30 | ddellacosta | general |
| 22:30 | callen | half of why I preferred Python to Ruby was namespacing. |
| 22:30 | ToxicFrog | clj_newb_2345: I'm not sure, because I don't feel like I yet understand the distinction between :require and :use, between ns and in-ns, :gen-class, load, how clojure finds the files that make up a namespace, and why it can't find the goddamn opts.clj file in this project. |
| 22:30 | ToxicFrog | ddellacosta: nothing whatsoever, the hatefulness is separate. |
| 22:31 | ToxicFrog | callen: in general, I agree. In clojure specifically, they seem overly complicated. |
| 22:31 | callen | ToxicFrog: :use is kinda on the way out. it's isomorphic with :require :refer :all |
| 22:31 | ddellacosta | ToxicFrog: use = (require :refer :all) |
| 22:31 | ddellacosta | jinx |
| 22:31 | ddellacosta | this is a good article if you haven't read it yet: http://blog.8thlight.com/colin-jones/2010/12/05/clojure-libs-and-namespaces-require-use-import-and-ns.html |
| 22:31 | callen | ToxicFrog: there's a talk that explains how namespacing and vars work in Clojure. you should probably watch it. the enlightenment will make you less hateful and appreciate it more. |
| 22:32 | ddellacosta | sorry, that was for ToxicFrog |
| 22:32 | callen | ToxicFrog: the only real lack of orthogonality in Clojure namespaces is :use vs. :require :refer :all, that's it. |
| 22:32 | callen | namespaces are objects, you can enter namespaces at will, them being created if they didn't already exist, you can choose to require/import some stuff if you need it as part of the (ns ...) form. |
| 22:33 | callen | import is for Java, require is for Clojure. normal destructuring rules apply. |
| 22:33 | ToxicFrog | callen: is there a transcript of it? |
| 22:33 | callen | doesn't seem like a lot to cope with. it's a lot simpler than the weird hybrid PYTHON_PATH, "is this a file? a library?" importing issues in languages like Python. |
| 22:34 | callen | all the classpath stuff that is usually endemic to Java-world is handled for you by dint of Leiningen. |
| 22:34 | callen | ToxicFrog: not that I'm aware of. InfoQ shindig. http://www.infoq.com/presentations/Clojure-Namespaces-Vars-Symbols |
| 22:35 | callen | I hate audio/video content, if it's any consolation, but this was worth sitting through. Seriously. |
| 22:35 | callen | that talk will clear up the entire matter for you, I think. |
| 22:36 | callen | once you understand var interning, symbols, and how namespaces work I think you'll be considerably more zen about it all :) |
| 22:37 | callen | ToxicFrog: also, I don't know if you've noticed, but ":as" means the same thing everywhere in Clojure AFAICT, including :require |
| 22:40 | SegFaultAX | It's weird when your 4clojure solutions comes out super close to someone elses. |
| 22:41 | callen | should write a feature for 4clojure detecting your "peers" |
| 22:41 | futile | and that's the end of that chapter |
| 22:47 | SegFaultAX | I'm so close to the top 100 I can taste it. :) |
| 22:48 | ToxicFrog | Hmm. If I'm using dynamic binding does the original (def) need to be in scope to stuff using the binding further down the stack? |
| 22:53 | ToxicFrog | Argh why can't it see the var |
| 22:54 | ddellacosta | is for lazy? I feel like I'm going crazy |
| 22:54 | ddellacosta | I made a rhyme |
| 22:54 | cgag | yeah it is |
| 22:55 | ddellacosta | cgag: okay, thanks, that would explain this weird behavior |
| 22:55 | ddellacosta | ah, there it is in the docs, go figure |
| 22:56 | cgag | i'v e been bitten by that before |
| 22:57 | ToxicFrog | "*opts* does not exist" YES IT DOES aaaaagh |
| 22:57 | ddellacosta | yeah, dunno what I was thinking, I just spend ten minutes banging my head against the wall. "Why is nothing happening!?" D'oh |
| 22:58 | ddellacosta | ToxicFrog: seriously, if you put some stuff in a refheap, I'll take a look. Just sayin' |
| 22:59 | ToxicFrog | ddellacosta: at the moment it's kind of tricky, this is a 200 line project that I'm trying to split into several small files and there's bits all over the place. |
| 22:59 | ddellacosta | ToxicFrog: gotcha. Well, the offer stands. |
| 23:11 | ToxicFrog | Sorted out the problem |
| 23:11 | ddellacosta | ToxicFrog: what was it? |
| 23:11 | ToxicFrog | There was another file where I hadn't updated the :require and the error message was extremely confusing |
| 23:12 | ToxicFrog | Leading me to believe it was in a different file. |
| 23:12 | ddellacosta | hmm. yah, that can happen. |
| 23:17 | ToxicFrog | (more hateful than namespaces: clojure's 100+ stack frame compiler errors) |
| 23:42 | muhoo | haha, that's not clojure, that's java, mostly |
| 23:43 | muhoo | i remember those from android too. spew spew spew spew spew wtf was actually wrong here? |