<?xml version='1.0' encoding='utf-8' ?>
<feed xmlns='http://www.w3.org/2005/Atom'>
<title>Joel Boehland's Blog</title>
<link href='http://joelboehland.com/feed.atom.xml' rel='self' />
<link href='http://joelboehland.com' />
<updated>2010-02-04T10:23:48-08:00</updated>
<author>
<name>Joel Boehland</name>
<email>joel.boehland@evocomputing.com</email>
</author>
<id>http://joelboehland.com/</id>
<entry>
<title>Hello Blog</title>
<link href='http://joelboehland.com/posts/hello-blog.html' />
<id>tag:joelboehland.com,2009-11-23:1259042400</id>
<updated>2009-11-23T22:00:00-08:00</updated>
<content type='html'>&amp;#x000A;&amp;#x000A;&amp;#x000A;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-1&quot;&gt;&amp;#x000A;&amp;#x000A;&lt;p&gt;This is the first post of my blog. Expect posts related to my&amp;#x000A;favorite programming languages (&lt;a href=&quot;http://python.org&quot;&gt;Python&lt;/a&gt;, &lt;a href=&quot;http://clojure.org&quot;&gt;Clojure&lt;/a&gt;, &lt;a href=&quot;http://ruby-lang.org&quot;&gt;Ruby&lt;/a&gt;), and my&amp;#x000A;favorite development tools (&lt;a href=&quot;http://orgmode.org&quot;&gt;Emacs Org Mode&lt;/a&gt;).&amp;#x000A;&lt;/p&gt;&lt;/div&gt;</content>
</entry>
<entry>
<title>Funding Clojure</title>
<link href='http://joelboehland.com/posts/funding-clojure.html' />
<id>tag:joelboehland.com,2009-12-18:1261185577</id>
<updated>2009-12-18T17:19:37-08:00</updated>
<content type='html'>&amp;#x000A;&amp;#x000A;&amp;#x000A;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-1&quot;&gt;&amp;#x000A;&amp;#x000A;&amp;#x000A;&amp;#x000A;&lt;/div&gt;&amp;#x000A;&amp;#x000A;&lt;div class=&quot;outline-3&quot; id=&quot;outline-container-1.1&quot;&gt;&amp;#x000A;&lt;h3 id=&quot;sec-1.1&quot;&gt;Supporting the further development of Clojure &lt;/h3&gt;&amp;#x000A;&lt;div class=&quot;outline-text-3&quot; id=&quot;text-1.1&quot;&gt;&amp;#x000A;&amp;#x000A;&amp;#x000A;&lt;p&gt;&amp;#x000A;Quoting Rich Hickey:&amp;#x000A;&lt;/p&gt;&lt;pre class=&quot;example&quot;&gt;&amp;#x000A;   It is important when using open source software that you consider who&amp;#x000A;   is paying for it, because someone is. There is no such thing as free&amp;#x000A;   software.&amp;#x000A;&lt;/pre&gt;&amp;#x000A;&amp;#x000A;&amp;#x000A;&lt;p&gt;&amp;#x000A;Rich makes a great case: &lt;a href=&quot;http://clojure.org/funding&quot;&gt;read the whole article here&lt;/a&gt;. I have chipped in&amp;#x000A;despite it being a rather tight year, and if you are a user of&amp;#x000A;Clojure, you should consider it as well. I think Rich is one of&amp;#x000A;those rare individuals who makes our entire profession better. If&amp;#x000A;you have followed any of the Clojure development lists, you can&amp;#x000A;quickly pick up how thoughtful he is in furthering the design of&amp;#x000A;Clojure.&amp;#x000A;&lt;/p&gt;&amp;#x000A;&lt;p&gt;&amp;#x000A;A language designer must contend with many opposing forces when&amp;#x000A;bringing a feature of a language to fruition. Is the feature&amp;#x000A;powerful enough to justify the added complexity? Is the feature&amp;#x000A;approachable to the bulk of the users of the language? Does the&amp;#x000A;feature fit into the existing language as a whole? Time and time&amp;#x000A;again I have seen proposed features go through the fire of Rich&amp;#x000A;and the Clojure community's scrutiny, and I think they have&amp;#x000A;succeeded in creating a language that has a great balance of&amp;#x000A;power, elegance and beauty. It's also really fun to use.&amp;#x000A;&lt;/p&gt;&amp;#x000A;&lt;p&gt;&amp;#x000A;I will comment on one other important aspect of Clojure that I have&amp;#x000A;noticed as well- the welcoming environment that Rich encourages and&amp;#x000A;enforces in the Clojure community. Trolls are not allowed to roam&amp;#x000A;free, and usually are quickly (but politely) guided to either be&amp;#x000A;civil, or to the exit. I think this has been a big component in the&amp;#x000A;quick growth we have seen in the Clojure community, and I hope it&amp;#x000A;survives as more and more people are drawn to the language.&amp;#x000A;&lt;/p&gt;&amp;#x000A;&lt;p&gt;&amp;#x000A;I hope this unique funding strategy works. Already the response has&amp;#x000A;been very positive (over 50% of the desired goal as of this&amp;#x000A;writing). I look forward to seeing the further growth of the&amp;#x000A;Clojure language and its community in 2010.&amp;#x000A;&lt;/p&gt;&lt;/div&gt;&amp;#x000A;&lt;/div&gt;</content>
</entry>
<entry>
<title>All your datasets R belong to us</title>
<link href='http://joelboehland.com/posts/all-your-datasets-r-belong-to-us.html' />
<id>tag:joelboehland.com,2010-02-03:1265227200</id>
<updated>2010-02-03T12:00:00-08:00</updated>
<content type='html'>&amp;#x000A;&amp;#x000A;&amp;#x000A;&lt;div class=&quot;outline-text-2&quot; id=&quot;text-1&quot;&gt;&amp;#x000A;&amp;#x000A;&amp;#x000A;&lt;p&gt;&amp;#x000A;I would like to introduce &lt;a href=&quot;http://github.com/jolby/rincanter&quot;&gt;Rincanter&lt;/a&gt;, a binding for &lt;a href=&quot;http://clojure.org&quot;&gt;Clojure&lt;/a&gt;/&lt;a href=&quot;http://incanter.org&quot;&gt;Incanter&lt;/a&gt; to&amp;#x000A;the &lt;a href=&quot;http://www.r-project.org&quot;&gt;R language&lt;/a&gt; for statistical computing. This is mostly a fairly thin&amp;#x000A;layer over the existing Java/R bindings done by the folks at&amp;#x000A;&lt;a href=&quot;http://rosuda.org/software/&quot;&gt;rosuda.org&lt;/a&gt;. Why did I write this? Thanks to the hard work of Rich&amp;#x000A;Hickey, David Liebke and others, you can already do impressive&amp;#x000A;statistical data-mining tasks using only Clojure. However, the R&amp;#x000A;project has a huge body of work of libraries and datasets that the&amp;#x000A;much smaller Incanter community won't be able to match, at least in&amp;#x000A;the short term. Unless&amp;hellip;we can provide an easy to use bridge that&amp;#x000A;would allow us to work mostly in Clojure and break into the R cookie&amp;#x000A;jar for its datasets and function libraries when we need to. So, the&amp;#x000A;goals for this project are:&amp;#x000A;&lt;/p&gt;&amp;#x000A;&lt;ul&gt;&amp;#x000A;&lt;li&gt;&amp;#x000A;Short Term:&amp;#x000A;&lt;ul&gt;&amp;#x000A;&lt;li&gt;&amp;#x000A;Provide access to the vast datasets available in R&amp;#x000A;to Clojure/Incanter users. This requires that we can convert&amp;#x000A;between R data types and Clojure/Incanter data types. For the most&amp;#x000A;part this is working.&amp;#x000A;&amp;#x000A;&lt;/li&gt;&amp;#x000A;&lt;li&gt;&amp;#x000A;Provide access to the large body of R packages and function&amp;#x000A;libraries to fill in the gaps where Clojure and Incanter don't&amp;#x000A;have functional coverage. This is partially working, but there&amp;#x000A;are probably quite a few places where the Clojure side and the R&amp;#x000A;side just won't match up without some serious fudging.&amp;#x000A;&amp;#x000A;&lt;/li&gt;&amp;#x000A;&lt;/ul&gt;&amp;#x000A;&lt;/li&gt;&amp;#x000A;&lt;li&gt;&amp;#x000A;Long Term&amp;#x000A;&lt;ul&gt;&amp;#x000A;&lt;li&gt;&amp;#x000A;Provide a scaffold for porting R packages, functions and&amp;#x000A;datasets over to what many people believe is a stronger base&amp;#x000A;language. While R is an impressive language in many ways, even&amp;#x000A;some of its &lt;a href=&quot;http://www.stat.auckland.ac.nz/%7Eihaka/downloads/Compstat-2008.pdf&quot;&gt;Founders&lt;/a&gt; think that a full featured lisp could be a&amp;#x000A;better way forward for basing an interactive statistical&amp;#x000A;environment on. I would like people to strongly consider Clojure&amp;#x000A;for that position.&amp;#x000A;&amp;#x000A;&lt;/li&gt;&amp;#x000A;&lt;/ul&gt;&amp;#x000A;&lt;/li&gt;&amp;#x000A;&lt;/ul&gt;&amp;#x000A;&amp;#x000A;&lt;/div&gt;&amp;#x000A;&amp;#x000A;&lt;div class=&quot;outline-3&quot; id=&quot;outline-container-1.1&quot;&gt;&amp;#x000A;&lt;h3 id=&quot;sec-1.1&quot;&gt;A quick walkthrough &lt;/h3&gt;&amp;#x000A;&lt;div class=&quot;outline-text-3&quot; id=&quot;text-1.1&quot;&gt;&amp;#x000A;&amp;#x000A;&lt;p&gt;This will show a quick example showing how we can access R datasets&amp;#x000A;available remotely on CRAN and import them into Incanter. We will be&amp;#x000A;interacting with Incanter and R inside a REPL session. &amp;#x000A;&lt;/p&gt;&amp;#x000A;&lt;p&gt;&amp;#x000A;To start with, you will need to get Rincanter up and running. There&amp;#x000A;are some fairly detailed instructions for doing this on the project&amp;#x000A;&lt;a href=&quot;http://github.com/jolby/rincanter&quot;&gt;Home Page&lt;/a&gt;.&amp;#x000A;&lt;/p&gt;&amp;#x000A;&amp;#x000A;&amp;#x000A;&amp;#x000A;&lt;pre class=&quot;src src-sh&quot;&gt;$ cd /path/to/where/you/downloaded/rincanter&amp;#x000A;$ lein repl&amp;#x000A;&lt;/pre&gt;&amp;#x000A;&amp;#x000A;&amp;#x000A;&amp;#x000A;&amp;#x000A;&lt;p&gt;&amp;#x000A;You should now have a REPL running with the required classes and&amp;#x000A;packages loaded. Now we are ready for an interactive session. This&amp;#x000A;will just be a very simple example showing how we can access R&amp;#x000A;datasets available remotely on CRAN and import them into Incanter.&amp;#x000A;&lt;/p&gt;&amp;#x000A;&amp;#x000A;&amp;#x000A;&amp;#x000A;&lt;label class=&quot;org-src-name&quot;&gt;Rincanter-session-1&lt;/label&gt;&amp;#x000A;&lt;pre class=&quot;src src-clojure&quot;&gt;&amp;#x000A;user=&amp;gt;&lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;use '&lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;incanter core stats charts&lt;span class=&quot;org-esk-paren&quot;&gt;))&lt;/span&gt;&amp;#x000A;user=&amp;gt;&lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;use '&lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;com.evocomputing rincanter&lt;span class=&quot;org-esk-paren&quot;&gt;))&lt;/span&gt;&amp;#x000A;&amp;#x000A;&lt;span class=&quot;org-comment-delimiter&quot;&gt;;;&lt;/span&gt;&lt;span class=&quot;org-comment&quot;&gt;just ensure that we can connect to the embedded R engine&amp;#x000A;&lt;/span&gt;user=&amp;gt;&lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;get-jri-engine&lt;span class=&quot;org-esk-paren&quot;&gt;)&lt;/span&gt;&amp;#x000A;&amp;#x000A;&lt;span class=&quot;org-comment-delimiter&quot;&gt;;;&lt;/span&gt;&lt;span class=&quot;org-comment&quot;&gt;Now let's load an R package from CRAN&amp;#x000A;&lt;/span&gt;&lt;span class=&quot;org-comment-delimiter&quot;&gt;;;&lt;/span&gt;&lt;span class=&quot;org-comment&quot;&gt;Picking &quot;season&quot; package at random&amp;#x000A;&lt;/span&gt;user=&amp;gt;&lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;r-install-CRAN &lt;span class=&quot;org-string&quot;&gt;&quot;season&quot;&lt;/span&gt;&lt;span class=&quot;org-esk-paren&quot;&gt;)&lt;/span&gt;&amp;#x000A;&amp;#x000A;The downloaded packages are in&amp;#x000A;/var/folders/ZZZZZXXXXXYYYY4/downloaded_packages&amp;#x000A;nil&amp;#x000A;&amp;#x000A;&lt;span class=&quot;org-comment-delimiter&quot;&gt;;;&lt;/span&gt;&lt;span class=&quot;org-comment&quot;&gt;The package has been installed, now load the library&amp;#x000A;&lt;/span&gt;user=&amp;gt;&lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;r-eval &lt;span class=&quot;org-string&quot;&gt;&quot;library(season)&quot;&lt;/span&gt;&lt;span class=&quot;org-esk-paren&quot;&gt;)&lt;/span&gt;&amp;#x000A;&amp;#x000A;[&lt;span class=&quot;org-string&quot;&gt;&quot;season&quot;&lt;/span&gt; &lt;span class=&quot;org-string&quot;&gt;&quot;coda&quot;&lt;/span&gt; &lt;span class=&quot;org-string&quot;&gt;&quot;survival&quot;&lt;/span&gt; &lt;span class=&quot;org-string&quot;&gt;&quot;splines&quot;&lt;/span&gt; &lt;span class=&quot;org-string&quot;&gt;&quot;mgcv&quot;&lt;/span&gt;&amp;#x000A; &lt;span class=&quot;org-string&quot;&gt;&quot;MASS&quot;&lt;/span&gt; &lt;span class=&quot;org-string&quot;&gt;&quot;lattice&quot;&lt;/span&gt; &lt;span class=&quot;org-string&quot;&gt;&quot;stats&quot;&lt;/span&gt; &lt;span class=&quot;org-string&quot;&gt;&quot;graphics&quot;&lt;/span&gt; &lt;span class=&quot;org-string&quot;&gt;&quot;grDevices&quot;&lt;/span&gt;&amp;#x000A; &lt;span class=&quot;org-string&quot;&gt;&quot;utils&quot;&lt;/span&gt; &lt;span class=&quot;org-string&quot;&gt;&quot;datasets&quot;&lt;/span&gt; &lt;span class=&quot;org-string&quot;&gt;&quot;methods&quot;&lt;/span&gt; &lt;span class=&quot;org-string&quot;&gt;&quot;base&quot;&lt;/span&gt;]&amp;#x000A;&amp;#x000A;&lt;span class=&quot;org-comment-delimiter&quot;&gt;;;&lt;/span&gt;&lt;span class=&quot;org-comment&quot;&gt;Load the CVDdaily dataset&amp;#x000A;&lt;/span&gt;user=&amp;gt;&lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;r-eval &lt;span class=&quot;org-string&quot;&gt;&quot;data(CVDdaily)&quot;&lt;/span&gt;&lt;span class=&quot;org-esk-paren&quot;&gt;)&lt;/span&gt;&amp;#x000A;&amp;#x000A;&lt;span class=&quot;org-comment-delimiter&quot;&gt;;;&lt;/span&gt;&lt;span class=&quot;org-comment&quot;&gt;OK- we can now access/convert this data to Incanter!&amp;#x000A;&lt;/span&gt;&lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;org-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;org-function-name&quot;&gt;*CVDdaily*&lt;/span&gt; &lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;r-get &lt;span class=&quot;org-string&quot;&gt;&quot;CVDdaily&quot;&lt;/span&gt;&lt;span class=&quot;org-esk-paren&quot;&gt;))&lt;/span&gt;&amp;#x000A;&amp;#x000A;&lt;span class=&quot;org-comment-delimiter&quot;&gt;;;&lt;/span&gt;&lt;span class=&quot;org-comment&quot;&gt;It is now data owned by Incanter, do what you want with it&amp;#x000A;&lt;/span&gt;user=&amp;gt; &lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;col-names *CVDdaily*&lt;span class=&quot;org-esk-paren&quot;&gt;)&lt;/span&gt;&amp;#x000A;[&lt;span class=&quot;org-string&quot;&gt;&quot;date&quot;&lt;/span&gt; &lt;span class=&quot;org-string&quot;&gt;&quot;cvd&quot;&lt;/span&gt; &lt;span class=&quot;org-string&quot;&gt;&quot;dow&quot;&lt;/span&gt; &lt;span class=&quot;org-string&quot;&gt;&quot;tmpd&quot;&lt;/span&gt; &lt;span class=&quot;org-string&quot;&gt;&quot;o3mean&quot;&lt;/span&gt; &lt;span class=&quot;org-string&quot;&gt;&quot;o3tmean&quot;&lt;/span&gt; &lt;span class=&quot;org-string&quot;&gt;&quot;Mon&quot;&lt;/span&gt;&amp;#x000A; &lt;span class=&quot;org-string&quot;&gt;&quot;Tue&quot;&lt;/span&gt; &lt;span class=&quot;org-string&quot;&gt;&quot;Wed&quot;&lt;/span&gt; &lt;span class=&quot;org-string&quot;&gt;&quot;Thu&quot;&lt;/span&gt; &lt;span class=&quot;org-string&quot;&gt;&quot;Fri&quot;&lt;/span&gt; &lt;span class=&quot;org-string&quot;&gt;&quot;Sat&quot;&lt;/span&gt; &lt;span class=&quot;org-string&quot;&gt;&quot;month&quot;&lt;/span&gt; &lt;span class=&quot;org-string&quot;&gt;&quot;winter&quot;&lt;/span&gt;&amp;#x000A; &lt;span class=&quot;org-string&quot;&gt;&quot;spring&quot;&lt;/span&gt; &lt;span class=&quot;org-string&quot;&gt;&quot;summer&quot;&lt;/span&gt; &lt;span class=&quot;org-string&quot;&gt;&quot;autumn&quot;&lt;/span&gt;]&amp;#x000A;user=&amp;gt; &lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;with-data *CVDdaily* &lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;mean &lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;$ &lt;span class=&quot;org-builtin&quot;&gt;:cvd&lt;/span&gt;&lt;span class=&quot;org-esk-paren&quot;&gt;)))&lt;/span&gt;&amp;#x000A;45.110481032459916&amp;#x000A;&amp;#x000A;&lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;with-data *CVDdaily*&amp;#x000A;  &lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;org-keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;org-function-name&quot;&gt;lm&lt;/span&gt; &lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;linear-model &lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;$ &lt;span class=&quot;org-builtin&quot;&gt;:cvd&lt;/span&gt;&lt;span class=&quot;org-esk-paren&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;$ &lt;span class=&quot;org-builtin&quot;&gt;:o3mean&lt;/span&gt;&lt;span class=&quot;org-esk-paren&quot;&gt;)))&lt;/span&gt;&amp;#x000A;  &lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;org-keyword&quot;&gt;doto&lt;/span&gt; &lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;scatter-plot &lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;$ &lt;span class=&quot;org-builtin&quot;&gt;:o3mean&lt;/span&gt;&lt;span class=&quot;org-esk-paren&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;$ &lt;span class=&quot;org-builtin&quot;&gt;:cvd&lt;/span&gt;&lt;span class=&quot;org-esk-paren&quot;&gt;))&lt;/span&gt;&amp;#x000A;    &lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;add-lines &lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;$ &lt;span class=&quot;org-builtin&quot;&gt;:o3mean&lt;/span&gt;&lt;span class=&quot;org-esk-paren&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;org-esk-paren&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;org-builtin&quot;&gt;:fitted&lt;/span&gt; lm&lt;span class=&quot;org-esk-paren&quot;&gt;))&lt;/span&gt;&amp;#x000A;    view&lt;span class=&quot;org-esk-paren&quot;&gt;))&lt;/span&gt;&amp;#x000A;&lt;/pre&gt;&amp;#x000A;&amp;#x000A;&amp;#x000A;&amp;#x000A;&amp;#x000A;&lt;p&gt;&amp;#x000A;As you can see, it's fairly easy to grab any existing package and&amp;#x000A;dataset on CRAN, download it, and pull the data into Incanter.&amp;#x000A;&lt;/p&gt;&lt;/div&gt;&amp;#x000A;&lt;/div&gt;</content>
</entry>
</feed>

