{"id":634,"date":"2014-12-15T00:59:44","date_gmt":"2014-12-14T13:59:44","guid":{"rendered":"http:\/\/juliangamble.com\/blog\/?p=634"},"modified":"2015-01-04T08:54:08","modified_gmt":"2015-01-03T21:54:08","slug":"reflections-on-clojure-conj-2014","status":"publish","type":"post","link":"https:\/\/juliangamble.com\/blog\/2014\/12\/15\/reflections-on-clojure-conj-2014\/","title":{"rendered":"Reflections on Clojure Conj 2014"},"content":{"rendered":"<p><strong>Introduction<\/strong><br \/>\nThese are my reflections on the talks. I&#8217;m trying to be open-minded and take a balanced view of the positive and negative opinions that were exchanged. If that&#8217;s not your thing then this probably isn&#8217;t for you.<\/p>\n<p><strong>The Venue<\/strong><br \/>\nThe Warner theatre was amazing. It reminded me of the <a href=\"http:\/\/en.wikipedia.org\/wiki\/State_Theatre_(Sydney)\">State Theatre<\/a> back home in Sydney.<br \/>\n<a href=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Conj-Photos.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-638\" src=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Conj-Photos-300x115.jpg\" alt=\"Conj Photos\" width=\"500\" height=\"150\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Inside the place had a pleasantly baroque feel, and everyone seemed to be relaxed and comfortable:<\/p>\n<p><a href=\"https:\/\/twitter.com\/JennHillner1\/status\/535533552344260608\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-746\" src=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/hickey42-1024x602.png\" alt=\"hickey4\" width=\"604\" height=\"355\" srcset=\"https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/hickey42-1024x602.png 1024w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/hickey42-300x176.png 300w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/hickey42-900x529.png 900w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/hickey42.png 1346w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><\/p>\n<p><em><strong>Day 1<\/strong><\/em><br \/>\n<img decoding=\"async\" style=\"width: 40%; max-width: 75px; border-radius: 50%;\" src=\"http:\/\/clojure-conj.org\/images\/speakers\/paul-d-be9e9162.jpg\" alt=\"photo PdG\" \/><strong>Unlocking data-driven systems<\/strong><br \/>\n[<a href=\"https:\/\/www.youtube.com\/watch?v=BNkYYYyfF48\">Video<\/a>] [<a href=\"https:\/\/github.com\/ohpauleez\/data-driven-slides\">Slides<\/a>] [<a href=\"https:\/\/twitter.com\/ohpauleez\">Twitter<\/a>] [<a href=\"http:\/\/www.pauldee.org\/blog\/\">Blog<\/a>] [<a href=\"http:\/\/www.lispcast.com\/pre-conj-paul-degrandis\">Pre-Conj Prep<\/a>] [<a href=\"https:\/\/github.com\/ohpauleez\">Github<\/a>]<br \/>\n<a href=\"http:\/\/clojure-conj.org\/speakers#paul-degrandis\">Paul deGrandis<\/a> opened with a story about his experiences on a Cognitect client. He kicked off this truism that was echoed throughout the conference:<\/p>\n<p><em><strong>Data &gt; Functions &gt; Macros<\/strong><\/em><\/p>\n<p>Now the reason why this was important was this snippet of detail:<\/p>\n<p><em>&#8220;These 26 lines [of #Clojure] replaced 2000 lines of JS and 1000 lines of HTML&#8221;<br \/>\n<\/em><\/p>\n<p>Now there wasn&#8217;t a lot of detail on that or how it worked. Indeed, some criticised this saying it was an <a href=\"https:\/\/twitter.com\/mindbat\/status\/535437362051186689\">advertisement<\/a> for Cognitect about proprietary technology.<\/p>\n<p><a href=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/ohpauleez-proprietary1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-thumbnail wp-image-647\" src=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/ohpauleez-proprietary1.png\" alt=\"ohpauleez proprietary\" width=\"400\" height=\"300\" \/><\/a><\/p>\n<p>To some the tone of this critique seemed a little <a href=\"https:\/\/twitter.com\/mwilliams\/status\/535439154512134144\">Statler and Waldorf<\/a>.<br \/>\n<a href=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/StatlerAndWaldorf.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-thumbnail wp-image-644\" src=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/StatlerAndWaldorf-150x150.jpg\" alt=\"StatlerAndWaldorf\" width=\"150\" height=\"150\" srcset=\"https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/StatlerAndWaldorf-150x150.jpg 150w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/StatlerAndWaldorf-144x144.jpg 144w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/><\/a><\/p>\n<p>The vibe I took from this was the<a href=\"http:\/\/www.paulgraham.com\/progbot.html\"> Paul Graham programming &#8216;bottom-up&#8217; theme<\/a>. Paul says in a Lisp language you write a DSL for your problem domain and then solve the business problem in the DSL. I took it this was what Paul deGrandis was driving at. If so &#8211; this is quite cool.<\/p>\n<p>Now the great thing about Paul D is that he is now the Pedestal guy. If you&#8217;ve worked with Pedestal &#8211; you&#8217;ll know it embodies this philosophy (particularly in the deprecated versions of the front-end).<\/p>\n<p><img decoding=\"async\" style=\"width: 40%; max-width: 75px; border-radius: 50%;\" src=\"http:\/\/i.imgur.com\/Npkllnn.jpgW-LkAf.jpeg\" alt=\"photo AP\" \/><strong>Cursive: a different type of IDE <\/strong><strong>Om nom nom nom<\/strong><br \/>\n[<a href=\"https:\/\/www.youtube.com\/watch?v=4-oyZpLRQ20\">Video<\/a>] [<a href=\"http:\/\/www.slideshare.net\/annapawlicka\/om-nom-nom-nom\">Slides<\/a>] [<a href=\"https:\/\/twitter.com\/AnnaPawlicka\">Twitter<\/a>] [<a href=\"http:\/\/annapawlicka.com\/my-first-conj\/\">Blog<\/a>] [<a href=\"http:\/\/www.lispcast.com\/pre-conj-anna-pawlicka\">Pre-Conj Prep<\/a>] [<a href=\"http:\/\/www.lispcast.com\/pre-conj-interview-anna-pawlicka\">Pre-Conj Interview<\/a>] [<a href=\"https:\/\/github.com\/annapawlicka\/pumpkin\">Github<\/a>]<br \/>\n<a href=\"http:\/\/clojure-conj.org\/speakers#anna-pawlicka\">Anna Pawlicka<\/a> has come from London and working with Bruce Durling at MastodonC. She was demonstrating some of the visualisations you can do with Om. She used d3.js and dimple.js to produce charts quickly.<\/p>\n<p>Anna did enunciate the benefits of Om extremely clearly, stating that Om relieves us from querying the DOM &#8211; we can just use clojure data structures and diff using reference equality check &#8211; and present from there.<\/p>\n<p>Anna demonstrated using http-kit and sente with core.asyc to update components, and these were coordinated with go blocks on the server and client.<\/p>\n<p>Anna described reference cursors in Om, using them for enabling and disabling transitions, and seeing information in a part of the application state.<\/p>\n<p>Anna also followed up the conference by creating an <a href=\"https:\/\/github.com\/om-cookbook\/om-cookbook\">Om-Cookbook<\/a> &#8211; something we&#8217;ve been needing for a while.<\/p>\n<p><img decoding=\"async\" style=\"width: 40%; max-width: 75px; border-radius: 50%;\" src=\"http:\/\/colinfleming.net\/profile.jpg\" alt=\"photo CF\" \/><strong>Cursive: a different type of IDE <\/strong><br \/>\n[<a href=\"https:\/\/www.youtube.com\/watch?v=vt1y2FbWQMg\">Video<\/a>] [<a href=\"https:\/\/twitter.com\/cursiveclojure\">Twitter Cursive<\/a>] [<a href=\"https:\/\/twitter.com\/colinfleming\">Twitter Colin<\/a>] [<a href=\"http:\/\/www.lispcast.com\/pre-conj-colin-fleming\">Pre-Conj Prep<\/a>] [<a href=\"http:\/\/www.lispcast.com\/pre-conj-interview-colin-fleming\">Pre-conj Interview<\/a>] [<a href=\"https:\/\/github.com\/cmf?tab=repositories\">Github<\/a>]<br \/>\n<a href=\"http:\/\/clojure-conj.org\/speakers#colin-fleming\">Colin Fleming<\/a> is a charming New Zealander who has picked up the old La Clojure plugin for IntelliJ and is busy turning it into a commercial-grade product.<\/p>\n<p>Colin touched on a lot of developer-expectations that go with Clojure entering the mainstream. Most mainstream developers do expect context-sensitive, ast-aware tooling. The broader theme was an &#8216;IDEs vs Editors&#8217;.<\/p>\n<p>What was fun about this talk was the ribbing he gave Emacs. (Which Bozhidar very humorously returned later in the day.) The theme of this was mainly around it being a &#8216;text-only&#8217; tool.<\/p>\n<p>He also made a comment on people&#8217;s critique of Intellij, saying they could type faster in emacs. His response to that was <a href=\"https:\/\/twitter.com\/zaneshelby\/status\/535474791265083392\">&#8216;lack of typing is a feature not a bug&#8217;<\/a>.<\/p>\n<p><a href=\"https:\/\/twitter.com\/zaneshelby\/status\/535474791265083392\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-701\" src=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Colin-Fleming-Cursive-Typing1-1024x194.png\" alt=\"Colin Fleming Cursive Typing\" width=\"604\" height=\"114\" srcset=\"https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Colin-Fleming-Cursive-Typing1-1024x194.png 1024w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Colin-Fleming-Cursive-Typing1-300x56.png 300w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Colin-Fleming-Cursive-Typing1-900x170.png 900w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Colin-Fleming-Cursive-Typing1.png 1348w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><\/p>\n<p>He touched on the infrastructure of Intellij &#8211; providing a large index in which you can feed in the program elements and AST. This menas you can discriminate based on fully-qualified symbol &#8211; for searches and suggestions. You want to be able to do a &#8216;find usages&#8217; and do a &#8216;smart find and rename&#8217; [not text based].<\/p>\n<p>He did some refactorings to demonstrate the tool that got the crowd excited. I saw the people around me kicking back in their chairs and banging their fists with excitement.<\/p>\n<p><img decoding=\"async\" style=\"width: 40%; max-width: 75px; border-radius: 50%;\" src=\"https:\/\/pbs.twimg.com\/profile_images\/2185073866\/SteveMiner_400x400.jpg\" alt=\"photo SM\" \/><strong>Generating Generators<\/strong> [<a href=\"https:\/\/www.youtube.com\/watch?v=4JGu33WF0Us\">Video<\/a>] [<a href=\"https:\/\/speakerdeck.com\/miner\/generating-generators\">Slides<\/a>] [<a href=\"https:\/\/twitter.com\/miner\">Twitter<\/a>] [<a href=\"https:\/\/fnclojure.wordpress.com\/\">Blog<\/a>] [<a href=\"http:\/\/www.lispcast.com\/pre-conj-steve-miner\">Pre-Conj Prep<\/a>] [<a href=\"http:\/\/www.lispcast.com\/pre-conj-interview-steve-miner\">Pre-conj Interview<\/a>] [<a href=\"https:\/\/github.com\/miner\">Github<\/a>]<br \/>\n<a href=\"http:\/\/clojure-conj.org\/speakers#steve-miner\">Steve Miner<\/a> gave a great introduction to using test.check in Clojure and how you set up generators to work on it. His big idea was that the libraries around this could be better &#8211; and so he has built the <a href=\"https:\/\/github.com\/miner\/herbert\">Herbert<\/a> library.\u00a0This makes generating parameters (eg that match regex filters) easier<\/p>\n<p><a href=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Steve-Miner-Monad.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-703\" src=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Steve-Miner-Monad-1024x225.png\" alt=\"Steve Miner Monad\" width=\"604\" height=\"132\" srcset=\"https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Steve-Miner-Monad-1024x225.png 1024w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Steve-Miner-Monad-300x65.png 300w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Steve-Miner-Monad-900x197.png 900w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Steve-Miner-Monad.png 1328w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><\/p>\n<p class=\"p1\">One of the great things about this talk was the warm-up on generators for Ashton&#8217;s talk on Saturday. Steve mentioned there were plenty of opportunities for performance improvement. One trap to stay away from was trying to co-join to regexes, as this was unlikely to succeed in the current implement.\u00a0Steve was entertaining, the star-trek theme was fun, \u00a0and he is just a great guy to talk to.<\/p>\n<p><img decoding=\"async\" style=\"width: 40%; max-width: 75px; border-radius: 50%;\" src=\"https:\/\/avatars2.githubusercontent.com\/u\/829803?v=3&amp;s=460\" alt=\"photo GS\" \/><strong>JVM Creature Comforts<\/strong><br \/>\n[Video] [<a href=\"https:\/\/twitter.com\/smashthepast\">Twitter<\/a>] [<a href=\"http:\/\/www.lispcast.com\/pre-conj-ghadi-shayban\">Pre-Conj Prep<\/a>] [<a href=\"https:\/\/github.com\/ghadishayban\">Github<\/a>]<br \/>\n<a href=\"http:\/\/clojure-conj.org\/speakers#ghadi-shayban\">Ghadi Shayban<\/a>\u00a0got an\u00a0intro from Stuart Sierra, &#8220;Ghadi is also a classical pianist&#8230; which is what I guess you need these days to use emacs&#8230;&#8221;. (bah-bom tish). [Laughter and boos from the crowd.] Stuart&#8217;s acerbic sense of humour cracks me up. (I think this got edited out of the youtube clip.)<\/p>\n<p class=\"p1\"><span class=\"s1\">Ghadhi spent a fair bit of time on language internals &#8211; including relating development with invokedynamic on Clojure to what had already been done on the Nashorn JavaScript engine for the JVM.\u00a0<\/span><\/p>\n<p class=\"p1\"><a href=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Ghadi-Shayban.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-707\" src=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Ghadi-Shayban-1024x169.png\" alt=\"Ghadi Shayban\" width=\"604\" height=\"99\" srcset=\"https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Ghadi-Shayban-1024x169.png 1024w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Ghadi-Shayban-300x49.png 300w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Ghadi-Shayban-900x149.png 900w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Ghadi-Shayban.png 1362w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><\/p>\n<p class=\"p1\"><span class=\"s1\">Ghadi also talked about the Graal and Truffle projects. (Graal is a general performance project to improve the performance of the JVM relative to Native Code &#8211; basically the hotspot infrastructure has been moved from C++ to Java. Truffle is a language framework on top of Graal that handles the AST). To prove the power of Truffle someone had implemented C in Truffle (<a href=\"http:\/\/www.ssw.jku.at\/Research\/Papers\/Grimmer13Master\/Grimmer13Master.pdf\">TruffleC<\/a>).\u00a0<\/span><\/p>\n<p class=\"p1\"><span class=\"s1\">Ghadi finished up by saying that he could see some potential improvements with local vars (and the invokedynamic framework). He was hoping for optimisation with control flow, object manipulation, value manipulation, invocation, stack traversal.\u00a0<\/span><\/p>\n<p><img decoding=\"async\" style=\"width: 40%; max-width: 75px; border-radius: 50%;\" src=\"https:\/\/en.gravatar.com\/userimage\/3888627\/f4bd1894fe135c1df2adba8e10eaec97.png?size=400\" alt=\"photo BB\" \/><strong>The evolution of the Emacs tooling for Clojure<\/strong> [<a href=\"https:\/\/www.youtube.com\/watch?v=4X-1fJm25Ww\">Video<\/a>] [<a href=\"https:\/\/speakerdeck.com\/bbatsov\/the-evolution-of-the-clojure-tooling-for-emacs\">Slides<\/a>] [<a href=\"https:\/\/twitter.com\/bbatsov\">Twitter<\/a>] [<a href=\"http:\/\/batsov.com\/\">Blog<\/a>] [<a href=\"http:\/\/www.lispcast.com\/pre-conj-bozhidar-batsov\">Pre-Conj Prep<\/a>] [<a href=\"http:\/\/www.lispcast.com\/pre-conj-interview-bozhidar-batsov\">Pre-conj interview<\/a>] [<a href=\"https:\/\/github.com\/bbatsov\">Github<\/a>]<br \/>\n<a href=\"http:\/\/clojure-conj.org\/speakers#bozhidar-batsov\">Bozhidar Batsov<\/a>\u00a0is an effervescent guy all the way from Bulgaria. I got to meet him the day before at the Scheme workshop &#8211; it seemed we had both flown roughly the same number of hours to be there (about 20 hours in transit).<\/p>\n<p>He continued his charm on stage, with\u00a0a very confident, polished and witty delivery. (The photo of him here is terrible). He introduced himself as &#8220;a night in the order of emacs&#8221;. He then proceeded to gentle return the &#8220;editor ribbing&#8221; given to him by Colin earlier in the day. (I saw them having breakfast together in the hotel, exchanging ideas the morning after &#8211; it was all good fun).<\/p>\n<p><a href=\"https:\/\/twitter.com\/matthiasnehlsen\/status\/535531249071575040\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-710\" src=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Bozhidar-1024x588.png\" alt=\"Bozhidar\" width=\"604\" height=\"346\" srcset=\"https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Bozhidar-1024x588.png 1024w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Bozhidar-300x172.png 300w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Bozhidar-900x516.png 900w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Bozhidar.png 1344w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><\/p>\n<p>Bozhidar started with a discussion of the history of emacs and Clojure, and all the plugins people had written over the years. He also talked a little about the State of Clojure Survey, saying that Cider had gone from 48% to 42% usage, but was still dominant.<\/p>\n<p>One the most interesting points\u00a0Bozhidar stated, &#8220;In 30 years, no one will have heard of Cursive, but they will still be using Emacs.&#8221;<\/p>\n<p><img decoding=\"async\" style=\"width: 40%; max-width: 75px; border-radius: 50%;\" src=\"https:\/\/lh6.googleusercontent.com\/-pIxL5m_2gMI\/UIVk00RRc9I\/AAAAAAAAFz8\/74dtK09RMF4\/w139-h140-p\/DSC_0550.JPG\" alt=\"photo SY\" \/><strong>Developing Music Systems on the JVM with Pink and Score<\/strong>[<a href=\"https:\/\/www.youtube.com\/watch?v=wDcN7yoZ6tQ\">Video<\/a>] [<a href=\"http:\/\/www.kunstmusik.com\/pink_and_score.pdf\">Slides<\/a>] [<a href=\"https:\/\/twitter.com\/kunstmusik\">Twitter<\/a>] [<a href=\"http:\/\/kunstmusik.com\/\">Blog<\/a>] [<a href=\"http:\/\/www.lispcast.com\/pre-conj-steven-yi\">Pre-Conj Prep<\/a>][<a href=\"http:\/\/www.lispcast.com\/pre-conj-interview-steven-yi\">Pre-Conj Interview<\/a>] [<a href=\"https:\/\/github.com\/kunstmusik\">Github<\/a>]<br \/>\n<a href=\"http:\/\/clojure-conj.org\/speakers#steven-yi\">Steven Yi<\/a>\u00a0is a musician and Phd student. His talk revolved around music theory and its computational implementation. You may be familiar with other Lisp-like music systems like Sam Aaron&#8217;s work on <a href=\"http:\/\/overtone.github.io\/\">Overtone<\/a>,\u00a0\u00a0or Andrew Sorenson&#8217;s work on <a href=\"https:\/\/github.com\/digego\/extempore\">Extempore<\/a>. As you may be aware, Overtone runs on a system called <a href=\"http:\/\/supercollider.sourceforge.net\/\">SuperCollider<\/a> (which does music generation from the algorithmic instruction from Overtone). I believe (although I could be wrong) that Extempore uses SuperCollider as well.<\/p>\n<p>Steven&#8217;s talk was more fundamental than these, rather than focus on algorithmic coordination of music, his focus was on the generation of the music (ie replacing SuperCollider). Steven was implementing a library called <a href=\"http:\/\/blue.kunstmusik.com\/\">Blue<\/a>\u00a0which runs on <a href=\"http:\/\/en.wikipedia.org\/wiki\/Csound\">CSound<\/a> to do this.<\/p>\n<p>Steven made the point \u00a0that digital audio is a sequence of numbers, where time and space are linked. Steven is a great guy to talk to.<\/p>\n<p><img decoding=\"async\" style=\"width: 40%; max-width: 75px; border-radius: 50%;\" src=\"http:\/\/clojure-conj.org\/images\/speakers\/rich-hickey-a45623e3.jpg\" alt=\"photo RH\" \/><strong>Inside Transducers <\/strong><br \/>\n[<a href=\"https:\/\/www.youtube.com\/watch?v=4KqUvG8HPYo\">Video<\/a>] [<a href=\"https:\/\/twitter.com\/richhickey\">Twitter<\/a>] [<a href=\"http:\/\/www.lispcast.com\/pre-conj-rich-hickey\">Pre-Conj Prep<\/a>] [<a href=\"https:\/\/github.com\/richhickey\">Github<\/a>]<br \/>\n<a href=\"http:\/\/clojure-conj.org\/speakers#rich-hickey\">Rich Hickey<\/a>\u00a0was the reason that most people I spoke to came to the conference. He is an extraordinary speaker who speaks with a casual authority, and who for a lot of people changed the way they think about computing problems.<\/p>\n<p>Rich Hickey started off with a heartfelt thanks to his wife who was in the audience, who had been there for him all the time he had invested in Clojure. I found it special because it touched on the tension that is often felt with hobby projects and family.<\/p>\n<p><a href=\"https:\/\/twitter.com\/jonsmock\/status\/536973160928010240\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-713\" src=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Hickey1-1024x194.png\" alt=\"Hickey1\" width=\"604\" height=\"114\" srcset=\"https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Hickey1-1024x194.png 1024w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Hickey1-300x56.png 300w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Hickey1-900x170.png 900w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Hickey1.png 1372w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><\/p>\n<p>Rich has made popular the study of Etymology amongst Clojurians &#8211; and this was no exception. He took the time to review the latin origins of the word-components of\u00a0transducers.<\/p>\n<p><a href=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Hickey2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-715\" src=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Hickey2-1024x633.png\" alt=\"Hickey2\" width=\"604\" height=\"373\" srcset=\"https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Hickey2-1024x633.png 1024w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Hickey2-300x185.png 300w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Hickey2-900x557.png 900w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Hickey2.png 1344w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><\/p>\n<p>This talk went deeper into stateful transducers. It also felt like Rich alluded to some blog posts by <a href=\"http:\/\/blog.podsnap.com\/ducers2.html\">Peter Frankel<\/a> and <a href=\"http:\/\/clj-me.cgrand.net\/2014\/10\/08\/these-arent-the-reducing-functions-you-are-looking-for\/\">Christophe<\/a> <a href=\"http:\/\/clj-me.cgrand.net\/2014\/09\/11\/the-rules-of-transducer-club\/\">Grande<\/a>.<\/p>\n<p>Rich mentioned future projects in the transducer pipeline (under consideration): parallel transducers, supportive implementation macros, primitives, multi-arity, kv transduce, functional stateful transducers. He also talked about future work into core.async.<\/p>\n<p><a href=\"https:\/\/twitter.com\/SrihariSriraman\/status\/535839468478267392\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-716\" src=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/hickey3-1024x185.png\" alt=\"hickey3\" width=\"604\" height=\"109\" srcset=\"https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/hickey3-1024x185.png 1024w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/hickey3-300x54.png 300w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/hickey3-900x163.png 900w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/hickey3.png 1368w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><\/p>\n<p>This one is a definite must-watch (but you&#8217;ve already figured that out).<\/p>\n<p><em><strong>Day 2<\/strong><\/em><\/p>\n<p><img decoding=\"async\" style=\"width: 40%; max-width: 75px; border-radius: 50%;\" src=\"https:\/\/en.gravatar.com\/userimage\/45887105\/1f99d9959c799276cc707e30bc85fdf4.jpg?size=400\" alt=\"photo NH\" \/><img decoding=\"async\" style=\"width: 40%; max-width: 75px; border-radius: 50%;\" src=\"https:\/\/dxjdq26o3e6ag.cloudfront.net\/assets\/headshots\/shea-99b30ff181f01ef8ab0ed30d4b9f721d.jpg\" alt=\"photo CS\" \/><strong>Helping voters with Pedestal, Datomic, Om and core.async <\/strong> [<a href=\"https:\/\/www.youtube.com\/watch?v=Ohuadp9S2hg\">Video<\/a>] [<a href=\"http:\/\/www.lispcast.com\/pre-conj-nathan-herzing-chris-shea\">Pre-Conj Prep<\/a>] [<a href=\"https:\/\/github.com\/nherzing\">Github NH<\/a>] [<a href=\"https:\/\/github.com\/tie-rack\/helping-voters-conj-2014\">Github CS<\/a>]<br \/>\n<a href=\"http:\/\/clojure-conj.org\/speakers#nathan-herzing\">Nathan Herzing<\/a> &amp; <a href=\"http:\/\/clojure-conj.org\/speakers#chris-shea\">Chris Shea<\/a>\u00a0opened day 2 with a killer demonstration of live-coding in Clojure with Datomic and Om.<\/p>\n<p>Their talk was about building tools to update voters about their mail-in ballots at Turbovote. There was some stuff in here about integrating with legacy systems that matched my own experiences.<\/p>\n<p>This is worth it alone for the inspiration it will give you to get better at your tooling (and perhaps live-coding) skills.<\/p>\n<p><img decoding=\"async\" style=\"width: 40%; max-width: 75px; border-radius: 50%;\" src=\"http:\/\/clojure-conj.org\/images\/speakers\/michalmarczyk-2afc120a.jpg\" alt=\"photo MM\" \/><strong>Persistent Data Structures for Special Occasions <\/strong><br \/>\n[<a href=\"https:\/\/www.youtube.com\/watch?v=Z_iLjL0mc4I\">Video<\/a>] [<a href=\"http:\/\/www.lispcast.com\/pre-conj-michal-marczyk\">Pre-Conj Prep<\/a>] [<a href=\"https:\/\/github.com\/michalmarczyk\">Github<\/a>]<br \/>\n<a href=\"http:\/\/clojure-conj.org\/speakers#micha\u0142-marczyk\">Micha\u0142 Marczyk<\/a>\u00a0was introduced as having been specially selected by Rich Hickey. He dropped into the detail of data structure implementation and talked about the benefits of <a href=\"https:\/\/github.com\/michalmarczyk\/flexvec\">FlexVec<\/a>, an improvement on Clojure&#8217;s vectors. He then explained in detail why in many cases they perform better.<\/p>\n<p>This was one of the most dense talks in the whole Conj. Good for a brain-stretch.<\/p>\n<p><img decoding=\"async\" style=\"width: 40%; max-width: 75px; border-radius: 50%;\" src=\"http:\/\/juliangamble.com\/images\/JulianPortrait.jpg\" alt=\"photo JG\" \/><strong>Applying the paradigms of core.async in ClojureScript<\/strong><br \/>\n[<a href=\"https:\/\/www.youtube.com\/watch?v=JUrOebC5HmA\">Video<\/a>] [<a href=\"http:\/\/www.slideshare.net\/juliangamble\/clojure-conj-2014-paradigms-of-coreasync-julian-gamble\">Slides<\/a>] [<a href=\"https:\/\/twitter.com\/juliansgamble\">Twitter<\/a>] [<a href=\"http:\/\/juliangamble.com\/blog\/\">Blog<\/a>] [<a href=\"http:\/\/www.lispcast.com\/pre-conj-julian-gamble\">Pre-Conj Prep<\/a>] [<a href=\"http:\/\/www.lispcast.com\/pre-conj-interview-julian-gamble\">Pre-Conj Interview<\/a>] [<a href=\"https:\/\/github.com\/juliangamble\/clojure-conj-2014-paradigms-of-core-async\">Github<\/a>]<br \/>\n<a href=\"http:\/\/clojure-conj.org\/speakers#julian-gamble\">Julian Gamble<\/a>\u00a0is the guy writing this post! I talked about core.async syntax and green threads in Clojure and ClojureScript with some visual demos. I&#8217;m just going to include some things other people said.<\/p>\n<p><a href=\"https:\/\/twitter.com\/jffry\/status\/535826953769844737\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-721\" src=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/julian2-1024x648.png\" alt=\"julian2\" width=\"604\" height=\"382\" srcset=\"https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/julian2-1024x648.png 1024w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/julian2-300x189.png 300w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/julian2-900x569.png 900w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/julian2.png 1352w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><\/p>\n<p>Eric Normand also <a href=\"http:\/\/us4.campaign-archive2.com\/?u=a33b5228d1b5bf2e0c68a83f4&amp;id=a358c38217&amp;e=8591a07020\">had some interesting commentary<\/a>. (Eric is a friend &#8211; and so this is well-taken). I found this feedback really freeing &#8211; and will allow myself to level-up.<\/p>\n<p><a href=\"https:\/\/twitter.com\/yoavrubin\/status\/540771713764847616\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-722\" src=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/julian3-1024x189.png\" alt=\"julian3\" width=\"604\" height=\"111\" srcset=\"https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/julian3-1024x189.png 1024w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/julian3-300x55.png 300w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/julian3-900x166.png 900w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/julian3.png 1342w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><\/p>\n<p>I was thrilled to be a part of Clojure Conj. I learned so much from this experience, and had a blast.<\/p>\n<p><img decoding=\"async\" style=\"width: 40%; max-width: 75px; border-radius: 50%;\" src=\"http:\/\/clojure-conj.org\/images\/speakers\/jeanine-adkisson-9769aeca.jpg\" alt=\"photo JA\" \/><strong>Variants are Not Unions<\/strong><br \/>\n[<a href=\"https:\/\/www.youtube.com\/watch?v=ZQkIWWTygio\">Video<\/a>] [<a href=\"https:\/\/twitter.com\/jneen_\">Twitter<\/a>] [<a href=\"http:\/\/www.jneen.net\/\">Blog<\/a>] [<a href=\"http:\/\/www.lispcast.com\/pre-conj-jeanine-adkisson\">Pre-Conj Prep<\/a>] [<a href=\"http:\/\/www.lispcast.com\/pre-conj-interview-jeanine-adkisson\">Pre-conj Interview<\/a>] [<a href=\"https:\/\/github.com\/jneen\/variants-slides\">Github<\/a>]<br \/>\n<a href=\"http:\/\/clojure-conj.org\/speakers#jeanine-adkisson\">Jeanine Adkisson<\/a>\u00a0is this super-intelligent <a href=\"https:\/\/github.com\/jneen\/parsimmon\">compiler-writer<\/a> who is fun and opinionated. From the start this talk was delivered with animations in vim\u00a0&#8211; and it stayed information-dense from there.<\/p>\n<p><a href=\"https:\/\/twitter.com\/lbudorick\/status\/535843636320403456\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-724\" src=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/jneen1-1024x591.png\" alt=\"jneen1\" width=\"604\" height=\"348\" srcset=\"https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/jneen1-1024x591.png 1024w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/jneen1-300x173.png 300w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/jneen1-900x519.png 900w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/jneen1.png 1364w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><\/p>\n<p>There <a href=\"https:\/\/twitter.com\/AnnaPawlicka\/status\/536322278741790720\">was a dinner <\/a>with a bunch of people after and I had the chance to Jeanine about LR2 parsers and monadic parsers. She is great to talk to.<\/p>\n<p><a href=\"https:\/\/twitter.com\/__Neha\/status\/535840462612230144\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-725\" src=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/jneen2-1024x623.png\" alt=\"jneen2\" width=\"604\" height=\"367\" srcset=\"https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/jneen2-1024x623.png 1024w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/jneen2-300x182.png 300w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/jneen2-900x548.png 900w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/jneen2.png 1366w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><\/p>\n<p><img decoding=\"async\" style=\"width: 40%; max-width: 75px; border-radius: 50%;\" src=\"http:\/\/www.gravatar.com\/avatar\/002f60b6e90816a64e904b3da0dd6d5c?s=400\" alt=\"photo LC\" \/><img decoding=\"async\" style=\"width: 40%; max-width: 75px; border-radius: 50%;\" src=\"https:\/\/avatars3.githubusercontent.com\/u\/726169?v=1&amp;s=400\" alt=\"photo EW\" \/><strong>Exploring four hidden superpowers of Datomic<\/strong><br \/>\n[<a href=\"https:\/\/www.youtube.com\/watch?v=7lm3K8zVOdY\">Video<\/a>] [<a href=\"http:\/\/www.slideshare.net\/lucascavalcantisantos\/exploring-four-datomic-superpowers\">Slides<\/a>] [<a href=\"https:\/\/twitter.com\/aewible\">Twitter EW<\/a>] [<a href=\"https:\/\/twitter.com\/lucascs\">Twitter LC<\/a>] [<a href=\"http:\/\/lucas.cavalcanti.me\/\">Blog LC<\/a>] [<a href=\"http:\/\/www.lispcast.com\/pre-conj-lucas-cavalcanti-edward-wible\">Pre-Conj Prep<\/a>] [<a href=\"https:\/\/github.com\/aew?tab=repositories\">Github EW<\/a>][<a href=\"https:\/\/github.com\/lucascs\">Github LC<\/a>]<br \/>\n<a href=\"http:\/\/clojure-conj.org\/speakers#lucas-cavalcanti\">Lucas Cavalcanti<\/a> &amp; <a href=\"http:\/\/clojure-conj.org\/speakers#edward-wible\">Edward Wible<\/a>\u00a0presented on the 4 (really 9) superpowers of datomic.\u00a0You could see that Datomic has massive benefits in the financial services space.<\/p>\n<p><a href=\"https:\/\/twitter.com\/juliansgamble\/status\/535883293434970112\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-726\" src=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Weibe1-1024x634.png\" alt=\"Weibe1\" width=\"604\" height=\"373\" srcset=\"https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Weibe1-1024x634.png 1024w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Weibe1-300x185.png 300w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Weibe1-900x557.png 900w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Weibe1.png 1334w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>What was most interesting to me about this talk was Edward&#8217;s background (Princeton Computer Science, then MBA, Private Equity, then Boston Consulting). He had moved to San Paulo to be the CTO of a bank that was starting from scratch. He was writing the code\u00a0by hand with the team. He was there to promote this company and invite people to join him. What incredible vision and execution! (If I didn&#8217;t have family I was tempted to take six months to join him) This guy is one to watch.<\/p>\n<p><img decoding=\"async\" style=\"width: 40%; max-width: 75px; border-radius: 50%;\" src=\"http:\/\/oakleaf.info\/me.jpg\" alt=\"photo ZO\" \/><strong>Making Games at Runtime with Clojure<\/strong><br \/>\n[<a href=\"https:\/\/www.youtube.com\/watch?v=0GzzFeS5cMc\">Video<\/a>] [<a href=\"http:\/\/oakleaf.info\/\">Site<\/a>] [<a href=\"http:\/\/www.lispcast.com\/pre-conj-zach-oakes\">Pre-Conj Prep<\/a>] [<a href=\"https:\/\/github.com\/oakes\/clojure-conj-2014\">Github<\/a>]<br \/>\n<a href=\"http:\/\/clojure-conj.org\/speakers#zach-oakes\">Zach Oakes<\/a>\u00a0delivered one of the must-see presentations at Conj 2014.<\/p>\n<p><a href=\"https:\/\/twitter.com\/moonfaythe\/status\/536929732361596929\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-729\" src=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/oakes3-1024x185.png\" alt=\"oakes3\" width=\"604\" height=\"109\" srcset=\"https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/oakes3-1024x185.png 1024w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/oakes3-300x54.png 300w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/oakes3-900x163.png 900w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/oakes3.png 1358w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>This was the first time I had been to a conference talk that had everyone around me was laughing so hard they were crying.<\/p>\n<p><a href=\"https:\/\/twitter.com\/mj_langford\/status\/535909606103724032\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-730\" src=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/oakes11-1024x189.png\" alt=\"oakes1\" width=\"604\" height=\"111\" srcset=\"https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/oakes11-1024x189.png 1024w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/oakes11-300x55.png 300w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/oakes11-900x166.png 900w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/oakes11.png 1364w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><\/p>\n<p>Zach talked about his love for writing games, playing games, teaching programming through writing games. He took special joy in seeing how people used his library.<\/p>\n<p><a href=\"https:\/\/twitter.com\/AnnaPawlicka\/status\/535913437365534722\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-731\" src=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/oakes2-1024x630.png\" alt=\"oakes2\" width=\"604\" height=\"371\" srcset=\"https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/oakes2-1024x630.png 1024w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/oakes2-300x184.png 300w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/oakes2-900x553.png 900w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/oakes2.png 1352w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>I hope I haven&#8217;t built up your expectations too much &#8211; but this was extremely memorable.<\/p>\n<p><img decoding=\"async\" style=\"width: 40%; max-width: 75px; border-radius: 50%;\" src=\"http:\/\/clojure-conj.org\/images\/speakers\/glv-62a4a985.jpg\" alt=\"photo GV\" \/><strong>Cl\u00f3: The Algorithms of TeX in Clojure<\/strong><br \/>\n[<a href=\"https:\/\/www.youtube.com\/watch?v=824yVKUPFjU\">Video<\/a>] [<a href=\"https:\/\/twitter.com\/glv\">Twitter<\/a>] [<a href=\"http:\/\/vanderburg.org\/Blog\">Blog<\/a>] [<a href=\"http:\/\/www.lispcast.com\/pre-conj-glenn-vanderburg\">Pre-Conj Prep<\/a>] [<a href=\"https:\/\/github.com\/glv\">Github<\/a>]<br \/>\n<a href=\"http:\/\/clojure-conj.org\/speakers#glenn-vanderburg\">Glenn Vanderburg<\/a>\u00a0is an experienced presenter and it shows. Now who in the Clojure community has ever tried to scratch an itch with a hobby project?\u00a0Glenn set out to rewrite the Tex editor produced by Donald Knuth in Pascal, into Clojure.<\/p>\n<p><a href=\"https:\/\/twitter.com\/tomfaulhaber\/status\/535918011140800512\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-732\" src=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/glv-1024x193.png\" alt=\"glv\" width=\"604\" height=\"113\" srcset=\"https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/glv-1024x193.png 1024w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/glv-300x56.png 300w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/glv-900x170.png 900w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/glv.png 1344w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><\/p>\n<p>This was the premise for a journey into the tools from 30 years ago, the constraints of the systems of that time and a deep appreciation for how good things are now:<\/p>\n<p><a href=\"https:\/\/twitter.com\/juliansgamble\/status\/535927129998118913\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-734\" src=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/glv2-1024x635.png\" alt=\"glv2\" width=\"604\" height=\"374\" srcset=\"https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/glv2-1024x635.png 1024w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/glv2-300x186.png 300w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/glv2-900x558.png 900w, https:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/glv2.png 1348w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><\/p>\n<p>The conclusion of this project is interesting, both in its reflection of the miracles Knuth\u00a0worked at that time, and the power and constraints of the Clojure ecosystem. \u00a0Glenn is such good fun to watch.<\/p>\n<p><em><strong>Day 3<\/strong><\/em><\/p>\n<p><img decoding=\"async\" style=\"width: 40%; max-width: 75px; border-radius: 50%;\" src=\"https:\/\/avatars2.githubusercontent.com\/u\/31295?v=2&amp;s=400\" alt=\"photo ZT\" \/><strong>Always Be Composing<\/strong><br \/>\n[<a href=\"https:\/\/www.youtube.com\/watch?v=3oQTSP4FngY\">Video<\/a>] [<a href=\"http:\/\/twitter.com\/ztellman\">Twitter<\/a>] [<a href=\"http:\/\/ideolalia.com\/\">Blog<\/a>] [<a href=\"http:\/\/www.lispcast.com\/pre-conj-zach-tellman\">Pre-Conj Prep<\/a>] [<a href=\"https:\/\/github.com\/ztellman\">Github<\/a>]<br \/>\n<a href=\"http:\/\/clojure-conj.org\/speakers#zach-tellman\">Zach Tellman<\/a>\u00a0started his talk talking about <a href=\"http:\/\/en.wikipedia.org\/wiki\/Sierpinski_triangle\">sierpinski\u00a0triangles <\/a>and waxed lyrical from there. (Zach used to maintain a 3d library in Clojure called <a href=\"https:\/\/github.com\/ztellman\/penumbra\">Penumbra<\/a>).<\/p>\n<p>Zach touched on the truism from the start of the conference &#8220;prefer data over functions over macros&#8221;. \u00a0Zach said it was great the spectrum of options we have, but it wasn&#8217;t a perfect model. He said it was similar to when the periodic table came out, that it had some gaps, which indicated perhaps there were some other things to look for.<\/p>\n<p>Zach touched on transducers as a specific sort of composition. His concern was for people new to Clojure, that they would require a lot of foundational explanation.<\/p>\n<p>Zach then talked about regular expressions as a composition mechanism, and how it had lead him to write the <a href=\"https:\/\/github.com\/ztellman\/automat\">automat<\/a> libary. He talked about the richness of automata theory as a set of tools. He said it was quite hard to accomplish anything.<\/p>\n<p>Zach then talked about queuing with core.async and how backpressure was an emergent property. He said the causality of the problem leads to code complexity, and the only tool we had at the moment to work with this was a macro. (The Go macro). He definitely wasn&#8217;t saying it was bad. (Zach is the author of <a href=\"https:\/\/github.com\/ztellman\/lamina\">lamina<\/a> which came out before core.async and has some similarities for queuing without the green threads macro).<\/p>\n<p>Zach&#8217;s talk was driving at the catch-phrase &#8220;prefer composition over X&#8221; and talked about all the approaches and pitfalls that this entails. He said that the problem with &#8220;just composing something&#8221; is that it is inextricably tied up in what you&#8217;re trying to accomplish. He was trying to capture all the different forces at play.<\/p>\n<p>This is quite philosophical, but really worth watching.<\/p>\n<p><img decoding=\"async\" style=\"width: 40%; max-width: 75px; border-radius: 50%;\" src=\"https:\/\/www.braintreepayments.com\/assets\/team\/David_Pick.jpg\" alt=\"photo DP\" \/><strong>Building a Data Pipeline with Clojure and Kafka<\/strong><br \/>\n[<a href=\"https:\/\/www.youtube.com\/watch?v=6xlyWjqFDWs\">Video<\/a>] [<a href=\"https:\/\/twitter.com\/davidpick\">Twitter<\/a>] [<a href=\"http:\/\/dpick.github.io\/\">Blog<\/a>] [<a href=\"http:\/\/www.lispcast.com\/pre-conj-david-pick\">Pre-Conj Prep<\/a>] [<a href=\"https:\/\/github.com\/dpick\/\">Github<\/a>]<br \/>\n<a href=\"http:\/\/clojure-conj.org\/speakers#david-pick\">David Pick<\/a>\u00a0delivered a real-world experience using Clojure, \u00a0Kakfa and redshift. David wanted to keep the data warehouse in sync with his primary database, but PostgreSQL didn&#8217;t prove helpful in the approaches he tried. He needed a highly resilient system.<\/p>\n<p>The benefit of Kakfa was atomic operations, persistence and the ability to replay the steam to an external sink.<\/p>\n<p>The original web client had been written in Ruby, but they found that the clients for Kafka were JVM based, the and\u00a0concurrency operations for when Kafka blocks were useful.<\/p>\n<p>They also needed a specialised way to shut the infrastructure down and step through each part. Actors turned out to be a good fit for this, and kept the same semantics that goroutines held for them. Actors also helped avoid race conditions. These semantics were provided by <a href=\"https:\/\/github.com\/puniverse\/pulsar\">pulsar\/quasar<\/a>.<\/p>\n<p>The other thing he liked about Kakfa was that the data scientists could integrate into it directly for real-time fraud monitoring. They also use it for web-hooks to send async events, and report generation (some massive reports) which can happen in real-time.<\/p>\n<p><img decoding=\"async\" style=\"width: 40%; max-width: 75px; border-radius: 50%;\" src=\"https:\/\/avatars1.githubusercontent.com\/u\/199201?v=3&amp;s=460\" alt=\"photo AK\" \/><strong>Generative Integration Tests<\/strong><br \/>\n[<a href=\"https:\/\/www.youtube.com\/watch?v=HXGpBrmR70U\">Video<\/a>] [<a href=\"https:\/\/twitter.com\/ashton\">Twitter<\/a>] [<a href=\"http:\/\/ashtonkemerling.com\/\">Blog<\/a>] [<a href=\"http:\/\/www.lispcast.com\/pre-conj-ashton-kemerling\">Pre-Conj Prep<\/a>] [<a href=\"https:\/\/github.com\/AshtonKem\/Conj-Talk\">Github<\/a>]<br \/>\n<a href=\"http:\/\/clojure-conj.org\/speakers#ashton-kemerling\">Ashton Kemerling<\/a>\u00a0explained his &#8216;real-world&#8217; experiences using generative testing. \u00a0Building on Steve&#8217;s explanation of Generative testing to describe the shape of the data and run multiple cases, he talked about how he would let the machine hammer the possibilities and find the edge-cases. He was using Selenium to hammer a website, which even he was \u00a0a <a href=\"https:\/\/twitter.com\/benizi\/status\/536186747932385280\">a bit surprised about<\/a>.<\/p>\n<p>The main downside was that duration is complicated, you can&#8217;t tell how long it was going to take to run. The benefit was that in finding a failure scenario that others described with 10 steps, he could narrow it down to 2 steps. He also said it was good for missed errors.<\/p>\n<p>His technique involved getting a snapshot of database state into memory, and then load it each time the browser is loaded, with a browser cache flush.<\/p>\n<p>This was quite an inspiring talk, and convinced me that test.check is ready for real-world usage.<\/p>\n<p><img decoding=\"async\" style=\"width: 40%; max-width: 75px; border-radius: 50%;\" src=\"http:\/\/clojure-conj.org\/images\/speakers\/brian-g-729b1eb1.jpg\" alt=\"photo BG\" \/><strong>Stewardship: the Sobering Parts<\/strong><br \/>\n[<a href=\"https:\/\/www.youtube.com\/watch?v=2y5Pv4yN0b0\">Video<\/a>] [<a href=\"https:\/\/twitter.com\/briangoetz\">Twitter<\/a>] [<a href=\"http:\/\/briangoetz.blogspot.com\/\">Blog<\/a>] [<a href=\"http:\/\/www.lispcast.com\/pre-conj-brian-goetz\">Pre-Conj Prep<\/a>]<br \/>\n<a href=\"http:\/\/clojure-conj.org\/speakers#brian-goetz\">Brian Goetz<\/a> delivers one of the must-watch talks for the conference. You can see that Brian has attended a conference or two in his lifetime and he is a very experienced speaker. Some have said this was a <a href=\"https:\/\/twitter.com\/apiology\/status\/536206405720887297\">celebration<\/a> for Brian:<br \/>\n<a href=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Brian-Goetz-victory.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-655\" src=\"http:\/\/juliangamble.com\/blog\/wp-content\/uploads\/2014\/12\/Brian-Goetz-victory.png\" alt=\"Brian Goetz victory\" width=\"400\" height=\"100\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>His premise was that he was a language designer, and seeing COBOL jump the shark with the addition of the alter command, he was kept up at night worrying about that happening to Java.<\/p>\n<p>Brian took the time to touch on Clojure cliches like etymology and ponies, and clearly had a fun time doing it.<\/p>\n<p>Brian talked about <a href=\"http:\/\/en.wikipedia.org\/wiki\/Project_Valhalla_(Java_language)\">project Valhalla<\/a>, which is a set of performance improvements in Java 10 for specialised generics, value types and var handles. Brian also talked about <a href=\"http:\/\/openjdk.java.net\/projects\/panama\/\">Project Panama<\/a>, (which may come into Java 9) which is bringing ffi, data layout control and autolayout.<\/p>\n<p>This is a must-watch.<\/p>\n<p><strong>Must-Watch Videos<\/strong><br \/>\nThese are the ones that stuck out in my mind:<\/p>\n<ul>\n<li>Rich Hickey &#8211; <a href=\"https:\/\/www.youtube.com\/watch?v=4KqUvG8HPYo\">Inside Transducers<\/a><\/li>\n<li>Zach Tellman &#8211; <a href=\"https:\/\/www.youtube.com\/watch?v=3oQTSP4FngY\">Always Be Composing<\/a><\/li>\n<li>Glenn Vanderburg &#8211; <a href=\"https:\/\/www.youtube.com\/watch?v=824yVKUPFjU\">Cl\u00f3: The Algorithms of TeX in Clojure<\/a><\/li>\n<li>Brian Goetz &#8211; <a href=\"https:\/\/www.youtube.com\/watch?v=2y5Pv4yN0b0\">Stewardship &#8211; The Sobering Parts<\/a><\/li>\n<li>Zach Oakes &#8211; <a href=\"https:\/\/www.youtube.com\/watch?v=0GzzFeS5cMc\">Making Games at Runtime with Clojure<\/a><\/li>\n<\/ul>\n<p>(I&#8217;d really appreciate it if you <a href=\"https:\/\/www.youtube.com\/watch?v=JUrOebC5HmA\">watched mine <\/a> &#8211; but totally understand if you don&#8217;t have time).<\/p>\n<p><strong>Personal Reflections<\/strong><br \/>\nAlmost none of the big names from the Clojure Community bar Rich were on the stage. This seemed strange at first, until I realised it was about community-building. In speaking to people, they were coming from their local Clojure meetups and seeing the most-polished, most-entertaining, most-insightful presentations from across the country and the world. Most of those presentations (and speakers) had been polished with the involvement of their local group. This was a celebration of all the little Clojure communities coming together.<\/p>\n<p>This year Clojure moved in the <a href=\"http:\/\/www.thoughtworks.com\/radar\/languages-and-frameworks\/clojure\">&#8216;adopt&#8217; sphere of the Thoughtworks Radar<\/a>. Some have <a href=\"https:\/\/twitter.com\/thattommyhall\/status\/504531209339539456\">commented jokingly on what this really means<\/a>. I do remember reading that the original Conj was an intimate group of less than 100 people. Now with 500 people, and half of them new to the Clojure Conj, in a sense it felt like the Clojure community has come of age. In some ways I feel a sense of loss, that this edgy small community is changing into something different. On the other hand it&#8217;s quite exciting to think what will happen if we can pull ourselves together and solve big problems in software development.<\/p>\n<p>(Did I mention I&#8217;m also writing a <a href=\"http:\/\/clojurerecipes.net\/\">book called Clojure Recipes<\/a>?) \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction These are my reflections on the talks. I&#8217;m trying to be open-minded and take a balanced view of the positive and negative opinions that were exchanged. If that&#8217;s not your thing then this probably isn&#8217;t for you. The Venue &hellip; <a href=\"https:\/\/juliangamble.com\/blog\/2014\/12\/15\/reflections-on-clojure-conj-2014\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[3,15],"tags":[],"class_list":["post-634","post","type-post","status-publish","format-standard","hentry","category-clojure","category-datomic"],"_links":{"self":[{"href":"https:\/\/juliangamble.com\/blog\/wp-json\/wp\/v2\/posts\/634","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/juliangamble.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/juliangamble.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/juliangamble.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/juliangamble.com\/blog\/wp-json\/wp\/v2\/comments?post=634"}],"version-history":[{"count":86,"href":"https:\/\/juliangamble.com\/blog\/wp-json\/wp\/v2\/posts\/634\/revisions"}],"predecessor-version":[{"id":749,"href":"https:\/\/juliangamble.com\/blog\/wp-json\/wp\/v2\/posts\/634\/revisions\/749"}],"wp:attachment":[{"href":"https:\/\/juliangamble.com\/blog\/wp-json\/wp\/v2\/media?parent=634"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/juliangamble.com\/blog\/wp-json\/wp\/v2\/categories?post=634"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/juliangamble.com\/blog\/wp-json\/wp\/v2\/tags?post=634"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}