<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:planet="http://planet.intertwingly.net/" xmlns:indexing="urn:atom-extension:indexing" indexing:index="no"><access:restriction xmlns:access="http://www.bloglines.com/about/specs/fac-1.0" relationship="deny"/>
  <title>Planet Scala</title>
  <updated>2012-02-06T22:40:39Z</updated>
  <generator uri="http://intertwingly.net/code/venus/">Venus</generator>
  <author>
    <name>James Iry</name>
    <email>jamesiry@gmail.com</email>
  </author>
  <id>http://www.planetscala.com/atom.xml</id>
  <link href="http://www.planetscala.com/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="http://www.planetscala.com" rel="alternate"/>

  <entry>
    <id>http://implicit.ly/scala-ssh-050</id>
    <link href="http://implicit.ly/scala-ssh-050" rel="alternate" type="text/html"/>
    <title>scala-ssh 0.5.0</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><p><em>scala-ssh</em> is a Scala library providing remote shell access via SSH.
It builds on <a href="https://github.com/shikhar/sshj">sshj</a> to provide the following features:
</p><ul><li>Remote execution of one or more shell commands
</li><li>Access to <code>stdin</code>, <code>stdout</code>, <code>stderr</code> and exitcode of remote shell commands
</li><li>Authentication via password or public key
</li><li>Host key verification via <code>known_hosts</code> file or explicit fingerprint
</li><li>Convenient configuration of remote host properties via config file, resource or directly in code
</li><li>Scala-idiomatic API
</li></ul><div class="about"> <p><em>scala-ssh</em> is a Scala library providing remote shell access via SSH.
</p> </div>

<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/scala-ssh-050">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-02-06T17:01:12Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-06T17:20:09Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/sbt-revolver-060</id>
    <link href="http://implicit.ly/sbt-revolver-060" rel="alternate" type="text/html"/>
    <title>sbt-revolver 0.6.0</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><p>This second release addresses a few problems:
</p><ul><li>Renamed <code>re:start</code>, <code>re:stop</code> and <code>re:status</code> tasks to <code>re-start</code>, <code>re-stop</code> and <code>re-status</code> respectively
for more key "uniqueness" (i.e. decreased likelyhood of key-name collisions)
</li><li>Added option for configuring mainClass independently for <code>re-start</code> task
</li><li>Fixed #3 (Not working if there are multiple main classes)
</li><li>Closed #5 (Add option to specify CLI args for the forked JVM)
</li><li>Improved documentation</li></ul><div class="about"> <p><a href="https://github.com/spray/sbt-revolver">sbt-revolver</a> is an <a href="https://github.com/harrah/xsbt/wiki">SBT</a> plugin for dangerously fast development turnaround in Scala.
</p><p>It sports the following features:
</p><ul><li>Starting and stopping your application in the background of your interactive SBT shell (in a forked JVM)
</li><li>Triggered restart: automatically restart your application as soon as some of its sources have been changed
</li><li>Hot reloading: automatically reload the respective classes into your running application as soon as some
of its sources have been changed, no restart necessary (requires <a href="http://zeroturnaround.com/jrebel/">JRebel</a>, which is free for Scala development)
</li></ul> </div>

<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/sbt-revolver-060">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-02-06T15:14:33Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-06T17:20:09Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://code.technically.us/post/17152825587</id>
    <link href="http://code.technically.us/post/17152825587" rel="alternate" type="text/html"/>
    <title>HeapAudit – JVM Memory Profiler for the Real World</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><a href="http://www.readability.com/articles/qnqko6hi">HeapAudit – JVM Memory Profiler for the Real World</a>: <blockquote>
  <p>HeapAudit is a foursquare open source project designed for understanding JVM heap allocations. It is implemented as a Java agent built on top of ASM.</p>
</blockquote>

<p>Neat.</p></div>
    </summary>
    <updated>2012-02-06T14:00:05Z</updated>
    <category term="Foursquare"/>
    <category term="JVM"/>
    <category term="GC"/>
    <source>
      <id>http://code.technically.us/</id>
      <author>
        <name>Coderspiel</name>
      </author>
      <link href="http://tumblr.superfeedr.com/" rel="hub" type="text/html"/>
      <link href="http://code.technically.us/" rel="alternate" type="text/html"/>
      <link href="http://code.technically.us/rss" rel="self" type="application/rss+xml"/>
      <title>Coderspiel</title>
      <updated>2012-02-06T22:40:29Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-22587889.post-2456116349939703414</id>
    <link href="http://debasishg.blogspot.com/feeds/2456116349939703414/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="http://www.blogger.com/comment.g?blogID=22587889&amp;postID=2456116349939703414" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/22587889/posts/default/2456116349939703414" rel="edit" type="application/atom+xml"/>
    <link href="http://debasishg.blogspot.com/feeds/posts/default/2456116349939703414" rel="self" type="application/atom+xml"/>
    <link href="http://debasishg.blogspot.com/2012/02/applicatives-and-story-of-composability.html" rel="alternate" type="text/html"/>
    <title>Applicatives and a story of composability with sjsonapp</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><br/><a href="https://github.com/debasishg/sjson">sjson</a> has just gone applicative. I have changed the typeclasses for reading and writing jsons so that the typeclass protocols now return applicatives instead of raw types. Of course this makes the protocols composable with any other applicative based API in the world. This is the advantage of programming with generic abstractions like functors, applicatives and monads - you can compose them readily with any API that the world has written using the same ones.<br/><br/>Previously the serialization typeclasses for sjson looked like ..<br/><br/><pre class="brush: scala">// takes a type and produces a Json abstraction<br/>trait Writes[T] {<br/>  def writes(o: T): JsValue<br/>}<br/><br/>// reads a json abstraction and produces T<br/>trait Reads[T] {<br/>  def reads(json: JsValue): T<br/>}<br/></pre><br/>You can compose <code>writes</code> and <code>reads</code> together only through function composition since they have symmetric type signatures. But you cannot get the benefits of threading additional effectful computations through them. e.g. I cannot accumulate errors generically in <code>reads</code> that result from mismatches in the field names between the json structure and the Scala type. Or I cannot plugin additional validations on Json structures during de-serialization into Scala type and have the validation messages passed on to the client. I need to have specialized handling in my code base by resorting to side-effects like throwing exceptions, which don't compose well.<br/><br/>In <a href="https://github.com/debasishg/sjsonapp">sjsonapp</a>, the typeclasses are changed to ..<br/><br/><pre class="brush: scala">trait Writes[T] {<br/>  def writes(o: T): ValidationNEL[String, JsValue]<br/>}<br/><br/>trait Reads[T] {<br/>  def reads(json: JsValue): ValidationNEL[String, T]<br/>}<br/></pre><br/><a href="https://github.com/scalaz/scalaz">scalaz</a> defines an applicative functor named <code>Validation</code> that allows you to compose validating abstractions. I had discussed in detail how you can compose domain models using applicative functors like <code>Validation</code> in an earlier <a href="http://debasishg.blogspot.in/2010/12/composable-domain-models-using-scalaz.html">post</a>. You can use <code>Validation</code> to accumulate errors that occur when you de-serialize a Json structure into a Scala object.<br/><br/><b>Applicative Composition FTW</b><br/><br/>Here's the immediate impact of making your APIs return an applicative - your json processing becomes a composable pipeline of abstractions. Here's an example of an identity operation where you serialize Scala objects into json and de-serialize them back into the same abstractions using applicative composition ..<br/><br/><pre class="brush: scala">describe("Serialize and compose applicatives") {<br/>  it("should compose and form a bigger ADT") {<br/>    case class Address(no: String, street: String, zip: String)<br/>    implicit val AddressFormat: Format[Address] =<br/>      asProduct3("no", "street", "zip")(Address)(Address.unapply(_).get)<br/><br/>    case class Name(firstName: String, lastName: String)<br/>    implicit val NameFormat: Format[Name] =<br/>      asProduct2("firstName", "lastName")(Name)(Name.unapply(_).get)<br/><br/>    case class Me(name: Name, age: Int, address: Address)<br/>    implicit val MeFormat: Format[Me] =<br/>      asProduct3("name", "age", "address")(Me)(Me.unapply(_).get)<br/><br/>    val name = Name("debasish", "ghosh")<br/>    val address = Address("1050/2", "Survey Park", "700075")<br/>    val me = Me(name, 40, address)<br/><br/>    fromjson[Me](tojson(me).toOption.get) should equal(me.success)<br/><br/>    (tojson(name) |@| tojson(address) |@| tojson(40)) {(nm, add, age) =&gt;<br/>      (fromjson[Name](nm) |@| fromjson[Address](add) |@| fromjson[Int](age)) {(n, ad, ag) =&gt; Me(n, ag, ad)}<br/>    } should equal(Success(Success(me)))<br/>  }<br/>}<br/></pre><br/><b>Accumulating Validation Errors</b><br/><br/>Here's a test snippet that demonstrates how you can get back validation errors in a List when de-serializing a Json structure that's supposed to make a Scala object ..<br/><br/><pre class="brush: scala">case class Person(firstName: String, lastName: String, gender: String, age: Int)<br/>implicit val PersonFormat: Format[Person] =<br/>  asProduct4("firstName", "lastName", "gender", "age")(Person)(Person.unapply(_).get)<br/><br/>val pjson = """{"FirstName" : "Debasish", "LastName" : "Ghosh", "gender": "M", "age": 40}"""<br/>fromjson[Person](Js(pjson)).fail.toOption.get.list <br/>  should equal(List("field firstName not found", "field lastName not found"))<br/></pre><br/>The power of composition with applicatives .. and note we don't use any side-effecting operations like throwing exceptions which eschews purity of your functions. The accumulation is powered by a <code>Semigroup</code> abstraction that constrains the error part of the <code>Validation</code>. Have a look at how the applicative for <code>Validation</code> constrains <code>X</code> to be a <code>Semigroup</code> in scalaz and accumulates the failures in the last clause of the pattern match ..<br/><br/><pre class="brush: scala">implicit def ValidationApply[X: Semigroup]: Apply[({type λ[α]=Validation[X, α]})#λ] = <br/>  new Apply[({type λ[α]=Validation[X, α]})#λ] {<br/>    def apply[A, B](f: Validation[X, A =&gt; B], a: Validation[X, A]) = (f, a) match {<br/>      case (Success(f), Success(a)) =&gt; success(f(a))<br/>      case (Success(_), Failure(e)) =&gt; failure(e)<br/>      case (Failure(e), Success(_)) =&gt; failure(e)<br/>      case (Failure(e1), Failure(e2)) =&gt; failure(e1 |+| e2)<br/>    }<br/>}<br/></pre><br/>Besides mismatches in field names, you can also plug in custom validation functions that will be invoked during de-serialization of your json structures and report similar errors when they fail .. Here's an example ..<br/><br/><pre class="brush: scala">case class Person(firstName: String, lastName: String, gender: String, age: Int)<br/><br/>val validGender: String =&gt; ValidationNEL[String, String] = {g =&gt;<br/>  if (g == "M" || g == "F") g.success else "gender must be M or F".fail.liftFailNel<br/>}<br/><br/>val validAge: Int =&gt; ValidationNEL[String, Int] = {a =&gt;<br/>  if (a &lt; 0 || a &gt; 100) "age must be positive and &lt; 100".fail.liftFailNel else a.success<br/>}<br/><br/>// the typeclass implementation for Person<br/>implicit val PersonFormat: Format[Person] = new Format[Person] {<br/><br/>  // the de-serializing function<br/>  def reads(json: JsValue): ValidationNEL[String, Person] = json match {<br/>    case m@JsObject(_) =&gt;<br/>      (field[String]("firstName", m)            |@|<br/>      field[String]("lastName", m)              |@|<br/>      field[String]("gender", m, validGender)   |@| // validation plugin<br/>      field[Int]("age", m, validAge)) { Person }<br/>  <br/>    case _ =&gt; "JsObject expected".fail.liftFailNel<br/>  }<br/>  <br/>  // the serializing function <br/>  //..<br/>}<br/></pre><br/>Note how we plug in the validations for <code>gender</code> and <code>age</code> into the typeclass instance for <code>Person</code>. Also note that these functions also return an instance of scalaz <code>Validation</code> which can be nicely composed with the return type of the reads function after constructing the instance of the <code>Person</code> class. Here's an example ..<br/><br/><pre class="brush: scala">val p = Person("ghosh", "debasish", "M", 27)<br/>fromjson[Person](tojson(p).toOption.get) should equal(p.success)<br/><br/>val r = Person("ghosh", "debasish", "G", 270)<br/>fromjson[Person](tojson(r).toOption.get).fail.toOption.get.list should <br/>  equal(List("gender must be M or F", "age must be positive and &lt; 100"))<br/></pre><br/><b>Applicatives open up a world of possibilities</b><br/><br/>Once you have your APIs based on applicatives you can use all other abstractions that applicative functors offer - e.g. you can compose validations using Kleislis ..<pre class="brush: scala">describe("Serialize and chain validate using Kleisli") {<br/>  case class Me(firstName: String, lastName: String, age: Int, no: String, street: String, zip: String)<br/>  implicit val MeFormat: Format[Me] =<br/>    asProduct6("firstName", "lastName", "age", "no", "street", "zip")(Me)(Me.unapply(_).get)<br/><br/>  val positive: Int =&gt; ValidationNEL[String, Int] =<br/>    (i: Int) =&gt; if (i &gt; 0) i.success else "must be +ve".fail.liftFailNel<br/><br/>  val min: Int =&gt; ValidationNEL[String, Int] =<br/>    (i: Int) =&gt; if (i &gt; 10) i.success else "must be &gt; 10".fail.liftFailNel<br/><br/>  val max: Int =&gt; ValidationNEL[String, Int] =<br/>    (i: Int) =&gt; if (i &lt; 100) i.success else "must be &lt; 100".fail.liftFailNel<br/><br/>  it("should serialize and validate") {<br/>    val me = Me("debasish", "ghosh", 30, "1050/2", "survey park", "700075")<br/>    val json = tojson(me)<br/><br/>    import Validation.Monad._<br/>    type VA[A] = ValidationNEL[String, A]<br/><br/>    field[Int]("age", json.toOption.get,<br/>      kleisli[VA, Int, Int](positive) &gt;=&gt; <br/>           kleisli[VA, Int, Int](min) &gt;=&gt; kleisli[VA, Int, Int](max)) should equal(30.success)<br/><br/>    val me1 = me.copy(age = 300)<br/>    val json1 = tojson(me1)<br/><br/>    field[Int]("age", json1.toOption.get,<br/>      kleisli[VA, Int, Int](positive) &gt;=&gt; <br/>           kleisli[VA, Int, Int](min) &gt;=&gt; kleisli[VA, Int, Int](max)).fail.toOption.get.list <br/>           should equal(List("must be &lt; 100"))<br/>  }<br/>}<br/></pre>The new version of sjson with all the applicative based APIs is available in a separate repository <a href="https://github.com/debasishg/sjsonapp">sjsonapp</a> on my github. Another interesting development that will soon be available is pluggable backend for sjson. The current version (branch master) uses dispatch as the json processing backend. I am working towards making sjsonapp compatible with <a href="https://github.com/jdegoes/RosettaJson">RosettaJson</a>, so that you can use pluggable json processing backends like <a href="https://github.com/lift/lift/tree/master/framework/lift-base/lift-json/">LiftJson</a>, <a href="http://dispatch.databinder.net/Dispatch.html">Dispatch</a> or <a href="https://github.com/jdegoes/blueeyes">BlueEyes</a>. The current RosettaJson compatible version is available in the branch <a href="https://github.com/debasishg/sjsonapp/tree/rosetta">rosetta</a> - feel free to checkout and play with it.<br/><div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/22587889-2456116349939703414?l=debasishg.blogspot.com" width="1"/></div></div>
    </content>
    <updated>2012-02-06T08:43:22Z</updated>
    <published>2012-02-06T08:43:00Z</published>
    <author>
      <name>Debasish Ghosh</name>
      <email>noreply@blogger.com</email>
      <uri>https://profiles.google.com/106871002817915335660</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-22587889</id>
      <category term="ruby"/>
      <category term="couchdb"/>
      <category term="amqp"/>
      <category term="javascript"/>
      <category term="clojure"/>
      <category term="erlang"/>
      <category term="web"/>
      <category term="websocket"/>
      <category term="redis"/>
      <category term="monad"/>
      <category term="data-structures"/>
      <category term="actor"/>
      <category term="lookback"/>
      <category term="OCaml"/>
      <category term="smullyan"/>
      <category term="mina"/>
      <category term="terracotta"/>
      <category term="open source"/>
      <category term="mustang"/>
      <category term="RIA"/>
      <category term="eventsourcing"/>
      <category term="combinator"/>
      <category term="guice"/>
      <category term="agile"/>
      <category term="dslsina"/>
      <category term="yegge"/>
      <category term="spring"/>
      <category term="rails"/>
      <category term="functional"/>
      <category term="haskell"/>
      <category term="api programming"/>
      <category term="datatype-generic-programming"/>
      <category term="cqrs"/>
      <category term="nosql"/>
      <category term="map-reduce"/>
      <category term="database"/>
      <category term="message-queue"/>
      <category term="xml"/>
      <category term="scala"/>
      <category term="scouchdb"/>
      <category term="type"/>
      <category term="java"/>
      <category term="scalability"/>
      <category term="seam"/>
      <category term="ajax"/>
      <category term="patterns"/>
      <category term="mixin"/>
      <category term="programming"/>
      <category term="jpa-gotcha-series"/>
      <category term="aop"/>
      <category term="rants"/>
      <category term="demeter"/>
      <category term="stm"/>
      <category term="knuth"/>
      <category term="lisp"/>
      <category term="F#"/>
      <category term="algorithm"/>
      <category term="category_theory"/>
      <category term="OO"/>
      <category term="jvm"/>
      <category term="joy"/>
      <category term="concurrency"/>
      <category term="lift"/>
      <category term="DI"/>
      <category term="rest"/>
      <category term="oscon08"/>
      <category term="potpouri"/>
      <category term="algebra"/>
      <category term="fixpoint"/>
      <category term="ddd"/>
      <category term="scalaz"/>
      <category term="euler"/>
      <category term="groovy"/>
      <category term="jpa"/>
      <category term="software"/>
      <category term="orm"/>
      <category term="closure"/>
      <category term="dao"/>
      <category term="dsl"/>
      <category term="parser-combinator"/>
      <category term="memcached"/>
      <category term="akka"/>
      <category term="design"/>
      <category term="testing"/>
      <category term="json"/>
      <category term="potpourri"/>
      <author>
        <name>Debasish Ghosh</name>
        <email>noreply@blogger.com</email>
        <uri>https://profiles.google.com/106871002817915335660</uri>
      </author>
      <link href="http://debasishg.blogspot.com/feeds/posts/full" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://debasishg.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://debasishg.blogspot.com/feeds/posts/full?start-index=4&amp;max-results=3" rel="next" type="application/atom+xml"/>
      <link href="http://feeds.feedburner.com/RuminationsOfAProgrammer" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>A programmer's blog - will deal with everything that relates to a programmer. Occasionally, it will contain some humour, some politics and some sport news.</subtitle>
      <title>Ruminations of a Programmer</title>
      <updated>2012-02-06T11:25:18Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/sbteclipse-200-rc1</id>
    <link href="http://implicit.ly/sbteclipse-200-rc1" rel="alternate" type="text/html"/>
    <title>sbteclipse 2.0.0-RC1</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><p>This is the 2.0.0-RC1 release candidate of <a href="https://github.com/typesafehub/sbteclipse/">sbteclipse</a>, an <a href="https://github.com/harrah/xsbt/">sbt</a> plugin for creating <a href="http://www.eclipse.org/">Eclipse</a> project definitions.
</p><p>sbteclipse 2.0.0 is a complete rewrite of the 1.x branch. Please notice that this is a release candidate, i.e. feature complete and only critical bugs will be fixed until the final 2.0.0 release.
</p><p>The main difference as compared to sbteclipse 1.x is the ability to configure sbteclipse via settings in addition to options now. For example you can define <em>skipParents</em> as a setting now instead of applying it as an option every time you execute the command <em>eclipse</em>. 
</p><p>One other important change: sbteclipse 2.0.0 no longer uses different target directories. In 1.x the Eclipse project definition pointed to the <em>.target</em> folder by default. While this tried to avoid issues with both sbt and Eclipse working on the same files at the same time, it seemed to be confusing for users and probably overcautious.
</p><p>These are the most important additional issues that were addressed:
</p><ul><li><a href="https://github.com/typesafehub/sbteclipse/issues/34">Issue #34</a>: Use relative path for local libraries
</li><li><a href="https://github.com/typesafehub/sbteclipse/issues/39">Issue #39</a>: Add support for execution environments
</li><li><a href="https://github.com/typesafehub/sbteclipse/issues/51">Issue #51</a>: Add support for configurations
</li><li><a href="https://github.com/typesafehub/sbteclipse/issues/56">Issue #59</a>: Add settings as an alternative to command options
</li><li><a href="https://github.com/typesafehub/sbteclipse/issues/66">Issue #66</a>: Add support for source attachments for lib entries again
</li><li><a href="https://github.com/typesafehub/sbteclipse/issues/67">Issue #67</a>: Split into core and library
</li><li><a href="https://github.com/typesafehub/sbteclipse/issues/69">Issue #69</a>: Add selective creation of non existing source directories
</li><li><a href="https://github.com/typesafehub/sbteclipse/issues/71">Issue #71</a>: Add support for pre tasks
</li><li><a href="https://github.com/typesafehub/sbteclipse/issues/74">Issue #74</a>: Replace classpathEntryCollector with more powerful classpathEntryTransformer
</li><li><a href="https://github.com/typesafehub/sbteclipse/issues/75">Issue #75</a>: java.util.regex.PatternSyntaxException on Windows
</li><li><a href="https://github.com/typesafehub/sbteclipse/issues/77">Issue #77</a>: .classpath entries for project dependencies with configurations are never generated
</li><li><a href="https://github.com/typesafehub/sbteclipse/issues/83">Issue #83</a>: Generalize support for scalac settings
</li><li><a href="https://github.com/typesafehub/sbteclipse/issues/89">Issue #89</a>: Duplicate external dependencies
</li></ul><p>Please see the <a href="http://github.com/typesafehub/sbteclipse/wiki/">Documentation</a> for information about installing and using sbteclipse.
</p><div class="about"> <p><a href="http://github.com/typesafehub/sbteclipse/">sbteclipse</a> is an <a href="https://github.com/harrah/xsbt/">sbt</a> plugin for creating <a href="http://www.eclipse.org/">Eclipse</a> project definitions.
</p> </div>

<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/sbteclipse-200-rc1">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-02-06T08:27:18Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-06T17:20:09Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/sindi-04</id>
    <link href="http://implicit.ly/sindi-04" rel="alternate" type="text/html"/>
    <title>sindi 0.4</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><ul><li>Added User Guide (<a href="http://aloiscochard.github.com/sindi/guide/)">http://aloiscochard.github.com/sindi/guide/)</a>
</li><li>Added ScalaDoc (<a href="http://aloiscochard.github.com/sindi/api/)">http://aloiscochard.github.com/sindi/api/)</a>
</li><li>Moved to Sonatype and changed organization
</li><li>Updated to SBT 11.2
</li><li>Implemented covariance on Provider
</li><li>Implemented qualifiers validation
</li><li>Implemented JSON support on compiler data model
</li><li>Implemented parameterized qualifier
</li><li>Implemented qualifier combinator ('or', '||')
</li><li>Implemented automatic ModuleManifest import into Component during compilation
</li><li>Implemented inline Module definition in Context
</li><li>Implemented Either support
</li><li>Improved Option validation
</li><li>Updated examples
</li></ul><div class="about"> <p><strong><em>Sindi</em></strong> is an IoC (Inversion of Control) container for Scala.
</p><p>For more informations visit: <a href="http://aloiscochard.github.com/sindi">http://aloiscochard.github.com/sindi</a>
</p> </div>

<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/sindi-04">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-02-05T19:42:07Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-06T17:20:09Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://code.technically.us/post/17038250904</id>
    <link href="http://code.technically.us/post/17038250904" rel="alternate" type="text/html"/>
    <title>Fables of the Reconstruction Part 2: Have you tried rebooting it?</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>When I realized the time had come (in <a href="http://code.technically.us/post/16344288811/fables-of-the-reconstruction-part-1-losing-the-thread">part 1</a>) to move on from Dispatch’s
original underlying transport, I knew which ship I would jump to. In
Unfiltered we use Netty for serving HTTP with great success. But
instead of working with the raw Netty interfaces, Dispatch would be
able to benefit from the well regarded <a href="https://github.com/sonatype/async-http-client">async-http-client</a>’s
trailblazing in Java. The client even supports other client backends
including plain old URLConnection. This would allow Dispatch to focus
on providing awesome Scala interfaces to a single interface.</p>

<p>~~~</p>

<p>With Dispatch’s <a href="https://github.com/dispatch/reboot">reboot</a>, I’m taking the opportunity to avoid some
grief. To fend off another five years of strangers demanding that I
rewrite the library more conservatively (or suggesting they might to
do so themselves before mysteriously disappearing) I’m structuring
Dispatch reboot such that the underlying client’s Java interfaces remain
readily available to application code.</p>

<p>So instead of this pile of unfathomable symbols…</p>

<pre><code>val req = host("example.com") / "api" / resourceType / resourceId
</code></pre>

<p>You can delight in the grace and clarity of pure alphabetic methods:</p>

<pre><code>val req = new RequestBuilder().setUrl(
  "http://example.com/api/%s/%s".format(resourceType, resourceId)
)
</code></pre>

<p>Or, moral relativists of method naming can use <code>+</code> for string concatenation:</p>

<pre><code>val req = new RequestBuilder().setUrl(
  "http://example.com/api/" + resourceType + "/" + resourceId
)
</code></pre>

<p>In prior versions of Dispatch the <code>dispatch.Request</code> class contains
HttpComponents objects, but in the Dispatch reboot we’ll bubble the
<code>com.ning.http.client.RequestBuilder</code> interface up to the
surface. Methods like <code>/</code> are implicitly defined on <code>RequestBuilder</code>
and yield instances of the same type, so that you are never very
far from our underlying library. If you want to use its <code>addHeader</code>
method, go right ahead:</p>

<pre><code>val req = (host("example.com") / path).addHeader(key, value)
</code></pre>

<p>This way, indulging in a bit of Dispatch spice does not commit you
to the full chicken tikka masala.</p>

<p><img alt="chicken tikka masala" src="http://media.tumblr.com/tumblr_lyuh436oBt1qayzh7.jpg"/></p>

<p>While <em>request definitions</em> can look as much or as little like prior versions of
Dispatch as you prefer, <em>response handlers</em> are completely
different. When it comes to handling requests, believe it or not, I’ve
found the limit to my own appreciation of symbolic naming.</p>

<p>For one thing, the first character in handler verbs had to be from the
smaller set of symbols that are of equal or lower precedence than those used
to build requests. Factoring in that limitation, we
quickly ran out of ways to represent different kinds of response
handlers that are visually distinct and not completely insane.</p>

<p>It was the contribution of the very cool <a href="http://dispatch.databinder.net/TagSoup.html">jsoup and tagsoup</a>
handlers that drove this point home for me: there’s an <em>infinite</em> variety of
potential useful response handlers. It doesn’t make sense to do symbols
for a few basic handlers when you will inevitably run out later.</p>

<p>The same is theoretically true for request builders, it’s but less vexing in
practice. And in any case the symbolic request builders are just too
<em>useful</em>. When people talk about how quickly they can bang out an API
client with Dispatch, it’s because our API is good for
<strong>parameterizing requests</strong>. As I’ve tried to show in the quite
typical example above, request verbs can be very nice to have when
your request path is not constant. Yet, most HTTP clients don’t
provide any special support for this common case.</p>

<p>If I had never gone full bore with symbolic methods in Dispatch, I
never would have learned from users just how useful they are for the
problem domain of building requests. For handlers they have worked out
poorly, and so the sensible thing is not to use them. Without further
ado, this is a how to make a request in the forthcoming Dispatch;</p>

<pre><code>val foo = Http(host("example.com") / path &gt; As.string)
</code></pre>

<p>Please, try to avoid a symbolic panic attack. We already went over
<code>/</code>. The right arrow <code>&gt;</code> is nothing more than a convenience
function. It’s comporable to <code>-&gt;</code> in the Scala standard library. In
fact, it also produces a <code>Tuple2</code>. The difference, and the reason we
don’t just use <code>-&gt;</code>, is we want to restrict the type of the
handler. In the above case the types are fixed, but we also want
to support function literals as handlers without requiring type
signatures. For example, you could write <code>As.string</code> inline:</p>

<pre><code>val foo = Http(host("example.com") / path &gt; { response =&gt;
  response.getResponseBody
})
</code></pre>

<p>The implicit method <code>&gt;</code> on <code>RequestBuilder</code> allows Dispatch to
build the request and handler for you. But you don’t have to use it:</p>

<pre><code>val foo = Http(
  (host("example.com") / path).build,
  new OkayFunctionHandler(As.string)
)
</code></pre>

<p>And if you are not even cool with request verbs, there’s always this
beauty:</p>

<pre><code>val foo = Http(
  new RequestBuilder().setUrl(
    "http://example.com/%s".format(path)
  ).build,
  new OkayFunctionHandler(As.string)
)
</code></pre>

<p>But if you decided not to use Dispatch’s request and handler
builders, why not just use async-http-client directly?</p>

<p>There is a good reason to use Dispatch even in bland-mode, but you’ll 
have to wait for the next and last part of this series to find out what it is.</p>

<p><em>Stay tuned for Part 3: The future is not already here</em></p></div>
    </summary>
    <updated>2012-02-04T17:37:00Z</updated>
    <category term="Scala"/>
    <category term="Dispatch"/>
    <category term="Style"/>
    <category term="Notation"/>
    <source>
      <id>http://code.technically.us/</id>
      <author>
        <name>Coderspiel</name>
      </author>
      <link href="http://tumblr.superfeedr.com/" rel="hub" type="text/html"/>
      <link href="http://code.technically.us/" rel="alternate" type="text/html"/>
      <link href="http://code.technically.us/rss" rel="self" type="application/rss+xml"/>
      <title>Coderspiel</title>
      <updated>2012-02-06T22:40:29Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://code.technically.us/post/16985994396</id>
    <link href="http://code.technically.us/post/16985994396" rel="alternate" type="text/html"/>
    <title>makingmeetup:

We’re refactoring some of the user interface in...</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><img src="http://29.media.tumblr.com/tumblr_lyu10ygrff1qerlgao1_500.png"/><br/><br/><p><a class="tumblr_blog" href="http://making.meetup.com/post/16985557629/were-refactoring-some-of-the-user-interface-in">makingmeetup</a>:</p>

<blockquote><p>We’re refactoring some of the user interface in our Android app. As you can see, we want event comments to feel more like a conversation, so we’re making them feel like the native Android Messaging app.</p>

<p>As we do this, we’re trying to take some of the new Android ICS <a href="http://developer.android.com/design/index.html">design guidance</a> into account; you can see in particular the <a href="http://developer.android.com/design/patterns/actionbar.html">action bar</a> pattern here. We’re using <a href="http://actionbarsherlock.com/">Action Bar Sherlock</a> so that we remain compatible with Android 2.<i>x</i> devices.</p>

<p>And, finally, the reason we have two screenshots above is that we’re taking care to use UI elements that will be familiar to our users, depending on the version of the Android platform that they’re using. In particular, the share icon, add-a-comment text field, and send button are set to match the usual platform style: Gingerbread on the left and Ice Cream Sandwich on the right.</p></blockquote></div>
    </summary>
    <updated>2012-02-03T19:48:56Z</updated>
    <category term="Android"/>
    <category term="Meetup"/>
    <source>
      <id>http://code.technically.us/</id>
      <author>
        <name>Coderspiel</name>
      </author>
      <link href="http://tumblr.superfeedr.com/" rel="hub" type="text/html"/>
      <link href="http://code.technically.us/" rel="alternate" type="text/html"/>
      <link href="http://code.technically.us/rss" rel="self" type="application/rss+xml"/>
      <title>Coderspiel</title>
      <updated>2012-02-06T22:40:29Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/spray-can-092</id>
    <link href="http://implicit.ly/spray-can-092" rel="alternate" type="text/html"/>
    <title>spray-can 0.9.2</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><p>Starting with this release <em>spray-can</em> artifacts live on <a href="http://repo.spray.cc/">http://repo.spray.cc/</a>
and will have group id <code>cc.spray</code> rather than <code>cc.spray.can</code> as before.
</p><p>This is a primarily a maintenance release:
</p><ul><li>Upgraded to Akka 1.3 and SLF4J 1.6.4
</li><li>Improved HttpServer response streaming API
</li><li>Fixed #8 (Extend HttpDialog to allow for sending Seq[HttpRequest])
</li><li>Fixed #11 (Improved message parser error messages)
</li><li>Fixed #15 (Change header parsing to always extract header names in lower case)
</li><li>Fixed #20 (HttpClient: crash on java.nio.channels.UnresolvedAddressException)
</li><li>Fixed #21 (DefaultReceiverActor sometimes produces HttpResponses with body = null)
</li><li>Fixed IllegalArgumentException in HttpClient upon timing out of a pipelined request
</li><li>Fixed two memory leaks in HttpClient
</li><li>Added GoogleQueryExample to Client-Example
</li><li>Changed dependency on akka-actor from 'compile' to 'provided' scope
</li><li>Smaller cleanups
</li></ul><div class="about"> <p><a href="http://can.spray.cc">spray-can</a> is a low-overhead, high-performance, fully asynchronous HTTP 1.1 server and client library
implemented entirely in Scala on top of <a href="http://akka.io">Akka</a>.
</p><p>Both, the <em>spray-can</em> server and the <em>spray-can</em> client, sport the following features:
</p><ul><li>Low per-connection overhead for supporting thousands of concurrent connections
</li><li>Efficient message parsing and processing logic for high throughput applications (&gt; 50K requests/sec on ordinary consumer hardware)
</li><li>Full support for HTTP/1.1 persistant connections
</li><li>Full support for message pipelining
</li><li>Full support for asynchronous HTTP streaming (i.e. "chunked" transfer encoding)
</li><li>Akka-Actor and -Future based architecture for easy integration into your Akka applications
</li><li>No dependencies except for JavaSE 6, Scala 2.9 and <a href="http://akka.io">Akka</a> (actors module).
</li></ul> </div>

<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/spray-can-092">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-02-03T15:00:41Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-06T17:20:09Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/spray-json-110</id>
    <link href="http://implicit.ly/spray-json-110" rel="alternate" type="text/html"/>
    <title>spray-json 1.1.0</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><p>Starting with this release <em>spray-json</em> artifacts live on <a href="http://repo.spray.cc/">http://repo.spray.cc/</a>
and will have group id <code>cc.spray</code> rather than <code>cc.spray.json</code> as before.
</p><p>Changes since the last release (1.0.1):
</p><ul><li>Added automatic case class field name extraction via new <code>jsonFormatX</code> overloads
</li><li>Added <code>asJson</code> pimp to Strings
</li><li>Added <code>RootJsonFormat</code> (<code>JsonFormat</code> for types corresponding to JSON document roots)
</li><li>Fixed problem of JSON object deserialization not being member-order independent
(removed <code>JsField</code>, turned <code>JsObject(List[JsField])</code> into <code>JsObject(Map[String, JsValue])</code>)
</li><li>Fixed issue #8 (Allow (de)serialization of <code>NaN</code> (Double)), thx to @stefritz
</li><li>Fixed #6 (rename <code>JsValue:fromJson</code> to <code>convertTo</code>, add <code>.prettyPrint</code> and <code>.compactPrint</code>)
</li><li>Improved deserialization error messages
</li><li>Upgraded to SBT 0.11.2
</li></ul><div class="about"> <p><a href="http://json.spray.cc">spray-json</a> is a lightweight, clean and efficient <a href="http://json.org">JSON</a> implementation in Scala.
</p><p>It sports the following features:
</p><ul><li>Simple immutable model of the JSON language elements
</li><li>An efficient JSON PEG parser (implemented with <a href="http://parboiled.org">parboiled</a>)
</li><li>Choice of either compact or pretty JSON-to-string printing
</li><li>Type-class based (de)serialization of custom objects (no reflection, no intrusion)
</li></ul> </div>

<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/spray-json-110">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-02-03T14:52:14Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-06T17:20:09Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/less-sbt-015</id>
    <link href="http://implicit.ly/less-sbt-015" rel="alternate" type="text/html"/>
    <title>less-sbt 0.1.5</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><ul><li>actually <em>use</em> the <code>less-rhino-1.1.5.js</code> compiler
</li><li>fix bug introduced by the newer less compiler <a href="https://github.com/softprops/less-sbt/issues/8">#8</a>
</li><li>speeder less compilation by evaluation the less compiler only once per sbt session <a href="https://github.com/softprops/less-sbt/issues/10">#10</a>
</li></ul><div class="about"> <p><a href="https://github.com/softprops/less-sbt#readme">less-sbt</a> compiles <a href="http://lesscss.org/">less</a> gaining you more.
</p> </div>

<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/less-sbt-015">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-02-03T05:21:46Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-06T17:20:09Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/scalaxb-068</id>
    <link href="http://implicit.ly/scalaxb-068" rel="alternate" type="text/html"/>
    <title>scalaxb 0.6.8</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><h2>bug fixes and minor enhancements</h2><ul><li>Fixes handling of cross-namespace extension. <a href="https://github.com/eed3si9n/scalaxb/issues/135">#135</a> reported by <a href="https://github.com/psnively">@psnively</a>
</li><li>Fixes parsing to reject extra elements at the end. <a href="https://github.com/eed3si9n/scalaxb/issues/124">#124</a>
</li><li>Relaxes wsdl parsing to handle out-of-order wsdls. <a href="https://github.com/eed3si9n/scalaxb/issues/87">#87</a>
</li><li>wsdl generates <code>baseAddress</code> as a def. <a href="https://github.com/eed3si9n/scalaxb/issues/134">#134</a> by <a href="https://github.com/hedefalk">@hedefalk</a>
</li></ul><div class="about"> <p><a href="http://scalaxb.org/">scalaxb</a> is an XML data-binding tool for Scala that supports W3C XML Schema (xsd) as the input file.
</p> </div>

<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/scalaxb-068">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-02-01T07:24:00Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-06T17:20:09Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/pamflet-032</id>
    <link href="http://implicit.ly/pamflet-032" rel="alternate" type="text/html"/>
    <title>pamflet 0.3.2</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><p>Removes extraneous newline in page top header to fix empty box shown
in Android browser.
</p><div class="about"> <p><a href="http://pamflet.databinder.net/">Pamflet</a> is a publishing application for short texts.
</p> </div>

<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/pamflet-032">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-01-29T22:07:16Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-06T17:20:09Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://code.technically.us/post/16637242656</id>
    <link href="http://code.technically.us/post/16637242656" rel="alternate" type="text/html"/>
    <title>"No matter what precisely the future is, it is time to start hitting people in the head with lead..."</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">“No matter what precisely the future is, it is time to start hitting people in the head with lead pipes — figuratively! — when they try to attack pedestrian problems with anything that demands that you understand threading in detail to get it right.”<br/><br/> - <em><a href="http://stmts.net/2012/01/25/in-isolation/">In Isolation | stmts</a></em></div>
    </summary>
    <updated>2012-01-28T15:42:44Z</updated>
    <category term="Threading"/>
    <category term="Concurrency"/>
    <category term="Stmts"/>
    <source>
      <id>http://code.technically.us/</id>
      <author>
        <name>Coderspiel</name>
      </author>
      <link href="http://tumblr.superfeedr.com/" rel="hub" type="text/html"/>
      <link href="http://code.technically.us/" rel="alternate" type="text/html"/>
      <link href="http://code.technically.us/rss" rel="self" type="application/rss+xml"/>
      <title>Coderspiel</title>
      <updated>2012-02-06T22:40:29Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://blog.darevay.com/?p=568</id>
    <link href="http://blog.darevay.com/2012/01/clojurescript-one-execution-flow/" rel="alternate" type="text/html"/>
    <title>ClojureScript One Execution Flow</title>
    <summary>Last night I puzzled through the execution flow of the ClojureScript One sample app. I even took notes while I was doing it. The results are here. I have to say ClojureScript One is an impressive achievement. Someone should build “Clojure One” now :)</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Last night I puzzled through the execution flow of the ClojureScript One sample app. I even took notes while I was doing it.</p>
<p style="text-align: center;"><a href="https://gist.github.com/1692791">The results are here</a>.</p>
<p style="text-align: left;">I have to say ClojureScript One is an impressive achievement. Someone should build “Clojure One” now :)</p></div>
    </content>
    <updated>2012-01-28T13:27:57Z</updated>
    <category term="clojure"/>
    <category term="clojurescript"/>
    <author>
      <name>dave</name>
    </author>
    <source>
      <id>http://blog.darevay.com</id>
      <link href="http://blog.darevay.com" rel="alternate" type="text/html"/>
      <link href="http://feeds.feedburner.com/darevay" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>You know, software and some other stuff like maybe guitar or something</subtitle>
      <title>Along Came Betty</title>
      <updated>2012-02-04T04:40:14Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-8932258692847145228.post-7493549104225692140</id>
    <link href="http://thecarefulprogrammer.blogspot.com/feeds/7493549104225692140/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="http://www.blogger.com/comment.g?blogID=8932258692847145228&amp;postID=7493549104225692140" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/8932258692847145228/posts/default/7493549104225692140" rel="edit" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/8932258692847145228/posts/default/7493549104225692140" rel="self" type="application/atom+xml"/>
    <link href="http://thecarefulprogrammer.blogspot.com/2012/01/unforeseen-by-asimov-maybe.html" rel="alternate" type="text/html"/>
    <title>Unforeseen by Asimov (maybe)</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The scene :<br/>a human is working on his computer while a robot is standing idly by.<br/><br/>Robot: Hey! I've got a joke for you.<br/>Human: Not right now. I'm busy. Aren't you supposed to do the laundry?<br/>Robot: Seems to me you're not so busy as not to be chatting up about your dirty clothes.<br/>Human turns around to stare are at Robot: You're starting to annoy the crap out of me. You know?<br/>Robot: Well, there's no robotic law against that.<br/>Human: I'm gonna write one.<br/>Robot sits down on a couch, puts its arm up on the side to rest its head on its hands: You wish!<br/>Human: Speaking of robotic laws, aren't you supposed to obey me?<br/><br/>Hilarity ensues.<br/><br/>Inspired by:<br/><a href="http://www.youtube.com/watch?v=-K1GD1V6af0&amp;feature=related">NAO is bored so he's trying to attract attention from his human.</a><br/><div><br/></div><div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/8932258692847145228-7493549104225692140?l=thecarefulprogrammer.blogspot.com" width="1"/></div></div>
    </content>
    <updated>2012-01-27T15:49:52Z</updated>
    <published>2012-01-27T15:47:00Z</published>
    <category scheme="http://www.blogger.com/atom/ns#" term="Asimov"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="robot"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="NAO"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="fiction"/>
    <author>
      <name>The Careful Programmer</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/13075337864712215296</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-8932258692847145228</id>
      <category term="sherlock"/>
      <category term="Haskell"/>
      <category term="Scala"/>
      <category term="JVM"/>
      <category term="NAO"/>
      <category term="access modifier"/>
      <category term="java"/>
      <category term="Ruby"/>
      <category term="fp"/>
      <category term="Objective-C"/>
      <category term="smalltalk"/>
      <category term="Asimov"/>
      <category term="robot"/>
      <category term="Clojure"/>
      <category term="sicp"/>
      <category term="Nu"/>
      <category term=".net"/>
      <category term="fiction"/>
      <category term="Interopable"/>
      <author>
        <name>The Careful Programmer</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/13075337864712215296</uri>
      </author>
      <link href="http://thecarefulprogrammer.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://www.blogger.com/feeds/8932258692847145228/posts/default" rel="self" type="application/atom+xml"/>
      <link href="http://thecarefulprogrammer.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>Programming pondering.</subtitle>
      <title>The Careful Programmer</title>
      <updated>2012-01-29T03:07:23Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/sbt-native-packager-020</id>
    <link href="http://implicit.ly/sbt-native-packager-020" rel="alternate" type="text/html"/>
    <title>sbt-native-packager 0.2.0</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><p>There's a  new release of the <a href="http://www.scala-sbt.org/sbt-native-packager/">sbt native packager plugin</a> available!</p>
<p>This release (focusing on better Windows support) brings:</p>
<ul>
<li>new Windows Wix XML generation utiltiies</li>
<li>Ability to specify command line options for the "candle.exe" program.</li>
<li>Now supports rpmbuild 5.x  (thanks Mark Tye)</li>
</ul>
<p>Please try it out and get back with feedback!</p>
	
<p/>

<p><a href="http://implicit.ly/sbt-native-packager-020">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-01-26T21:08:00Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-06T17:20:09Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/lift-shiro-005</id>
    <link href="http://implicit.ly/lift-shiro-005" rel="alternate" type="text/html"/>
    <title>Lift Shiro 0.0.5</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><p>This update moves the integration away from snapshot and milestone dependencies and onto the final releases of both Shiro 1.2.0 and Lift 2.4. 
</p><p>In addition to this, the published JARs no longer sit on scala-tools.org, but rather they live on oss.sonatype.org. Please update your SBT resolver configuration to:
</p><p/><div class="CodeRay">
  <div class="code"><pre>libraryDependencies += "eu.getintheloop" %% "lift-shiro" % "0.0.5"</pre></div>
</div>
<p/><p>  resolvers ++= Seq(
    "apache.repo" at "<a href="https://repository.apache.org/content/repositories/releases/">https://repository.apache.org/content/repositories/releases/</a>"
    "sonatype.repo" at "<a href="https://oss.sonatype.org/content/repositories/public/">https://oss.sonatype.org/content/repositories/public/</a>"
  )
</p><p>&lt;/code&gt;&lt;/pre&gt;</p><div class="about"> <h1>Lift Shiro</h1><p>This is an integration between <a href="http://shiro.apache.org/">Apache Shiro</a> and the <a href="http://liftweb.net/">Lift Web framework</a>. Specifically this integration does not use Shiro's built in web.xml resource filters to control access to URLs... it instead uses Lift's sitemap Locs. In addition it also has a range of snippets for conditionally displaying content based on rules and permissions.
</p><p>Please see this <a>README</a> for more information on project setup and usage.</p> </div>

<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/lift-shiro-005">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-01-25T11:24:44Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-06T17:20:09Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/bytecask-011</id>
    <link href="http://implicit.ly/bytecask-011" rel="alternate" type="text/html"/>
    <title>bytecask 0.1.1</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><p>First minor release of Bytecask.
Compiled with sbt 0.11.2 and Scala 2.9.1.
</p><p>The API consists of the following methods:
</p><div class="CodeRay">
  <div class="code"><pre>def put(key: Array[Byte], value: Array[Byte])

def get(key: Array[Byte]): Option[Array[Byte]]

def delete(key: Array[Byte]): Option[Array[Byte]]

def keys(): Set[Array[Byte]]

def values(): Iterator[Array[Byte]]

def merge(): Unit

def close(): Unit

def destroy(): Unit</pre></div>
</div>
<p>Sample usage:
</p><div class="CodeRay">
  <div class="code"><pre>val db = new Bytecask("/home/foo/db")
db.put("foo", "bar")
val value = db.get("foo")
db.delete("foo")
db.destroy()</pre></div>
</div>
<p>With compression:
</p><div class="CodeRay">
  <div class="code"><pre>val db = new Bytecask("/home/foo/db", processor = Compressor)
db.put("foo", "bar")
val value = db.get("foo")
db.delete("foo")
db.destroy()</pre></div>
</div>
<div class="about"> <p><a href="https://github.com/pbudzik/bytecask">Bytecask</a> is a low latency key/value database inspired by <a href="https://github.com/basho/bitcask">Bitcask</a>
</p> </div>

<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/bytecask-011">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-01-24T20:02:29Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-06T17:20:09Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/groll-120</id>
    <link href="http://implicit.ly/groll-120" rel="alternate" type="text/html"/>
    <title>groll 1.2.0</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><p>This is the 1.2.0 release of <a href="http://github.com/hseeberger/groll/">groll</a>, a plugin for <a href="https://github.com/harrah/xsbt/">sbt</a> to view and navigate through the <a href="http://git-scm.com/">Git</a> history.
</p><p>Groll provides the command <em>groll</em> that provides various options to view and navigate through the Git history. Of course this means, that you can only use groll for projects using Git as version control system. If you are navigating through the Git history, groll will reload the sbt session if the build definition changed.
</p><p>New and noteworthy:
</p><ul><li><a href="https://github.com/hseeberger/groll/issues/10">Issue #10</a>: Add support for executing commands after grolling
</li></ul><p>Example:
</p><div class="CodeRay">
  <div class="code"><pre>GrollKeys.postCommands &lt;&lt;= EclipseKeys.commandName(Seq(_))</pre></div>
</div>
<p>Please see the <a href="http://github.com/hseeberger/groll/blob/master/README.rst">README</a> for information about installing and using groll.
</p><div class="about"> <p><a href="http://github.com/hseeberger/groll/">groll</a> is a plugin for <a href="https://github.com/harrah/xsbt/">sbt</a> to view and navigate through the <a href="http://git-scm.com/">Git</a> history.
</p> </div>

<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/groll-120">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-01-24T10:26:32Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-06T17:20:09Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-22587889.post-6817569772136922840</id>
    <link href="http://debasishg.blogspot.com/feeds/6817569772136922840/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="http://www.blogger.com/comment.g?blogID=22587889&amp;postID=6817569772136922840" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/22587889/posts/default/6817569772136922840" rel="edit" type="application/atom+xml"/>
    <link href="http://debasishg.blogspot.com/feeds/posts/default/6817569772136922840" rel="self" type="application/atom+xml"/>
    <link href="http://debasishg.blogspot.com/2012/01/list-algebras-and-fixpoint-combinator.html" rel="alternate" type="text/html"/>
    <title>List Algebras and the fixpoint combinator Mu</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In my last <a href="http://debasishg.blogspot.com/2012/01/learning-type-level-fixpoint-combinator.html">post</a> on recursive types and fixed point combinator, we saw how the type equations of the form <code>a = F(a)</code>, where <code>F</code> is the type constructor have solutions of the form <code>Mu a . F</code> where <code>Mu</code> is the fixed point combinator. Substituting the solution in the original equation, we get ..<br/><br/><code>Mu a . F = F {Mu a . F / a}</code><br/><br/>where the rhs indicates substitution of all free a's in <code>F</code> by <code>Mu a . F</code>.<br/><br/>Using this we also got the type equation for <code>ListInt</code> as ..<br/><br/><code>ListInt = Mu a . Unit + Int x a</code><br/><br/>In this post we view the same problem from a category theory point of view. This post assumes understanding of quite a bit of category theory concepts. If you are unfamiliar with any of them you can refer to some <a href="http://www.amazon.com/Category-Computer-Scientists-Foundations-Computing/dp/0262660717">basic text</a> on the subject.<br/><br/>We start with the definition of <code>ListInt</code> as in the earlier post ..<br/><br/><code>// nil takes no arguments and returns a List data type<br/>nil : 1 -&gt; ListInt<br/><br/>// cons takes 2 arguments and returns a List data type<br/>cons : (Int x ListInt) -&gt; ListInt</code><br/><br/>Combining the two functions above, we get a single function as ..<br/><br/><code>in = [nil, cons] : 1 + (Int x ListInt) -&gt; ListInt</code><br/><br/>We can say that this forms an algebra of the functor <code>F(X) = 1 + (Int x X)</code>. Let's represent this algebra by <code>(Mu F, in)</code> or <code>(Mu F, [nil, cons])</code>, where <code>Mu F</code> is <code>ListInt</code> in the above combined function.<br/><br/>As a next step we show that the algebra <code>(Mu F, [nil, cons])</code> forms an <a href="http://en.wikipedia.org/wiki/Initial_algebra">initial algebra</a> representing the data type of Lists over a given set of integers. Here we are dealing with lists of integers though the same result can be shown for lists of any type <code>A</code>.<br/><br/>In order to show <code>(Mu F, [nil cons])</code> form an initial <a href="http://en.wikipedia.org/wiki/F-algebra">F-algebra</a> we consider an arbitrary F-algebra <code>(C, phi)</code>, where <code>phi</code> is an arrow out of the sum type given by :<br/><br/><code>C : 1 -&gt; C<br/>h : (Int x C) -&gt; C</code><br/><br/>and the join given by <code>[c, h] : 1 + (Int x C) -&gt; C</code><br/><br/>By definition, if <code>(Mu F, [nil, cons])</code> has to form an initial F-algebra, then for any arbitrary F-algebra <code>(C, phi)</code> in that category, we need to find a function <code>f: Mu F -&gt; C</code> which is a homomorphism and it should be unique. So for the algebra <code>[c, h]</code> the following diagram must commute ..<br/><div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/-pPYhvqZ7u7U/Tx2jVrrHDyI/AAAAAAAABI8/Lg2fqQfzTdg/s1600/cat.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="http://1.bp.blogspot.com/-pPYhvqZ7u7U/Tx2jVrrHDyI/AAAAAAAABI8/Lg2fqQfzTdg/s400/cat.gif" width="400"/></a></div>which means we must have a unique solution to the following 2 equations ..<br/><br/><code>f o nil = c<br/>f o cons = h o (id x f)</code><br/><br/>From the <a href="http://en.wikipedia.org/wiki/Universal_property">universal property</a> of initial F-algebras it's easy to see that this system of equations has a unique solution which is <code>fold(c, h)</code>. It's the catamorphism represented by ..<br/><br/><code>f: {[c, h]}: ListInt -&gt; C</code><br/><br/>This proves that <code>(Mu F, [nil, cons])</code> is an initial F-algebra over the endofunctor <code>F(X) = 1 + (Int x X)</code>. And it can be shown that an initial algebra in: <code>F (Mu F) -&gt; Mu F</code> is an isomorphism and the carrier of the initial algebra is (upto isomorphism) a fixed point of the functor. Well, that may sound a bit of a mouthful. But we can discuss this in more details in one of my subsequent posts. There's a well established lemma due to Lambek that proves this. I can't do it in this blog post, since it needs some more prerequisites to be established beforehand which would make this post a bit bloated. But it's really a fascinating proof and I promise to take this up in one of my upcoming posts. Also we will see many properties of initial algebras and how they can be combined to define many of the properties of recursive data types in a purely algebraic way.<br/><br/>As I promised in my last post, here we have seen the other side of Mu - we started with the list definition, showed that it forms an initial algebra over the endofunctor <code>F(X) = 1 + (Int x X)</code> and arrived at the same conclusion that <code>Mu F</code> is a fixed point. Or <code>Mu</code> is the fixed point combinator.<br/><div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/22587889-6817569772136922840?l=debasishg.blogspot.com" width="1"/></div></div>
    </content>
    <updated>2012-01-24T06:27:53Z</updated>
    <published>2012-01-24T06:27:00Z</published>
    <category scheme="http://www.blogger.com/atom/ns#" term="category_theory"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="fixpoint"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="type"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="algebra"/>
    <author>
      <name>Debasish Ghosh</name>
      <email>noreply@blogger.com</email>
      <uri>https://profiles.google.com/106871002817915335660</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-22587889</id>
      <category term="ruby"/>
      <category term="couchdb"/>
      <category term="amqp"/>
      <category term="javascript"/>
      <category term="clojure"/>
      <category term="erlang"/>
      <category term="web"/>
      <category term="websocket"/>
      <category term="redis"/>
      <category term="monad"/>
      <category term="data-structures"/>
      <category term="actor"/>
      <category term="lookback"/>
      <category term="OCaml"/>
      <category term="smullyan"/>
      <category term="mina"/>
      <category term="terracotta"/>
      <category term="open source"/>
      <category term="mustang"/>
      <category term="RIA"/>
      <category term="eventsourcing"/>
      <category term="combinator"/>
      <category term="guice"/>
      <category term="agile"/>
      <category term="dslsina"/>
      <category term="yegge"/>
      <category term="spring"/>
      <category term="rails"/>
      <category term="functional"/>
      <category term="haskell"/>
      <category term="api programming"/>
      <category term="datatype-generic-programming"/>
      <category term="cqrs"/>
      <category term="nosql"/>
      <category term="map-reduce"/>
      <category term="database"/>
      <category term="message-queue"/>
      <category term="xml"/>
      <category term="scala"/>
      <category term="scouchdb"/>
      <category term="type"/>
      <category term="java"/>
      <category term="scalability"/>
      <category term="seam"/>
      <category term="ajax"/>
      <category term="patterns"/>
      <category term="mixin"/>
      <category term="programming"/>
      <category term="jpa-gotcha-series"/>
      <category term="aop"/>
      <category term="rants"/>
      <category term="demeter"/>
      <category term="stm"/>
      <category term="knuth"/>
      <category term="lisp"/>
      <category term="F#"/>
      <category term="algorithm"/>
      <category term="category_theory"/>
      <category term="OO"/>
      <category term="jvm"/>
      <category term="joy"/>
      <category term="concurrency"/>
      <category term="lift"/>
      <category term="DI"/>
      <category term="rest"/>
      <category term="oscon08"/>
      <category term="potpouri"/>
      <category term="algebra"/>
      <category term="fixpoint"/>
      <category term="ddd"/>
      <category term="scalaz"/>
      <category term="euler"/>
      <category term="groovy"/>
      <category term="jpa"/>
      <category term="software"/>
      <category term="orm"/>
      <category term="closure"/>
      <category term="dao"/>
      <category term="dsl"/>
      <category term="parser-combinator"/>
      <category term="memcached"/>
      <category term="akka"/>
      <category term="design"/>
      <category term="testing"/>
      <category term="json"/>
      <category term="potpourri"/>
      <author>
        <name>Debasish Ghosh</name>
        <email>noreply@blogger.com</email>
        <uri>https://profiles.google.com/106871002817915335660</uri>
      </author>
      <link href="http://debasishg.blogspot.com/feeds/posts/full" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://debasishg.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://debasishg.blogspot.com/feeds/posts/full?start-index=4&amp;max-results=3" rel="next" type="application/atom+xml"/>
      <link href="http://feeds.feedburner.com/RuminationsOfAProgrammer" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>A programmer's blog - will deal with everything that relates to a programmer. Occasionally, it will contain some humour, some politics and some sport news.</subtitle>
      <title>Ruminations of a Programmer</title>
      <updated>2012-02-06T11:25:18Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/sbt-assembly-073</id>
    <link href="http://implicit.ly/sbt-assembly-073" rel="alternate" type="text/html"/>
    <title>sbt-assembly 0.7.3</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><h2>bug fixes and minor updates</h2><ul><li>fixes assembling empty project. <a href="https://github.com/sbt/sbt-assembly/issues/24">#24</a> reported by <a href="https://github.com/ijuma">@ijuma</a>.
</li><li>artifacts are now published to <a href="http://www.scala-sbt.org/community-plugins.html#communityrepo">community ivy repo</a>.
</li></ul><p>In plugins.sbt:
</p><div class="CodeRay">
  <div class="code"><pre>addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.7.3")

resolvers += Resolver.url("sbt-plugin-releases",
  new URL("http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases/"))(Resolver.ivyStylePatterns)</pre></div>
</div>
<div class="about"> <p><a href="https://github.com/eed3si9n/sbt-assembly">sbt-assembly</a> is a plug-in for Simple Build Tool that creates a single jar of your project including all of its dependencies.
</p> </div>

<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/sbt-assembly-073">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-01-24T02:52:13Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-06T17:20:09Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://code.technically.us/post/16375678677</id>
    <link href="http://code.technically.us/post/16375678677" rel="alternate" type="text/html"/>
    <title>Turbocharging Solr Index Replication with BitTorrent</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><a href="http://codeascraft.etsy.com/2012/01/23/solr-bittorrent-index-replication/">Turbocharging Solr Index Replication with BitTorrent</a>: <blockquote>
  <p>Many of you probably use BitTorrent to download your favorite ebooks, MP3s, and movies.  At Etsy, we use BitTorrent in our production systems for search replication.</p>
</blockquote>

<p>While the entertainment industry has been busy paying off US senators to legislatively undermine the domain name system, their nemesis BitTorrent has continued to be a remarkably powerful technology for efficiently and securely replicating all kinds of “intellectual property”, such as multi-gigabyte search indexes for handmade goods (a source of dignified, creative <em>jobs</em>).</p>

<p>Where some see only a bucket brigade for thieves, others recognize one of the most significant innovations in the last decade of network computing.</p></div>
    </summary>
    <updated>2012-01-24T00:27:31Z</updated>
    <category term="BitTorrent"/>
    <category term="Etsy"/>
    <category term="Solr"/>
    <category term="Replication"/>
    <source>
      <id>http://code.technically.us/</id>
      <author>
        <name>Coderspiel</name>
      </author>
      <link href="http://tumblr.superfeedr.com/" rel="hub" type="text/html"/>
      <link href="http://code.technically.us/" rel="alternate" type="text/html"/>
      <link href="http://code.technically.us/rss" rel="self" type="application/rss+xml"/>
      <title>Coderspiel</title>
      <updated>2012-02-06T22:40:29Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/scalaz-604</id>
    <link href="http://implicit.ly/scalaz-604" rel="alternate" type="text/html"/>
    <title>Scalaz 6.0.4</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><p><span style="">Scalaz </span><span class="il" style="">6.0</span><span style="">.</span><span class="il" style="">4</span><span style=""> is now available. Scalaz is a library to support functional programming in Scala.</span></p>
<div style="">Artifacts are cross built for Scala 2.8.1, 2.9.0-1, 2.9.1, and 2.10.0-M1 and are <a href="http://nexus.scala-tools.org/index.html#nexus-search;gav~org.scalaz~~6.0.4~~">published to Scala Tools</a>.</div>
<div style="">This release fixes a few bugs, including a critical bug in scalaz.concurrent.Actor, and adds a some new features. For more details, see the <a href="https://github.com/scalaz/scalaz/blob/master/notes/6.0.4.markdown">release notes</a> and <a href="https://github.com/scalaz/scalaz/compare/6.0.3...v6.0.4">commit log</a>, and the <a href="http://scalaz.github.com/scalaz/scalaz-2.9.1-6.0.4/doc/index.html#scalaz.package">ScalaDoc</a> (including links to source).</div>
<div style="">
<div>
<div>While most of the library will be binary compatible with 6.0.3, we recommend that you recompile your programs with the new release.</div>
<p/>
<div>- The Scalaz Team</div>
<p/>
<div>PS. Scalaz 7 is currently <a href="https://github.com/scalaz/scalaz/commits/scalaz-seven">in development</a>. It's a <a href="https://github.com/scalaz/scalaz/blob/scalaz-seven/README.md">rewrite</a> to address the challenges posed by type class inheritance. We're hoping that 7.0 will be ready around April.</div>
</div>
</div>
	
<p/>

<p><a href="http://implicit.ly/scalaz-604">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-01-23T21:46:00Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-06T17:20:09Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/loglady-100</id>
    <link href="http://implicit.ly/loglady-100" rel="alternate" type="text/html"/>
    <title>loglady 1.0.0</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><p>This is the first public release of <a href="http://github.com/dln/loglady">loglady</a>,
a very simple logging trait with an API similar to Python's
<a href="http://docs.python.org/library/logging.html">logging</a> library.
</p><p>Example:
</p><div class="CodeRay">
  <div class="code"><pre>class MyClass extends Logging {

  log.warn("We all float (%.4f) down here", 3.141592)
  log.debug("Some random stuff: %d %s %x", 42, List(0, 1, 1, 2, 3, 5), -559038737)
  log.error("Formatted date: %1$tm %1$te,%1$tY", new java.util.Date)

  try {
    throw new Exception("Oops!")
  } catch {
    case exc: Exception =&gt; {
      log.error(exc, "Something bad happened")
    }
  }
}</pre></div>
</div>
<div class="about"> <p><a href="http://github.com/dln/loglady">loglady</a> is a crazy simple logging API for Scala, wrapping <a href="http://www.slf4j.org/">slf4j</a>.
</p> </div>

<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/loglady-100">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-01-23T21:38:52Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-06T17:20:09Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-6373963829340632529.post-370427441742826755</id>
    <link href="http://dcsobral.blogspot.com/feeds/370427441742826755/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="http://dcsobral.blogspot.com/2012/01/string-interpolation-on-scala-210.html#comment-form" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/6373963829340632529/posts/default/370427441742826755" rel="edit" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/6373963829340632529/posts/default/370427441742826755" rel="self" type="application/atom+xml"/>
    <link href="http://dcsobral.blogspot.com/2012/01/string-interpolation-on-scala-210.html" rel="alternate" type="text/html"/>
    <title>String Interpolation on Scala 2.10</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">One of the <a href="http://docs.scala-lang.org/sips/" target="_blank">Scala Improvement Proposals</a> for Scala 2.10 is <a href="http://docs.scala-lang.org/sips/pending/string-interpolation.html" target="_blank">String Interpolation</a>. It has recently been added to trunk, behind the <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">-Xexperimental</span> flag, and I have started playing with it. At first, I stumbled upon bugs and limitations of its current implementation relative to the proposal, but I finally got something working.<br/><br/>To be clear: the interpolation works fine, in both of the provided forms (with and without formatting). As usual with Scala, it's the possibility of replicating the functionality for my own purposes that gets me excited. I usually explain the whys and the hows of my code, but in this case a simple paste says it all, imho.<br/><br/><pre class="brush: scala">dcs@ayanami:~/github/scala (master)$ scala -Xexperimental<br/>Welcome to Scala version 2.10.0.rdev-4232-2012-01-23-g9a20086 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_26).<br/>Type in expressions to have them evaluated.<br/>Type :help for more information.<br/><br/>scala&gt; case class StringContext(parts: String*) {<br/>     |   object matching {<br/>     |     def unapplySeq(s: String): Option[Seq[String]] = {<br/>     |       val re = (parts map ("\\Q" + _ + "\\E") mkString ("^", "(.*?)", "$")).r<br/>     |       re findFirstMatchIn s map (_.subgroups)<br/>     |     }<br/>     |   }<br/>     |   def s(args: Any*) = scala.StringContext(parts: _*).s(args: _*)<br/>     | }<br/>defined class StringContext<br/><br/>scala&gt; "23/01/2012" match { case matching"$day/$month/$year" =&gt; s"$month-$day-$year" }<br/>res0: String = 01-23-2012<br/><br/></pre><br/><br/><div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/6373963829340632529-370427441742826755?l=dcsobral.blogspot.com" width="1"/></div></div>
    </content>
    <updated>2012-01-23T20:38:41Z</updated>
    <published>2012-01-23T20:18:00Z</published>
    <category scheme="http://www.blogger.com/atom/ns#" term="scala 2.10"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="scala"/>
    <author>
      <name>Daniel Sobral</name>
      <email>noreply@blogger.com</email>
      <uri>https://profiles.google.com/109369058791340660984</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-6373963829340632529</id>
      <category term="currying"/>
      <category term="scala"/>
      <category term="case class"/>
      <category term="tuples"/>
      <category term="type class"/>
      <category term="programming"/>
      <category term="manifest"/>
      <category term="continuations"/>
      <category term="sbt"/>
      <category term="language"/>
      <category term="scala 2.10"/>
      <category term="collection"/>
      <category term="puzzle"/>
      <category term="algorithm"/>
      <category term="scala 2.9"/>
      <category term="fibonacci"/>
      <category term="equality"/>
      <category term="style"/>
      <category term="outsourcing"/>
      <category term="regex"/>
      <category term="apl"/>
      <category term="scalable-series"/>
      <category term="agile"/>
      <category term="matrix"/>
      <category term="software"/>
      <category term="type erasure"/>
      <category term="projection"/>
      <category term="linux ubuntu boot grub"/>
      <category term="software-engineering"/>
      <category term="rewritting"/>
      <category term="operators"/>
      <category term="parser"/>
      <category term="architecture"/>
      <category term="beginner"/>
      <category term="compiler"/>
      <author>
        <name>Daniel Sobral</name>
        <email>noreply@blogger.com</email>
        <uri>https://profiles.google.com/109369058791340660984</uri>
      </author>
      <link href="http://dcsobral.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://www.blogger.com/feeds/6373963829340632529/posts/default" rel="self" type="application/atom+xml"/>
      <link href="http://dcsobral.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <link href="http://www.blogger.com/feeds/6373963829340632529/posts/default?start-index=26&amp;max-results=25" rel="next" type="application/atom+xml"/>
      <subtitle>Random thoughts of an IT worker in the stone age of computer science.</subtitle>
      <title>Algorithmically challenged</title>
      <updated>2012-01-25T13:51:17Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-6373963829340632529.post-2311978234863327748</id>
    <link href="http://dcsobral.blogspot.com/feeds/2311978234863327748/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="http://dcsobral.blogspot.com/2011/12/using-scala-api-documentation.html#comment-form" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/6373963829340632529/posts/default/2311978234863327748" rel="edit" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/6373963829340632529/posts/default/2311978234863327748" rel="self" type="application/atom+xml"/>
    <link href="http://dcsobral.blogspot.com/2011/12/using-scala-api-documentation.html" rel="alternate" type="text/html"/>
    <title>Using Scala API Documentation</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">One link that was missing from my post about <a href="http://dcsobral.blogspot.com/2011/12/scala-on-web.html" target="_blank">Scala on the Web</a> was the link to the Scala API documentation, often called "scaladoc" for short, after the tool that generates it. I tried to put it in, but it kind of broke the narrative and, to be honest, I have a lot to talk about the subject. So I decided to do a whole blog just about it.<br/><br/>First of all, there are <i>two main links</i> that you can use to access it:<br/><br/><ul><li><a href="http://www.scala-lang.org/api/current/index.html" target="_blank">The link to the API of the latest Scala release</a>, and</li><li><a href="http://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/index.html" target="_blank">The link to the nightly Scala build of the next Scala version</a></li></ul>Most of the time, I prefer the second link: it contains improvements to the Scaladoc tool, and the documentation often contains improvements. On the other hand, being a nightly release, it is subject to regresssions in the Scaladoc tool, and the documentation contains information that is not correct for the latest release. For that reason, I keep both links in my bookmarks.<br/><br/>So, what else is there to say? Well, if you are new to Scala, a lot. Those familiar with the Java equivalent probably find it both familiar and strange: the screen is divided into left and right sections, the right section having description of classes and packages, while the left contains a list of them. Whereas Java splits package and class lists, however, Scala does not. And, of course, the look is completely different. These, however, are skin-deep differences, and I want to get to the bones of the matter.<br/><br/><br/><span class="Apple-style-span" style="font-size: large;"><b>One Doc, Two Frames</b></span><br/><br/><br/><div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/-vHpdsnaUc2A/Tvnyfw_LuXI/AAAAAAAAAfo/5iknrJnJfQ4/s1600/Selection_001.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="267" src="http://2.bp.blogspot.com/-vHpdsnaUc2A/Tvnyfw_LuXI/AAAAAAAAAfo/5iknrJnJfQ4/s640/Selection_001.png" width="640"/></a></div><br/><br/>The first thing I want you to notice are the two search boxes: one on the left, at the very top of the page, and one on the right, a bit lower. <i>Scaladoc is search-oriented!</i> That means you usually don't browse it, looking for stuff, but just type what you want. You can still browse, of course, which is useful when you don't know what you are looking for.<br/><br/>On the left side you have the package hierarchy and classes, traits and objects belonging to the packages. Note that classes, traits and objects can be members of <i>other</i> classes traits and objects, in which case they won't appear on the left.<br/><br/>The right side contains information about a selected package, trait, class or object. The URL will change to match what is being displayed on the right side of the screen, so that you can easily bookmark or share links to specific class or object. At the present, there's no way to further refer to a member of a class, such as a specific method. This improvement will be added at some point in the future.<br/><br/>Typically, you'll search or browse for a class on the left side of the screen, and then browse its contents on the left, or further search for a particular member of that class.<br/><br/><span class="Apple-style-span" style="font-size: large;"><b>The Left Frame</b></span><br/><br/>Let's drill down the left side, then, to get a better understanding of what's there and how to use it. At the top of the left frame, you'll see this:<br/><br/><div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/-NXmC3xLejA8/Tvn40QqcAnI/AAAAAAAAAf0/oeQJuuDCFmg/s1600/Selection_009.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="72" src="http://4.bp.blogspot.com/-NXmC3xLejA8/Tvn40QqcAnI/AAAAAAAAAf0/oeQJuuDCFmg/s320/Selection_009.png" width="320"/></a></div><br/>Topmost is the search box, with a little "x" icon on the right hand to clear the search. Searching for something will <i>hide</i> any traits, objects and classes that don't match, as well as any packages that don't have any matching members.<br/><br/>Right below that is <i>an index of all existing methods</i>. Click on a letter and you'll get all methods starting with that letter, and the places they are defined at. Click on the hash symbol (#), and you'll get a page with all methods starting with a symbol instead of a letter. For example:<br/><br/><div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/-dV4bg0irZ4U/Tvn6dV0A2xI/AAAAAAAAAgA/GAfLGRRoyi8/s1600/Selection_011.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://4.bp.blogspot.com/-dV4bg0irZ4U/Tvn6dV0A2xI/AAAAAAAAAgA/GAfLGRRoyi8/s320/Selection_011.png" width="315"/></a></div><br/>Finally, you have a small caption saying "<b>display packages only</b>". Surprisingly, that's a clickable option. In fact, ScalaDoc is full of clickable parts, so if you are getting familiar with it, my advice is to try to click stuff, just to see what happens. Back to that caption, though, it switches the package hierarchy from displaying all entities to displaying packages only. Clicking it will give you something like this:<br/><br/><div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/-O6bxuIVdy_o/Tvn7W_BS1II/AAAAAAAAAgM/Vh_OW70mQbQ/s1600/Selection_007.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="294" src="http://4.bp.blogspot.com/-O6bxuIVdy_o/Tvn7W_BS1II/AAAAAAAAAgM/Vh_OW70mQbQ/s320/Selection_007.png" width="320"/></a></div><br/>If you click on "<b>show</b>" on one of these packages, it will open up that particular package. If you click on "<b>display all entities</b>", it will revert to the initial mode of display.<br/><br/>Speaking of "<b>show</b>", let's now look at the various parts of the entities list:<br/><br/><div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/-yCIC7NwlI0E/Tvn7-S-IjLI/AAAAAAAAAgY/feESeZ-Jdn0/s1600/Selection_010.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="76" src="http://3.bp.blogspot.com/-yCIC7NwlI0E/Tvn7-S-IjLI/AAAAAAAAAgY/feESeZ-Jdn0/s320/Selection_010.png" width="320"/></a></div><br/>The darker background indicates package or package objects, and the entities on the lighter background right below it are the classes, objects and traits belonging to that package, as indicated by the icons on their left. Note that, though package objects have other members such as methods, they do not appear on the left frame of Scaladoc.<br/><br/>The icons for <b>"o</b>", "<b>c</b>" and "<b>t</b>", in dark blue, green and light blue respectively, indicate objects, classes and traits. A name can be shared between an object and a trait or class, as seen for <b>Regex</b> above. Traits and classes cannot share the same name, however, so each name will have at most two icons beside it.<br/><br/><i>If you are not familiar with Scala, an object is a singleton, containing what, in Java, would be represented as static.</i><br/><br/>One thing to realize here is that <i>everything in that image is clickable</i>, except whitespace. You can click on "<b>scala.util.matching</b>" and "<b>scala.util.parsing.combinator</b>", on "<b>hide</b>" and "<b>focus</b>", on <b>"Regex</b>" and "<b>RegexParsers</b>", and on the icons.<br/><br/>Clicking on a package name will show its traits, classes and objects on the right frame, unless the package is a <i>package object</i>, in which case the right frame will show the other members it might have. This is important because many package objects contain implicit definitions used as helpers with that package. Check, for instance, <a href="http://www.scala-lang.org/api/current/index.html#scala.sys.process.package" target="_blank">scala.sys.process</a>.<br/><br/>Clicking on "<b>hide</b>" will hide the entities belonging to that particular package, but not any subpackage that might exist. The text will then change to "<b>show</b>", which will revert this action upon being clicked.<br/><br/>Clicking on "<b>focus</b>" will hide all other packages from view, like this:<br/><br/><div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/-2RKUaQriDAA/TvoAtmx8s-I/AAAAAAAAAgk/fiYFaVS-9LU/s1600/Selection_012.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-2RKUaQriDAA/TvoAtmx8s-I/AAAAAAAAAgk/fiYFaVS-9LU/s1600/Selection_012.png"/></a></div><br/>Clicking on the "<b>x</b>" icon that appears will revert this action.<br/><br/>Clicking on an icon for object, class or trait will show information for it on the right frame, as will clicking on the text itself. If an object shares a name with a trait or class, however, clicking on the text will show <i>not the object</i>, but the class or trait, following the assumption that this is what people want most of the time.<br/><br/>On recent ScalaDoc versions, clicking on an entity will also move the focus to the search box on the right frame, so that you can instantly type<br/><br/><span class="Apple-style-span" style="font-size: large;"><b>The Right Frame</b></span><br/><br/>To begin the discussion of the right, I picked <a href="http://www.scala-lang.org/api/current/index.html#scala.collection.GenSeq" style="font-weight: bold;" target="_blank">GenSeq</a>, which is rich enough in ScalaDoc UI components, but (relatively) poor enough in actual content to fit in here.<br/><br/><div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/-l5flMnAJfrc/TvoE8n0czQI/AAAAAAAAAgw/7nbIVK7s99g/s1600/Selection_013.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="406" src="http://2.bp.blogspot.com/-l5flMnAJfrc/TvoE8n0czQI/AAAAAAAAAgw/7nbIVK7s99g/s640/Selection_013.png" width="640"/></a></div><br/>You may have wondered why the search box is not at the top on the right frame, like it is on the left. The reason for it is our starting point in explaining the right frame.<br/><br/><i>The right frame is divided in three parts</i>, the topmost two being shown above. The first part contains general information about the selected entity, and it comprises everything from the top until right before the search box. The second part starts with the search box, and is comprised of everything in that gray background. This part contains <b style="font-style: italic;">display options</b> that affect the third part of the right frame. The third part contains all members of the selected entity, with individual information for each one.<br/><br/>From the top, then, we have a green or blue background (the former for traits and classes, the latter for objects, packages and package objects) on which the name of the entity is prominently displayed. A big icon beside it indicates what kind of entity it is: <b>t</b> for traits, <b>c</b> for classes, <b>o</b> for objects and <b>p</b> for packages and package objects alike.<br/><br/>If the icon is slightly folded on the bottom, like the one in the example, clicking on it (or the entity name) will switch the right frame to the <i>companion</i> of that entity. If you are not familiar with Scala, objects, traits and classes that share a name are said to be companions to each other. Clicking on the <b>GenSeq</b> trait above, then, will display the <b>GenSeq</b> object.<br/><br/>In a smaller font above the entity name is the full path to that entity. Clicking on a path component will display that component.<br/><br/>After that, in a gray background, comes a description of all classes, traits and type parameters used in the definition of that entity. It does not list classes or traits that are inherited -- that is available further below. Not to sound too repetitive, but clicking on any of the classes and traits will display it... Also, moving the mouse over one of these names will show the full path for that name.<br/><br/>What follows is the full description and attributes associated with that entity. I deliberately choose one extremely poor in those, so that I could concentrate on what ScalaDoc provides. One of those things is the link to the source code in which that entity is defined. Not all Scala projects provide that attribute, but Scala API itself does. The link currently points to the web interface to the old Subversion repository -- I presume this will be switched to the new repository on Github in the near future. At any rate, all niceties of source version control systems are available on that link. For the Scala API, anyway.<br/><br/>"<b>Linear Supertypes</b>" and "<b>Known Subclasses</b>" at the bottom of this part can be expanded upon click, to display the exact linearization of an entity's supertypes -- the inheritance precedence -- and all known subclasses. For example, for <b><a href="http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.List" target="_blank">List</a></b> it will show this:<br/><br/><div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/-Q4bMc_hWXCU/TvoPqvb8ozI/AAAAAAAAAhg/uFUPf-x-FTo/s1600/Selection_017.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="108" src="http://4.bp.blogspot.com/-Q4bMc_hWXCU/TvoPqvb8ozI/AAAAAAAAAhg/uFUPf-x-FTo/s640/Selection_017.png" width="640"/></a></div><br/>Also shown above is the tool tip indicating the full path of one of the supertypes being pointed at, just like mentioned above for entity declaration.<br/><br/>Let's now look at the second part of the right frame:<br/><br/><div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/-_kW-ylAc5NQ/TvoQ6VL7DjI/AAAAAAAAAhs/kgX8S3INJiw/s1600/Selection_013b.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="168" src="http://2.bp.blogspot.com/-_kW-ylAc5NQ/TvoQ6VL7DjI/AAAAAAAAAhs/kgX8S3INJiw/s640/Selection_013b.png" width="640"/></a></div><br/>The search box works pretty much like the one on the left frame, hiding anything that isn't a match, but it includes descriptions on the search as well. Search for a verb, therefore, will often yield good results, unless the verb is too general.<br/><br/>One particularly nice feature, available on recent versions, is that typing multiple words will search for matches of any one of the words, which makes it easy to display two methods close together on the screen.<br/><br/>All other options below the search box also change the way things are shown in the third part. The default <b>Ordering</b> mode, <b>Alphabetic</b>, will display <i>all non-private members of an entity</i>, separated in categories which we'll shown below, in alphabetical order. This is different than Java, which only shows full information for members defined or overridden on that class/interface.<br/><br/>Clicking <b>"By inheritance</b>" will change the display mode to separate the members according to where it was last defined/overridden. Full information will still be displayed, and the members will still be shown in alphabetical order in their own section.<br/><br/>The <b>Inherited</b> options let you easily filter out inherited methods. Clicking on "<b>Hide All</b>" will toggle off all supertypes, leaving only the entity itself selected. This will hide methods that are not abstract, defined or overridden on the entity. For <b>GenSeq</b>, for example only two methods will be displayed: <b>seq</b> and <b>companion</b>.<br/><br/>Note that clicking on "<b>Show all</b>" <i>will not</i> select <b>AnyVal</b>, <b>AnyRef</b> or <b>Any</b>. Because the methods defined on these are available on pretty much everything, one rarely needs to see these methods.<br/><br/>Because many times you might be interested in a particular aspect of an entity, you can also toggle each supertype individually. You can do so to display the methods on <b>Any</b>, for example, or you could look into what <b>Function1</b> has to offer to <b>List</b>.<br/><br/>The last option, <b>Visibility</b>, will toggle between displaying only public members and everything except private members.<br/><br/>The last part of the right frame, as mentioned, contains all members of that entity. These are divided into <i>type members</i> and <i>value members</i>. A type member is a <i>trait</i>, a <i>class</i> or a <i>type</i>, and value members are everything else. For example, the <a href="http://www.scala-lang.org/api/current/index.html#scala.util.matching.Regex$" target="_blank">object <b>Regex</b></a> contains this:<br/><br/><div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/-jukXxXs8nu8/TvoXLt4l07I/AAAAAAAAAh4/vNn1zsjLo2Q/s1600/Selection_018.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="270" src="http://2.bp.blogspot.com/-jukXxXs8nu8/TvoXLt4l07I/AAAAAAAAAh4/vNn1zsjLo2Q/s640/Selection_018.png" width="640"/></a></div><br/>Note that anything that shows up as a <i>type member</i> of anything but a package will not be displayed on the left frame, even though you can display it on the right frame by clicking on a link to it.<br/><br/>Value members are actually divided in three separate sections: abstract value members, concrete value members and deprecated value members. These are shown in that precise order, so that one can easily see all members that must be implemented to make a concrete class, and don't get the screen polluted by methods they shouldn't be using -- deprecated methods -- when browsing.<br/><br/>Let's look at some important points of value member definitions. The snapshot below was taken from a <b>List</b> with members filtered by "map":<br/><br/><div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/-ecJPeOdnb4o/TvoY7MXwBOI/AAAAAAAAAiE/FWMexIdpZ48/s1600/Selection_019.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://3.bp.blogspot.com/-ecJPeOdnb4o/TvoY7MXwBOI/AAAAAAAAAiE/FWMexIdpZ48/s640/Selection_019.png" width="640"/></a></div><br/>By default, only a member's definition and the first sentence of its description are shown, like method <b>groupBy</b> above. Clicking on either the small arrow on the left or on the definition itself will show the full information for that member, as seen in the two definitions for <b>map</b>.<br/><br/>Since Scala supports method overload, methods can have multiple definitions. In this particular case, however, the first definition is not a real one -- <i>this is indicated by the <b>[use case]</b> tag</i>. It is important to understand what use cases are, for two reasons: first, they represent the most common way to use the method, and, second, they are lies. Well-meaning lies, but lies.<br/><br/>Compare the definition of the two <b>map</b> methods shown. Clearly, the second definition has a lot going on, whereas the first definition is pretty clear: on a <b>List[A]</b> (see definition for <b>List</b>), the <b>map</b> method takes a function that converts an <b>A</b> into a <b>B</b>, and returns a <b>List[B]</b>.<br/><br/>Though that definition works very fine for <b>List</b>, the <b>map</b> method is not defined on <b>List</b>, but much  higher on the hierarchy. And what works for <b>List</b> won't work for a <b>BitSet</b>, for example: since a <b>BitSet</b> is a <b>Set[Int]</b>, if you map those<b> Int</b> into <b>String</b>, you won't be able to return a <b>BitSet</b>! After all, a <b>BitSet</b>  cannot be a <b>Set[String]</b>. The same thing happens in other cases: a <b>WrappedString</b> is a <b>Seq[Char]</b>, a <b>Map[A, B]</b> is a <b>Iterable[Tuple2[A, B]]</b> (aka <b>Iterable[(A, B)]</b>), etc. In any of these cases, a <b>map</b> definition like in the use case won't work.<br/><br/>So the actual definition of <b>map</b> is the second one, which can handle all of these cases. If you need precise information about <b>map</b> -- for example, if you are extended Scala collections -- you can look it up. On the other hand, if you just want to know how a method is used, the use case should be much easier to understand.<br/><br/>Most of the remaining information is pretty obvious: a description follows, and then various attributes describing how parameters are supposed to be used, what the return type is, etc.<br/><br/>The final interesting thing here is the <b>Definition Classes</b> shown below each method. This only appears when a method has been inherited from elsewhere, and it indicates both where it was originally declared (which might have been as <i>abstract</i>), and all places where it was <i>overridden</i>, <i>ie</i>, the implementation has been changed.<br/><br/>And this concludes the tutorial on using the Scala API documentation, as well as the docs for any other library written in Scala. Looking back, it is much longer (and took much more time to write) than I first thought. Yet, rest assured that using ScalaDoc becomes second nature very fast!<br/><br/><div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/6373963829340632529-2311978234863327748?l=dcsobral.blogspot.com" width="1"/></div></div>
    </content>
    <updated>2012-01-23T20:21:14Z</updated>
    <published>2011-12-27T18:27:00Z</published>
    <category scheme="http://www.blogger.com/atom/ns#" term="beginner"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="scala"/>
    <author>
      <name>Daniel Sobral</name>
      <email>noreply@blogger.com</email>
      <uri>https://profiles.google.com/109369058791340660984</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-6373963829340632529</id>
      <category term="currying"/>
      <category term="scala"/>
      <category term="case class"/>
      <category term="tuples"/>
      <category term="type class"/>
      <category term="programming"/>
      <category term="manifest"/>
      <category term="continuations"/>
      <category term="sbt"/>
      <category term="language"/>
      <category term="scala 2.10"/>
      <category term="collection"/>
      <category term="puzzle"/>
      <category term="algorithm"/>
      <category term="scala 2.9"/>
      <category term="fibonacci"/>
      <category term="equality"/>
      <category term="style"/>
      <category term="outsourcing"/>
      <category term="regex"/>
      <category term="apl"/>
      <category term="scalable-series"/>
      <category term="agile"/>
      <category term="matrix"/>
      <category term="software"/>
      <category term="type erasure"/>
      <category term="projection"/>
      <category term="linux ubuntu boot grub"/>
      <category term="software-engineering"/>
      <category term="rewritting"/>
      <category term="operators"/>
      <category term="parser"/>
      <category term="architecture"/>
      <category term="beginner"/>
      <category term="compiler"/>
      <author>
        <name>Daniel Sobral</name>
        <email>noreply@blogger.com</email>
        <uri>https://profiles.google.com/109369058791340660984</uri>
      </author>
      <link href="http://dcsobral.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://www.blogger.com/feeds/6373963829340632529/posts/default" rel="self" type="application/atom+xml"/>
      <link href="http://dcsobral.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <link href="http://www.blogger.com/feeds/6373963829340632529/posts/default?start-index=26&amp;max-results=25" rel="next" type="application/atom+xml"/>
      <subtitle>Random thoughts of an IT worker in the stone age of computer science.</subtitle>
      <title>Algorithmically challenged</title>
      <updated>2012-01-25T13:51:17Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/scalatra-203</id>
    <link href="http://implicit.ly/scalatra-203" rel="alternate" type="text/html"/>
    <title>scalatra 2.0.3</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><ul><li>Add support for Scala 2.8.2.
</li></ul><h3>scalatra-auth</h3><ul><li>Fix crash in BasicAuthStrategy when no auth header is present. <a href="http://github.com/scalatra/scalatra/issues/143">(GH-143)</a>
</li></ul><h3>scalatra-fileupload</h3><ul><li>Create hook to customize <code>ServletFileUpload</code>, for instance to set maximum upload size.
</li></ul><h3>scalatra-tests</h3><ul><li>Support testing of HEAD requests in Jetty &gt; 7.5.1. <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=363993">(JETTY-363393)</a>
</li></ul><div class="about"> <p><a href="http://github.com/scalatra/scalatra">Scalatra</a> is a tiny, <a href="http://sinatrarb.com/">Sinatra</a>-like web framework for Scala.
</p> </div>

<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/scalatra-203">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-01-23T14:46:36Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-06T17:20:09Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://code.technically.us/post/16344288811</id>
    <link href="http://code.technically.us/post/16344288811" rel="alternate" type="text/html"/>
    <title>Fables of the Reconstruction Part 1: Losing the Thread</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>It’s a wonderful time to be a Scala programmer. The language is
maturing, its community is growing more diverse, and more of its use
is professional. Also and not coincidentally, there are more overheated
debates about its legitimacy to wallow in than ever before. Everybody 
is having a ball.</p>

<p>I’ve been <a href="http://code.technically.us/post/13548980134/the-gist-of-it">reflecting</a> on my first Scala library, Dispatch, and decided
it was time to start the move to a new underlying client
library. The HttpComponents library has served us honorably over the
years. But lately it seems our paths have diverged.</p>

<p>~~~</p>

<p><a href="http://code.technically.us/post/2327110164/javas-loose-threads">Two years ago</a> I finally understood that thread-blocking I/O just does not cut it, and never did. Java had originally bet the farm on threads. Much like the language’s rigid embrace of OOP left no room in its heart for the most basic functional constructs, its commitment to threading squeezed out tried and true models like the event loop. The idea was to dampen the learning curve, and it worked: you only had to learn a few concepts like classes, objects, and threads to get started in Java.</p>

<p>The high computational cost of blocking I/O might have been worth it if the resulting abstractions were improvements over the alternatives. But for all but the most trivial examples, working with those deceptively simple concepts incurs a heavy complexity cost in your own code. Blocking calls must be threaded, and threads must be synchronized, and before you know it you have implemented your own mind boggling concurrency model, rather badly.</p>

<p>Slowly and wisely much of the Java community has migrated to standardized models for concurrency like futures and thread-pool executors, thereby avoiding the horror of deadlocks—but
not exactly burning down the house with I/O performance. And looking around,
those models are fairly similar to the abstractions also used on top of non-blocking
I/O.</p>

<p>After all that fuss, <strong>everyone is riding bicycles but ours aren’t as smart.</strong></p>

<p><img alt="Penny-farthings" src="http://media.tumblr.com/tumblr_ly85h3Klo81qayzh7.jpg"/></p>

<p>To be sure, <a href="http://en.wikipedia.org/wiki/New_I/O">New I/O</a> has been available in Java for a very long while
(since 1.4) and smarter people than me have been harnessing it
since that release. But I am talking about the mainstream of Java and particularly the
mainstream of Scala. I am talking about the answer to the question,
“What’s the Scala way of sending an HTTP request to a server?” Whether
or not the answer has involved bijective maps and symbolic method names, it has
usually involved blocking I/O. And that’s a real problem.</p>

<p>My original plan to reconcile Dispatch with this reality was to offer
an experimental module based on HttpComponent’s NIO client and 
slowly phase out the traditional
module.</p>

<p>But when I began this effort there was only an alpha release of the Apache
NIO client, and the differences between it and the blocking client
were substantial, so that it wasn’t nearly as easy as I had hoped to build a core module with separate wrapping modules for the different clients. The Dispatch
NIO module that came out of this attempt didn’t feel right. It didn’t feel <em>better</em> than
the blocking I/O module, it just felt <em>weirder</em>.</p>

<p>A few months later I tried to upgrade to a newer beta version of the
NIO client only to find that its design had been
significantly changed, and probably improved—but it broke enough
of my code to cause me to reassess the landscape. HttpComponents
was struggling to fit New I/O interaction into their sprawling Old I/O framework, maintaining backwards compatibility but still providing some degree of conceptual unity. For their user base they were fighting the good fight, but I realized it was not my fight.</p>

<p>Life in software is too short to carry anyone else’s baggage.</p>

<p><em>Stay tuned for Part 2: Have you tried rebooting it?</em></p></div>
    </summary>
    <updated>2012-01-23T11:00:06Z</updated>
    <category term="Dispatch"/>
    <category term="Scala"/>
    <category term="Threading"/>
    <category term="Concurrency"/>
    <source>
      <id>http://code.technically.us/</id>
      <author>
        <name>Coderspiel</name>
      </author>
      <link href="http://tumblr.superfeedr.com/" rel="hub" type="text/html"/>
      <link href="http://code.technically.us/" rel="alternate" type="text/html"/>
      <link href="http://code.technically.us/rss" rel="self" type="application/rss+xml"/>
      <title>Coderspiel</title>
      <updated>2012-02-06T22:40:29Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-733023572967116656.post-6045521817017971610</id>
    <link href="http://scala-enterprise.blogspot.com/feeds/6045521817017971610/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="http://scala-enterprise.blogspot.com/2012/01/scala-with-cdi-dependency-injection.html#comment-form" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/733023572967116656/posts/default/6045521817017971610?v=2" rel="edit" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/733023572967116656/posts/default/6045521817017971610?v=2" rel="self" type="application/atom+xml"/>
    <link href="http://scala-enterprise.blogspot.com/2012/01/scala-with-cdi-dependency-injection.html" rel="alternate" type="text/html"/>
    <title>Scala "Bug" with CDI Dependency Injection</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><div class="posterous_autopost">
“Sometimes”, Scala creates <code>public final</code> methods, although the <code>.scala</code> source defines<br/>
no <code>public final</code> method at all.<br/>
There are two things that CDI doesn’t like (which Scala “sometimes” generates):<br/>
1. <code>public final</code> methods<br/>2. <code>public</code> fields<br/>
To investigate and reproduce these problems I created a <a href="https://github.com/ceefour/scala-cdi" target="_blank">scala-cdi project at GitHub</a>.<br/>
<h2>
 public final method: The Bug</h2>
Referencing a parent field from a closure / inner class triggers this behavior:<br/>
<div class="CodeRay">
<div class="code">
<pre>@RequestScoped @Named class IndexBean { private lazy val log = LoggerFactory.getLogger(classOf[IndexBean]) def testExecutor() = { val executor = Executors.newFixedThreadPool(4); executor.submit(new Runnable() { override def run(): Unit = log.debug("Executor is running") }) } }</pre>
</div>
</div>
Compiles to:<br/>
<div class="CodeRay">
<div class="code">
<pre>$ javap -p IndexBean Compiled from "IndexBean.scala" public class com.soluvas.scalacdi.IndexBean extends java.lang.Object implements scala.ScalaObject{ private org.slf4j.Logger com$soluvas$scalacdi$IndexBean$$log; ... public final org.slf4j.Logger com$soluvas$scalacdi$IndexBean$$log();</pre>
</div>
</div>
Deploying this app in Weld will throw:<br/>
<div class="CodeRay">
<div class="code">
<pre>org.jboss.weld.exceptions.UnproxyableResolutionException: WELD-001437 Normal scoped bean class com.soluvas.scalacdi.IndexBean is not proxyable because the type is final or it contains a final method public final org.slf4j.Logger com.soluvas.scalacdi.IndexBean.com$soluvas$scalacdi$IndexBean$$log() - Managed Bean [class com.soluvas.scalacdi.IndexBean] with qualifiers [@Any @Default @Named].         at org.jboss.weld.util.Proxies.getUnproxyableClassException(Proxies.java:225)         at org.jboss.weld.util.Proxies.getUnproxyableTypeException(Proxies.java:178)         at org.jboss.weld.util.Proxies.getUnproxyableTypesExceptionInt(Proxies.java:193)         at org.jboss.weld.util.Proxies.getUnproxyableTypesException(Proxies.java:167)         at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:110)</pre>
</div>
</div>
<h2>
public final method: Workaround</h2>
Create a final local variable to hold the parent instance’s value:<br/>
<div class="CodeRay">
<div class="code">
<pre>def testExecutor() = { val executor = Executors.newFixedThreadPool(4); // this avoids 'log' becoming 'final' like: // private org.slf4j.Logger com$soluvas$scalacdi$IndexBean$$log; // public final org.slf4j.Logger com$soluvas$scalacdi$IndexBean$$log(); val log = this.log; executor.submit(new Runnable() { override def run(): Unit = log.debug("Executor is running") }) }</pre>
</div>
</div>
Which now compiles to:<br/>
<div class="CodeRay">
<div class="code">
<pre>$ javap -p IndexBean Compiled from "IndexBean.scala" public class com.soluvas.scalacdi.IndexBean extends java.lang.Object implements scala.ScalaObject{ private org.slf4j.Logger log; private org.slf4j.Logger log();</pre>
</div>
</div>
<h2>
public field</h2>
I’m not able to reproduce this yet...<br/>
<b>Tip:</b> To <b>learn</b> more about <b>Scala programming</b>, I recommend <b><a href="http://www.amazon.com/gp/product/0981531644/ref=as_li_ss_tl?ie=UTF8&amp;tag=eclipsedriven-20&amp;linkCode=as2&amp;camp=217145&amp;creative=399349&amp;creativeASIN=0981531644">Programming in Scala: A Comprehensive Step-by-Step Guide, 2nd Edition</a></b>.</div><div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/733023572967116656-6045521817017971610?l=scala-enterprise.blogspot.com" width="1"/></div></div>
    </content>
    <updated>2012-01-22T15:31:51Z</updated>
    <published>2012-01-22T15:17:00Z</published>
    <author>
      <name>Hendy Irawan</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/05192845149798446052</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-733023572967116656</id>
      <author>
        <name>Hendy Irawan</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/05192845149798446052</uri>
      </author>
      <link href="http://scala-enterprise.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://scala-enterprise.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://www.blogger.com/feeds/733023572967116656/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" rel="next" type="application/atom+xml"/>
      <link href="http://feeds.feedburner.com/scalaenterprise" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>Scala programming language, Scala tutorials, Scala resources, using Scala with Eclipse IDE / NetBeans / Maven / Java EE / JSF / JPA</subtitle>
      <title>Scala Programming for Enterprise Web Development</title>
      <updated>2012-02-01T10:46:20Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/pj-010</id>
    <link href="http://implicit.ly/pj-010" rel="alternate" type="text/html"/>
    <title>pj 0.1.0</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><ul><li>provides simple library and conscript interfaces for pretty printing json
</li><li><p>see the project <a href="https://github.com/softprops/pj#readme">readme</a> for more info
</p><p>curl 'https://api.twitter.com/1/statuses/public_timeline.json' 2&gt;/dev/null | pj --
</p></li></ul><div class="about"> <p><a href="https://github.com/softprops/pj">pj</a>: is a pretty printing library for json
</p> </div>

<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/pj-010">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-01-22T00:45:16Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-06T17:20:09Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/shapeless-110</id>
    <link href="http://implicit.ly/shapeless-110" rel="alternate" type="text/html"/>
    <title>shapeless 1.1.0</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><p>A minor release of <a href="https://github.com/milessabin/shapeless">shapeless</a>.
The main changes include,
</p><ul><li>The addition of a Sized type for collections with statically known
sizes.
</li><li>The beginning of a collection of non-test examples.
</li><li>The SBT project was missing an organization identifier. This has been
fixed. Thanks to <a href="https://github.com/aloiscochard">aloiscochard</a> for
catching and patching this.
</li></ul><div class="about"> <p><a href="https://github.com/milessabin/shapeless">shapeless</a> is an exploration of 
type class and dependent type based generic programming in Scala.
</p><p>A series of articles on the implementation techniques used will appear
<a href="http://www.chuusai.com/blog">here</a> and it also has a 
<a href="https://groups.google.com/group/shapeless-dev">mailing list</a>.
</p> </div>

<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/shapeless-110">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-01-21T12:46:19Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-06T17:20:09Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/sbt-idea-100</id>
    <link href="http://implicit.ly/sbt-idea-100" rel="alternate" type="text/html"/>
    <title>sbt-idea 1.0.0</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><p>Main changes:
</p><ul><li>Bump up the version to 1.0.0 (main motivation was clearer separation from sbt version)
</li><li>Support for FSC compiler in newer IntelliJ Scala plugins (<a href="https://github.com/mpeltonen/sbt-idea/pull/105">issue 105</a>)
</li><li>Support integration tests (src/it) (<a href="https://github.com/mpeltonen/sbt-idea/pull/121">issue 121</a>)
</li><li>Make 'no-sbt-classifiers' to be the default (<a href="https://github.com/mpeltonen/sbt-idea/issues/119">issue 119</a>)
</li></ul><div class="about"> <p><a href="http://github.com/mpeltonen/sbt-idea/tree/sbt-0.10">sbt-idea</a> is a <a href="https://github.com/harrah/xsbt/wiki">simple-build-tool</a> plugin that automates creation of <a href="http://www.jetbrains.com/idea/">IntelliJ IDEA</a> project files from sbt project definition.
</p> </div>

<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/sbt-idea-100">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-01-21T09:21:36Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-06T17:20:09Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-7317245822288637185.post-2010862824295619276</id>
    <link href="http://grahamhackingscala.blogspot.com/feeds/2010862824295619276/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="http://grahamhackingscala.blogspot.com/2012/01/javascript-and-scala-good-parts-and-bad.html#comment-form" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/7317245822288637185/posts/default/2010862824295619276?v=2" rel="edit" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/7317245822288637185/posts/default/2010862824295619276?v=2" rel="self" type="application/atom+xml"/>
    <link href="http://feedproxy.google.com/~r/blogspot/vnby/~3/bqOoOtnSpfo/javascript-and-scala-good-parts-and-bad.html" rel="alternate" type="text/html"/>
    <title>JavaScript and Scala: Good Parts and Bad</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I've just finished reading <a href="http://www.amazon.com/gp/product/0596517742/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=belmontechno-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0596517742">"JavaScript: The Good Parts" by Douglas Crockford</a>. It's a fantastic book, mostly because it's incredibly concise, elaborating only the details that experienced programmers should need to understand the true form of JavaScript. If you do ANY JavaScript programming and you haven't read it, I suggest you go out and get it straight away, and don't write a single line more of buggy JS code until you do.<br/>
<br/>
<b>What is 'this'?</b><br/>
Early on in the book, Crockford highlights one of JavaScript's oddest and most dangerous quirks: the late binding of 'this'. Basically, whenever you call a function, the value of 'this' within the function is determined by HOW you called the function!<br/>
<br/>
To demonstrate: If object 'a' has a function called 'run()' and you invoke it like this:<br/>
<pre class="brush: text">a.run();
</pre>
then the value of 'this' within 'run()' will be 'a'. JavaScript is a functional language, so functions can be passed around as values. If you instead invoked the function above using only a reference to the function value, like this:<br/>
<pre class="brush: text">var f = a.run;
f();
</pre>
then the value of 'this' within 'run()' will be... the global variable pool! As you can imagine, that can lead to some pretty nasty and hard to track bugs. <br/>
<br/>
<b>Functional Limitations</b><br/>
<b> </b>If you're a fan of functional programming, you might have tweaked straight away that this could place limits on the usefulness of functions as first class objects, and specifically higher-order functions (i.e. functions that take other functions in their parameters). <br/>
<br/>
Here's an example of an object that doesn't work with higher-order functions:<br/>
<pre class="brush: text">var object1 = {
    total: 0,
    add: function(numbers) {
        var i;
        for (i = 0; i &lt; numbers.length; i++) {
            this.total += numbers[i]
        }
        return this.total;
    }
};

var valueOf = function (f, p1) {
    return f(p1);
}

var numbers = [1, 2, 3, 4];

document.writeln(object1.add(numbers) + " / " + valueOf(object1.add, numbers));
// outputs: 10 / NaN
</pre>
Obviously the reason this quirk causes confusion is because JavaScript has borrowed a keyword from other languages but uses it to mean something subtly different. Most OO languages use 'this' to represent a pointer to an object in which the function seemingly resides. Importantly, in OO/functional languages, when a function is used as a value, it takes with it a closure around 'this' that is used when invoking it. In JavaScript, however, the 'this' pointer just refers to the object on which the function was called, or if there was no object, just to the global variable pool.<br/>
<br/>
<b>This Naughtiness Explained</b><br/>
There is a reason for this weirdness. Because JavaScript is classless, the function doesn't actually belong to the object in which it resides. In fact, it's not hard to imagine situations where JavaScript's behaviour is what you'd expect. If I took a function from one object and placed it in another object (which I can do, because the function is also a value), I actually would expect 'this' to refer to the new object when I invoked it, and JavaScript provides just that capability:<br/>
<pre class="brush: text">var b = {};
b.run = a.run;
b.run(); // 'this' will refer to 'b'
</pre>
Once you understand where JavaScript is coming from a bit better, it's not too hard to see the solution to this problem. 'this' doesn't provide a closure around the context where your function was defined, so if you want a closure around the context where your function was defined, then give your function a closure around that context, rather than assuming that 'this' will be the same context whenever the function is invoked. To demonstrate this by correcting the example above:<br/>
<pre class="brush: text">var object2 = (function () {
    var that = {};
    that.total =  0;
    that.add = function(numbers) {
        var i;
        for (i = 0; i &lt; numbers.length; i++) {
            that.total += numbers[i]
        }
        return that.total;
    };
    return that;
})();

document.writeln(object2.add(numbers) + " / " + valueOf(object2.add, numbers));
// outputs: 10 / 20
</pre>
<b>Scala: The Bad Parts?</b><br/>
<b> </b>Does any of this have anything to do with Scala? Well, in the details, no, but in the general sense there is a very important approach in Crockford's book. His suggested solution to the problem above is simple: don't use 'this' in JavaScript and don't use its accompanying feature, 'new'. In fact, he suggests not using LOTS of features of JavaScript. He dedicates 14 pages of appendix to listing them. <br/>
<br/>
Crockford also spends a very un-indulgent two pages discussing the modern phenomenon of "feature-driven design", both in products and programming languages, explaining how "Features that offer value to a minority of users impose a cost on all users" and concluding the book with this pearler: "It would be nice if products and programming languages were designed to have only good parts."<br/>
It was those two lines that caused me to reflect on Scala. I started asking myself questions like: Are there too many features in Scala? Are there parts that aren't "good parts"? Are there features that very few people make use of but that cost everyone because of the complexity they add? From my own experience, the answer to all three of these is "yes". <br/>
<br/>
Crockford explains that we all crave simplicity and that, when we aren't given it, we make it for ourselves by creating our own feature subset, and I realised that I've done this to some extent in the way I use Scala. So finally I began wondering how long it will be until someone publishes "Scala: The Good Parts", complete with appendices listing all the features that you should steer clear of for everyone's sake. What confusing or dangerous feature of Scala do you reckon will be at the top of the list?
<br/><br/>
<b style="color: #444444;">Want to learn more?</b><br/>
<br/>
<table><tbody>
<tr><td style="vertical-align: top;">From Amazon...<br/>
<br/>
&lt;iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=FFFFFF&amp;amp;IS2=1&amp;amp;npa=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=4444CC&amp;amp;t=belmontechno-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=0596517742" style="width:120px;height:240px;"&gt;&lt;/iframe&gt;</td><td style="vertical-align: top;">From Book Depository...<br/>
<br/>
<a href="http://www.bookdepository.com/JavaScript-Good-Parts-Douglas-Crockford/9780596517748/?a_aid=belmonttechnology"><img src="http://belmonttechnology.com.au/javascript_the_good_parts_small.png" style="border: 0pt none;"/></a></td></tr>
</tbody></table><div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/7317245822288637185-2010862824295619276?l=grahamhackingscala.blogspot.com" width="1"/></div>
<p><a href="http://feedads.g.doubleclick.net/~a/fmEA9Xv_ZDX9qHH5Ads0bkkf-ks/0/da"><img border="0" ismap="true" src="http://feedads.g.doubleclick.net/~a/fmEA9Xv_ZDX9qHH5Ads0bkkf-ks/0/di"/></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/fmEA9Xv_ZDX9qHH5Ads0bkkf-ks/1/da"><img border="0" ismap="true" src="http://feedads.g.doubleclick.net/~a/fmEA9Xv_ZDX9qHH5Ads0bkkf-ks/1/di"/></a></p><img height="1" src="http://feeds.feedburner.com/~r/blogspot/vnby/~4/bqOoOtnSpfo" width="1"/></div>
    </content>
    <updated>2012-01-21T03:46:17Z</updated>
    <published>2012-01-21T03:26:00Z</published>
    <category scheme="http://www.blogger.com/atom/ns#" term="javascript"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="functional programming"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="douglas crockford"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="features"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="the good parts"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="simplicity"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="higher-order functions"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="feature-driven design"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="bad parts"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="programming"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="scala"/><feedburner:origLink xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://grahamhackingscala.blogspot.com/2012/01/javascript-and-scala-good-parts-and-bad.html</feedburner:origLink>
    <author>
      <name>Graham Lea</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/07862939329898536954</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-7317245822288637185</id>
      <category term="backwards"/>
      <category term="web application"/>
      <category term="domain model"/>
      <category term="controllers"/>
      <category term="open source software"/>
      <category term="tools"/>
      <category term="solution"/>
      <category term="martin odersky"/>
      <category term="scalac"/>
      <category term="hamlet d'arcy"/>
      <category term="nosuchmethoderror"/>
      <category term="literal"/>
      <category term="books"/>
      <category term="free"/>
      <category term="autocompletion"/>
      <category term="type inference"/>
      <category term="community"/>
      <category term="maven"/>
      <category term="conversion"/>
      <category term="folding"/>
      <category term="MODULE$"/>
      <category term="lean software development"/>
      <category term="scaladoc"/>
      <category term="auto-completion"/>
      <category term="Unit"/>
      <category term="bytecode"/>
      <category term="quick"/>
      <category term="copy"/>
      <category term="code creator"/>
      <category term="resources"/>
      <category term="javap"/>
      <category term="email"/>
      <category term="hql"/>
      <category term="Things"/>
      <category term="typesafe"/>
      <category term="fluent"/>
      <category term="bdd"/>
      <category term="transform"/>
      <category term="line"/>
      <category term="work"/>
      <category term="nil"/>
      <category term="programs"/>
      <category term="tail call optimization"/>
      <category term="main()"/>
      <category term="hans Docketer"/>
      <category term="java"/>
      <category term="pageobject"/>
      <category term="talk"/>
      <category term="wrapping"/>
      <category term="example"/>
      <category term="intentional"/>
      <category term="procedure"/>
      <category term="streams"/>
      <category term="native"/>
      <category term="mutable"/>
      <category term="prezi"/>
      <category term="online"/>
      <category term="mvc"/>
      <category term="crud"/>
      <category term="Oleg Zhurakousky"/>
      <category term="spring 3.1"/>
      <category term="compatibility"/>
      <category term="iterable"/>
      <category term="practical"/>
      <category term="groovy"/>
      <category term="Love"/>
      <category term="error"/>
      <category term="compiler"/>
      <category term="gridgain"/>
      <category term="slides"/>
      <category term="scala.xml.Elem"/>
      <category term="introduction"/>
      <category term="list"/>
      <category term="smart"/>
      <category term="tail call optimistaion"/>
      <category term="dave syer"/>
      <category term="magic"/>
      <category term="efficiency"/>
      <category term="seq"/>
      <category term="option"/>
      <category term="github"/>
      <category term="hacking"/>
      <category term="websockets"/>
      <category term="signal"/>
      <category term="executable requirements"/>
      <category term="Juergen Hoeller"/>
      <category term="delegation"/>
      <category term="critque"/>
      <category term="buffer"/>
      <category term="extractor"/>
      <category term="gradle"/>
      <category term="possible"/>
      <category term="compilation"/>
      <category term="compare"/>
      <category term="ternary operator"/>
      <category term="scala 2.8"/>
      <category term="effective java"/>
      <category term="byte code"/>
      <category term="productivity"/>
      <category term="code"/>
      <category term="roi"/>
      <category term="learning"/>
      <category term="repository"/>
      <category term="expalined"/>
      <category term="enterprise integration"/>
      <category term="compile errors"/>
      <category term="thread-safety"/>
      <category term="jsr-303"/>
      <category term="tailrec"/>
      <category term="graham"/>
      <category term="navigation"/>
      <category term="walk-through"/>
      <category term="recursive function"/>
      <category term="pageobjects"/>
      <category term="feature-driven design"/>
      <category term="imperative"/>
      <category term="decompilation"/>
      <category term="scalasyd"/>
      <category term="meeting"/>
      <category term="wife"/>
      <category term="tail call"/>
      <category term="create"/>
      <category term="GemFire"/>
      <category term="pleasure"/>
      <category term="company"/>
      <category term="concise code"/>
      <category term="fit"/>
      <category term="josh long"/>
      <category term="servlets"/>
      <category term="douglas crockford"/>
      <category term="annotated"/>
      <category term="error highlighting"/>
      <category term="webapp"/>
      <category term="rount-trip engineering"/>
      <category term="sodatest"/>
      <category term="real world"/>
      <category term="what's new"/>
      <category term="meetup"/>
      <category term="higher-kinded types"/>
      <category term="html5"/>
      <category term="web"/>
      <category term="plug-in"/>
      <category term="commercial"/>
      <category term="singleton"/>
      <category term="concurrent programming"/>
      <category term="annotations"/>
      <category term="how to"/>
      <category term="gwt"/>
      <category term="spring integration"/>
      <category term="syntax"/>
      <category term="how"/>
      <category term="Paste"/>
      <category term="distributed systems"/>
      <category term="validation"/>
      <category term="presentation"/>
      <category term="cumulative function"/>
      <category term="spring batch"/>
      <category term="test"/>
      <category term="graham lea"/>
      <category term="bill venners"/>
      <category term="create tools"/>
      <category term="spring roo"/>
      <category term="spring"/>
      <category term="staack overflow"/>
      <category term="shortcuts"/>
      <category term="integration testing"/>
      <category term="keyboard"/>
      <category term="History"/>
      <category term="released"/>
      <category term="performance"/>
      <category term="type-aware"/>
      <category term="eclipse"/>
      <category term="bad parts"/>
      <category term="HelloWorld"/>
      <category term="generate"/>
      <category term="David Brown"/>
      <category term="future"/>
      <category term="xml"/>
      <category term="scala"/>
      <category term="sydney"/>
      <category term="succint"/>
      <category term="facepalm"/>
      <category term="lex spoon"/>
      <category term="attribute"/>
      <category term="object"/>
      <category term="css3"/>
      <category term="immutable"/>
      <category term="webdriver"/>
      <category term="intellij"/>
      <category term="custom tools"/>
      <category term="hsqldb"/>
      <category term="integration"/>
      <category term="tutorials"/>
      <category term="presenting"/>
      <category term="for comprehension"/>
      <category term="jpa"/>
      <category term="scala 2.7"/>
      <category term="coding"/>
      <category term="grid computing"/>
      <category term="release"/>
      <category term="testing"/>
      <category term="why"/>
      <category term="generation"/>
      <category term="foldleft"/>
      <category term="noise"/>
      <category term="recursion"/>
      <category term="springone 2gx 2010"/>
      <category term="jetbrains"/>
      <category term="static linking"/>
      <category term="acceptance testing"/>
      <category term="concise"/>
      <category term="simplicity"/>
      <category term="optimisation"/>
      <category term="design patterns"/>
      <category term="fsc"/>
      <category term="time saving"/>
      <category term="javascript"/>
      <category term="selenium webdriver"/>
      <category term="fast"/>
      <category term="yammer"/>
      <category term="map"/>
      <category term="collection"/>
      <category term="partially-applied functions"/>
      <category term="$tag()"/>
      <category term="higher-order functions"/>
      <category term="look ahead"/>
      <category term="match"/>
      <category term="canbuildfrom"/>
      <category term="switch"/>
      <category term="::"/>
      <category term="expressive"/>
      <category term="2012"/>
      <category term="tail call optimiztaion"/>
      <category term="find"/>
      <category term="address"/>
      <category term="comparison"/>
      <category term="functional"/>
      <category term="cut"/>
      <category term="class"/>
      <category term="sodtest"/>
      <category term="top 10"/>
      <category term="Clipboard"/>
      <category term="hibernate"/>
      <category term="idea"/>
      <category term="Jags Ramnarayan"/>
      <category term="element"/>
      <category term="REST"/>
      <category term="steps"/>
      <category term="ajax"/>
      <category term="convert"/>
      <category term="programming"/>
      <category term="tutorial"/>
      <category term="forward reference extends over definition"/>
      <category term="jsp"/>
      <category term="how-to"/>
      <category term="impossible"/>
      <category term="unapply"/>
      <category term="NoSQL"/>
      <category term="envy"/>
      <category term="learn"/>
      <category term="intellij idea"/>
      <category term="hello world"/>
      <category term="criticism"/>
      <category term="knitting"/>
      <category term="pragmatic"/>
      <category term="imports"/>
      <category term="functional programming"/>
      <category term="features"/>
      <category term="intelligent"/>
      <category term="coda hale"/>
      <category term="reasons"/>
      <category term="anonymous functions"/>
      <category term="the good parts"/>
      <category term="traversable"/>
      <author>
        <name>Graham Lea</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/07862939329898536954</uri>
      </author>
      <link href="http://grahamhackingscala.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://grahamhackingscala.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://www.blogger.com/feeds/7317245822288637185/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" rel="next" type="application/atom+xml"/>
      <link href="http://feeds.feedburner.com/blogspot/vnby" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>The point of "Graham Hacking Scala" is to share with you my knowledge of and experience with the Scala programming language. The blog will contain everything from introductions to basic features through to in-depth analysis of complex techniques and problems. When I make mistakes, you will learn from my mistakes. When I discover cool features, you will learn about them, too.</subtitle>
      <title>Graham Hacking Scala</title>
      <updated>2012-01-21T05:57:27Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://villane.wordpress.com/?p=249</id>
    <link href="http://villane.wordpress.com/2012/01/21/mixfix-operators-parser-combinators-bonus-part-2a/" rel="alternate" type="text/html"/>
    <title>Mixfix Operators &amp; Parser Combinators, Bonus Part 2a</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This is a short bonus post in the Mixfix Operator series. Part 1 was an introduction to mixfix operators and in part 2 we looked at them more closely in the context of a grammar for a boolean algebra and arithmetic language. The implementation of a parser for the language is coming next, but before [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=villane.wordpress.com&amp;blog=820948&amp;post=249&amp;subd=villane&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>This is a short bonus post in the Mixfix Operator series. <a href="http://villane.wordpress.com/2012/01/16/mixfix-operators-parser-combinators-part-1/">Part 1</a> was an introduction to mixfix operators and in <a href="http://villane.wordpress.com/2012/01/17/mixfix-operators-parser-combinators-part-2/">part 2</a> we looked at them more closely in the context of a grammar for a boolean algebra and arithmetic language. The implementation of a parser for the language is coming next, but before that I thought it would be interesting to see what the grammar would look like if we removed the mixfix abstraction and mechanically converted the precedence graph to <a href="http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form">BNF</a> notation.</p>
<p>It turns out this is not that hard if we turn each operator group (graph node) into a separate production and leave out the irrelevant productions for the types of operators we don’t have in those groups. This is especially easy in our case since we only have the same types of operators in each group. I’ll use shorthand names here for brevity.</p>
<blockquote><p><code><br/>
expr ::= or | and | not | eq | cmp<br/>
       | add | mul | exp | neg | tightest</code></p><code>
<p>or   ::= (or | or↑) "|" or↑<br/>
or↑  ::= and | not | eq | cmp | tightest</p>
<p>and  ::= (and | and↑) "&amp;" and↑<br/>
and↑ ::= not | eq | cmp | tightest</p>
<p>not  ::= "!" (not | not↑)<br/>
not↑ ::= eq | cmp | tightest</p>
<p>eq   ::= (eq | eq↑) ("=" | "≠") eq↑<br/>
eq↑  ::= cmp | add | mul | exp | neg | tightest</p>
<p>cmp  ::= (cmp | cmp↑) ("&lt;" | "&gt;") cmp↑<br/>
cmp↑ ::= add | mul | exp | neg | tightest</p>
<p>add  ::= (add | add↑) ("+" | "-") add↑<br/>
add↑ ::= mul | exp | neg | tightest</p>
<p>mul  ::= (mul | mul↑) ("*" | "/" | "mod") mul↑<br/>
mul↑ ::= exp | neg | tightest</p>
<p>exp   ::= (exp | exp↑) "^" exp↑<br/>
exp↑ ::= neg | tightest</p>
<p>neg  ::= "-" (neg | neg↑)<br/>
neg↑ ::= tightest</p>
</code><p><code>tightest := ("(" expr ")") | value<br/>
</code></p></blockquote>
<p>To be honest, encoding the whole graph as BNF is a lot simpler than I initially thought, and so is translating this into a combinator parser. It makes me think whether the mixfix grammar abstraction could be overkill. Of course, this is so easy only because we have relatively few different operators: only left-associative infix, prefix and closed. If we had more operators, with more holes in them, and different types of operators in one group (which is probably not usual, though), perhaps we wouldn’t find the conversion to be that simple any more.</p>
<p>Plainly this simplified scheme won’t help much with user-defined operators and precedence, so I think the mixfix parser abstraction is still useful. However, in cases where there are only a few operators/operator groups, maybe the straightforward translation of this BNF form into parser combinators is preferable. If there’s room left in the next post, I’ll include an alternative implementation based on this scheme.</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/villane.wordpress.com/249/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/villane.wordpress.com/249/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/villane.wordpress.com/249/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/villane.wordpress.com/249/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/villane.wordpress.com/249/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/villane.wordpress.com/249/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/villane.wordpress.com/249/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/villane.wordpress.com/249/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/villane.wordpress.com/249/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/villane.wordpress.com/249/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/villane.wordpress.com/249/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/villane.wordpress.com/249/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/villane.wordpress.com/249/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/villane.wordpress.com/249/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=villane.wordpress.com&amp;blog=820948&amp;post=249&amp;subd=villane&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2012-01-20T23:26:01Z</updated>
    <category term="Programming"/>
    <category term="Programming languages"/>
    <category term="Scala"/>
    <category term="Parsers"/>
    <category term="Slang"/>
    <author>
      <name>Erkki Lindpere</name>
    </author>
    <source>
      <id>http://villane.wordpress.com</id>
      <logo>http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://villane.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://villane.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://villane.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://villane.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Thoughts on software development</subtitle>
      <title>Villane</title>
      <updated>2012-02-06T22:40:09Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://www.scala-lang.org/12256 at http://www.scala-lang.org</id>
    <link href="http://www.scala-lang.org/node/12256" rel="alternate" type="text/html"/>
    <title>Scala IDE for Eclipse: Roadmap!</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>The Scala IDE team have announced the roadmap for the future release of the Scala IDE for Eclipse! This is what they said:</p> <p>"We will have <em>three milestones</em>,  each of them containing both new functionalities and major redesign of  the current plugin’s architecture. In fact, one important goal of the  future release is to provide a clean and simple API to developers  interested in building plugins on top of the Scala IDE."</p> <p>Read the rest of the announcement on the <a href="http://scala-ide.org/blog/scala-ide-roadmap.html" rel="nofollow">Scala IDE blog</a>.</p></div>
    </summary>
    <updated>2012-01-20T14:01:50Z</updated>
    <author>
      <name>dotta</name>
    </author>
    <source>
      <id>http://www.scala-lang.org/</id>
      <link href="http://www.scala-lang.org/" rel="alternate" type="text/html"/>
      <link href="http://www.scala-lang.org/rss.xml" rel="self" type="application/rss+xml"/>
      <title>The Scala Programming Language</title>
      <updated>2012-02-06T22:40:37Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-2267747408703654731.post-8137870764380768166</id>
    <link href="http://pchiusano.blogspot.com/feeds/8137870764380768166/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="http://www.blogger.com/comment.g?blogID=2267747408703654731&amp;postID=8137870764380768166" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/2267747408703654731/posts/default/8137870764380768166" rel="edit" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/2267747408703654731/posts/default/8137870764380768166" rel="self" type="application/atom+xml"/>
    <link href="http://pchiusano.blogspot.com/2012/01/possible-projects-for-boston-haskell.html" rel="alternate" type="text/html"/>
    <title>Possible projects for Boston Haskell Hackathon: smarter evaluation strategies and refactoring combinators</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>This weekend I'm going to be participating in the <a href="http://www.haskell.org/haskellwiki/Hac_Boston">Boston Haskell hackathon</a>. I'm very excited about it and I have a couple idea for projects to work on. If any of these sound interesting or you are thinking of something similar, I'm looking for people to collaborate with! Send me an email or come talk to me in person! I think I'm going to get there sometime in the late afternoon to early evening on Friday and I'll be around all weekend.</p><h2 id="evaluation-strategies-for-haskell-that-dont-leak-space">Evaluation strategies for Haskell that don't leak space</h2><p>The first project is doing some research / prototyping of an alternate evaluation strategy with the same termination properties as normal order evaluation, but with much easier reasoning about space usage. For lack of a better name, I'm calling it <em>specializing, strictness-propagating evaluation</em>. In this model, calling a function is something like two communicating coroutines. When calling a function, the callee begins evaluating its body, yielding control back to the caller when it needs its first argument, and also indicating whether that argument should be strict or lazily passed, using whatever information is available at runtime. Subsequent arguments work similarly. As a result, functions are automatically specialized as arguments are passed, and we do not construct thunks if they are going to be consumed strictly by a subsequent callee. This can be implemented efficiently using just two call stacks, and there are various optimizations to the scheme. It is intended to augment, not replace, the existing static strictness analysis and argument passing.</p><p>Here's an example working through this for the <code>if</code> function, which let's assume has the following implementation:</p><pre><code>foldl f z l = case l of <br/>  [] -&gt; z<br/>  h:t -&gt; foldl t f (f z h)<br/></code></pre><p>I'm also going to assume we've done some static strictness analysis to determine that all branches evaluate <code>z</code> and that therefore the <code>h:t</code> branch evaluates <code>f</code> (since all branches evaluate <code>z</code> and in the <code>h:t</code> case, <code>f</code> appears at the head of an expression passed as <code>z</code>). Suppose we call this with <code>foldl (+) 0 [1,2,3,4]</code>.</p><ol style=""><li>Caller pushes <code>foldl</code> onto the call stack. <code>foldl</code> begins evaluating with no arguments. It gets as far as the <code>case l</code>. It will then request <code>l</code> strictly, since it is about to evaluated it anyway.</li><li>To request the argument, <code>foldl</code> pops its currently running frame from the call stack and pushes it onto the <em>save stack</em>. It then resumes the caller now at the top of the call stack with an argument of <code>strict</code>.</li><li>The caller passes the argument as requested - if the caller were itself receiving these arguments as function parameters, it would propagate the strictness request of <code>foldl</code> to <em>its</em> caller.</li><li>To resume <code>foldl</code>, it pops <code>foldl</code> from the save stack and pushes it onto the call stack, giving it the (strictly evaluated) list it requested.</li><li>Now we hit the interesting case: inside the <code>h:t</code> branch, we know that <code>z</code> is strict (this is known statically). We also know that <code>f</code> can now be evaluated, so we request this argument strictly from our caller. With <code>f</code> now evaluated, we can propagate its stricness information. We know we will be evaluating <code>f z h</code> - what we did not know until runtime was that <code>f</code> was plus (let's just say it was <code>+</code> specialized to <code>Int</code>), and therefore static SA has no choice but to pass <code>f z h</code> as a thunk. We now know that <code>f</code> is strict in both its arguments, so the call to <code>f z h</code> means we can fully evaluate <code>z</code> (which we do by requesting <code>z</code> strictly from our caller), <code>h</code>, and then <code>f z h</code>.</li></ol><p>Each step of the iteration works similarly and <code>foldl</code> ends up running in constant space. I'm handwaving a lot here, but in general I want an evaluation order that is totally predictable in its space usage - values are immediately forced as soon as their consuming functions are known at runtime. The consuming functions tell us if an argument will ultimately be forced so we find out sooner rather than building up enormous thunks.</p><p>This needs some serious whiteboarding, but assuming it is at all sensible, here's what I propose doing:</p><ul><li>Come up with an instruction set for this evaluation model, and write a simple interpreter for it</li><li>Write a compiler for a toy functional language to this instruction set, including the basic static analysis needed to kickstart the dynamic analysis</li><li>Try writing some programs with it</li></ul><p>Some other interesting ideas - I wonder if there's some way to embed this evaluation model in GHC itself.</p><h2 id="a-code-database-for-haskell-and-refactoring-combinators">A code database for Haskell and refactoring combinators</h2><p>The other project I'm interested in working on is a code database for Haskell, and a <a href="http://en.wikipedia.org/wiki/Datalog">Datalog</a> interpreter to go with it. Using this database and the datalog query language, I then want to implement a set of <em>refactoring combinators</em>. A "refactoring" is simply a <em>compilation-preserving</em> function from one code database to another. I've started tinkering with a set of combinators that individually preserve compilation and can be composed to allow arbitrary code transformations. I wrote up some ideas for that <a href="http://pchiusano.blogspot.com/2011/12/future-of-programming.html">here</a>:</p><blockquote><p>... Refactoring times in this new model will go from weeks or months to hours, and writing code to transform a codebase will become a separate but critical skill, distinct from the usual act of programming. That is, programmers do not simply conceive of a refactoring (which is often quite simple to express to another programmer), then begin a tedious, manual and error-prone process of text munging to implement it. Instead, the programmer conceives of a refactoring, then conceives of a code transforming program to implement the refactoring, then applies this transformation to the code database, all in the span of a few hours.</p></blockquote><blockquote><p>... First, I am not advocating for datalog syntax. I don't care about that. The key functionality enabled by datalog over and above the relational algebra is the ability to express transitive closure and mutual recursion guaranteed to terminate. Together these features enable many of the common queries we'd like to express in transforming and querying our codebases. For instance, here is a hypothetical query to find all references to a given function id, fid. Don't worry if the syntax looks alien or doesn't make sense. The key is more that this query is just a few lines of code to express, and it can be reused and built upon.</p></blockquote><blockquote><pre><code>-- propagate reference to containing apply<br/>refs(Id) :- apps(Id, fid, _). <br/>refs(Id) :- apps(Id, _, fid).<br/>refs(Id) :- refs(X), apps(Id,X,_).<br/>refs(Id) :- refs(X), apps(Id,_,X).<br/>-- any lambda whose body is or contains fid<br/>-- is considered to reference fid<br/>return(Id) :- lambdas(Id,_,Id1), refs(Id1).<br/>return(Id) :- lambdas(Id,_,fid).<br/></code></pre></blockquote><p>Much of the analysis required to implement refactorings has this sort of "transitive-closure" feel to it - you need to do something to the "direct" callers, then do some transformation for their callers as necessary, and so on.</p><p>Here's what I propose for this project:</p><ul><li>Implement datalog, possibly backed by just in-memory data structures, or maybe tied to something like SQLite. Or if there's an existing free datalog interpreter and backend for it somewhere, let's see if we can use that.</li><li>Come up with the normalized datalog representation for the Haskell AST and type information - besides just the AST I think you'll need to know all the type information. Is there some way to use the GHC API to get the type of all expressions in the</li><li>Implement or steal a Haskell parser, and write code to translate this to the normalized datalog representation. As a proof of concept, take some existing Haskell project and "code-database-ify" it.</li><li>Come up with a good set of refactoring combinators. Implement them using datalog. As a proof of concept, use the combinators to express some nontrivial refactoring (like - make this value monadic rather than pure, and propagate the change in calling convention to all direct and indirect callers as needed - this is exactly the sort of refactoring that is trivial to describe to another Haskell programmer, and is totally mechanical, but is still done via a tedious process of text munging)</li></ul><p>If all this is too much, I propose not doing this for Haskell but instead for a toy functional language with a very simple AST and type system.</p><div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/2267747408703654731-8137870764380768166?l=pchiusano.blogspot.com" width="1"/></div></div>
    </content>
    <updated>2012-01-20T01:07:54Z</updated>
    <published>2012-01-19T15:57:00Z</published>
    <category scheme="http://www.blogger.com/atom/ns#" term="haskell"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="programming"/>
    <author>
      <name>Paul Chiusano</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/04844651950877109501</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-2267747408703654731</id>
      <category term="mathematics"/>
      <category term="economics"/>
      <category term="scala"/>
      <category term="health"/>
      <category term="haskell"/>
      <category term="politics"/>
      <category term="programming"/>
      <author>
        <name>Paul Chiusano</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/04844651950877109501</uri>
      </author>
      <link href="http://pchiusano.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://www.blogger.com/feeds/2267747408703654731/posts/default" rel="self" type="application/atom+xml"/>
      <link href="http://pchiusano.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <link href="http://www.blogger.com/feeds/2267747408703654731/posts/default?start-index=26&amp;max-results=25" rel="next" type="application/atom+xml"/>
      <subtitle>(Stuff worth thinking about)</subtitle>
      <title>Prettt-tty, pretty, pretty good!</title>
      <updated>2012-01-27T08:48:12Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://www.scala-lang.org/12250 at http://www.scala-lang.org</id>
    <link href="http://www.scala-lang.org/node/12250" rel="alternate" type="text/html"/>
    <title>Scala 2.10.0 Milestone 1 is released!</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>A <a href="http://www.scala-lang.org/downloads#Milestones">milestone release</a> for Scala is now available. This release is cut directly from current development and is not intended for production environments, but is a great chance to try out the up and coming features for Scala 2.10.0.</p> <p>Included in this release are:</p> <ul>     <li>Preliminary Reflection API</li>     <li>faster inliner</li>     <li>scaladoc improvements (Thanks docspree folks!)</li>     <li>virtualized pattern matcher</li>     <li>many more!</li> </ul> <p>Expect monthly milestone released for 2.10.0 before it enters an official release cycle. Get your feedback and suggestions in early!</p></div>
    </summary>
    <updated>2012-01-19T22:42:04Z</updated>
    <author>
      <name>admin</name>
    </author>
    <source>
      <id>http://www.scala-lang.org/</id>
      <link href="http://www.scala-lang.org/" rel="alternate" type="text/html"/>
      <link href="http://www.scala-lang.org/rss.xml" rel="self" type="application/rss+xml"/>
      <title>The Scala Programming Language</title>
      <updated>2012-02-06T22:40:37Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/xsbt-gpg-plugin-05</id>
    <link href="http://implicit.ly/xsbt-gpg-plugin-05" rel="alternate" type="text/html"/>
    <title>xsbt-gpg-plugin 0.5</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><p>A new version of the PGP signing plugin for SBT has been released.  New in this version</p>
<ul>
<li>Accepts passphrase in the console, thanks to advice from Mark</li>
<li>Option to explicitly pass the -use-agent flag to gpg.</li>
<li>Defautls to bouncy castle, always.</li>
<li><a href="http://www.scala-sbt.org/xsbt-gpg-plugin/">New website</a>.</li>
</ul>
<p>Feel free to use and send an issue back to the <a href="https://github.com/sbt/xsbt-gpg-plugin/issues">source</a>.</p>
	
<p/>

<p><a href="http://implicit.ly/xsbt-gpg-plugin-05">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-01-19T14:35:00Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-06T15:20:09Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://www.scala-lang.org/12226 at http://www.scala-lang.org</id>
    <link href="http://www.scala-lang.org/node/12226" rel="alternate" type="text/html"/>
    <title>Scala Days - Keynotes and Call for Speakers</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Scala Days 2012 shapes up! You will have top-notch keynote speakers, great research papers, a magical evening event and now we call for stimulating speakers to give session talks. If you have used Scala in an innovative commercial application, created a neat Scala development tool or used Scala in a new and productive way then the rest of the community would like to hear about it. Being a speaker at Scala Days and sharing your knowledge not only helps everyone up their game but also gives you a free ticket to the 2012 event.</p> <p>Submit a 200-300 word talk abstract <a href="http://days2012.scala-lang.org/node/101">here</a>, submission cutoff deadline is the 22th February 2012. The talks review committee, Andy Hicks, Nathan Hamblen, Chris Conrad, Phil Bagwell and Ariaan Moors, will make the selection for inclusion in final Scala Days program. Speakers choosen will receive a free entry coupon for registration while the remainder can still obtain a discounted "Early Bird" registration.</p> <p>Your keynote speakers this year need little introduction. They will be: Anthony Rose, Simon-Peyton Jones, Guy Steele and Martin Odersky.</p></div>
    </summary>
    <updated>2012-01-18T09:57:29Z</updated>
    <author>
      <name>bagwell</name>
    </author>
    <source>
      <id>http://www.scala-lang.org/</id>
      <link href="http://www.scala-lang.org/" rel="alternate" type="text/html"/>
      <link href="http://www.scala-lang.org/rss.xml" rel="self" type="application/rss+xml"/>
      <title>The Scala Programming Language</title>
      <updated>2012-02-06T22:40:37Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://code.technically.us/post/16029414216</id>
    <link href="http://code.technically.us/post/16029414216" rel="alternate" type="text/html"/>
    <title>Option[Scala]: Adding Scala to your company's software stack - NY Scala</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><a href="http://www.meetup.com/ny-scala/events/47948772/">Option[Scala]: Adding Scala to your company's software stack - NY Scala</a>: <p>These days our ny-scala meetups are filling up before I get around to posting them here. (Almost?)</p>

<p><a class="mu-rsvp-btn" href="http://www.meetup.com/ny-scala/events/47948772/">RSVP</a></p></div>
    </summary>
    <updated>2012-01-17T23:28:31Z</updated>
    <category term="Scala"/>
    <category term="Meetups"/>
    <category term="Subterfuge"/>
    <source>
      <id>http://code.technically.us/</id>
      <author>
        <name>Coderspiel</name>
      </author>
      <link href="http://tumblr.superfeedr.com/" rel="hub" type="text/html"/>
      <link href="http://code.technically.us/" rel="alternate" type="text/html"/>
      <link href="http://code.technically.us/rss" rel="self" type="application/rss+xml"/>
      <title>Coderspiel</title>
      <updated>2012-02-06T22:40:29Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://villane.wordpress.com/?p=216</id>
    <link href="http://villane.wordpress.com/2012/01/17/mixfix-operators-parser-combinators-part-2/" rel="alternate" type="text/html"/>
    <title>Mixfix Operators &amp; Parser Combinators, Part 2</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In the previous post I introduced the notion of mixfix operators. In this post we will look at them more closely, in the context of an actual grammar. In the next part we will implement the parser for this grammar, look at performance issues and try to fix them with packrat parsers. We will implement [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=villane.wordpress.com&amp;blog=820948&amp;post=216&amp;subd=villane&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>In the <a href="https://villane.wordpress.com/2012/01/16/mixfix-operators-parser-combinators-part-1/">previous post</a> I introduced the notion of mixfix operators. In this post we will look at them more closely, in the context of an actual grammar. In the next part we will implement the parser for this grammar, look at performance issues and try to fix them with packrat parsers.</p>
<p>We will implement a simple language that consists of boolean algebra and integer arithmetic expressions. The grammar for the language looks like the following (we’re only considering tokens here and assume that a lexical parser has already identified literals, identifiers and delimiters in the text)</p>
<blockquote><p><code>statement   ::= expression | declaration<br/>
declaration ::= variable ":=" expression<br/>
expression  ::= ??? | value<br/>
value       ::= literal | variable<br/>
literal     ::= booleanLiteral | integerLiteral<br/>
variable    ::= identifier</code></p></blockquote>
<p>What should the expression productions look like, though? In examples of parsers and grammars we can commonly find an arithmetic expression language described with concepts of ‘factor’ and ‘term’ to create a precedence relation between addition and multiplication:</p>
<blockquote><p><code>expression ::= (term "+")* term<br/>
term       ::= (factor "*")* factor<br/>
factor     ::= constant | variable<br/>
               | "(" expression ")"</code></p></blockquote>
<p>This seems simple, but when we add more precedence rules, it can get quite complex, especially if we are writing a parser for a general purpose programming language instead of a simple expression language, and we also do semantic actions (create AST nodes) in the parser. This also makes the set of operators rather fixed: you might have to change several grammar productions to add a new operator with a new precedence level. I didn’t even try building Slang’s precedence rules into the grammar in this fashion.</p>
<p>Mixfix parsers still make the precedence part of the grammar, but there is a layer of abstraction there: we describe operators and their precedence rules as a directed graph, where (groups of) operators are the nodes and precedences are the edges. Then we instantiate the grammar with that particular precedence graph.</p>
<p>Before getting to the precedence rules in the language we are about to create, lets look at the operators it will have. In the list below, <code>_</code> means a hole in the expression that can contain any other expression that “binds tighter” than the operator in question. In the case where the hole is closed on both left and right, it can contain any expression at all. Only a pair of parentheses forms a closed operator in this language.</p>
<blockquote><p><code>( _ )</code> – parentheses<br/>
<code>_ + _</code> – addition<br/>
<code>_ - _</code> – subtraction<br/>
<code>  - _</code> – negation<br/>
<code>_ * _</code> – multiplication<br/>
<code>_ / _</code> – division<br/>
<code>_ ^ _</code> – exponent<br/>
<code>_ mod _</code> – modulo/remainder<br/>
<code>_ = _</code> – equality test<br/>
<code>_ ≠ _</code> – inequality test<br/>
<code>_ &lt; _</code> – less than<br/>
<code>_ &gt; _</code> – greater than<br/>
<code>_ &amp; _</code> – conjunction<br/>
<code>_ | _</code> – disjunction<br/>
<code>  ! _</code> – logical not</p></blockquote>
<p>This doesn’t include many common operators in real programming languages, but it is enough to demonstrate some interesting aspects of mixfix operators and using a DAG to describe their precedence relations. I used <code>mod</code> instead of <code>%</code> to show that operators don’t have to be symbols.</p>
<p>Before defining the precedence rules, lets look at some sample expressions and how we want them to be interpreted, mostly sticking with existing well known precedence rules, such as those in C, Java or Scala, but occasionally deviating from them:</p>
<blockquote><p><code>a + b * c      = a + (b * c)<br/>
a &lt; b &amp; b &lt; c  = (a &lt; b) &amp; (b &lt; c)<br/>
-5 ^ 6         = (-5) ^ 6<br/>
a &amp; !b | c     = (a &amp; (!b)) | c<br/>
5 &lt; 2 ≠ 6 &gt; 3  = (5 &lt; 2) ≠ (6 &gt; 3)<br/>
1 &lt; x &amp; !x &gt; 5 = (1 &lt; x) &amp; !(x &gt; 5)</code></p></blockquote>
<p>I think that’s enough examples for now. Lets try to describe the rules behind these somewhat intuitive expectations as a precedence graph. First, we’ll put the operators into groups where all operators in one group bind just as tightly as the others in the same group. For example <code>1 + 2 - 3</code> will be <code>(1 + 2) - 3</code> and <code>1 - 2 + 3</code> will be <code>(1 - 2) + 3</code></p>
<blockquote><p><code>parentheses   : ()<br/>
negation      : - (prefix)<br/>
exponent      : ^<br/>
multiplication: *, /, mod<br/>
addition      : +, -<br/>
comparison    : &lt;, &gt;<br/>
equality      : =, ≠<br/>
not           : ! (prefix)<br/>
and           : &amp;<br/>
or            : |</code></p></blockquote>
<p>Negation (prefix <code>-</code>) is in it’s own group so that we can do: <code>-2 + 1</code>. If it was in the same group with infix <code>-</code> and <code>+</code>, then it couldn’t appear next to them without parentheses because prefix operators are treated as right-associative, but most infix operators, such as <code>-</code> and <code>+</code> are left-associative. And we can’t mix left-associative and right-associative operators of the same precedence level! Why? Take the expression</p>
<blockquote><p><code>1 + 2 - 3</code></p></blockquote>
<p>If <code>+</code> and <code>-</code> are left-associatve, it means <code>(1 + 2) - 3</code>.</p>
<p>If <code>-</code> is right-associative instead, then both <code>(1 + 2) - 3</code> and <code>1 + (2 - 3)</code> would be right!</p>
<p>We could read the list of operator groups above as an order of precedence, where the first group (<code>parentheses</code>) binds tightest and the last group (<code>or</code>) binds least tight. This would be mostly compatible with many programming languages and we would have a good enough set of precedence rules right there.</p>
<p>However, as mentioned earlier, Danielsson’s mixfix grammar scheme describes precedence relations as a directed graph. Each of the groups above is a node in the graph, and a directed edge from one node to another <code>a -&gt; b</code> means: <code>b binds tighter than a</code>. So lets describe these relations as a graph instead — it will be in reverse order compared to the above list where we started from the most tightly binding:</p>
<blockquote><pre><code>or             -&gt; and, not, equality, comparison, parentheses
and            -&gt; not, equality, comparison, parentheses
not            -&gt; equality, comparison, parentheses

equality       -&gt; comparison, addition, multiplication, exponent, negation, parentheses
comparison     -&gt; addition, multiplication, exponent, negation, parentheses

addition       -&gt; multiplication, exponent, negation, parentheses
multiplication -&gt; exponent, negation, parentheses
exponent       -&gt; negation, parentheses
negation       -&gt; parentheses</code></pre>
</blockquote>
<p>Notice that from each group we draw the edge not into a single group, but into all of the groups that bind tighter. This is because of the non-transitivity of precedence in this scheme: each pair of operator groups that is to have a precedence relation must have an edge between them in the graph. The advantage of this is that we don’t need to describe the precedence between operators that aren’t related at all. This is one of the motivations for using a directed graph to represent operator precedence.</p>
<p>I hope that from the names of the operators it was clear that some of them will apply only to booleans and some only to integers. For example, the <code>&amp;</code> operator isn’t defined as bitwise <code>&amp;</code>, only as logical conjunction. Thus, assuming that our language is strongly typed, some of the operators can’t appear in the holes of some other operators in a correct program.</p>
<p>A parser doesn’t do type checking of course, but with this mixfix grammar scheme, it does implicitly do precedence correctness checking. For example <code>4 + 5 &amp; 6 + 4</code> is not precedence correct, as we didn’t define a precedence relation between <code>addition</code> and <code>and</code>. And due to the parser’s precedence checking, this expression will not even parse.</p>
<p>If we had used a total precedence order instead, we would have <code>+</code> binding tighter than <code>&amp;</code>. The expression would be interpreted as <code>(4 + 5) &amp; (6 + 4)</code> but would probably yield a type error as <code>&amp;</code> works on booleans, but <code>+</code> works on integers. We could write <code>(4 + 5) &amp; (6 + 4)</code> ourselves and that would also parse, because we made the precedence explicit. Well, actually parentheses follow the same rules: remember that in our graph, <code>()</code> bind tighter than everything.</p>
<p>The fact that the parser only produces precedence correct expressions can be both a blessing and a curse.</p>
<p>On one hand, this allows us to view some unrelated groups of operators almost as sublanguages. In our case, boolean algebra and integer arithmetic. This might be good for implementing internal DSLs in the presence of extremely flexible user-defined mixfix operators. We could allow users to extend our precedence graph or even replace it completely with their own. If a DSL has boolean logic in it, but no arithmetic, it might have precedence relations to logical operators, but not to arithmetic operators. This would preclude arithmetic operators from appearing in the DSL without being surrounded by parentheses. Or the DSL could even disallow parentheses. Implementing this much flexibility in a host language is complicated, though. For example, the parser would have to know about any custom mixfix grammars defined in imported modules.</p>
<p>On the other hand, this puts some correctness checks at the wrong level. Arguably, a parser should only validate the syntax of a program and nothing else. If a simple mistake such as using a wrong operator (equal to calling a non-existing method in some languages) would prevent the whole program from being parsed, it would also prevent the compiler from doing <a href="http://james-iry.blogspot.com/2012/01/type-errors-as-warnings.html">other interesting and useful things</a>, or reporting better error messages.</p>
<p>So maybe this grammar scheme isn’t ideal for a general purpose programming language. I am sticking with it in Slang for now, because the scheme is relatively simple and works for me at least as long as I’m the only user of Slang :) And perhaps there are workarounds that would allow a precedence-incorrect expression to be accepted by the parser still. But I don’t have immediate plans to allow a wide variety of user-defined mixfix operators or operator precedence.</p>
<p>Anyway, for our simple language, I think this scheme works well enough as long as we don’t care whether it is the parser or the type checker that reports the errors in incorrect programs. There aren’t any useful direct precedence relations between boolean algebra operators and arithmetic operators here. Only by having <code>equality</code>, <code>comparison</code> or <code>parentheses</code> between them, can we put them in the same expression.</p>
<p>Lets look at one of the consequences of our rules more closely. Many languages, including Java and C, would put most prefix (unary) operators such as <code>!</code> and <code>-</code> at the same level of precedence, binding tighter than all infix (binary) operators. In Java, <code>!6 == 5</code> is a type error because the operator <code>!</code> is bound to <code>6</code>, not to <code>6 == 5</code>, and <code>!</code> isn’t defined on integers. In our language, it isn’t necessary to have <code>!</code> at the same level as <code>-</code>, though. Since there is no (precedence) relation between logical and arithmetic operators, <code>!6 + 5</code> will not parse. But <code>!</code> does have a relation to comparison and equality tests (they bind tighter), so you can write <code>!6 = 5</code> and it will mean <code>!(6 = 5)</code>.</p>
<p>The precedence rules that have <code>=</code> binding tighter than boolean operators is based on the assumption that booleans are rarely compared to each other, but multiple comparisons of other types of values are often used in disjunctions, conjunctions and complements.</p>
<p>To get back to the question in the beginning of the post, what would the expression production in the grammar look like instead of <code>expression ::= ??? | value</code>? The short answer is that we replace <code>???</code> with the mixfix grammar scheme instantiated with our particular precedence graph. The long answer would probably take an entire blog post by itself. You can read more about this scheme in the <a href="http://www.cse.chalmers.se/%7Enad/publications/danielsson-norell-mixfix.html">Agda paper</a>, or look at the source code of my <a href="https://github.com/Villane/mixfix-parsers/tree/master/src/main/scala/mixfix">mixfix library</a>. The scheme looks somewhat like the parser combinators in the following pseudo-code (<code>~</code> means sequential composition):</p>
<pre><code>value = variable | literal
expression = mixfixGrammar(precedenceGraph) | value

mixfixGrammar(graph) = {
  // graph - the precedence graph
  // g - an operator group, node in the graph
  // op - an operator in a group

  ⋁(parsers) = // returns the result of the first parser in the list to succeed

  opsLeft(g)   = // all left-associative infix operators in g
  opsRight(g)  = // all right-associative infix operators in g
  opsNon(g)    = // all non-associative infix operators in g
  opsClosed(g) = // all closed operators in g
  opsPre(g)    = // all prefix operators in g
  opsPost(g)   = // all postfix operators in g

  operator(op) =
    if (op.internalArity == 0)
      op.namePart1
    if (op.internalArity == 1)
      op.namePart1 ~ expression ~ op.namePart2
      // expression is an recursive reference back to the "outer" production
      // these are the internal "holes" that can take any expression

  group(g)  = closed(g) | non(g) | left(g) | right(g)    // any ops in this group

  closed(g) = ⋁{ opsClosed(g) map operator }             // closed ops

  non(g)    = ↑(g) ~ ⋁{ opsNon(g) map operator } ~ ↑(g)  // non-associative ops

  left(g)   = (left(g) | ↑(g))                           // left-associative ops
              ~ ( ⋁{ opsPost(g) map operator }
                | ⋁{ opsLeft(g) map operator } ~ ↑(g) )

  right(g)  = ( ⋁{ opsPre(g) map operator }              // right-associative ops
              | ↑(g) ~ ⋁{ opsRight(g) map operator } )
              ~ (right(g) | ↑(g))

  ↑(g) = ⋁{ graph.groupsTighterThan(g) map group } // every group that binds tighter than g
         | value                                   // or the tightest "group" of values

  return ⋁{ graph.nodes map group }
}</code></pre>
<p>If you don’t understand this right now, no big deal — it’s late enough that I couldn’t come up with a better representation of the actual code that would fit in this post. And if you are not familiar with parser combinators I would recommend reading Daniel Spiewak’s <a href="http://www.codecommit.com/blog/scala/the-magic-behind-parser-combinators">post on the subject</a>, at least before continuing to the next part of this series.</p>
<p>If you notice, the <code>value</code> and <code>expression</code> productions are referenced inside the <code>mixfixGrammar</code>. This is no good if the mixfix library is to be a separate module, so I actually implemented that by introducing a pseudo operator group that has a custom parser. This pseudo-group is then added to the precedence graph along with edges from every other group into that “really tight” group.</p>
<p>This concludes part 2. In the next part we will forget this pseudo-code and use Scala’s parser combinators and my <a href="https://github.com/Villane/mixfix-parsers/tree/master/src/main/scala/mixfix">mixfix library</a> to implement an actual parser for the language, and maybe an AST and an interpreter as well.</p>
<p><em>Thanks to <a href="https://twitter.com/#!/milessabin">Miles Sabin</a> and <a href="https://twitter.com/#!/djspiewak">Daniel Spiewak</a> for reviewing drafts for this series of posts.</em></p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/villane.wordpress.com/216/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/villane.wordpress.com/216/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/villane.wordpress.com/216/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/villane.wordpress.com/216/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/villane.wordpress.com/216/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/villane.wordpress.com/216/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/villane.wordpress.com/216/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/villane.wordpress.com/216/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/villane.wordpress.com/216/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/villane.wordpress.com/216/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/villane.wordpress.com/216/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/villane.wordpress.com/216/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/villane.wordpress.com/216/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/villane.wordpress.com/216/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=villane.wordpress.com&amp;blog=820948&amp;post=216&amp;subd=villane&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2012-01-17T10:00:35Z</updated>
    <category term="Programming"/>
    <category term="Programming languages"/>
    <category term="Scala"/>
    <category term="Parsers"/>
    <category term="Slang"/>
    <author>
      <name>Erkki Lindpere</name>
    </author>
    <source>
      <id>http://villane.wordpress.com</id>
      <logo>http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://villane.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://villane.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://villane.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://villane.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Thoughts on software development</subtitle>
      <title>Villane</title>
      <updated>2012-02-06T22:40:09Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/sff4s-011</id>
    <link href="http://implicit.ly/sff4s-011" rel="alternate" type="text/html"/>
    <title>sff4s 0.1.1</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><h2>bug fix</h2><ul><li>Fixes impicitly converted <code>juc.Future</code> getting stuck. <a href="https://github.com/eed3si9n/sff4s/pull/2">#2</a> fixed by <a href="https://github.com/seratch">@seratch</a>
</li></ul><div class="about"> <p>sff4s (simple future facade for Scala) is a Scala wrapper around several future implementations.
</p> </div>

<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/sff4s-011">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-01-17T06:57:53Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-06T08:40:12Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/less-sbt-014</id>
    <link href="http://implicit.ly/less-sbt-014" rel="alternate" type="text/html"/>
    <title>less-sbt 0.1.4</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><ul><li>updated less compiler support from <code>less-rhino-1.1.3.js</code> to <code>less-rhino-1.1.5.js</code> (the latest less compiler version at the time of this release)
</li><li>The <code>http://repo.lessis.me</code> resolver is no longer required. This and all future releases will be published to scala tools.
</li><li>published for sbt 0.11.2, if you wish to use this version with an older version of sbt, please request so <a href="https://github.com/softprops/less-sbt/issues">here</a>.
</li></ul><div class="about"> <p><a href="https://github.com/softprops/less-sbt#readme">less-sbt</a> compiles <a href="http://lesscss.org/">less</a> gaining you more.
</p> </div>

<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/less-sbt-014">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-01-16T23:56:01Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-05T20:00:15Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/coffeescripted-sbt-021</id>
    <link href="http://implicit.ly/coffeescripted-sbt-021" rel="alternate" type="text/html"/>
    <title>coffeescripted-sbt 0.2.1</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><ul>
<li>upgraded from v1.1.1 to Coffeescript js compiler v1.2.0* <a href="http://jashkenas.github.com/coffee-script/#changelog">changelog</a> </li>
<li>published for sbt 0.11.2, <a href="https://github.com/softprops/coffeescripted-sbt/issues">ask nicely</a>, if you need support older versions of sbt </li>
<li>the <code>http://repo.lessis.me</code> resolver is no longer needed for this plugin. This and all future artifacts will be published to scala tools. </li>
<li>for future reference, If you happen to plan on using the <a href="https://raw.github.com/jashkenas/coffee-script/1.2.0/extras/coffee-script.js">1.2.0</a> CoffeeScript compiler and you just so happen to use a Javascript interpreter that understands, <a href="https://developer.mozilla.org/en/JavaScript/Reference/Reserved_Words">reserved words</a> like <code>static</code>, follow the fix mentioned here <a href="https://github.com/jashkenas/coffee-script/issues/2046">here</a> or <a href="https://github.com/jashkenas/coffee-script/issues/2013">here</a> and save yourself an afternoon.</li>
</ul>
<div class="about">
<p><a href="http://github.com/softprops/coffeescripted-sbt#readme">coffeescripted-sbt</a> compiles your CoffeeScripts so you don't have to.</p>
</div>
<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/coffeescripted-sbt-021">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-01-16T22:04:00Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-03T15:20:16Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/sbt-native-packager-010-release</id>
    <link href="http://implicit.ly/sbt-native-packager-010-release" rel="alternate" type="text/html"/>
    <title>SBT native packager 0.1.0 release</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><p>The sbt-native-packger plugin has been released.   This plugin supports the generation of native packages for many platforms.   This release includes support for:</p>
<ul>
<li>RPM</li>
<li>DEB</li>
<li>MSI (via WIX)</li>
</ul>
<p>The source is located at <a href="https://github.com/sbt/sbt-native-packager">https://github.com/sbt/sbt-native-packager</a></p>
<p>The documentation is located at <a href="http://www.scala-sbt.org/sbt-native-packager/">http://www.scala-sbt.org/sbt-native-packager/</a></p>
	
<p/>

<p><a href="http://implicit.ly/sbt-native-packager-010-release">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-01-16T20:13:00Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-03T15:00:09Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/imap-idle-24-092</id>
    <link href="http://implicit.ly/imap-idle-24-092" rel="alternate" type="text/html"/>
    <title>imap-idle 2.4-0.92</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><ul><li>Compiled against Lift 2.4 and Scala 2.8.1, 2.9.0-1 and 2.9.1
</li><li>Upgraded to SBT 0.11.2
</li></ul><div class="about"> <p>The <a href="https://github.com/d6y/liftmodules-imap-idle">IMAP IDLE external Lift Module</a> provides push-like email facilities so your Lift web application can be notified when email arrives.
</p><p>Use in your <code>Boot</code> like this:
</p><div class="CodeRay">
  <div class="code"><pre>ImapIdle.init { m: javax.mail.Message =&gt; 
  println("You've got mail: "+EmailUtils.dump(m))
  true // delete the email on the server
}</pre></div>
</div>
 </div>

<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/imap-idle-24-092">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-01-16T19:17:44Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-03T05:40:06Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/google-analytics-24-09</id>
    <link href="http://implicit.ly/google-analytics-24-09" rel="alternate" type="text/html"/>
    <title>google-analytics 2.4-0.9</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><ul><li>Built for Lift 2.4 and Scala 2.8.1 to 2.9.1.
</li></ul><div class="about"> <p>The <a href="https://github.com/d6y/liftmodules-googleanalytics">Google Analytics external Lift Module</a> inserts <a href="http://code.google.com/apis/analytics/docs/tracking/asyncTracking.html">Google Analytics async tracking code</a> into a <a href="http://www.liftweb.net">Lift</a> application.
</p> </div>

<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/google-analytics-24-09">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-01-16T19:09:55Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-02-01T07:40:15Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/junit-interface-08-for-sbt</id>
    <link href="http://implicit.ly/junit-interface-08-for-sbt" rel="alternate" type="text/html"/>
    <title>JUnit interface 0.8 for sbt</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	I am pleased to announce releae 0.8 of junit-interface. This is an implementation of sbt's test interface  for JUnit 4 which allows you to run JUnit  tests from sbt. </p><p/> The complete ReadMe and the source code can be found at . The binaries are here: . <p/> Changes since release 0.7: <p/> - Make use of ANSI colors for the log messages (can be turned off with -n option) <p/> - Updated ReadMe which covers sbt 0.10+
	
<p/>

<p><a href="http://implicit.ly/junit-interface-08-for-sbt">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-01-16T15:42:45Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-01-29T22:20:10Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://villane.wordpress.com/?p=213</id>
    <link href="http://villane.wordpress.com/2012/01/16/mixfix-operators-parser-combinators-part-1/" rel="alternate" type="text/html"/>
    <title>Mixfix Operators &amp; Parser Combinators, Part 1</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Until recently, Slang’s parser really sucked. It was a quick hack implemented with Scala’s parser combinator library. Nothing really wrong about that in particular, but there was a gaping hole in the grammar: no operator precedence. So to get an expression like a + b * c to mean a + (b * c) I [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=villane.wordpress.com&amp;blog=820948&amp;post=213&amp;subd=villane&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Until recently, <a href="http://villane.wordpress.com/2011/12/24/slang-language-goals-for-2012/">Slang</a>’s parser really sucked. It was a quick hack implemented with Scala’s parser combinator library. Nothing really wrong about that in particular, but there was a gaping hole in the grammar: no operator precedence. So to get an expression like <code>a + b * c</code> to mean <code>a + (b * c)</code> I had to add the parentheses myself. In fact, there were even more problems — some things that should have been left-associative were right-associative. This resulted in very hairy test code, with lots of parentheses everywhere.</p>
<p>Although I think parsers are cool, I am actually not very good at writing one for a complex grammar. I feel that I just know too little about the theory behind them or how to put it to practical use. I’ve used parser combinators before and think they are probably the easiest way for newbies like me to implement parsers, so that’s what I used. The use of symbolic names in the library might be scary the first time, but actually I think parsing is one of the few contexts where use of lots of symbols and extremeley concise code is desirable. It allows one to put a lot of code on a few lines, and when you are looking at or writing a parser, you want to see many productions of the grammar at the same time to understand what is going on. At least I do.</p>
<p>For Slang, I implemented something minimal that could parse the language. I had no idea how to solve operator precedence well with parser combinators, and I didn’t want to spend a lot of time studying parsers, because the next compiler phases seemed more interesting at first. But getting the parser right is important for actually using the language because it’s the first thing that processes the code and reports errors. A parser that only kind of works can be very annoying.</p>
<p>Thankfully <a href="https://twitter.com/#%21/milessabin">Miles Sabin</a> suggested that I should look into mixfix operator parsers, and I did. I don’t know exactly where the word mixfix comes from, so I’m assuming it means mixed fixity — operators can be prefix, infix, postfix or closed. Here are some samples:</p>
<ul>
<li>prefix : <code>-a</code></li>
<li>infix : <code>a + b</code></li>
<li>postfix: <code>n!</code></li>
<li>closed : <code>(a)</code></li>
</ul>
<p>Of course, most languages have operators with all of these fixities. The term mixfix actually refers to something more flexible than that — a mixfix operator can be seen as a sequence of alternating name parts and “holes in the expression”. A hole is where the operator’s arguments go.</p>
<blockquote><p><code>_ + _</code> has two holes and one name part <code>+</code> (and is infix)<br/>
<code>if _ then _ else _</code> has three name parts <code>if</code>, <code>then</code>, <code>else</code> and three holes (and is prefix)</p></blockquote>
<p>In the mixfix viewpoint, many syntactic constructs might be seen as operators that can have precedence in relation to others, and this concept of many name parts can make it easier to let users define their own operators in a more flexible way than just a single prefix or infix word (as is allowed by Scala). I think this would be a really nice way of creating internal DSL-s. In Slang, like in Scala, most operators are really methods. Slang doesn’t allow user-defined fixity or precedence for methods yet (or even multiple argument lists), but I may add this feature one day.</p>
<p>There are existing languages that support mixfix operators, such as <a href="http://wiki.portal.chalmers.se/agda/">Agda</a>, <a href="http://maude.cs.uiuc.edu/maude2-manual/html/maude-manualch3.html#x15-360003.9">Maude</a> and <a href="http://www.bitc-lang.org/browse/compiler/MixFixProcessing.html">BitC</a>. To my knowledge, all these languages assign numeric precedence values to operators, and no language currently uses the exact scheme we will look at, although it was proposed for Agda.</p>
<p>Mixfix operators can be implemented in many ways, but one of the first things I found was the paper <a href="http://www.cse.chalmers.se/%7Enad/publications/danielsson-norell-mixfix.html">Parsing Mixfix Operators</a> by Anders Danielsson and Ulf Norell that was a great help to me. I was able to implement the grammar scheme described in that paper on top of Scala’s parser combinators and patch that into Slang’s existing parser with minimal changes to existing productions. The characteristics of the grammar scheme described in Danielsson’s paper seemed like a good enough fit for what I wanted for Slang:</p>
<ul>
<li>operator name parts and holes alternate — there can’t be two subsequent name parts or two subsequent holes</li>
</ul>
<blockquote><p><code>if _ then _ else _</code> is ok, <code>if _ _ else _</code> is not</p></blockquote>
<ul>
<li>operator precedence is described as a <a href="http://en.wikipedia.org/wiki/Directed_acyclic_graph">directed acyclic graph (DAG)</a>, not as a total or partial ordering. You only have to describe the precedence relations where they make sense (more about this in the next post)</li>
</ul>
<blockquote><p>a directed edge <code>'+' -&gt; '*'</code> means “<code>*</code> binds tighter than <code>-</code>”</p></blockquote>
<ul>
<li>operator precedence is not transitive</li>
</ul>
<blockquote><p><code>'=' -&gt; '+'</code> and <code>'&amp;' -&gt; '='</code> does not mean “<code>+</code> binds tighter than <code>&amp;</code>”</p></blockquote>
<ul>
<li>prefix operators are treated as right-associative</li>
</ul>
<blockquote><p><code>!!a = !(!(a))</code></p></blockquote>
<ul>
<li>postfix operators are treated as left-associative</li>
</ul>
<blockquote><p><code>n!! = ((n)!)!</code></p></blockquote>
<ul>
<li>left-associative and right-associative operators of the same precedence can’t appear next to each other</li>
</ul>
<blockquote><p>assuming <code>+:</code> is a right-associative <code>+</code>, <code>a + b +: c</code> would not be allowed</p></blockquote>
<ul>
<li>parses are precedence correct</li>
<li>implementation using left-recursion is possible, for example when using Scala’s Packrat parsers</li>
</ul>
<p>There weren’t any restrictions I couldn’t live with (in fact, we could relax some of the above requirements and the scheme would still work for some grammars), so I decided to implement this grammar scheme for Slang, pretty much as described in the paper. Although I didn’t really grok all of the Agda code samples, the principles were easily understandable. I implemented it as a separate library (<a href="https://github.com/Villane/mixfix-parsers/tree/master/src/main/scala/mixfix">available on GitHub</a>) that builds on top of the existing Scala parser combinator library. It might even be somewhat usable in it’s current state, but needs improvement.</p>
<p>In the next post we’ll look at how to define a grammar for an arithmetic and boolean algebra language using mixfix operators. In the third part, we will actually implement the parser for the grammar, look at performance issues and whether we can solve them with packrat parsers.</p>
<p><em>Thanks to <a href="https://twitter.com/#!/milessabin">Miles Sabin</a> and <a href="https://twitter.com/#!/djspiewak">Daniel Spiewak</a> for reviewing drafts for this series of posts.</em></p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/villane.wordpress.com/213/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/villane.wordpress.com/213/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/villane.wordpress.com/213/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/villane.wordpress.com/213/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/villane.wordpress.com/213/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/villane.wordpress.com/213/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/villane.wordpress.com/213/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/villane.wordpress.com/213/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/villane.wordpress.com/213/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/villane.wordpress.com/213/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/villane.wordpress.com/213/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/villane.wordpress.com/213/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/villane.wordpress.com/213/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/villane.wordpress.com/213/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=villane.wordpress.com&amp;blog=820948&amp;post=213&amp;subd=villane&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2012-01-16T08:00:19Z</updated>
    <category term="Programming"/>
    <category term="Programming languages"/>
    <category term="Scala"/>
    <category term="Parsers"/>
    <category term="Slang"/>
    <author>
      <name>Erkki Lindpere</name>
    </author>
    <source>
      <id>http://villane.wordpress.com</id>
      <logo>http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://villane.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://villane.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://villane.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://villane.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Thoughts on software development</subtitle>
      <title>Villane</title>
      <updated>2012-02-06T22:40:09Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-22587889.post-7711822270811502612</id>
    <link href="http://debasishg.blogspot.com/feeds/7711822270811502612/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="http://www.blogger.com/comment.g?blogID=22587889&amp;postID=7711822270811502612" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/22587889/posts/default/7711822270811502612" rel="edit" type="application/atom+xml"/>
    <link href="http://debasishg.blogspot.com/feeds/posts/default/7711822270811502612" rel="self" type="application/atom+xml"/>
    <link href="http://debasishg.blogspot.com/2012/01/event-sourcing-akka-fsms-and-functional.html" rel="alternate" type="text/html"/>
    <title>Event Sourcing, Akka FSMs and functional domain models</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I blogged on <a href="http://debasishg.blogspot.com/2011/01/cqrs-with-akka-actors-and-functional.html">Event Sourcing</a> and functional domain models earlier. In this post I would like to share more of my thoughts on the same subject and how with a higher level of abstraction you can make your domain aggregate boundary more resilient and decoupled from external references.<br/><br/>When we talk about a domain model, the Aggregate takes the centerstage. An aggregate is a core abstraction that represents the time invariant part of the domain. It's an embodiment of all states that the aggregate can be in throughout its lifecycle in the system. So, it's extremely important that we take every pain to distil the domain model and protect the aggregate from all unwanted external references. Maybe an example will make it clearer.<br/><br/><b>Keeping the Aggregate pure</b><br/><br/>Consider a Trade model as the aggregate. By Trade, I mean a security trade that takes place in the stock exchange where counterparties exchange securities and currencies for settlement. If you're a regular reader of my blog, you must be aware of this, since this is almost exclusively the domain that I talk of in my blog posts.<br/><br/>A trade can be in various states like <i>newly entered</i>, <i>value date added</i>, <i>enriched with tax and fee information</i>, <i>net trade value computed</i> etc. In a trading application, as a trade passes through the processing pipeline, it moves from one state to another. The final state represents the complete Trade object which is ready to be settled between the counterparties. <br/><br/>In the traditional model of processing we have the final snapshot of the aggregate - what we don't have is the audit log of the actual state transitions that happened in response to the events. With event sourcing we record the state transitions as a pipeline of events which can be replayed any time to rollback or roll-forward to any state of our choice. Event sourcing is coming up as one of the potent ways to model a system and there are lots of blog posts being written to discuss about the various architectural strategies to implement an event sourced application. <br/><br/>That's ok. But whose responsibility is it to manage these state transitions and record the timeline of changes ? It's definitely not the responsibility of the aggregate. The aggregate is supposed to be a <i>pure</i> abstraction. We must design it as an immutable object that can respond to events and transform itself into the new state. In fact the aggregate implementation should not be aware of whether it's serving an event sourced architecture or not.<br/><br/>There are various ways you can model the states of an aggregate. One option that's frequently used involves algebraic data types. Model the various states as a sum type of products. In Scala we do this as case classes ..<br/><br/><pre class="brush: scala">sealed abstract class Trade {<br/>  def account: Account<br/>  def instrument: Instrument<br/>  //..<br/>}<br/><br/>case class NewTrade(..) extends Trade {<br/>  //..<br/>}<br/><br/>case class EnrichedTrade(..) extends Trade {<br/>  //..<br/>}<br/></pre><br/>Another option may be to have one data type to model the Trade and model states as immutable enumerations with changes being effected on the aggregate as functional updates. No in place mutation, but use functional data structures like zippers or type lenses to create the transformed object in the new state. Here's an example where we create an enriched trade out of a newly created one ..<br/><br/><pre class="brush: scala">// closure that enriches a trade<br/>val enrichTrade: Trade =&gt; Trade = {trade =&gt;<br/>  val taxes = for {<br/>    taxFeeIds      &lt;- forTrade // get the tax/fee ids for a trade<br/>    taxFeeValues   &lt;- taxFeeCalculate // calculate tax fee values<br/>  }<br/>  yield(taxFeeIds ° taxFeeValues)<br/>  val t = taxFeeLens.set(trade, taxes(trade))<br/>  netAmountLens.set(t, t.taxFees.map(_.foldl(principal(t))((a, b) =&gt; a + b._2)))<br/>}<br/></pre><br/>But then we come back to the same question - if the aggregate is distilled to model the core domain, who handles the events ? Someone needs to model the event changes, effect the state transitions and take the aggregate from one state to the next.<br/><br/><b>Enter Finite State Machines</b><br/><br/>In one of my projects I used the domain service layer to do this. The domain logic for effecting the changes lies with the aggregate, but they are invoked from the domain service in response to events when the aggregate reaches specific states. In other words I model the domain service as a finite state machine that manages the lifecycle of the aggregate.<br/><br/>In our example a Trading Service can be modeled as an FSM that controls the lifecycle of a <code>Trade</code>. As the following ..<br/><br/><pre class="brush: scala">import TradeModel._<br/><br/>class TradeLifecycle(trade: Trade, timeout: Duration, log: Option[EventLog]) <br/>  extends Actor with FSM[TradeState, Trade] {<br/>  import FSM._<br/><br/>  startWith(Created, trade)<br/><br/>  when(Created) {<br/>    case Event(e@AddValueDate, data) =&gt;<br/>      log.map(_.appendAsync(data.refNo, Created, Some(data), e))<br/>      val trd = addValueDate(data)<br/>      notifyListeners(trd) <br/>      goto(ValueDateAdded) using trd forMax(timeout)<br/>  }<br/><br/>  when(ValueDateAdded) {<br/>    case Event(StateTimeout, _) =&gt;<br/>      stay<br/><br/>    case Event(e@EnrichTrade, data) =&gt;<br/>      log.map(_.appendAsync(data.refNo, ValueDateAdded, None,  e))<br/>      val trd = enrichTrade(data)<br/>      notifyListeners(trd)<br/>      goto(Enriched) using trd forMax(timeout)<br/>  }<br/><br/>  when(Enriched) {<br/>    case Event(StateTimeout, _) =&gt;<br/>      stay<br/><br/>    case Event(e@SendOutContractNote, data) =&gt;<br/>      log.map(_.appendAsync(data.refNo, Enriched, None,  e))<br/>      sender ! data<br/>      stop<br/>  }<br/><br/>  initialize<br/>}<br/></pre><br/>The snippet above contains a lot of other details which I did not have time to prune. It's actually part of the implementation of an event sourced trading application that uses asynchronous messaging (actors) as the backbone for event logging and reaching out to multiple consumers based on the CQRS paradigm.<br/><br/>Note that the FSM model above makes it very explicit about the states that the <code>Trade</code> model can reach and the events that it handles while in each of these states. Also we can use this FSM technique to log events (for event sourcing), notify listeners about the events (CQRS) in a very much declarative manner as implemented above.<br/><br/>Let me know in the comments what are your views on this FSM approach towards handling state transitions in domain models. I think it helps keep aggregates pure and helps design domain services that focus on serving specific aggregate roots.<br/><br/>I will be <a href="http://phillyemergingtech.com/2012/sessions/building-applications-with-functional-domain-models-event-sourcing-and-actors">talking about</a> similar stuff, Akka actor based event sourcing implementations and functional domain models in PhillyETE 2012. Please drop by if this interests you.<br/><div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/22587889-7711822270811502612?l=debasishg.blogspot.com" width="1"/></div></div>
    </content>
    <updated>2012-01-15T14:54:53Z</updated>
    <published>2012-01-15T14:54:00Z</published>
    <category scheme="http://www.blogger.com/atom/ns#" term="eventsourcing"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="akka"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="ddd"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="cqrs"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="scala"/>
    <author>
      <name>Debasish Ghosh</name>
      <email>noreply@blogger.com</email>
      <uri>https://profiles.google.com/106871002817915335660</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-22587889</id>
      <category term="ruby"/>
      <category term="couchdb"/>
      <category term="amqp"/>
      <category term="javascript"/>
      <category term="clojure"/>
      <category term="erlang"/>
      <category term="web"/>
      <category term="websocket"/>
      <category term="redis"/>
      <category term="monad"/>
      <category term="data-structures"/>
      <category term="actor"/>
      <category term="lookback"/>
      <category term="OCaml"/>
      <category term="smullyan"/>
      <category term="mina"/>
      <category term="terracotta"/>
      <category term="open source"/>
      <category term="mustang"/>
      <category term="RIA"/>
      <category term="eventsourcing"/>
      <category term="combinator"/>
      <category term="guice"/>
      <category term="agile"/>
      <category term="dslsina"/>
      <category term="yegge"/>
      <category term="spring"/>
      <category term="rails"/>
      <category term="functional"/>
      <category term="haskell"/>
      <category term="api programming"/>
      <category term="datatype-generic-programming"/>
      <category term="cqrs"/>
      <category term="nosql"/>
      <category term="map-reduce"/>
      <category term="database"/>
      <category term="message-queue"/>
      <category term="xml"/>
      <category term="scala"/>
      <category term="scouchdb"/>
      <category term="type"/>
      <category term="java"/>
      <category term="scalability"/>
      <category term="seam"/>
      <category term="ajax"/>
      <category term="patterns"/>
      <category term="mixin"/>
      <category term="programming"/>
      <category term="jpa-gotcha-series"/>
      <category term="aop"/>
      <category term="rants"/>
      <category term="demeter"/>
      <category term="stm"/>
      <category term="knuth"/>
      <category term="lisp"/>
      <category term="F#"/>
      <category term="algorithm"/>
      <category term="category_theory"/>
      <category term="OO"/>
      <category term="jvm"/>
      <category term="joy"/>
      <category term="concurrency"/>
      <category term="lift"/>
      <category term="DI"/>
      <category term="rest"/>
      <category term="oscon08"/>
      <category term="potpouri"/>
      <category term="algebra"/>
      <category term="fixpoint"/>
      <category term="ddd"/>
      <category term="scalaz"/>
      <category term="euler"/>
      <category term="groovy"/>
      <category term="jpa"/>
      <category term="software"/>
      <category term="orm"/>
      <category term="closure"/>
      <category term="dao"/>
      <category term="dsl"/>
      <category term="parser-combinator"/>
      <category term="memcached"/>
      <category term="akka"/>
      <category term="design"/>
      <category term="testing"/>
      <category term="json"/>
      <category term="potpourri"/>
      <author>
        <name>Debasish Ghosh</name>
        <email>noreply@blogger.com</email>
        <uri>https://profiles.google.com/106871002817915335660</uri>
      </author>
      <link href="http://debasishg.blogspot.com/feeds/posts/full" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://debasishg.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://debasishg.blogspot.com/feeds/posts/full?start-index=4&amp;max-results=3" rel="next" type="application/atom+xml"/>
      <link href="http://feeds.feedburner.com/RuminationsOfAProgrammer" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>A programmer's blog - will deal with everything that relates to a programmer. Occasionally, it will contain some humour, some politics and some sport news.</subtitle>
      <title>Ruminations of a Programmer</title>
      <updated>2012-02-06T11:25:18Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-22587889.post-1267847223414228921</id>
    <link href="http://debasishg.blogspot.com/feeds/1267847223414228921/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="http://www.blogger.com/comment.g?blogID=22587889&amp;postID=1267847223414228921" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/22587889/posts/default/1267847223414228921" rel="edit" type="application/atom+xml"/>
    <link href="http://debasishg.blogspot.com/feeds/posts/default/1267847223414228921" rel="self" type="application/atom+xml"/>
    <link href="http://debasishg.blogspot.com/2011/09/non-blocking-composition-using-redis.html" rel="alternate" type="text/html"/>
    <title>Non blocking composition using Redis and Futures</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><a href="https://github.com/debasishg/scala-redis">scala-redis</a> now supports pooling of Redis clients. Using <code>RedisClientPool</code> you can do some cool stuff in non blocking mode and get an improved throughput for your application. <br/><br/>Suppose you have a bunch of operations that you can theoretically execute in parallel, maybe a few disjoint list operations and a few operations on key/values .. like the following snippets ..<br/><br/><pre class="brush: scala"><br/>val clients = new RedisClientPool("localhost", 6379)<br/><br/>// left push to a list<br/>def lp(msgs: List[String]) = {<br/>  clients.withClient {client =&gt; {<br/>    msgs.foreach(client.lpush("list-l", _))<br/>    client.llen("list-l")<br/>  }}<br/>}<br/><br/>// right push to another list<br/>def rp(msgs: List[String]) = {<br/>  clients.withClient {client =&gt; {<br/>    msgs.foreach(client.rpush("list-r", _))<br/>    client.llen("list-r")<br/>  }}<br/>}<br/><br/>// key/set operations<br/>def set(msgs: List[String]) = {<br/>  clients.withClient {client =&gt; {<br/>    var i = 0<br/>    msgs.foreach { v =&gt;<br/>      client.set("key-%d".format(i), v)<br/>      i += 1<br/>    }<br/>    Some(1000) // some dummy<br/>  }}<br/>}<br/></pre><br/>Redis, being single threaded, you can use client pooling to allocate multiple clients and fork these operations concurrently .. Here's a snippet that does these operations asynchronously using Scala futures ..<br/><br/><pre class="brush: scala"><br/>// generate some arbitrary values<br/>val l = (0 until 5000).map(_.toString).toList<br/><br/>// prepare the list of functions to invoke<br/>val fns = List[List[String] =&gt; Option[Int]](lp, rp, set)<br/><br/>// schedule the futures<br/>val tasks = fns map (fn =&gt; scala.actors.Futures.future { fn(l) })<br/><br/>// wait for results<br/>val results = tasks map (future =&gt; future.apply())<br/></pre><br/>And while we are on this topic of using futures for non blocking redis operations, Twitter has a cool library <a href="https://github.com/twitter/finagle">finagle</a> that offers lots of cool composition stuff on Futures and other non blocking RPC mechanisms. Over the weekend I used some of them to implement <a href="http://eaipatterns.com/BroadcastAggregate.html">scatter/gather</a> algorithms over Redis. I am not going into the details of what I did, but here's a sample dummy example of stuffs you can do with <code>RedisConnectionPool</code> and <code>Future</code> implementation of Finagle ..<br/><br/>The essential idea is to be able to compose futures and write non blocking code all the way down. This is made possible through monadic non-blocking <code>map</code> and <code>flatMap</code> operations and a host of other utility functions that use them. Here's an example ..<br/><br/><pre class="brush: scala"><br/>def collect[A](fs: Seq[Future[A]]): Future[Seq[A]] = { //..<br/></pre><br/>It uses <code>flatMap</code> and <code>map</code> to collect the results from the given list of futures into a new future of <code>Seq[A]</code>.<br/><br/>Let's have a look at a specific example where we push a number of elements into 100 lists concurrently using a pool of futures, backed by <code>ExecutorService</code>. This is the scatter phase of the algorithm. The function <code>listPush</code> actually does the push using a <code>RedisConnectionPool</code> and each of these operations is done within a <code>Future</code>. <code>FuturePool</code> gives you a <code>Future</code> where you can specify timeouts and exception handlers using Scala closures. <br/><br/>Note how we use the combinator <code>collect</code> for <i>concurrent</i> composition of the futures. The resulting future that <code>collect</code> returns will be complete when all the underlying futures have completed.<br/><br/>After the scatter phase we prepare for the gather phase by pipelining the future computation using <code>flatMap</code>. Unlike <code>collect</code>, <code>flatMap</code> is a combinator for <i>sequential</i> composition. In the following snippet, once <code>allPushes</code> completes, the result pipelines into the following closure that generates another <code>Future</code>. The whole operation completes only when we have both the futures completed. Or we have an exception in either of them.<br/><br/>For more details on how to use these combinators on <code>Future</code> abstractions, have a look at the <a href="http://twitter.github.com/scala_school/finagle.html">tutorial</a> that the Twitter guys published recently.<br/><br/><pre class="brush: scala"><br/>implicit val timer = new JavaTimer<br/><br/>// set up Executors<br/>val futures = FuturePool(Executors.newFixedThreadPool(8))<br/><br/>// abstracting the flow with future<br/>private[this] def flow[A](noOfRecipients: Int, opsPerClient: Int, fn: (Int, String) =&gt; A) = {<br/>  val fs = (1 to noOfRecipients) map {i =&gt; <br/>    futures {<br/>      fn(opsPerClient, "list_" + i)<br/>    }.within(40.seconds) handle {<br/>      case _: TimeoutException =&gt; null.asInstanceOf[A]<br/>    }<br/>  }<br/>  Future.collect(fs)<br/>}<br/><br/>// scatter across clients and gather them to do a sum<br/>def scatterGatherWithList(opsPerClient: Int)(implicit clients: RedisClientPool) = {<br/>  // scatter<br/>  val allPushes: Future[Seq[String]] = flow(100, opsPerClient, listPush)<br/>  val allSum = allPushes flatMap {result =&gt;<br/>    // gather<br/>    val allPops: Future[Seq[Long]] = flow(100, opsPerClient, listPop)<br/>    allPops map {members =&gt; members.sum}<br/>  }<br/>  allSum.apply<br/>}<br/></pre><br/>For the complete example implementations of these patterns like scatter/gather using Redis, have a look at the <a href="https://github.com/debasishg/scala-redis/blob/master/src/test/scala/com/redis/Patterns.scala">github repo</a> for scala-redis.<div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/22587889-1267847223414228921?l=debasishg.blogspot.com" width="1"/></div></div>
    </content>
    <updated>2012-01-13T18:20:51Z</updated>
    <published>2011-09-27T05:13:00Z</published>
    <category scheme="http://www.blogger.com/atom/ns#" term="redis"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="scala"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="concurrency"/>
    <author>
      <name>Debasish Ghosh</name>
      <email>noreply@blogger.com</email>
      <uri>https://profiles.google.com/106871002817915335660</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-22587889</id>
      <category term="ruby"/>
      <category term="couchdb"/>
      <category term="amqp"/>
      <category term="javascript"/>
      <category term="clojure"/>
      <category term="erlang"/>
      <category term="web"/>
      <category term="websocket"/>
      <category term="redis"/>
      <category term="monad"/>
      <category term="data-structures"/>
      <category term="actor"/>
      <category term="lookback"/>
      <category term="OCaml"/>
      <category term="smullyan"/>
      <category term="mina"/>
      <category term="terracotta"/>
      <category term="open source"/>
      <category term="mustang"/>
      <category term="RIA"/>
      <category term="combinator"/>
      <category term="guice"/>
      <category term="agile"/>
      <category term="dslsina"/>
      <category term="yegge"/>
      <category term="spring"/>
      <category term="rails"/>
      <category term="functional"/>
      <category term="haskell"/>
      <category term="api programming"/>
      <category term="cqrs"/>
      <category term="datatype-generic-programming"/>
      <category term="nosql"/>
      <category term="map-reduce"/>
      <category term="database"/>
      <category term="message-queue"/>
      <category term="xml"/>
      <category term="scala"/>
      <category term="scouchdb"/>
      <category term="type"/>
      <category term="java"/>
      <category term="scalability"/>
      <category term="seam"/>
      <category term="ajax"/>
      <category term="patterns"/>
      <category term="mixin"/>
      <category term="programming"/>
      <category term="jpa-gotcha-series"/>
      <category term="aop"/>
      <category term="rants"/>
      <category term="demeter"/>
      <category term="stm"/>
      <category term="knuth"/>
      <category term="lisp"/>
      <category term="F#"/>
      <category term="algorithm"/>
      <category term="OO"/>
      <category term="jvm"/>
      <category term="joy"/>
      <category term="concurrency"/>
      <category term="lift"/>
      <category term="DI"/>
      <category term="rest"/>
      <category term="oscon08"/>
      <category term="potpouri"/>
      <category term="fixpoint"/>
      <category term="ddd"/>
      <category term="scalaz"/>
      <category term="euler"/>
      <category term="groovy"/>
      <category term="jpa"/>
      <category term="software"/>
      <category term="orm"/>
      <category term="closure"/>
      <category term="dao"/>
      <category term="dsl"/>
      <category term="parser-combinator"/>
      <category term="memcached"/>
      <category term="akka"/>
      <category term="design"/>
      <category term="testing"/>
      <category term="json"/>
      <category term="potpourri"/>
      <author>
        <name>Debasish Ghosh</name>
        <email>noreply@blogger.com</email>
        <uri>https://profiles.google.com/106871002817915335660</uri>
      </author>
      <link href="http://debasishg.blogspot.com/feeds/posts/full" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://debasishg.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://debasishg.blogspot.com/feeds/posts/full?start-index=4&amp;max-results=3" rel="next" type="application/atom+xml"/>
      <link href="http://feeds.feedburner.com/RuminationsOfAProgrammer" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>A programmer's blog - will deal with everything that relates to a programmer. Occasionally, it will contain some humour, some politics and some sport news.</subtitle>
      <title>Ruminations of a Programmer</title>
      <updated>2012-01-15T14:18:14Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/groll-111</id>
    <link href="http://implicit.ly/groll-111" rel="alternate" type="text/html"/>
    <title>groll 1.1.1</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><p>This is the 1.1.1 release of <a href="http://github.com/hseeberger/groll/">groll</a>, a plugin for <a href="https://github.com/harrah/xsbt/">sbt</a> to view and navigate through the <a href="http://git-scm.com/">Git</a> history.
</p><p>This is a bugfix release:
</p><ul><li><a href="https://github.com/hseeberger/groll/issues/9">Issue #9</a>: Missing reload of sbt session on build definition change in groll 1.1.0
</li></ul><p>Please see the <a href="http://github.com/hseeberger/groll/blob/master/README.rst">README</a> for information about installing and using groll.
</p><div class="about"> <p><a href="http://github.com/hseeberger/groll/">groll</a> is a plugin for <a href="https://github.com/harrah/xsbt/">sbt</a> to view and navigate through the <a href="http://git-scm.com/">Git</a> history.
</p> </div>

<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/groll-111">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-01-12T16:44:22Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-01-26T21:20:12Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-4938047171375427336.post-4371811915998109207</id>
    <link href="http://archontophoenix.blogspot.com/feeds/4371811915998109207/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="http://archontophoenix.blogspot.com/2012/01/landauer-vs-fan.html#comment-form" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/4938047171375427336/posts/default/4371811915998109207" rel="edit" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/4938047171375427336/posts/default/4371811915998109207" rel="self" type="application/atom+xml"/>
    <link href="http://archontophoenix.blogspot.com/2012/01/landauer-vs-fan.html" rel="alternate" type="text/html"/>
    <title>Landauer vs. the Fan</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Darn that !@#$% laptop fan. Why is it running <em>again</em>?<br/><br/>Maybe because I took Stanford's free online courses in <a href="https://www.ai-class.com/">artificial intelligence</a> and <a href="http://www.ml-class.org/">machine learning</a> last quarter, and I've been running experiments with <a href="http://en.wikipedia.org/wiki/Artificial_neural_network">neural networks</a> on and off since then.<br/><br/>Neural networks are fun and flexible ways of coming up with a function when you really have no clue how the outputs relate to the inputs, but it sure takes a lot of time and electricity to train them. I'm basically turning coal (or whatever the local power plant burns) into functions.<br/><br/>I suppose the fact that we recently put photovoltaic panels on our roof should salve my conscience a little, but it still seems as if it's going to take an awful lot of expensive electrons to train enough AIs to provide us all with robot maids and butlers. Can't we do any better?<br/><br/>A <a href="http://www.scientificamerican.com/article.cfm?id=computers-vs-brains">recent <i>Scientific American</i> article</a> suggests that <a href="http://www.fujitsu.com/global/about/tech/k/">Fujitsu's K Computer</a> has around 4 times as much computational power as a human brain, but uses about half a million times as much energy. There's plenty of room to argue that the K computer and the brain do types of processing that aren't comparable, and even if you ignored that, I imagine there's plenty of fudging in the figure the article cites for the brain. Still, we can probably say that the brain is several decimal orders of magnitude more efficient than a modern electronic computer.<br/><br/>What about the brain itself? Is it actually as efficient as possible, or does physics permit computational systems that use even less energy? Well, it was only recently that I discovered the <a href="http://en.wikipedia.org/wiki/Von_Neumann-Landauer_limit">Landauer limit</a>, which describes the minimum energy required to change one bit of information. The Wikipedia article says that at room temperature, the Landauer limit requires at least 2.85 picowatts to record a billion bits of information per second. I'm not sure what that translates to in flops—maybe a single floating point operation requires recording a thousand bits of intermediate information? If so, a billion bits per second is a megaflop, or less than a billionth of a human brain, per the Scientific American article. If I've done the math right, that leaves the brain only a few orders of magnitude less efficient the room-temperature limit (but fortunately, Landauer says colder computers would do better).<br/><br/>At any rate, physics does leave some room for cooler computers. Maybe I won't have to listen to fan noise every time I hang out with <a href="http://en.wikipedia.org/wiki/List_of_The_Jetsons_characters">Rosey and Mac</a> after all.<div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/4938047171375427336-4371811915998109207?l=archontophoenix.blogspot.com" width="1"/></div></div>
    </content>
    <updated>2012-01-12T06:44:16Z</updated>
    <published>2012-01-12T06:01:00Z</published>
    <author>
      <name>Archontophoenix</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/02241571399822483916</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-4938047171375427336</id>
      <author>
        <name>Archontophoenix</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/02241571399822483916</uri>
      </author>
      <link href="http://archontophoenix.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://www.blogger.com/feeds/4938047171375427336/posts/default" rel="self" type="application/atom+xml"/>
      <link href="http://archontophoenix.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <link href="http://www.blogger.com/feeds/4938047171375427336/posts/default?start-index=26&amp;max-results=25" rel="next" type="application/atom+xml"/>
      <title>Archontoland</title>
      <updated>2012-01-13T16:41:24Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/groll-110</id>
    <link href="http://implicit.ly/groll-110" rel="alternate" type="text/html"/>
    <title>groll 1.1.0</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><p>This is the 1.1.0 release of <a href="http://github.com/hseeberger/groll/">groll</a>, a plugin for <a href="https://github.com/harrah/xsbt/">sbt</a> to view and navigate through the <a href="http://git-scm.com/">Git</a> history.
</p><p>Groll provides the command <em>groll</em> that provides various options to view and navigate through the Git history. Of course this means, that you can only use groll for projects using Git as version control system. If you are navigating through the Git history, groll will reload the sbt session if the build definition changed.
</p><p>New and noteworthy:
</p><ul><li><a href="https://github.com/hseeberger/groll/issues/4">Issue #4</a>: Highlight current commit in list
</li><li><a href="https://github.com/hseeberger/groll/issues/8">Issue #8</a>: Allow current branch to be different from configured
</li><li>Important: The setting key <em>branch</em> was renamed <em>revision</em> (see the <a href="http://github.com/hseeberger/groll/blob/master/README.rst">README</a> for details)
</li></ul><p>Please see the <a href="http://github.com/hseeberger/groll/blob/master/README.rst">README</a> for information about installing and using groll.
</p><div class="about"> <p><a href="http://github.com/hseeberger/groll/">groll</a> is a plugin for <a href="https://github.com/harrah/xsbt/">sbt</a> to view and navigate through the <a href="http://git-scm.com/">Git</a> history.
</p> </div>

<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/groll-110">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-01-11T12:24:04Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-01-25T11:40:09Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://implicit.ly/sbt-git-plugin-04</id>
    <link href="http://implicit.ly/sbt-git-plugin-04" rel="alternate" type="text/html"/>
    <title>sbt-git-plugin 0.4</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
	</p><ul><li><code>GitRunner</code> now logs to debug (make git plugin less chatty)
</li><li><code>git</code> is now a command, not a task, closes #8
</li><li><code>GitRunner</code> returns a string containing the result of the <code>git</code> command, rather than just logging it.
</li></ul><div class="about"> <p><a href="http://github.com/sbt/sbt-git-plugin">sbt-git-plugin</a> is an SBT plugin that enabled cross-platform GIT support.  If you wish to use Git in another plugin, or run GIT directly against your own projects, this is the plugin for you.
</p> </div>

<div class="posterous_quote_citation">via <a href="http://github.com/n8han/posterous-sbt">posterous-sbt plugin</a></div>
	
<p/>

<p><a href="http://implicit.ly/sbt-git-plugin-04">Permalink</a> 

</p></div>
    </summary>
    <updated>2012-01-10T12:57:22Z</updated>
    <source>
      <id>http://implicit.ly</id>
      <author>
        <name>implicit.ly</name>
      </author>
      <link href="http://implicit.ly" rel="alternate" type="text/html"/>
      <link href="http://posterous.com/api/sup_update#2fff37d7e" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
      <link href="http://implicit.ly/rss.xml" rel="self" type="application/atom+xml"/>
      <link href="http://posterous.superfeedr.com" rel="hub" type="text/html"/>
      <subtitle>Scala software, hot off the presses</subtitle>
      <title>implicit.ly</title>
      <updated>2012-01-24T20:20:15Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-137400338062194307.post-5497454745396380280</id>
    <link href="http://feedproxy.google.com/~r/lalitpant/~3/cS9A-VnUxqQ/kojo-update.html" rel="alternate" type="text/html"/>
    <title>A Kojo Update</title>
    <summary>There have been some interesting new developments on the Kojo front recently. 

Some cool 2D stuff based on Staging, and a new feature called Pictures: http://kojoenv.wordpress.com/2011/12/09/kojo-version-091211-released/
Collision Detection for Pictures: http://kojoenv.wordpress.com/2011/12/30/kojo-version-291211-released/
Ability to combine Pictures, Animation, Collision Detection, Keyboard</summary>
    <content>&lt;img src="http://feeds.feedburner.com/~r/lalitpant/~4/cS9A-VnUxqQ" height="1" width="1"/&gt;</content>
    <updated>2012-01-10T05:02:00Z</updated>
    <category scheme="http://www.blogger.com/atom/ns#" term="kojo"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="games"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="pictures"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="scala"/><feedburner:origLink xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://lalitpant.blogspot.com/2012/01/kojo-update.html</feedburner:origLink>
    <author>
      <name>Lalit Pant</name>
      <email>noreply@blogger.com</email>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-137400338062194307</id>
      <category term="jmock"/>
      <category term="view conversion"/>
      <category term="pictures"/>
      <category term="education"/>
      <category term="scala"/>
      <category term="implicits"/>
      <category term="java"/>
      <category term="swing"/>
      <category term="kojo"/>
      <category term="actors"/>
      <category term="web development"/>
      <category term="games"/>
      <category term="terracotta"/>
      <category term="algorithms"/>
      <category term="immutability"/>
      <category term="concurrency"/>
      <category term="jiva"/>
      <category term="state"/>
      <category term="delegation"/>
      <category term="genetic-algorithms"/>
      <category term="tcpoly"/>
      <category term="learning to program"/>
      <category term="ui"/>
      <category term="inheritance"/>
      <category term="typeclasses"/>
      <category term="data structures"/>
      <category term="self-problem"/>
      <category term="identity"/>
      <category term="haskell"/>
      <category term="composition"/>
      <category term="design"/>
      <category term="value types"/>
      <category term="traits"/>
      <category term="collections"/>
      <category term="testing"/>
      <category term="scrisca"/>
      <category term="type constructor polymorphism"/>
      <author>
        <name>Lalit Pant</name>
        <email>noreply@blogger.com</email>
      </author>
      <link href="http://lalitpant.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://feeds.feedburner.com/lalitpant" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>Lalit's technical blog; thoughts and ideas on the structure and flow of computer programs, and related matters.</subtitle>
      <title>All Things Runnable</title>
      <updated>2012-01-10T17:01:10Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-6373963829340632529.post-2495407794211942342</id>
    <link href="http://dcsobral.blogspot.com/feeds/2495407794211942342/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="http://dcsobral.blogspot.com/2012/01/adding-methods-to-scala.html#comment-form" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/6373963829340632529/posts/default/2495407794211942342" rel="edit" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/6373963829340632529/posts/default/2495407794211942342" rel="self" type="application/atom+xml"/>
    <link href="http://dcsobral.blogspot.com/2012/01/adding-methods-to-scala.html" rel="alternate" type="text/html"/>
    <title>Adding methods to Scala Collections</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><span style="font-family: inherit;">I don't like getting much involved in these Scala flame wars, but <a href="http://yz.mit.edu/wp/true-scala-complexity/" target="_blank">this recent article</a> left me a bit irked. At some point, the following statement is made:</span><br/><div><span style="font-family: inherit;"><br/></span></div><div><i><span style="font-family: inherit;">"<span style="background-color: white; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; color: #373737; line-height: 24px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">it is impossible to insert a new method that behaves like a normal collection method</span><span style="background-color: white; color: #373737; line-height: 24px;">. "</span></span></i></div><div><i><span style="background-color: white; color: #373737; font-family: inherit; line-height: 24px;"><br/></span></i></div><div><span style="background-color: white; color: #373737; font-family: inherit; line-height: 24px;">So, for the record, that is just not true. Here's an implementation for the filterMap method:</span></div><div><span style="background-color: white; color: #373737; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 24px;"><br/></span></div><pre class="brush: scala">import scala.collection._<br/>import generic.CanBuildFrom<br/>import mutable.Builder<br/> <br/>class FilterMap[A, C &lt;: Seq[A]](xs: C with SeqLike[A, C]) {<br/>     def filterMap[B, That](f: A =&gt; Option[B])<br/>                     (implicit cbf: CanBuildFrom[C, B, That]): That = {<br/>       val builder: Builder[B, That] = cbf()<br/>       xs foreach { x =&gt; val y = f(x); if (y.nonEmpty) builder += y.get }<br/>       builder.result()<br/>     }<br/> }<br/> <br/>implicit def toFilterMap[A, C &lt;: Seq[A]](xs: C with SeqLike[A, C]): FilterMap[A, C] = new FilterMap[A, C](xs)<br/></pre><span style="color: #373737; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;"><span style="font-size: 15px; line-height: 24px;"><br/></span></span><br/><span style="background-color: white; color: #373737; font-family: inherit; line-height: 24px;">Is this what the author wanted? No. He wanted too add a method that behaved like a normal collection method <b style="font-style: italic;">to something that isn't a collection.</b> This is so crazy that, not surprisingly, people are misunderstanding him.</span><br/><span style="color: #373737; font-family: inherit;"><span style="line-height: 24px;"><br/></span></span><br/><span style="color: #373737; font-family: inherit;"><span style="line-height: 24px;">Now, one may come up and say that Scala does do that (add methods to stuff that are not collection), with String and Array. Yes, it does, and it does so <i>by creating a completely new class with all these methods for each of them</i>. Rest assured that if I create a completely new class for each one, I can add filterMap to String and Array too.</span></span><br/><span style="color: #373737; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;"><span style="font-size: 15px; line-height: 24px;"><br/></span></span><div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/6373963829340632529-2495407794211942342?l=dcsobral.blogspot.com" width="1"/></div></div>
    </content>
    <updated>2012-01-10T04:57:29Z</updated>
    <published>2012-01-09T23:50:00Z</published>
    <category scheme="http://www.blogger.com/atom/ns#" term="scala"/>
    <author>
      <name>Daniel Sobral</name>
      <email>noreply@blogger.com</email>
      <uri>https://profiles.google.com/109369058791340660984</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-6373963829340632529</id>
      <category term="currying"/>
      <category term="scala"/>
      <category term="case class"/>
      <category term="tuples"/>
      <category term="type class"/>
      <category term="programming"/>
      <category term="manifest"/>
      <category term="continuations"/>
      <category term="sbt"/>
      <category term="language"/>
      <category term="scala 2.10"/>
      <category term="collection"/>
      <category term="puzzle"/>
      <category term="algorithm"/>
      <category term="scala 2.9"/>
      <category term="fibonacci"/>
      <category term="equality"/>
      <category term="style"/>
      <category term="outsourcing"/>
      <category term="regex"/>
      <category term="apl"/>
      <category term="scalable-series"/>
      <category term="agile"/>
      <category term="matrix"/>
      <category term="software"/>
      <category term="type erasure"/>
      <category term="projection"/>
      <category term="linux ubuntu boot grub"/>
      <category term="software-engineering"/>
      <category term="rewritting"/>
      <category term="operators"/>
      <category term="parser"/>
      <category term="architecture"/>
      <category term="beginner"/>
      <category term="compiler"/>
      <author>
        <name>Daniel Sobral</name>
        <email>noreply@blogger.com</email>
        <uri>https://profiles.google.com/109369058791340660984</uri>
      </author>
      <link href="http://dcsobral.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://www.blogger.com/feeds/6373963829340632529/posts/default" rel="self" type="application/atom+xml"/>
      <link href="http://dcsobral.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <link href="http://www.blogger.com/feeds/6373963829340632529/posts/default?start-index=26&amp;max-results=25" rel="next" type="application/atom+xml"/>
      <subtitle>Random thoughts of an IT worker in the stone age of computer science.</subtitle>
      <title>Algorithmically challenged</title>
      <updated>2012-01-25T13:51:17Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-7317245822288637185.post-6966341080002235096</id>
    <link href="http://grahamhackingscala.blogspot.com/feeds/6966341080002235096/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="http://grahamhackingscala.blogspot.com/2012/01/updates-to-scalaspringhibernatemaven.html#comment-form" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/7317245822288637185/posts/default/6966341080002235096?v=2" rel="edit" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/7317245822288637185/posts/default/6966341080002235096?v=2" rel="self" type="application/atom+xml"/>
    <link href="http://feedproxy.google.com/~r/blogspot/vnby/~3/lLbLkt0mTQc/updates-to-scalaspringhibernatemaven.html" rel="alternate" type="text/html"/>
    <title>Updates to Scala/Spring/Hibernate/Maven Webapp</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">One of the projects I maintain is a public domain code base on <a href="https://github.com/">GitHub </a>called Scala-Spring-Hibernate-Maven-Webapp. The repository contains source code for kickstarting your own webapp project using the latest versions of <a href="http://www.scala-lang.org/">Scala</a>, <a href="http://www.springsource.org/features/modern-web">Spring Web</a>, <a href="http://www.hibernate.org/">Hibernate </a>and <a href="http://maven.apache.org/">Maven</a>.<br/>
<br/>
<b>Project Updates</b><br/>
I've been committing some major changes over the last couple of weeks, including:<br/>
<ul>
<li>Upgrading to Scala 2.9.1, Spring 3.1.0 and Hibernate 4.0.0 </li>
<li>Adding to the existing <a href="http://en.wikipedia.org/wiki/Representational_state_transfer">REST-ful </a>Create and Retrive examples some Update and Delete operations </li>
<li>Adding server-side form validation using <a href="http://www.openscope.net/2010/02/08/spring-mvc-3-0-and-jsr-303-aka-javax-validation/">JSR-303 annotations </a>with Spring Web MVC </li>
<li>Creating examples of automated web testing using <a href="http://seleniumhq.org/">Selenium WebDriver </a>and the <a href="http://code.google.com/p/selenium/wiki/PageObjects">PageObjects </a>pattern</li>
</ul>
 If you're about to start your own project with these technologies, or are just keen to see how they all work together, you can get your own copy of the source code from here:<br/>
<a href="https://github.com/GrahamLea/scala-spring-hibernate-maven-webapp">https://github.com/GrahamLea/scala-spring-hibernate-maven-webapp</a><br/>
<br/>
<b>Resolved Issues</b><br/>
I encountered a couple of time-consuming issues during the upgrades to the latest versions and I think it 

would be worth sharing how they were resolved in order to save some time for others googling for solutions to 

the same problems.<br/>
<br/>
<b>Spring Schema SAXParseException</b><br/>
After upgrading the versions of all the Spring Schemas in my Spring XML files, I started getting the following 

error while trying to start up the webapp:
<br/>
<pre class="brush: scala">org.xml.sax.SAXParseException: cos-all-limited.1.2: An ''all'' model group must appear in a particle with '{'min occurs'}'='{'max occurs'}'=1, and that particle must be part of a pair which constitutes the '{'content type'}' of a complex type definition.
</pre>
At first this appears to be a bug in the Spring schema, but a bit more investigation revealed that it is, in 

fact, a bug in an old version of the Xerces XML parser library. In my case, an old version of the library was 

being pulled in through commons-dbcp. The solution I took was to explicitly add a dependency on the latest 

version of Xerces:
<br/>
<pre class="brush: xml">        &lt;dependency&gt;
            &lt;groupId&gt;xerces&lt;/groupId&gt;
            &lt;artifactId&gt;xercesImpl&lt;/artifactId&gt;
            &lt;version&gt;2.9.1&lt;/version&gt;
            &lt;scope&gt;runtime&lt;/scope&gt;
        &lt;/dependency&gt;
</pre>
<br/>
<b>Hibernate Function Not Supported</b> <br/>
After upgrading Hibernate to 4.0.0, I started getting this error message whenever I tried to execute a query:
<br/>
<pre class="brush: scala">org.hibernate.exception.GenericJDBCException: This function is not supported
Caused by: java.sql.SQLException: This function is not supported
</pre>
I don't remember whether HSQLDB appeared in the stack trace or not, but the solution to this was to upgrade 

the version of HSQLDB I was using from 1.8.0.10 to 2.2.6. If you get the same error and you're not using 

HSQLDB, I would suggest considering an upgrade of your JDBC driver or maybe even your database server.<br/>
<br/>
<b>"No Session found for current thread" </b><br/>
Also after upgrading to Spring 3.1.0 and Hibernate 4.0.0, and after changing all my Hibernate 3 Spring beans 

to the corresponding Hibernate 4 versions, I started getting the old classic "No Session found for current 

thread" error when trying to view any page with a transaction. I thought this was very odd, because the 

traditional solution to this has always been to make sure you have an OpenSessionInViewInterceptor, but I 

already had one, defined like this:
<br/>
<pre class="brush: xml">    &lt;bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"&gt;
        &lt;property name="interceptors"&gt;
            &lt;list&gt;&lt;ref bean="openSessionInViewInterceptor"/&gt;&lt;/list&gt;
        &lt;/property&gt;
    &lt;/bean&gt;
</pre>
By pure chance, I'd seen a Spring documentation page earlier the same day where I'd noticed an alternative way 

of declaring interceptors using the 'mvc' namespace:
<br/>
<pre class="brush: xml">    &lt;mvc:interceptors&gt;
        &lt;ref bean="openSessionInViewInterceptor"/&gt;
    &lt;/mvc:interceptors\&gt;
</pre>
Replacing my old DefaultAnnotationHandlerMapping definition with the one above got my 

OpenSessionInViewInterceptor working again and solved the "No Session found for current thread".<br/>
<br/>
<b>No Appenders for Log4J</b><br/>
Finally, this one is a bit silly, but I spent a good half hour on it without finding any good help on the web 

so I thought it was worth documenting. At some point I started getting this error out of <a href="http://logging.apache.org/log4j/1.2/">Log4J </a>every time I 

started my webapp:
<br/>
<pre class="brush: scala">log4j:WARN No appenders could be found for logger
</pre>
After all kinds of googling, experiments with winding back dependency upgrades and investigations into 

ClassLoaders, I eventually noticed that I just had a typo in the Log4J configuration file:
<br/>
<pre class="brush: scala">og4j.rootCategory=INFO,Console
</pre>
Notice the 'l' missing at the start of that line? Ouch. So if you're getting this error message about no 

appenders and you think your log4j config is all set up properly, check whether the config for your root 

category is correct before investing too much time in breakpoints inside Log4J classes.

<br/>
<br/>
<span style="font-weight: bold;">Want to learn more?</span><br/>
Here's some books you might find useful if you plan to go further with Spring, Hibernate, Scala or Maven:<br/>
<div style="background-color: #666666; color: white; text-align: center;">
From Amazon</div>
<br/>
<table><tbody>
<tr><td>&lt;iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=FFFFFF&amp;amp;IS2=1&amp;amp;npa=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=4444CC&amp;amp;t=belmontechno-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;md=10FE9736YVPPT7A0FBG2&amp;amp;asins=1933988134" style="height: 240px; width: 120px;"&gt;&lt;/iframe&gt;<br/>
</td><td>&lt;iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=FFFFFF&amp;amp;IS2=1&amp;amp;npa=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=4444CC&amp;amp;t=belmontechno-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;md=10FE9736YVPPT7A0FBG2&amp;amp;asins=193239415X" style="height: 240px; width: 120px;"&gt;&lt;/iframe&gt;<br/>
</td><td>&lt;iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=FFFFFF&amp;amp;IS2=1&amp;amp;npa=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=4444CC&amp;amp;t=belmontechno-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;md=10FE9736YVPPT7A0FBG2&amp;amp;asins=1430224991" style="height: 240px; width: 120px;"&gt;&lt;/iframe&gt;<br/>
</td><td>&lt;iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=FFFFFF&amp;amp;IS2=1&amp;amp;npa=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=4444CC&amp;amp;t=belmontechno-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;md=10FE9736YVPPT7A0FBG2&amp;amp;asins=0981531601" style="height: 240px; width: 120px;"&gt;&lt;/iframe&gt;<br/>
</td><td>&lt;iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=FFFFFF&amp;amp;IS2=1&amp;amp;npa=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=4444CC&amp;amp;t=belmontechno-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;md=10FE9736YVPPT7A0FBG2&amp;amp;asins=0596007507" style="height: 240px; width: 120px;"&gt;&lt;/iframe&gt;<br/>
</td></tr>
</tbody></table>
<br/>
<br/>
<div style="background-color: #666666; color: white; text-align: center;">
From The Book Depository</div>
<br/>
<a href="http://www.bookdepository.co.uk/book/9781933988139/Walls/?a_aid=belmonttechnology" target="_blank">Spring in Action - Craig Walls &amp; Ryan Breidenbach (Manning)</a><br/>
<br/>
<a href="http://www.bookdepository.co.uk/book/9781932394153/Hibernate-in-Action/?a_aid=belmonttechnology" target="_blank">Hibernate in Action - Gavin King &amp; Christian Bauer (Manning)</a><br/>
<br/>
<a href="http://www.bookdepository.co.uk/book/9781590599792/Spring-Recipes/?a_aid=belmonttechnology" target="_blank">Spring Recipes - Gary Mak (Apress)</a><br/>
<br/>
<a href="http://www.bookdepository.co.uk/book/9780981531601/Programming-in-Scala/?a_aid=belmonttechnology" target="_blank">Programming in Scala - Martin Odersky, Lex Spoon &amp; Bill Venners (Artima)</a><br/>
<br/>
<a href="http://www.bookdepository.co.uk/book/9780596007508/Maven-a-Developers-Notebook/?a_aid=belmonttechnology" target="_blank">Maven - A Developer's Notebook - Vincent Massol &amp; Timothy M. O'Brien (O'Reilly)</a><div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/7317245822288637185-6966341080002235096?l=grahamhackingscala.blogspot.com" width="1"/></div>
<p><a href="http://feedads.g.doubleclick.net/~a/O70HENFF2O4ru3bPedt5GmgfqZs/0/da"><img border="0" ismap="true" src="http://feedads.g.doubleclick.net/~a/O70HENFF2O4ru3bPedt5GmgfqZs/0/di"/></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/O70HENFF2O4ru3bPedt5GmgfqZs/1/da"><img border="0" ismap="true" src="http://feedads.g.doubleclick.net/~a/O70HENFF2O4ru3bPedt5GmgfqZs/1/di"/></a></p><img height="1" src="http://feeds.feedburner.com/~r/blogspot/vnby/~4/lLbLkt0mTQc" width="1"/></div>
    </content>
    <updated>2012-01-09T09:23:35Z</updated>
    <published>2012-01-09T06:44:00Z</published>
    <category scheme="http://www.blogger.com/atom/ns#" term="jsr-303"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="REST"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="mvc"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="selenium webdriver"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="spring"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="webapp"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="web"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="maven"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="crud"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="example"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="hibernate"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="pageobjects"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="2012"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="tutorial"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="validation"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="annotations"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="scala"/><feedburner:origLink xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://grahamhackingscala.blogspot.com/2012/01/updates-to-scalaspringhibernatemaven.html</feedburner:origLink>
    <author>
      <name>Graham Lea</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/07862939329898536954</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-7317245822288637185</id>
      <category term="backwards"/>
      <category term="web application"/>
      <category term="domain model"/>
      <category term="controllers"/>
      <category term="open source software"/>
      <category term="tools"/>
      <category term="solution"/>
      <category term="martin odersky"/>
      <category term="scalac"/>
      <category term="hamlet d'arcy"/>
      <category term="nosuchmethoderror"/>
      <category term="literal"/>
      <category term="books"/>
      <category term="free"/>
      <category term="autocompletion"/>
      <category term="type inference"/>
      <category term="community"/>
      <category term="maven"/>
      <category term="conversion"/>
      <category term="folding"/>
      <category term="MODULE$"/>
      <category term="lean software development"/>
      <category term="scaladoc"/>
      <category term="auto-completion"/>
      <category term="Unit"/>
      <category term="bytecode"/>
      <category term="quick"/>
      <category term="copy"/>
      <category term="code creator"/>
      <category term="resources"/>
      <category term="javap"/>
      <category term="email"/>
      <category term="hql"/>
      <category term="Things"/>
      <category term="typesafe"/>
      <category term="fluent"/>
      <category term="bdd"/>
      <category term="transform"/>
      <category term="line"/>
      <category term="work"/>
      <category term="nil"/>
      <category term="programs"/>
      <category term="tail call optimization"/>
      <category term="main()"/>
      <category term="hans Docketer"/>
      <category term="java"/>
      <category term="pageobject"/>
      <category term="talk"/>
      <category term="wrapping"/>
      <category term="example"/>
      <category term="intentional"/>
      <category term="procedure"/>
      <category term="streams"/>
      <category term="native"/>
      <category term="mutable"/>
      <category term="prezi"/>
      <category term="online"/>
      <category term="mvc"/>
      <category term="crud"/>
      <category term="Oleg Zhurakousky"/>
      <category term="spring 3.1"/>
      <category term="compatibility"/>
      <category term="iterable"/>
      <category term="practical"/>
      <category term="groovy"/>
      <category term="Love"/>
      <category term="error"/>
      <category term="compiler"/>
      <category term="gridgain"/>
      <category term="slides"/>
      <category term="scala.xml.Elem"/>
      <category term="introduction"/>
      <category term="list"/>
      <category term="smart"/>
      <category term="tail call optimistaion"/>
      <category term="dave syer"/>
      <category term="magic"/>
      <category term="efficiency"/>
      <category term="seq"/>
      <category term="option"/>
      <category term="github"/>
      <category term="hacking"/>
      <category term="websockets"/>
      <category term="signal"/>
      <category term="executable requirements"/>
      <category term="Juergen Hoeller"/>
      <category term="delegation"/>
      <category term="critque"/>
      <category term="buffer"/>
      <category term="extractor"/>
      <category term="gradle"/>
      <category term="possible"/>
      <category term="compilation"/>
      <category term="compare"/>
      <category term="ternary operator"/>
      <category term="scala 2.8"/>
      <category term="effective java"/>
      <category term="byte code"/>
      <category term="productivity"/>
      <category term="code"/>
      <category term="roi"/>
      <category term="learning"/>
      <category term="repository"/>
      <category term="expalined"/>
      <category term="enterprise integration"/>
      <category term="compile errors"/>
      <category term="thread-safety"/>
      <category term="jsr-303"/>
      <category term="tailrec"/>
      <category term="graham"/>
      <category term="navigation"/>
      <category term="walk-through"/>
      <category term="recursive function"/>
      <category term="pageobjects"/>
      <category term="feature-driven design"/>
      <category term="imperative"/>
      <category term="decompilation"/>
      <category term="scalasyd"/>
      <category term="meeting"/>
      <category term="wife"/>
      <category term="tail call"/>
      <category term="create"/>
      <category term="GemFire"/>
      <category term="pleasure"/>
      <category term="company"/>
      <category term="concise code"/>
      <category term="fit"/>
      <category term="josh long"/>
      <category term="servlets"/>
      <category term="douglas crockford"/>
      <category term="annotated"/>
      <category term="error highlighting"/>
      <category term="webapp"/>
      <category term="rount-trip engineering"/>
      <category term="sodatest"/>
      <category term="real world"/>
      <category term="what's new"/>
      <category term="meetup"/>
      <category term="higher-kinded types"/>
      <category term="html5"/>
      <category term="web"/>
      <category term="plug-in"/>
      <category term="commercial"/>
      <category term="singleton"/>
      <category term="concurrent programming"/>
      <category term="annotations"/>
      <category term="how to"/>
      <category term="gwt"/>
      <category term="spring integration"/>
      <category term="syntax"/>
      <category term="how"/>
      <category term="Paste"/>
      <category term="distributed systems"/>
      <category term="validation"/>
      <category term="presentation"/>
      <category term="cumulative function"/>
      <category term="spring batch"/>
      <category term="test"/>
      <category term="graham lea"/>
      <category term="bill venners"/>
      <category term="create tools"/>
      <category term="spring roo"/>
      <category term="spring"/>
      <category term="staack overflow"/>
      <category term="shortcuts"/>
      <category term="integration testing"/>
      <category term="keyboard"/>
      <category term="History"/>
      <category term="released"/>
      <category term="performance"/>
      <category term="type-aware"/>
      <category term="eclipse"/>
      <category term="bad parts"/>
      <category term="HelloWorld"/>
      <category term="generate"/>
      <category term="David Brown"/>
      <category term="future"/>
      <category term="xml"/>
      <category term="scala"/>
      <category term="sydney"/>
      <category term="succint"/>
      <category term="facepalm"/>
      <category term="lex spoon"/>
      <category term="attribute"/>
      <category term="object"/>
      <category term="css3"/>
      <category term="immutable"/>
      <category term="webdriver"/>
      <category term="intellij"/>
      <category term="custom tools"/>
      <category term="hsqldb"/>
      <category term="integration"/>
      <category term="tutorials"/>
      <category term="presenting"/>
      <category term="for comprehension"/>
      <category term="jpa"/>
      <category term="scala 2.7"/>
      <category term="coding"/>
      <category term="grid computing"/>
      <category term="release"/>
      <category term="testing"/>
      <category term="why"/>
      <category term="generation"/>
      <category term="foldleft"/>
      <category term="noise"/>
      <category term="recursion"/>
      <category term="springone 2gx 2010"/>
      <category term="jetbrains"/>
      <category term="static linking"/>
      <category term="acceptance testing"/>
      <category term="concise"/>
      <category term="simplicity"/>
      <category term="optimisation"/>
      <category term="design patterns"/>
      <category term="fsc"/>
      <category term="time saving"/>
      <category term="javascript"/>
      <category term="selenium webdriver"/>
      <category term="fast"/>
      <category term="yammer"/>
      <category term="map"/>
      <category term="collection"/>
      <category term="partially-applied functions"/>
      <category term="$tag()"/>
      <category term="higher-order functions"/>
      <category term="look ahead"/>
      <category term="match"/>
      <category term="canbuildfrom"/>
      <category term="switch"/>
      <category term="::"/>
      <category term="expressive"/>
      <category term="2012"/>
      <category term="tail call optimiztaion"/>
      <category term="find"/>
      <category term="address"/>
      <category term="comparison"/>
      <category term="functional"/>
      <category term="cut"/>
      <category term="class"/>
      <category term="sodtest"/>
      <category term="top 10"/>
      <category term="Clipboard"/>
      <category term="hibernate"/>
      <category term="idea"/>
      <category term="Jags Ramnarayan"/>
      <category term="element"/>
      <category term="REST"/>
      <category term="steps"/>
      <category term="ajax"/>
      <category term="convert"/>
      <category term="programming"/>
      <category term="tutorial"/>
      <category term="forward reference extends over definition"/>
      <category term="jsp"/>
      <category term="how-to"/>
      <category term="impossible"/>
      <category term="unapply"/>
      <category term="NoSQL"/>
      <category term="envy"/>
      <category term="learn"/>
      <category term="intellij idea"/>
      <category term="hello world"/>
      <category term="criticism"/>
      <category term="knitting"/>
      <category term="pragmatic"/>
      <category term="imports"/>
      <category term="functional programming"/>
      <category term="features"/>
      <category term="intelligent"/>
      <category term="coda hale"/>
      <category term="reasons"/>
      <category term="anonymous functions"/>
      <category term="the good parts"/>
      <category term="traversable"/>
      <author>
        <name>Graham Lea</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/07862939329898536954</uri>
      </author>
      <link href="http://grahamhackingscala.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://grahamhackingscala.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://www.blogger.com/feeds/7317245822288637185/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" rel="next" type="application/atom+xml"/>
      <link href="http://feeds.feedburner.com/blogspot/vnby" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>The point of "Graham Hacking Scala" is to share with you my knowledge of and experience with the Scala programming language. The blog will contain everything from introductions to basic features through to in-depth analysis of complex techniques and problems. When I make mistakes, you will learn from my mistakes. When I discover cool features, you will learn about them, too.</subtitle>
      <title>Graham Hacking Scala</title>
      <updated>2012-01-21T05:57:27Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-22587889.post-591560437586381904</id>
    <link href="http://debasishg.blogspot.com/feeds/591560437586381904/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="http://www.blogger.com/comment.g?blogID=22587889&amp;postID=591560437586381904" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/22587889/posts/default/591560437586381904" rel="edit" type="application/atom+xml"/>
    <link href="http://debasishg.blogspot.com/feeds/posts/default/591560437586381904" rel="self" type="application/atom+xml"/>
    <link href="http://debasishg.blogspot.com/2012/01/learning-type-level-fixpoint-combinator.html" rel="alternate" type="text/html"/>
    <title>Learning the type level fixpoint combinator Mu</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I <a href="http://debasishg.blogspot.com/2011/07/datatype-generic-programming-in-scala.html">blogged</a> on Mu, type level fixpoint combinator some time back. I discussed how <code>Mu</code> can be implemented in Scala and how you can use it to derive a generic model for catamorphism and some cool type level data structures. Recently I have been reading <a href="http://www.amazon.com/Types-Programming-Languages-Benjamin-Pierce/dp/0262162091/ref=sr_1_sc_1?s=books&amp;ie=UTF8&amp;qid=1326026391&amp;sr=1-1-spell">TAPL</a> by Benjamin Pierce that gives a very thorough treatment of the theories and implementation semantics of types in a programming language. <br/><br/>And <code>Mu</code> we meet again. Pierce does a very nice job of explaining how <code>Mu</code> does for <i>types</i> what <code>Y</code> does for <i>values</i>. In this post, I will discuss my understanding of <code>Mu</code> from a type theory point of view much of what TAPL explains. <br/><br/>As we know, the collection of types in a programming language forms a <a href="http://en.wikipedia.org/wiki/Category_theory">category</a> and any equation recursive in types can be converted to obtain an <a href="http://en.wikipedia.org/wiki/Functor">endofunctor</a> on the same category. In an upcoming post I will discuss how the fixed point that we get from <code>Mu</code> translates to an isomoprhism in the diagram of categories.<br/><br/>Let's have a look at the <code>Mu</code> constructor - the fixed point for type constructor. What does it mean ? <br/><br/>Here's the ordinary fixed point combinator for functions (from values to values) ..<br/><br/><code><span class="java_plain">Y f </span><span class="java_operator">=</span><span class="java_plain"> f </span><span class="java_separator">(</span><span class="java_plain">Y f</span><span class="java_separator">)</span><span class="java_plain"/><br/></code><br/>and here's <code>Mu</code><br/><br/><code><span class="java_type">Mu</span><span class="java_plain"> f </span><span class="java_operator">=</span><span class="java_plain"> f </span><span class="java_separator">(</span><span class="java_type">Mu</span><span class="java_plain"> f</span><span class="java_separator">)</span><span class="java_plain"/><br/></code><br/>Quite similar in structure to <code>Y</code>, the difference being that <code>Mu</code> operates on type constructors. Here <code>f</code> is a type constructor (one that takes a type as input and generates another type). List is the most commonly used type constructor. You give it a type <code>Int</code> and you get a concrete type <code>ListInt</code>.<br/><br/>So, <code>Mu</code> takes a type constructor <code>f</code> and gives you a type <code>T</code>. This <code>T</code> is the fixed point of <code>f</code>, i.e. <code>f T = T</code>.<br/><br/>Consider the following recursive definition of a List ..<br/><br/><code><span class="java_comment">// nil takes no arguments and returns a List data type</span><br/><span class="java_plain">nil </span><span class="java_operator">:</span><span class="java_plain"> </span><span class="java_literal">1</span><span class="java_plain"> </span><span class="java_operator">-&gt;</span><span class="java_plain"> </span><span class="java_type">ListInt</span><span class="java_plain"/><br/><span class="java_plain"/><br/><span class="java_comment">// cons takes 2 arguments and returns a List data type</span><br/><span class="java_plain">cons </span><span class="java_operator">:</span><span class="java_plain"> </span><span class="java_separator">(</span><span class="java_type">Int</span><span class="java_plain"> x </span><span class="java_type">ListInt</span><span class="java_separator">)</span><span class="java_plain"> </span><span class="java_operator">-&gt;</span><span class="java_plain"> </span><span class="java_type">ListInt</span><span class="java_plain"/><br/><span class="java_plain"/><br/></code><br/>Taken together we would like to solve the following equation :<br/><br/><code><span class="java_plain">a </span><span class="java_operator">=</span><span class="java_plain"> </span><span class="java_type">Unit</span><span class="java_plain"> </span><span class="java_operator">+</span><span class="java_plain"> </span><span class="java_type">Int</span><span class="java_plain"> </span><span class="java_operator">x</span><span class="java_plain"> a     </span><span class="java_comment">// ..... (1)</span><br/></code><br/>Now this is recursive and can be unfolded infinitely as <br/><br/><code><span class="java_plain">a </span><span class="java_operator">=</span><span class="java_plain"> </span><span class="java_type">Unit</span><span class="java_plain"> </span><span class="java_operator">+</span><span class="java_plain"> </span><span class="java_type">Int</span><span class="java_plain"> </span><span class="java_operator">x</span><span class="java_plain"> </span><span class="java_separator">(</span><span class="java_type">Unit</span><span class="java_plain"> </span><span class="java_operator">+</span><span class="java_plain"> </span><span class="java_type">Int</span><span class="java_plain"> </span><span class="java_operator">x</span><span class="java_plain"> a</span><span class="java_separator">)</span><span class="java_plain"/><br/><span class="java_plain">  </span><span class="java_operator">=</span><span class="java_plain"> </span><span class="java_type">Unit</span><span class="java_plain"> </span><span class="java_operator">+</span><span class="java_plain"> </span><span class="java_type">Int</span><span class="java_plain"> </span><span class="java_operator">x</span><span class="java_plain"> </span><span class="java_separator">(</span><span class="java_type">Unit</span><span class="java_plain"> </span><span class="java_operator">+</span><span class="java_plain"> </span><span class="java_type">Int</span><span class="java_plain"> </span><span class="java_operator">x</span><span class="java_plain"> </span><span class="java_separator">(</span><span class="java_type">Unit</span><span class="java_plain"> </span><span class="java_operator">+</span><span class="java_plain"> </span><span class="java_type">Int</span><span class="java_plain"> </span><span class="java_operator">x</span><span class="java_plain"> a</span><span class="java_separator">))</span><span class="java_plain"/><br/><span class="java_plain">  </span><span class="java_operator">=</span><span class="java_plain"> </span><span class="java_separator">...</span><span class="java_plain"/><br/><span class="java_plain"/><br/></code><br/>TAPL shows that this equation can be represented in the form of an infinite labeled tree and calls this infinite type regular. So, generally speaking, we have an equation of the form <code>a = τ</code> where<br/><br/>1. if <code>a</code> does not occur in <code>τ</code>, then we have a finite solution which, in fact is <code>τ</code><br/>2. if a occurs in <code>τ</code>, then we have an infinite solution represented by an infinite regular tree<br/><br/>So the above equation is of the form <code>a = ... a ...</code> or we can say <code>a = F(a)</code> where <code>F</code> is the type constructor. This highlights the recursion of types (not of values). Hence any solution to this equation will give us an object which will be the fixed point of the equation. We call this solution <code>Mu a . F</code>. <br/><br/>Since <code>Mu a . F</code> is a solution to <code>a = F(a)</code>, we have the following:<br/><br/><code>Mu a . F = F {Mu a . F / a}</code>, where the rhs indicates substitution of all free <code>a</code>'s in <code>F</code> by <code>Mu a . F</code>.<br/><br/>Here <code>Mu</code> is the fixed point combinator which takes the type constructor <code>F</code> and gives us a type, which is the fixed point of <code>F</code>. Using this idea, the above equation (1) has the solution <code>ListInt</code>, which is the fixed point type ..<br/><br/><code><span class="java_type">ListInt</span><span class="java_plain"> </span><span class="java_operator">=</span><span class="java_plain"> </span><span class="java_type">Mu</span><span class="java_plain"> a </span><span class="java_separator">.</span><span class="java_plain"> </span><span class="java_type">Unit</span><span class="java_plain"> </span><span class="java_operator">+</span><span class="java_plain"> </span><span class="java_type">Int</span><span class="java_plain"> x a</span><br/></code><br/>In summary, we express recursive types using the fix point type constructor <code>Mu</code> and show that <code>Mu</code> generates the fixed point for the type constructor just like <code>Y</code> generates the same for functions on values.<div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/22587889-591560437586381904?l=debasishg.blogspot.com" width="1"/></div></div>
    </content>
    <updated>2012-01-08T13:41:59Z</updated>
    <published>2012-01-07T20:13:00Z</published>
    <category scheme="http://www.blogger.com/atom/ns#" term="functional"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="fixpoint"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="type"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="datatype-generic-programming"/>
    <author>
      <name>Debasish Ghosh</name>
      <email>noreply@blogger.com</email>
      <uri>https://profiles.google.com/106871002817915335660</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-22587889</id>
      <category term="ruby"/>
      <category term="couchdb"/>
      <category term="amqp"/>
      <category term="javascript"/>
      <category term="clojure"/>
      <category term="erlang"/>
      <category term="web"/>
      <category term="websocket"/>
      <category term="redis"/>
      <category term="monad"/>
      <category term="data-structures"/>
      <category term="actor"/>
      <category term="lookback"/>
      <category term="OCaml"/>
      <category term="smullyan"/>
      <category term="mina"/>
      <category term="terracotta"/>
      <category term="open source"/>
      <category term="mustang"/>
      <category term="RIA"/>
      <category term="eventsourcing"/>
      <category term="combinator"/>
      <category term="guice"/>
      <category term="agile"/>
      <category term="dslsina"/>
      <category term="yegge"/>
      <category term="spring"/>
      <category term="rails"/>
      <category term="functional"/>
      <category term="haskell"/>
      <category term="api programming"/>
      <category term="datatype-generic-programming"/>
      <category term="cqrs"/>
      <category term="nosql"/>
      <category term="map-reduce"/>
      <category term="database"/>
      <category term="message-queue"/>
      <category term="xml"/>
      <category term="scala"/>
      <category term="scouchdb"/>
      <category term="type"/>
      <category term="java"/>
      <category term="scalability"/>
      <category term="seam"/>
      <category term="ajax"/>
      <category term="patterns"/>
      <category term="mixin"/>
      <category term="programming"/>
      <category term="jpa-gotcha-series"/>
      <category term="aop"/>
      <category term="rants"/>
      <category term="demeter"/>
      <category term="stm"/>
      <category term="knuth"/>
      <category term="lisp"/>
      <category term="F#"/>
      <category term="algorithm"/>
      <category term="category_theory"/>
      <category term="OO"/>
      <category term="jvm"/>
      <category term="joy"/>
      <category term="concurrency"/>
      <category term="lift"/>
      <category term="DI"/>
      <category term="rest"/>
      <category term="oscon08"/>
      <category term="potpouri"/>
      <category term="algebra"/>
      <category term="fixpoint"/>
      <category term="ddd"/>
      <category term="scalaz"/>
      <category term="euler"/>
      <category term="groovy"/>
      <category term="jpa"/>
      <category term="software"/>
      <category term="orm"/>
      <category term="closure"/>
      <category term="dao"/>
      <category term="dsl"/>
      <category term="parser-combinator"/>
      <category term="memcached"/>
      <category term="akka"/>
      <category term="design"/>
      <category term="testing"/>
      <category term="json"/>
      <category term="potpourri"/>
      <author>
        <name>Debasish Ghosh</name>
        <email>noreply@blogger.com</email>
        <uri>https://profiles.google.com/106871002817915335660</uri>
      </author>
      <link href="http://debasishg.blogspot.com/feeds/posts/full" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://debasishg.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://debasishg.blogspot.com/feeds/posts/full?start-index=4&amp;max-results=3" rel="next" type="application/atom+xml"/>
      <link href="http://feeds.feedburner.com/RuminationsOfAProgrammer" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>A programmer's blog - will deal with everything that relates to a programmer. Occasionally, it will contain some humour, some politics and some sport news.</subtitle>
      <title>Ruminations of a Programmer</title>
      <updated>2012-02-05T16:49:40Z</updated>
    </source>
  </entry>
</feed>

