#clojure logs

2013-12-03

00:00khaledhalorgium: just checked the plugin name, La Clojure
00:05bitemyappkhaled: don't use la clojure.
00:05bitemyapp~laclojure is not the IntelliJ plugin you want to use
00:05clojurebotRoger.
00:06justin_smiththere is a preview intellij plugin called cursive, that looks good from afar
00:06justin_smiththough I don't use such things myself
00:07justin_smithI think you need to sign up for the beta to get it
00:07dnolenwhen you compare Angular.js and Ember.js the usual combination of libs, CLJS + React comes out looks pretty damn good
00:07khaledbitemyapp: wich one should I use?
00:07dnolen"Angular.js Ember.js and the usual combination of JS libs"
00:07dnolenin terms of final minified zipped size
00:09technomancy~laclojure is the intellij plugin with a decent license
00:09clojurebot'Sea, mhuise.
00:10khaledas long as laclojure qive me syntaxe color and kind of completion it's enough for me
00:10logic_proghttps://gist.github.com/txrev319/7764167 <-- how do I debug something like this? a line number would be helpful, but I see no line number
00:11patchworkHelping a friend install clojure-mode in emacs, clojure mode not showing up in package-list-packages .. ?
00:11patchworkAnybody know what that is about?
00:11technomancypatchwork: add marmalade to the package archives list and M-x package-refresh-contents
00:12patchworkHmm… elpa seems reaallly slow right now
00:13jarodzzwhy not use lighttable?
00:13jarodzzfor ide
00:13technomancyjarodzz: again, terrible license
00:13technomancypatchwork: hm; I read about some connectivity issues. maybe try temporarily adding melpa as a workaround till they get resolved
00:14technomancyor M-x package-install-file from a git checkout of clojure-mode
00:14patchworkYeah having a really hard time connecting
00:14justin_smithpatchwork: are you going to try to get them set up with cider, or nrepl?
00:15patchworkOkay, after M-x package-refresh-contents with marmalade still no clojure-mode listed
00:15jarodzzi'm learning clojure and typing tutorials only. never pay attention to license
00:15jarodzzlet me do so
00:15patchworkjustin_smith: Just clojure-mode would be nice!
00:15justin_smithfair enough
00:15justin_smithanyone I know?
00:15patchworka good start at least
00:15patchworkHave you met nifong?
00:15jarodzzi'll move back to emacs-live then
00:16technomancypatchwork: I don't recommend leaving melpa in your sources list, but adding it temporarily to do a package or two should be fine
00:17justin_smithyeah, you'd think there were some marmalade users with the devop skills to make that thing rock solid
00:18technomancyjustin_smith: the current site is written in node.js =(
00:18technomancyso only one man is brave/crazy enough to touch the damn thing
00:18patchworktechnomancy: Huh, yeah he's a newbie so I'd rather not leave melpa in his sources
00:18patchworkI'll just have him install from source
00:19justin_smithpatchwork: no, I don't think I know nifong
00:19patchworkHe hung out at the space, back when that was a thing
00:20justin_smithahh, may have met him briefly there
00:20nifongYeah I may have met you once :)
00:21technomancymarmalade downtime is usually pretty brief, but this time the maintainer is flying from the UK to India
00:21technomancyhttps://mobile.twitter.com/nicferrier/status/407737142228426752?p=v =\
00:21justin_smith(with the server as a carryon)
00:22technomancyhahaha
00:22patchworkAh, bummer! bad time to show somebody clojure for the first time I guess
00:22justin_smith"please shut down all your node.js webservers while we prepare for takeoff"
00:22technomancyhehe
00:23technomancyit is pretty amazing that clojars never has these kinds of problems
00:23technomancybut I guess that's what happens when you use not-node.js
00:23technomancythe maintainer is also working on a rewrite that uses static files
00:23justin_smith"in the event of an emergency water landing, the bloat in your grunt file config will serve as a floatation device"
00:24technomancyso unless the underlying hardware goes down, most issues should be limited to uploads
00:24technomancywhich is the not-completly-insane way to do it
00:24technomancy(he didn't write the thing originally)
00:24technomancylol bloat
00:25justin_smithI tried to help with some grunt problems on a recent deploy
00:25justin_smithto be fair I am by no means a javascript buy, but still...
00:26nopromptdnolen: is delay planned to make it into cljs?
00:30justin_smithpatchwork: I am working on that plugin protocol. An absolute neccessity for me is keeping it super simple / functional / stateless. I'll run it by you tomorrow for feedback.
00:32patchworkjustin_smith: Cool, looking forward to seeing it
00:32justin_smithI keep defining this: (def nothing (constantly nil))
00:32dnolennoprompt: huh, weird - all the support is there
00:32justin_smith(def default-migrate nothing)
00:34nopromptdnolen: oh my mistake, it was promise i was looking for. ;)
00:34nopromptughh i'm tired.
00:34nopromptfrontend development is hard on the brain.
00:43jarodzzi thought it's hard for F5
00:53dnolenthis is pretty damn cool - https://gist.github.com/swannodette/7763911
01:02brainproxydnolen: it is!
01:03brainproxymy coworker and I working on something we hope will be even cooler, powered by cljs under the hood
01:03brainproxyrepo will be open to the public asap
01:07dnolenbrainproxy: looking forward to it!
01:09brainproxydnolen: it's a very different take on the whole reactive thing though
01:10brainproxyI expect some people will like it, others may find it strange
01:10dnolenbrainproxy: neat - my primary interest in React is really the rendering model
01:10brainproxywe got inspired several months ago by David Harel's work on statecharts
01:11brainproxyfrom back in the 1980s,90s
01:11brainproxyhe built a systems for interpreting statecharts which was used to synthesize realtime programs
01:11brainproxyfor avionics
01:12brainproxyso our interpretation is kind of a synthesis of google polymer, scxml and what we read in harel's big book on statecharts
01:12brainproxythe interpreter is powered by cljs and core.async
01:12brainproxythe takeaway is that two dimensional pics can't be a program just like s-exprs and curly brace langs
01:12brainproxy*can be
01:13brainproxynot can't, whoops
01:13nopromptdnolen: i love writing dsls!
01:13brainproxyand html is good for serializing/expressing the kinds of pics that make up statecharts
01:14nopromptok. time to check out this reactjs nonsense. :)
01:15brainproxylonger term we'd like to apply the approach that Harel proposes w/ live sequence charts, for building reactive UIs in an interactive fashion which is used to fuel whole program synthesis
01:15brainproxybut one step at a time
01:19dnolenbrainproxy: interesting stuff, I've seen a presentation about state charts before but never read Harel's work, saved for later reading
01:19brainproxydnolen: this is the "big book"
01:19brainproxyj.mp/harel-statecharts-scribd
01:19brainproxyhttp://j.mp/harel-statecharts-scribd
01:20brainproxydnolen: his full list of papers is here, he's written a ton about reactive programming, but again coming at it from a bit different perspective
01:20brainproxyhttp://www.wisdom.weizmann.ac.il/~harel/papers.html
01:20brainproxyI suggedsted to Alex that he should invite Prof. Harel to speak at Strange Loop :)
01:21brainproxynot sure if that will ever happen though
01:24nopromptbrainproxy: doesn't ember use state charts?
01:33Jardais there a reason to use uberjar vs. lein trampoline?
01:33JardaI don't mind having leiningen installed on my production servers
01:34jph-it'd be nice if there were a lein ppa so i could manage it via apt on my ubuntu boxes
01:35jph-actually maybe there is
01:35jph-yeh, only older versions
01:36hiredmanJarda: you should build an artifact once and deploy it everywhere, don't build it everywhere
01:37Jardahiredman: yeah, I distribute the app bundled inside a docker container
01:37hiredmanJarda: so?
01:38JardaI'm just curious if there are performance etc related differences
01:38hiredmanlein is still doing al lthe dependency resolution bits everytime you run it
01:38Jardaok
01:38hiredmanJarda: it can, lein tends to send it's own options to jvm, prioritizing start up time over jitted code quality
01:39Jardaok
01:40Jardahiredman: I seem to have a problem where there is something missing from the uberjar
01:40JardaI have java classes generated by wsimport
01:41Jardaand when I run 'lein ring uberjar' and try to run the -standalone.jar created by the command with 'java -jar' I can't use the classes
01:41Jardabut with lein trampoline I don't have those issues
01:41hiredmanJarda: how are you depending on those classes?
01:41Jardahiredman: importing them
01:42Jardaand they get imported, I get weird WSDL-factory related errors
01:42hiredmanJarda: I mean how have you told lein you depend on them?
01:42Jardahiredman: oh, I haven't
01:42hiredmanare they actually in the jar?
01:42JardaI don't know if they are
01:42hiredmanhow are you generating them?
01:43Jardacd src && wsimport https://someservice/wsdl -p some_service
01:43hiredmanugh
01:44hiredmandoes that generate java source or bytecode?
01:44Jarda.class files
01:44Jardaand the .class files seem to be inside the jar
01:44hiredmanand you are putting them in src?
01:44Jardahttp://stackoverflow.com/questions/14407218/consuming-wsdl-in-clojure
01:45hiredman(next you'll be checking the .class files in to git...)
01:45hiredmanare the class files in the jar named correctly?
01:45Jardayes they are
01:45Jardaand I don't get errors on (import ...)
01:46Jardait's when I try to use them I get weird jax-ws nullpointerexceptions
01:46Jardaand this only happens when running the standalone jar produced by uberjar
01:46hiredmanwhat is the actual stacktrace?
01:48Jardahttp://pastebin.com/tWUJjfbS
01:50hiredmanJarda: the way lein is creating the uberjar is overwriting some file wasdl needs
01:51hiredmanhttp://mail-archives.apache.org/mod_mbox/cxf-users/201305.mbox/%3C1B4AE0ED-2D3F-4974-AD4F-2DD8E5F6EF03@apache.org%3E
01:51hiredmanthey advise people using maven to use some plugin to merge the stuff
01:52Jardahiredman: ok thanks your google-fu is much better than mine
01:53hiredmanJarda: https://github.com/technomancy/leiningen/blob/master/sample.project.clj#L354 might let you do the merging with lein, if you can figure out what needs to be merged
01:58Jardahiredman: ok thanks now I think I have enought information
02:04glosoliany ideas for lain plugin capable of minifying js, css, html on build ?
02:05glosolis/lain/Leiningen
02:06sm0keoh wow now there are jna bindings for clojure!
02:06sm0kehttps://github.com/Chouser/clojure-jna
02:15sm0keoh thats like 6 years old :P
03:02noneshello
03:02nonesCan you tell me, what mean this string?
03:02nones(File. ^File (as-file parent) ^String (as-relative-path child))
03:05andyfnones: The File. means that it is calling a Java constructor for class File, whose full name is java.io.File
03:05zerokarmaleftnones: it's just a clojure-y way of calling this specific constructor http://docs.oracle.com/javase/7/docs/api/java/io/File.html#File(java.io.File, java.lang.String) with type annotations
03:06andyfThe constructor takes two arguments. In this case they are type-hinted to indicate that the first arg is an object with type File, and the second is an object of type String
03:06zerokarmalefts/annotations/hints/
03:07quesebifurcanhi, i'm looking into doing gui development with clojure. personally, i'm quite fond of the qt-framework and would like to use it, if at all possible. is qt-jambi still the way to go? most of the info i found was from 2008/2009. i would be very grateful for any advice.
03:08noneszerokarmaleft, thanks, I understood this
03:13andyfquesebifurcan: There might not be many people with a combined interest in Clojure and Qt development, but if there are, the Clojure Google group will hit a wider audience than this channel. You will undoubtedly get a suggestion to look at Seesaw, which is a Clojure library based on Java Swing components, so likely not what you want.
03:18quesebifurcanandyf: well, i have nothing against swing, yet :-) will definitely check seesaw. thanks a lot.
03:52sm0kewow i cant believe joc's chapter on clojure is so bad!
03:53sm0keon macros*
03:58sm0kei mean the first edition
03:58sm0kedont know about new book
04:07expezwhat's wrong with it?
04:13sm0kewell may be its just me, but i dont understand shit
04:14sm0kehe has examples all over for macros explaining what it does, but nothing on how it works
04:26winkI found nurkiewicz.blogspot.com/2013/06/clojure-macros-for-beginners.html to be quite nice
04:27wink~explained. no clue if it's correct
04:27clojurebotIt's greek to me.
04:31jph-stupid question, but what does an @ symbol mean in clojure
04:31jph-im looking at @(http/get "http://http-kit.org&quot; {:keepalive 30000}) as an example
04:32sritchieit's a dereference;
04:32sritchiehttp-kit returns a future,
04:32sritchieand if you want to block and wait for its value you can use @<thecommand>
04:32jph-ahh
04:32sritchieit expands out to (deref <thecommand>)
04:32sritchieif you want to poke at some docs
04:32jph-so @ will block, without it it, it'll return something to go back to
04:33jph-like a socket i can query
04:33jph-sorry if im using wrong terminology
04:33jph-c/ruby guy here
04:33winksritchie: wow, I'd never heard of that. do you know if that's "new"?
04:34sritchiejph-: well, it returns a future
04:34sritchiethat you might pass to another function, for example
04:35sritchiewink: nope, around since the beginning
04:35sritchieother things implement IDeref, though
04:35jph-im now reading up on futures
04:35sritchieatoms, for example -
04:35jph-thanks for pointing me in right direction
04:35sritchiean atom is a mutable reference to an immutable thing
04:35sritchiefor sure
04:35sritchieso when you call @some-atom,
04:35sritchieyou're peeking at the current value
04:36sritchieinside the atom, by dereferencing the atomic reference
04:36sritchiefutures (as returned by http-kit) just have this extra property that they're async
04:36winksritchie: hm, wait, I just didn't make the connections to futures, now that I think of it. thanks.
04:36sm0keis that correct statement? "an atom is a mutable reference to an immutable thing"
04:36sritchieor is that a var :)
04:37SegFaultAXNo, it isn't correct.
04:37SegFaultAXBecause it implies something about the value, but an atom can also refer to a mutable thing.
04:37sritchieI thought that clojure's atoms need to contain immutable things, since with the STM implementation calls to swap! can retry
04:38SegFaultAXAn atom is just a mutable reference, full stop.
04:38ucbhais
04:39SegFaultAXsritchie: I guess the difference is in what's correct and what's possible.
04:39sm0ke"An atom is just a mutable reference" is the converse true?
04:39sritchieyup, agreed
04:39sm0keis every mutable reference ana atom?
04:39SegFaultAXIt's clearly unsafe to have a) side-effecting mutations or b) mutable state when using atoms or refs.
04:39SegFaultAXsm0ke: No.
04:39sm0kei mean ##(do (def a 1) (def a 2))
04:39lazybotjava.lang.SecurityException: You tripped the alarm! def is bad!
04:40glosolianyone using optimus ring middleware knows how could I prevent it from crashing when there is no resource referenced in css ?
04:40sm0kethen is that proper way to define an atom? a mere mutable reference
04:40SegFaultAXsm0ke: Vars are interesting in that they have a root binding and a thread local binding, and those can be different things at different times.
04:40magnarsglosoli: are you referencing a resource in your css that you don't have?
04:40SegFaultAXRefs are similar to atoms, but provide coordination.
04:41glosolimagnars: well it's not me, but yeah that's the problem
04:41glosoliIt's jquery-ui.css which has some resources that are not on the server
04:42magnarsglosoli: ahh, that's an interesting case. so you're happy to not serve those assets?
04:43glosolimagnars: Yeah, though it's entirely wrong (I do understand that)
04:43glosoliHmm I might as well try and find them, do you know if I can somehow set encoding for js minifier? it outputs minified JS with some symbols missing in strings (which are utf8 symbols)
04:45magnarsglosoli: the utf8 issue sounds bad - could you open an issue and give me some example code that fails?
04:51glosolimagnars: I opened an issue, can you check it if I need to provide more info ?
04:52magnarsThank you, that seems sufficient. I'll make a test case and reproduce it.
04:53glosolimagnars: also there is other problem with css, if it has "/css/jquery-ui/data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7, compiling:(routing.clj:63:3)" it does not seem to handle data url(data:) uri
04:54glosoliit tries to retrieve it as resource in file system
04:54glosoliwhich it isnt
04:54magnarsexcellent point - I'll get on that as well. Thanks!
04:55karlsguys, does anyone know what happened to the marmalade repo? it seems to be down.
04:57glosolimagnars ah lol I opened duplicate issue for css
04:57glosolican you delete it ?
04:57magnarsglosoli: I'll keep yours open, since it has more information. Thanks :)
04:58rcghuzza, jvisualvm ftw :D
05:01glosolimagnars: ok, np :)
05:03glosolimagnars: the weird thing with CSS minifier, it does not even respect comments, the same data uri line commented out, still tried to find that file in file system
05:04magnarsglosoli: yeah, the code that tries to figure out the CSS dependencies isn't a full fledged css parser, so it stumbles over things like that.
05:07glosolihmm
05:17jarodzz,(+ 1 1)
05:17clojurebot2
05:20glosolihmm magnars , maybe it has something to do that I use optimize/all (for you not being able to reproduce the utf8 issue)
05:20glosoli?
05:35magnarsglosoli: no, it works for optimize/all too. I'll dig deeper tho, just thought I'd fix your data-uri issue first.
05:35glosolimagnars: ok, I will check out that utf problem
05:36glosolimaybe I can produce a test that fails
05:36magnarsexcellent
05:51glosolimagnars: Hmm is there some way I could safely transfer you the file I am having issues with ?
05:53magnarsglosoli: is it ok with email? Then this username at gmail.
05:53glosoliok sec
05:55glosolimagnars: did you get it ?
05:55magnarsaye
05:57glosolimagnars: I couldn't reproduce by copying out the function which consists of such chars, dunno maybe file encoding is wrong or smth ?
05:58magnarsglosoli: I'll check it out and see. :)
05:58sm0kehello i so not understand how this works (do (defmacro mcro [y] `~y) (macroexpand-1 '(mcro x)))
05:58sm0ke,(do (defmacro mcro [y] `~y) (macroexpand-1 '(mcro x)))
05:58clojurebot#<Exception java.lang.Exception: SANBOX DENIED>
05:59sm0kehmm no macros in clojurebot?
05:59sm0keok so result is x
05:59sm0kehow is that?
06:03sm0kehmm weird so y is actually holding a symbol inside the macro right?
06:04sm0ke,(def y 'x)
06:04clojurebot#<Exception java.lang.Exception: SANBOX DENIED>
06:04sm0kewhat!
06:05hyPiRionsm0ke: try out this instead:
06:06hyPiRion,`x
06:06clojurebotsandbox/x
06:07hyPiRionthe reason why you get back x is because values to a macro aren't evaluated
06:07hyPiRionif you did (mcro (foo bar baz)) instead, that would return (foo bar baz), not the value returned by it
06:07hyPiRionby it => the call (foo bar baz)
06:09sm0kehyPiRion: (foo bar baz) return a reference to list
06:09sm0keactually it returns the class
06:10sm0kehmm no you are right
06:35ucbwhat's a good lib for decoding netty's ByteBuffers? I know of gloss, however I need to iteratively parse different bits of the data as I go along.
06:35ucbI've recently seen the ANN for buffy, but I can't figure out how to decode a buffer with a given structure (nor how to extract a value from a buffer with a type)
06:36ucbI'm now testing balabit.blobbity however I'm wondering whether anybody has an opinion regarding any other lib out there
06:41algernonBuffy is likely faster, though, but I have not looked at it yet.
06:41ucbheh
06:41ucbwell, buffy looks good for creating ByteBuffers and manipulating them
06:41Jardais there a way to find out where I might have a circular dependency
06:41JardaI can't find any cirular requires
06:41ucbit's not entirely clear to me whether you can decode a ByteBuffer that comes from a client though
06:42algernonucb: should be, it says so in the README
06:42Jardaon another machine lein ring server-headless crashes with some problem with a circular dependency
06:42Jardacan't find it
06:43Jardaor it crashes with StackOverFlowException and stacktrace leads to dependency resolution
06:43ucbalgernon: what did I miss?
06:43algernonucb: looks like if you have a number of smaller specs, you can (decompose) the buffer iteratively
06:43algernonlet me cook up an example.
06:44ucbalgernon: that'd be great; from reading the README and the source code I couldn't find a function like (decode spec buffer) or something along those lines
06:45sm0kewhat are all the fn*, list*, .. is see in clojure? where are thry documented?
06:47amrosm0ke: they are used by clojure itself before it is fully bootstrapped
06:47algernonhmm.
06:47algernonucb: I may be mistaken here. I seem to have misunderstood decompose
06:48ucbalgernon: phew! :)
06:48ucbfor a moment there I was doubting many of my taken-for-granted skills
06:49sm0keamro: is there some reason they are not documented?
06:49algernonhmmm
06:49sm0keare they not accessible to some coding in clojure?
06:49amrosm0ke: I think they are considered internals and there's no reason for you to use them
06:49algernonucb: maybe you need to use (compose-buffer), with :buffer-type :direct or something, to get the raw ByteBuffer under a Buffy governance
06:50algernonbut I don't quite understand that part of the code yet
06:50ucbme neither
06:50llasramsm0ke: It depends on the function/macro/etc
06:50llasram,(doc list*)
06:50clojurebot"([args] [a args] [a b args] [a b c args] [a b c d & ...]); Creates a new list containing the items prepended to the rest, the last of which will be treated as a sequence."
06:50ucbI quite like the idea of (decode-blob blob fmt) in blobbity mind you
06:51algernonyeah, the main motivation for blobbity was a nice API. speed and anything else came secondary at best.
06:51sm0ke,(doc fn*)
06:51clojurebotHuh?
06:51llasramsm0ke: But `fn*` is the backing special form for `fn`, and isn't a var
06:52sm0kewhat is 'backing' special form?
06:52llasramIn that invocations of `fn` expand to code invoking `fn*`
06:53llasram,(macroexpand-1 `(fn [{:keys [foo]}] foo))
06:53clojurebot(fn* ([p__85] (clojure.core/let [{:keys [sandbox/foo]} p__85] sandbox/foo)))
06:53algernonoooh, I think I understand Buffy.
06:54llasramsm0ke: Destructuring is implemented in macros. So to get destructuring functions, `fn` is a macro, and the actual compiler special form for defining a function is something else -- `fn*`
06:54ucbalgernon: oh?
06:54sm0kehmm weird! isnt fn a special form? how can you ecpand somthing which isnt macro?
06:55sm0keoh!
06:56sm0keif `fn` is indeed a macro is it defined in core ?
06:56sm0kei dont seem to find so
06:57sm0keoh got it
06:57sm0ke41 line
06:58llasramsm0ke: https://github.com/clojure/clojure/blob/master/src/clj/clojure/core.clj#L4095
06:58llasramOh, you'd found it
06:58sm0keno this is weird, look at this https://github.com/clojure/clojure/blob/master/src/clj/clojure/core.clj#L42
07:00sm0kei am assuming ^{:macro true} is another way to define a macro
07:00sm0kei think it is beyond me at this point
07:00llasramImplementation detail way, yeah. There's weird stuff in core like redefining functions because it's building the language as it goes
07:00llasramThe version at line 41 doesn't do destructuring
07:01llasramThen ones everything necessary for destructuring exists, it defines it again with destructuring
07:01llasrams,ones,once,
07:01algernonucb: nope, I have not managed to figure it out :(
07:02ucbalgernon: sadtimes. I couldn't find a way of decoding an already existing BB either :(
07:02ucbalgernon: seems odd that this functionality would not exist though
07:03sm0kehmm i wonder if defmacro is itself a macro
07:04hyPiRionsm0ke: no, but it's rather close, actually. It's a function
07:04hyPiRion,(macroexpand-1 '(defmacro x [y] z))
07:04clojurebot#<Exception java.lang.Exception: SANBOX DENIED>
07:04hyPiRionhrm.
07:05hyPiRion,(macroexpand-1 (list* (symbol "defmacro") '(x [y] z)))
07:05clojurebot(do (clojure.core/defn x ([&form &env y] z)) (. (var x) (setMacro)) (var x))
07:05ordnungswidrigsm0ke, at the time defmacro runs, there is no macros but it works like a macro
07:05ordnungswidrighyPiRion, is that from 1.5.1?
07:06ordnungswidrig,*clojure-version*
07:06clojurebot{:interim true, :major 1, :minor 6, :incremental 0, :qualifier "master"}
07:07sm0kethere is some black magic in code after defmacro defintion (. (var defmacro) (setMacro))
07:09ordnungswidrigsm0ke: that's what blesses "defmacro" from a function to a macro.
07:09ordnungswidrigsm0ke: a macro _is_a function, but one evaluated at read time and working on sexps.
07:10sm0ketrue story.
07:11sm0keyea there is a lot there... hard to digest without reading the ugly java part in clojure
07:11llasramWell, macro-expansion time, not read time, but otherwise yeah
07:11ordnungswidrigsm0ke: there should be a book "clojure internals" or like that :)
07:12sm0kei wonder if the major dev time for clojure goes in the java code base or core?
07:13sm0keclojure code itself is slightly less than 50%
07:13sm0ke41.2%
07:13sm0kethats impressive i would say
07:14sm0keso 40% of clojure is written in clojure
07:14glosolimagnars: hmm, could it be that optimus is removing last modified header ?
07:15ucbhuh, on a different issue, if I don't specify a frame in aleph's start-tcp-server, I get a BigEndianHeapChannelBuffer and not a ByteBuffer as the docs say. Is this correct? /cc amalloy_
07:15ucbin the handler*
07:15sm0keoh wow clojure has included the whole asm library
07:16sm0keconsidering nobody would every touch that
07:16sm0keit reduces a lot of java code
07:17sm0kehaha clojure kicks java in the nuts by having it entry point as "main.java"
07:19magnarsglosoli: it's not that it removes it - it's that it doesn't add it. I didn't think it was necessary, since the URLs change for every change - but please do open an issue and set me straight. :)
07:38glosolimagnars: I figured out the problem, the compiled file from response is of charset=usa-acsii there is no way it would represent UTF-8 chars correctly
07:39glosolithough I am not quite sure if it's more js minifier output related, or some sort of response problem in middle ware
07:39glosoliBecause before adding optimus on top of it everything was just fine
07:57logic_prog_how does "next" and "rest" differ?
07:59piskettilogic_prog_: rest is lazier, next evaluates (the data structure) immediately, rest does not
08:04philandstuff,(rest [1])
08:04clojurebot()
08:04philandstuff,(next [1])
08:04clojurebotnil
08:04philandstuffthere's that as well
08:05logic_prog_pisketti, philandstuff: noted, thanks!
08:07greywolveassuming I have a function execute-tests which will throw a bunch of different exceptions, and i want to have another function which simply catches those exceptions and does something with them, what is the best naming convention for each of those? should i have execute-tests! for the main function, and execute-tests as the wrapper that catches the exceptions?
08:16logic_prog_https://github.com/swannodette/swannodette.github.com/blob/master/code/blog/src/blog/utils/reactive.cljs#L172-L183 <-- what does barrier & cyclic barrier do?
08:19harjaHi all! I'm trying the new LightTable build, but I cannot connect to the project since it cannot find the symbol *cljs-source-map*. Is there a fix for this?
08:20logic_prog_sounds like a problem with lein + project.clj + not having source maps turned on
08:21harjasounds about right. I have not enabled source maps.
08:21logic_prog_logic_prog_ ++
08:22harjaactually, the default project.clj had :source-map true
08:23harjahmm, it seems this is the same I guess: https://github.com/Kodowa/Light-Table-Playground/issues/890#issuecomment-29477706
08:39ambrosebsIt would be helpful if defprotocol threw a compile-time exception if & is used the argslist. I might propose a patch.
08:40mdrogalisambrosebs: What error gets raised? I never tried that.
08:40ambrosebsmdrogalis: nothing. [this a b] is the same as [this & b]
08:40ambrosebs& is just another symbol
08:41lazybotjava.lang.RuntimeException: Unable to resolve symbol: is in this context
08:41mdrogalisSeems patchable, even for this ecosystem.
08:42ambrosebssurely & is reserved, so it should fly
08:42mdrogalisHave you begun full time work on core.typed?
08:42ambrosebsmdrogalis: pretty much. Haven't changed very much because I've been pretty much doing that since mid-year :)
08:43mdrogalisambrosebs: Must be fun working for yourself. :)
08:43ambrosebsmdrogalis: I'm having a ball :)
08:43mdrogalisHah, good for you man. Live it up.
08:44ambrosebsSomething interesting I've observed: hammock time makes me feel really guilty if people are paying for it
08:44ambrosebs:/
08:45mdrogalisI came to that same conclusion privately.
08:45mdrogalisI feel bad when I appear to be stacking Zs on the office couch.
08:46mdrogalisInter-company culture shift and awareness needed I guess. But for you, you just gotta convince yourself that the only way to do this is to produce concrete work in waves.
08:46ambrosebs:)
08:46ambrosebsmdrogalis: yes, glad to hear that.
08:46ambrosebsmdrogalis: I was just explaining this to my gf, she likened it to an artistic process.
08:47mdrogalisambrosebs: Ah, go on.
08:47ambrosebsI certainly observe waves of productivity.
08:47mdrogalisThe waves are a peculiar thing. Because there's the small waves (alternating between hammock and coding) and the big waves (alternating between working on anythng and completely relaxing).
08:47ambrosebsmdrogalis: Like composing music say. If you haven't got any good ideas, the last thing you should (probably) be doing is writing :)
08:48HolyJak "hammock time makes me feel really guilty" - ask yourself if you would still be taking the time off if it was your money you are using; if yes => no need to feel guilty :-) Productivity != typing
08:48ambrosebsHolyJak: I don't feel guilty after it pays off, and it always does ;)
08:49mdrogalisI'm sure ambrosebs is well aware of why it's needed, same with me. It's just a psychological wall, HolyJak :|
08:50mdrogalisEventually will be overcome :)
08:50HolyJakI know; the thought that you would do it even if you paid yourself should help to break that psychowall
08:50ambrosebsHolyJak: good point
08:50HolyJakWell, it is not from my head :-)
08:51mdrogalisHolyJak: A list of logical reasons about that would make a good talk. :)
08:51hyPiRionIt is something you figured was valuable to remember, though :)
08:51andyfambrosebs: Please have your next $50 worth of hammock time guilt-free, on me :)
08:52ambrosebsandyf: oh, thanks! :)
08:52ordnungswidrigambrosebs: besides hammocking how do you judge the quality of your work and the velocity of process? Do you have similiar feelings about this?
08:53ambrosebsI have a lot to learn about working for myself.
08:53noncom,(let [f (fn [& {:keys [a b c] :or {a 1 b 2 c 3} :as params}] (println params))] (f))
08:53clojurebotnil\n
08:53noncomwhy does not :or work here? why no default values are assinged?
08:54ambrosebsnoncom: :or and or are different
08:54ambrosebsnoncom: :or is for missing entries only
08:54noncombut they are missing in the call
08:54ambrosebsnoncom: oh, sorry. I guessed :)
08:55ordnungswidrig,(let [f (fn [& {:keys [a b c] :or {a 1 b 2 c 3} :as params}] (println a b c))] (f))
08:55clojurebot1 2 3\n
08:55ambrosebsordnungswidrig: good question
08:55noncomso, turns out it does not affect the :as part ???
08:55lazybotnoncom: Yes, 100% for sure.
08:55ordnungswidrignoncom: :or seems to act only in the individual bindings
08:55hyPiRionnoncom: :as binds to the original value only
08:56noncomi see.. it is not mentioned anywhere in the docs however.. or i have missed it
08:56clgvnoncom: yeah it does not
08:56clgvnoncom: ":or" is just applied to the mentioned bindings
08:56noncomhmmm that sorta defeats the purpose to me...
08:57noncomhow do i get a default map of parameters then?
08:57clgvnoncom: what do you want? named parameteters?
08:57noncomi just want that the :as params map would contain default entries too
08:57clgvnoncom: maybe with transitive documentation support?
08:57ordnungswidrignoncom: no, what your root problem?
08:58clgvnoncom: yeah and passing the default parameters further on...
08:58noncomthe problem is that i store the params map for later reference and it must contain default entries for absent params...
08:58clgvnoncom: you might wana have a look at https://github.com/guv/clojure.options
08:59noncomclgv: interesting library, i'll take a look at that
08:59clgvnoncom: or if that's too much you can just write your own defn-like macro that does just the small task you ask for
08:59noncomoh well..
08:59clgvnoncom: if you encounter problems with it, let me know
09:00clgvit is pretty battle-tested throughout all of my projects
09:00noncomok!
09:01ambrosebsordnungswidrig: if I've scrapped several designs over a few months (or years), it seems the end result is better. So, lots of failed implementations/designs sometimes means I'm getting closer :)
09:01ordnungswidrig*g*
09:01ordnungswidrigambrosebs: that matches my experience.
09:07ambrosebsproving your income is via Indiegogo is slightly awkward when applying for a rental :)
09:08mdrogalisHah
09:20mdrogalisDoes anyone have a recommendation on a library to use to send/receive heart beats for a distributed system?
09:20mdrogalisPretty basic "are you alive?" checks to my peers.
09:43CookedGryphondoes anybody know if it's possible to retain original string begin/end positions in instaparse?
09:44CookedGryphonI know it tracks them for error output, but I would like to do source line mapping
09:51CookedGryphonah, think I've found it, span
09:51glosolimagnars, you here ?
09:52magnarsglosoli: yep
09:52glosolimagnars: hmm have you ever encountered js minifier used by optimus to remove vars defined outside functions ?
09:53magnarsthat would be a weird thing to do. It uses Uglify, which is widely used. Do you have a minimum example to reproduce it?
09:58glosolimagnars: sec
10:00glosolimagnars: https://www.refheap.com/13a971cdd197670e25e463a6e
10:00glosolimagnars: everything above function is gone once compiled
10:01magnarsMaybe they're optimized away because uglify thinks we're in a node script, and it needs to be told that it's in a browser. Thanks for your effort and patience.
10:03glosolimagnars: ok, is this fixable ?
10:03glosolior this is something uglyfs has to fix ?
10:03glosoliuglifyjs"
10:03magnarsI'm hoping it's an option that has to be passed to uglify.
10:04glosoliok I am heading home now, bbl :)
10:05magnarstake care - and thanks for you input :)
10:10jjl`hi all. i'm using wrap-keyword-params with ring and i'm getting an IllegalArgumentException that key must be integer. everything i can find on google seems to point to it being a something to do with invalid arguments to some collection functions, but i've got no idea where in my code is causing it. any ideas?
10:13mdrogalisWell ambrosebs. Maaaaybe 1.7
10:13mdrogalisD:
10:13coventry`ambrosebs: There is already a patch for that. I thought it was up for inclusion in 1.6. http://dev.clojure.org/jira/browse/CLJ-888
10:13ambrosebscoventry`: thanks. Sorry for the noise.
10:15coventry`NP, and you have nothing to apologize for. :-)
10:16ambrosebscoventry`: well, I could have done a *touch* more googling :)
11:10clgvcoventry`: it's neither approved nor screened so the assumption of the patch being included in 1.6 is pretty adventurous, I'd say
11:22gfredericksis it surprising that core.async channels can't have metadata?
11:27clgvgfredericks: is the channel itself considered a value? probably not?
11:29coventry`clgv: Thanks, I misremembered, thought it was part of this list. https://groups.google.com/forum/#!searchin/clojure-dev/alex-miller%7Csort:date/clojure-dev/CKaB7J4gIa4/5_vKiFSAi_EJ
11:31gfredericksclgv: no, but reference types have metadata
11:31gfredericksalter-meta! vs vary-meta
11:31coventry`Also, I didn't realize Alex Miller had already responded to ambrosebs about 888 when I sent that IRC message, so I am the one who should be apologizing for the noise. :-)
11:31ambrosebscoventry`: I read your message first FWIW
11:34gfredericksI suppose channels aren't exactly references either
11:34gfredericksbut still seems like metadata would be useful
12:07silasdavisdoes leiningen add a test specific classpaths when running lein test?
12:07gfredericksyeah
12:08gfredericksI think `lein with-profile test classpath` might show you what it is
12:17Jardais there a reason _not_ to use openjdk?
12:17hyPiRionperformance
12:18hyPiRionAnd if you develop programs run on client machines, to check for compatibility
12:18JardaI thought of hosting with openjdk too
12:19technomancyperformance on ARM systems lacking hardware floats is the main reason
12:19technomancy(raspberry pi)
12:19Jardaok, well I'm hosting on normal linux amd64 boxes
12:19dabdI'd like to have something like a threading macro -> but where i can refer to the last threaded argument. For example (-> expr (f x) (f y last-arg)). Here last-arg would be the value of the value that was "threaded" into the last expression. Does this make sense?
12:19hyPiRionI wouldn't be concerned about performance unless you're doing something performance sensitive yet
12:20hyPiRiondabd: check out as->
12:20hyPiRion,(as-> (+ 1 1) arg (* 3 arg) (- arg 1))
12:20clojurebot5
12:20dabdhyPiRion: perfect! thanks
12:21hyPiRionnp :)
12:32yedi+1! -- xeqi: dnolen, any plans to port your autocompleter? Would enjoy seeing an example of how core.async + protocols interact w/ react.js
12:33dnolenyedi: I need to see determine I think react.js integration is worthwhile first :) I just like the rendering approach ATM.
12:44upwardindexHow to specify the debug flag whit cljsbuild ?
12:45Morgawrokay so.. I am developing a project that requires a .jar from a library that was discontinued and is not hosted on maven, what's the best way to provide that .jar to people using my lein project?
12:45MorgawrI know lein can be setup to work with local repos but it's a huge pain in the ass, is there a way so I can just ship the .jar file of that library with the whole leiningen project directory?
12:45gtrakMorgawr: have you considered publishing an artifact for that jar yourself?
12:46coventryMorgawr: I did what gtrak suggests. It seems to work well.
12:46mdrogalisReasking from earlier: Anyone have a recommendation on a library to use for performing heart beats on a distributed system?
12:47dnolenupwardindex: debug flag? you mean enable source maps?
12:47gtrakMorgawr: you might change the group ID or something if you go that route
12:47Morgawrgtrak: mm.. I can consider it, I guess... would that clash with the original author or anything?
12:47mdrogalisMeh, I think I just need actors.
12:48technomancyMorgawr: you'd typically publish under the org.clojars.morgawr group-id
12:48upwardindexdnolen: the flag that makes variable names very long (so that you can figure out what they are) but still in advanced compilation
12:48gtrakyea, possibly, you could prefix it with com.morgawr, then it wouldn't
12:48technomancythat's the convention for "non-canonical, published for convenience"
12:48Morgawrtechnomancy: it's a java library, not a clojure one
12:48dnolenupwardindex: yeah that's not supported ATM, though I'm considering supporting more specific Closure flags
12:48dnolenupwardindex: but source maps should work for you anyway
12:49technomancyMorgawr: clojars doesn't care
12:49upwardindexdnolen: ok, I'll look into them, thanks!
12:49dnolenupwardindex: well except for locals, those'll are still tricky to identify
12:49Morgawrtechnomancy: oh okay, so I can just take this old java .jar and put it up on maven under org.clojars.morgawr ?
12:50Morgawrdoesn't matter if it isn' mine? (the source code is publicly available so it's not some hidden proprietary project or anything)
12:50RaynesIf the license allows for it, it's fine.
12:50RaynesYou'll need to write a pom.xml for it.
12:51RaynesTake a simple lein project and copy its pom over and modify it. That's what I always do.
12:51technomancyMorgawr: yeah, as long as the license permits it and it's clear about being unofficial
12:51RaynesKeeps me from ever having to remember a single thing about maven :P
12:52Morgawralright, thanks guys, I'll see how it works and what I can do ;)
12:52Morgawr(and yes, license permits it)
12:52Morgawrhttps://clojars.org/ I just follow this guide, yes?
12:53Morgawr(just making sure I'm not reading into the wrong thing)
12:53sm0ketechnomancy: why did you write grenchman in ocaml?
12:54technomancyMorgawr: I think the wiki covers it somewhere
12:55technomancysm0ke: well, I couldn't use clojure for it =)
12:55technomancyI wanted an FP language with fast startup and small executables
12:55sm0kedoes it have something to do with ffi too?
12:55justin_smithhard to beat OCaml for those criteria
12:55hyPiRiontechnomancy: you could've just made a Clojure compiler in C
12:55technomancysm0ke: yeah, although I didn't really realize how important that would be until I was in the middle of it
12:56technomancyhyPiRion: well you know me; always lazy
12:56hyPiRionApparentl that's really easy, since there are like 0 working versions of them
12:56justin_smithtechnomancy: you use ffi for grenchman? where?
12:56technomancysm0ke: basically my choices were racket, ocaml, and haskell
12:57technomancyI am going to put off racket for a few years until my kids are a bit older, and ocaml is a lot easier to learn than haskell
12:57hyPiRiontechnomancy: heh, I've been playing with the thought, but it seems rather daunting
12:57technomancyjustin_smith: for th ereadline integration
12:57hyPiRionwith the idea, rather
12:58technomancyI learned a lot more from OCaml than I would have from Racket
12:58technomancyI'm sure I would have learned even more with Haskell, but I wouldn't have been able to write it in two weeks =)
13:03technomancyanyway it's super great and you should all use ocaml for things where you can't use clojure
13:04technomancyexcept just be warned once you've used ML, seeing NPEs in clojure will drive you nuts =\
13:05noncomdnolen: a question on core.async: is it possible to catch messages from a pub that don't match any subscribed topic? i.e. don't let them get dropped and be able to parse them in some "else" or "default" function or such?
13:05seangrovetechnomancy: rewrite in haskell!
13:06seangroveCurious to see if there are as many epiphanies behind it as haskell-ites always claim.
13:06technomancyseangrove: bitemyapp is supposedly porting it to haskell
13:07technomancyapart from the FFI, the use of ocaml in grenchman is all super obvious and straightforward.
13:08technomancyI got some pretty substantial patches from hugod to make it work with Pallet, and he didn't have any prior ocaml experience.
13:08technomancyjust a lot of "yell at me if I do something stupid, and get out of my way if not"
13:10technomancyseangrove: also: cabal scares me
13:11Raynestechnomancy: It's quite a bit better now than it was a few months ago.
13:11RaynesThey finally got the sandboxes finished.
13:11RaynesYou can even start up ghci inside of 'em.
13:11seangrovetechnomancy: Can't be any worse than go's 'dependency management'
13:11seangrovetechnomancy: In fact, maybe they need your and your lein super-powers to fix cabal
13:11hyPiRionseangrove: what dependency management? =)
13:11technomancyhttps://github.com/bitemyapp/grom/blob/master/src/Main.hs#L34 haha what is this
13:12Raynestechnomancy: The worst part of it is that Haskell's compiler is so bloody slow. it takes about 6 months to compile projects with even a few dependencies. :P
13:12technomancyseangrove: oh man, google go deps. I don't even...
13:12technomancysuch facepalm
13:12Raynes so dependency
13:12arrdemmany conflicts
13:12technomancy git master
13:12danneuHas anyone run into the issue where your aot :genclass ns hangs at "Compiling myproj.bar...", but it indeed has compiled because you can ctrl-C it and then launch your app?
13:12hyPiRion much rage
13:12arrdem wow
13:12Raynes such sadness
13:13danneudamn, ruined the doge
13:13technomancyso is this [True, _, _, _, _, _] stuff from grom idiomatic or just trying to be cute?
13:14hiredmanso many commas
13:14llasramHuh. So in golang the default is to install dependencies by compiling source from `master` of dependency git repos?
13:15hyPiRionllasram: yeah
13:15technomancyllasram: yeah, the idea is that no one ever introduces any backwards-incompatible changes
13:15technomancyit's fiiiiiiine
13:15llasramCooooool
13:15RaynesBahahaha
13:15RaynesWoooow. I didn't know it automatically used master.
13:15RaynesBy default, that is.
13:16Raynestechnomancy: At least with mix I convinced folks that *that* was a horrible idea! I'm doing my part!
13:16technomancyRaynes: speaking the truth to power
13:16hyPiRionllasram: http://forums.thedailywtf.com/forums/t/27755.aspx
13:17arrdemhyPiRion: that's terifying to say the least.
13:17arrdemhyPiRion: is there at least a way to force use of a tagged commit?
13:19hyPiRionarrdem: For the Go projects I have to work with, we have build scripts or submodules which downloads the repo and checkouts the correct commits
13:19hyPiRionThat's the only reasonable thing to do as of now
13:20arrdemI suppose I should add Go and Rust to my to-learn list once I've actually used Haskell for something...
13:20arrdemhyPiRion: yeah that works.. pretty unfortunate tho.
13:21hyPiRionarrdem: yeah, it's not pretty
13:21hiredmanyou may as well use git for dependencies, because you have to rebuild from source for every architecture anyway
13:22hyPiRionwell, that's assuming you only have to deal with git repositories, and never have to look out for mercurial ones
13:23hiredmanwell, you are using Go, you deserve it
13:25OlegYchanyone noticed that datomic docs page crashes firefox aurora?
13:27sm0kewith lein is uberjar the prefered method of deployment? Did anyone faced problems when different dependencies having common package structure get overwritten?
13:28sm0kei used to have this problem with assembly in sbt while i was working with scala
13:28sm0kea LOT of times
13:28technomancysm0ke: uberjar is recommended
13:28sritchiemagnars: hey man, about to jump into optimus
13:29sm0kesomehow i havent faced this problem with lein
13:29sritchiemagnars: anything special I should look out for when integrating optimus and cloudfornt?
13:29sritchiecloudfront*?
13:29sm0kemay be my projects arent big enough yet
13:29technomancysm0ke: common files overwritten in an uberjar isn't substantially different from being shadowed during regular development
13:29technomancyvery rarely you'll have a "deep" classpath search that will work differently
13:31danneukibit hates threading macros
13:32danneubut whatever kibit says must be right
13:32jonasendanneu: no
13:32sm0ketechnomancy: that is true, i just had 80% of problem with log4j slf4j etc logging nuisance
13:32danneutoo late, kibit'd
13:33sm0keapart from that its not so common t have similar package structures
13:33seangrovedanneu: It's definitely right on the if/when choice
13:33seangroveWhen you only have one branch, use `when`
13:33slpsysi haven't had enough coffee this morning, there's gotta be something in clojure.core that just does this, right: (zipmap (map fn seq) seq) ?
13:33slpsysseems like a super common form
13:33technomancyseangrove: http://p.hagelb.org/lies.gif
13:33jonasenseangrove: that has always been up for discussion
13:33bruceadamsOlegYch: I don't see a problem with datomic docs in Aurora. any specific part of the docs?
13:34technomancyslpsys: there really should be!
13:34danneuseangrove: yeah, i can't stand if used instead of when
13:34technomancyslpsys: sadly there is not
13:34OlegYchhttp://docs.datomic.com/tutorial.html
13:34slpsysah, huh. i just didn't want to type it out if it existed in common libs
13:34llasramslpsys: What would happen in the case of duplicate keys?
13:35llasramslpsys: If you make everything a collection by mapped function result key, then you do get `group-by`
13:35bruceadamsOlegYch: looks fine in Aurora 27.0a2 (2013-12-02) (on 64bit Linux)
13:35dnolennoncom: haven't tried the pub stuff yet
13:36danneua place where threading macros almost always win for me is with arithmetic. (-> (float x) (quot 1.0e8))
13:36noncomdnolen: oh i though you're in it, so whom can i ask?
13:37dnolennoncom: anyone here or the mailing list :) I've been too busy to try the new core.async bits.
13:37noncomi see!
13:38OlegYchbruceadams: doh somehow firefox won't start with empty profile, i guess latest build is too unstable
14:02magnarssritchie: hey mate - I wrote a bit about CDN integration for optimus in the readme the other day - and it works nicely for our CDN scenario, but I haven't used Cloudfront. Please let me know if there are any stumbling blocks.
14:02sritchieokay, will do
14:03sritchiemagnars: looks like it should be easy, now that cloudfront is set up
14:03zphdsIf I have a map, how do I create a defrecord using it
14:03magnarsI would be happy to know about that too. :)
14:03sritchieI'll write it up for sure
14:03sritchiemagnars: one more Q - as a best practice, if i have, say, bootstrap.css (from an external CDN) and my own css
14:03zphdsassuming my record is something like
14:04sritchieshould I bundle the remote asset and serve it via my CDN?
14:04zphds(defrecord foo [a b c])
14:04sritchiemagnars: or just have two CSS entries, one from each CDN, assuming that they'll each deal with cache headers properly
14:04zphdsand I have a map {:a "1" :b "2" :c "3" }
14:04zphdshow do I create an instance of foo
14:04magnarssritchie: for very popular frameworks like bootstrap or jquery, I would recommend using central CDNs - just because the likelyhood of it already being in the users cache is so great.
14:05sritchiegotcha
14:05seangrovezphds: Be careful to conserve newlines, freenode is running low on 'em.
14:05zphdsseangrove: heh... :)
14:06zphdsseangrove: so got any hints for me?
14:06sritchiemagnars: nice, thanks!
14:07seangrovezphds: (Foo. (:a my-map) (:b my-map) (:c my-map))
14:08seangroveOr use destructuring (let [{:keys [a b c]} my-map] (Foo. a b c))
14:08zphdsseangrove: yeah but destructuring?
14:08zphdsah the let, of course..
14:08zphdsthanks
14:08seangroveNo problem.
14:13hyPiRionif you have defined foo through defrecord, the utility function map->foo is also available
14:13hyPiRion(map->foo {:a "1" :b "2" :c "3" }) -> #foo{:a "1", :b "2", :c "3"}
14:13seangrovehyPiRion: Ah, that's nicer
14:14justin_smithhey, before I start doing some benchmarking with criterium, how is the performance of domonad / state monad / lenses? is it out of the question for a server that needs to keep latencies low?
14:14justin_smithI like the semantics a lot, and want things to be that clean, but don't want to start changing things and find out I have to back out
14:15justin_smiththis is re: https://github.com/cark/data.lenses
14:16sritchiemagnars: so, optimus must let requests from a CDN through, correct/
14:16sritchie?
14:16sritchiedumb question, nm :)
14:18magnarssritchie: :) the way our CDN is set up, is that if there is a cache miss, then it will ask the application for the asset. So the CDN needs to know how to map from its URL to our URL. But some other CDNs will have you upload the files yourself - and then you'll hopefully never see those requests in the app.
14:18hiredmanjustin_smith: lens are pretty much the point furthest away from the clojure's "everything is just data"
14:19sritchiemagnars: as I was typing, it became clear that the urls you serve point to the CDN, not your app, there's no redirect
14:19sritchieobviously :)
14:19hiredmanjustin_smith: "we have lots of custom types, so we cannot generically manipulate data, so let's come up with this crazy thing to let us do things on all the custom types"
14:19hiredmanjustin_smith: so don't use lens in clojure, use update-in
14:19magnarssritchie: Indeed. :) You still need to link to the assets when rendering html tho, which is what :base-url is for on the assets.
14:20sritchieyup
14:20sritchieawesome
14:20justin_smithhiredman: so for the second part, using the state monad ad do-monad syntax instead of a global atom or a ^:dynamic var
14:20justin_smithis that also a waste of time?
14:22hiredmanjustin_smith: the general state monad is almost certainly going to be slower
14:22hiredmanjustin_smith: how would you replace the state monad with a global atom?
14:23justin_smithby accessing that atom to propagate state - that does nto do everything the state monad does
14:23justin_smithbut the state monad replaces the need for that
14:24sritchiemagnars: any advice on dynamically served images?
14:24hiredmanbut the state in a state monad is not global
14:24sritchieout of a database, for example
14:24justin_smithI think I garbled that. The state monad gives me an alternative for keeping state in a global atom, while also avoiding some of the drawbacks of dynamic vars.
14:25justin_smithhiredman: yes, but it is implicitly passed, rather than needing to add an extra arg to everything
14:26aconberehey folks, I've been learning clojure this last week. And one of my pain points right now is just lein / clojure startup times. Currently running `lein test` on my very trivial set of tests for a small project takes ~ 21s.
14:26aconbereis this normal? Or do I have a borked config? (hard to have perspective)
14:27technomancyclojurebot: faster lein?
14:27clojurebotfaster lein is tricks for helping speed up start time for Leiningen: https://github.com/technomancy/leiningen/wiki/Faster
14:27technomancyaconbere: tl;dr: do everything in the repl, but that wiki page has more tips
14:29magnarssritchie: hmm, that's a case I haven't considered. Since they're not static, then freezing the asset list would be problematic. You could write a custom strategy to cope with that, tho. But I think I would serve those via varnish.
14:30magnarssritchie: the main reason is that you want to reduce the IO your application has to handle - and varnish is truly excellent at that job.
14:36sritchiemagnars: gotcha -
14:36aconberetechnomancy: so I'm currently using grench connected to a headless lein running in the background
14:36sritchiemagnars: the typical way to do this is to upload to an S3 blob,
14:36aconberetechnomancy: I'm really new to this stuff so it's hard to know if I should be doing something else
14:36aconberegrench lein test 0.04s user 0.03s system 0% cpu 21.867 total
14:36sritchiethen just point at cloudfront (which refreshes from S3)
14:36magnarssritchie: Not serving yourself at all is always a good option too. :)
14:36sritchieyeah
14:36sritchiethat's where I want to get
14:37sritchiemagnars: but yeah, you're right, it's obviously really hard to go calculate the hash for everything in the DB… better to just move everything over
14:38technomancyaconbere: cool; that should help. you can also keep a project JVM resident with `lein repl :headless` in another terminal; then you can run code without launching any new processes but grench
14:38aconberetechnomancy: yeah, so I'm doing that :)
14:38aconberetechnomancy: still 21s to run :(
14:38aconbere(sad face)
14:38technomancyok, in that case it's not working
14:38aconberetechnomancy: that's the ideal scenario!
14:39magnarssritchie: Yeah. If you were in a bind tho, you could have those hashes precaculated along with the images, and then write a custom asset loader. But far better the solution you're on.
14:39sritchiemagnars: migration time
14:39nopromptdnolen: does cljsbuild allow configuration of warning messages at a granular level? when working with react the closure compiler was spewing warnings about invalid jsdoc tags.
14:40nopromptdnolen: i definitely want warnings, just not *those* warnings.
14:40dnolennoprompt: old ticket, I changed the priority - we definitely want to be able to pass most Closure config options
14:40technomancyaconbere: you could try setting GRENCH_PORT manually if it can't figure out how to infer it
14:40aconberetechnomancy: https://gist.github.com/aconbere/226a6f39c9dc74f5cc14
14:40aconberetechnomancy: I'll try that
14:41dnolennoprompt: the other one we need for React integration is prelude and / or setting a constant for the build to remove __DEV__ junk
14:41bitemyappRaynes: it does not take that long to compile things in Haskell.
14:41technomancyaconbere: ah wait, that won't help with `grench lein` crap
14:41bitemyappseangrove: yeah I'm working on grom as a comparative project, but I'm also holding onto it as something I can pair-program with somebody else on.
14:41technomancyaconbere: it's lein itself that can't find the repl server, not grench
14:41aconberetechnomancy: I think in general I don't get how to use the repl
14:42aconbereahhhh
14:42bitemyappseangrove: not much progress of late, because I haven't had anybody else to pair-program with me.
14:42aconbereinnnnnteresting
14:42Raynesbitemyapp: Dunno what's wrong with my ghc on every system I've ever used then :(
14:43nopromptdnolen: __DEV__ junk?
14:43mdrogalisI know this sounds crazy terrible, but is it possible to add a jar at runtime and also remove it?
14:43technomancyaconbere: `grench lein ...` will try to use a project repl server if it can find one, but it will start a new JVM if it can't
14:43bitemyappRaynes: Iuno. Compiling Haskell is slower than Go, but it's faster than most other languages I've compiled, including OCaml.
14:43technomancymdrogalis: you can't remove it, but you can replace the classloader with a new classloader that doesn't reference it
14:44dnolennoprompt: React includes assertions/checks not intended for production, they should be stripped when compiling with :advanced
14:44mdrogalistechnomancy: Hmm, that sounds tricky.
14:44mdrogalisThen again, the premise is tricky.
14:44seangroveThis is just horrendous looking https://github.com/cemerick/friend/blob/master/src/cemerick/friend/openid.clj#L98
14:45aconberetechnomancy: the reason I was running headless from outside my project directory is that's what grench tells me to do
14:45aconberehttps://gist.github.com/aconbere/50388ab8258863b87ab0
14:45seangroveJava interop may be a practical thing, but it's often not a pretty thing.
14:45slagyr,(with-redefs [+ *] (+ 3 4))
14:45clojurebot7
14:45aconberetechnomancy: so maybe I need to hint it to the port there?
14:45slagyrWhy doesn't that return 12?
14:46nopromptdnolen: is the closure config ticket with cljsbuild or clojurescript?
14:46dnolenslagyr: because + gets inlined
14:46technomancyaconbere: you need two repls; on efor lein and one for your project
14:46dnolennoprompt: CLJS
14:46seangrovebitemyapp: I might be up to have an evening or two per week in haskell, assuming I can make the time elsewhere to review what I've learned so it doesn't fall away
14:47dnolen,(with-redefs [+ *] (apply + [3 4]))
14:47clojurebot12
14:47nopromptdnolen: i really need to get my CA in the mail.
14:47slagyrdnolan: whoa...
14:47technomancyaconbere: the lein one runs outside the project, the project one runs inside
14:47aconberegotcha
14:48slagyrdnolan: cool... I see the the + fn is inline in clojure.core.... I gotta read up on inline again. Thanks!
14:48aconberetechnomancy: okay, heh, so I have one repl in ~ and one in my project. But I'm getting the same run times. So it looks like lein still isn't finding the project repl?
14:49nopromptdnolen: by the way, react is pretty nice. it feels much more like a library than a framework.
14:50technomancyaconbere: yeah, not sure why. `grench lein version` is instantaneous, right?
14:50technomancyaconbere: make sure you're on lein 2.3.4
14:50aconberetechnomancy: yeah version is instant
14:50aconbere2.3.3
14:51dnolennoprompt: yes this is why I'm gravitating towards, they also seem receptive to changes needed to make integration better
14:51nopromptdnolen: i did have some problems with austin though. (React/renderComponent ..) locks up the repl because i don't know why.
14:51dnolennoprompt: i.e. allowing Generator compatible objects appear where arrays must now
14:51dnolennoprompt: I've opened a ticket to make all Seqs ES6 Generator compatible
14:52dnolennoprompt: huh interesting
14:52nopromptdnolen: that's just awesome. i saw on twitter someone said the React team has clojurescript fans on it.
14:53aconberetechnomancy: upgraded to 2.3.4 still no dice :'(
14:54aconberetechnomancy: is there a way to execute lein commands direction in the running repl?
14:54dnolennoprompt: they also seem to be willing to lock down how they compute the DOM - which means you could use the same template client/server-side w/o needing to run React on the server - the template would just generate different code based on the environment.
14:56nopromptdnolen: right. that was a topic of the talk that got me really excited. it's cool they're trying to be as inclusive as possible.
14:56technomancyaconbere: no, leiningen is in a completely separate process
14:57technomancyaconbere: you can run tests in the repl though; clojure.test/run-tests
15:10s_kilkhi, does anyone know of any actual documentation on how to use the dieter library?
15:15gfrederickswhen trying to control shutting down a core.async system via a control channel, is the normal practice to use a channel that gets closed on shutdown, i.e. never has any messages on it?
15:16gfredericksthat seems useful to me because then I can use it for shutting down multiple components, without worrying about multiplexing a shutdown message
15:16dnolengfredericks: the same reasoning behind timeout channels
15:17gfredericksoh interesting
15:28seangroveAh, google support. Lovely.
15:28seangroveOn trying to update an app listing so I can get the openid realm set properly: http://dl.dropbox.com/u/412963/Screenshots/5j.png
15:32bitemyappseangrove: I'd be up for some side-by-side Haskell.
15:33seangroveOh, perfect: http://stackoverflow.com/questions/20276554/existing-listing-no-longer-editable-after-introduction-of-new-google-apps-market
15:34bitemyapprelying on Google? That's a paddlin'.
15:36seangrovebitemyapp: Necessary evil, 'm afraid.
15:37bitemyappseangrove: ick.
15:41seangroveHrm, pretty lame http://www.lispcast.com/how-to-use-new-relic-with-clojure-on-heroku
15:42seangrovetechnomancy: Perhaps you can gently shame him a bit.
15:45bitemyappseangrove: who?
15:45seangroveEric Normand, I suppose.
15:45arrdemclojurebot: paddlin is http://i.imgur.com/0UChB.png
15:45clojurebotIk begrijp
15:46bitemyapp(inc arrdem)
15:46lazybot⇒ 8
15:46pjstadigwhat is the context for paddlin?
15:46pjstadigi mean i remember that Simpson's episode
15:46hlshipI've got a core.async question
15:47arrdembitemyapp: you missed Raynes and hyPiRion pulling off an in channel doge
15:47hlshipshould try work correctly inside a go block?
15:47mdrogalisarrdem: Surely you are Fake Rich Hickey on Twitter.
15:47mdrogalisThat's the last time I heard that joke. :P
15:48arrdemmdrogalis: dude I have't been writing clojure that long. wish I was witty enough to run that account tho, it's great.
15:48mdrogalisFair enough. :P
15:48hlshipAh, as soon as I ask the question, I see the answer; I had code that was catching the exception before it bubbled up ...
15:50bitemyapphlship: just be aware of thread-shuffling, everything else should otherwise work.
15:50bitemyappI'm pretty sure core.async doesn't make any thread affinity guarantees.
15:51bitemyappand if it does, it shouldn't, so the punters can stop using threadlocals.
15:51bitemyapparrdem: when was this?
15:51arrdembitemyapp: about 12:15 I think.
15:51bitemyapparrdem: what time zone? my server is set to UTC.
15:52arrdembitemyapp: US-CENTRAL
15:52bitemyapp12:15 UTC doesn't show any activity.
15:52bitemyapparrdem: you need to change your clocks man.
15:52bitemyappit's 2052.
15:52arrdembitemyapp: Texas is best. why would I care about the time anywhere else?
15:52coventrybitemyapp: Search the logs for "doge." The term was used at the time.
15:52bitemyappI see it now.
15:53bitemyapparrdem: true, but UTC is useful.
15:53arrdembitemyapp: agreed.
15:53coventrybitemyapp: Are there any handy examples of use of thread locals which would be dangerous in a go block?
15:54bitemyapparrdem: Dune: "we go forward, we go back."
15:54clojurebotI don't understand.
15:54arrdemclojurebot: that's ok, nobody does.
15:54clojurebotGabh mo leithscéal?
15:54bitemyappcoventry: most global threadlocal vars in session libraries used in Ring (except for what I do) aren't async-safe.
15:55coventrybitemyapp: Oh, so (binding) dynamic vars? Makes sense. Thanks.
15:55bitemyappcoventry: it has nothing to do with Go blocks, any async environment in which threads are getting reassigned isn't going to play nice with threadlocals unless there's thread affinity.
15:55bitemyappand thread affinity is a bad idea.
15:56stuartsierrahlship: Regarding try/catch in a `go` block, it's supposed to work, but there were some bugs in the `go` macro's handling of nested try's. Don't know if that's been fixed.
16:14technomancyso, if we use content-type for nrepl responses, I wonder if it doesn't also make sense to use content-disposition
16:15technomancycould control whether something gets placed in a new window vs dumped in the repl buffer vs saved to disk
16:25noprompttechnomancy: is there anything built in to leiningen that can display meta data about project dependencies? (ie. the url, project description)
16:26technomancynoprompt: just https://github.com/technomancy/lein-licenses
16:27technomancyURL/description would be easier to write though
16:28technomancyoh nice; this is one of those codebases where the first line is a comment apologizing for what follows
16:28noprompttechnomancy: awesome. i can use this as a starting point.
16:28noprompthaha.
16:31aconberetechnomancy: so I've been trying to figure out how to run my tests on the repl
16:31aconbere:P
16:32aconberehttps://gist.github.com/aconbere/c6ba74fd91e658c1ba99
16:32aconbereit can't seem to find my tests
16:32aconberebut the tests run fine in lein test
16:33aconbereand the core tests are just in the default file created by lein new
16:33aconberesorry to be a bother just ... wondering if you could help me out here :-/
16:34technomancyaconbere: not sure; that should work fine.
16:34aconbere:-/
16:34justin_smithaconbere: g and n switched
16:34justin_smithyou misspelled
16:35aconbereomg
16:35aconberethat would be amazing
16:35arrdem(inc justin_smith)
16:35lazybot⇒ 16
16:36technomancyapplication/atomdeleted-xml is a registered mime type
16:36technomancywhyyyy
16:36justin_smithdid you want it?
16:37technomancyjustin_smith: I just ... it seems like the wrong thing
16:37aconberewow
16:37aconbereI feel like an amazing idiot now
16:37technomancythe fact that it's deleted has nothing to do with its type
16:38justin_smithapplication/maybedeleted+xml
16:38justin_smithfor the haskell user who is also using xml
16:38technomancythere's an application/mp21 and application/mp4
16:39technomancybut no application/mp3
16:39arrdemtechnomancy: aren't mp21/mp4 open codecs tho?
16:39arrdem*open(ish)
16:39justin_smitharrdem: containers, that hold encoded things
16:41arrdemjustin_smith: you've lost me
16:41technomancyarrdem: oh geez; I didn't realize the mp3 patent was still active in the US
16:41arrdemtechnomancy: yerp.
16:41technomancygot another 22 months to hang on
16:42justin_smitharrdem: the file format is not a codec, a codec is a thing that encodes or decodes, the contents of a container are encoded/decoded, the file format is the container's format
16:42arrdemthat little? I'll book a party...
16:42technomancywikipedia says september of 2015
16:42arrdemwikipedia does not lie*
16:42technomancyof course in the civilised world it expired years ago
16:42justin_smithyou can have open container with patent encumbered contents, but the file format is open because the container is
16:43arrdemtechnomancy: it's unfortunate that neither of us live there.
16:43arrdemjustin_smith: ah ok.
16:43technomancyjustin_smith: the container is just mpeg though, right?
16:43justin_smithmpeg4 is a specific container
16:44justin_smithhttp://en.wikipedia.org/wiki/MPEG-4_Part_14
16:44technomancyhuh
16:44justin_smithit can contain mp4 / mp3 / mp2 / mp1 encoded data
16:45justin_smiththe fact that they give the same names to the encoders and containers and the encoded streams is a source of endless nuisance and confusion
16:45justin_smithit is as if we named edn, clojure, and leningen all "clojure"
16:45justin_smithwhich would make things so much simpler!
16:45technomancyjustin_smith: "programming clojure" "clojure programming" "practical clojure"
16:46justin_smithheh
16:47technomancyso I feel like for nrepl to signal for the editor to display a message or alert, it should use content-type text/plain with content-disposition message or something
16:48justin_smithwhat if I want a structured interactible popup
16:48stuartsierraContent-disposition: "Your fault"
16:48justin_smithlike say a schmetterling stack trace, to pick a random example
16:49technomancyjustin_smith: if you need interactivity you should return HTML
16:49technomancyI actually already have that part working
16:49justin_smithcool, makes sense
16:49justin_smithcool!
16:49justin_smithdo you have a link to that?
16:49technomancywith relative hyperlinks that trigger further nrepl messages
16:50technomancyit's still pretty proof-of-concept-y
16:50technomancyhttps://groups.google.com/forum/#!topic/clojure-tools/rkmJ-5086RY
16:50technomancyhttps://github.com/clojure-emacs/cider/tree/content-types
16:50justin_smithcool, I will keep an eye on it, thanks
16:51technomancyhttps://github.com/technomancy/nrepl-discover/blob/master/src/nrepl/discover.clj#L141 <- example op that returns HTML
16:51justin_smithofficially watched that branch
16:51technomancythat one just increments a server-side counter, but I've gotten it working with cider
16:52justin_smithvery cool, looks like with some legal stimulants and some uninterrupted time to think I could potentially integrate that into the debugger design
16:52technomancyjustin_smith: driving use case for html responses is to make a hyperlinked inspector a la slime
16:52technomancybut it might make sense for a debugger too
16:53justin_smithwell this is a stack trace browser with inspection
16:53justin_smithnot so much the stepping etc. right now
16:53technomancysure
16:53justin_smithso that seems to fit that nicely
16:53technomancyis there really no mime type for ansi-colored text?
16:53technomancyI find that difficult to believe
16:55justin_smithhttp://lists.freedesktop.org/archives/xdg/2006-March/006214.html I find this, but I don't think it is standard
16:56justin_smithbut that is what x- is for, right?
16:56technomancyactually I think that's deprecated
16:56technomancythe x- prefix I mean
16:56justin_smithyeah, now I see it is
16:57technomancytext/x-ansi looks related but is possibly a broader scope
16:57technomancy"It is similar to ASCII art, but constructed from a larger set of 256 letters, numbers, and symbols — all codes found in IBM code page 437" seems to imply some insane encoding scheme
16:58justin_smithahh yeah
16:58llasramCP-437 I believe was the original MS-DOS 8-bit character encoding
16:59technomancywould rather not go down that path =)
16:59justin_smithyou would think there would be a mime type for "text with embedded vt100 compatible escape codes" which is what ansi colors are right?
16:59technomancyyeah
16:59llasramBut you get box-drawing characters!
16:59technomancyllasram: application/ncurses =P
17:01technomancyreading through the IANA pages is just an interesting picture of "who bothered to actually submit their stuff for standardization instead of just plowing ahead"
17:07technomancydoes vim call them buffers same as emacs?
17:08arrdemtechnomancy: 75% positive
17:09steeriotechnomancy: yes and no, the term might have a somewhat different definition
17:09justin_smithI dunno if vim has the concept of a buffer with no backing file
17:09technomancyoh hrm; that sucks
17:10steeriobuffers are usually files; windows can contain buffers or other types of content
17:10steerioand a buffer is also not necessarily bound to a window (which means it is not necessarily presented to the user visually in a given moment)
17:10justin_smithoh, it does have the concept of a buffer with no file
17:10justin_smithjust double checked
17:10technomancysteerio: would it work for an nrepl server to return a response that could result in a new buffer being created?
17:11trinaryscratch buffers?
17:11trinary:set buftype=nofile I think
17:12steeriotechnomancy: definitely
17:12steeriobut it'd be a piece of vimscript that would be doing it, i guess
17:13technomancysteerio: sure
17:13steeriotechnomancy: what's the plan? i guess i arrived in the middle of a discussion.
17:13aconbereztellman: do you have a branch setup for aleph working on core.async channels?
17:13ztellmanaconbere: not yet
17:14aconbereI half assed mirrored interfaces for udp and tcp that just bridge the two
17:14aconberein a not particularly impressive way
17:14steeriotechnomancy: repl in a buffer (had been done, not really usable) or a namespace browser, doc viewer?
17:14aconberebut it works really well :)
17:14technomancysteerio: I'm trying to design a system for rich nrepl interaction that could be editor-agnostic.
17:15technomancysteerio: ideally it would be general-purpose
17:15technomancyyou could write clojure-side commands to drive editor behaviour
17:15technomancystep 1: https://groups.google.com/forum/#!topic/clojure-tools/rkmJ-5086RY
17:16justin_smithtechnomancy: the problem I ran into playing with this stuff is elisp has no threading, unless you start OS processes and communicate via pipes
17:17justin_smithwhich makes communicating tightly back and forth annoying
17:17justin_smithbut you are probably well past those issues already with nrepl
17:17steerioso this basically is an enriched communication protocol that the other side, the editor may choose to use or ignore
17:17technomancyjustin_smith: yeah, nrepl is already fully async
17:17coventrySomeone needs to port the go macro to elisp. :-)
17:18technomancysteerio: right; ideally you could always fall back to text/plain if the client declares that's the only thing it supports
17:19coventryIf the goal is to be able to drive the editor from clojure, it might be worth borrowing from tools which already try to do something similar, like pymacs.
17:19bitemyappjustin_smith: bulwark kinda already does that, but for something else.
17:19technomancyjustin_smith: what I really want to do is have a middleware that converts exceptions into jpegs with terrible rendering artifacts
17:19justin_smithnice
17:19technomancycoventry: hm; interesting
17:20steeriowhat's a use case for driving the editor from clojure?
17:20steeriolike, any example
17:20bitemyappcoventry: probably be easiest to integrate JavaScript, then use CLJS + Node.js
17:20coventrysteerio: integrated debugging and tracing.
17:20bitemyappI don't see the JVM working nicely with something like Emacs. I could be wrong.
17:20technomancysteerio: everyone has to reinvent the wheel with stuff like jump-to-definition, docstrings, run tests, toggle tracing, etc
17:21technomancysteerio: I have a proof-of-concept where each of those are done server-side, so you just need a small editor-side shim (less than 200LOC in the elisp case)
17:21technomancyso improvements to a single implementation benefit everynoe
17:21steerioall these could be handled as actions that are initiated from the editor
17:22technomancysteerio: right; the editor is just a frontend
17:22steeriowhich fits the already existing request-response pattern
17:22technomancythe meat all happens server-side
17:22bitemyapptechnomancy: an HTTP or socket API + callbacks that allowed generic language integration could be cool.
17:22steerioso clojure doesn't have to "push" events on its own to the editor
17:22steerioi'd certainly wouldn't like anything to happen in my editor that i haven't initiated there
17:22technomancysteerio: yeah, "drive" may have been the wrong word
17:22steerio-'d
17:22technomancybitemyapp: technically nrepl is transport-agnostic
17:23technomancythere's an HTTP transport for nrepl, but it only has one client
17:23bitemyapptechnomancy: I'm thinking more like Pymacs-as-a-service than something like nrepl-discover.
17:23gfrederickseven if nrepl doesn't believe in transport, transport believes in nrepl.
17:23technomancyreading up on pymacs now
17:24bitemyapptechnomancy: Pymacs is how I use Rope and other IDE-esque features for Emacs.
17:24bitemyappPymacs is a little janky though, which is why I vendored the dependency in my dotfiles.
17:24technomancynever understood the "I want to write python instead of elisp" motivation at all; sounds terrible
17:24bitemyapprealistically something like Pymacs could be a language-agnostic service provider.
17:24bitemyapptechnomancy: meh, it was needed to leverage rope.
17:24technomancyIMO having it be driven by editor portability makes way more sense
17:24bitemyapptechnomancy: Rope is the most thorough open source way to analyze Python code.
17:25bitemyappto reuse that in vim and Emacs meant pymacs and whatever the vim equivalent is.
17:25technomancybitemyapp: sure, for hacking on python itself
17:25bitemyappI think the vimmers actually just invoke command line stuff that runs rope.
17:25technomancysome of the docs seem to indicate it's a way to write python just to avoid writing elisp
17:25bitemyapptechnomancy: right, but that's the point, the languages understand themselves and nobody had the good sense to do like Scala and Haskell and make "IDE as a service" providers.
17:25technomancyor maybe I was misreading things
17:26bitemyapptechnomancy: it's so you can directly leverage Python libraries in talking to Emacs without shelling out.
17:27technomancyyeah makes sense
17:27technomancythat's basically what I'm talking about for clojure, except without the whole crazy "hard-coded to a single editor" bit
17:27technomancynrepl-discover is just a small facet of that
17:28bitemyappoh lawd, maintenance interval. Time to make myself scarce.
17:28technomancywhat's a neutral way to say "buffer" (the emacs/vim definition)?
17:28technomancyany eclipse users around? =)
17:28steerioso from what i'm gather (while packing for a trip, hence the intermittent attention) you'd want to implement as much on the clojure side as possible to avoid coding the same logic for each editor
17:29steerio"i'm", crap, i can't english today
17:29coventrybitemyapp: By "IDE as a service", do you mean something like what technomancy wants nrepl-discover to do?
17:29technomancysteerio: zactly
17:30steeriothe discussion sparked my interest because i've been using vim for 14 years and use it actively for clojure development
17:30coventrybitemyapp: Because if some language has already done something similar, it would be really interesting to look at.
17:30dsrxhttp://www.mew.org/~kazu/proj/ghc-mod/en/
17:30dsrx^ for haskell
17:30coventrydsrx: Thanks.
17:31technomancydsrx: huh; is this a command-line program?
17:32technomancylooks like a nice place to steal ideas from
17:32technomancybut they don't seem to care about non-textual responses
17:32technomancyI think racket and factor are the only ones who do that
17:36steeriotechnomancy: can emacs display bitmaps? vim certainly cannot.
17:36coventrysteerio: Yes it can.
17:36technomancysteerio: yeah, emacs can do most image types, svg, etc, but you would send an accept header with each request to indicate what you are capable of displaying
17:37technomancyhttps://github.com/clojure-emacs/cider/blob/content-types/nrepl-client.el#L74 for instance
17:37steerioof course opening a separate app can still work with vim (could make sense if the nrepl server is remote)
17:37technomancysteerio: it is the Unix Way =)
17:38bitemyappcoventry: Haskell's ghc-mod, shime, ensime, etc are all examples of this.
17:38bitemyappcoventry: they're APIs that you call from your editor to perform IDE functionality.
17:38coventrybitemyapp: Thanks.
17:38steeriotechnomancy: do you also consider loading non-textual content only on demand as a feature?
17:39technomancysteerio: not sure what that means
17:39bitemyappcoventry: this way, improving the service improves the faculties of all the editors simultaneously.
17:39technomancyhuh; didn't realize ensime was editor-agnostic
17:39steeriotechnomancy: e.g. some response is a vector of 20 images, i don't necessarily want to display all of them, thus even downloading them is a waste of resources
17:39steeriotechnomancy: i click on element 2, gets downloaded and displayed
17:39coventry"shime" actually has "emacs" in the acronym. :-)
17:40technomancysteerio: ah... I see. that sorta makes me think of the mime-multipart spec
17:40dsrxnrepl can send non-textual information? what?
17:40jtoyi am building my own api layer on ring, typically how is the api key passed with the request, it shouldne be just a plain get param,otherwise everyone can see it
17:40bitemyappcoventry: meh.
17:40technomancysteerio: you still end up downloading the whole thing, but it's a way of putting many messages in a single response
17:41steeriotechnomancy: my company kinda specializes in software that's used in low-resource settings (for example medical software used in rural burkina faso, very scarce internet access), so this can be an issue
17:41bitemyappcoventry: http://www.mew.org/~kazu/proj/ghc-mod/en/
17:41technomancysteerio: if you need real laziness I think you need more roundtrips
17:41steeriotechnomancy: just as an example where such bottlenecks might count
17:41dsrxjtoy: everyone can see it just as much no matter where it is in the request, unless you mean you could inadvertedly include it in the logs or something
17:41bitemyappcoventry: ghc-mod replaced shime.
17:41technomancysteerio: responses can contain URLs that point to further nrepl calls
17:42technomancydsrx: nrepl can send anything! =) just a question of what the client knows how to display.
17:42steeriotechnomancy: question is, how long does the remote side actually hold those objects
17:42bitemyappcoventry: if you use Emacs, vim, or sublime, you're using ghc-mod. The Eclipse and FPComplete people have their own bullshit.
17:42jtoydsrx: so just put it in get? how about the http headers ?
17:42technomancydsrx: https://groups.google.com/forum/#!topic/clojure-tools/rkmJ-5086RY
17:42dsrxjtoy: i typically send api keys as basic authentication, and always use SSL
17:42technomancysteerio: right. I don't think that should necessarily be the job of the nrepl protocol to determine the scope of resources.
17:42technomancythat's something you'd build on top of its session support
17:43dsrxtechnomancy: neat, thanks
17:43steeriotechnomancy: the only thing that concerns the protocol is that i need to be able to configure how much / what kind of stuff i'd like to eagerly get
17:44technomancysteerio: like an HTTP HEAD request?
17:44steeriotechnomancy: i do support image/png, but i might not eagerly want it
17:45steeriolet's stick to an easy example, i make a repl request that results in a vector of 20 images
17:45steerioi need to receive that it's a vector of 20 images, but eagerly getting all the image data might be overkill
17:45dsrxthe HTTP accept header accounts for that unless i'm misunderstanding you; you can attach a weight to each MIME type
17:45technomancysteerio: I think the best way to support that is to return a bunch of references to server-side data through further requests
17:45steeriosame if it's a huge 24bit surround audio file, whatever that can be big
17:46Guest2849how would one go about reifying this interface signature: public interface Expression<T>
17:47steeriotechnomancy: and keep around the data for the scope of a couple of additional requests, *1 style?
17:47gtrakGuest2849: generics don't exist at runtime except as metadata
17:47jtoydsrx: I am going to try setting http headers
17:48technomancysteerio: yeah, I feel like that stuff belongs in the application layer
17:48steeriotechnomancy: so then responses need a uuid or a sequence number so the editor can clearly address it
17:48gtrakclojure's comiple-time is within java's run-time
17:48Guest2849gtrak: thanks... so do I ignore the signature, or what i the syntax to specify the generic?
17:49gtrakignore it, I believe
17:49Guest2849gtrak: okay, thanks, I will give it a try...
17:49dsrxboo type erasure
17:49gtrakGuest2849: http://stackoverflow.com/a/4004962/2559313
17:51Guest2849gtrak: thanks, that seemed appropriate... the issues I am getting now are unrelated, so I think that was an appropriate tack, thanks again
17:52Guest2849gtrak: and thanks for the SO confirmation
17:52bitemyappDatomic's REST API might be the most half-assed thing I have ever seen.
17:52bitemyappWelp. Time for a custom peer.
17:56dnolenwow Cursive Clojure for IntelliJ is pretty fancy
17:57bitemyappso I've heard. I didn't care for it myself.
17:57bitemyappit's what I recommend to people that want to stick with IntelliJ, since IntelliJ themselves are too lazy to maintain LaClojure.
17:58gtrakI just can't unlearn emacs.. even for java.
17:58bitemyappEmacs uber alles.
17:59scottjwhere lazy = hard at work making solid IDEs for several of the most popular languages :)
17:59arrdemgtrak: is there a reasonable way to pull that off? I haven't tried yet
17:59arrdembitemyapp: thanks for ensime, dat package did work
18:00bitemyapparrdem: I'm disappointed in you.
18:00arrdembitemyapp: wat
18:00bitemyapparrdem: ditch the pleb FP, use Haskell instead >:P
18:00bitemyapp~scala is pleb FP
18:00clojurebotAck. Ack.
18:00technomancydoth it reek of the cubicle farm?
18:00bitemyapp~scala is a good way to make people hate functional programming
18:00clojurebotOk.
18:01arrdemtechnomancy: verily
18:01bitemyapptechnomancy: the language is perversely designed.
18:01ToxicFrog~scala is like haskell except I can actually get stuff done in it
18:01clojurebotIn Ordnung
18:01bitemyappif designed is even the word for it.
18:01bitemyappToxicFrog: why are you even here?
18:01technomancybitemyapp: axisofeval reference
18:01arrdemToxicFrog: I'm comming fore you
18:01bitemyappToxicFrog: Clojure and Haskell both do a better job of representing FP than Scala, Scala is fake FP that forces you into OOP/imperative programming because of the mis-design.
18:02technomancyoh wait, it was loper-os, not axisofeval
18:02dsrxlol, axisofeval
18:02technomancybitemyapp: http://www.loper-os.org/?p=42
18:02arrdembitemyapp: scala's design makes perfect sense if you think about it as being Java with FP and implicits hacked ontop rather than considering it a real FP language.
18:02arrdemthat guy...
18:03quizmeI'm parsing files about about 20k each. If I call (dorun (pmap parse-files (take-while (not (nil? file-seq))))) is it likely to overflow the memory if I call this "lein trampoline run" without any special java compiler options?
18:03bitemyapparrdem: it's terrible. I'm digging up a post from Kmett, just give me a moment.
18:04quizmeoops, i made a mistake with the take-while, but you know what i mean(?)
18:04bitemyapptechnomancy: Edward Kmett (famous Haskell hacker, lens guy) wrote a ton of Scala at work for the first version of the Ermine language, he rewrote it in Haskell for reasons I will post in a moment.
18:04arrdembitemyapp: I've written one program in scala because the prof insisted in scala. chill. I'm still a believer :P
18:04ToxicFrogbitemyapp: so, I really enjoyed using Scala, most of my scala work is state-light and HOF-heavy, and if not for my experience with scala I probably wouldn't have bothered looking at clojure
18:04bitemyappding ding ding, http://www.reddit.com/r/haskell/comments/1pjjy5/odersky_the_trouble_with_types_strange_loop_2013/cd3bgcu
18:05bitemyappToxicFrog: the moment you need to write anything performant, FP in Scala falls apart.
18:05bitemyappToxicFrog: read the post I just linked.
18:05technomancybitemyapp: yeah the only reason I said anything is that you reminded me of the loper-os guy
18:05bitemyappScala makes true FP incredibly painful.
18:05ToxicFrogscala is also the language that convinced me that I don't hate static typing, I just hat emost statically typed languages
18:05bitemyapptechnomancy: I hope not.
18:05ToxicFrogFortunately nothing I write outside of work is performance-constrainted
18:05bitemyappToxicFrog: Scala convinces most people that they hate FP.
18:05bitemyappToxicFrog: when there are no constraints or design goals, anything can work.
18:06ToxicFrogYes, kessler would probably have been faster in another language, but those costs are completely dominated by the cost of sending and recieving 10+MB of data to a remote server
18:06ToxicFrogetc
18:06arrdemtechnomancy: ouch. that's harsh even for beating on bitemyapp
18:06bitemyappToxicFrog: read the post.
18:06bitemyappit's not just about speed.
18:06ToxicFrogbitemyapp: I am not arguing that scala is a perfect language for all or even most applications. I am just saying that I greatly enjoyed using it and it got me interested in languages and programming techniques I would not otherwise have played with.
18:06bitemyappit's about how Scala punishes FP semantically.
18:06bitemyappToxicFrog: read the post.
18:06bitemyappToxicFrog: seriously, stop yapping at me. I've used Scala plenty.
18:07bitemyappI hate it because I know it, not because I don't.
18:07bitemyappI'd rather write Clojure than Scala and I *like* types.
18:08ToxicFrogbitemyapp: I have. None of those were problems for me except tail recursion. Maybe it would be different if I were using it for big performance-critical customer-facing production systems, but I wasn't because I don't find that enjoyable.
18:08bitemyapptechnomancy: in particular, the absurd type signatures in Scala once you get into monads and the like really pissed me off.
18:08bitemyapp"except TCO", implying that's somehow a small thing.
18:09ToxicFrogIt was small enough that I opted to write a bunch of programs in scala instead of lua or python.
18:09ToxicFrogOr haskell.
18:09ToxicFrogThese days I would probably use Clojure + core.typed for everything and just hold my nose at the awful error reporting
18:21arrdemhow is it that there isn't a good treebeard hasty meme
18:22arrdemjust didn't search hard enough. failure is mine.
18:22bitemyapparrdem: HOOOOM
19:28kairnI'm paying my monad dues right now (with algo.monads) and `domonad`'s use of nested function calls makes me wonder, if `Let` is an example of the identity monad, and every binding represents a nested function call, does that mean I can blow the stack if I bind enough variables?
19:33brehautkairn: yes i believe so
19:33brehaut(with the identity monad)
19:34brehautkairn: its a real problem for doing the monadic parser combinator approach in clojure with complex grammers and large inputs
19:35brehautkairn: algo.monads includes special case wrappers for things like state-m (and state-t) to do common things with macros rather than bind to avoid just that problem
19:35kairnbrehaut: and is that generally a problem, or is the lack of TCO on the JV< the real culprit?
19:35brehautlack of TCO
19:36kairnSo, wouldn't it have been possible to rewrite at least some of the monads using recur?
19:36brehauta bind recursion is a mutual recursion, so no
19:37kairnI don't recognize any mutual recursion in the macro expansion, how so?
19:38brehautapproximately (fn indentity-bind [m f] (f m))
19:38brehautbind calls f
19:38justin_smithshould I extend my protocol to java.lang.Object, or is that intrusive?
19:39brehautif f then calls bind again, they are doing a mutual recursion
19:39brehautso (identity-bind 1 (fn [x] (identity-bind 2 (fn [y] [x y]))))
19:40brehautie (let [x 1 y 2] [x y]) using identity monad
19:41brehautjustin_smith: rule of thumb that i got from i think joy of clojure: you can extend a protocol to a type if you own either the protocol or the type.
19:42kairnah, that's right.
19:43justin_smithbrehaut: cool, thanks
20:09technomancythere's no built-in way to get a file for a given namespace, right? you have to just pick a var and use that?
20:10arrdemtechnomancy: the backing source file of a ns? definitely not
20:13technomancyso actually it's easy; you just (comp :file meta val first ns-interns the-ns symbol)
20:14technomancydrop-last 2 if you have an actual c.l.Namespace
20:15arrdemthat's what I came up with... is :file guranteed? it should be trivial to come up with a case where :file is wrong or not meaningful.
20:15technomancyin this case I think I'm safe; it's unlikely people are entering deftests in the repl
20:16arrdemyeah unless someone's being silly and metaprogramming tests should work.
20:16technomancythen they can suck it up an run their tests manually =)
20:16arrdem=D
20:16technomancyeven macro'd deftests will have :file though
20:18arrdemyeah any read or macro'd symbol that'll be OK for but if you do code generation via eval at runtime I think you could break :file.
20:20technomancysure if you want to go out of your way to just ask things to break =)
20:22technomancyargh; :file can be relative
20:25technomancyclasspath-relative too; not just pwd-relative
20:26arrdemyep ... are we having fun yet?
20:27arrdemI think that they can even be inside jars... lemme see if I can get one...
20:30dabdis there a debugger i can use for stepping over forms?
20:30dabdcurrently using emacs + nrepl only
20:30arrdemtechnomancy: check this one out. (-> 'clojure.core.typed ns-interns first second meta :file) -> nil
20:31technomancyarrdem: I gave up; I have to pass a filename arg in from higher up
20:31technomancybut feel free to continue to have fun with this problem =)
20:31arrdemsurprisingly c.c has :file...
20:58xpeI just realized it is not easy to increase the precision of a BigDecimal! http://stackoverflow.com/a/20365270/109618
20:59xpeLong story short: You have to figure out what scale you want (by some adding and subtracting) then use `.setScale`. There is no single, simple way to change precision directly in such a way that will increase or decrease it.
20:59xpewith-precision will not do what you expect, but it isn't its fault. Java BigDecimal seems kindof crazytown to me
21:00xpeseancorfield: you've done work on Numeric Tower, right?
21:04dbsrevening all, im looking for a functional approach for this problem. I have a 2 dimensional grid which is a representation of a monochrome image (eg, pixels either are black (1) or white (0))
21:05dbsri would like to get every line in the image (both vertical and horizontal)
21:05dbsri know I can use a while loop and simply iterate over the 2d grid
21:06bitemyapparrdem: I love poker.
21:06dbsrim thinking takewhile?
21:06bbloombitemyapp: that was a roulette or craps reference :-P
21:06arrdembbloom: craps is what I was thinking
21:07arrdemwith one die having all the c.c/* symbols for sides
21:10arrdemdbsr: seems like the concat of the map of (get-row n) and (get-col m) over the row and column ranges...
21:13alandipertdbsr: is your grid a vector of vectors?
21:31buddywilliamshello Clojure community
21:32buddywilliamsenjoying all the things I am learning from Clojure and the community, so thanks!
21:33technomancy~group hug
21:33clojurebotPardon?
21:35hyPiRion:D
21:36gfredericks(inc us)
21:36lazybot⇒ 3
21:37arrdemwait wait since when do we have collective karma!
21:37gfrederickssince three incs ago
21:37gfrederickshey we can inc/dec people in combinations
21:37gfredericks(inc hyPiRion+technomancy)
21:37lazybot⇒ 1
21:38buddywilliamsI am writing a Chess program in Clojure, wahoo.
21:38hyPiRiongfredericks: but what if people inc the other way around?
21:38arrdemgfredericks: until (doseq [badass [hyPiRion technomancy]] (inc badass)) works I won't be impressed.
21:39bbloomclearly inc should be a polymorphic operation which is defined for sets
21:39arrdem(inc #{bbloom})
21:39lazybot⇒ 1
21:39gfredericks(inc bbloom+polymorphic-operations)
21:39lazybot⇒ 1
21:39arrdemseems feature complete
21:40hyPiRionhmm
21:40dabdwhen working with zippers if I call (z/children loc) I will get a seq of the children of node at loc but each element of the seq is a node and not a loc. I would like to get a seq of locs so I can test each children with z/branch? Is there any way to do it?
21:41hyPiRion(inc `([~@%&](+)))
21:41lazybot⇒ 1
21:41arrdem$karma inc
21:41lazybotinc has karma 4.
21:41bbloomdabd: my experience has been that clojure.zip's API leaves a lot to be desired....
21:42hyPiRion(identity inc)
21:42lazybotinc has karma 4.
21:42dabdbbloom: i am having a hard time working with it too
21:42arrdem~projects
21:42clojurebotGabh mo leithscéal?
21:43dabdi am tryinig to write an algorithm to work over a tree zipper and it is a nightmare
21:43arrdem~projects is 1. make karma vars in clojurebot
21:43clojurebotAlles klar
21:43bbloomdabd: describe your algorithm for me, maybe i can suggest a good approach
21:43bbloomsince we're playing with clojurebot...
21:43bbloom~bbloom
21:43clojurebotbbloom is a dendrologist
21:44bbloomyeah, that's it :-P
21:44dabdit is a recursive algorithm that performs a depth first traversal of a tree
21:44bbloomdabd: have you considered tree-seq ?
21:44arrdembitemyapp: you unset your clojurebot entry, jerk
21:44dabdbbloom: i didn't. I have to read about it
21:45bbloomdabd: does your algorithm do a single pass over the tree?
21:45bbloomdabd: or is there backtracking or other non-linear traversal?
21:45dabdyes it is a single pass
21:46holohi
21:46dabdactually the algorithm is a similar to a minimax
21:46bbloomdabd: what order do you need to traverse it in? pre/post/infix or some combination thereof?
21:46dabdbut it is for stochastic games, it is called miximax
21:46dnolenall the Google Closure warning knobs now exposed in CLJS master
21:47bbloomdabd: are you culling branches of the tree?
21:48dabddepth first traversal pre order
21:48dabdculling = pruning?
21:48dabdif it is no, i traverse the complete tree
21:49bbloomdabd: ok perfect. you want tree-seq + reduce :-)
21:49bbloomdabd: dramatically less to think about than a zipper
21:49bbloom(reduce initial-algorithm-state visit-node (tree-seq branch? children root))
21:49dabdbbloom: thanks for the tip, let me research tree-seq
21:50bbloomdabd: your program should boil down to that line of code ^^ :-)
21:50holothis question is maybe a little off-topic for #clojure, but I guess many of you encountered similar situation. a potential partner that also develops software is going to present me a business proposal. he needs me solve a problem. what basic questions should i ask? I had topics about this in college, but my intuition about it is kind of rusty now
21:50dabdinitial-algorithm state is a function?
21:50dabdor you got the args to reduce in wrong order?
21:50bbloomdabd: oh yeah, sorry. swap the first 2 args
21:51bbloomit's just whatever book keeping you need to do doing the algorithm
21:51dabdi think i need to reverse all 3 args :-P
21:51bbloomi use reduce like 100X a day, but i have to look up the arge order every time
21:52bbloomnah, it's (reduce f val coll)
21:52bbloom(:result (reduce f {:result {:some "initial value"}} xs)) ;; all my programs :-P
21:52dabdok, i am so disappointed with the zippers. It seemed like a very nice data structure
21:53dabdmaybe the api can be improved?
21:53bbloomdabd: clojure.zip is simultaneously too general and not general enough
22:01dabdmaybe adding a fn children-locs that will return a seq of the children as locs would help
22:01dabdlike 'down' will return the loc of the leftmost child of a node
22:02dabdall is working well except that the current 'children' fn loses navigational information by returning a seq of nodes
22:04dnolenGoogle Closure defines now supported in CLJS master https://github.com/clojure/clojurescript/commit/cb7e97f13ae6a03086f5d96ba58e5f3d5cba7dc3
22:12brainproxydnolen: performance gain?
22:12brainproxyI spent all day hacking on goog/base.js ... brain hurts
22:13dnolenbrainproxy: not at all, this just about exposing useful Closure knobs for those people who care
22:13dnolenbrainproxy: heh, why? are you trying to fake in a Node.js context or something?
22:13brainproxydnolen: trying to hack in support for using it in the context of HTML Import polyfill
22:13brainproxyso close ... but no cigar
22:14brainproxydnolen: w.r.t. to previous question, I was being roundabout in asking what @define is good for... any examples?
22:15dnolenbrainproxy: I have no examples handy, but if you look at the original ticket people were interested in it for internationalization I think.
22:15brainproxycompile time parameterization of source code, is that the idea?
22:15dnolenbrainproxy: yes
22:15brainproxygot it
22:15brainproxysounds useful :D
22:33dnolennoprompt: if you build and install master you can use :closure-warnings {:non-standard-jsdoc :off}, to suppress those lame Closure warnings when building React under advanced
22:34nopromptdnolen: nice! did you just add this?
22:34dnolennoprompt: yep
22:34nopromptsweet :)
22:39andyf_There is nothing like trying to do static checks on a dynamic language that makes one appreciate the myriad possibilities inherent in the word 'dynamic'.
22:45nopromptdnolen: is it planned to show up in the next release?
22:45dnolennoprompt: yeah probably by this weekend, there's some other stuff I'd like to get in
22:48nopromptdnolen: that'll be great. i'm thinking of forking this pump project and seeing what i can do to help out.
22:51dnolennoprompt: cool, trying figure out a more functional approach sounds like a good problem to tackle - poking around more myself now to see what I can see
22:56nopromptdnolen: it sounded to me like they might be open to some contribution.
22:56dnolennoprompt: yes
23:18andyf_jonasen: I would recommend reading the discussion on this ticket, if you haven't already: http://dev.clojure.org/jira/browse/TANAL-22 Relevant to the question of whether you would like to use tools.analyzer(.jvm) as is, or write a customized set of phases.
23:23andyf_I know that most often writing a def nested inside of another def is not a good idea, but are there any non-wizardly examples where it is needed, or at least more straightforward than not doing so?
23:24nightflyNot that I can think of. Since the inner function would get change every time the outer function is called.
23:26hiredmanandyf_: no
23:29jonasenandyf_: I think its ok for eastwood to throw an exception on invalid arg count. An :invalid-arg-count linter would be even better since that would mean we could continue analysis.
23:33andyf_I couldn't think of any common good reasons for using def inside def either, but wanted to check. Was writing up some brief docs for a lint tool that warns about occurrences of that, among other things.
23:34andyf_jonasen: Agreed. It isn't urgent to do the fancier thing now, except to make sure that the message that comes with the exception is easy to understand, which it isn't right now.
23:51technomancyI put def in a def for super lazy debugging, but I would never check it in except by accident.
23:53technomancyin fact I would probably yell at anyone if they did check it in