<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DUQMSX09eSp7ImA9WhBUEUg.&quot;"><id>tag:blogger.com,1999:blog-2399258289155141422</id><updated>2013-04-28T10:56:28.361-03:00</updated><category term="linux" /><category term="ubiquity" /><category term="shadoop" /><category term="scala" /><category term="bash" /><category term="tool" /><category term="mapreduce" /><category term="hadoop" /><title>Jonhnny Weslley</title><subtitle type="html">My blog</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.jonhnnyweslley.net/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.jonhnnyweslley.net/" /><author><name>Jonhnny Weslley</name><uri>http://www.blogger.com/profile/12114421477154945891</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="28" src="http://1.bp.blogspot.com/_WfgfddljjCE/S59qsWkqHTI/AAAAAAAAAm8/M15hKoIRWvQ/S220/piu-resized.png" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>5</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/JonhnnyWeslley" /><feedburner:info uri="jonhnnyweslley" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by/3.0/" /><logo>http://creativecommons.org/images/public/somerights20.gif</logo><feedburner:emailServiceId>JonhnnyWeslley</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;DE4CQXs5fCp7ImA9Wx9QFEo.&quot;"><id>tag:blogger.com,1999:blog-2399258289155141422.post-539286453463963980</id><published>2008-09-12T00:02:00.005-03:00</published><updated>2010-12-27T16:09:20.524-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-27T16:09:20.524-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tool" /><category scheme="http://www.blogger.com/atom/ns#" term="scala" /><title>Scala Shell</title><content type="html">&lt;p&gt;&lt;em&gt;Scala Shell&lt;/em&gt; (scalash) is a &lt;a href="http://en.wikipedia.org/wiki/Shell_%28computing%29"&gt;shell&lt;/a&gt; for programming in &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt;. Scalash is run from the &lt;a href="http://en.wikipedia.org/wiki/Command_line_interface"&gt;command line&lt;/a&gt; and allows the programmer to experiment with code in real time. It allows you to enter Scala commands at the prompt and have the interpreter respond immediately.&lt;/p&gt;
&lt;p&gt;A quick summary of the features present:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;colourized output (&lt;em&gt;highlighting&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;auto-completion, aka &lt;a href="http://en.wikipedia.org/wiki/Tab_completion"&gt;Tab-completion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;start script support - when an interactive shell is started, &lt;a href="http://code.google.com/p/scalashell/"&gt;Scala Shell&lt;/a&gt; reads and executes commands from &lt;code&gt;~/.scalarc&lt;/code&gt;, if that file exists.&lt;/li&gt;
&lt;li&gt;persistent history (&lt;code&gt;~/.scala_history&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Command_history"&gt;command history&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;command load&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;iframe src="http://player.vimeo.com/video/1709559" width="400" height="225" frameborder="0"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;You can install the current release directly with Scala Bazaar:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;sbaz&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;
&lt;span class="n"&gt;sbaz&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;scalashell&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;scala&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JonhnnyWeslley/~4/wUSUinZM7A4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.jonhnnyweslley.net/feeds/539286453463963980/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.jonhnnyweslley.net/2008/09/scala-shell.html#comment-form" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2399258289155141422/posts/default/539286453463963980?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2399258289155141422/posts/default/539286453463963980?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JonhnnyWeslley/~3/wUSUinZM7A4/scala-shell.html" title="Scala Shell" /><author><name>Jonhnny Weslley</name><uri>http://www.blogger.com/profile/12114421477154945891</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="28" src="http://1.bp.blogspot.com/_WfgfddljjCE/S59qsWkqHTI/AAAAAAAAAm8/M15hKoIRWvQ/S220/piu-resized.png" /></author><thr:total>7</thr:total><feedburner:origLink>http://blog.jonhnnyweslley.net/2008/09/scala-shell.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQCQH8_eCp7ImA9WhZTEko.&quot;"><id>tag:blogger.com,1999:blog-2399258289155141422.post-5052081833947447826</id><published>2008-09-07T00:00:00.000-03:00</published><updated>2011-03-16T09:26:01.140-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-16T09:26:01.140-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ubiquity" /><category scheme="http://www.blogger.com/atom/ns#" term="scala" /><title>Scala API lookup with Ubiquity</title><content type="html">&lt;p&gt;A quickly hacked up &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt; &lt;a href="http://www.scala-lang.org/docu/files/api/index.html"&gt;API&lt;/a&gt; lookup for &lt;a href="https://wiki.mozilla.org/Labs/Ubiquity/"&gt;Ubiquity&lt;/a&gt;, the first prototype of a natural language web service connector created by &lt;a href="http://labs.mozilla.com/"&gt;Mozilla Labs&lt;/a&gt;. It basically prepends a google search with the site: parameter pointing to the Scala API. Click &lt;a href="http://jweslley.github.com/ubiquity/scala.html"&gt;here&lt;/a&gt; to install it.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JonhnnyWeslley/~4/EIrczNJPGHU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.jonhnnyweslley.net/feeds/5052081833947447826/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.jonhnnyweslley.net/2008/09/scala-api-lookup-with-ubiquity.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2399258289155141422/posts/default/5052081833947447826?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2399258289155141422/posts/default/5052081833947447826?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JonhnnyWeslley/~3/EIrczNJPGHU/scala-api-lookup-with-ubiquity.html" title="Scala API lookup with Ubiquity" /><author><name>Jonhnny Weslley</name><uri>http://www.blogger.com/profile/12114421477154945891</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="28" src="http://1.bp.blogspot.com/_WfgfddljjCE/S59qsWkqHTI/AAAAAAAAAm8/M15hKoIRWvQ/S220/piu-resized.png" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.jonhnnyweslley.net/2008/09/scala-api-lookup-with-ubiquity.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUUAQH8yfSp7ImA9Wx9QFEo.&quot;"><id>tag:blogger.com,1999:blog-2399258289155141422.post-255813948019679515</id><published>2008-08-26T22:40:00.023-03:00</published><updated>2010-12-27T16:14:01.195-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-27T16:14:01.195-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="scala" /><title>Escape from Zurg</title><content type="html">&lt;p&gt;A long time ago, I got fascinated with the &lt;a href="http://web.engr.oregonstate.edu/%7Eerwig/zurg/"&gt;Zurg riddle&lt;/a&gt;. Aka &lt;a href="http://web.engr.oregonstate.edu/%7Eerwig/papers/Zurg_JFP04.pdf"&gt;Escape from Zurg&lt;/a&gt;, the Zurg riddle is a puzzle (featuring characters from the movie &lt;a href="http://en.wikipedia.org/wiki/Toy_Story"&gt;Toy Story&lt;/a&gt;) which has been used to teach students Logic Programming. Recently, Sam Halliday from the &lt;a href="http://javablog.co.uk/"&gt;Javablog&lt;/a&gt; wrote a blog post with a &lt;a href="http://javablog.co.uk/2007/10/13/escape-from-zurg/"&gt;Java implementation&lt;/a&gt;, and Paul Butcher from the &lt;a href="http://texperts.com/"&gt;Texperts&lt;/a&gt; wrote another blog post with a &lt;a href="http://www.texperts.com/2007/09/09/escape-from-zurg/"&gt;Ruby implementation&lt;/a&gt; of &lt;a href="http://web.engr.oregonstate.edu/%7Eerwig/papers/Zurg_JFP04.pdf"&gt;Escape from Zurg&lt;/a&gt;. Others implementations can to be find &lt;a href="http://lambda-the-ultimate.org/node/2434"&gt;here&lt;/a&gt;. However it wasn&amp;#8217;t long before I got the craving to write a &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt; version. The idea is not to solve this specific problem, but to use it to show some Scala features.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s the puzzle:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Buzz_Lightyear"&gt;Buzz&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Sheriff_Woody#Woody"&gt;Woody&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Rex_%28Toy_Story%29#Rex"&gt;Rex&lt;/a&gt;, and &lt;a href="http://en.wikipedia.org/wiki/Hamm_%28Toy_Story%29#Hamm"&gt;Hamm&lt;/a&gt; have to escape from &lt;a href="http://en.wikipedia.org/wiki/Emperor_Zurg"&gt;Zurg&lt;/a&gt;. They merely have to cross one last bridge before they are free. However, the bridge is fragile and can hold at most two of them at the same time. Moreover, to cross the bridge a flashlight is needed to avoid traps and broken parts. The problem is that our friends have only one flashlight with one battery that lasts for only 60 minutes. The toys need different times to cross the bridge (in either direction):&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Buzz&lt;/strong&gt;: 5 minutes &lt;br&gt;
&lt;strong&gt;Woody&lt;/strong&gt;: 10 minutes &lt;br&gt;
&lt;strong&gt;Rex&lt;/strong&gt;: 20 minutes &lt;br&gt;
&lt;strong&gt;Hamm&lt;/strong&gt;: 25 minutes &lt;br&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Since there can be only two toys on the bridge at the same time, they cannot cross the bridge all at once. Since they need the flashlight to cross the bridge, whenever two have crossed the bridge, somebody has to go back and bring the flashlight to those toys on the other side that still have to cross the bridge.&lt;/p&gt;
&lt;p&gt;The problem is: In which order can the four toys cross the bridge in time (that is, in 60 minutes) to be saved from Zurg?&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s start defining the Toys as a case class with &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;time&lt;/code&gt; fields.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Toy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Like as the Toys, the sides of the bridge are case classes, in truth, case objects.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;abstract&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Direction&lt;/span&gt;
&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="k"&gt;object&lt;/span&gt; &lt;span class="nc"&gt;Left&lt;/span&gt; &lt;span class="k"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Direction&lt;/span&gt;
&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="k"&gt;object&lt;/span&gt; &lt;span class="nc"&gt;Right&lt;/span&gt; &lt;span class="k"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Direction&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2&gt;What are case classes/objects?&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Case classes&lt;/em&gt; and &lt;em&gt;case objects&lt;/em&gt; are defined like a normal classes or objects, except that the definition is prefixed with the modifier case. The case modifier in front of a class or object definition has the following effects:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Case classes implicitly come with a constructor function, with the same name as the class.&lt;/li&gt;
&lt;li&gt;Case classes and case objects implicitly come with implementations of methods &lt;code&gt;toString&lt;/code&gt;, &lt;code&gt;equals&lt;/code&gt; and &lt;code&gt;hashCode&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Case classes implicitly come with nullary accessor methods which retrieve the constructor arguments.&lt;/li&gt;
&lt;li&gt;Case classes allow the constructions of patterns which refer to the case class constructor (Pattern Matching).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For more details about case classes/objects see &lt;a href="http://alblue.blogspot.com/2007/12/scala-introduction-to-scala-case.html"&gt;here&lt;/a&gt; or in &lt;a href="http://www.scala-lang.org/docu/index.html"&gt;Scala Documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Next, we define &lt;code&gt;Move&lt;/code&gt; which we will use to represent transitions between states. Each move consists of a direction (right or left) and a group of toys. &lt;code&gt;Move&lt;/code&gt; provides two methods, the cost method which returns the time taken to complete the move and the overrided &lt;code&gt;toString&lt;/code&gt; method which provides a better print version from the move.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Move&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;direction&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Direction&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;toys&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Toy&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;cost&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Iterable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;toys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;})&lt;/span&gt;

  &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;toString&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Move: &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;toys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="n"&gt;mkString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;[&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;,&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;]&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;A &lt;code&gt;State&lt;/code&gt; comprises two fields, &lt;code&gt;direction&lt;/code&gt; which represents the current flashlight position and &lt;code&gt;group&lt;/code&gt; which represents the toys remaining on the left-hand side of the bridge.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;State&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;direction&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Direction&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Toy&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isEmpty&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Move&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;State&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Unit&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt; &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Left&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;tuple&lt;/span&gt; &lt;span class="k"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zipWithIndex&lt;/span&gt;
                       &lt;span class="n"&gt;toy&lt;/span&gt; &lt;span class="k"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="n"&gt;drop&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tuple&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                       &lt;span class="n"&gt;toys&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;toy&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tuple&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
                   &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Move&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Right&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;toys&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;State&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Right&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="n"&gt;toys&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;

    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Right&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;toy&lt;/span&gt; &lt;span class="k"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ToyStory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toys&lt;/span&gt; &lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
                    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Move&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Left&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;toy&lt;/span&gt;&lt;span class="o"&gt;)),&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;State&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Left&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;toy&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2&gt;What are the Scala features in State class?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;First-Class Functions&lt;/li&gt;
&lt;li&gt;Pattern Matching&lt;/li&gt;
&lt;li&gt;For-Comprehensions&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;First-Class Functions&lt;/h3&gt;
&lt;p&gt;In Scala each function is a &amp;#8220;first-class value&amp;#8221;. Like any other value, it may be passed as a parameter or returned as a result. Functions which take other functions as parameters or return them as results are called higher-order functions. The &lt;code&gt;next&lt;/code&gt; method takes a function from the type &lt;code&gt;(Move, State) =&amp;gt; Unit&lt;/code&gt; as parameter named &lt;code&gt;f&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For more details about functions see &lt;a href="http://alblue.blogspot.com/2007/10/scala-introduction-to-scala-functions.html"&gt;here&lt;/a&gt; or in &lt;a href="http://www.scala-lang.org/docu/index.html"&gt;Scala Documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Pattern Matching&lt;/h3&gt;
&lt;p&gt;Scala has a built-in general pattern matching mechanism. Pattern matching is a generalization of C or Java&amp;#8217;s switch statement to class hierarchies. Instead of a switch statement, there is a standard method &lt;code&gt;match&lt;/code&gt;, which is defined in Scala’s root class Any, and therefore is available for all objects. The &lt;code&gt;match&lt;/code&gt; method takes as argument a number of cases. Scala&amp;#8217;s pattern matching statement is most useful for matching on algebraic types expressed via &lt;a href="http://www.scala-lang.org/intro/caseclasses.html"&gt;case classes&lt;/a&gt;. Scala also allows the definition of patterns independently of case classes, using unapply methods in &lt;a href="http://www.scala-lang.org/intro/extractors.html"&gt;extractor objects&lt;/a&gt;. The &lt;code&gt;next&lt;/code&gt; method starts with the statement: &lt;code&gt;direction match...&lt;/code&gt;, a pattern matching expression with two options: &lt;code&gt;Left&lt;/code&gt; and &lt;code&gt;Right&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For more details about pattern matching and extractor objects see &lt;a href="http://langexplr.blogspot.com/2007/05/pattern-matching-on-java-objects-with.html"&gt;here&lt;/a&gt; or in &lt;a href="http://www.scala-lang.org/docu/index.html"&gt;Scala Documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;For-Comprehensions&lt;/h3&gt;
&lt;p&gt;Scala offers special syntax to express combinations of certain higher-order functions more naturally. For comprehensions are a generalization of list comprehensions found in languages like Haskell and Python. They are mapped to combinations involving methods &lt;code&gt;foreach&lt;/code&gt; and &lt;code&gt;filter&lt;/code&gt;. For instance, the for loop &lt;code&gt;for (path &amp;lt;- problem) ...&lt;/code&gt; in ToyStory object is mapped to &lt;code&gt;problem foreach (path =&amp;gt; ...)&lt;/code&gt; defined in &lt;code&gt;SearchProblem&lt;/code&gt; class.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SearchProblem&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;initial&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;State&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;foreach&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Move&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Unit&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;solve&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Move&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;State&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;move&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;solve&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;move&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;solve&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Nil&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;initial&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;object&lt;/span&gt; &lt;span class="nc"&gt;ToyStory&lt;/span&gt; &lt;span class="k"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Application&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

  &lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="n"&gt;toys&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Toy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Buzz&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="nc"&gt;Toy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Woody&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="nc"&gt;Toy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Rex&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="nc"&gt;Toy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Hamm&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="nc"&gt;Nil&lt;/span&gt;

  &lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="n"&gt;problem&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SearchProblem&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;State&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Left&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;toys&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; 
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="k"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="n"&gt;problem&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;/:&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{(&lt;/span&gt;&lt;span class="n"&gt;cost&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;move&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;cost&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;move&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cost&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Solution: &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The complete source code can be downloaded &lt;a href="http://docs.google.com/Doc?id=dfzs39d9_4kz3cwh"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JonhnnyWeslley/~4/NrALQUMmqjk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.jonhnnyweslley.net/feeds/255813948019679515/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.jonhnnyweslley.net/2008/08/escape-from-zurg.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2399258289155141422/posts/default/255813948019679515?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2399258289155141422/posts/default/255813948019679515?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JonhnnyWeslley/~3/NrALQUMmqjk/escape-from-zurg.html" title="Escape from Zurg" /><author><name>Jonhnny Weslley</name><uri>http://www.blogger.com/profile/12114421477154945891</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="28" src="http://1.bp.blogspot.com/_WfgfddljjCE/S59qsWkqHTI/AAAAAAAAAm8/M15hKoIRWvQ/S220/piu-resized.png" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.jonhnnyweslley.net/2008/08/escape-from-zurg.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEBQHY7fSp7ImA9WhZTEko.&quot;"><id>tag:blogger.com,1999:blog-2399258289155141422.post-3704949989248718184</id><published>2008-08-22T00:44:00.008-03:00</published><updated>2011-03-16T09:30:51.805-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-16T09:30:51.805-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="bash" /><category scheme="http://www.blogger.com/atom/ns#" term="scala" /><title>Guide to Scala Bazaar auto completion using BASH</title><content type="html">&lt;p&gt;The &lt;a href="http://www.scala-lang.org/node/93"&gt;Scala Bazaar&lt;/a&gt; system, &amp;#8220;sbaz&amp;#8221; in short, is a system used by &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt; enthusiasts to share computer files with each other. In particular, it makes it easy to share libraries and applications. In this post, I&amp;#8217;ll show you how easy it to use one of the nicest facilities of the modern shell, the built in &amp;#8220;completion&amp;#8221; support, to become more easy to use sbaz in command line.&lt;/p&gt;
&lt;p&gt;First you must go to the following site to install the BASH programmable auto completion setup if your distro doesn&amp;#8217;t have it by default. I don&amp;#8217;t think many do so you&amp;#8217;ll need to go to the &lt;a href="http://www.caliban.org/bash/index.shtml#completion"&gt;Programmable Completion Website&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Once you&amp;#8217;ve setup your system for auto completion you need to take the following:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

_sbaz_complete&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;local &lt;/span&gt;cur commands

  &lt;span class="nv"&gt;COMPREPLY&lt;/span&gt;&lt;span class="o"&gt;=()&lt;/span&gt;
  &lt;span class="nv"&gt;cur&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;COMP_WORDS&lt;/span&gt;&lt;span class="p"&gt;[COMP_CWORD]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;

  &lt;span class="nv"&gt;commands&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;available compact help install installed keycreate keyforget keyknown&lt;/span&gt;
&lt;span class="s1"&gt;  keyremember keyremoteknown keyrevoke pack remove retract setuniverse setup share show&lt;/span&gt;
&lt;span class="s1"&gt;  showuniverse update packages upgrade&amp;#39;&lt;/span&gt;
  &lt;span class="nv"&gt;cur&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$cur&lt;/span&gt; | sed &lt;span class="s1"&gt;&amp;#39;s/\\\\//g&amp;#39;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;

  &lt;span class="nv"&gt;COMPREPLY&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;compgen&lt;/span&gt; -W &lt;span class="s2"&gt;&amp;quot;${commands}&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;cur&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; | sed &lt;span class="s1"&gt;&amp;#39;s/\\\\//g&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;complete&lt;/span&gt; -F _sbaz_complete -o filenames sbaz
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And place it in &lt;code&gt;/etc/bash_completion.d/sbaz&lt;/code&gt;. Once you&amp;#8217;ve done that the next time you start up your BASH shell you will have sbaz auto completion!&lt;/p&gt;
&lt;p&gt;Download the source code &lt;a href="http://github.com/jweslley/dotfiles/blob/master/lib/completion/sbaz.bash"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JonhnnyWeslley/~4/RLcnwee-qv0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.jonhnnyweslley.net/feeds/3704949989248718184/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.jonhnnyweslley.net/2008/08/guide-to-scala-bazaar-auto-completion.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2399258289155141422/posts/default/3704949989248718184?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2399258289155141422/posts/default/3704949989248718184?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JonhnnyWeslley/~3/RLcnwee-qv0/guide-to-scala-bazaar-auto-completion.html" title="Guide to Scala Bazaar auto completion using BASH" /><author><name>Jonhnny Weslley</name><uri>http://www.blogger.com/profile/12114421477154945891</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="28" src="http://1.bp.blogspot.com/_WfgfddljjCE/S59qsWkqHTI/AAAAAAAAAm8/M15hKoIRWvQ/S220/piu-resized.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.jonhnnyweslley.net/2008/08/guide-to-scala-bazaar-auto-completion.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcGQnk4eip7ImA9Wx9QFEo.&quot;"><id>tag:blogger.com,1999:blog-2399258289155141422.post-6054485996627823526</id><published>2008-05-14T22:10:00.007-03:00</published><updated>2010-12-27T16:10:23.732-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-27T16:10:23.732-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="shadoop" /><category scheme="http://www.blogger.com/atom/ns#" term="mapreduce" /><category scheme="http://www.blogger.com/atom/ns#" term="scala" /><category scheme="http://www.blogger.com/atom/ns#" term="hadoop" /><title>SHadoop</title><content type="html">&lt;h2&gt;What is Scala and Hadoop?&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt; is a modern multi-paradigm programming language designed to express common programming patterns in a concise, and type-safe way. It smoothly integrates features of object-oriented and functional languages including mixins, algebraic datatypes with pattern matching, genericity, and more.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://hadoop.apache.org/core/"&gt;Hadoop&lt;/a&gt; is a free Java software platform that supports running applications to process vast amounts of data. It has been developed under the &lt;a href="http://lucene.apache.org/"&gt;Apache Lucene&lt;/a&gt; Project and was originally developed to support distribution for &lt;a href="http://lucene.apache.org/nutch/"&gt;Nutch&lt;/a&gt;, which is an effort to build an open source search engine for the search and index component. Hadoop consists of an open source implementation of Google’s published computing infrastructure, specifically &lt;a href="http://labs.google.com/papers/mapreduce.html"&gt;MapReduce&lt;/a&gt; and the &lt;a href="http://labs.google.com/papers/gfs.html"&gt;Google File System&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Scala + Hadoop!?&lt;/h2&gt;
&lt;p&gt;The &lt;a href="http://wiki.apache.org/hadoop/HadoopMapReduce"&gt;Hadoop Map-Reduce&lt;/a&gt; framework is map based, whose keys and values are serializable objects which implements a simple serialization protocol. This serialization protocol is defined by the &lt;a href="http://hadoop.apache.org/core/docs/current/api/org/apache/hadoop/io/Writable.html"&gt;Writable&lt;/a&gt; interface. In addition, Hadoop provides &lt;code&gt;Writable&lt;/code&gt;&amp;#8216;s implementations for each basic types(&lt;code&gt;Ints&lt;/code&gt;, &lt;code&gt;Long&lt;/code&gt;, &lt;code&gt;Float&lt;/code&gt;, &lt;code&gt;String&lt;/code&gt;, &amp;#8230;). This implementations wrap a value of the basic type in an &lt;code&gt;Writable&lt;/code&gt; object. Let us take this example, and think about possible utilization of int values in Hadoop:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;IntWritable&lt;/span&gt; &lt;span class="n"&gt;one&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;IntWritable&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Sounds like primitive wrappers before Java 5 boxing!&lt;/p&gt;
&lt;h2&gt;Why Scala?&lt;/h2&gt;
&lt;p&gt;Read &lt;a href="http://www.infoq.com/news/2008/01/why-scala"&gt;this&lt;/a&gt; and &lt;a href="http://www.drmaciver.com/2008/01/why-not-scala/"&gt;this&lt;/a&gt;. Moreover, Scala offers a bag of others features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Implicit conversion methods&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Implicit methods that are often used for converting types, essentially give you statically guaranteed and provided dynamic scoping. Implicit conversions between types (You know the way a number get implicitly converted to another number type in Java, e.g. &lt;code&gt;int&lt;/code&gt; to &lt;code&gt;long&lt;/code&gt;, &lt;code&gt;short&lt;/code&gt; to &lt;code&gt;int&lt;/code&gt;, &amp;#8230;? Scala does that too, but it&amp;#8217;s all programmer definable. They&amp;#8217;re just library functions in &lt;a href="http://www.scala-lang.org/docu/files/api/scala/Predef$object.html"&gt;scala.Predef&lt;/a&gt;).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Type inference&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;The Scala compiler can oftentimes infer the type of an object so there is no need to explicitly specify the type. It is, for instance, often not necessary in Scala to specify the type of a variable, since the compiler can deduce the type from the initialization expression of the variable. Also return types of methods can often be omitted since they corresponds to the type of the body, which gets inferred by the compiler.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In short, Scala provides a clear, concise and stylized syntax.&lt;/p&gt;
&lt;h2&gt;SHadoop = Scala + Hadoop&lt;/h2&gt;
&lt;p&gt;What we would like is something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="n"&gt;one&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Or like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;LongWritable&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Text&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;OutputCollector&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Text&lt;/span&gt;, &lt;span class="kt"&gt;IntWritable&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="n"&gt;reporter&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Reporter&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt;
  &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="n"&gt;split&lt;/span&gt; &lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;foreach&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="n"&gt;collect&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;one&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The interesting point is that with Scala, this is quite simple to implement. SHadoop is the proof!!! SHadoop consists in only one &lt;a href="http://code.google.com/p/jweslley/source/browse/trunk/scala/shadoop/src/main/scala/shadoop/SHadoop.scala"&gt;source file&lt;/a&gt; containing a Scala object with some implicit methods that are often used for converting primitives Java types (including &lt;code&gt;String&lt;/code&gt;) to &lt;code&gt;Writable&lt;/code&gt; instances. Furthermore, the SHadoop object provides implicit methods that are often used for converting writable java iterators to primitives type scala iterators - scala iterators provides a lot of useful methods, like &lt;code&gt;foreach&lt;/code&gt;, &lt;code&gt;map&lt;/code&gt;, &lt;code&gt;filter&lt;/code&gt; and &lt;a href="http://www.scala-lang.org/docu/files/api/scala/Iterator.html"&gt;others&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Usage&lt;/h2&gt;
&lt;p&gt;The &lt;a href="http://hadoop.apache.org/core/docs/r0.15.3/mapred_tutorial.html"&gt;Hadoop Map-Reduce Tutorial&lt;/a&gt; shows a very simple Map-Reduce application that counts the number of occurences of each word in a given input set.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Source Code - &lt;a href="http://code.google.com/p/jweslley/source/browse/trunk/scala/shadoop/src/main/scala/shadoop/SHadoop.scala"&gt;WordCount.scala&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;shadoop&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;SHadoop._&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.Iterator&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.hadoop.fs._&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.hadoop.io._&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.hadoop.mapred._&lt;/span&gt;

&lt;span class="k"&gt;object&lt;/span&gt; &lt;span class="nc"&gt;WordCount&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Map&lt;/span&gt; &lt;span class="k"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;MapReduceBase&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;Mapper&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;LongWritable&lt;/span&gt;, &lt;span class="kt"&gt;Text&lt;/span&gt;, &lt;span class="kt"&gt;Text&lt;/span&gt;, &lt;span class="kt"&gt;IntWritable&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="n"&gt;one&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;LongWritable&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Text&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;OutputCollector&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Text&lt;/span&gt;, &lt;span class="kt"&gt;IntWritable&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="n"&gt;reporter&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Reporter&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt;
      &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="n"&gt;split&lt;/span&gt; &lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;foreach&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="n"&gt;collect&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;one&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Reduce&lt;/span&gt; &lt;span class="k"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;MapReduceBase&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;Reducer&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Text&lt;/span&gt;, &lt;span class="kt"&gt;IntWritable&lt;/span&gt;, &lt;span class="kt"&gt;Text&lt;/span&gt;, &lt;span class="kt"&gt;IntWritable&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;reduce&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Text&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Iterator&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;IntWritable&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt;
      &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;OutputCollector&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Text&lt;/span&gt;, &lt;span class="kt"&gt;IntWritable&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="n"&gt;reporter&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Reporter&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

      &lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="n"&gt;reduceLeft&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="n"&gt;collect&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Array&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="n"&gt;conf&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;JobConf&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;classOf&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;conf&lt;/span&gt; &lt;span class="n"&gt;setJobName&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;wordCount&amp;quot;&lt;/span&gt;

    &lt;span class="n"&gt;conf&lt;/span&gt; &lt;span class="n"&gt;setOutputKeyClass&lt;/span&gt; &lt;span class="n"&gt;classOf&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Text&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;conf&lt;/span&gt; &lt;span class="n"&gt;setOutputValueClass&lt;/span&gt; &lt;span class="n"&gt;classOf&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;IntWritable&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;conf&lt;/span&gt; &lt;span class="n"&gt;setMapperClass&lt;/span&gt; &lt;span class="n"&gt;classOf&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;conf&lt;/span&gt; &lt;span class="n"&gt;setCombinerClass&lt;/span&gt; &lt;span class="n"&gt;classOf&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Reduce&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;conf&lt;/span&gt; &lt;span class="n"&gt;setReducerClass&lt;/span&gt; &lt;span class="n"&gt;classOf&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Reduce&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;conf&lt;/span&gt; &lt;span class="n"&gt;setInputFormat&lt;/span&gt; &lt;span class="n"&gt;classOf&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;TextInputFormat&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;conf&lt;/span&gt; &lt;span class="n"&gt;setOutputFormat&lt;/span&gt; &lt;span class="n"&gt;classOf&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;TextOutputFormat&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="k"&gt;_&lt;/span&gt; &lt;span class="k"&gt;&amp;lt;:&lt;/span&gt; &lt;span class="kt"&gt;WritableComparable&lt;/span&gt;, &lt;span class="k"&gt;_&lt;/span&gt; &lt;span class="k"&gt;&amp;lt;:&lt;/span&gt; &lt;span class="kt"&gt;Writable&lt;/span&gt;&lt;span class="o"&gt;]]&lt;/span&gt;

    &lt;span class="n"&gt;conf&lt;/span&gt; &lt;span class="n"&gt;setInputPath&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;conf&lt;/span&gt; &lt;span class="n"&gt;setOutputPath&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;

    &lt;span class="nc"&gt;JobClient&lt;/span&gt; &lt;span class="n"&gt;runJob&lt;/span&gt; &lt;span class="n"&gt;conf&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2&gt;Source code explained: Java x Scala&lt;/h2&gt;
&lt;h3&gt;1. The one field from the Map class&lt;/h3&gt;
&lt;p&gt;Java&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;IntWritable&lt;/span&gt; &lt;span class="n"&gt;one&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;IntWritable&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Scala&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="n"&gt;one&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Scala to specify the type of the field by type inference. Very cool!!!&lt;/p&gt;
&lt;h3&gt;2. The map method from the Map class&lt;/h3&gt;
&lt;p&gt;Java&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LongWritable&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                 &lt;span class="n"&gt;OutputCollector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IntWritable&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Reporter&lt;/span&gt; &lt;span class="n"&gt;reporter&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;IOException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

  &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;StringTokenizer&lt;/span&gt; &lt;span class="n"&gt;tokenizer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;StringTokenizer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasMoreTokens&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nextToken&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;one&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Scala&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;LongWritable&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Text&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
         &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;OutputCollector&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Text&lt;/span&gt;, &lt;span class="kt"&gt;IntWritable&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="n"&gt;reporter&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Reporter&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt;
  &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="n"&gt;split&lt;/span&gt; &lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;foreach&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="n"&gt;collect&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;one&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Wow!!! Scala implicitly converts value to &lt;code&gt;String&lt;/code&gt; and applies String&amp;#8217;s &lt;code&gt;split&lt;/code&gt; method that returns a String array. This array iterate over each String adding it as key(implicitly converted to &lt;code&gt;Text&lt;/code&gt;) from &lt;code&gt;output&lt;/code&gt; object and whose value is &lt;code&gt;one&lt;/code&gt;. Note: Scala doesn&amp;#8217;t require semicolons at the end of each instruction, they are optionals.&lt;/p&gt;
&lt;h3&gt;3. The reduce method from the Reduce class&lt;/h3&gt;
&lt;p&gt;Java&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Iterator&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IntWritable&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;OutputCollector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IntWritable&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Reporter&lt;/span&gt; &lt;span class="n"&gt;reporter&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;IOException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasNext&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;IntWritable&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Scala&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;reduce&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Text&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Iterator&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;IntWritable&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt;
            &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;OutputCollector&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Text&lt;/span&gt;, &lt;span class="kt"&gt;IntWritable&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="n"&gt;reporter&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Reporter&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="n"&gt;reduceLeft&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="n"&gt;collect&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Again, wow!!! On first line Scala calculates the sum of the values using the &lt;code&gt;reduceLeft&lt;/code&gt; method from a &lt;code&gt;Int&lt;/code&gt; iterator, implicitly converted from &lt;code&gt;IntWritable&lt;/code&gt; java iterator. After, the &lt;code&gt;output&lt;/code&gt; object collects the sum result.&lt;/p&gt;
&lt;h2&gt;Running&lt;/h2&gt;
&lt;p&gt;Assuming &lt;code&gt;HADOOP_HOME&lt;/code&gt; is the root of the installation from Hadoop:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Copy the &lt;code&gt;scala-library.jar&lt;/code&gt; to &lt;code&gt;${HADOOP_HOME}/lib&lt;/code&gt; directory&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the application:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;HADOOP_HOME&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;/bin/hadoop jar shadoop-0.0.1-alpha.jar shadoop.WordCount input/ output/
&lt;/pre&gt;&lt;/div&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;input/&lt;/code&gt; - a directory containing the text-files as input set &lt;br&gt;
&lt;code&gt;ouput/&lt;/code&gt; - a ouput directory&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Download jar with sources &lt;a href="http://jweslley.googlecode.com/files/shadoop-0.0.1-alpha.jar"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JonhnnyWeslley/~4/Dj3jOYVBgcg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.jonhnnyweslley.net/feeds/6054485996627823526/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.jonhnnyweslley.net/2008/05/shadoop.html#comment-form" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2399258289155141422/posts/default/6054485996627823526?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2399258289155141422/posts/default/6054485996627823526?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/JonhnnyWeslley/~3/Dj3jOYVBgcg/shadoop.html" title="SHadoop" /><author><name>Jonhnny Weslley</name><uri>http://www.blogger.com/profile/12114421477154945891</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="28" src="http://1.bp.blogspot.com/_WfgfddljjCE/S59qsWkqHTI/AAAAAAAAAm8/M15hKoIRWvQ/S220/piu-resized.png" /></author><thr:total>9</thr:total><feedburner:origLink>http://blog.jonhnnyweslley.net/2008/05/shadoop.html</feedburner:origLink></entry></feed>
