2011-10-27
| 00:00 | sdeobald | duck1123: Awesome. Thanks. |
| 00:02 | mrh0057 | cemerick: I really don't like the closure set of libraries but I bet closure api is probably not going to change munch with google heavy investment in GWT and Dart. |
| 00:16 | mdh | any reason why clojurescript wouldn't compile this: (defn f [x] (case x true (recur false) false nil)) |
| 00:18 | michaelr525 | ,(defn f [x] (case x true (recur false) false nil)) |
| 00:18 | clojurebot | #<Exception java.lang.Exception: SANBOX DENIED> |
| 00:19 | mdh | denied! |
| 00:19 | michaelr525 | err |
| 00:19 | michaelr525 | does clojure compile this? |
| 00:19 | mdh | nicely |
| 00:20 | michaelr525 | what |
| 00:20 | michaelr525 | 's |
| 00:20 | michaelr525 | the syntax |
| 00:20 | michaelr525 | for the other bot? |
| 00:20 | michaelr525 | &(defn f [x] (case x true (recur false) false nil)) |
| 00:20 | lazybot | java.lang.SecurityException: You tripped the alarm! def is bad! |
| 00:21 | Raynes | Neither one of them are stupid enough to allow that, unfortunately. |
| 00:21 | michaelr525 | you mean smart enough to be stupid enough? |
| 00:25 | michaelr525 | there has to be M-x clojure command that just starts a repl |
| 00:28 | duck1123 | michaelr525: this is what I use https://gist.github.com/1318774 |
| 00:28 | duck1123 | I by no means claim the binding is good |
| 00:32 | amalloy | duck1123: C-c <single letter> is reserved for your personal use |
| 00:32 | amalloy | i use C-c s for slime-connect |
| 00:33 | amalloy | michaelr525: you can easily test this by not using defn |
| 00:33 | amalloy | &((fn f [x] (case x true (recur false) false nil)) true) |
| 00:33 | lazybot | ⇒ nil |
| 00:33 | duck1123 | I know, the <f9> is a historical thing. I've tried binding it to other letters, but I'm used to it now |
| 00:34 | duck1123 | I have C-c s bound to slime selector. C-c s r ir my repl |
| 00:35 | michaelr525 | for this to work there has to be a swank instance running, no? |
| 00:35 | amalloy | michaelr525: yes, which is what M-x clojure-jack-in is for |
| 00:36 | duck1123 | yes, if you want it to start swank for you, that's what clojure-jack-in is for. I always have a screen session bound to F12 |
| 00:36 | amalloy | duck1123: a screen session of what? |
| 00:37 | duck1123 | I have GNU screen running in a terminal in Guake. (hides shows on F12) |
| 00:37 | amalloy | i was getting more at: what does this have to do with slime/swank |
| 00:38 | duck1123 | My point was more that I almost always have a running swank session in the terminal |
| 00:38 | duck1123 | I guess it really all depends on what type of apps you're writing |
| 00:42 | michaelr525 | amalloy: but to run clojure-jack-in you have to be in a project |
| 00:43 | michaelr525 | and i just want to start a repl - see what i mean? |
| 00:43 | amalloy | meh |
| 00:43 | michaelr525 | probably not so hard to implement |
| 00:43 | duck1123 | but it's one of those things that really shouldn't be encouraged |
| 00:44 | michaelr525 | why? |
| 00:44 | clojurebot | http://clojure.org/rationale |
| 00:44 | duck1123 | it causes people too many problems that they wouldn't have if they just created a project |
| 00:46 | michaelr525 | i guess you are right but this is an implementation detail :) |
| 00:46 | duck1123 | "just create a repl" raises the question of which version? Any contrib libraries, any other libraries. lein new does 90% of it anyway |
| 00:46 | michaelr525 | and i just want to start a repl |
| 00:46 | duck1123 | classpaths are hard. let's go shopping |
| 00:47 | amalloy | clojurebot: The classpath is hard. Let's go shopping! |
| 00:47 | clojurebot | Ik begrijp |
| 00:49 | technomancy | michaelr525: if you don't want any deps you can do ~/.lein/bin/swank-clojure followed by M-x slime-connect |
| 00:50 | technomancy | as soon as you want to add deps you should start a project though |
| 00:50 | michaelr525 | cool |
| 00:51 | michaelr525 | how do i bind it to F12 in emacs? |
| 00:51 | duck1123 | (global-set-key (kbd "<f12>") 'slime-connect) |
| 00:51 | Iceland_jack | michaelr525: (global-set-key (.. damn |
| 00:51 | duck1123 | fair warning, F12 don't go through ssh |
| 00:52 | duck1123 | err.. fkeys |
| 01:49 | lancepantz | is anyone aware of any comet / long polling implementations in clojure? |
| 01:52 | michaelr525 | lancepantz: maybe websockets with aleph |
| 01:53 | lancepantz | i actually already have a websocket implementation |
| 01:53 | lancepantz | they don't support websockets |
| 01:53 | lancepantz | fair enough though, those details are just getting ironed out |
| 02:47 | Knekkebjoern | I have a list (a b c) . Is there a simple way to stringify it into "(a b c)" ? |
| 02:47 | Knekkebjoern | alternatively, how can I serialize and deserialize code/data easily? |
| 02:48 | raek | Knekkebjoern: use pr-str and read-string |
| 02:48 | Knekkebjoern | raek: thanks! |
| 02:48 | raek | ,(pr-str (range 5)) |
| 02:48 | clojurebot | "(0 1 2 3 4)" |
| 02:48 | raek | ,(read-string "(0 1 2 3 4)") |
| 02:48 | clojurebot | (0 1 2 3 4) |
| 02:49 | raek | (as you might have discovered, 'str' does not do the right thing if you want to serialize data) |
| 02:52 | Knekkebjoern | it does not |
| 03:02 | sploop | before I implement a redundant fn, I wanted to check with you guys to see if there is a library fn for extracting values from a nested map, where the keys form a path. Anyone know if that exists? |
| 03:03 | sploop | something like (get-path {:people {:name "bill"}} [:people :name])) -> "bill" |
| 03:05 | ejackson | sploop: try (-> mymap :k1 :k2 :k3) |
| 03:05 | sploop | thrush it through |
| 03:06 | ejackson | yup |
| 03:06 | terom | ,(get-in {:people {:name "bill"}} [:people :name]) |
| 03:06 | sploop | hadn't thought of that, nice. |
| 03:06 | clojurebot | "bill" |
| 03:06 | sploop | awesome, thanks. I knew there had to be something in core already... |
| 03:23 | amalloy | sploop: there's not much redundant to implement, though. get-in is just (reduce get m ks) |
| 03:30 | Blkt | good morning everyone |
| 03:31 | sploop | amalloy: yeah, that's basically what I did on the first cut, but I'm real sticky about trying to use what appears to be idiomatic. If the concept of tracing a path through a nested associative data structure is agreed tobe (get-in), then I'll defer |
| 03:32 | sploop | Blkt: good morning |
| 03:49 | mindbender1 | please what problem does parallel programming and concurrency solve? |
| 03:50 | Chousuke | mindbender1: the problem of being able to utilise multiple separate processing units. |
| 03:50 | Fossi | mindbender1: was that a rethorical question? |
| 03:50 | Chousuke | mindbender1: and/or being able to perform tasks simultaneously without interrupting either one. |
| 03:51 | mindbender1 | I've read stuart's book, chouser's book , etc I can't just get my head around it |
| 03:51 | mindbender1 | Chousuke: that's in a multi processor enviroment |
| 03:51 | mindbender1 | ? |
| 03:52 | Chousuke | mindbender1: it can be, but it's not limited to just that. |
| 03:52 | mindbender1 | So do I have to worry about not implementing it in my codes? |
| 03:53 | Chousuke | depends on the problem you're solving. Though in general it's good to at least consider concurrency issues when you code |
| 03:53 | mindbender1 | Where can I get good materials on dead brain examples of concurrency application? |
| 03:53 | Chousuke | and since individual processors are unlikely to get significantly faster, not writing parallel code is ignoring a source of performance |
| 03:54 | mindbender1 | ok |
| 03:54 | Chousuke | concurrency and parallelism are not easy, but Clojure provides you with good tools... At least better than most languages :P |
| 03:55 | mindbender1 | Chousuke: I'll be glad to experience those first hand |
| 03:55 | Chousuke | I think nowadays the most common example of concurrency is in UI code though |
| 03:55 | raek | mindbender1: clojure was designed to make the step from non-concurrent to concurrent simple. basically, the style you are forced to write code in in clojure makes it fairly simple to make that step |
| 03:55 | mindbender1 | Chousuke due to multiple events? |
| 03:56 | mindbender1 | raek: ok |
| 03:56 | Chousuke | you want to be able to update the UI and react to input while doing processing on some data without interrupting the data processing |
| 03:56 | Chousuke | so you need concurrency |
| 03:56 | Chousuke | if you have a single thread then your UI simply will not work while any processing is going on |
| 03:56 | Chousuke | and your users will complain |
| 03:57 | mindbender1 | But I rarely see that happening with most UIs I've experienced |
| 03:57 | raek | in "traditional" programming languages, programs do not "just work" after adding more threads the way they can in Clojure |
| 03:57 | Chousuke | that's because most UI toolkits nowadays force you to do UI operations on a separate thread |
| 03:58 | mindbender1 | raek: So Clojure makes multi-threading easy with concurrency tools? |
| 03:58 | Chousuke | there's concurrency going on though the inattentive programmer might not notice (and consequently is likely to write broken code due to false assumptions.) |
| 03:59 | pyr | hi |
| 03:59 | Chousuke | mindbender1: multi-threading is never easy, but Clojure's tools are powerful |
| 03:59 | pyr | are there release notes for sub libraries |
| 03:59 | pyr | i wonder what's changed in tools.logging 0.2.3 |
| 03:59 | mindbender1 | Chousuke: so that means clojure makes it easy? |
| 03:59 | Chousuke | mindbender1: and immutable data structures remove the main worry in writing concurrent code, which is accidental modification of global state |
| 04:00 | Chousuke | mindbender1: I'm wary of the word "easy" |
| 04:00 | Chousuke | mindbender1: I don't think it can ever be easy no matter how good your tools are |
| 04:00 | mindbender1 | Chousuke: not as in not thinking |
| 04:01 | raek | mindbender1: Clojure makes the concurrency bit (multiple "actors" that need to modify common resources) simpler by eleminating unrestricted mutation |
| 04:01 | mindbender1 | Chousuke: what are the kind of things you worry about when doing concurrency? |
| 04:02 | Chousuke | mindbender1: two concurrent threads accessing the same (mutable) data without synchronisation mainly |
| 04:02 | mindbender1 | raek: please just a real life example will do |
| 04:02 | raek | mindbender1: traditionally: locking. Clojure as another approach than locking |
| 04:03 | raek | mindbender1: say you want to modify multiple collections in a complex manner atomically |
| 04:03 | raek | this is hard to get right with locks |
| 04:03 | mindbender1 | raek: ok |
| 04:03 | Chousuke | mindbender1: Clojure has several datatypes called references that are mutable containers for immutable data. |
| 04:04 | mindbender1 | Chousuke: yes I'm following |
| 04:04 | Chousuke | the difference between references and plain mutable data is that references have strictly defined APIs/behaviour for concurrent access |
| 04:05 | raek | the most basic example would be to have two accounts and an operation that moves money from one to the other. when you observe the account you want the amount of the transfered money to either be in account A or B, but never in both or none |
| 04:05 | Chousuke | different references have different semantics (for different usecases) |
| 04:06 | mindbender1 | Chousuke: understood |
| 04:07 | Chousuke | mindbender1: in most languages, all you have is a single kind of "reference" (direct access to the object) which is unmanaged and can be mutated at any time |
| 04:07 | raek | in traditional programming languages you have to remember to lock the accounts. if you forget it your program just behaves strangely *sometimes*. |
| 04:07 | mindbender1 | raek: ok |
| 04:08 | raek | in clojure, it's as simple as (def a1 (ref 100)) (def a2 (ref 200)) (defn transfer [src dest amount] (dosync (alter src - amount) (alter dest + amount))) |
| 04:09 | raek | every access (read or write) to a ref in a transaction will happen atomically |
| 04:09 | sploop | not unlike a database |
| 04:09 | Chousuke | I prefer not putting dosyncs inside functions |
| 04:09 | Chousuke | keeps them explicit at the top level |
| 04:10 | mindbender1 | raek: (dosync) takes care of that right? |
| 04:10 | raek | mindbender1: yes |
| 04:11 | mindbender1 | raek: so what are the selling point for refs |
| 04:12 | Chousuke | mindbender1: it establishes a transaction that lasts until its scope ends. if you do (dosync (transfer foo bar 50) (transfer bar zonk 50)) then both of the transfers must succeed or neither does |
| 04:12 | mindbender1 | Chousuke: where would you rather have (dosync)? |
| 04:12 | Chousuke | mindbender: outside the transfer function |
| 04:12 | raek | mindbender1: Rich Hickey (the creator of Clojure) gave a presentation on why these things matter and what problem Clojure solves: http://blip.tv/clojure/clojure-concurrency-819147 |
| 04:13 | Chousuke | mindbender1: it's dynamic so having a dosync inside transfer won't affect my example, but if you forget the dosync and it's not in transfer, you get an error |
| 04:13 | raek | (I agree with Chousuke about the dosync placement) |
| 04:14 | Chousuke | mindbender1: if you know anything about sql, refs give you similar transactions except for data in memory. |
| 04:14 | mindbender1 | Chousuke: exactly what I was thinking |
| 04:15 | mindbender1 | more like constraints |
| 04:15 | Chousuke | mindbender1: in addition to refs there's another reference type called atom that just gives you an atomic read operation and atomic update. no synchronisation |
| 04:16 | Chousuke | it's good for eg. incrementing counters without worry about race conditions |
| 04:16 | mindbender1 | Chousuke: please code sample |
| 04:16 | mindbender1 | for atom |
| 04:17 | Chousuke | (def a (atom 0)) then do from as many threads as you want: (swap! a inc) ; a's value will stay correct even if two threads do the inc operation exactly at the same time |
| 04:18 | Chousuke | which is not true for uncontrolled mutation :) |
| 04:18 | Fossi | i guess it's harder to understand these solutions if you don't understand the problems |
| 04:18 | Chousuke | maybe |
| 04:18 | Chousuke | I don't really know a good tutorial to issues with concurrency :/ |
| 04:19 | mindbender1 | Chousuke: that's why I had to ask here |
| 04:19 | Chousuke | At one point I envisioned starting a blog or something where I write short essays/tutorials about various problems and how Clojure helps solve them |
| 04:19 | Chousuke | but I never got around to it :P |
| 04:19 | mindbender1 | I want to see the problem and I want to see the solution according to Fossi |
| 04:20 | Fossi | basically if you don't have locks and such thread A reads for example 0 |
| 04:20 | mindbender1 | Chousuke: I'll be glad about that |
| 04:20 | Fossi | thin the threads get swapped and thread B is on |
| 04:20 | Fossi | it reads 0, increases, so the counter is 1 |
| 04:21 | Fossi | then the other thread will write 1 as well |
| 04:21 | Chousuke | since it has already read "0" |
| 04:21 | Fossi | there's gotta be some graphs about this on the intertubez, but i also lacked the mojo to find them :> |
| 04:21 | Chousuke | and in the end you end up with the value 1 in the counter instead of the correct 2 |
| 04:23 | mindbender1 | Chousuke: did such problems burn you at any point in time? |
| 04:24 | Chousuke | not yet, fortunately. I haven't written very complicated multithreaded code. |
| 04:26 | Chousuke | but if I ever have the need to, I hope I'll be able to use Clojure :P |
| 04:27 | mindbender1 | What language do you use mostly? |
| 04:28 | raek | mindbender1: you might want to browse around for explanations of race condition bugs. this class of bugs is especially nasty... :-) |
| 04:28 | Chousuke | Lately I haven't written much code at all. :/ need to get back into programming |
| 04:28 | Chousuke | as well as finish my studies :P |
| 04:29 | mindbender1 | raek: ok |
| 04:29 | mindbender1 | Chousuke: ok |
| 04:30 | mindbender1 | raek: I remember looking up something on race conditions but couldn't get the hang of it.. |
| 04:30 | Fossi | mindbender1: even though most problems here at my work are inherently easy to paralellize (webpage requests) you sometimes need to deal with such problems |
| 04:30 | Fossi | and *yes* they are a big pain in the ass |
| 04:30 | mindbender1 | I'll try again... I need to be sure I leave no stones unturned |
| 04:31 | Fossi | because they alse happen "randomly" |
| 04:31 | Fossi | and are veary hard to find |
| 04:31 | mindbender1 | Fossi: what kind of issue does it result in.. downtime? |
| 04:31 | Fossi | all kinds of things, sometimes downtimes |
| 04:32 | Fossi | if the state of your application gets thrown into a state you didn't expect, that could happen |
| 04:32 | raek | mindbender1: race conditions often result in incorrect behaviour of the code and are especially hard to reproduce in tests |
| 04:33 | Fossi | mostly it's things like wrong orders, screwed up data in the database, all kinds of things really |
| 04:33 | raek | since they depend on timing |
| 04:33 | mindbender1 | raek: please more example situation |
| 04:33 | Fossi | it can happen that a process begins to run wild of not programmed defensively enough and fill up the harddrive or such |
| 04:33 | mindbender1 | Fossi: ok |
| 04:33 | Fossi | then you can be in trouble as well |
| 04:34 | Fossi | take a logging system for exampre |
| 04:34 | Fossi | if you have 2 shop instances and write values into them that you wannt to aggregate |
| 04:34 | Fossi | if you do that in a bad way and screw up a downtime could occur |
| 04:35 | Fossi | or at least you could loose all your data |
| 04:35 | raek | mindbender1: here is an article about race conditions from a security perspective: http://www.ibm.com/developerworks/linux/library/l-sprace/index.html |
| 04:35 | clgv | I have a collection of items that I parsed from a file that represents a table with 4 columns. it's a really ugly copy so I used string/split with \n\t and space. if all columns would be filled I could use (partition 4 %) to get the table. but some rows have only the first column filled. what is the easiest way to do that with standard clojure operations? is there one? otherwise I have to fall back to loop-recur... |
| 04:36 | Chousuke | mindbender1: traditional bugs are "easy" because they're just some part of the program not doing what it's supposed to do. race conditions are nasty because all parts of the program might be completely correct by themselves, but because of concurrency they might end up doing their thing on some bit of data *at the same time*, and you end up with the wrong result. |
| 04:37 | mindbender1 | Fossi: do you think clojure helps avoid these problems completely or to some degree? |
| 04:37 | Fossi | the biggest problem arising from such bugs is most of the time imho not the direct result, but also the aftermath it causes |
| 04:38 | Fossi | because if such a bug leaves your application in a state you didn't expect to ever occur lots of other things go to hell |
| 04:38 | Fossi | especially with mostly mutable languages like java |
| 04:38 | mindbender1 | Fossi: that sounds scary |
| 04:38 | Fossi | and it's very hald to find out what caused the problem in the first place |
| 04:38 | Fossi | since it's most likely not reproducible |
| 04:39 | Chousuke | mindbender1: immutable data does away with most of those problems. if you work with immutable data there is no way you will ever modify it concurrently and thus you can run as much concurrent code as you want :P |
| 04:39 | raek | Fossi: functional programming with immutable data is always threadsafe |
| 04:39 | Fossi | it is. there is lots of safeguarding you have to do to avoid that in a classical business java app |
| 04:39 | mindbender1 | Fossi: because such things may be triggered by complex events which may not be repeatable? |
| 04:40 | Fossi | yes, and not all the time. take for example the counter problem above |
| 04:40 | Chousuke | mindbender1: immutable data also removes worry from single-threaded programming too |
| 04:40 | Fossi | it might be the counter for your database connection |
| 04:40 | raek | mindbender1: yes, they are triggered by certain complex interleavings of events |
| 04:40 | Chousuke | mindbender1: you will never have to worry about what a function does to your data :) |
| 04:40 | Fossi | so if you only have 5 connections to the db at any time, you loose connections one by one |
| 04:40 | Fossi | so what happens next, is that the webservers have more traffic |
| 04:40 | mindbender1 | Chousuke: that sounds interesting |
| 04:41 | Fossi | because they have to wait longer for the database |
| 04:41 | mindbender1 | I'm such a believer in modular programming |
| 04:41 | Fossi | then the loadbalancer fails or something and your site is down |
| 04:41 | Chousuke | mindbender1: a pure function is the ultimate in modular programming |
| 04:41 | Fossi | now try to find that error that caused the problem in the first place |
| 04:41 | Chousuke | mindbender1: it depends only on its arguments and nothing else. |
| 04:41 | mindbender1 | Fossi: I'm following |
| 04:41 | Fossi | you wan't be looking in your db code |
| 04:41 | Fossi | *won't |
| 04:42 | mindbender1 | Chousuke: exactly.. that how functions should behave.. like slaves |
| 04:42 | Fossi | then even if you somehow find out that that must have been the problem, you don't know why it happened |
| 04:42 | Fossi | because most of the time everything is fine |
| 04:43 | Fossi | it only happens if two webserver try to make/release a new connection to your database |
| 04:43 | Fossi | which will of course be mostly during deployments |
| 04:43 | mindbender1 | Chousuke: but it seems not everyone share such views |
| 04:43 | Fossi | then you start questioning your new features nistead etc pp |
| 04:43 | Fossi | so it can take days to find such a problem |
| 04:44 | mindbender1 | Fossi: that leads to been inefficient with time |
| 04:44 | mindbender1 | which I hate |
| 04:45 | Fossi | and downtime might be worse |
| 04:45 | Fossi | :) |
| 04:45 | mindbender1 | hmmm |
| 04:46 | Fossi | clojure makes it easier to get things like this right in the first place |
| 04:47 | Fossi | and having mostly immutable objects helps much as well |
| 04:47 | Fossi | because errors/bad state don't spread so wide |
| 04:47 | mindbender1 | Fossi: I see the point |
| 04:47 | Fossi | then, i haven't coded nearly as big systems with clojure as i have with java |
| 04:47 | Fossi | but it feels much better |
| 04:48 | mindbender1 | raek: any link to where I could download that hickey's presentation? |
| 04:55 | raek | mindbender1: I don't know if blip.tv have download links... |
| 04:56 | raek | I'm not aware of any other locations for that video |
| 04:56 | mindbender1 | raek: they don't |
| 04:56 | mindbender1 | I need to get this video on my hard disk |
| 04:59 | AWizzArd|work | Anyone here who works with Artifactory + Leiningen? |
| 05:04 | ibdknox_ | ~anyone |
| 05:04 | clojurebot | Just a heads up, you're more likely to get some help if you ask the question you really want the answer to, instead of "does anyone ..." |
| 05:07 | thorwil | i recently switched to ubuntu 11-10. trying to run my appengine-magic project, i get http 500, "Directory does not exist: /media/sda4/app_engine/tlog-clj-gae/file:/usr/lib/jvm/java-6-openjdk/jre/lib/ext/pulse-java.jar!/../war" |
| 05:08 | thorwil | a search so far suggests that pulse-java.jar has to do with pulseaudio |
| 05:11 | thorwil | i have no need for pusleaudio support. any ideas how i either get that missing jar / get it to be found if present, or make it work without? |
| 05:11 | AWizzArd|work | ibdknox_: this "anyone" does not apply in this case. What the bot replied is just personal experience of some people, not a law of nature. |
| 05:11 | ibdknox_ | AWizzArd|work: huh? |
| 05:12 | thorwil | laws of nature are just personal experiences of a whole lot of people |
| 05:13 | ibdknox_ | Seems to apply... you didn't ask a question that has any useful answer |
| 05:13 | ibdknox_ | the best you'd get is "yes" |
| 05:14 | Fossi | maybe that's what he wanted to know :> |
| 05:15 | ibdknox_ | perhaps :) |
| 05:18 | thorwil | /usr/lib/jvm/java-6-openjdk/jre/lib/ext/pulse-java.jar does exist |
| 05:19 | thorwil | i have not the slightest clue how that monstrosity of a path "/media/sda4/app_engine/tlog-clj-gae/file:/usr/lib/jvm/java-6-openjdk/jre/lib/ext/pulse-java.jar!/../war" comes into being |
| 05:44 | thorwil | so on starting the server, the following hierarchy is created in my project dir, if not already present: http://paste.pocoo.org/raw/498911/ |
| 06:39 | fliebel | To those of you writing books in LaTeX: is that MacTeX really the way to go? It looks old and big. |
| 06:41 | ejackson | fliebel: i just emacs it |
| 06:41 | ejackson | C-c C-c compiles w/ pdflatex, open that in Preview and it keeps up to date with the pdf. Happy Days. |
| 06:42 | fliebel | ejackson: emacs? it really is an complete os |
| 06:42 | fliebel | so you do need to install pdflatex. |
| 06:42 | ejackson | i do, but you can get away without, the C-c C-c will turn it into a dvi |
| 06:43 | ejackson | emacs can view that inline, but ultimately you want a pdf anyway so I don't muck about |
| 06:44 | fliebel | the thing is, pfdlatex is part of that 1gb mactext thing. |
| 06:45 | ejackson | hmm, I'm sure there are other ways to get it, can't recall offhand though |
| 06:45 | ejackson | pdflatex way precedes mactex |
| 06:49 | fliebel | everything seems to point back to mactext or tex live |
| 06:52 | ejackson | ugh... just install the hairball to get Mac working binaries, but work in emacs. Whats a gig between friends ? |
| 06:52 | ejackson | or at least, that's what my lazy self would do |
| 06:57 | fliebel | ejackson: Yea, I'm downloading the gb now. I wish I had fiber internet. |
| 06:58 | ejackson | Hah. raw nerve with me right now, been unable to convince my ISP to lay it down my driveway. Its on the road, but I'm too far from that road... |
| 06:59 | ejackson | right now enjoying fabulous 1Mbps intertweets. |
| 07:01 | ejackson | fliebel: whatcha writing ? |
| 07:02 | fliebel | ejackson: I have a friend who worked for my ISP. He said that if I;d dig a hole from Deventer to Loenen, he'd but a cable in it. :( |
| 07:03 | fliebel | ejackson: I'm trying to compile thinking forth for kindle. |
| 07:03 | ejackson | nice one. |
| 07:03 | ejackson | you been reading Fogus' blogs then :P |
| 07:03 | fliebel | ejackson: Yes, but I learned about Forth pre-perlis |
| 07:04 | fliebel | The trouble is that I emailed the maintainer, and he was like "yea, lets make a kindle version", but then he did it with very small print. |
| 07:05 | ejackson | I guess doesn't compile to .mobi ? |
| 07:05 | fliebel | Either I don;t understand LaTeX or we don;t understand each other. |
| 07:05 | fliebel | no, PDF |
| 07:05 | ejackson | crapola |
| 07:05 | fliebel | so i said I read about latex2html, bt he said it wasn;t possible. |
| 07:05 | ejackson | oh no, you don't want to do that, ugliness results |
| 07:06 | fliebel | And in his signature, it says "If you want it done right, you have to do it yourself" |
| 07:06 | ejackson | lol |
| 07:06 | ejackson | once you have TeX setup it'll be trivial to increase the font size for the pdf |
| 07:06 | fliebel | oh, so what do you suggest? Just make the PDF work? |
| 07:07 | fliebel | he muttered something about the text size being connected to some other things that'd break, but I'll see |
| 07:08 | ejackson | sounds like you're on the right track. Get Latex, alter the font size tag, and see what happens :) |
| 07:08 | ejackson | LaTeX is one of my favourite things, its fabulous. |
| 07:09 | fliebel | I probably don't do it justice by looking at it as verbose markdown. |
| 07:10 | ejackson | true statement. |
| 07:48 | andrewclegg | is there a clojure equivalent of python's defaultdict? |
| 07:48 | andrewclegg | i.e. a map that will instantiate a key with a default value on first read on an unknown key? |
| 07:49 | andrewclegg | I guess that's hard to reconcile with immutable structures |
| 07:50 | ejackson | andrewclegg: only in the special case of nil :P |
| 07:57 | licenser | hmm anyone familiar with clojureQL here? |
| 07:59 | ejackson | licenser: somewhat |
| 07:59 | licenser | :) I noticed that I start running into huge problems as soon as I get past a very simple query and I wonder if it is me doing something wrong or clojureql just not being that mature yet? |
| 08:00 | ejackson | there are some niggles, but I have got some pretty huge queries working. |
| 08:02 | licenser | my main problem is 'in' and functions in general it makes a huge mess I needed to write half my query with hand which kind of takes the fun out of clojureql :( |
| 08:03 | licenser | https://gist.github.com/f8a9496b3173dffc62c2 <- that is what I run into |
| 08:05 | ejackson | hmm, I construct those as where ... or ... or ... or.... |
| 08:05 | ejackson | not the nicest |
| 08:07 | ejackson | a la https://gist.github.com/1319377 |
| 08:08 | licenser | but that isn't really nice :P |
| 08:08 | ejackson | i know |
| 08:09 | licenser | I think I stick with my in |
| 08:10 | ejackson | not really nice either :p |
| 08:11 | clgv | is there no (in ... [min max])? |
| 08:11 | licenser | no not in the clojure way but the SQL that comes out is likely a good bit more performant |
| 08:11 | licenser | clgv: in does not work with functions |
| 08:11 | clgv | I meant, that you dont have to enumerate every value but specify only the min and max value |
| 08:12 | licenser | between I think |
| 08:12 | licenser | at least in SQL not sure if there is in sql |
| 08:12 | clgv | oh you skip the 17 in your example ;) didnt see that before^^ |
| 08:13 | licenser | :) |
| 08:13 | licenser | okay I feel silly (disj {:a 1} :a) does not work |
| 08:14 | licenser | dissoc ah dissoc |
| 08:16 | clgv | ;) |
| 08:41 | licenser | is there something like a seq product function? as in (* [1 2] [:a :b]) == [[1 :a] [1 :b] [2 :a] [2 :b]]? |
| 08:42 | clgv | licenser: yeah that looks like a cartesian product |
| 08:43 | ejackson | just for I guess |
| 08:43 | licenser | yap but I don't find that, there is supposed to be in contrib combinatorics but I don't find that sadly |
| 08:43 | clgv | licenser: there is an implementation of that in contrib |
| 08:43 | ejackson | ,(for [a [1 2] b [3 4]] [a b]) |
| 08:43 | clojurebot | ([1 3] [1 4] [2 3] [2 4]) |
| 08:43 | licenser | ejackson: nice! |
| 08:44 | clgv | licenser: there as well http://clojure.github.com/clojure-contrib/combinatorics-api.html#clojure.contrib.combinatorics/cartesian-product |
| 08:44 | clgv | btw: is there any comprehensive survey page for "the new contrib"? |
| 08:44 | licenser | clgv: so I did not manage to call that |
| 08:49 | duck1123 | clojure.algo.combinatorics |
| 08:50 | duck1123 | s/algo/math/ |
| 08:50 | clgv | duck1123: yeah thats the new standalone project of the previously mentioned^^ |
| 08:51 | duck1123 | clgv: right, I was just mentioning that there was a new version |
| 08:51 | clgv | good :) |
| 09:21 | snurmine | should i use javacc for parsing "sql"-queries or is there some more preferable way to do it in Clojure? |
| 09:25 | AWizzArd|work | snurmine: you could have a look at fn-parse. |
| 09:36 | babilen | Hi all ... I find myself to be using something like "(filter (comp not nil?) xs)" once in a while. It doesn't feel completely right. Are there better ways to deal with nil in sequences? is this idiomatic? |
| 09:43 | duck1123 | babilen: identity should be better for you |
| 09:43 | duck1123 | but you want false to pass, don't you |
| 09:44 | hugod | ,(doc keep) |
| 09:44 | clojurebot | "([f coll]); Returns a lazy sequence of the non-nil results of (f item). Note, this means false return values will be included. f must be free of side-effects." |
| 09:47 | babilen | hugod: yay! That looks good |
| 09:48 | ejackson | hugod: nice one ! |
| 09:49 | joegallo | does anybody here have the @ClojurePgh twitter handle? |
| 09:49 | joegallo | If so, the pittsburgh clojure users group would like to get in touch with you. |
| 09:50 | dpritchett | technomancy: installing emacs24 from github solved my packaging issues unsurprisingly. thanks for the help yesterday |
| 09:51 | babilen | duck1123: Thanks for the identity trick, I'll use that. (I don't have another predicate I want to filter by) |
| 09:52 | duck1123 | for being somewhat useless on it's own, identity is great as a predicate |
| 09:54 | snurmine | AWizzArd|work: thank you |
| 09:55 | hugod | snurmine: also https://github.com/cgrand/parsley |
| 09:56 | fdaoud | ,(keep identity [1 false 2 nil 42]) |
| 09:56 | clojurebot | (1 false 2 42) |
| 09:58 | snurmine | hugod: thank you |
| 10:01 | dpritchett | anyone in here happily using a vim mode for emacs? |
| 10:01 | dpritchett | the last time i tried e.g. viper it was too slow to bother with |
| 10:02 | dpritchett | that might be my fault of course |
| 10:03 | AWizzArd|work | Yes, parsley is also very nice I must say, and currently maintained. |
| 10:04 | babilen | dpritchett: evil is quite OK |
| 10:04 | AWizzArd|work | The thing is that fnparse can work on arbitrarily token sequences, while parsley can work only on Strings. |
| 10:05 | dpritchett | thanks babilen |
| 10:07 | babilen | dpritchett: http://gitorious.org/evil/pages/Home (The query "evil vim emacs" is certainly not optimal) |
| 10:21 | ejackson | fliebel: :) |
| 10:24 | fliebel | ejackson: TeX worked, btw. But the guy was right, some smamples fall of the page if you make the text bigger of the page smaller. |
| 10:24 | ejackson | rats. |
| 10:24 | ejackson | TeX is very arsy about where it puts figures, you really cannot tell it "put it here dammit" |
| 10:25 | ejackson | usually they don't vanish though... |
| 10:25 | ejackson | just get moved to where TeX things they should go |
| 10:25 | fliebel | nu, just overflow of the page |
| 10:26 | fliebel | But he said he would decouple the scale of the figures and the text, and hten it'd work |
| 10:26 | fliebel | But now I can at least start reading. |
| 10:27 | fliebel | &(javax.quantum.Universe.) |
| 10:27 | lazybot | java.lang.ClassNotFoundException: javax.quantum.Universe |
| 10:27 | fliebel | I bet it's singelton. |
| 10:28 | ejackson | :D |
| 10:58 | bhenry | best SMTP library… go! |
| 11:02 | andrewclegg | bhenry: guess that wasn't the torrent of responses you were hoping for |
| 11:02 | bhenry | andrewclegg: haha |
| 11:02 | TimMc | I am fairly sure I saw someone using something clled "smteepee" in here yesterday. It has a funny name... |
| 11:02 | bhenry | sfteepee |
| 11:02 | bhenry | but if there is an equivalent of that i'm all for it, because sfteepee is great |
| 11:03 | bhenry | TimMc: aww doesn't look like it |
| 11:04 | fliebel | ejackson: I see what you mean. TeX moved all figures to the end of the chapter :( |
| 11:04 | TimMc | sfteepee, right |
| 11:04 | TimMc | never mind |
| 11:05 | TimMc | javax.mail.smtp.oh.god.shoot.me.now |
| 11:05 | ejackson | fliebel: yup, you can put in modifiers, like [htb], around the figures, but TeX scorns them :( |
| 11:06 | fliebel | TimMc: What are you doing with javax.mail? |
| 11:06 | fliebel | ejackson: Oh, interesting... |
| 11:07 | TimMc | fliebel: Nothing! I was just suggesting that there is probably a standard (and terrible to work with) Java lib for SMTP. |
| 11:08 | fliebel | TimMc: https://github.com/manutter51/nonomail/ |
| 11:37 | PPaul | can i use js libraries with clojurescript? |
| 11:38 | lucian | PPaul: yes |
| 11:47 | zackmaril | How does one force a LazySeq to eval? |
| 11:47 | mefesto | zackmaril: doall or dorun |
| 11:48 | mefesto | zackmaril: doall when you want all the results, dorun for forcing side-effects but no need for results |
| 11:48 | Raynes | Or avoid getting a lazyseq in the first place, if possible. |
| 11:49 | Raynes | For example, use ##(doseq [x [1 2 3]] (println x)) rather than ##(map println [1 2 3]). |
| 11:49 | lazybot | (doseq [x [1 2 3]] (println x)) ⇒ 1 2 3 nil |
| 11:49 | zackmaril | Not entirely sure where the lazyseq is getting induced actually. |
| 11:49 | lazybot | (map println [1 2 3]) ⇒ (123nil nil nil) |
| 11:50 | dnolen | zackmaril: most of the sequence fns produce lazy sequences (map, filter, interleave, concat etc.) |
| 11:50 | zackmaril | Then I am working mostly with lazy sequences then. |
| 11:51 | zackmaril | Can you have nested lazy sequences? |
| 11:52 | zackmaril | I am running doall on a variable and the result is of type LazySeq |
| 11:55 | zackmaril | Solved. I had some weird nesting of maps going that resulted in strangeness |
| 12:05 | andrewclegg | I'm using (:name (meta func)) to get the name of a function |
| 12:06 | andrewclegg | but this returns null for multimethods |
| 12:06 | andrewclegg | anyone know the right way? |
| 12:07 | Raynes | andrewclegg: You can look up the metadata on the var. |
| 12:08 | Raynes | &(meta #'print-method) |
| 12:08 | lazybot | ⇒ {:ns #<Namespace clojure.core>, :name print-method, :line 3253, :file "clojure/core.clj"} |
| 12:08 | Raynes | ^ print-method is a multimethod. |
| 12:09 | andrewclegg | hmm, maybe it's the particular one I've got that's the problem |
| 12:09 | andrewclegg | expt in clojure.contrib.math |
| 12:09 | andrewclegg | (meta expt) returns nil |
| 12:38 | jcrossley3 | is there a recommended clojure test mocking lib? |
| 12:39 | technomancy | jcrossley3: binding is popular =) |
| 12:39 | danlarkin | clojure.core/binding |
| 12:39 | technomancy | danlarkin: oooooh |
| 12:39 | technomancy | o/ |
| 12:39 | danlarkin | gah you beat me by a second |
| 12:40 | jcrossley3 | technomancy: danlarkin: thanks. like this? http://blog.n01se.net/?p=134 |
| 12:41 | technomancy | jcrossley3: that blog post references working around a feature of Clojure that has thankfully been removed. |
| 12:41 | hiredman | not true, :static still exists |
| 12:42 | technomancy | is it the same thing? |
| 12:43 | hiredman | yes |
| 12:43 | hiredman | it's use is just frowned on(a lot) |
| 12:43 | technomancy | and it's not automatically applied to a bunch of useful functions |
| 12:44 | hiredman | it is, actually, a lot of core is :static |
| 12:45 | technomancy | huh; I guess it's been a while since I did any core reading |
| 12:45 | hiredman | my bad, it does look like it is commented out in the compiler |
| 12:46 | dnolen | hiredman: yeah :static doesn't do anything anymore. |
| 12:46 | hiredman | (thank god) |
| 12:53 | jcrossley3 | technomancy: binding works much better than i thought mocking would. :) |
| 12:54 | hiredman | well, binding only sort of works in 1.2 and will fail in 1.3+ |
| 12:54 | hiredman | you want with-redefs |
| 12:57 | jcrossley3 | hiredman: regardless, i like having a "built in" solution |
| 12:59 | hiredman | with-redefs in 1.3 came about as a response to someone asking rhickey about mocking now that vars aren't dynamic by default, "he said what do you mean?" they said "well we can't use binding to mock anymore" he said "are you crazy? you shouldn't be using binding for that" (all paraphrased of course) |
| 13:02 | gtrak | ha, hiredman do you have a reference for that? I always enjoy those kinds of responses from him |
| 13:04 | hiredman | it was at the conj |
| 13:29 | mefesto | in noir, what benefit does defpartial have over just a normal function that returns elements for hiccup to process? |
| 13:30 | mefesto | i see that the macro wraps the body in `(html ~@body) ... just wondering if this is better? |
| 13:35 | mefesto | well not "if it's better" but more the why of it |
| 13:45 | bhenry | is there a class that will catch any errors? i could use a finally, but want to capture the class of the exception in E so i can use it in the expr* |
| 13:46 | bhenry | no matter what the exception is |
| 13:47 | fliebel | bhenry: reflection? |
| 13:47 | raek | bhenry: Throwable |
| 13:47 | raek | it is the superclass of Exception and Error |
| 13:48 | bhenry | coool. |
| 13:49 | bhenry | so if i replace Exception here https://gist.github.com/98aaad781edaee81ab81 with java.lang.Throwable it will catch everything? |
| 13:49 | bhenry | raek: ^^ |
| 13:49 | raek | bhenry: yes |
| 13:49 | bhenry | raek very nice. thank you |
| 13:50 | raek | you don't need the java.lang. prefix |
| 13:51 | bhenry | hmm. it's not emailing and it's not doing what it's supposed to. i think it's missing that catch, but i don't know why |
| 14:28 | jodaro | off topic and thoroughly entertaining: http://gizmodo.com/5853729/ |
| 14:29 | fdaoud | following Rich's "Simple made Easy" talk, I'm trying to tease apart this ball of mud into nice straight unbraided strings, but I don't know where to start |
| 14:29 | fdaoud | https://gist.github.com/1320378 |
| 14:29 | fdaoud | there has to be a nice way to isolate the conditions from the function calls, and chain everything together in a nice way |
| 14:29 | amalloy | fdaoud: i don't think mud is composed of strings :P |
| 14:30 | jodaro | well unless you are talking quantum physics |
| 14:30 | fdaoud | amalloy: sorry, got my analogies mixed up ;) |
| 14:30 | jodaro | but as nice as clojure is, i don't think it has quite reached that point |
| 14:31 | Squee-D | excuse my very sensational newbiness, but when i do ([1 2 3] 2) i get the last entry in the collection, because as i understand it, this particular list type also acts as a function |
| 14:31 | Squee-D | but (`(1 2 3) 2) is a cast error because PersistantList doesn't behave as a function |
| 14:32 | fdaoud | Squee-D: [] is a vector |
| 14:33 | Squee-D | fair enough, makes sense mathematically too. but why is a PersistantList not functionally similar? |
| 14:34 | amalloy | because lists don't have fast random access |
| 14:34 | Squee-D | that makes sense |
| 14:35 | Squee-D | but they are sequences right? |
| 14:35 | Squee-D | that is i can use the sequence functions on them |
| 14:35 | amalloy | yes |
| 14:35 | Squee-D | ta |
| 14:35 | amalloy | such as nth, if you don't mind slow random access |
| 14:35 | Squee-D | sorry, really am very new to this... |
| 14:35 | Squee-D | I'll worry about speed later, I'm just trying to come to terms with the syntax first. |
| 14:36 | Squee-D | but its useful information, thankyou :D |
| 14:37 | Squee-D | http://www.4clojure.com/problem/19 I was doing this practice question |
| 14:39 | Squee-D | and the golf thing i think makes it rather poor, it needs scoring for things like optimisation i think. |
| 14:39 | Squee-D | i look at other solutions and of course i see how to use the least chars, not how a veteran may approach the problem. |
| 14:40 | TimMc | amalloy: Could you set it up to say "Golf League" next to usernames when showing solutions? |
| 14:40 | amalloy | TimMc: what do you mean? |
| 14:41 | Squee-D | to identify people who are solving for 'in least char count' |
| 14:41 | TimMc | exactly |
| 14:41 | Squee-D | Still, I think a discuss page or a 'the experts say' might be helpful to newbs, especially for those 'easy' questions |
| 14:42 | amalloy | there's not really a way to identify that? for the non-trivial problems i usually don't maximize for brevity, but for the trivial ones i do. what would you put next to my name, TimMc? |
| 14:42 | Squee-D | nonetheless, it's great to have problems to solve, makes me research |
| 14:43 | TimMc | amalloy: I think it might still help. |
| 14:43 | amalloy | Squee-D: fwiw i just changed my solution to #19 to how i would write it if the last function didn't exist |
| 14:43 | TimMc | amalloy: How many of the (say) Top 50 users are not in the Golf League? |
| 14:43 | amalloy | TimMc: no idea |
| 14:43 | drewr | is clojure.contrib.duck-streams/slurp* somewhere in 1.3 contrib world yet? I'm failing at finding it |
| 14:43 | amalloy | not that easy to find out, either |
| 14:44 | TimMc | drewr: clojure.java.io I think... |
| 14:44 | technomancy | drewr: clojure.core/slurp does what slurp* used to do |
| 14:44 | hiredman | drewr: I believe slurp can do most of what slurp* could do now |
| 14:44 | amalloy | slurp is in core. what does slurp* do? |
| 14:44 | technomancy | I think they forgot to document that though |
| 14:44 | TimMc | drewr: duck-streams didn't make the transition to 1.3, so it is a bit scattered. |
| 14:45 | Squee-D | amalloy that's quite a function :D |
| 14:45 | drewr | technomancy, hiredman: ah yes, I knew I was missing something obvious |
| 14:45 | amalloy | Squee-D: eh? |
| 14:46 | Squee-D | amalloy for an easy question, it introduces heaps of new ideas to me. especially if-let. |
| 14:46 | Squee-D | Not complaining, just proves my point i think. the solutions page can be a bit of mix bag of good and bad. |
| 14:47 | fdaoud | perhaps my question was too vague |
| 14:47 | hiredman | Squee-D: mixed bag by what criteria? |
| 14:47 | TimMc | Squee-D: Also note that amalloy has shadowed rest with a local. Potential pitfall. |
| 14:47 | hiredman | I dunno that I would ever use code I found on 4clojure for anything in practice |
| 14:48 | amalloy | TimMc: i introduce pitfalls on purpose so that i have practice leaping over them (only half-joking here) |
| 14:48 | hiredman | so it that sense it is all bad |
| 14:48 | Raynes | amalloy: Guess everybody is at his mercy. |
| 14:48 | hiredman | (no mix) |
| 14:48 | Squee-D | hiredman yeah and it's a great learning tool if i remember to not consider the solutions as 'common' or 'good' practice |
| 14:49 | hiredman | *shrug* it's a great learning tool up to a point, beyond which you are better of writing real code that solves a real problem |
| 14:49 | hiredman | off |
| 14:49 | TimMc | Squee-D: It's a good way to find out about core functions. |
| 14:49 | Squee-D | TimMc if it's not too annyoing. 1. what's shadowing and 2. whats the pitfall? |
| 14:49 | Squee-D | TimMc yeah |
| 14:50 | Raynes | &(let [rest identity] (rest [1 2 3])) |
| 14:50 | lazybot | ⇒ [1 2 3] |
| 14:50 | Raynes | ^ That is shadowing. |
| 14:50 | TimMc | Squee-D: "rest" is a function in clojure.core. By creating a local binding called "rest", you are making it impossible (well difficult) to use the clojure.core version in the enclosed code. |
| 14:51 | TimMc | Squee-D:You are also setting up a situation where you might accidentally call the local where you intended the clojure.core version. |
| 14:51 | fdaoud | Maybe this could be a starting point. How would you chain together several function calls such that the result is the first function that returns a non-nil result? |
| 14:51 | TimMc | fdaoud: some |
| 14:51 | Squee-D | hiredman yep well my first real code project is to replace a reactive system written with ruby eventMachine, pub/subbing with amqp, storing in redis/memcache or similar, and ocassionally talking to psql... I'm still quite a ways from using that as a practical project. |
| 14:51 | Raynes | But if you know you aren't going to do that, then I wouldn't worry about it. Just keep it in mind if you ever have a chance of calling it. If I didn't shadow in my code, I'd kill myself trying to name locals. |
| 14:52 | Squee-D | Only been at clojure for one day :D |
| 14:52 | amalloy | fdaoud: chain them? that implies passing the result of one to the next, but if they're returning nil there's nothing to chain |
| 14:52 | TimMc | fdaoud: Oh wait, you want the function... |
| 14:52 | Squee-D | Timc now i get shadowing. thanks. |
| 14:53 | TimMc | Squee-D: Like Raynes said, it's fine to do, just be mindful. |
| 14:53 | hiredman | Squee-D: and you think rewriting functions in clojure core in the least amount of characters is going to get your to that place? |
| 14:53 | Squee-D | hiredman no. that was actually my point. |
| 14:53 | hiredman | (seems unlikely) |
| 14:53 | fdaoud | TimMc: I think you're right. something like (some identity [(f1 x) (f2 y) ...]) |
| 14:54 | amalloy | fdaoud: no, then you're calling them all regardless, which it sounds like you don't want to |
| 14:54 | hiredman | so what is the problem with the ruby evenmachine version that you are going to solve with clojure? |
| 14:54 | fdaoud | amalloy: perhaps chain isn't the correct term. each function is independent, but in a certain order and when one returns nil, go on to the next |
| 14:54 | Squee-D | I was saying the golf league attitude causes a lot of those solutions to be terse to the exclusion of good practice. but i think we've covered the topic now :D |
| 14:54 | amalloy | (some #(%) [#(f1 x) #(f2 y) ...]) |
| 14:54 | amalloy | Squee-D: i agree, and i wish it weren't that way. but characters are easy to measure, so we measure them :P |
| 14:55 | fdaoud | amalloy: that will make it lazy? |
| 14:55 | TimMc | fdaoud: But you want f2, not the result of (f2 y)... |
| 14:55 | fdaoud | TimMc: actually I do want (f2 y) |
| 14:55 | antares_ | Squee-D: just curious, are you replacing an amqp/Ruby system with amqp/Clojure? I maintain AMQP clients for both :) |
| 14:55 | TimMc | Oh! OK. |
| 14:55 | amalloy | fdaoud: you'll probably be happier if you read the code and understand it rather than having me answer whether it's lazy |
| 14:56 | Squee-D | hiredman I am taking clojure into consideration for 2 reasons. 1. i can live debug. 2. Our current code is cumbersome and innellegant. it needs a heavy refactor (the previous team did not have the same standards around elegance that this team does) |
| 14:56 | fdaoud | amalloy: you are absolutely right |
| 14:56 | Squee-D | antares_ considering it. |
| 14:56 | fdaoud | amalloy, TimMc, thanks |
| 14:56 | hiredman | amalloy: maybe some kind of distance from a the clojure.core implementation, or some kind of mean |
| 14:57 | antares_ | Squee-D: ok. Then maybe take a look at https://github.com/michaelklishin/langohr if you decide to go with Clojure. |
| 14:57 | fdaoud | amalloy: so really you are telling _me_ not to be so lazy. :D |
| 14:57 | amalloy | hah. indeed |
| 14:58 | Squee-D | antares_ a previous dev wrote https://github.com/visfleet/pipeline_toolkit which seemed nice on paper, at the time. but it's a nightmare to orchestrate |
| 14:58 | fdaoud | I definitely need to sit down and figure this stuff out. I think I got overwhelmed from listening to both Rich's and Jim's talks back-to-back. |
| 14:58 | Squee-D | antares_ rather than patch it up with dsl's for orchestration, i figure at the very least we should just have full ruby process per 'pipeline' rather than this chaing of piped processes |
| 14:59 | Squee-D | fdaoud that's pretty much the command pattern in fp? |
| 14:59 | antares_ | Squee-D: with Clojure the chaining part will be significantly easier. I kind of do chaining with just functions and threads, much more manageable than processes. |
| 15:00 | Squee-D | antares_ i also expect a boon from being able to attach the repl to the process. |
| 15:00 | Squee-D | because debugging evented code in ruby is pretty difficult. |
| 15:01 | Squee-D | I prefer not to have to debug, but the system has a lot of open ends that could be abused, and are routinely abused. |
| 15:01 | antares_ | Squee-D: absolutely, that was another change I personally am very happy about. And tools like VisualVM will help, too. |
| 15:01 | amalloy | haha sounds kinda like 4clojure, Squee-D |
| 15:02 | Squee-D | it's quite strange to be able to talk like a modern architect at one level with you fellows, and like a complete gumby when it comes to anything clojure related. |
| 15:03 | Squee-D | I love the days you feel both reasonably intelligent and drooling-special-needs in the same breath. |
| 15:03 | Squee-D | I dont get enough of them |
| 15:03 | mdeboard | Trade bodies with me, that's my every day |
| 15:04 | Squee-D | I spend considerably more time mentoring than being mentored. It's not a good balance. |
| 15:05 | Squee-D | antares_ so whats the several layers of DSLs that langhor is avoiding? |
| 15:05 | fdaoud | Squee-D: to me the command pattern in fp is just a function |
| 15:06 | timvisher | could anyone tell me how to add a file to the classpath in leiningen? |
| 15:06 | amalloy | timvisher: usually the answer is "don't do that" |
| 15:06 | timvisher | i'm trying to add log4j.properties |
| 15:06 | antares_ | Squee-D: it is just a small layer of Clojure on top of the Java client. I am also incorporating good things from amqp gem into it over time. The goal is to make error handling & recovery great (Java client does not really offer much by default, like many other clients) and provide ways to implement common patterns by *just* function composition. |
| 15:06 | timvisher | i like asking these sorts of questions lately, it would seem. :) |
| 15:06 | raek | timvisher: put it in resources/ |
| 15:06 | amalloy | i keep my .properties files in ./resources |
| 15:07 | Squee-D | fdaoud wait isn't anything not a type 'just a function' :P |
| 15:07 | antares_ | Squee-D: so my code that uses Langohr pretty much has no macros or DSLs in them. But heavily uses clojure.core/comp and a couple of other small libraries of mine that compose functions. |
| 15:07 | Squee-D | antares_ when did you first start with fp? |
| 15:08 | antares_ | Squee-D: 1.5-2 years ago, with Scala. I have been using functional-ish idioms in Ruby and Java since 2006 or so. |
| 15:08 | raek | timvisher: that directory is not created by default, but leiningen will include it if it exists (you may need to restart the process after creating the dir, though) |
| 15:08 | antares_ | Squee-D: it is much easier to pick up than you think. Much easier than get really good at DSLs, for example. |
| 15:08 | timvisher | raek, amalloy: working on that. :) |
| 15:09 | Squee-D | antares_ im pretty tight with ruby meta |
| 15:09 | antares_ | Squee-D: and certainly the cost of experimenting is lower compared to DSLs |
| 15:09 | Squee-D | antares_ i'm sure i'll change my tune, but i guess what scares me is i feel like im reaching the top of my imperitive game |
| 15:10 | timvisher | hmm, I'm just seemingly incapable of setting up tools.logging... |
| 15:10 | Squee-D | antares_ so fp feels like a very steep climb at the moment |
| 15:11 | Squee-D | So is there such a thing as 'Clean Code' for functional programmers? |
| 15:11 | antares_ | Squee-D: I know what you mean. I also know a few people who kind of grew out of Ruby/DSLs and found Clojure very worth using because they have a ton of additional options to choose from (in addition to DSLs) without going through all the Scala/ML type system jazz even when it does not help much. |
| 15:11 | Squee-D | Scala,i think, has an even worse leaning curve, its TIMTOWTDI on steroids whenever i look at it. |
| 15:12 | antares_ | Squee-D: I think learning about Haskell is the best way to absorb FP ideas. And I have no plans to use Haskell at work, just learning many things from it. Apparently it influenced Clojure more than people think. |
| 15:12 | Squee-D | I did start with haskell, but ditched it for Clojure as soon as i saw the jvm . |
| 15:13 | amalloy | is there something wrong with there being more than one way to do it? clojure heavily encourages functional programming and sequences, but often there are a number of ways to express the same idea |
| 15:13 | antares_ | Squee-D: haskell has many ideas about function composition that you can use from Clojure. But in haskell they are very much at the core so you absolutely cannot not notice them. |
| 15:13 | Squee-D | amalloy it can get burdensome. conventions, obvious patterns and recognizable patterns assist the programmer |
| 15:14 | dnolen | antares_: Squee-D: I think Standard ML is a better place to start IMO. In Haskell you have to deal w/ ubiquitous laziness and monads. |
| 15:14 | Squee-D | dsl's are nice in that it's code for programmers. if you approach DSL writing with a strong ethos of high-usability, you can make daily tasks much less arduous |
| 15:14 | antares_ | amalloy: I think Scala has a bit of a bad reputation in this regard, often undeserved. |
| 15:14 | antares_ | dnolen: agreed. OCaml or F# are "smaller" yet many ideas are basically the same. |
| 15:15 | amalloy | eg, a little toy in that neighborhood: you can write (foo (bar (baz sam))), (-> sam baz bar foo), or even something like (foo (-> (baz sam) bar)) depending on what you want to emphasize - they're semantically identical |
| 15:16 | Squee-D | the same is true of a lot of languages. like python. But the 80/20 rule is to find a readily readable pattern for a desired outcome. composing functions and dsls are both means to that end. |
| 15:16 | Squee-D | the example you give i can read fairly easily, as a novice. |
| 15:17 | Squee-D | and omg in ruby you can do things in a lot of different ways. What I found with Scala tho, is a lot of projects that were not showing any care for the next guy to read the code. |
| 15:18 | Squee-D | antares_ and i could be giving Scala undeserving flack here. |
| 15:18 | Squee-D | it just felt that way whenever i tried to accomplish something. |
| 15:18 | antares_ | Squee-D: to get a feeling of how function composition can make your code drastically simpler and shorter, take a look at https://github.com/michaelklishin/validateur. It is by no means finished but it is like 6-7 times shorter than the original Ruby version. And Ruby is considered a concise language. |
| 15:19 | antares_ | Squee-D: and also you can add any kind of validator you want, each validator is just a function. So they are trivial to test, compose and reuse. |
| 15:19 | fdaoud | antares_: what's with the French in naming Clojure projects? (not that there's anything wrong with that) |
| 15:19 | fdaoud | Validateur, Noir, Moustache, et quoi encore? |
| 15:20 | antares_ | fdaoud: I am out English names for just about anything. Langohr is German and I have a bunch of libraries named after Italian drinks (like Limoncello) ;) |
| 15:20 | bhenry | moustache was written by a french guy right? |
| 15:20 | chouser | I think cgrande is German |
| 15:20 | Squee-D | oh i cant wait for chinnoto |
| 15:20 | fdaoud | I'd guess Christophe Grand is Fernch |
| 15:20 | fdaoud | *French |
| 15:21 | fdaoud | J'en suis presque certain. |
| 15:21 | redinger | Yeah, I thought he was French, too |
| 15:21 | bhenry | cgrand.net is in french |
| 15:21 | Squee-D | antares_ yeah so im still so un-lispy that i'd rather read ActiveRecord::Validations right now :D |
| 15:23 | fdaoud | he's not impressed with GWT; "the Maven presentation was well done despite the PC spontaneously rebooting" hehe |
| 15:23 | fdaoud | jcromartie, the man |
| 15:23 | jcromartie | hey |
| 15:24 | jcromartie | you flatter |
| 15:24 | chouser | I don't think cgrande.net has anything to do with our cgrande |
| 15:24 | bhenry | our cgrande got cgrand.net |
| 15:24 | chouser | our cgrande is actually cgrand :-) |
| 15:24 | bhenry | haha |
| 15:25 | chouser | oh, I see. cgrand.net is also french. Hm. |
| 15:25 | redinger | He's definitely flying to the Conj from France. :) |
| 15:26 | chouser | See, I originally assumed he was Franch, but thought I was disabused of that notion at the previous Conj. Hm. |
| 15:26 | fdaoud | yeah it's Grand not Grande |
| 15:26 | Raynes | chouser: Isn't cgrande.net spanish? |
| 15:26 | fdaoud | Grand means Tall |
| 15:26 | Raynes | I'm not much for languages. |
| 15:26 | Raynes | Spoken languages, anyway. |
| 15:26 | fdaoud | Grande means Tall woman |
| 15:26 | TimMc | antares_: I'm going to start naming things after the scientific names of plants and animals |
| 15:26 | redinger | Raynes: Now that's funny |
| 15:26 | antares_ | Raynes: looks like Catalan to me |
| 15:26 | bhenry | cgrande.net is catalan according to google |
| 15:27 | TimMc | Why not cgrande.cat, then? :-) |
| 15:27 | Squee-D | Reading validateurs code, I find myself looking for classifications and local state for anchor points. It feels like snow crash. |
| 15:28 | raek | I find it amusing that the two of the most famous french clojurians are called "Grand" and "Petit" |
| 15:28 | Squee-D | Anyone remember having a "a-ha i'm no longer decoding the code, i'm reading it" moment? I want that |
| 15:28 | antares_ | raek: hahaha |
| 15:29 | antares_ | Squee-D: you will be there in a couple of weeks. Clojure Programming from O'Reilly is the best place to start, I think. The Joy of Clojure is your ultimate destination ;) |
| 15:29 | Squee-D | okeedokes |
| 15:30 | Squee-D | thanks for your time guys |
| 15:31 | Squee-D | I go do some 9-5 stuff now :D |
| 15:31 | Raynes | redinger: I'm all about funny. I plan to tape a whoopie cushion to my back so that I can even be funny when I faint before giving my talk at the conj. |
| 15:32 | fdaoud | antares_: I don't do rough cuts so impatiently waiting for its release, still a month or two to go.. |
| 15:32 | redinger | Raynes: Sounds like a riot. Hopefully the other Geni guys are brining smelling salts |
| 15:32 | Raynes | Hopefully. |
| 15:32 | Raynes | I'll just call amalloy up to hold my hand if I get scared. <3 |
| 15:33 | redinger | he should prepare some kind of magic show act to entertain the crowd |
| 15:35 | amalloy | i'll reimplement some of the clojure.core functions in as few characters as possible |
| 15:35 | amalloy | the crowd goes wild |
| 15:54 | gtrak | is it possible to steal the counter-clockwise repl and use it as a external tool on normal java projects, with auto-complete and such? |
| 15:55 | gtrak | I managed to do it manually with just the clojure jar, but the repl is very lacking |
| 15:58 | amalloy | gtrak: cake repl has autocomplete |
| 15:58 | amalloy | otherwise, rlwrap probably does most of what you need |
| 15:59 | gtrak | yea, i'm working in eclipse, it's console is full of suck |
| 15:59 | gtrak | i'll check out rlwrap |
| 16:00 | gtrak | it sucks working in java-land |
| 16:16 | Squee-D | antares_ you sure you meant the oreilly book? Its yet to be published. There's a prag bookshelf one |
| 16:18 | fdaoud | Squee-D maybe he got the rough cut |
| 16:18 | fdaoud | the prag one has a second edition coming up btw |
| 16:18 | Squee-D | perhaps. just wanted to be certain of what he was recommending |
| 16:18 | fdaoud | also clojure in action is coming out in about a month |
| 16:19 | Squee-D | yeah i might just dive in with the other manning one |
| 16:19 | Squee-D | Joy |
| 16:19 | fdaoud | I'm about halfway through Joy, it's excellent |
| 16:25 | moomin | Hi, I'm hoping someone can help me with another variable resolution problem. |
| 16:25 | moomin | This may be seriously leiningen specific. |
| 16:25 | chouser | I personally recommend Joy. You can probably guess why. ;-) |
| 16:25 | moomin | I've got a variable called handel.config/port-override |
| 16:26 | moomin | I've got a hook that attaches to ring |
| 16:26 | moomin | (a prepend) |
| 16:26 | moomin | This then changes the value of the variable. |
| 16:27 | moomin | If I check the value within the hooks file, it's changed. |
| 16:27 | moomin | But when it actually runs, it's unchanged. |
| 16:29 | moomin | Could anyone explain to me what I'm doing wrong here? |
| 16:31 | bloop | This is probably the most common question here, so I'll ask carefully: What's the best link on list vs vector? :) |
| 16:33 | moomin | Don't know of one, I'm afraid. Biggest observations are that vectors have fast nth access and conj puts values at the end. |
| 16:33 | Squee-D | chouser: i hope you got at least 50cents from my purchase |
| 16:34 | Squee-D | Publishers are notoriously cheap |
| 16:34 | fdaoud | chouser: you and fogus did a fantastic job |
| 16:35 | fdaoud | (cue chouser to say "it was all me, fogus just piggybacked") ;) |
| 16:35 | fdaoud | Squee-D: actually it's 25cents because he has to split it with Fogus |
| 16:36 | Squee-D | nah i hear fogus get's $1.10 |
| 16:36 | Squee-D | but dont tell chouser |
| 16:38 | moomin | More generally, is there a way to detect whether or not your code is running within leiningen? |
| 16:41 | antares_ | Squee-D: I sure meant the O'Reilly book. The pragprog one is outdated and has low signal/noise ration in my opinion. It was the 1st book on Clojure so it caters to absolute noobs heavily. |
| 16:41 | antares_ | *ratio |
| 16:42 | Squee-D | The O'Reilly one is due in december |
| 16:43 | redinger | antares_: The prag one has a rewritten second version in beta right now |
| 16:43 | mefesto | moomin: this may not be the best way but when run in leiningen the env var LEIN_VERSION is set |
| 16:44 | fdaoud | there's one more book in the works I believe |
| 16:45 | antares_ | redinger: I know. I feel that it won't change its target audience, though. I may buy it either way :) |
| 16:45 | fdaoud | no starch press? |
| 16:45 | antares_ | Squee-D: I have O'Reilly Safari subscription so I read the rough cut version :) |
| 16:45 | amalloy | fdaoud: Raynes's book? |
| 16:45 | redinger | fdaoud: There's Raynes book and Amit's book |
| 16:45 | Squee-D | Oh i havent had a safari sub in a long while, it was a money sync, i kept ordering books and not having time to read them |
| 16:45 | fdaoud | Amit's is Manning's Clojure in Action, so yeah amalloy I think you're right. That one is meant for beginners, yes? |
| 16:46 | Squee-D | sink* |
| 16:46 | dpritchett | Do I need to do anything to emacs24 to get really detailed colors with clojure-mode? |
| 16:46 | antares_ | Squee-D: there is also Practical Clojure from apress that I like. Clojure in Action, I did not finish reading. |
| 16:46 | dpritchett | i seem to remember there being more variety the last time i used this |
| 16:46 | Squee-D | going to see how i get along with Joy, although it's aimed hi |
| 16:46 | fdaoud | http://meetclj.raynes.me/ |
| 16:46 | Raynes | I really need to rewrite that text. |
| 16:47 | Raynes | Just a big ol' block of long-windedness. |
| 16:47 | dpritchett | mine looksl ike this http://i.imgur.com/63jzy.png and its not too exciting |
| 16:47 | fdaoud | Raynes! How's your book coming along? |
| 16:47 | Raynes | Smoothly. |
| 16:47 | Raynes | Still far, far from being done. |
| 16:47 | Squee-D | oh i want. |
| 16:50 | Squee-D | Learn you haskell made me feel ok to feel dumb |
| 16:51 | amalloy | dpritchett: you want to customize your faces |
| 16:51 | bhenry | dpritchett: http://i.imgur.com/7W7MF.png |
| 16:51 | dpritchett | yeah bhenry that's more like what i had in mind |
| 16:51 | amalloy | though i don't care for rainbow parens, personally |
| 16:52 | dpritchett | i don't really need rainbows either, but the string literal is the same color as defn and all the other stuff |
| 16:52 | bhenry | amalloy: they don't matter if you have paren-highlighting on, but i imagine you want at least one of those things. |
| 16:52 | dpritchett | i have paredit on too fwiw |
| 16:52 | amalloy | bhenry: nope, no thanks |
| 16:53 | amalloy | having it highlight the matching paren when i close one is enough for me |
| 16:53 | amalloy | with paredit, at least |
| 16:53 | bhenry | amalloy: what are you a robot? |
| 16:53 | amalloy | bhenry: http://i.imgur.com/d63Op.png is mine, but perhaps a bit too high-contrast for some |
| 16:53 | dpritchett | in other news, newlines are for sissies |
| 16:53 | Squee-D | That i can read |
| 16:54 | dpritchett | that looks nice amalloy! |
| 16:54 | brehaut | amalloy: your terminal is a window into 1992! |
| 16:54 | Squee-D | i code for sissies, like me |
| 16:54 | amalloy | dpritchett: i started with color-theme and installed tty-dark, then customized the colors for several of the faces |
| 16:55 | Squee-D | whats the font, looks like anonymous |
| 16:55 | dpritchett | i'll need to mess with the faces i guess, amalloy |
| 16:55 | amalloy | it's uh, whatever is default on linux |
| 16:55 | dpritchett | i just typed in your abort-transaction function |
| 16:55 | dpritchett | and my exception didn't get a special color like yours does |
| 16:55 | amalloy | DejaVu Sans Mono apparently? |
| 16:55 | hiredman | Mensch!!! |
| 16:55 | Squee-D | yeah that sounds like a default |
| 16:56 | hiredman | (we are talking about fonts right?) |
| 16:56 | brehaut | incidentally, the ubuntu mono is quite nice. maybe not quite as good as inconsolata, but it has bold and oblique faces |
| 16:56 | Squee-D | hiredman oooh not bad |
| 16:57 | amalloy | dpritchett: clojure-mode sets faces for a bunch of different semantic things (eg, classes), but the default colors for many of those are the same |
| 16:57 | Raynes | I <3 DejaVu |
| 16:57 | dpritchett | where would i go to recolor the faces? |
| 16:57 | amalloy | dpritchett: M-x customize-face |
| 16:57 | hiredman | http://robey.lag.net/2010/06/21/mensch-font.html <-- look at those huge angle brackets |
| 16:58 | dpritchett | thats cool hiredman |
| 16:58 | fdaoud | Raynes: don't change your book cover :) |
| 16:58 | amalloy | dpritchett: if point is on a form, customize-face defaults to customizing whatever is in control of that form |
| 16:58 | dpritchett | sweet, you read my mind |
| 16:58 | amalloy | for java interop, it's apparently font-lock-preprocessor-face |
| 16:58 | fdaoud | I'd love to write a book focused on clojure web development |
| 16:59 | Raynes | My book will have a chapter on web development with noir. |
| 16:59 | brehaut | hiredman: mensch is good. thanks for the pointer |
| 16:59 | fdaoud | great to hear Raynes |
| 17:00 | fdaoud | I'm hoping there's some good web stuff in cemerick's book too |
| 17:01 | brehaut | fdaoud: i understand that there might be some good SQL stuff from brian carper, which is tangentially web stuff |
| 17:02 | fdaoud | brehaut: that might be interesting |
| 17:02 | brehaut | fdaoud: otherwise, what sort of web stuff do you want? theres a wide range of good material available for free |
| 17:04 | aperiodic | taking the discussion back 8 minutes, I have never wanted for another monospace font since discovering inconsolitas |
| 17:05 | fdaoud | brehaut: what do you use for serious clojure web development? |
| 17:06 | brehaut | fdaoud: i use the ring ecosystem. particularly moustache and enlive (although there are times when i think hiccup might be more appropriate) |
| 17:06 | brehaut | fdaoud: i pick and choose other libs as needed |
| 17:08 | fdaoud | brehaut: cool. so typically it's ring, then either compojure or moustache, and finally enlive or hiccup, yes? |
| 17:08 | brehaut | fdaoud: yes. if you want some more handholding, webnoir collects things together and is a little more prescriptive, but its just a layer on top |
| 17:10 | brehaut | fdaoud: webnoir also has a strong set of docs and tutorials on its project's website |
| 17:10 | fdaoud | brehaut: thanks.. the tools have evolved since I last wrote a webapp with clojure, back then it was pretty much just ring and compojure, and I used Velocity for templating |
| 17:10 | TimMc | aperiodic: Inconsolata |
| 17:11 | TimMc | (to be precise) |
| 17:11 | dpritchett | i just use consolas |
| 17:11 | TimMc | dpritchett: THat's the MS one, right? |
| 17:11 | dpritchett | it's not *perfect* but it's good enough to not bother looking further afield |
| 17:11 | dpritchett | i think so TimMc |
| 17:11 | dpritchett | i guess i'm using a different one at home on my mac |
| 17:11 | brehaut | dpritchett: does consolas have true bold and oblique faces? |
| 17:12 | dpritchett | i am not enough of a typesetter to be able to answer that brehaut |
| 17:12 | dpritchett | maybe i use menlo on my mac, not sure. it's running snow leopard and i poked around til i found one |
| 17:12 | dpritchett | maybe inconsolatas |
| 17:12 | fdaoud | brehaut: on linux anyway, the answer is yes |
| 17:12 | dpritchett | inconsolata i mean |
| 17:15 | aperiodic | TimMc: ah, thanks. I've never heard it out loud so it's hard to remember how it's pronounced, thus spelled. |
| 17:15 | TimMc | It's pretty nice. |
| 17:16 | aperiodic | I really like it |
| 17:17 | aperiodic | I am using the variant with straight quotes and apostrophes, though |
| 17:17 | fdaoud | I keep going back and forth between consolas and monaco |
| 17:18 | fdaoud | sometimes droid sans mono |
| 17:21 | technomancy | no terminus fans? |
| 17:22 | fdaoud | used to be, but it doesn't work well on large monitors |
| 17:23 | technomancy | large monitors or high DPI? |
| 17:23 | fdaoud | both I guess |
| 17:23 | fdaoud | 2x27" 1980x1080 |
| 17:24 | hiredman | hah! |
| 17:25 | hiredman | 2560x1440 is nicer, I mean |
| 17:25 | fdaoud | my favorite in the terminus days was vt100 |
| 17:25 | technomancy | I don't think it has much to do with the display size, just the density. |
| 17:26 | fdaoud | I'm sure you're right |
| 17:27 | fdaoud | hiredman: how much do those go for? |
| 17:28 | hiredman | it was $800 or $900 |
| 17:28 | fdaoud | ok.. over my budget, I paid $500 for the pair! |
| 17:29 | fdaoud | dual monitors are a must |
| 17:36 | fdaoud | $2500 on monitors? |
| 17:36 | fdaoud | what exactly are you hired for? ;) |
| 17:37 | srid | idiomatic way to call a function N times and accumulate the results in a collection? |
| 17:37 | srid | this doesn't work - (map #(rand-nth choices) (range 100)) |
| 17:37 | amalloy | repeatedly |
| 17:38 | brehaut | fdaoud: http://fishbowl.pastiche.org/archives/pictures/matrix-architect.jpg |
| 17:38 | amalloy | fdaoud: software. if you hire someone for (say) $100k a year, and can increase their productivity by 25% at a cost of $2500, that's a thousand percent return on investment |
| 17:38 | srid | ,(repeatedly 10 #(rand-int [1 2 3])) |
| 17:38 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.ClassCastException: clojure.lang.PersistentVector cannot be cast to java.lang.Number> |
| 17:39 | amalloy | it's silly to skimp on those things |
| 17:39 | hiredman | oh, I paid for the monitors my self, they are not matching |
| 17:39 | technomancy | I'd buy a number close to 25% for the second monitor. the third and fourth... meh. |
| 17:39 | srid | ,(take 10 (repeatedly #(rand-int [1 2 3]))) |
| 17:39 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.ClassCastException: clojure.lang.PersistentVector cannot be cast to java.lang.Number> |
| 17:39 | fdaoud | amalloy: I'm not talking about skimping on # of monitors, but for $250/monitor is decent, no? is it necessary to get a $900 monitor? |
| 17:39 | TimMc | ,(doc rand-int) |
| 17:39 | amalloy | technomancy: fortunately i have a 900% margin for error in my calculations :P |
| 17:39 | clojurebot | "([n]); Returns a random integer between 0 (inclusive) and n (exclusive)." |
| 17:40 | hiredman | my 17" and 23" predate my current gig |
| 17:40 | technomancy | even with a second monitor it depends on what you're doing |
| 17:40 | srid | ,(repeatedly 10 #(rand-nth [1 2 3])) |
| 17:40 | TimMc | ,(take 10 (repeatedly #(rand-int 3))) |
| 17:40 | clojurebot | (2 1 2 3 3 ...) |
| 17:40 | hiredman | I work from home so it falls under home improvement |
| 17:40 | clojurebot | (2 2 2 0 2 ...) |
| 17:40 | technomancy | I don't miss external monitors nearly so much when I'm not doing web work |
| 17:40 | TimMc | clojurebot: Out Of Order! |
| 17:40 | clojurebot | Praetor: The ordering is usually such that (partial ...) is useful. :-) |
| 17:41 | amalloy | i just use one monitor because i'm not very good at utilizing the second |
| 17:41 | chewbranca | fdaoud: depends on how big of monitors you want, 30" monitors are just now getting into the $900-$1100 range |
| 17:42 | TimMc | amalloy: I have a standing workstation and a 1920x1200 monitor. Where would I *put* another one? |
| 17:42 | amalloy | TimMc: arrange them in a V shape |
| 17:42 | chewbranca | personally I can't stand even numbers of monitors, because then they aren't symmetrical, as your center of vision would be at the border where the two monitors connect |
| 17:42 | TimMc | I guess I could put them in portrait mode. |
| 17:42 | fdaoud | chewbranca: ok. I have 2 computers, one with 2x21" and one with 2x27". Personally I find the 27" too big. The 21" have the same resolution so are nicer IMO. |
| 17:43 | fdaoud | all were in the $250 range |
| 17:43 | chewbranca | fdaoud: ahhh nice |
| 17:43 | llasram` | chewbranca: Oh god. Thanks a lot. It's never bothered me before, but now I can't unsee it! |
| 17:43 | chewbranca | fdaoud: oh I agree, I picked up 3 24" monitors from costco (btw best place to get monitors) for $199 each |
| 17:44 | technomancy | my external monitor is too heavy to go in portrait orientation |
| 17:44 | hiredman | http://www.biscade.com/office/ (not me, I live in envy) |
| 17:44 | technomancy | oh, uh... #firstworldproblems |
| 17:44 | chewbranca | llasram`: hahaha yeah that's why odd numbers of monitors are key |
| 17:44 | jweiss | clojure.data/diff is nice, but i'd like to be able to reverse it to get the path i gave to update-in to make the change in the first place. i am sure it is possible, but having trouble figuring it out |
| 17:44 | chewbranca | only problem with multi monitors now is that they're all widescreen, so you end up with extra triple wide wide screen |
| 17:44 | dnolen | any opinions about the following for high-performance property access? http://dev.clojure.org/jira/browse/MATCH-4 |
| 17:45 | fdaoud | chewbranca: you're right, I'd prefer 3 "not wide" monitors |
| 17:45 | chewbranca | I'm currently sitting on 5940x1080 res, which don't get me wrong, I love the horizontal screen space, but it lacks on vertical space for code |
| 17:45 | dnolen | for core.match |
| 17:45 | chewbranca | fdaoud: yeah tough to find these days |
| 17:46 | fdaoud | gotta go, later all |
| 17:46 | aperiodic | chewbranca: mount your monitors sideways? |
| 17:46 | chewbranca | fdaoud: I managed to find a cheap 19" dell 4:3 monitor on craigslist for my standing desk, but I think everything has gone widescreen now |
| 17:46 | chewbranca | fdaoud: later |
| 17:46 | fdaoud | chewbranca: yes that's the mainstream I guess |
| 17:46 | fdaoud | ciao |
| 17:47 | cemerick | dnolen: .-bar hurts, but this is bikeshed territory |
| 17:47 | chewbranca | aperiodic: the thought as crossed my mind, but, if you watch any movies or tv shows on your computer, then vertical monitors are rough |
| 17:47 | chewbranca | aperiodic: I'm trying to find a balance |
| 17:47 | technomancy | also many monitors don't have good vertical viewing angles |
| 17:47 | chewbranca | or better yet: http://www.amd.com/us/products/desktop/graphics/ati-radeon-hd-5000/hd-5870-eyefinity-6-edition/pages/overview.aspx |
| 17:47 | technomancy | so you get a slightly different color in your left eye vs your right eye, which will drive you nuts |
| 17:48 | chewbranca | :D |
| 17:48 | chewbranca | would be hilarious to have emacs full screen across 6 monitors |
| 17:48 | chewbranca | technomancy: oh interesting, I'll have to keep that in mind |
| 17:48 | moogatronic | Noob question: I have emacs 24/Swank/Slime working. Do most people remap their evaluate last expression key stroke? My pinky is already getting tired. =) |
| 17:48 | chewbranca | technomancy: is that common for vertical monitors? |
| 17:48 | technomancy | chewbranca: yeah, be sure to test it by turning your head sideways before you invest in anything =) |
| 17:49 | technomancy | moogatronic: most people make caps lock their ctl |
| 17:49 | chewbranca | technomancy: will do |
| 17:49 | aperiodic | oh, good point |
| 17:49 | chewbranca | moogatronic: I have caps lock and ctrl set to 'ctrl' so I can use whichever is more comfortable |
| 17:50 | moogatronic | technomancy: I do have my keyboard mapped that way, but if I'm treating my buffer like a repl, i'm hitting that keystroke all the time. Maybe my question should be is there a repl in emacs that you can just type sexps and hit enter to have them evaluated? |
| 17:50 | technomancy | moogatronic: sure, are you currently using slime without slime-repl? |
| 17:50 | aperiodic | the only time i've used vertical monitors was with crappy dell ones, and i chalked it up to their build quality rather than orientation |
| 17:50 | amalloy | moogatronic: isn't that M-p anyway? meta isn't usually a pinky key for me |
| 17:51 | moogatronic | technomancy: That's a good question - I don't know the answer. =) |
| 17:51 | amalloy | oh, you mean C-x C-e. i see |
| 17:51 | moogatronic | amalloy: yeah |
| 17:52 | moogatronic | whoa |
| 17:52 | moogatronic | nice. |
| 17:52 | moogatronic | =) |
| 17:52 | moogatronic | I thought about getting their completely separated keyboard |
| 17:52 | moogatronic | but dollars won out and I ended up with a MSFT natural 4k. |
| 17:53 | amalloy | anyway, yes, you probably want to use the slime repl |
| 17:53 | chewbranca | ahhhh yeah I can tell right nowby looking at my monitors sideways, looking at them horizontally, I have a wide angle of viewing where I can move left or right and still see it cleary, but vertically I can see a noticable difference with how centrally I need to be looking |
| 17:53 | chewbranca | amalloy: nice, how useful have you found that? |
| 17:53 | moogatronic | technomancy: is slime-repl something I need to install separately from slime et al ? |
| 17:53 | technomancy | moogatronic: if you are installing manually, yeah |
| 17:54 | technomancy | if you use M-x clojure-jack-in you get it all for free |
| 17:54 | moogatronic | I can work the google.. now that I know what i'm looking for. =) |
| 17:54 | moogatronic | I like the sound of free. |
| 17:54 | technomancy | moogatronic: the swank-clojure readme should get you what you need |
| 17:54 | technomancy | clojurebot: swank? |
| 17:54 | clojurebot | swank is try the readme. seriously. |
| 17:54 | amalloy | chewbranca: eh. i've had them for a month or two now. i don't think it will ever be as *fast* as using the modifier keys, but it's nice to give my fingers a break when i'm just editing or reading, rather than typing |
| 17:54 | technomancy | there ya go; clojurebot wouldn't lie to you. |
| 17:54 | chewbranca | amalloy: I've been toying around with the idea of picking up the kinesis advantage pro, I'm concerned with the keyboard being too small though as I'm pretty big, but I saw they have a 60 day return policy so I might have to check it out |
| 17:55 | amalloy | chewbranca: people who use the kinesis swear by it. personally i don't get it |
| 17:55 | chewbranca | amalloy: yeah don't always need speed |
| 17:55 | moogatronic | didn't know about the 60 day return policy. a few guys in my lab have the kenesis freestyles |
| 17:55 | chewbranca | amalloy: I've typed on it for maybe 30s, it feels potentially very comfortable |
| 17:56 | chewbranca | amalloy: I use an ergo keyboard and a trackball and still have issues, so looking to go more ergonomic than the microsoft natural keyboard |
| 17:56 | technomancy | chewbranca: I have the kinesis solo if you want to try it |
| 17:56 | moogatronic | I converted from the apple tiny kbd to this msft monstrosity. wrists are happy, but it takes so much space on my desk. |
| 17:56 | technomancy | you don't get the cupped shape, but you get to hold your arms straight out, which I think is of equal importance |
| 17:56 | amalloy | moogatronic: under-desk keyboard tray |
| 17:56 | chewbranca | technomancy: nice, yeah that would be cool, been struggling with the keyboard lately |
| 17:56 | technomancy | take a hacksaw to the numpad. show it who's boss |
| 17:57 | moogatronic | amalloy: I'm not allowed to attach stuff to the desk i've been assigned. lol |
| 17:57 | amalloy | i have vision problems, so i keep my keyboard entirely under the desk. means it costs me no desk space, and i can get the monitor right on the edge of the desk |
| 17:57 | moogatronic | but at home, my desk is glass… i'm pretty tall, most keyboard trays annoy me due to my knees ramming into them all the time. wrist comfort wins over appearance though. |
| 17:57 | aperiodic | i just got a Das Keyboard about a month ago, which i've been loving |
| 17:58 | moogatronic | chew: do you swap right and left hand mousing? |
| 17:58 | moogatronic | that helps me a bit. |
| 17:58 | mtm | maybe not ergonomic but I love the feel of the keys: http://matias.ca/tactilepro3/index.php |
| 17:59 | chewbranca | hiredman: I can use laptop keyboards for decent stretches, but I have to be more concious about sitting properly and keep my hands in correct posture |
| 17:59 | chewbranca | moogatronic: ahhh interesting, no I haven't tried that, good idea |
| 17:59 | moogatronic | I was drooling over this for a while: http://www.getsmartfish.com/Reflex-Keyboard-w-Anti-Fatigue-Comfort-Motion_p_8.html |
| 17:59 | chewbranca | moogatronic: I just ordered a bigger trackball mouse yesterday that is symmetric, so I'll have to give that a shot |
| 17:59 | moogatronic | it's windows only. no mac release yet. |
| 17:59 | moogatronic | has magic drivers or something for the key mappings, or some such nonsense. |
| 17:59 | chewbranca | mtm: I would love a tactile ergo keyboard |
| 17:59 | moogatronic | but the keyboard moves and adapts to the amount of time you've been typing. |
| 18:00 | chewbranca | moogatronic: oh crazy, wonder how noticable the movement is |
| 18:01 | moogatronic | the video was full of convincing propaganda about how it will make every aspect of your life more fulfilling, etc. =) |
| 18:01 | chewbranca | lol |
| 18:02 | moogatronic | if I don't have M-x clojure-jack-in, that probably means something on my system is out of date I'm assuming. =) |
| 18:03 | amalloy | moogatronic: it'd mean you're using a clojure mode from like 1995 |
| 18:03 | moogatronic | time travel shit! i knew my computer was special. |
| 18:04 | dpritchett | i spent half the day yesterday trying to get m-x clojure-jack-in moogatronic |
| 18:04 | dpritchett | i wound up nuking emacs23, building emacs24 from source, and then install clojure-mode to get it |
| 18:04 | dpritchett | these are only the steps that worked, i'm leaving out all the hours of aborted attempts |
| 18:04 | moogatronic | … I'm really trying to learn clojure and overtone, but i don't want to eat up half a day screwing up my configuration in the process |
| 18:05 | moogatronic | i suppose its what is needed. |
| 18:05 | dpritchett | i didnt have anything in my emacs configs to begin with so i aws happy to start over |
| 18:05 | dpritchett | are you on v24 at least? |
| 18:05 | moogatronic | god knows i've spent multiple days getting my org-mode babel R and xelatex exporting all working |
| 18:05 | moogatronic | yeah, i'm on 24, but i'm running an old emacs starter kit |
| 18:05 | Raynes | cp -r ~/.emacs.d ~/.emacs.d.backup |
| 18:06 | moogatronic | emacs configuration is still in the voodoo-state with respect to my conceptual model, and everything i have working now is essential to completing required work.. =) |
| 18:06 | moogatronic | Raynes: good call. |
| 18:09 | moogatronic | unrelated: anyone aware of the taxi cost for late night rides in Raleigh, NC? (due to late booking, etc, I missed all the good/deal/prices for the conj venue hotel) |
| 18:09 | moogatronic | also, can you safely navigate the streets of downtown after midnight on foot? |
| 18:18 | hiredman | not if there are conj goers about |
| 18:20 | Raynes | moogatronic: Well, I certainly didn't get raped last time I did that. |
| 18:20 | Raynes | Though I wasn't exactly in a secluded dark alley. |
| 18:22 | moogatronic | You can usually tell by the frequency of cop cars per normal car in a neighborhood as to whether or not you should be walking on that street. =) |
| 18:23 | moogatronic | hiredman: my only concern is that my hotel is around 1.5 miles from the conference hotel. not a big deal, i'm a decently big guy, but avoiding the tempting of random criminals is always good. |
| 18:23 | moogatronic | (speaking from experience -- have been attacked on the street before) |
| 18:23 | moogatronic | jiu jitsu comes in handy.. |
| 18:23 | hiredman | which hotel? |
| 18:23 | moogatronic | eh, I took the price line gamble, i'll look |
| 18:24 | moogatronic | Holiday Inn Raleigh-Brownstone Downtown |
| 18:24 | hiredman | actually if the conj is in the same hotel as last year (I think it is, not sure) the area around it is very empty/office park |
| 18:24 | iris1 | Dear experts, I have run into what I assume is a minor problem, but I am having trouble figuring it out. I would like to start a SWANK server from leiningen, but when I type "lein swank", it tells me "That's not a task". In order to install SWANK, I have previously typed "lein plugin install swank-clojure 1.3.3" and "lein deps", which seemed to not fail. (Ultimately I am trying to get SLIME working in emacs but I think my problem is that |
| 18:24 | iris1 | swank" does not work, rather than something on the emacs side.) Please advise. Thank you! |
| 18:24 | hiredman | I was in the area for the week following the conj too, walked around a little |
| 18:24 | moogatronic | I couldn't afford the full price and i missed the pre-reservation price, because i only found out that I could attend very recently. |
| 18:25 | hiredman | oh |
| 18:25 | hiredman | no, different hotel |
| 18:25 | hiredman | (last year was the hilton) |
| 18:25 | hiredman | so I dunno what the area is like |
| 18:25 | moogatronic | I suppose we'll find out. =) |
| 18:25 | moogatronic | I centered all around atlanta last year at pycon. No muggings. =) |
| 18:26 | moogatronic | This fantastic vegan soul food restaurant was in a questionable neighborhood. |
| 18:26 | moogatronic | lots of foot-patrol police, squad cars, and shady characters dodging in and out of alleys |
| 18:26 | moogatronic | The food was worth it. =) |
| 18:26 | moogatronic | gah.. auto-spell correct fail… centered == wandered |
| 18:28 | brehaut | moogatronic: if this is mac os x lion, system preferences > lanuage & text > text > correct spelling automatically |
| 18:29 | iris1 | lein swank |
| 18:29 | iris1 | (ah sorry, wrong prompt...) |
| 18:29 | moogatronic | brehaut: awesome. i was just under the assumption that the latest version of this client added terrible auto-correct. |
| 18:30 | brehaut | moogatronic: what client? if its colloquay i'd love to know about a new version |
| 18:30 | moogatronic | that client, but i've not ran it for a while, so I figured maybe it auto-updated or something. |
| 18:30 | moogatronic | programs sometimes have a mind of their own. =) |
| 18:31 | brehaut | moogatronic: haha i wish. i dont think theres been a new release build in 2 years |
| 18:35 | moogatronic | like magic. clojure-jack-in and slime-repl. |
| 18:35 | moogatronic | =) |
| 18:35 | moogatronic | much better |
| 18:37 | Raynes | brehaut: Textual is excellent. |
| 18:38 | brehaut | Raynes: thanks |
| 18:39 | brehaut | Raynes: it looks a lot more like IRC than colloquay ;) |
| 18:39 | Raynes | Yeah, I couldn't tolerate colliwhatever. |
| 18:40 | moogatronic | ohh nice |
| 18:40 | Raynes | It can't handle bouncers over multiple servers properly either. |
| 18:40 | Raynes | Textual is fantastic. |
| 18:40 | Raynes | Also free if you build it yourself, I think. Cheap if you don't. |
| 18:40 | brehaut | Raynes: looks that way; BSD FTW |
| 18:41 | moogatronic | that's an interesting way to release software. |
| 18:45 | amalloy | isn't that basically how (eg) red-hat works? the code is free, but for $N we'll bundle it up for you and provide some support |
| 18:45 | moogatronic | well, i got my emacs24/new clojuremode/latest starter kit working with swank and slime-repl, but now i'm not sure if my libraries are loading. |
| 18:46 | technomancy | for a while it was the only way to get gimp on macs |
| 18:46 | moogatronic | does clojure-jack-in start a server based on what's in project.clj ? |
| 18:46 | amalloy | moogatronic: yes |
| 18:47 | moogatronic | it looks like its probably working, but i'm seeing stacktraces when trying to load overtone, I guess its debug time. Was working in my old setup though. |
| 18:47 | manutter | hey, has anybody heard from the guy that does jark? His site has been down for a few days. |
| 18:47 | manutter | icylisper.in |
| 18:51 | moogatronic | thanks for the help wrt my swank/slime/repl setup! dinner time… =) |
| 19:19 | zerokarmaleft | oh snap, no rooms left at the sheraton :( |
| 20:30 | archaic | juxting zipper fns on a single node is really really nice |
| 20:34 | amalloy | ~juxt |
| 20:37 | amalloy | clojurebot: you okay over there? |
| 21:36 | moogatronic | two wins today. new irc client, thanks Raynes for the tip, and my emacs setup has been updated to modern times. =) |
| 21:38 | napping | which client? |
| 21:39 | moogatronic | Textual |
| 21:39 | moogatronic | osx… i guess it's for sale, OR you can just compile it yourself which was easy enough. |
| 21:39 | ibdknox | looks a lot like limechat |
| 21:39 | moogatronic | i like that it's not occupying as many pixels as possible |
| 21:40 | moogatronic | though, I still wish you could run alternate window managers in osx, like xmonad or something. |
| 21:40 | napping | lately I've tried ERC a bit |
| 21:40 | napping | If only for the TeX input method |
| 21:40 | moogatronic | i'm slowly coming up to speed on various emacs things. |
| 21:41 | moogatronic | i use emacs/org-mode/babel/r daily. |
| 21:41 | brandel | moogatronic: there are some utils that give you window snapping in os x.. not quite xmonad, but better than the defaults |
| 21:41 | moogatronic | fantastic for the tex output / literate programming |
| 21:41 | moogatronic | brandel: i have a divvy license, it's pretty nice |
| 21:41 | moogatronic | but it's not automatic. |
| 21:42 | moogatronic | i can quickly tile a few arrangements with some quick key tapping. =) |
| 21:42 | moogatronic | napping: does ERC interpret TeX from others in the chat window? |
| 21:42 | brandel | yeah I know what you mean, I do like xmonad |
| 21:43 | brandel | you could check out SizeUp - it gives you bindings for moving windows around |
| 21:43 | archaic | moogatronic: are you using clojure in babel? |
| 21:44 | moogatronic | archaic: not yet. currently all of my babel use is for course assignments. |
| 21:44 | moogatronic | archaic: have you? |
| 21:45 | archaic | ahh just wondering - its easy to setup in emacs 23 but 24 is real painful |
| 21:45 | archaic | i was hoping to copy your 24 config if you were :) |
| 21:45 | moogatronic | I do have one little problem with my LaTeX output… When I generate my document, it specifies the language syntax as R, capital R, but pygments expects lowercase r... |
| 21:46 | moogatronic | Well, my config for generating xelatexable docs from org worked in 24, but it was only running R. |
| 21:46 | moogatronic | just this evening tho, i refreshed my configs and upgraded to the latest emacs starter kit, clojuremode, etc.. |
| 21:46 | moogatronic | so i have to backport all of my customizations. |
| 21:46 | moogatronic | using the ugly default color scheme even.. but i was too excited to get going with some Overtone hacking |
| 21:46 | moogatronic | (to the dismay of my wife) |
| 21:47 | archaic | i was using default color scheme fairly long time, then i found https://github.com/sellout/emacs-color-theme-solarized |
| 21:47 | brandel | wives often seem to be a in state of dismay I find. |
| 21:48 | brandel | at least mine is. |
| 21:48 | moogatronic | brandel: haha! mine gets cranky when my studio monitors are cranked and I am generating random saw waves. |
| 21:48 | moogatronic | brandel: but I know what you mean. =) |
| 21:49 | brandel | you should give her brief respites with sine waves |
| 21:49 | moogatronic | she's been trained a bit.. sometimes I make beats and play with samples… and sometimes the same 3 seconds for hours. |
| 21:49 | moogatronic | then there's the moog voyager. |
| 21:49 | moogatronic | =) |
| 21:49 | moogatronic | i've been commanded to wear headphones. |
| 21:51 | brandel | I've done some composition in logic - worth exploring Overtone? it's more geared towards generated/algorithmic music right? |
| 21:51 | moogatronic | well, that's how I am planning to use it anyway. =) |
| 21:51 | napping | moogatronic: It's just for typing in unicode |
| 21:52 | brandel | can you wire up midi triggers? |
| 21:53 | moogatronic | I wanted a really solid reason to learn clojure that I could justfiy time wise… so it's now a course project to use bioinspired computing (evolutionary and other algorithms) to build something fun. |
| 21:53 | moogatronic | brandel: not sure yet. |
| 21:53 | moogatronic | brandel: I'm a major noob on many fronts at current moment. |
| 21:54 | brandel | sounds neat. meh everyone is a noob at most things. |
| 21:54 | moogatronic | yeah, you have to be a noob at everything at some point in time. i've just been admiring clojure from afar for too long now. |
| 21:55 | moogatronic | i naively thought that leaving full time employment and starting a PhD would free up time for explorations like this. |
| 21:55 | moogatronic | LOL.. wrong. |
| 21:55 | moogatronic | though, as long as I work it in somehow, it is no longer "playing".. it's "working". =) |
| 21:57 | moogatronic | archaic: everyone loves solarized it seems. I should give it a shot. I do prefer any non-white background. and inconsolata. |
| 23:55 | hiredman | ~ping |
| 23:55 | clojurebot | PONG! |