<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Running With Rails</title>
	<atom:link href="http://runningwithrails.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://runningwithrails.com</link>
	<description>Programming, and all that goes with it</description>
	<lastBuildDate>Tue, 14 May 2013 00:06:42 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5</generator>
		<item>
		<title>GopherCon 2014!</title>
		<link>http://runningwithrails.com/2013/05/gophercon-2014/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=gophercon-2014</link>
		<comments>http://runningwithrails.com/2013/05/gophercon-2014/#comments</comments>
		<pubDate>Mon, 13 May 2013 23:31:36 +0000</pubDate>
		<dc:creator>Michael Blake</dc:creator>
				<category><![CDATA[Google Go]]></category>

		<guid isPermaLink="false">http://runningwithrails.com/?p=360</guid>
		<description><![CDATA[So lately I haven&#8217;t been doing much rails, which has lead to a distinct silence on this site as far as new developments go. The truth is, my career has changed a bit and I find myself more and more in the world of Google&#8217;s Go. Golang has treated me well, and I suppose I ]]></description>
				<content:encoded><![CDATA[<p>So lately I haven&#8217;t been doing much rails, which has lead to a distinct silence on this site as far as new developments go. The truth is, my career has changed a bit and I find myself more and more in the world of Google&#8217;s Go. Golang has treated me well, and I suppose I should get around to posting updates to share some of that excitement here. Until then though, a little announcement.</p>
<p>Along with the release of Go 1.1 an official announcement went out today from the organizers of the first-ever GopherCon, a convention in Denver Colorado for those who work with, play with, and love Go. I know I&#8217;ll be there and I look forward to seeing a lot of great talks. More information can be found at <a href="http://www.gophercon.com/" title="GopherCon">GopherCon</a> or by following @GopherCon on Twitter!</p>
]]></content:encoded>
			<wfw:commentRss>http://runningwithrails.com/2013/05/gophercon-2014/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Writing views in Noir with Clojure</title>
		<link>http://runningwithrails.com/2012/10/writing-views-in-noir-with-clojure/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=writing-views-in-noir-with-clojure</link>
		<comments>http://runningwithrails.com/2012/10/writing-views-in-noir-with-clojure/#comments</comments>
		<pubDate>Tue, 02 Oct 2012 05:59:39 +0000</pubDate>
		<dc:creator>Michael Blake</dc:creator>
				<category><![CDATA[Clojure]]></category>

		<guid isPermaLink="false">http://runningwithrails.com/?p=335</guid>
		<description><![CDATA[I&#8217;ve been busily looking at the options, getting a feel for templating languages, scrapers and all around view generation in Noir. There are a lot of options out there, including everything Java ever did along with a series of clojure specific plugins and concepts. So the conclusion? Slim for Clojure wins out for me by a wide ]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve been busily looking at the options, getting a feel for templating languages, scrapers and all around view generation in Noir. There are a lot of options out there, including everything Java ever did along with a series of clojure specific plugins and concepts.</p>
<p>So the conclusion?</p>
<p><strong><a title="https://github.com/chaslemley/slim.clj" href="https://github.com/chaslemley/slim.clj">Slim </a></strong><a title="https://github.com/chaslemley/slim.clj" href="https://github.com/chaslemley/slim.clj"></a>for Clojure wins out for me by a wide margin. Slim is similar to Haml in its syntax, white space sensitive and generally easy to read, while adding a few nice features and eliminating a few more characters from your HTML generation.</p>
<p>What does it look like? A little like this:</p>
<blockquote><pre>
div
  ul
    li
      p Hello World</pre>
</blockquote>
<p>The Clojure implementation of Slim is developed by Chas Lemley, a Ruby software developer in the Atlanta area.</p>
<p><em>*Disclaimer: I have worked with both Andy Stone, the creator of Slim and Chas Lemley. Some bias may apply.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://runningwithrails.com/2012/10/writing-views-in-noir-with-clojure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>All is quiet on the western front</title>
		<link>http://runningwithrails.com/2012/09/all-is-quiet-on-the-western-front/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=all-is-quiet-on-the-western-front</link>
		<comments>http://runningwithrails.com/2012/09/all-is-quiet-on-the-western-front/#comments</comments>
		<pubDate>Fri, 21 Sep 2012 02:16:39 +0000</pubDate>
		<dc:creator>Michael Blake</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://runningwithrails.com/?p=328</guid>
		<description><![CDATA[Missed a few updates, well, maybe more than just a few. I have a few projects in the work, and, much to my excitement, a podcast in the works with another very talented software engineer. We&#8217;ll start recording this weekend and see how it goes, I&#8217;ll update as news unfolds]]></description>
				<content:encoded><![CDATA[<p>Missed a few updates, well, maybe more than just a few. I have a few projects in the work, and, much to my excitement, a podcast in the works with another very talented software engineer.  We&#8217;ll start recording this weekend and see how it goes, I&#8217;ll update as news unfolds.</p>
]]></content:encoded>
			<wfw:commentRss>http://runningwithrails.com/2012/09/all-is-quiet-on-the-western-front/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting the unmodified post body with Noir</title>
		<link>http://runningwithrails.com/2012/09/getting-the-unmodified-post-body-with-noir/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=getting-the-unmodified-post-body-with-noir</link>
		<comments>http://runningwithrails.com/2012/09/getting-the-unmodified-post-body-with-noir/#comments</comments>
		<pubDate>Mon, 17 Sep 2012 08:58:05 +0000</pubDate>
		<dc:creator>Michael Blake</dc:creator>
				<category><![CDATA[Clojure]]></category>

		<guid isPermaLink="false">http://runningwithrails.com/?p=330</guid>
		<description><![CDATA[Just a quick little post today about something that was more frustrating than you&#8217;d expect to google. Basically all I wanted was to get the entire post body without any modifications to it in any way, shape or form by any form of middle ware. Sounds simple, and really it was very simple, once I ]]></description>
				<content:encoded><![CDATA[<p>Just a quick little post today about something that was more frustrating than you&#8217;d expect to google. Basically all I wanted was to get the entire post body without any modifications to it in any way, shape or form by any form of middle ware.</p>
<p>Sounds simple, and really it was very simple, once I found a random Google Groups post talking about it.</p>
<p>First thing is first, add this line to your view</p>
<blockquote><p>(:require [noir.request :as request])</p></blockquote>
<p>Then access the body within your defpage with the following code:</p>
<blockquote><p>(let [request (request/ring-request)<br />
body (slurp(:body request))]<br />
(println body)<br />
)</p></blockquote>
<p>And there you go. The quick, easy, no noise to fight through explanation of how to get the entire post body in WebNoir.</p>
]]></content:encoded>
			<wfw:commentRss>http://runningwithrails.com/2012/09/getting-the-unmodified-post-body-with-noir/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Considering major projects</title>
		<link>http://runningwithrails.com/2012/09/considering-major-projects/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=considering-major-projects</link>
		<comments>http://runningwithrails.com/2012/09/considering-major-projects/#comments</comments>
		<pubDate>Thu, 13 Sep 2012 03:27:33 +0000</pubDate>
		<dc:creator>Michael Blake</dc:creator>
				<category><![CDATA[Clojure]]></category>

		<guid isPermaLink="false">http://runningwithrails.com/?p=325</guid>
		<description><![CDATA[I&#8217;ve got a couple of big projects on my mind right now, and I&#8217;m curious about what the general feel is out there about some of the open source options I&#8217;m considering, so I thought I&#8217;d rattle them off and see if anyone had any thoughts. #1 WordPress-like Clojure CMS This project would be massive ]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve got a couple of big projects on my mind right now, and I&#8217;m curious about what the general feel is out there about some of the open source options I&#8217;m considering, so I thought I&#8217;d rattle them off and see if anyone had any thoughts.</p>
<p><strong>#1 WordPress-like Clojure CMS</strong></p>
<p>This project would be massive and I&#8217;d need to build up a strong community around it, but the idea is to take clj-blog and integrate it with more of a full-purpose-cms. This project would probably be based in Noir, use Korma and generally stick to the things I&#8217;ve already decided I&#8217;m comfortable with.</p>
<p><strong>#2 Clojure migrations</strong></p>
<p>This one should be pretty obvious to anyone used to the ActiveRecord style migrations. There is something to say about having all of that in a runnable little script.</p>
<p><strong>#3 A generator library for Noir</strong></p>
<p><strong></strong>Noir adopts a sinatra-style &#8220;Do what you feel like doing&#8221; attitude for the structure. I&#8217;ve been thinking about rolling up a lein plugin that would generate more opinionated Noir projects (probably including Korma by default, setting up an MVC style structure and integrating the Clojure Migrations project mentioned above). This is another big project, and one that would really use Noir as a base for a much more complex framework. I&#8217;m torn on this because while it IS nice to have everything in one place, rails has been getting far too opinionated lately.</p>
<p><strong>#4 An implementation of Slim and/or Haml </strong></p>
<p><strong></strong>The Haml implemntations are hopelessly out dated (many not seeing updates over the last two or three years) and as far as I know no port of Slim has been done. This might be a cool project to improve an otherwise painful templating situation in Clojure.</p>
<p><strong>And that&#8217;s all she wrote:</strong></p>
<p>Let me know if anything there seems stupid, useful or otherwise worth commenting on. More importantly let me know if any of that exists and I just failed at researching it!</p>
]]></content:encoded>
			<wfw:commentRss>http://runningwithrails.com/2012/09/considering-major-projects/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Clojure and QT for desktop applications</title>
		<link>http://runningwithrails.com/2012/09/clojure-and-qt-for-desktop-applications/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=clojure-and-qt-for-desktop-applications</link>
		<comments>http://runningwithrails.com/2012/09/clojure-and-qt-for-desktop-applications/#comments</comments>
		<pubDate>Mon, 10 Sep 2012 07:22:55 +0000</pubDate>
		<dc:creator>Michael Blake</dc:creator>
				<category><![CDATA[Clojure]]></category>

		<guid isPermaLink="false">http://runningwithrails.com/?p=319</guid>
		<description><![CDATA[Up until now I have exclusively talked about web applications, and to a degree that stems from my mindset that the future of applications is the web. I stand by that&#8230;with caveats. I&#8217;m embarking on a new personal project which requires a pure offline environment, something I haven&#8217;t done in any form in years and ]]></description>
				<content:encoded><![CDATA[<p>Up until now I have exclusively talked about web applications, and to a degree that stems from my mindset that the future of applications is the web. I stand by that&#8230;with caveats.</p>
<p>I&#8217;m embarking on a new personal project which requires a pure offline environment, something I haven&#8217;t done in any form in years and realistically have never done. Even in my past working with C# applications they always connected to remote databases maintained on networks and relied heavily on server storage. So for me, this will be my first time working on a stand alone desktop application.</p>
<p>Of course the Clojure comes in because I want to build something cross platform, targeting Mac OSx and Windows XP &#8211; 8&#8230;okay maybe not 8. I&#8217;m not sure yet.</p>
<p>At any rate if you&#8217;re not familiar with QT you should be. It&#8217;s a cross-platform UI framework maintained/developed by Nokia available through an LGPL license, making it a legitimate choice for commercial and open source uses.<span id="more-319"></span></p>
<p><strong>Getting everything installed:</strong></p>
<p><strong></strong> Now because Clojure is a JVM based language you can count on using the Java libraries to hook QT into Clojure. Let&#8217;s go ahead and assume that you&#8217;ve installed Clojure 1.4.0 through HomeBrew, because that&#8217;s what I did.</p>
<p>Now you&#8217;re going to want to download the <a title="http://qt-jambi.org/" href="http://qt-jambi.org/">QT Jambi</a> library, this is the java implementation of QT. Simply unzip the package</p>
<p>To run the sample binary to view some of what QT Jambi can do simply terminal to your new qt jambi folder and run the following commands.</p>
<blockquote><p>chmod +x qtjambi.sh</p>
<p>sudo ./qtjambi.sh</p></blockquote>
<p><em><strong>Note:</strong></em> You may need to open qtjambi.sh and add &#8221;-d32&#8243; to the java command being called near the end of the file, this will force it to run in 32-bit mode, which is required for Lion/Mountain Lion</p>
<p>Now what I did was install qtjambi into my local maven repository using the following command:</p>
<blockquote><p> mvn install:install-file -Dfile=qtjambi-4.7.0.jar -DartifactId=qtjambi -Dversion=4.7.0 -DgroupId=qtjambi -Dpackaging=jar</p></blockquote>
<p>But there are other ways to get your dependencies loaded, I just have a preference for my local maven repo.</p>
<p><strong>Writing your hello world:</strong></p>
<p>So, of course, we&#8217;re going to do the old stand-by HelloWorld app.</p>
<p>The first thing we&#8217;re going to do is create a new project in lein by doing a simple <em><strong>lein new hello_world</strong></em><strong></strong>.</p>
<p>Add <strong>:main hello_world.core </strong>to your project.clj in your new application.</p>
<p>Go ahead and define main in your core.clj file, it should look something like this:</p>
<blockquote><p>(ns hello_world.core)</p>
<p>(defn -main [] (println &#8220;Hello World&#8221;))</p></blockquote>
<p><strong>Now on to the GUI!</strong></p>
<p>We didn&#8217;t come here to print stinkin&#8217; lines! Still, if everything runs with <strong><em>lein run </em></strong>from the console then we should be good to go. Let&#8217;s start doing some GUI work.</p>
<p>Now what we don&#8217;t have is the .* notation on an import, so we won&#8217;t get to import the entirety of QT, what&#8217;s more we have to make two more modifications to project.clj.</p>
<p>The first thing to do is add the following line to your project.clj inside your dependencies:</p>
<blockquote><p>[qtjambi "4.7.0"]</p></blockquote>
<p>add this line beneath your :main statement:</p>
<blockquote><p>  :jvm-opts ["-d32" "-XstartOnFirstThread"]</p></blockquote>
<p>This will tell Lein to run in 32bit mode and tell QT where to start, both are important to keep it from crashing.</p>
<p>Now in core add these lines<em><strong> </strong></em>directly below your Namespace declaration.</p>
<blockquote><p>(import &#8216;com.trolltech.qt.gui.QApplication<br />
&#8216;com.trolltech.qt.gui.QPushButton)</p></blockquote>
<p>Okay, time to wrap it up by modifying your (main) so that it looks like this:</p>
<blockquote><p>(QApplication/initialize (into-array [""]))<br />
(.show (new QPushButton &#8220;Hello World&#8221;))<br />
(QApplication/exec)</p></blockquote>
<p>When you do Lein Run now you should see a very small window with a very informative button on it, one that says Hello World! Congratulations, you&#8217;ve taken your first steps into the world of GUI applications with QT and Clojure, and for that matter so have I.</p>
<p>We&#8217;ll see where this takes us.</p>
<p>The full source for the sample project can be found at <a title="https://github.com/mblake/jambi-hello-world" href="https://github.com/mblake/jambi-hello-world">https://github.com/mblake/jambi-hello-world</a>.</p>
<p>Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://runningwithrails.com/2012/09/clojure-and-qt-for-desktop-applications/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Not quite what I was hoping for</title>
		<link>http://runningwithrails.com/2012/09/not-quite-what-i-was-hoping-for/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=not-quite-what-i-was-hoping-for</link>
		<comments>http://runningwithrails.com/2012/09/not-quite-what-i-was-hoping-for/#comments</comments>
		<pubDate>Sun, 09 Sep 2012 21:24:01 +0000</pubDate>
		<dc:creator>Michael Blake</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://runningwithrails.com/?p=316</guid>
		<description><![CDATA[I&#8217;ve run into a few problems with Refinery on my production server, namely some weird caching that is causing me to hold off on deployment. I&#8217;m honestly starting to wonder if I shouldn&#8217;t take the time to learn WordPress theming. Oh well, back to work!]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve run into a few problems with Refinery on my production server, namely some weird caching that is causing me to hold off on deployment.</p>
<p>I&#8217;m honestly starting to wonder if I shouldn&#8217;t take the time to learn WordPress theming.</p>
<p>Oh well, back to work!</p>
]]></content:encoded>
			<wfw:commentRss>http://runningwithrails.com/2012/09/not-quite-what-i-was-hoping-for/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Simple form submission with Noir</title>
		<link>http://runningwithrails.com/2012/08/simple-form-submission-with-noir/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=simple-form-submission-with-noir</link>
		<comments>http://runningwithrails.com/2012/08/simple-form-submission-with-noir/#comments</comments>
		<pubDate>Mon, 27 Aug 2012 15:00:26 +0000</pubDate>
		<dc:creator>Michael Blake</dc:creator>
				<category><![CDATA[Clojure]]></category>

		<guid isPermaLink="false">http://runningwithrails.com/?p=299</guid>
		<description><![CDATA[One of the most basic things we do with interactive websites is submit data via the form tag. This method of input is so familiar to end users and programmers that we hardly think about it anymore. Naturally, one of the first questions I had as I started using Noir for web development was &#8220;How ]]></description>
				<content:encoded><![CDATA[<p>One of the most basic things we do with interactive websites is submit data via the form tag. This method of input is so familiar to end users and programmers that we hardly think about it anymore. Naturally, one of the first questions I had as I started using Noir for web development was &#8220;How do I get data back from the user?&#8221;</p>
<p>For the most part it&#8217;s a very simple task thanks to form helpers in Hiccup (the HTML rendered that Noir houses underneath) that allow us to build what we need in much the same way we would with Ruby.<span id="more-299"></span></p>
<p>A basic example of a user registration form looks like this:</p>
<blockquote><p>(defpartial register []<br />
(html5<br />
(form-to [:post "/save_user"]<br />
(label &#8220;username&#8221; &#8220;Username:&#8221;)<br />
[:br]<br />
(text-field &#8220;username&#8221;)<br />
[:br]<br />
(label &#8220;password&#8221; &#8220;Password:&#8221;)<br />
[:br]<br />
(password-field &#8220;password&#8221;)<br />
[:br]<br />
(label &#8220;email&#8221; &#8220;Email&#8221;)<br />
[:br]<br />
(text-field &#8220;email&#8221;)<br />
[:br]<br />
(submit-button &#8220;Add user&#8221;)<br />
)))</p></blockquote>
<p>Now there are a few things there that might bear a little explanation.</p>
<p><strong><em>html5 </em></strong><em></em>tells Hiccup what to expect when rendering. There&#8217;s no real trick there and everything is taken care of by the library.</p>
<p><strong><em>form-to </em></strong><em></em>takes the path to the action you&#8217;re going to post the form data to. Just like in rails this is going to be a defined route somewhere in your app. It will look like this:</p>
<blockquote><p>(defpage [:post "/save_user"] {:as user}<br />
(user/save_user user)<br />
(resp/redirect &#8220;/configure&#8221;))</p></blockquote>
<p>What I&#8217;m doing here is defining an accessible page (save_user) that defines a PersistentArrayMap (the format our data comes to us) as variable user. I then go off and save that user in a model and call resp/redirect from the library noir.response.</p>
<p>That was easy-peasy, and we have a form that submits our user&#8217;s input and does it all in 100% genuine Clojure.</p>
<p><strong>Author&#8217;s Note:</strong> <em>The more time I spend in Clojure, the less I think about where my parens go and how to format my code. If it looks scary now, give it a chance. It has a way of growing on you.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://runningwithrails.com/2012/08/simple-form-submission-with-noir/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reading excel documents in Clojure</title>
		<link>http://runningwithrails.com/2012/08/reading-excel-documents-in-clojure/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=reading-excel-documents-in-clojure</link>
		<comments>http://runningwithrails.com/2012/08/reading-excel-documents-in-clojure/#comments</comments>
		<pubDate>Fri, 24 Aug 2012 20:25:31 +0000</pubDate>
		<dc:creator>Michael Blake</dc:creator>
				<category><![CDATA[Clojure]]></category>

		<guid isPermaLink="false">http://runningwithrails.com/?p=295</guid>
		<description><![CDATA[Let me take a minute to introduce you to a library called Incanter. Incanter is a wonderful little R-style statistical computing library written in Clojure. It is also the easiest way to read in data sets from Microsoft Excel documents in Clojure. To use Incanter just include it in your project.clj (you are using lein, ]]></description>
				<content:encoded><![CDATA[<p>Let me take a minute to introduce you to a library called Incanter. Incanter is a wonderful little R-style statistical computing library written in Clojure. It is also the easiest way to read in data sets from Microsoft Excel documents in Clojure.</p>
<p>To use Incanter just include it in your project.clj (you are using lein, right) using:</p>
<blockquote><p>[incanter "1.3.0"]</p></blockquote>
<p>Then run lein deps in your console to install the dependency.</p>
<p>After that all you need to do to retrieve an excel file is use the following code.</p>
<blockquote><p>(use &#8216;(incanter core io excel))</p>
<p>(defn get_excel (read-xls &#8220;/My/File/Location.xlsx&#8221;))</p></blockquote>
<p>There you are. You now have the content of your excel file in a readable, manipulable list that you can use any way you please. This is both an easier and more pleasant experience than what I&#8217;ve seen with Excel documents in ruby, especially when you need to open both xls and xlsx documents.</p>
]]></content:encoded>
			<wfw:commentRss>http://runningwithrails.com/2012/08/reading-excel-documents-in-clojure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building libraries for public consumption</title>
		<link>http://runningwithrails.com/2012/08/building-libraries-for-public-consumption/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=building-libraries-for-public-consumption</link>
		<comments>http://runningwithrails.com/2012/08/building-libraries-for-public-consumption/#comments</comments>
		<pubDate>Wed, 22 Aug 2012 18:00:23 +0000</pubDate>
		<dc:creator>Michael Blake</dc:creator>
				<category><![CDATA[Clojure]]></category>

		<guid isPermaLink="false">http://runningwithrails.com/?p=291</guid>
		<description><![CDATA[AKA: A temporary distraction from my time with Clojure. This distraction is almost entirely based on my recent experience with Korma, the SQL DSL-of-choice for Clojure. Korma itself is a great library, and I&#8217;m a huge fan. It&#8217;s solid dependable and well thought out, well, mostly. And there&#8217;s where my problem occurred. My days are ]]></description>
				<content:encoded><![CDATA[<p>AKA: A temporary distraction from my time with Clojure.</p>
<p>This distraction is almost entirely based on my recent experience with Korma, the SQL DSL-of-choice for Clojure.</p>
<p>Korma itself is a great library, and I&#8217;m a huge fan. It&#8217;s solid dependable and well thought out, well, mostly. And there&#8217;s where my problem occurred.</p>
<p>My days are spent working with Oracle and SqlServer. Two technologies that are, by most measures, just unpleasant. They&#8217;re good at what they do and where they do it, but the level of standards compliance they support is about nil. So while working with Clojure and Korma I tried to do a limit on a query. You know the old &#8220;Select * from my_table LIMIT 20&#8243;.<span id="more-291"></span></p>
<p>One minor problem though, in Oracle it&#8217;s &#8220;Select * from my_table WHERE rownum &lt;= 20&#8243;. Korma doesn&#8217;t place nice with this (admittedly annoying) way of doing things.</p>
<p>Now you might expect this will turn into a rant about making sure that all supported toolchains are FULLY supported, and it very well COULD turn into that, but this time it won&#8217;t. Why? Because Korma is open source, and Korma is freely available to fork, patch, modify and use in just about any way you like.</p>
<p>So what does this have to do with public consumption? I wanted to point out all the things Korma does right and where many other libraries could learn. First of all it IS open source, so it&#8217;s easy to get to and to modify that&#8217;s great but even great FOSS libraries can be hard to change. Where Korma succeeds is in two places.</p>
<p><strong>#1</strong></p>
<p>Readable code. Not only is Korma&#8217;s code is to read but it is logically organized and split into reasonable, easy to locate functions. Korma proves that even a relatively complex library can be built in a way that is easily consumed by a Clojure noob like myself.</p>
<p><strong>#2</strong></p>
<p>TESTS! I can not stress this enough. If you push out a library to the public and it&#8217;s untested you should be publicly shamed, your face should adorn piñatas and small children should mock your beard.</p>
<p><strong>In short:</strong></p>
<p>I&#8217;m finally writing to say something positive, and to remind anyone looking to write libraries I might need to use some day to keep them clean. Once you turn your code loose to the community we will be watching, and we will be judging.</p>
]]></content:encoded>
			<wfw:commentRss>http://runningwithrails.com/2012/08/building-libraries-for-public-consumption/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
