<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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" version="2.0">

<channel>
	<title>Ola Bini: Programming Language Synchronicity</title>
	
	<link>http://olabini.com/blog</link>
	<description>Ruby, Java, Lisp, Io, JRuby. Programming language archeology, creation and discovery.</description>
	<pubDate>Tue, 16 Mar 2010 14:08:31 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.1</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/olabini" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="olabini" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>ÜberConf</title>
		<link>http://olabini.com/blog/2010/03/uberconf/</link>
		<comments>http://olabini.com/blog/2010/03/uberconf/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 14:08:31 +0000</pubDate>
		<dc:creator>Ola Bini</dc:creator>
		
		<category><![CDATA[blogging]]></category>

		<category><![CDATA[conferences]]></category>

		<category><![CDATA[jruby]]></category>

		<category><![CDATA[uberconf]]></category>

		<guid isPermaLink="false">http://olabini.com/blog/?p=699</guid>
		<description><![CDATA[I will speak at ÜberConf in Denver in June. Should be lots of fun! I will talk about JRuby and building languages. I might also possibly cover Ioke - we&#8217;ll see what happens.
]]></description>
			<content:encoded><![CDATA[<p>I will speak at ÜberConf in Denver in June. Should be lots of fun! I will talk about JRuby and building languages. I might also possibly cover Ioke - we&#8217;ll see what happens.</p>
]]></content:encoded>
			<wfw:commentRss>http://olabini.com/blog/2010/03/uberconf/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Destructuring extravaganza</title>
		<link>http://olabini.com/blog/2010/03/destructuring-extravaganza/</link>
		<comments>http://olabini.com/blog/2010/03/destructuring-extravaganza/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 19:34:26 +0000</pubDate>
		<dc:creator>Ola Bini</dc:creator>
		
		<category><![CDATA[ioke]]></category>

		<category><![CDATA[destructuring]]></category>

		<category><![CDATA[programming language design]]></category>

		<guid isPermaLink="false">http://olabini.com/blog/?p=697</guid>
		<description><![CDATA[A few months back I added support for destructuring assignment and tuples to Ioke. Since Ioke&#8217;s assignment is just a regular method call, this was actually fairly easy to do. The end result is that you can do things like (x, y) = (13, 14). You can also do more interesting things, such as ((x, [...]]]></description>
			<content:encoded><![CDATA[<p>A few months back I added support for destructuring assignment and tuples to Ioke. Since Ioke&#8217;s assignment is just a regular method call, this was actually fairly easy to do. The end result is that you can do things like (x, y) = (13, 14). You can also do more interesting things, such as ((x, y), (x2, y2)) = [[1,2],[3,4]]. Notice that the right hand side is not a tuple anymore, but a list. Anything that can be turned into a tuple using the asTuple method can be on the right hand side, or an item in a recursive destructuring.</p>
<p>All this functionality makes code slightly more readable. But last week I decided to add support for eachCons and eachSlice, and suddenly I realized that destructuring would be very nice to have not only in the explicit assignment case, but also in cases where you want to pick apart the arguments to an enumerable or sequence method. So I added those, which means that suddenly lots of code becomes much more simple.</p>
<p>Short story, in all Sequence and Enumerable methods, at every place where you could put an argument name, you can now put a destructuring statement instead. Let&#8217;s take a look at an example:</p>
<pre class="code"><span style="color: #b0c4de;">Point</span> <span style="color: #00bfff;">=</span> <span style="color: #8b0000;">Origin</span> <span style="color: #449900;">with</span>(<span style="color: #7777d4;">asTuple:</span> <span style="color: #6495ed;">method</span>((x<span style="color: #006666;">,</span> y<span style="color: #006666;">,</span> z)))

<span style="color: #b0c4de;">points</span> <span style="color: #00bfff;">=</span> [
  <span style="color: #606060;">Point</span> <span style="color: #449900;">with</span>(<span style="color: #7777d4;">x:</span> <span style="color: #0050a0;">42</span><span style="color: #006666;">,</span> <span style="color: #7777d4;">y:</span> <span style="color: #0050a0;">14</span><span style="color: #006666;">,</span> <span style="color: #7777d4;">z:</span> <span style="color: #00bfff;">-</span><span style="color: #0050a0;">44</span>)<span style="color: #006666;">,</span>
  <span style="color: #606060;">Point</span> <span style="color: #449900;">with</span>(<span style="color: #7777d4;">x:</span> <span style="color: #0050a0;">20</span><span style="color: #006666;">,</span> <span style="color: #7777d4;">y:</span> <span style="color: #0050a0;">0</span><span style="color: #006666;">,</span> <span style="color: #7777d4;">z:</span> <span style="color: #0050a0;">444</span>)<span style="color: #006666;">,</span>
  <span style="color: #606060;">Point</span> <span style="color: #449900;">with</span>(<span style="color: #7777d4;">x:</span> <span style="color: #0050a0;">31</span><span style="color: #006666;">,</span> <span style="color: #7777d4;">y:</span> <span style="color: #0050a0;">646</span><span style="color: #006666;">,</span> <span style="color: #7777d4;">z:</span> <span style="color: #0050a0;">3</span>)<span style="color: #006666;">,</span>
  <span style="color: #606060;">Point</span> <span style="color: #449900;">with</span>(<span style="color: #7777d4;">x:</span> <span style="color: #0050a0;">456</span><span style="color: #006666;">,</span> <span style="color: #7777d4;">y:</span> <span style="color: #0050a0;">14</span><span style="color: #006666;">,</span> <span style="color: #7777d4;">z:</span> <span style="color: #0050a0;">12</span>)
  ]

<span style="color: #b0c4de;">distances1</span> <span style="color: #00bfff;">=</span> points consed map(obj<span style="color: #006666;">,</span>
  ((obj[<span style="color: #0050a0;">0</span>] x) <span style="color: #00bfff;">*</span> (obj[<span style="color: #0050a0;">1</span>] x) <span style="color: #00bfff;">+</span>
    (obj[<span style="color: #0050a0;">0</span>] y) <span style="color: #00bfff;">*</span> (obj[<span style="color: #0050a0;">1</span>] y) <span style="color: #00bfff;">+</span>
    (obj[<span style="color: #0050a0;">0</span>] z) <span style="color: #00bfff;">*</span> (obj[<span style="color: #0050a0;">1</span>] z)) sqrt)

<span style="color: #b0c4de;">distances2</span> <span style="color: #00bfff;">=</span> points consed map(
  ((x1<span style="color: #006666;">,</span>y1<span style="color: #006666;">,</span>z1)<span style="color: #006666;">,</span> (x2<span style="color: #006666;">,</span>y2<span style="color: #006666;">,</span>z2))<span style="color: #006666;">,</span>
  (x1<span style="color: #00bfff;">*</span>x2 <span style="color: #00bfff;">+</span> y1<span style="color: #00bfff;">*</span>y2 <span style="color: #00bfff;">+</span> z1<span style="color: #00bfff;">*</span>z2) sqrt)

distances1 <span style="color: #449900;">inspect</span> <span style="color: #449900;">println</span>
distances2 <span style="color: #449900;">inspect</span> <span style="color: #449900;">println</span></pre>
<p>This code first creates a Point that can be coerced into a tuple of x, y and z coordinates. We then create a list of Points with different coordinates. We then want to calculate the three distances between the four points. We do this in two ways, using the old method and then using destructuring. The method consed is a sequence version of eachCons. The default cons length is 2, so this will yield three entries with two points in each. We then call map on the sequence. We will get a List of two entries, where each entry is a point. Finally we use Pythagoras to calculate the distance.</p>
<p>The second version is very similar - the only difference is that instead of using the square brackets to index into the lists, we instead give a pattern. This pattern contains two patterns, and the variable names inside of it will be bound to the right parts of each point.</p>
<p>At least in my mind, the destructured syntax is much more readable than the original one. And remember, this works for anything that can be turned into a tuple, which means you can use it on any Enumerable - you can use it on a Pair (such as what a Dict will yield) or any thing you would want to add asTuple to on your own.</p>
]]></content:encoded>
			<wfw:commentRss>http://olabini.com/blog/2010/03/destructuring-extravaganza/feed/</wfw:commentRss>
		</item>
		<item>
		<title>RubyConf India</title>
		<link>http://olabini.com/blog/2010/02/rubyconf-india/</link>
		<comments>http://olabini.com/blog/2010/02/rubyconf-india/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 11:43:28 +0000</pubDate>
		<dc:creator>Ola Bini</dc:creator>
		
		<category><![CDATA[blogging]]></category>

		<category><![CDATA[bangalore]]></category>

		<category><![CDATA[conferences]]></category>

		<category><![CDATA[india]]></category>

		<category><![CDATA[ruby]]></category>

		<category><![CDATA[rubyconf]]></category>

		<category><![CDATA[rubyconf india]]></category>

		<guid isPermaLink="false">http://olabini.com/blog/?p=695</guid>
		<description><![CDATA[I am part of a team at ThoughtWorks helping out organizing the very first RubyConf in India. I&#8217;m very excited about this. So if you have the possibility to come to Bangalore, the event will be March 20 and 21.
We already have some solid speakers lined up. Chad Fowler will keynote, and so will I, [...]]]></description>
			<content:encoded><![CDATA[<p>I am part of a team at ThoughtWorks helping out organizing the very first <a href="http://rubyconfindia.org">RubyConf</a> in India. I&#8217;m very excited about this. So if you have the possibility to come to Bangalore, the event will be March 20 and 21.</p>
<p>We already have some solid speakers lined up. Chad Fowler will keynote, and so will I, and we have a number of other people coming in. A few of my colleagues from ThoughtWorks, such as Sarah Taraporewalla, Sidu Ponnappa and Aman King. Other speakers include Hemant Kumar, Pradeep Elankumaran, Arun Gupta and others. Finally, Nick Sieger will also come to Bangalore for this event!</p>
<p>So as you can see, this is gearing up to be a great event! Hope to see you there.</p>
]]></content:encoded>
			<wfw:commentRss>http://olabini.com/blog/2010/02/rubyconf-india/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ioke P released</title>
		<link>http://olabini.com/blog/2009/12/ioke-p-released/</link>
		<comments>http://olabini.com/blog/2009/12/ioke-p-released/#comments</comments>
		<pubDate>Wed, 23 Dec 2009 13:20:34 +0000</pubDate>
		<dc:creator>Ola Bini</dc:creator>
		
		<category><![CDATA[ioke]]></category>

		<category><![CDATA[ikc]]></category>

		<category><![CDATA[ikj]]></category>

		<category><![CDATA[ioke P]]></category>

		<category><![CDATA[release]]></category>

		<guid isPermaLink="false">http://olabini.com/blog/?p=693</guid>
		<description><![CDATA[I am very happy to announce that Ioke P has finally been released!
Ioke is a language that is designed to be as expressive as possible. It is a dynamic language targeted at the Java Virtual Machine. There also exists a version for the CLR. It&#8217;s been designed from scratch to be a highly flexible general [...]]]></description>
			<content:encoded><![CDATA[<p>I am very happy to announce that Ioke P has finally been released!</p>
<p>Ioke is a language that is designed to be as expressive as possible. It is a dynamic language targeted at the Java Virtual Machine. There also exists a version for the CLR. It&#8217;s been designed from scratch to be a highly flexible general purpose language. It is a prototype-based programming language that is inspired by Io, Smalltalk, Lisp and Ruby.</p>
<p>Homepage: <a href="http://ioke.org">http://ioke.org</a><br />
Download: <a href="http://ioke.org/download.html">http://ioke.org/download.html</a><br />
Programming guide: <a href="http://ioke.org/wiki/index.php/Guide">http://ioke.org/wiki/index.php/Guide</a><br />
Wiki: <a href="http://ioke.org/wiki">http://ioke.org/wiki</a></p>
<p>The two specific releases that encompass Ioke P are ikj 0.4.0 and ikc 0.4.0.</p>
<p>Ioke P is the fourth release of Ioke. It includes many new features compared to Ioke E:</p>
<ul>
<li>Number Infinity</li>
<li>eval</li>
<li>Reflector</li>
<li>Hooks</li>
<li>First class Runtime</li>
<li>New parser</li>
<li>Tuples</li>
<li>Structs</li>
<li>Destructuring assignment</li>
<li>Message rewriting</li>
<li>Functional composition</li>
<li>Sequences</li>
<li>Dictionary and Set versions of Enumerable methods</li>
<li>Enumerable group, Enumerable groupBy</li>
<li>Set operations for union, intersection, membership, subset and superset testing</li>
<li>ISpec stubbing and mocking</li>
<li>IIk history</li>
<li>DokGen on separate projects</li>
</ul>
<p>Ioke P also includes a large amount of bug fixes.</p>
<p>Features:</p>
<ul>
<li>Expressiveness first</li>
<li>Strong, dynamic typing</li>
<li>Prototype based object orientation</li>
<li>Homoiconic language</li>
<li>Simple syntax</li>
<li>Powerful macro facilities</li>
<li>Condition system</li>
<li>Aspects</li>
<li>Java integration</li>
<li>Developed using TDD</li>
<li>Documentation system that combines documentation with specs</li>
<li>Runs on both the JVM and the CLR</li>
</ul>
<p>The many things added in Ioke P could not have been done without the support of all the Ioke contributors. Thank you!</p>
<p>Regards<br />
Ola Bini    - ola.bini@gmail.com</p>
]]></content:encoded>
			<wfw:commentRss>http://olabini.com/blog/2009/12/ioke-p-released/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Path problem with Emacs on Mac OS X</title>
		<link>http://olabini.com/blog/2009/12/path-problem-with-emacs-on-mac-os-x/</link>
		<comments>http://olabini.com/blog/2009/12/path-problem-with-emacs-on-mac-os-x/#comments</comments>
		<pubDate>Sat, 12 Dec 2009 10:27:01 +0000</pubDate>
		<dc:creator>Ola Bini</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://olabini.com/blog/?p=690</guid>
		<description><![CDATA[One of the problems you might encounter using a native Emacs on top of Mac OS X is that your custom PATH variable doesn&#8217;t really translate into your running Emacs instance. This might show up as making it impossible to run things like Ruby or Ioke from inside of Emacs - complaining that it can&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>One of the problems you might encounter using a native Emacs on top of Mac OS X is that your custom PATH variable doesn&#8217;t really translate into your running Emacs instance. This might show up as making it impossible to run things like Ruby or Ioke from inside of Emacs - complaining that it can&#8217;t find the executable in question.</p>
<p>Another thing you might notice is that your Ruby environment is messed up - all the gems you so carefully installed isn&#8217;t around, and overall things just seem weird. One thing that could cause this is when you have a custom built Ruby installation in for example /opt/local or /usr/local instead of /usr. But Emacs just seems to pick up the original versino that shipped with OS X.</p>
<p>The reason for all these weird behaviors is that if Emacs is started from the Dock, or using the application directly, it doesn&#8217;t actually pick up the carefully prepared PATH variable you have in your terminal. Instead it will go ahead and use the default system PATH, which is very restrictive.</p>
<p>The way I prefer to solve this is to make sure that OS X plist version of the PATH variable is the same as my terminal one. I do that by resetting this plist on every login. Of course, OS X will not actually reload this without a reboot. If you just want to fix this once - and you&#8217;re reasonably sure you won&#8217;t change the path again, you can execute this command from the terminal and restart. Everything should be fine after that. The magic incantation looks like this:</p>
<blockquote><p>defaults write $HOME/.MacOSX/environment PATH &#8220;$PATH&#8221;</p></blockquote>
<p>(Note, I&#8217;ve had to solve this problem twice, since the first time I encountered it I didn&#8217;t blog about it. So now I&#8217;m blogging so it might also stick in my long term memory. Maybe it&#8217;s enough if it&#8217;s in my blog term memory&#8230;)</p>
]]></content:encoded>
			<wfw:commentRss>http://olabini.com/blog/2009/12/path-problem-with-emacs-on-mac-os-x/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Conference Hat Trick - QCon, RubyConf, JRubyConf</title>
		<link>http://olabini.com/blog/2009/11/conference-hat-trick-qcon-rubyconf-jrubyconf/</link>
		<comments>http://olabini.com/blog/2009/11/conference-hat-trick-qcon-rubyconf-jrubyconf/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 10:11:29 +0000</pubDate>
		<dc:creator>Ola Bini</dc:creator>
		
		<category><![CDATA[blogging]]></category>

		<category><![CDATA[jruby]]></category>

		<category><![CDATA[jrubyconf]]></category>

		<category><![CDATA[qcon]]></category>

		<category><![CDATA[qcon san francisco]]></category>

		<category><![CDATA[qconsf]]></category>

		<category><![CDATA[rubyconf]]></category>

		<category><![CDATA[san francisco]]></category>

		<guid isPermaLink="false">http://olabini.com/blog/?p=688</guid>
		<description><![CDATA[I&#8217;ve just come back from several different conferences. It&#8217;s been tiring but also very rewarding. The conferences I attended and presented at was QCon San Francisco, RubyConf and JRubyConf. I thought I&#8217;d just mention some of the highlights from these three events.
First QCon - after JAOO, QCon is my favorite conference. They always manage to [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just come back from several different conferences. It&#8217;s been tiring but also very rewarding. The conferences I attended and presented at was QCon San Francisco, RubyConf and JRubyConf. I thought I&#8217;d just mention some of the highlights from these three events.</p>
<p>First QCon - after JAOO, QCon is my favorite conference. They always manage to put together an interesting week with great speakers and lots of things to learn. This year, me and Martin Fowler did a full-day tutorial about domain specific languages.</p>
<p>During the Wednesday I spent most of my time hanging out and chatting with people. I did attend Josh Blochs and Bob Lee&#8217;s Java Puzzler presentation. This is always an entertaining hour. I also enjoyed Douglas Crockfords keynote about the history and future of JavaScript. Hearing how this all happened is always enlightening.</p>
<p>On the Thursday I had my track about languages. I think it went very well, my speakers did a great job. Eishay Smith talk about Scala, Stu Halloway about Clojure, Martin Fowler about Ruby, Jonathan Felch about Groovy and Amanda Laucher and Josh Graham about F#. I&#8217;m very happy with how it went, actually.</p>
<p>During Friday I mostly sat in on Neal Fords DSL track. My colleague Brian Guthrie started out with a strong hour about internal DSLs in various languages. Ioke got a few code examples, which was fun. After that Neal and Nate Schutta talked about MPS. I haven&#8217;t seen this much detail about MPS before so it was helpful.</p>
<p>After lunch Don Box and Amanda Laucher did a talk about the technology formerly known as Oslo. I didn&#8217;t think this tech was anything cool at all until I saw this presentation. In retrospect this was probably my favorite presentation of the conference. What came together was how you can use M as a fully typed language with some interesting characteristics, and also the extremely powerful debug features. It&#8217;s nice indeed.</p>
<p>Glenn Vanderburg put forward some arguments against language workbenches. This made for an interesting hour but I&#8217;m not entirely sure I buy his arguments. And after that Magnus Christerson from Intentional showcased what they&#8217;ve been working on lately. Very impressive stuff as usual.</p>
<p>I only spent one day at RubyConf, but it was still enough to get a feeling for what was going on, spend some time with several people I haven&#8217;t met before and so on. Good times. Charles Nutter did a very good presentation about his Ruby mutants (Duby and Surinx). After that Ryan Davis and Aaron Patterson did a hilarous presentation about weird software.</p>
<p>JRubyConf was a total success. All of the presentations were very interesting, and provided insight into what people liked about JRuby and what they wanted from it. It was fantastic to see so many people come together just for JRuby. It&#8217;s great to be part of that. I did a presentation about testing with JRuby, and then I was part of the closing panel. Both went well.</p>
<p>All in all a great week of conferences.</p>
]]></content:encoded>
			<wfw:commentRss>http://olabini.com/blog/2009/11/conference-hat-trick-qcon-rubyconf-jrubyconf/feed/</wfw:commentRss>
		</item>
		<item>
		<title>QCon San Francisco, RubyConf and JRubyConf</title>
		<link>http://olabini.com/blog/2009/11/qcon-san-francisco-rubyconf-and-jrubyconf/</link>
		<comments>http://olabini.com/blog/2009/11/qcon-san-francisco-rubyconf-and-jrubyconf/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 09:23:34 +0000</pubDate>
		<dc:creator>Ola Bini</dc:creator>
		
		<category><![CDATA[blogging]]></category>

		<category><![CDATA[jruby]]></category>

		<category><![CDATA[jrubyconf]]></category>

		<category><![CDATA[qcon]]></category>

		<category><![CDATA[qcon san francisco]]></category>

		<category><![CDATA[qconsf]]></category>

		<category><![CDATA[rubyconf]]></category>

		<category><![CDATA[san francisco]]></category>

		<guid isPermaLink="false">http://olabini.com/blog/?p=686</guid>
		<description><![CDATA[I&#8217;m gearing up for the next conference stretch. This time it&#8217;s San Francisco next week, and I really hope to see lots of people at these conferences - they are gearing up to be something special.
First QCon San Francisco. Except for JAOO, QCon is the best general developer conference I&#8217;ve ever been to. Go check [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m gearing up for the next conference stretch. This time it&#8217;s San Francisco next week, and I really hope to see lots of people at these conferences - they are gearing up to be something special.</p>
<p>First QCon San Francisco. Except for JAOO, QCon is the best general developer conference I&#8217;ve ever been to. Go check out the schedule at <a href="http://qconsf.com">http://qconsf.com</a>. This year I&#8217;m very excited about doing a full day tutorial about domain specific languages together with Martin Fowler.</p>
<p>I&#8217;m also in charge of the languages track, where I have five people who will talk about their experiences with different languages. This time there will not be much introduction to the languages, but instead experience reports, objective descriptions of what worked, what didn&#8217;t work and how you can improve your chances of success. The languages covered are Scala, Clojure, Ruby, Groovy and F#. Should be great fun.</p>
<p>Hopefully I will have lots of time to see other presentations too. There are many I would love to see. ThoughtWorks also happens to be a sponsor of QCon, so there will be a booth where it&#8217;s a big possibility you can find me or my colleagues.</p>
<p>I will do one day of RubyConf - the Saturday. Funnily enough I haven&#8217;t ever been to RubyConf, so I&#8217;m looking forward to this too.</p>
<p>Finally, the first ever JRubyConf will happen next Sunday. The program looks really interesting. I&#8217;m going to be talking about testing, and also be part of the ending JRuby Core Team panel.</p>
<p>I&#8217;m very excited about these conferences. Hope to see you there!</p>
]]></content:encoded>
			<wfw:commentRss>http://olabini.com/blog/2009/11/qcon-san-francisco-rubyconf-and-jrubyconf/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A week at Øredev</title>
		<link>http://olabini.com/blog/2009/11/a-week-at-oredev/</link>
		<comments>http://olabini.com/blog/2009/11/a-week-at-oredev/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 11:06:42 +0000</pubDate>
		<dc:creator>Ola Bini</dc:creator>
		
		<category><![CDATA[blogging]]></category>

		<category><![CDATA[conferences]]></category>

		<category><![CDATA[malmö]]></category>

		<category><![CDATA[oredev]]></category>

		<category><![CDATA[presentations]]></category>

		<guid isPermaLink="false">http://olabini.com/blog/?p=684</guid>
		<description><![CDATA[I just came back from 10 days in Malmö, Sweden, for the Øredev conference. I&#8217;ve had a great time. Part of that was because I had Stella with me, and she got to meet all my conference-friends, so that was nice.
But a big part of it is basically just the fact that Øredev is an [...]]]></description>
			<content:encoded><![CDATA[<p>I just came back from 10 days in Malmö, Sweden, for the Øredev conference. I&#8217;ve had a great time. Part of that was because I had Stella with me, and she got to meet all my conference-friends, so that was nice.</p>
<p>But a big part of it is basically just the fact that Øredev is an outstanding conference.</p>
<p>Some of my impressions, things I learned and did in no specific order:</p>
<ul>
<li>Hadoop is really cool and I wish I had time to learn more about it. Alex Loddengaard from Cloudera did a very good job introducing this technology in his tutorial. We got to do way fun stuff!</li>
<li>People liked my talk about Ioke - and I was very happy with how it went too.</li>
<li>Stuart Halloway is really good at introducing Clojure - I&#8217;m looking forward to his talk at QCon SF even more now.</li>
<li>Me, Tyler Jennings, Neal Ford, Dan North and Stuart Halloway spent several hours of BoF time to create a new BDD framework for Clojure - this was way fun hacking, interesting from a group management and design perspective and just plain fun. There is a distinct possibility that me and Neal will give a talk at the TW US Away Day about this, if anyone is interested.</li>
<li>Ze Frank is amazing. Really great evening keynote/entertainment.</li>
<li>Niclas Nilsson and Hans Brattberg did a very accurate depiction of common problems and failure modes of pair programming. Good stuff.</li>
<li>Tyler Jennings gave an introduction to Software Craftsmanship. Glad I didn&#8217;t miss this presentation. Very nicely done.</li>
<li>Kevlin Henney did a great presentation about agile modeling. I enjoyed it a lot.</li>
<li>We did a very fun closing panel that was basically just six geeks disagreeing about lots of stuff. I hope everyone else enjoyed it as much as the panel members.</li>
</ul>
<p>Conclusion: Øredev was a great conference, I was honored to get the chance to speak there and I&#8217;ll definitely try to go back next year.</p>
]]></content:encoded>
			<wfw:commentRss>http://olabini.com/blog/2009/11/a-week-at-oredev/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Should languages be multi-lingual?</title>
		<link>http://olabini.com/blog/2009/10/should-languages-be-multi-lingual/</link>
		<comments>http://olabini.com/blog/2009/10/should-languages-be-multi-lingual/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 04:36:22 +0000</pubDate>
		<dc:creator>Ola Bini</dc:creator>
		
		<category><![CDATA[ioke]]></category>

		<category><![CDATA[communication]]></category>

		<category><![CDATA[language]]></category>

		<category><![CDATA[programming language design]]></category>

		<guid isPermaLink="false">http://olabini.com/blog/?p=682</guid>
		<description><![CDATA[I&#8217;m currently sitting in the Beijing ThoughtWorks office, and for some reason language is on my mind&#8230; =)
One of the discussions related to DDD that have turned up several times the last few months at conferences
is how you handle ubiquitous language when your domain is not in English. Since most programming languages are based on [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m currently sitting in the Beijing ThoughtWorks office, and for some reason language is on my mind&#8230; =)</p>
<p>One of the discussions related to DDD that have turned up several times the last few months at conferences<br />
is how you handle ubiquitous language when your domain is not in English. Since most programming languages are based on English, you end up mixing English and Swedish for example, if you are working with a Swedish domain. Of course, the benefits of working with these concepts in Swedish are very hard to argue against. But the dichotomy between the programming language and the domain language is definitely something that hurts my eyes, so I&#8217;m generally not very fond of that approach.</p>
<p>In fact, I haven&#8217;t heard anyone come up with a good solution to this problem, and this post is not really a solution either.</p>
<p>One of the things I&#8217;ve proposed to make this situation better is to create an external DSL that is fully in the domain language. The implementation of that DSL can then be implemented in English. The main benefit is that there is a clear separation.between the domain language and the programming language. On the other hand, the overhead of creating the DSL and also the complexities involved in translating the domain concepts into programming language concepts can become problematic too.</p>
<p>One interesting idea in Cucumber is the idea that you can easily add new natural languages to write the features in. When it comes to user stories at the level of testing that Cucumber provides, it&#8217;s really important to use the right language. So it got me thinking, could you use the same kind of approach in a general programming language too?</p>
<p>As an experiment I took a small example program for Ioke, and translated it into Mandarin, with simplified Chinese characters. Of course I used Google Translate for this, so the translation is probably not very good, but the end result is still interesting. I&#8217;m not going to try to get this into my blog, so take a look at the file at github instead: <a href="http://github.com/olabini/ioke/blob/master/examples/chinese/account.ik">http://github.com/olabini/ioke/blob/master/examples/chinese/account.ik</a>. As you can see there is nothing in there that even reeks of English. If you don&#8217;t understand Chinese characters it is probably hard to see what&#8217;s happening here. Basically an Account object is created, with a &#8220;transfer&#8221; method and a &#8220;print&#8221; method. Further down, two instances of this Account object is created, some transfers are made, and then the objects are printed. But provided my translation is not too crappy, this code should make sense to someone reading Chinese.</p>
<p>Now, this is actually extremely simple to implement in Ioke, since it relies on several of the features Ioke handles very easily. That everything is a message really helps, and having everything be first class means I can alias methods and things like that without any worry. Obviously your language also need to handle non-ascii identifiers correctly, but that should be standard in this day and age.</p>
<p>When thinking about it, something similar to do this can be created in languages like Lisp, Smalltalk, Factor, Io and Haskell - but most other languages would struggle. If you have keywords in your language, it&#8217;s really a killer - you would need to branch your parser to make it happen.</p>
<p>Of course, this approach only works when you can simply translate from one word to another. If the writing system is right to left, or top to bottom, it&#8217;s much more tricky to create a good translation.</p>
<p>I&#8217;m also not sure if this is actually a really good idea or not. It might be. The other thing I&#8217;ve been thinking about is how to handle multilingual editing. What if you want to be able to switch back and forth between languages? How can you handle identifiers with more than one name. Would you want to?</p>
<p>Lots of unanswered questions here. But it&#8217;s still funny to think about. Communication is the main goal, as usual.</p>
]]></content:encoded>
			<wfw:commentRss>http://olabini.com/blog/2009/10/should-languages-be-multi-lingual/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Plan to write big software - and you have already lost</title>
		<link>http://olabini.com/blog/2009/10/plan-to-write-big-software-and-you-have-already-lost/</link>
		<comments>http://olabini.com/blog/2009/10/plan-to-write-big-software-and-you-have-already-lost/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 11:06:22 +0000</pubDate>
		<dc:creator>Ola Bini</dc:creator>
		
		<category><![CDATA[blogging]]></category>

		<category><![CDATA[architecture]]></category>

		<category><![CDATA[dynamic]]></category>

		<category><![CDATA[static]]></category>

		<category><![CDATA[typing]]></category>

		<guid isPermaLink="false">http://olabini.com/blog/?p=680</guid>
		<description><![CDATA[This idea came to me as a tweet, but was way too long for a tweet. As it turns out, it&#8217;s also something I&#8217;ve been saying a lot lately, since it&#8217;s the answer to one of the very common arguments against dynamic languages.
The argument usually goes like this: &#8220;Dynamically typed languages are fine for smaller [...]]]></description>
			<content:encoded><![CDATA[<p>This idea came to me as a tweet, but was way too long for a tweet. As it turns out, it&#8217;s also something I&#8217;ve been saying a lot lately, since it&#8217;s the answer to one of the very common arguments against dynamic languages.</p>
<p>The argument usually goes like this: &#8220;Dynamically typed languages are fine for smaller programs and simple web applications, but if you&#8217;re building something big, something that will be several millions of lines of code, you really need all the tools you can only get from a statically typed language&#8221;. Where the statically typed language mentioned is typically Java. The argument is still common enough without any specific language name mentioned though.</p>
<p>Interestingly, there are several problems and fallacies in this seemingly simple argument. I&#8217;m not going to tackle all of them here, but just focus on the beginning. Namely the idea that you are building something big. First of all, how do you know that? Have you done anything like it before? And how do you know it would be big in a different language? How do you know you can&#8217;t decouple the application in such a way you won&#8217;t have to build anything big? There are so many assumptions that can be questioned here. But at the end of the day, my glib answer that summarizes this usually goes something like this:</p>
<p>&#8220;Optimizing for your software project becoming big is the same as optimizing a car to hit a rock wall - you are optimizing for failure&#8221;</p>
<p>I firmly believe that becoming big is really failure. Once you have a big enough project you have lost. It might still work, but the cost will be extreme, and maintaining it will be a large burden too.</p>
<p>This is the reason I like agile. It emphasizes small, working pieces all the time. If you work with code this way, you can&#8217;t really become big. Instead, your project will be forced to be modularized and divided into smaller, more logical components that are highly cohesive and decoupled from each other.</p>
]]></content:encoded>
			<wfw:commentRss>http://olabini.com/blog/2009/10/plan-to-write-big-software-and-you-have-already-lost/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
