<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Useless Inc.</title>
    <link>http://www.tomergabel.com/</link>
    <description>Tomer Gabel's annoying spot on the 'net</description>
    <language>en-us</language>
    <copyright>Tomer Gabel</copyright>
    <lastBuildDate>Mon, 11 Feb 2013 14:33:11 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>tomer@tomergabel.com</managingEditor>
    <webMaster>tomer@tomergabel.com</webMaster>
    <item>
      <trackback:ping>http://www.tomergabel.com/Trackback.aspx?guid=851a7271-9bda-403c-a72f-8b13ec552271</trackback:ping>
      <pingback:server>http://www.tomergabel.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.tomergabel.com/PermaLink,guid,851a7271-9bda-403c-a72f-8b13ec552271.aspx</pingback:target>
      <dc:creator>Tomer Gabel</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This is the second post of a two-parter. Please read <a href="http://www.tomergabel.com/Scala210MigrationCaseStudyPartI.aspx">part
1</a> for context and additional information.
</p>
        <p>
          <span style="text-decoration: underline;">3rd Party Libraries</span>
        </p>
        <p>
As mentioned in part 1, Scala is not binary backwards-compatible between major releases.
Although code compiled with 2.10 <em>may</em> work properly with libraries compiled
against 2.9.x, this is hardly recommended and may result in a lot of subtle error
conditions at runtime that are hard to track down. As a result, the recommended practice
is to upgrade <em>all</em> Scala dependencies to versions compiled against 2.10. Fortunately
the Scala ecosystem is very active, so most common libraries had 2.10 builds on announcement
day, but you are still likely to encounter libraries that need to be upgraded because:
</p>
        <ul>
          <li>
They're lagging behind the Scala release schedule and simply haven't released 2.10-compatible
binaries (fortunately, this seems to be extremely rare; in practice all our dependencies
were otherwise resolved);</li>
          <li>
The specific version you're using does not have a 2.10-compatible release and likely
never will (Squeryl 0.9.5-2);</li>
          <li>
A 2.10-compatible official release is out but hasn't yet been published to the central
repository (Scalatra 2.0.5).</li>
        </ul>
        <p>
My experience shows that with a bit of dilligence, practically all our (myriad) dependencies
were fairly easy to migrate to 2.10. In most cases this simply entails switching to
the appropriate artifact ID suffix (_2.10 instead of _2.9.2, see part 1 for associated
rant), in other cases I had to upgrade to a later official release and in rare cases
I had to dig in and replace a dependency with an appropriate fork or snapshot version.
Here is a list of migration notes for some of our dependencies:
</p>
        <table border="1" cellpadding="5">
          <thead>
            <tr>
              <td>
                <strong>Library</strong>
              </td>
              <td>
                <strong>Previous</strong>
              </td>
              <td>
                <strong>New version</strong>
              </td>
              <td>
                <strong>Comments</strong>
              </td>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>
                <a href="https://github.com/jorgeortiz85/scala-time">Scala-Time</a>
              </td>
              <td>
0.6</td>
              <td>
nscala-time 0.2 
</td>
              <td>
The original library appears to be abandoned and <a href="https://github.com/nscala-time/nscala-time">was
forked</a> on GitHub.<br />
The package changed from <span style="font-family: 'courier new', courier;">org.scala-tools.time</span> to <span style="font-family: 'courier new', courier;">com.github.nscala-time.time</span><span style="font-size: 14px;"></span></td>
            </tr>
            <tr>
              <td>
                <a href="http://scalamock.org/">ScalaMock</a>
              </td>
              <td>
2.4</td>
              <td>
3.0.1</td>
              <td>
The 3.x series runs natively on Scala 2.10 without proxy factories and the like. Syntax
is a bit odd but works like a charm.<br />
The ScalaTest integration is compiled against ScalaTest 2.0-M5b, which forced us to
upgrade. 
</td>
            </tr>
            <tr>
              <td>
                <a href="http://scalatest.org/">ScalaTest</a>
              </td>
              <td>
1.8</td>
              <td>
2.0-M5b 
</td>
              <td>
Minor API changes: <span style="font-family: 'courier new', courier;">Spec</span><span style="font-family: 'courier new', courier;">→</span><span style="font-family: 'courier new', courier;">FunSpec</span>,
parameters changed in <span style="font-family: 'courier new', courier;">Suite.run()</span></td>
            </tr>
            <tr>
              <td>
                <a href="http://squeryl.org/">Squeryl</a>
              </td>
              <td>
0.9.5-2 
</td>
              <td>
0.9.5-6 
</td>
              <td>
              </td>
            </tr>
            <tr>
              <td>
                <a href="http://software.clapper.org/argot/">Argot</a>
              </td>
              <td>
0.4 
</td>
              <td>
1.0.0 
</td>
              <td>
              </td>
            </tr>
            <tr>
              <td>
                <a href="https://github.com/scala-incubator/scala-io">Scala I/O</a>
              </td>
              <td>
0.4.1-seq 
</td>
              <td>
0.4.2 
</td>
              <td>
              </td>
            </tr>
            <tr>
              <td>
                <a href="https://github.com/lift/framework/tree/master/core/json">Lift JSON</a> (+<a href="https://github.com/lift/framework/tree/master/core/json-ext">ext</a>)</td>
              <td>
2.4 
</td>
              <td>
2.5-M4 
</td>
              <td>
              </td>
            </tr>
            <tr>
              <td>
                <a href="https://github.com/lift/modules/tree/master/facebook">Lift Facebook</a>
              </td>
              <td>
2.4 
</td>
              <td>
2.5-SNAPSHOT 
</td>
              <td>
Had to exclude <span style="font-family: 'courier new', courier;">net.liftweb:lift-webkit_2.10</span> to
avoid dependency conflicts</td>
            </tr>
            <tr>
              <td>
                <a href="http://akka.io/">Akka</a>
              </td>
              <td>
2.0.4 
</td>
              <td>
2.1 
</td>
              <td>
Scheduling now requires an implicit <span style="font-family: 'courier new', courier;">ExecutionContext</span>.
See <a href="http://doc.akka.io/docs/akka/2.1.0/project/migration-guide-2.0.x-2.1.x.html">migration
guide</a> for details. 
</td>
            </tr>
            <tr>
              <td>
                <a href="http://www.scalatra.org/">Scalatra</a>
              </td>
              <td>
2.0.4 
</td>
              <td>
2.0.5-SNAPSHOT 
</td>
              <td>
Official <a href="http://www.scalatra.org/2013/02/06/scalatra2-2-released.html">2.0.5
is out</a>, but has not yet shown up on the central repository, so I ended up going
with the (frozen) 2.0.5 snapshot artifacts</td>
            </tr>
            <tr>
              <td>
                <a href="http://www.scalatra.org/">Scalatra</a>
              </td>
              <td>
2.1.1 
</td>
              <td>
2.2.0 
</td>
              <td>
scalatra-akka module <a href="http://notes.implicit.ly/post/42420935465/scalatra-2-2-0">has
been folded back</a> into the core artifact as of 2.2.0.</td>
            </tr>
            <tr>
              <td>
                <a href="https://www.assembla.com/spaces/scala-graph/wiki">Graph for Scala</a>
              </td>
              <td>
1.5.1</td>
              <td>
1.6.1 
</td>
              <td>
              </td>
            </tr>
          </tbody>
        </table>
        <p>
        </p>
        <p>
          <span style="text-decoration: underline;">Scala Library Changes</span>
        </p>
        <p>
The Scala class library itself has a number of changes you ought to be aware of before
migrating to 2.10. The really big change is that Scala actors are deprecated in favor
of Akka. You can still use them by importing the <span style="font-family: 'courier new', courier;">scala-actors</span> artifact
from the Scala 2.10 distribution, but it is recommended to migrate fully to the new
actor system as this is also likely to be obsoleted by 2.10.1. The gentle folk at
Typesafe have provided a very comprehensive <a href="http://docs.scala-lang.org/overviews/core/actors-migration-guide.html">migration
guide</a> to assist your efforts. 
</p>
        <p>
The less prevasive API changes we ran into include:
</p>
        <ul>
          <li>
            <span style="font-family: 'courier new', courier;">List.elements </span>is deprecated
in favor of <span style="font-family: 'courier new', courier;">List.iterator</span>;</li>
          <li>
            <span style="font-family: 'courier new', courier;">TraversableOnce.toIndexedSeq</span> no
longer takes a type argument. This was actually quite pervasive in our codebase, causing
plenty of compilation errors, and is easily worked around by removing the type parameter
(which is extraneous to begin with);</li>
          <li>
Scala actors' <span style="font-family: 'courier new', courier;">Actor.receive</span> method
is now public (previously protected). This had to be rectified in pretty much all
of our existing actors by removing the <span style="font-family: 'courier new', courier;">protected</span> modifer;</li>
          <li>
Occasional subtle API changes requiring minor code fixes. For example, see this <a href="http://stackoverflow.com/questions/9487425/enumeration-and-mapping-with-scala-2-10">question
on StackOverflow</a>.</li>
        </ul>
        <p>
          <br />
          <span style="text-decoration: underline;">Summary</span>
        </p>
        <p>
Opinions differ among members of our team - some predicted that the migration process
will be much more complex whereas personally, given the relatively high level of maturity
I've come to depend on in the 2.9 series, the migration process actually ended up
being significantly harder than I anticipated. Particularly disconcerting were the
occasional compiler failures which took a lot of time to track down. Practically speaking,
though, the whole migration process took less than 3 days (including documentation),
did not involve additional teammates, and all problems were either resolved or worked
around rather quickly. The Typesafe compiler team has been very helpful in analyzing
and resolving the single bona-fide compiler bug we've run into, and the community
as a whole (on Stack Overflow, Google Groups and elsewhere) was also extremely supportive
and helpful.
</p>
        <p>
On the whole, am I happy with the process? So-so. There is nothing here an experienced
Scala developer should have serious trouble with, but it will take a lot more stability
and predictability for Scala to gain mainstream acceptance in the industry, and that
includes a much easier and more robust migration path to upcoming releases (yes, that
includes migrating from 2.10 to 2.11 when it comes along). That being said, Scala
has been a terrific language to work with in the last couple of years, and the new
features in 2.10 (particularly reflection, macros and string interpolation) should
make this an extremely worthwhile upgrade. We still have a lot of regression testing
to do on the new version, and if anything interesting pops up I'll be sure to post
about it separately (or bitch about it on <a href="http://twitter.com/@tomerg">Twitter</a>...)
</p>
        <img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=851a7271-9bda-403c-a72f-8b13ec552271" />
      </body>
      <title>Scala 2.10: Migration Case Study - part II</title>
      <guid isPermaLink="false">http://www.tomergabel.com/PermaLink,guid,851a7271-9bda-403c-a72f-8b13ec552271.aspx</guid>
      <link>http://www.tomergabel.com/Scala210MigrationCaseStudyPartII.aspx</link>
      <pubDate>Mon, 11 Feb 2013 14:33:11 GMT</pubDate>
      <description>&lt;p&gt;
This is the second post of a two-parter. Please read &lt;a href="http://www.tomergabel.com/Scala210MigrationCaseStudyPartI.aspx"&gt;part
1&lt;/a&gt; for context and additional information.
&lt;/p&gt;
&lt;p&gt;
&lt;span style="text-decoration: underline;"&gt;3rd Party Libraries&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
As mentioned in part 1, Scala is not binary backwards-compatible between major releases.
Although code compiled with 2.10 &lt;em&gt;may&lt;/em&gt; work properly with libraries compiled
against 2.9.x, this is hardly recommended and may result in a lot of subtle error
conditions at runtime that are hard to track down. As a result, the recommended practice
is to upgrade &lt;em&gt;all&lt;/em&gt; Scala dependencies to versions compiled against 2.10. Fortunately
the Scala ecosystem is very active, so most common libraries had 2.10 builds on announcement
day, but you are still likely to encounter libraries that need to be upgraded because:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
They're lagging behind the Scala release schedule and simply haven't released 2.10-compatible
binaries (fortunately, this seems to be extremely rare; in practice all our dependencies
were otherwise resolved);&lt;/li&gt;
&lt;li&gt;
The specific version you're using does not have a 2.10-compatible release and likely
never will (Squeryl 0.9.5-2);&lt;/li&gt;
&lt;li&gt;
A 2.10-compatible official release is out but hasn't yet been published to the central
repository (Scalatra 2.0.5).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
My experience shows that with a bit of dilligence, practically all our (myriad) dependencies
were fairly easy to migrate to 2.10. In most cases this simply entails switching to
the appropriate artifact ID suffix (_2.10 instead of _2.9.2, see part 1 for associated
rant), in other cases I had to upgrade to a later official release and in rare cases
I had to dig in and replace a dependency with an appropriate fork or snapshot version.
Here is a list of migration notes for some of our dependencies:
&lt;/p&gt;
&lt;table border="1" cellpadding="5"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Library&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Previous&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;New version&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Comments&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://github.com/jorgeortiz85/scala-time"&gt;Scala-Time&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
0.6&lt;/td&gt;
&lt;td&gt;
nscala-time 0.2 
&lt;/td&gt;
&lt;td&gt;
The original library appears to be abandoned and &lt;a href="https://github.com/nscala-time/nscala-time"&gt;was
forked&lt;/a&gt; on GitHub.&lt;br /&gt;
The package changed from &lt;span style="font-family: 'courier new', courier;"&gt;org.scala-tools.time&lt;/span&gt; to &lt;span style="font-family: 'courier new', courier;"&gt;com.github.nscala-time.time&lt;/span&gt;&lt;span style="font-size: 14px;"&gt; &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="http://scalamock.org/"&gt;ScalaMock&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
2.4&lt;/td&gt;
&lt;td&gt;
3.0.1&lt;/td&gt;
&lt;td&gt;
The 3.x series runs natively on Scala 2.10 without proxy factories and the like. Syntax
is a bit odd but works like a charm.&lt;br /&gt;
The ScalaTest integration is compiled against ScalaTest 2.0-M5b, which forced us to
upgrade. 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="http://scalatest.org/"&gt;ScalaTest&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
1.8&lt;/td&gt;
&lt;td&gt;
2.0-M5b 
&lt;/td&gt;
&lt;td&gt;
Minor API changes: &lt;span style="font-family: 'courier new', courier;"&gt;Spec&lt;/span&gt;&lt;span style="font-family: 'courier new', courier;"&gt;→&lt;/span&gt;&lt;span style="font-family: 'courier new', courier;"&gt;FunSpec&lt;/span&gt;,
parameters changed in &lt;span style="font-family: 'courier new', courier;"&gt;Suite.run()&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="http://squeryl.org/"&gt;Squeryl&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
0.9.5-2 
&lt;/td&gt;
&lt;td&gt;
0.9.5-6 
&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="http://software.clapper.org/argot/"&gt;Argot&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
0.4 
&lt;/td&gt;
&lt;td&gt;
1.0.0 
&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://github.com/scala-incubator/scala-io"&gt;Scala I/O&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
0.4.1-seq 
&lt;/td&gt;
&lt;td&gt;
0.4.2 
&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://github.com/lift/framework/tree/master/core/json"&gt;Lift JSON&lt;/a&gt; (+&lt;a href="https://github.com/lift/framework/tree/master/core/json-ext"&gt;ext&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;
2.4 
&lt;/td&gt;
&lt;td&gt;
2.5-M4 
&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://github.com/lift/modules/tree/master/facebook"&gt;Lift Facebook&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
2.4 
&lt;/td&gt;
&lt;td&gt;
2.5-SNAPSHOT 
&lt;/td&gt;
&lt;td&gt;
Had to exclude &lt;span style="font-family: 'courier new', courier;"&gt;net.liftweb:lift-webkit_2.10&lt;/span&gt; to
avoid dependency conflicts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="http://akka.io/"&gt;Akka&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
2.0.4 
&lt;/td&gt;
&lt;td&gt;
2.1 
&lt;/td&gt;
&lt;td&gt;
Scheduling now requires an implicit &lt;span style="font-family: 'courier new', courier;"&gt;ExecutionContext&lt;/span&gt;.
See &lt;a href="http://doc.akka.io/docs/akka/2.1.0/project/migration-guide-2.0.x-2.1.x.html"&gt;migration
guide&lt;/a&gt; for details. 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="http://www.scalatra.org/"&gt;Scalatra&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
2.0.4 
&lt;/td&gt;
&lt;td&gt;
2.0.5-SNAPSHOT 
&lt;/td&gt;
&lt;td&gt;
Official &lt;a href="http://www.scalatra.org/2013/02/06/scalatra2-2-released.html"&gt;2.0.5
is out&lt;/a&gt;, but has not yet shown up on the central repository, so I ended up going
with the (frozen) 2.0.5 snapshot artifacts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="http://www.scalatra.org/"&gt;Scalatra&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;
2.1.1 
&lt;/td&gt;
&lt;td&gt;
2.2.0 
&lt;/td&gt;
&lt;td&gt;
scalatra-akka module &lt;a href="http://notes.implicit.ly/post/42420935465/scalatra-2-2-0"&gt;has
been folded back&lt;/a&gt; into the core artifact as of 2.2.0.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://www.assembla.com/spaces/scala-graph/wiki"&gt;Graph for Scala&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
1.5.1&lt;/td&gt;
&lt;td&gt;
1.6.1 
&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="text-decoration: underline;"&gt;Scala Library Changes&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
The Scala class library itself has a number of changes you ought to be aware of before
migrating to 2.10. The really big change is that Scala actors are deprecated in favor
of Akka. You can still use them by importing the &lt;span style="font-family: 'courier new', courier;"&gt;scala-actors&lt;/span&gt; artifact
from the Scala 2.10 distribution, but it is recommended to migrate fully to the new
actor system as this is also likely to be obsoleted by 2.10.1. The gentle folk at
Typesafe have provided a very comprehensive &lt;a href="http://docs.scala-lang.org/overviews/core/actors-migration-guide.html"&gt;migration
guide&lt;/a&gt; to assist your efforts. 
&lt;/p&gt;
&lt;p&gt;
The less prevasive API changes we ran into include:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;span style="font-family: 'courier new', courier;"&gt;List.elements &lt;/span&gt;is deprecated
in favor of &lt;span style="font-family: 'courier new', courier;"&gt;List.iterator&lt;/span&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;span style="font-family: 'courier new', courier;"&gt;TraversableOnce.toIndexedSeq&lt;/span&gt; no
longer takes a type argument. This was actually quite pervasive in our codebase, causing
plenty of compilation errors, and is easily worked around by removing the type parameter
(which is extraneous to begin with);&lt;/li&gt;
&lt;li&gt;
Scala actors' &lt;span style="font-family: 'courier new', courier;"&gt;Actor.receive&lt;/span&gt; method
is now public (previously protected). This had to be rectified in pretty much all
of our existing actors by removing the &lt;span style="font-family: 'courier new', courier;"&gt;protected&lt;/span&gt; modifer;&lt;/li&gt;
&lt;li&gt;
Occasional subtle API changes requiring minor code fixes. For example, see this &lt;a href="http://stackoverflow.com/questions/9487425/enumeration-and-mapping-with-scala-2-10"&gt;question
on StackOverflow&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;span style="text-decoration: underline;"&gt;Summary&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Opinions differ among members of our team - some predicted that the migration process
will be much more complex whereas personally, given the relatively high level of maturity
I've come to depend on in the 2.9 series, the migration process actually ended up
being significantly harder than I anticipated. Particularly disconcerting were the
occasional compiler failures which took a lot of time to track down. Practically speaking,
though, the whole migration process took less than 3 days (including documentation),
did not involve additional teammates, and all problems were either resolved or worked
around rather quickly. The Typesafe compiler team has been very helpful in analyzing
and resolving the single bona-fide compiler bug we've run into, and the community
as a whole (on Stack Overflow, Google Groups and elsewhere) was also extremely supportive
and helpful.
&lt;/p&gt;
&lt;p&gt;
On the whole, am I happy with the process? So-so. There is nothing here an experienced
Scala developer should have serious trouble with, but it will take a lot more stability
and predictability for Scala to gain mainstream acceptance in the industry, and that
includes a much easier and more robust migration path to upcoming releases (yes, that
includes migrating from 2.10 to 2.11 when it comes along). That being said, Scala
has been a terrific language to work with in the last couple of years, and the new
features in 2.10 (particularly reflection, macros and string interpolation) should
make this an extremely worthwhile upgrade. We still have a lot of regression testing
to do on the new version, and if anything interesting pops up I'll be sure to post
about it separately (or bitch about it on &lt;a href="http://twitter.com/@tomerg"&gt;Twitter&lt;/a&gt;...)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=851a7271-9bda-403c-a72f-8b13ec552271" /&gt;</description>
      <category>Development</category>
      <category>Development/Scala</category>
    </item>
    <item>
      <trackback:ping>http://www.tomergabel.com/Trackback.aspx?guid=63886411-d1b2-42f7-ae3e-833d2026be73</trackback:ping>
      <pingback:server>http://www.tomergabel.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.tomergabel.com/PermaLink,guid,63886411-d1b2-42f7-ae3e-833d2026be73.aspx</pingback:target>
      <dc:creator>Tomer Gabel</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I just spent a few days migrating our codebase from Scala 2.9.2 to <a href="http://www.scala-lang.org/node/27499">Scala
2.10</a>. A quick search found very little in the way of migration guides and studies,
so it seemed appropriate to document my experiences and offer what tips I managed
to collect on the way.
</p>
        <p>
          <span style="text-decoration: underline;">General Observations</span>
        </p>
        <p>
This process should not be undertaken lightly, and its implementation inevitably depends
on your resources and team composition. The group (or person) charged with migrating
the codebase should, at the very least, consist of an experienced Scala developer
not afraid to get his or her hands dirty.
</p>
        <p>
The migration is not an entirely smooth process - there are plenty of (fortunately
fairly minor) breaking changes in the Scala APIs, and since Scala does not yet feature
binary backwards compatibility between major versions (2.9→2.10→2.11...), so expect
some inevitable library upgrades and the potential complexities inherent in any such
update. The specific issues I encountered are documented in their respective sections
below.
</p>
        <p>
Unfortunately there is not much I can offer in the way of preparation; these are the
obvious steps:
</p>
        <ul>
          <li>
            <a href="http://www.scala-lang.org/node/27499">Familiarize yourself</a> with Scala
2.10. Make sure you know what you’re getting in exchange for investing time and effort
on the migration process and early-bird issues;</li>
          <li>
Work in an isolated branch and pull changes from the master branch often;</li>
          <li>
Commit early, commit often. Try to keep your commits small and well-documented, so
you have good revert checkpoints for when things go wrong;</li>
          <li>
Keep the affected code to a minimum. The fewer changes, the easier it will be to isolate
problems down the road.</li>
        </ul>
        <p>
If you’ve read so far and still can’t wait for 2.10.1, I hope the next few sections
will save you some time and pain.
</p>
        <p>
          <span style="text-decoration: underline;">Toolchain</span>
        </p>
        <p>
To start things off I switched the build to use Scala 2.10. Our project runs on Maven
in lieu of SBT (topic for another post), and we use David Bernard’s excellent <a href="http://davidb.github.com/scala-maven-plugin/">scala-maven-plugin</a>,
which deduces the Scala version from the scala-library dependency.
</p>
        <p>
The convention for the Scala version suffix has changed between 2.9 and 2.10: for
example, <tt>argot<em>2.9.2</em></tt><em> is now <tt>argot</tt></em><tt>2.10</tt> -
no revision for the 2.10 series. This rendered the suffix macro we employ useless,
because annoyingly the Scala <em>libraries</em>themselves (e.g. scalap or scala-compiler)
actually use the full version number, so we ended up needing <em>two</em> macros (a
“raw” Scala version and a suffix).
</p>
        <p>
Fortunately, at least as far as Maven is concerned the rest was smooth sailing. I
next turned my attention to IntelliJ IDEA - I wanted to make sure an existing workspace
can be reused with the migrated codebase, otherwise my entire team will have to undergo
the inconvenience of starting from scratch on a clean working copy. Fortunately the
process turned out to be quite painless (on IDEA 12.0.3 with Scala plugin build 0.7.121),
with the following caveats:
</p>
        <ul>
          <li>
Code analysis appears to miss some cases of stricter compilation compared to 2.9.x
(see below);</li>
          <li>
Code analysis occasionally identifies relative import statements as erroneous (e.g. <tt>import
util.Random</tt>);</li>
          <li>
Project FSC settings had to be manually changed to use the 2.10 compiler bundle (it
remained on the default 2.9.2). This proved to be a moot point, because:</li>
          <li>
The much-touted IDEA <a href="http://blog.jetbrains.com/scala/2012/12/28/a-new-way-to-compile/">external
build mode</a> finally works consistently for the first time (and it uses the significantly
better SBT compiler)!</li>
          <li>
On the negative side, IDEA does not seem to handle compiler failures (as opposed to
compilation errors) gracefully, missing a lot of detail in the output. As I ran into
quite a few of these (details below), I ended up doing most of the compilation tests
with Maven directly.</li>
        </ul>
        <p>
Beyond setting up a build job for the new branch, Jenkins posed no issues.<br />
To summarize, from a toolchain standpoint, this was actually a fairly smooth process.
</p>
        <p>
          <span style="text-decoration: underline;">Language/Compiler</span>
        </p>
        <p>
I was surprised and somewhat disheartened to find that, after some initial compilation
attempts, it became evident that I missed <em>every single mark</em> in my code risk
predictions. Where I expected most language-level headaches I encountered none, and
seemingly simple and risk-free code ended up taking most of the time working on this
process.
</p>
        <p>
First off, the Scala 2.10 compiler is <em>much stricter</em> than the earlier 2.9.x
series. It has a few new heuristics that ended up triggering very often on our codebase;
some are simply the result of messy code or design, but most are new best practices
adopted by the compiler team at Typesafe:
</p>
        <ul>
          <li>
            <tt>“warning: This catches all Throwables. If this is really intended, use `case _
: Throwable` to clear this warning.”</tt>
            <br class="kix-line-break" />
We wrap-and-throw or swallow a lot of exceptions, and for brevity’s sake often use
the shorter <tt>catch { case _ =&gt; }</tt>. A catch block is analogous to a partial
function from Throwable, and there are undoubtedly cases where the distinction matters.
We’ll clean these up iteratively by qualifying that we’re only catching Exceptions.<br /><br class="kix-line-break" /></li>
          <li>
            <tt>“non-variable type argument B[T] in type A[B[T]] is unchecked since it is eliminated
by erasure”</tt>
            <br class="kix-line-break" />
The 2.10 compiler is actually quite helpful in warning you when generic code may not
behave as expected. This is just one example of such a warning.<br /><br class="kix-line-break" /></li>
          <li>
            <tt>“error: overloaded method methodName needs result type”</tt>
            <br class="kix-line-break" />
The 2.10 compiler <em>requires</em> you to specify result types on most (all?) types
of method overloading. Not much work here.</li>
          <li>
Case classes can no longer derive from other case classes, which makes a whole lot
of sense if you consider the typesystem; 2.9.x had a whole variety of bugs and edge-cases
relating to case class inheritance and companion objects, including some unwieldy
constructor syntax. 2.10 simply does away with the complexity and potential ambiguity,
which will break existing code. Since such class hierarchies are inherently problematic,
I see this as an opportunity to refactor them properly; <a href="http://www.scala-lang.org/node/112">extractor
objects</a> were often useful for that task.<br /><br class="kix-line-break" /></li>
          <li>
In one case we ran into stricter cyclic dependency analysis on the part of 2.10 -
an object extended a class and passed a member of another object as a constructor
parameter. The second object referenced the first, which compiled fine under 2.9.2
but resulted in a cyclic dependency error with 2.10. As the original design was hard
to understand I refactored the code to be a bit simpler, which resolved the problem
satisfactorily.<br /><br class="kix-line-break" /></li>
          <li>
Manifests are deprecated in favor of TypeTags and the new reflection library built
into 2.10 (certainly one if its most anticipated and celebrated features), but are
still functional. We haven’t migrated to the new APIs yet, and that process will likely
deserve a post all on its own; read this <a href="http://stackoverflow.com/a/12232195/11558">excellent
answer</a> on Stack Overflow for an introduction to TypeTags.<br class="kix-line-break" /></li>
        </ul>
        <p>
Beyond these and the occasional minor syntax change, the 2.10 compiler proved a somewhat
difficult beast to tame:
</p>
        <ul>
          <li>
Ran into crazily-detailed compiler failures that clearly (though long-windedly) indicated
that I need to manually add <tt>scala-reflect</tt> to the classpath;<br /><br class="kix-line-break" /></li>
          <li>
Missing or conflicting dependencies, typically due to mishandling POMs, resulted in
what I ended up dubbing the <em>Spontaneous Compiler Combustion phenomenon</em>: a
cryptic compilation failure, complete with what appears to be an AST dump and full-blown
debug information. Tracking the occasional familiar type name in the compiler log
can be helpful in tracking down the dependency at fault (this was the case in all
but one of the occurrences), but the error itself is completely inscrutable.<br /><br class="kix-line-break" /></li>
          <li>
The one case was, unfortunately, a proper compiler bug logged as <a href="https://issues.scala-lang.org/browse/SI-7091">SI-7109</a>,
which has to do with consuming a package-protected (or -private) trait/class from
another trait/class with the same accessibility. Jason Zaugg of Typesafe (<a href="https://twitter.com/retronym">@retronym</a>)
was extremely helpful in analysing the compiler output and producing a reproduction
case, which I haven’t been able to do on my own. Until a fix is included and released,
I’ve worked around this by temporarily commenting out the problematic qualifiers.<br class="kix-line-break" /><br /></li>
          <li>
            <b>Update (2013-02-12)</b>: Ran into another compiler bug that causes a runtime <tt>ClassFormatError</tt>.
We've managed to identify, reproduce and work around the problem; see <a href="https://issues.scala-lang.org/browse/SI-7120">SI-7120</a> on
the Typesafe JIRA.<br class="kix-line-break" /></li>
        </ul>
        <p>
Lastly, it’s worth noting that the 2.10 compiler is significantly heavier than the
older 2.9.x series: it appears to require 50-100% more permgen space, and compile
times are up x2 on average and <strong>up to x10</strong> on a clean, fresh build.
This seems consistent on both my laptop and the build server, which use different
CPUs and OS. A quick check (<tt>top</tt> and <tt>jstat -gcutil</tt>) showed the compiler
process to be single-threaded and CPU-bound, as it consistently utilizes 100% of a
single core. GC activity was low to the point of negligible, so it appears the new
compiler is actually a step back in terms of compilation throughput. I hope subsequent
2.10.x releases focus primarily on compilation stability and performance.
</p>
        <p>
        </p>
        <p>
That’s it for today; next post <span style="text-decoration: line-through;">will be
up in a day or two</span><a href="http://www.tomergabel.com/Scala210MigrationCaseStudyPartII.aspx">is
up</a> and focuses on the Scala library, dependencies and miscellanea.
</p>
        <img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=63886411-d1b2-42f7-ae3e-833d2026be73" />
      </body>
      <title>Scala 2.10: Migration Case Study - part I</title>
      <guid isPermaLink="false">http://www.tomergabel.com/PermaLink,guid,63886411-d1b2-42f7-ae3e-833d2026be73.aspx</guid>
      <link>http://www.tomergabel.com/Scala210MigrationCaseStudyPartI.aspx</link>
      <pubDate>Mon, 11 Feb 2013 00:57:09 GMT</pubDate>
      <description>&lt;p&gt;
I just spent a few days migrating our codebase from Scala 2.9.2 to &lt;a href="http://www.scala-lang.org/node/27499"&gt;Scala
2.10&lt;/a&gt;. A quick search found very little in the way of migration guides and studies,
so it seemed appropriate to document my experiences and offer what tips I managed
to collect on the way.
&lt;/p&gt;
&lt;p&gt;
&lt;span style="text-decoration: underline;"&gt;General Observations&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
This process should not be undertaken lightly, and its implementation inevitably depends
on your resources and team composition. The group (or person) charged with migrating
the codebase should, at the very least, consist of an experienced Scala developer
not afraid to get his or her hands dirty.
&lt;/p&gt;
&lt;p&gt;
The migration is not an entirely smooth process - there are plenty of (fortunately
fairly minor) breaking changes in the Scala APIs, and since Scala does not yet feature
binary backwards compatibility between major versions (2.9→2.10→2.11...), so expect
some inevitable library upgrades and the potential complexities inherent in any such
update. The specific issues I encountered are documented in their respective sections
below.
&lt;/p&gt;
&lt;p&gt;
Unfortunately there is not much I can offer in the way of preparation; these are the
obvious steps:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.scala-lang.org/node/27499"&gt;Familiarize yourself&lt;/a&gt; with Scala
2.10. Make sure you know what you’re getting in exchange for investing time and effort
on the migration process and early-bird issues;&lt;/li&gt;
&lt;li&gt;
Work in an isolated branch and pull changes from the master branch often;&lt;/li&gt;
&lt;li&gt;
Commit early, commit often. Try to keep your commits small and well-documented, so
you have good revert checkpoints for when things go wrong;&lt;/li&gt;
&lt;li&gt;
Keep the affected code to a minimum. The fewer changes, the easier it will be to isolate
problems down the road.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
If you’ve read so far and still can’t wait for 2.10.1, I hope the next few sections
will save you some time and pain.
&lt;/p&gt;
&lt;p&gt;
&lt;span style="text-decoration: underline;"&gt;Toolchain&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
To start things off I switched the build to use Scala 2.10. Our project runs on Maven
in lieu of SBT (topic for another post), and we use David Bernard’s excellent &lt;a href="http://davidb.github.com/scala-maven-plugin/"&gt;scala-maven-plugin&lt;/a&gt;,
which deduces the Scala version from the scala-library dependency.
&lt;/p&gt;
&lt;p&gt;
The convention for the Scala version suffix has changed between 2.9 and 2.10: for
example, &lt;tt&gt;argot&lt;em&gt;2.9.2&lt;/em&gt;&lt;/tt&gt;&lt;em&gt; is now &lt;tt&gt;argot&lt;/tt&gt;&lt;/em&gt;&lt;tt&gt;2.10&lt;/tt&gt; -
no revision for the 2.10 series. This rendered the suffix macro we employ useless,
because annoyingly the Scala &lt;em&gt;libraries&lt;/em&gt;themselves (e.g. scalap or scala-compiler)
actually use the full version number, so we ended up needing &lt;em&gt;two&lt;/em&gt; macros (a
“raw” Scala version and a suffix).
&lt;/p&gt;
&lt;p&gt;
Fortunately, at least as far as Maven is concerned the rest was smooth sailing. I
next turned my attention to IntelliJ IDEA - I wanted to make sure an existing workspace
can be reused with the migrated codebase, otherwise my entire team will have to undergo
the inconvenience of starting from scratch on a clean working copy. Fortunately the
process turned out to be quite painless (on IDEA 12.0.3 with Scala plugin build 0.7.121),
with the following caveats:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Code analysis appears to miss some cases of stricter compilation compared to 2.9.x
(see below);&lt;/li&gt;
&lt;li&gt;
Code analysis occasionally identifies relative import statements as erroneous (e.g. &lt;tt&gt;import
util.Random&lt;/tt&gt;);&lt;/li&gt;
&lt;li&gt;
Project FSC settings had to be manually changed to use the 2.10 compiler bundle (it
remained on the default 2.9.2). This proved to be a moot point, because:&lt;/li&gt;
&lt;li&gt;
The much-touted IDEA &lt;a href="http://blog.jetbrains.com/scala/2012/12/28/a-new-way-to-compile/"&gt;external
build mode&lt;/a&gt; finally works consistently for the first time (and it uses the significantly
better SBT compiler)!&lt;/li&gt;
&lt;li&gt;
On the negative side, IDEA does not seem to handle compiler failures (as opposed to
compilation errors) gracefully, missing a lot of detail in the output. As I ran into
quite a few of these (details below), I ended up doing most of the compilation tests
with Maven directly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Beyond setting up a build job for the new branch, Jenkins posed no issues.&lt;br /&gt;
To summarize, from a toolchain standpoint, this was actually a fairly smooth process.
&lt;/p&gt;
&lt;p&gt;
&lt;span style="text-decoration: underline;"&gt;Language/Compiler&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
I was surprised and somewhat disheartened to find that, after some initial compilation
attempts, it became evident that I missed &lt;em&gt;every single mark&lt;/em&gt; in my code risk
predictions. Where I expected most language-level headaches I encountered none, and
seemingly simple and risk-free code ended up taking most of the time working on this
process.
&lt;/p&gt;
&lt;p&gt;
First off, the Scala 2.10 compiler is &lt;em&gt;much stricter&lt;/em&gt; than the earlier 2.9.x
series. It has a few new heuristics that ended up triggering very often on our codebase;
some are simply the result of messy code or design, but most are new best practices
adopted by the compiler team at Typesafe:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;tt&gt;“warning: This catches all Throwables. If this is really intended, use `case _
: Throwable` to clear this warning.”&lt;/tt&gt;
&lt;br class="kix-line-break" /&gt;
We wrap-and-throw or swallow a lot of exceptions, and for brevity’s sake often use
the shorter &lt;tt&gt;catch { case _ =&gt; }&lt;/tt&gt;. A catch block is analogous to a partial
function from Throwable, and there are undoubtedly cases where the distinction matters.
We’ll clean these up iteratively by qualifying that we’re only catching Exceptions.&lt;br /&gt;
&lt;br class="kix-line-break" /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;tt&gt;“non-variable type argument B[T] in type A[B[T]] is unchecked since it is eliminated
by erasure”&lt;/tt&gt;
&lt;br class="kix-line-break" /&gt;
The 2.10 compiler is actually quite helpful in warning you when generic code may not
behave as expected. This is just one example of such a warning.&lt;br /&gt;
&lt;br class="kix-line-break" /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;tt&gt;“error: overloaded method methodName needs result type”&lt;/tt&gt;
&lt;br class="kix-line-break" /&gt;
The 2.10 compiler &lt;em&gt;requires&lt;/em&gt; you to specify result types on most (all?) types
of method overloading. Not much work here.&lt;/li&gt;
&lt;li&gt;
Case classes can no longer derive from other case classes, which makes a whole lot
of sense if you consider the typesystem; 2.9.x had a whole variety of bugs and edge-cases
relating to case class inheritance and companion objects, including some unwieldy
constructor syntax. 2.10 simply does away with the complexity and potential ambiguity,
which will break existing code. Since such class hierarchies are inherently problematic,
I see this as an opportunity to refactor them properly; &lt;a href="http://www.scala-lang.org/node/112"&gt;extractor
objects&lt;/a&gt; were often useful for that task.&lt;br /&gt;
&lt;br class="kix-line-break" /&gt;
&lt;/li&gt;
&lt;li&gt;
In one case we ran into stricter cyclic dependency analysis on the part of 2.10 -
an object extended a class and passed a member of another object as a constructor
parameter. The second object referenced the first, which compiled fine under 2.9.2
but resulted in a cyclic dependency error with 2.10. As the original design was hard
to understand I refactored the code to be a bit simpler, which resolved the problem
satisfactorily.&lt;br /&gt;
&lt;br class="kix-line-break" /&gt;
&lt;/li&gt;
&lt;li&gt;
Manifests are deprecated in favor of TypeTags and the new reflection library built
into 2.10 (certainly one if its most anticipated and celebrated features), but are
still functional. We haven’t migrated to the new APIs yet, and that process will likely
deserve a post all on its own; read this &lt;a href="http://stackoverflow.com/a/12232195/11558"&gt;excellent
answer&lt;/a&gt; on Stack Overflow for an introduction to TypeTags.&lt;br class="kix-line-break" /&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Beyond these and the occasional minor syntax change, the 2.10 compiler proved a somewhat
difficult beast to tame:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Ran into crazily-detailed compiler failures that clearly (though long-windedly) indicated
that I need to manually add &lt;tt&gt;scala-reflect&lt;/tt&gt; to the classpath;&lt;br /&gt;
&lt;br class="kix-line-break" /&gt;
&lt;/li&gt;
&lt;li&gt;
Missing or conflicting dependencies, typically due to mishandling POMs, resulted in
what I ended up dubbing the &lt;em&gt;Spontaneous Compiler Combustion phenomenon&lt;/em&gt;: a
cryptic compilation failure, complete with what appears to be an AST dump and full-blown
debug information. Tracking the occasional familiar type name in the compiler log
can be helpful in tracking down the dependency at fault (this was the case in all
but one of the occurrences), but the error itself is completely inscrutable.&lt;br /&gt;
&lt;br class="kix-line-break" /&gt;
&lt;/li&gt;
&lt;li&gt;
The one case was, unfortunately, a proper compiler bug logged as &lt;a href="https://issues.scala-lang.org/browse/SI-7091"&gt;SI-7109&lt;/a&gt;,
which has to do with consuming a package-protected (or -private) trait/class from
another trait/class with the same accessibility. Jason Zaugg of Typesafe (&lt;a href="https://twitter.com/retronym"&gt;@retronym&lt;/a&gt;)
was extremely helpful in analysing the compiler output and producing a reproduction
case, which I haven’t been able to do on my own. Until a fix is included and released,
I’ve worked around this by temporarily commenting out the problematic qualifiers.&lt;br class="kix-line-break" /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Update (2013-02-12)&lt;/b&gt;: Ran into another compiler bug that causes a runtime &lt;tt&gt;ClassFormatError&lt;/tt&gt;.
We've managed to identify, reproduce and work around the problem; see &lt;a href="https://issues.scala-lang.org/browse/SI-7120"&gt;SI-7120&lt;/a&gt; on
the Typesafe JIRA.&lt;br class="kix-line-break" /&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Lastly, it’s worth noting that the 2.10 compiler is significantly heavier than the
older 2.9.x series: it appears to require 50-100% more permgen space, and compile
times are up x2 on average and &lt;strong&gt;up to x10&lt;/strong&gt; on a clean, fresh build.
This seems consistent on both my laptop and the build server, which use different
CPUs and OS. A quick check (&lt;tt&gt;top&lt;/tt&gt; and &lt;tt&gt;jstat -gcutil&lt;/tt&gt;) showed the compiler
process to be single-threaded and CPU-bound, as it consistently utilizes 100% of a
single core. GC activity was low to the point of negligible, so it appears the new
compiler is actually a step back in terms of compilation throughput. I hope subsequent
2.10.x releases focus primarily on compilation stability and performance.
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
That’s it for today; next post &lt;span style="text-decoration: line-through;"&gt;will be
up in a day or two&lt;/span&gt; &lt;a href="http://www.tomergabel.com/Scala210MigrationCaseStudyPartII.aspx"&gt;is
up&lt;/a&gt; and focuses on the Scala library, dependencies and miscellanea.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=63886411-d1b2-42f7-ae3e-833d2026be73" /&gt;</description>
      <category>Development</category>
      <category>Development/Scala</category>
    </item>
    <item>
      <trackback:ping>http://www.tomergabel.com/Trackback.aspx?guid=b8d6056d-cdf8-49a7-ac8c-d4424a965720</trackback:ping>
      <pingback:server>http://www.tomergabel.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.tomergabel.com/PermaLink,guid,b8d6056d-cdf8-49a7-ac8c-d4424a965720.aspx</pingback:target>
      <dc:creator>Tomer Gabel</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This post attempts to summarize and clarify a lecture given at the <a href="https://www.facebook.com/botzia">Botzia</a> (Israeli
Java user group) meeting on May 3rd, 2012. You can view the presentation in its entirety
on SlideShare:
</p>
        <p style="text-align: center;">
          <iframe src="http://www.slideshare.net/slideshow/embed_code/12803578" style="border: 1px solid #CCC; border-width: 1px 1px 0; margin-bottom: 5px;" width="512" height="421" scrolling="no" marginwidth="0" marginheight="0" frameborder="0">
          </iframe>
        </p>
        <div style="margin-bottom: 5px; text-align: center;">
          <strong>
            <a title="Scala in practice" href="http://www.slideshare.net/holograph/scala-in-practice-12803578" target="_blank">Scala
in practice</a>
          </strong> from <strong><a href="http://www.slideshare.net/holograph" target="_blank">Tomer
Gabel</a></strong></div>
        <h3>What is Scala?
</h3>
        <p>
          <a href="http://www.scala-lang.org/">Scala</a> is a modern, statically-typed language
designed to run on the Java platform. It's commonly perceived as an "evolutionary
Java" and with good reason: Scala adds powerful features while significantly reducing
Java's verbosity. It is a highly practical language in that it offers a very straightforward
migration path for developers on existing platforms: Java developers will feel right
at home with Scala, and a .NET developers will not have to give up on a lot of the
advantages C# has over Java.
</p>
        <p>
For organizations with a preexisting codebase Scala offers an excellent balance between
power and feature set, as well as perfect interoperability with existing Java code:
although you certainly don't <em>have </em>to, you can freely use familiar libraries
without a hitch, call into existing code and, for the most part, use your existing
tool-chain with little or no impact.
</p>
        <h3>Why did we pick Scala?
</h3>
        <p>
As mentioned above, Scala offers a very compelling migration path from an existing
Java codebase. When we were setting up the new R&amp;D center at <a href="http://www.newbrandanalytics.com">newBrandAnalytics</a>,
we were already serving paying customers via a complex codebase. A complete rewrite
was out of the question as we had contractual obligations, and we had to keep improving
the existing product in order to maintain the competitive edge; it became very clear
that we needed to maintain the existing codebase and refactor it incrementally.
</p>
        <p>
An additional data point was that our core team members were highly experienced with
Java development and quite comfortable with the platform; we also had a distinct preference
for statically typed languages, which ruled several alternatives (particularly Clojure)
right out. Scala seemed like a great compromise in that it allowed us to maintain
and extend the existing codebase while enjoying advanced language features and improved
veracity at little or no risk to the product itself.
</p>
        <h3>How should I "sell" Scala to my boss?
</h3>
        <p>
          <strong>"Safe" choice with proven track record: </strong>Scala is not an entirely
new language, and has reached a maturity tipping point at 2.8; over the last two years
the language has been gaining significant momentum, and has a number of strong advocates
and success stories, including Twitter, Foursquare, LinkedIn and a <a href="http://www.quora.com/Startups/What-startups-or-tech-companies-are-using-Scala">whole
host of others</a>.
</p>
        <p>
          <strong>Scala as a better Java:</strong> You don't have to go all-in on Scala's advanced
feature set, but can instead think of Scala as an improved Java with type inference,
closures, advanced collection framework, traits and pattern matching; these features
alone will increase your developers' happiness by an order of magnitude, and productivity
will see a corresponding improvement. 
</p>
        <p>
          <strong>Less code ⇒ less bugs</strong>: Scala code is far more concise than corresponding
Java code, an helps the developer focus on the "what" instead of the "how". The resulting
code is usually much shorter, clearer and simpler, which in turn helps lower bug count.
</p>
        <p>
          <strong>Helps hire better engineers:</strong> Great engineers not only love working
with the latest technologies, but also love practical, incremental improvements to
well-respected technologies. Merely saying "we use Scala" will help attract the sort
of seasoned, reliable and professional engineers that you most want to hire.
</p>
        <h3>Where does Scala put you at risk?
</h3>
        <p>
          <strong>Learning curve:</strong> Although Scala largely derives from Java, it's a
whole new language with a lot of features that takes time to master. Don't expect
your developers to be productive from day one; instead, provide opportunities for
experimentation and encourage iterative development (and yes, give your developers
time and mandate to throw away badly written early code and redo their work if necessary).
There is actually a lot of material on Scala and an active and vibrant community;
specifically, your developers can easily find help (and answers) on <a href="http://www.stackoverflow.com">StackOverflow</a>.
</p>
        <p>
          <strong>Rough edges: </strong>Scala is fairly new, and consequently a lot of things
that you take for granted with Java are not as mature or robust with Scala. IDE support
is a moving target: Eclipse and IntelliJ IDEA both have actively developed Scala plugins
and both have occasional issues (spurious error highlighting, lackluster performance,
wonky debuggers). The common build tools support Scala, but don't play as nicely;
for example, only the native build tool (sbt) support incremental compilation. Even
the compiler itself is not entirely bug-free, although these are getting very rare
indeed. Bottom line: expect occasional problems, and be patient while working around
them; even better, <strong>encourage your engineers to participate in the community</strong>,
file bugs and even offer patches where possible.
</p>
        <p>
          <strong>Production characteristics:</strong> While it runs on the JVM, Scala is <em>not</em> Java;
there are subtle differences that you should be aware of when maintaining large-scale
or highly-available software. Scala generates a great deal of synthetic code, which
puts additional pressure on the PermGen space; synthetic stack frames may also exhibit
significantly increased stack usage. Scala also creates a lot of intermediate objects
at runtime, which results in added eden generation churn. You may want to profile
your applications and tune the GC accordingly.
</p>
        <h3>What's the bottom line?
</h3>
        <p>
          <img style="display: block; margin-left: auto; margin-right: auto;" title="codebase-evolution.png" src="http://www.tomergabel.com/content/binary/codebase-evolution.png" alt="Codebase evolution" width="600" height="450" border="0" />
        </p>
        <p>
Scala is fantastic. Our team at newBrandAnalytics is remarkably happier with Scala
despite the occasional hitches, and I doubt any of us will consider going back to
Java given the option. As long as you keep in mind that <em>on the bleeding edge you
may get cut</em>, I definitely recommend taking the plunge, with contractors and die-hard
traditional enterprises the possible exceptions.
</p>
        <img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=b8d6056d-cdf8-49a7-ac8c-d4424a965720" />
      </body>
      <title>Scala In Practice: A Case Study</title>
      <guid isPermaLink="false">http://www.tomergabel.com/PermaLink,guid,b8d6056d-cdf8-49a7-ac8c-d4424a965720.aspx</guid>
      <link>http://www.tomergabel.com/ScalaInPracticeACaseStudy.aspx</link>
      <pubDate>Thu, 02 Aug 2012 07:20:42 GMT</pubDate>
      <description>&lt;p&gt;
This post attempts to summarize and clarify a lecture given at the &lt;a href="https://www.facebook.com/botzia"&gt;Botzia&lt;/a&gt; (Israeli
Java user group) meeting on May 3rd, 2012. You can view the presentation in its entirety
on SlideShare:
&lt;/p&gt;
&lt;p style="text-align: center;"&gt;
&lt;iframe src="http://www.slideshare.net/slideshow/embed_code/12803578" style="border: 1px solid #CCC; border-width: 1px 1px 0; margin-bottom: 5px;" width="512" height="421" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;
&lt;/iframe&gt;
&lt;/p&gt;
&lt;div style="margin-bottom: 5px; text-align: center;"&gt;&lt;strong&gt; &lt;a title="Scala in practice" href="http://www.slideshare.net/holograph/scala-in-practice-12803578" target="_blank"&gt;Scala
in practice&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href="http://www.slideshare.net/holograph" target="_blank"&gt;Tomer
Gabel&lt;/a&gt;&lt;/strong&gt;
&lt;/div&gt;
&lt;h3&gt;What is Scala?
&lt;/h3&gt;
&lt;p&gt;
&lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt; is a modern, statically-typed language
designed to run on the Java platform. It's commonly perceived as an "evolutionary
Java" and with good reason: Scala adds powerful features while significantly reducing
Java's verbosity. It is a highly practical language in that it offers a very straightforward
migration path for developers on existing platforms: Java developers will feel right
at home with Scala, and a .NET developers will not have to give up on a lot of the
advantages C# has over Java.
&lt;/p&gt;
&lt;p&gt;
For organizations with a preexisting codebase Scala offers an excellent balance between
power and feature set, as well as perfect interoperability with existing Java code:
although you certainly don't &lt;em&gt;have &lt;/em&gt;to, you can freely use familiar libraries
without a hitch, call into existing code and, for the most part, use your existing
tool-chain with little or no impact.
&lt;/p&gt;
&lt;h3&gt;Why did we pick Scala?
&lt;/h3&gt;
&lt;p&gt;
As mentioned above, Scala offers a very compelling migration path from an existing
Java codebase. When we were setting up the new R&amp;amp;D center at &lt;a href="http://www.newbrandanalytics.com"&gt;newBrandAnalytics&lt;/a&gt;,
we were already serving paying customers via a complex codebase. A complete rewrite
was out of the question as we had contractual obligations, and we had to keep improving
the existing product in order to maintain the competitive edge; it became very clear
that we needed to maintain the existing codebase and refactor it incrementally.
&lt;/p&gt;
&lt;p&gt;
An additional data point was that our core team members were highly experienced with
Java development and quite comfortable with the platform; we also had a distinct preference
for statically typed languages, which ruled several alternatives (particularly Clojure)
right out. Scala seemed like a great compromise in that it allowed us to maintain
and extend the existing codebase while enjoying advanced language features and improved
veracity at little or no risk to the product itself.
&lt;/p&gt;
&lt;h3&gt;How should I "sell" Scala to my boss?
&lt;/h3&gt;
&lt;p&gt;
&lt;strong&gt;"Safe" choice with proven track record: &lt;/strong&gt;Scala is not an entirely
new language, and has reached a maturity tipping point at 2.8; over the last two years
the language has been gaining significant momentum, and has a number of strong advocates
and success stories, including Twitter, Foursquare, LinkedIn and a &lt;a href="http://www.quora.com/Startups/What-startups-or-tech-companies-are-using-Scala"&gt;whole
host of others&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Scala as a better Java:&lt;/strong&gt; You don't have to go all-in on Scala's advanced
feature set, but can instead think of Scala as an improved Java with type inference,
closures, advanced collection framework, traits and pattern matching; these features
alone will increase your developers' happiness by an order of magnitude, and productivity
will see a corresponding improvement. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Less code ⇒ less bugs&lt;/strong&gt;: Scala code is far more concise than corresponding
Java code, an helps the developer focus on the "what" instead of the "how". The resulting
code is usually much shorter, clearer and simpler, which in turn helps lower bug count.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Helps hire better engineers:&lt;/strong&gt; Great engineers not only love working
with the latest technologies, but also love practical, incremental improvements to
well-respected technologies. Merely saying "we use Scala" will help attract the sort
of seasoned, reliable and professional engineers that you most want to hire.
&lt;/p&gt;
&lt;h3&gt;Where does Scala put you at risk?
&lt;/h3&gt;
&lt;p&gt;
&lt;strong&gt;Learning curve:&lt;/strong&gt; Although Scala largely derives from Java, it's a
whole new language with a lot of features that takes time to master. Don't expect
your developers to be productive from day one; instead, provide opportunities for
experimentation and encourage iterative development (and yes, give your developers
time and mandate to throw away badly written early code and redo their work if necessary).
There is actually a lot of material on Scala and an active and vibrant community;
specifically, your developers can easily find help (and answers) on &lt;a href="http://www.stackoverflow.com"&gt;StackOverflow&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Rough edges: &lt;/strong&gt;Scala is fairly new, and consequently a lot of things
that you take for granted with Java are not as mature or robust with Scala. IDE support
is a moving target: Eclipse and IntelliJ IDEA both have actively developed Scala plugins
and both have occasional issues (spurious error highlighting, lackluster performance,
wonky debuggers). The common build tools support Scala, but don't play as nicely;
for example, only the native build tool (sbt) support incremental compilation. Even
the compiler itself is not entirely bug-free, although these are getting very rare
indeed. Bottom line: expect occasional problems, and be patient while working around
them; even better, &lt;strong&gt;encourage your engineers to participate in the community&lt;/strong&gt;,
file bugs and even offer patches where possible.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Production characteristics:&lt;/strong&gt; While it runs on the JVM, Scala is &lt;em&gt;not&lt;/em&gt; Java;
there are subtle differences that you should be aware of when maintaining large-scale
or highly-available software. Scala generates a great deal of synthetic code, which
puts additional pressure on the PermGen space; synthetic stack frames may also exhibit
significantly increased stack usage. Scala also creates a lot of intermediate objects
at runtime, which results in added eden generation churn. You may want to profile
your applications and tune the GC accordingly.
&lt;/p&gt;
&lt;h3&gt;What's the bottom line?
&lt;/h3&gt;
&lt;p&gt;
&lt;img style="display: block; margin-left: auto; margin-right: auto;" title="codebase-evolution.png" src="http://www.tomergabel.com/content/binary/codebase-evolution.png" alt="Codebase evolution" width="600" height="450" border="0" /&gt;
&lt;/p&gt;
&lt;p&gt;
Scala is fantastic. Our team at newBrandAnalytics is remarkably happier with Scala
despite the occasional hitches, and I doubt any of us will consider going back to
Java given the option. As long as you keep in mind that &lt;em&gt;on the bleeding edge you
may get cut&lt;/em&gt;, I definitely recommend taking the plunge, with contractors and die-hard
traditional enterprises the possible exceptions.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=b8d6056d-cdf8-49a7-ac8c-d4424a965720" /&gt;</description>
      <category>Development</category>
      <category>Development/Java</category>
    </item>
    <item>
      <trackback:ping>http://www.tomergabel.com/Trackback.aspx?guid=cb661546-91ea-401e-aac9-36992c607c2c</trackback:ping>
      <pingback:server>http://www.tomergabel.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.tomergabel.com/PermaLink,guid,cb661546-91ea-401e-aac9-36992c607c2c.aspx</pingback:target>
      <dc:creator>Tomer Gabel</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <h3>New brand what now?
</h3>
        <p>
          <a href="http://www.newbrandanalytics.com/">newBrandAnalytics</a> is a newish startup
(less than 2 years old) which started out with a simple premise: the internet is a
goldmine of customer opinions, to the point where it's impossible to track and respond
to it all with traditional techniques and purely human oversight. We mine the net
for opinions, reviews, ratings and other data; we analyze this data and break it down
into a structured form that can then be aggregated and measured against the customer's
own operational metrics. 
</p>
        <p>
To illustrate, one example of what we do is take the impossibly huge number of "Just
ate at McDonalds in Copenhagen airport, it was horrible! Stale fries, messy bathroom
and facetious service!" tweets (alright, maybe I'm giving Twitter users too much credit
:-)), turn them into what amounts to a scoreboard (cleanliness: -1, freshness: -1,
service: -1), and finally crunch numbers until we can give the customer a dashboard
that says, in plain English, "there's something rotten in the kingdom of Denmark."
Not only that, you can easily drill down and contact the author of the complaint,
pull up historical graphs to see if there's a growing negative trend in service quality
for that area etc. And that's just scratching the surface. 
</p>
        <p>
The company itself is US-based, and is now just past the incubation stage; there's
a steadily growing revenue stream, and now the business is catching up with what was
essentially proof-of-concept technology, originally developed by an outsourcing firm
(which actually did a surprisingly good job). The company has decided to bring engineering
in-house, hired a veteran CTO and is now in the process of setting up its R&amp;D
center in Ceasarea, Israel. 
</p>
        <h3>
          <a name="13220c50cd017819_newBrandAnalyticsSalesPitch-What%27sinitforyou%3F">
          </a>What's
in it for you?
</h3>
        <ul>
          <li>
Join a small, tightly-knit team of extremely smart, experienced engineers who absolutely
love their profession! 
</li>
          <li>
Work with cutting-edge technologies, including Node.js, Scala and Cassandra/Hadoop: 
<ul><li>
We're all in when it comes to DevOps; 
</li><li>
Take your pick on tools. We don't care if you use Windows, Mac or Linux, as long as
you have what you need to be productive. In fact, you get to pick your own machine
spec; 
</li><li>
We're big believers in open-source. Team members often (some regularly) contribute
to open-source projects, and they're pervasive in our technology selection;</li></ul></li>
          <li>
Work at a revenue-generating startup with huge promise; 
</li>
          <li>
Competitive compensation package; 
</li>
          <li>
Terrific working conditions: less traffic, noise and air pollution and much more space
compared with most locations in the Gush-Dan area</li>
        </ul>
        <h3>
          <a name="13220c50cd017819_newBrandAnalyticsSalesPitch-What%27sinitforus%3F">
          </a>What's
in it for us?
</h3>
        <p>
We have several positions to fill. Officially, these are: QA automation engineer,
frontend engineer, senior versatile backend engineer. In practice, we're just looking
for really smart people that can help us get things done faster and better. Proficiency,
or talent and inclination to become proficient, in any of the following areas is a
definite plus: 
</p>
        <ul>
          <li>
Java and associated technologies (Scala experience will impress us further still!); 
</li>
          <li>
DevOps, specifically: monitoring, deployment automation and build automation; 
</li>
          <li>
NLP, machine learning and text analysis; 
</li>
          <li>
Large-scale data crunching (experience with modern NoSQL/big-data solutions, e.g.
Hadoop/Pig, GigaSpaces or Cassandra, is a major plus); 
</li>
          <li>
Testing methodology: we have several major subsystems with separate testing requirements
(data acquisition, NLP and UI automation, to name but a few); 
</li>
          <li>
Client-side and client-facing development (MVC frameworks, JavaScript, CSS, HTML); 
</li>
          <li>
HTTP crawlers and associated domains (bot idioms and challenges, scale and cost concerns).</li>
        </ul>
        <p>
Interested? Send in your resume to <a href="mailto:tomer@newbrandanalytics.com">tomer@newbrandanalytics.com</a> or <a href="http://www.tomergabel.com/HowToContactMe.aspx">contact
me</a>! <img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=cb661546-91ea-401e-aac9-36992c607c2c" /></p>
      </body>
      <title>newBrandAnalytics is hiring!</title>
      <guid isPermaLink="false">http://www.tomergabel.com/PermaLink,guid,cb661546-91ea-401e-aac9-36992c607c2c.aspx</guid>
      <link>http://www.tomergabel.com/newBrandAnalyticsIsHiring.aspx</link>
      <pubDate>Thu, 01 Sep 2011 16:46:00 GMT</pubDate>
      <description>&lt;h3&gt;New brand what now?
&lt;/h3&gt;
&lt;p&gt;
&lt;a href="http://www.newbrandanalytics.com/"&gt;newBrandAnalytics&lt;/a&gt; is a newish startup
(less than 2 years old) which started out with a simple premise: the internet is a
goldmine of customer opinions, to the point where it's impossible to track and respond
to it all with traditional techniques and purely human oversight. We mine the net
for opinions, reviews, ratings and other data; we analyze this data and break it down
into a structured form that can then be aggregated and measured against the customer's
own operational metrics. 
&lt;p&gt;
To illustrate, one example of what we do is take the impossibly huge number of "Just
ate at McDonalds in Copenhagen airport, it was horrible! Stale fries, messy bathroom
and facetious service!" tweets (alright, maybe I'm giving Twitter users too much credit
:-)), turn them into what amounts to a scoreboard (cleanliness: -1, freshness: -1,
service: -1), and finally crunch numbers until we can give the customer a dashboard
that says, in plain English, "there's something rotten in the kingdom of Denmark."
Not only that, you can easily drill down and contact the author of the complaint,
pull up historical graphs to see if there's a growing negative trend in service quality
for that area etc. And that's just scratching the surface. 
&lt;p&gt;
The company itself is US-based, and is now just past the incubation stage; there's
a steadily growing revenue stream, and now the business is catching up with what was
essentially proof-of-concept technology, originally developed by an outsourcing firm
(which actually did a surprisingly good job). The company has decided to bring engineering
in-house, hired a veteran CTO and is now in the process of setting up its R&amp;amp;D
center in Ceasarea, Israel. 
&lt;h3&gt;&lt;a name="13220c50cd017819_newBrandAnalyticsSalesPitch-What%27sinitforyou%3F"&gt;&lt;/a&gt;What's
in it for you?
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
Join a small, tightly-knit team of extremely smart, experienced engineers who absolutely
love their profession! 
&lt;li&gt;
Work with cutting-edge technologies, including Node.js, Scala and Cassandra/Hadoop: 
&lt;ul&gt;
&lt;li&gt;
We're all in when it comes to DevOps; 
&lt;li&gt;
Take your pick on tools. We don't care if you use Windows, Mac or Linux, as long as
you have what you need to be productive. In fact, you get to pick your own machine
spec; 
&lt;li&gt;
We're big believers in open-source. Team members often (some regularly) contribute
to open-source projects, and they're pervasive in our technology selection;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
Work at a revenue-generating startup with huge promise; 
&lt;li&gt;
Competitive compensation package; 
&lt;li&gt;
Terrific working conditions: less traffic, noise and air pollution and much more space
compared with most locations in the Gush-Dan area&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a name="13220c50cd017819_newBrandAnalyticsSalesPitch-What%27sinitforus%3F"&gt;&lt;/a&gt;What's
in it for us?
&lt;/h3&gt;
&lt;p&gt;
We have several positions to fill. Officially, these are: QA automation engineer,
frontend engineer, senior versatile backend engineer. In practice, we're just looking
for really smart people that can help us get things done faster and better. Proficiency,
or talent and inclination to become proficient, in any of the following areas is a
definite plus: 
&lt;ul&gt;
&lt;li&gt;
Java and associated technologies (Scala experience will impress us further still!); 
&lt;li&gt;
DevOps, specifically: monitoring, deployment automation and build automation; 
&lt;li&gt;
NLP, machine learning and text analysis; 
&lt;li&gt;
Large-scale data crunching (experience with modern NoSQL/big-data solutions, e.g.
Hadoop/Pig, GigaSpaces or Cassandra, is a major plus); 
&lt;li&gt;
Testing methodology: we have several major subsystems with separate testing requirements
(data acquisition, NLP and UI automation, to name but a few); 
&lt;li&gt;
Client-side and client-facing development (MVC frameworks, JavaScript, CSS, HTML); 
&lt;li&gt;
HTTP crawlers and associated domains (bot idioms and challenges, scale and cost concerns).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Interested? Send in your resume to &lt;a href="mailto:tomer@newbrandanalytics.com"&gt;tomer@newbrandanalytics.com&lt;/a&gt; or &lt;a href="http://www.tomergabel.com/HowToContactMe.aspx"&gt;contact
me&lt;/a&gt;! &lt;img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=cb661546-91ea-401e-aac9-36992c607c2c" /&gt;</description>
    </item>
    <item>
      <trackback:ping>http://www.tomergabel.com/Trackback.aspx?guid=f002a276-41fa-46c1-bd09-91909352b159</trackback:ping>
      <pingback:server>http://www.tomergabel.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.tomergabel.com/PermaLink,guid,f002a276-41fa-46c1-bd09-91909352b159.aspx</pingback:target>
      <dc:creator>Tomer Gabel</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
With the question of <a href="http://www.tomergabel.com/DevOpsOrganicallyGrownNoPreservatives.aspx">what
DevOps is all about</a> out of the way, let’s consider the challenge of setting up
an effective DevOps team. I’ll try to present this as a series of questions, which
in order hopefully comprise a good overview of the process. I certainly can’t cover
everything in s single post, so let’s start with the basics: 
</p>
        <h5>Do I even need a DevOps team?
</h5>
        <p>
Not necessarily. What you <em>do</em> most certainly need, and probably already have,
is an application engineer <em>role</em>. The formal makeup of such a team derives
from business necessity: one-man ISVs handle all aspects of the application on their
own, including the operational aspects, and are therefore not interesting for the
purpose of this discussion. But even with garage startups that comprise very few people
(as low as three, in practice), someone always ends up taking the DevOps mantle; there’s
always the one guy who ends up taking care of the hosting, deployment and all that
other business because <em>someone has to</em>. As your organization grows, as your
engineering throughput exceeds your operational capacity and the complexity of your
product portfolio increases dramatically, that’s when you need to consider an actual
team. 
</p>
        <h5>How do I split up the work?
</h5>
        <p>
There is no absolute truth here; the answer depends on the size, organizational structure
and corporate culture of your specific organization. Your requirements may be satisfied
by having just one übergeek take care of everything; in other cases (such as multiple
long-term projects, very high system complexity or simply too much work for one person)
you may need to divide the work up into more specific agendas. There are numerous
strategies you can employ, but here’s a few ideas to get you started: 
</p>
        <h6>1. Division by domain
</h6>
        <p>
This is a fairly trivial model: figure out what work gets done, categorize it into
a reasonably small number of domains, and assign them to specific team members according
to their respective skillsets, interests and aspirations. To illustrate, consider
the following domains: capacity planning, monitoring, high availability, infrastructure
(networking, storage) and deployment. Your engineers probably already handle all of
the above. 
</p>
        <p>
While this model has the benefit of generally placing the most qualified personnel
in charge of any particular domain, be careful to have a least a pair of engineers
on each domain so you can scale up when necessary, and to ensure knowledge is retained.
In case of small teams (3-5 people) this means each person is likely to have more
than a single area of responsibility; depending on your team members, the ensuing
overhead (or even personality clash) may have a significant impact on the efficiency
of your team. 
</p>
        <h6>2. Division by feature
</h6>
        <p>
Another fairly simple strategy is to have shared ownership of all the fundamental
tools and processes your team employs, and scale by assigning specific <em>features</em> to
team members. Not everyone on the team has to have the same level of expertise on
every domain, but every team member does need to have a good grasp of all aspects
of your work. The level of expertise of any specific team member becomes an evaluation
criterion when assigning a new feature, project or issue, and has to be weighed alongside
other criteria, such as the need to challenge less-experienced team members, pressing
schedules and the other myriad details that managers have to handle. Ideally, any
feature can be assigned to any team member and executed effectively. 
</p>
        <p>
The primary drawback to this model is efficiency: it is irresponsible to expect the
same level of productivity for a specific task from each team member, which makes
efficiency the direct responsibility of whomever divides up the assignments, usually
the team lead or group manager†. Unfortunately, not all managers are apt at identifying
bottlenecks and shifting responsibility around to optimize for efficiency; whether
this model suits your organization or not depends on your ability to effectively track
your team members’ abilities and provide effective guidance. 
</p>
        <p>
A possibly bigger challenge here is knowledge sharing. As the team grows, so does
the communication overhead and, perhaps more importantly, the opportunity for miscommunication,
necessitating meticulous documentation and proactive knowledge management. The ensuing
overhead can kill productivity if not carefully managed. 
</p>
        <p>
† Small-enough teams may be able to split the work up by consensus, but success depends
on the social composition of the team and is hard to predict. 
</p>
        <h6>3. Divide and conquer
</h6>
        <p>
The problem can also be attacked from a completely different angle. Your team comprises
members with different skills, mindsets and even ambitions; sometimes these do not
mesh together naturally, possibly due to too much overlap or, in other cases, too
little. This can happen for any number of reasons, but let’s assume that this is not
a case of simple ego clash or, as Rands put it, a <a href="http://www.randsinrepose.com/archives/2009/06/21/a_toxic_paradox.html">toxic
asset</a>; your team members are hard workers, they like each other well enough and
want to get things done, but they just can’t agree on the mechanics. It’s time to
divide and conquer. 
</p>
        <p>
There are two ways to go about doing this: the simplest is to split up domain ownership
between the groups. It’s not likely that anyone will be truly satisfied with your
choices (if the division of expertise or interest is natural, there probably wouldn’t
be any significant friction in the first place), but the grumbles will eventually
subside, if only through relief that the constant bickering is over. When the division
of responsibilities is clear, people feel there’s less at stake and are more likely
to concede a draw in an argument (don’t expect capitulation here, these are engineers
after all…). Once the emotional involvement is out of the equation, engineers are
quite rational; if they can’t make a convincing argument and they’re not personally
vested in the result, the argument ends with an amicable “yeah, alright, it’s up to
you.” Unfortunately, turning this to your advantage in the long-term entails a clever
assignment of domains, balanced well enough so that both sides rate their level of
interest above the “meh” threshold. How to do that is entirely up to you. 
</p>
        <p>
The second way is to introduce a new element into the mix. In particular, if the areas
of contention typically resolve around choice of tools, it might be wise to assign
ownership of tool selection to a third party; for instance, friction may ensue over
the choice of monitoring system. You may experience heated arguments about the relative
merits of e.g. <a href="https://webmail.delver.com/owa/redir.aspx?C=9c26a42b605e47fca0753c804c56221d&amp;URL=http%3a%2f%2fwww.nagios.org%2f">Nagios</a> and <a href="https://webmail.delver.com/owa/redir.aspx?C=9c26a42b605e47fca0753c804c56221d&amp;URL=http%3a%2f%2fwww.zabbix.com%2f">Zabbix</a>,
whereas a level-headed analysis would show that a customized system based on <a href="https://webmail.delver.com/owa/redir.aspx?C=9c26a42b605e47fca0753c804c56221d&amp;URL=http%3a%2f%2fgraphite.wikidot.com%2f">Graphite</a> is
your best strategy. Or perhaps the debate is on <a href="https://webmail.delver.com/owa/redir.aspx?C=9c26a42b605e47fca0753c804c56221d&amp;URL=http%3a%2f%2fhttpd.apache.org%2f">httpd</a> vs <a href="https://webmail.delver.com/owa/redir.aspx?C=9c26a42b605e47fca0753c804c56221d&amp;URL=http%3a%2f%2fnginx.org%2fen%2f">nginx</a>;
or any strategic technical decision, really. See what I’m getting at here? At a previous
employer we ended up defining an Infrastructure Architect role, an operations counterpart
to the System Architect role in R&amp;D. These rolls fill very much the same need,
except on opposite ends of the spectrum; whereas the SA might pick <a href="https://webmail.delver.com/owa/redir.aspx?C=9c26a42b605e47fca0753c804c56221d&amp;URL=http%3a%2f%2fhadoop.apache.org%2f">Hadoop</a> and <a href="https://webmail.delver.com/owa/redir.aspx?C=9c26a42b605e47fca0753c804c56221d&amp;URL=http%3a%2f%2flogging.apache.org%2flog4j%2f">log4j</a> for
data storage and logging respectively, the IA will likely pick <a href="https://webmail.delver.com/owa/redir.aspx?C=9c26a42b605e47fca0753c804c56221d&amp;URL=http%3a%2f%2fgraphite.wikidot.com%2f">Graphite</a> and <a href="http://logstash.net/">LogStash</a> to
monitor the cluster and aggregate logs, respectively. Interestingly, the necessary
skillset is also quite similar. Identifying and mentoring likely candidates is a subject
that I’ll likely tackle in a future installment. 
</p>
        <h5>To be continued
</h5>
        <p>
There’s much more to say; this is an entirely new branch of the industry, with few
acknowledged best practices and even fewer well-known truths. The main point here
is that you have to experiment in order to build an effective team, and manage it
efficiently. I’d love to hear actual feedback on what works and what doesn’t, and
likewise I’d be interested in feedback regarding what I should focus on next: which
is more interesting, recruiting techniques and pains, or building an effective interface
with the other groups in the organization? Or perhaps an entirely different domain,
such as knowledge management techniques? Fire away…
</p>
        <img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=f002a276-41fa-46c1-bd09-91909352b159" />
      </body>
      <title>DevOps: Earth and a Sprinkle of Compost</title>
      <guid isPermaLink="false">http://www.tomergabel.com/PermaLink,guid,f002a276-41fa-46c1-bd09-91909352b159.aspx</guid>
      <link>http://www.tomergabel.com/DevOpsEarthAndASprinkleOfCompost.aspx</link>
      <pubDate>Sun, 26 Jun 2011 20:03:45 GMT</pubDate>
      <description>&lt;p&gt;
With the question of &lt;a href="http://www.tomergabel.com/DevOpsOrganicallyGrownNoPreservatives.aspx"&gt;what
DevOps is all about&lt;/a&gt; out of the way, let’s consider the challenge of setting up
an effective DevOps team. I’ll try to present this as a series of questions, which
in order hopefully comprise a good overview of the process. I certainly can’t cover
everything in s single post, so let’s start with the basics: 
&lt;h5&gt;Do I even need a DevOps team?
&lt;/h5&gt;
&lt;p&gt;
Not necessarily. What you &lt;em&gt;do&lt;/em&gt; most certainly need, and probably already have,
is an application engineer &lt;em&gt;role&lt;/em&gt;. The formal makeup of such a team derives
from business necessity: one-man ISVs handle all aspects of the application on their
own, including the operational aspects, and are therefore not interesting for the
purpose of this discussion. But even with garage startups that comprise very few people
(as low as three, in practice), someone always ends up taking the DevOps mantle; there’s
always the one guy who ends up taking care of the hosting, deployment and all that
other business because &lt;em&gt;someone has to&lt;/em&gt;. As your organization grows, as your
engineering throughput exceeds your operational capacity and the complexity of your
product portfolio increases dramatically, that’s when you need to consider an actual
team. 
&lt;h5&gt;How do I split up the work?
&lt;/h5&gt;
&lt;p&gt;
There is no absolute truth here; the answer depends on the size, organizational structure
and corporate culture of your specific organization. Your requirements may be satisfied
by having just one übergeek take care of everything; in other cases (such as multiple
long-term projects, very high system complexity or simply too much work for one person)
you may need to divide the work up into more specific agendas. There are numerous
strategies you can employ, but here’s a few ideas to get you started: 
&lt;h6&gt;1. Division by domain
&lt;/h6&gt;
&lt;p&gt;
This is a fairly trivial model: figure out what work gets done, categorize it into
a reasonably small number of domains, and assign them to specific team members according
to their respective skillsets, interests and aspirations. To illustrate, consider
the following domains: capacity planning, monitoring, high availability, infrastructure
(networking, storage) and deployment. Your engineers probably already handle all of
the above. 
&lt;p&gt;
While this model has the benefit of generally placing the most qualified personnel
in charge of any particular domain, be careful to have a least a pair of engineers
on each domain so you can scale up when necessary, and to ensure knowledge is retained.
In case of small teams (3-5 people) this means each person is likely to have more
than a single area of responsibility; depending on your team members, the ensuing
overhead (or even personality clash) may have a significant impact on the efficiency
of your team. 
&lt;h6&gt;2. Division by feature
&lt;/h6&gt;
&lt;p&gt;
Another fairly simple strategy is to have shared ownership of all the fundamental
tools and processes your team employs, and scale by assigning specific &lt;em&gt;features&lt;/em&gt; to
team members. Not everyone on the team has to have the same level of expertise on
every domain, but every team member does need to have a good grasp of all aspects
of your work. The level of expertise of any specific team member becomes an evaluation
criterion when assigning a new feature, project or issue, and has to be weighed alongside
other criteria, such as the need to challenge less-experienced team members, pressing
schedules and the other myriad details that managers have to handle. Ideally, any
feature can be assigned to any team member and executed effectively. 
&lt;p&gt;
The primary drawback to this model is efficiency: it is irresponsible to expect the
same level of productivity for a specific task from each team member, which makes
efficiency the direct responsibility of whomever divides up the assignments, usually
the team lead or group manager†. Unfortunately, not all managers are apt at identifying
bottlenecks and shifting responsibility around to optimize for efficiency; whether
this model suits your organization or not depends on your ability to effectively track
your team members’ abilities and provide effective guidance. 
&lt;p&gt;
A possibly bigger challenge here is knowledge sharing. As the team grows, so does
the communication overhead and, perhaps more importantly, the opportunity for miscommunication,
necessitating meticulous documentation and proactive knowledge management. The ensuing
overhead can kill productivity if not carefully managed. 
&lt;p&gt;
† Small-enough teams may be able to split the work up by consensus, but success depends
on the social composition of the team and is hard to predict. 
&lt;h6&gt;3. Divide and conquer
&lt;/h6&gt;
&lt;p&gt;
The problem can also be attacked from a completely different angle. Your team comprises
members with different skills, mindsets and even ambitions; sometimes these do not
mesh together naturally, possibly due to too much overlap or, in other cases, too
little. This can happen for any number of reasons, but let’s assume that this is not
a case of simple ego clash or, as Rands put it, a &lt;a href="http://www.randsinrepose.com/archives/2009/06/21/a_toxic_paradox.html"&gt;toxic
asset&lt;/a&gt;; your team members are hard workers, they like each other well enough and
want to get things done, but they just can’t agree on the mechanics. It’s time to
divide and conquer. 
&lt;p&gt;
There are two ways to go about doing this: the simplest is to split up domain ownership
between the groups. It’s not likely that anyone will be truly satisfied with your
choices (if the division of expertise or interest is natural, there probably wouldn’t
be any significant friction in the first place), but the grumbles will eventually
subside, if only through relief that the constant bickering is over. When the division
of responsibilities is clear, people feel there’s less at stake and are more likely
to concede a draw in an argument (don’t expect capitulation here, these are engineers
after all…). Once the emotional involvement is out of the equation, engineers are
quite rational; if they can’t make a convincing argument and they’re not personally
vested in the result, the argument ends with an amicable “yeah, alright, it’s up to
you.” Unfortunately, turning this to your advantage in the long-term entails a clever
assignment of domains, balanced well enough so that both sides rate their level of
interest above the “meh” threshold. How to do that is entirely up to you. 
&lt;p&gt;
The second way is to introduce a new element into the mix. In particular, if the areas
of contention typically resolve around choice of tools, it might be wise to assign
ownership of tool selection to a third party; for instance, friction may ensue over
the choice of monitoring system. You may experience heated arguments about the relative
merits of e.g. &lt;a href="https://webmail.delver.com/owa/redir.aspx?C=9c26a42b605e47fca0753c804c56221d&amp;amp;URL=http%3a%2f%2fwww.nagios.org%2f"&gt;Nagios&lt;/a&gt; and &lt;a href="https://webmail.delver.com/owa/redir.aspx?C=9c26a42b605e47fca0753c804c56221d&amp;amp;URL=http%3a%2f%2fwww.zabbix.com%2f"&gt;Zabbix&lt;/a&gt;,
whereas a level-headed analysis would show that a customized system based on &lt;a href="https://webmail.delver.com/owa/redir.aspx?C=9c26a42b605e47fca0753c804c56221d&amp;amp;URL=http%3a%2f%2fgraphite.wikidot.com%2f"&gt;Graphite&lt;/a&gt; is
your best strategy. Or perhaps the debate is on &lt;a href="https://webmail.delver.com/owa/redir.aspx?C=9c26a42b605e47fca0753c804c56221d&amp;amp;URL=http%3a%2f%2fhttpd.apache.org%2f"&gt;httpd&lt;/a&gt; vs &lt;a href="https://webmail.delver.com/owa/redir.aspx?C=9c26a42b605e47fca0753c804c56221d&amp;amp;URL=http%3a%2f%2fnginx.org%2fen%2f"&gt;nginx&lt;/a&gt;;
or any strategic technical decision, really. See what I’m getting at here? At a previous
employer we ended up defining an Infrastructure Architect role, an operations counterpart
to the System Architect role in R&amp;amp;D. These rolls fill very much the same need,
except on opposite ends of the spectrum; whereas the SA might pick &lt;a href="https://webmail.delver.com/owa/redir.aspx?C=9c26a42b605e47fca0753c804c56221d&amp;amp;URL=http%3a%2f%2fhadoop.apache.org%2f"&gt;Hadoop&lt;/a&gt; and &lt;a href="https://webmail.delver.com/owa/redir.aspx?C=9c26a42b605e47fca0753c804c56221d&amp;amp;URL=http%3a%2f%2flogging.apache.org%2flog4j%2f"&gt;log4j&lt;/a&gt; for
data storage and logging respectively, the IA will likely pick &lt;a href="https://webmail.delver.com/owa/redir.aspx?C=9c26a42b605e47fca0753c804c56221d&amp;amp;URL=http%3a%2f%2fgraphite.wikidot.com%2f"&gt;Graphite&lt;/a&gt; and &lt;a href="http://logstash.net/"&gt;LogStash&lt;/a&gt; to
monitor the cluster and aggregate logs, respectively. Interestingly, the necessary
skillset is also quite similar. Identifying and mentoring likely candidates is a subject
that I’ll likely tackle in a future installment. 
&lt;h5&gt;To be continued
&lt;/h5&gt;
&lt;p&gt;
There’s much more to say; this is an entirely new branch of the industry, with few
acknowledged best practices and even fewer well-known truths. The main point here
is that you have to experiment in order to build an effective team, and manage it
efficiently. I’d love to hear actual feedback on what works and what doesn’t, and
likewise I’d be interested in feedback regarding what I should focus on next: which
is more interesting, recruiting techniques and pains, or building an effective interface
with the other groups in the organization? Or perhaps an entirely different domain,
such as knowledge management techniques? Fire away…
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=f002a276-41fa-46c1-bd09-91909352b159" /&gt;</description>
    </item>
    <item>
      <trackback:ping>http://www.tomergabel.com/Trackback.aspx?guid=8840cc0f-4ce3-4814-a0f0-ecec4f1a312d</trackback:ping>
      <pingback:server>http://www.tomergabel.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.tomergabel.com/PermaLink,guid,8840cc0f-4ce3-4814-a0f0-ecec4f1a312d.aspx</pingback:target>
      <dc:creator>Tomer Gabel</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Sometimes you know it’s time to move on. I’ve been working at Sears (née <a href="http://www.delver.com">Delver</a>)
for just under four years, making this the longest stretch in my career. Even so,
my tenure at Delver has seen several major upheavals, including a name change (we
originally started off as <a href="http://www.tomergabel.com/NewWorkplaceItsOfficial.aspx">Semingo</a>),
product strategy shifts (Delver started out as a people search engine, similar to
what <a href="http://pipl.com">pipl.com</a> are doing today), <a href="http://www.tomergabel.com/DelverLaunches.aspx">launching</a> our
product, failing to survive the market crash and <a href="http://www.tomergabel.com/MovingOn.aspx">shutting
down</a>, being bought outright <a href="http://www.tomergabel.com/LifeIsFullOfSurprises.aspx">by
Sears</a> and a drastic personal shift <a href="http://www.tomergabel.com/SwitchingR%C3%B4les.aspx">from
R&amp;D to operations</a>. 
</p>
        <p>
So yeah, a lot has happened in the last four years: I’ve worked alongside some amazingly
smart people, helped build and take care of systems way more complex than any I had
encountered before, and perhaps even learned to curb my temper a little bit. Delver/Sears
is a great company to work for, but it’s time for me to move on.
</p>
        <p align="center">
          <a href="http://www.newbrandanalytics.com">
            <img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Print" border="0" alt="Print" src="http://www.tomergabel.com/content/binary/Windows-Live-Writer/f38c83d27437_CC98/nba_color_3.png" width="640" height="101" />
          </a>
        </p>
        <p>
As of two weeks ago I’m a software architect working for <a href="http://www.newbrandanalytics.com/">newBrandAnalytics</a>,
a startup company that provides social business intelligence for various industries;
I’ll skip the business spiel as you can go ahead and read about our <a href="http://www.newbrandanalytics.com/products-and_solutions.php">solutions</a> and
existing <a href="http://www.newbrandanalytics.com/customers.php">customers</a>. Suffice
to say that we handle massive amounts of data from various sources (including social
media such as Twitter and Facebook); scaling concerns aside, this also entails bleeding-edge
text analysis and NLP, rapid response to growing (and changing) customer demand and
other wonderful aspects of complex, scalable software systems built to support an
actual business. Exciting times are ahead!
</p>
        <p>
Coincidentally, we’re hiring! Our careers page isn’t up yet, but we’re looking for
top notch engineers, QA engineers and NLP/algorithm specialists for our Israeli R&amp;D
center. I’ll update this post with more concrete details later on, but will leave
you with the following points to consider in the meantime:
</p>
        <ul>
          <li>
nBA is a fresh, privately-funded company with a fast-growing customer base; 
</li>
          <li>
We’re a core group of extremely smart, experienced people who love (and know how!)
to get things done; 
</li>
          <li>
Tackle challenges such as massive data volume, increasing scale and deceptively simple
business requirements which translate to bleeding-edge software; 
</li>
          <li>
The Israeli R&amp;D center is the only in-house engineering center for nBA. Employees
have unprecedented influence on the company, as well as direct communication with
customers. There’s nothing like actual business feedback to motivate and ensure success!</li>
        </ul>
        <p>
If any of this resonates with you, go ahead and send your CV to <a href="mailto:jobs@newbrandanalytics.com">jobs@newbrandanalytics.com</a>,
or contact me directly at <a href="mailto:tomer@tomergabel.com">tomer@tomergabel.com</a>.
</p>
        <img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=8840cc0f-4ce3-4814-a0f0-ecec4f1a312d" />
      </body>
      <title>Back on the Wagon</title>
      <guid isPermaLink="false">http://www.tomergabel.com/PermaLink,guid,8840cc0f-4ce3-4814-a0f0-ecec4f1a312d.aspx</guid>
      <link>http://www.tomergabel.com/BackOnTheWagon.aspx</link>
      <pubDate>Mon, 06 Jun 2011 00:48:54 GMT</pubDate>
      <description>&lt;p&gt;
Sometimes you know it’s time to move on. I’ve been working at Sears (née &lt;a href="http://www.delver.com"&gt;Delver&lt;/a&gt;)
for just under four years, making this the longest stretch in my career. Even so,
my tenure at Delver has seen several major upheavals, including a name change (we
originally started off as &lt;a href="http://www.tomergabel.com/NewWorkplaceItsOfficial.aspx"&gt;Semingo&lt;/a&gt;),
product strategy shifts (Delver started out as a people search engine, similar to
what &lt;a href="http://pipl.com"&gt;pipl.com&lt;/a&gt; are doing today), &lt;a href="http://www.tomergabel.com/DelverLaunches.aspx"&gt;launching&lt;/a&gt; our
product, failing to survive the market crash and &lt;a href="http://www.tomergabel.com/MovingOn.aspx"&gt;shutting
down&lt;/a&gt;, being bought outright &lt;a href="http://www.tomergabel.com/LifeIsFullOfSurprises.aspx"&gt;by
Sears&lt;/a&gt; and a drastic personal shift &lt;a href="http://www.tomergabel.com/SwitchingR%C3%B4les.aspx"&gt;from
R&amp;amp;D to operations&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
So yeah, a lot has happened in the last four years: I’ve worked alongside some amazingly
smart people, helped build and take care of systems way more complex than any I had
encountered before, and perhaps even learned to curb my temper a little bit. Delver/Sears
is a great company to work for, but it’s time for me to move on.
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;a href="http://www.newbrandanalytics.com"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Print" border="0" alt="Print" src="http://www.tomergabel.com/content/binary/Windows-Live-Writer/f38c83d27437_CC98/nba_color_3.png" width="640" height="101"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
As of two weeks ago I’m a software architect working for &lt;a href="http://www.newbrandanalytics.com/"&gt;newBrandAnalytics&lt;/a&gt;,
a startup company that provides social business intelligence for various industries;
I’ll skip the business spiel as you can go ahead and read about our &lt;a href="http://www.newbrandanalytics.com/products-and_solutions.php"&gt;solutions&lt;/a&gt; and
existing &lt;a href="http://www.newbrandanalytics.com/customers.php"&gt;customers&lt;/a&gt;. Suffice
to say that we handle massive amounts of data from various sources (including social
media such as Twitter and Facebook); scaling concerns aside, this also entails bleeding-edge
text analysis and NLP, rapid response to growing (and changing) customer demand and
other wonderful aspects of complex, scalable software systems built to support an
actual business. Exciting times are ahead!
&lt;/p&gt;
&lt;p&gt;
Coincidentally, we’re hiring! Our careers page isn’t up yet, but we’re looking for
top notch engineers, QA engineers and NLP/algorithm specialists for our Israeli R&amp;amp;D
center. I’ll update this post with more concrete details later on, but will leave
you with the following points to consider in the meantime:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
nBA is a fresh, privately-funded company with a fast-growing customer base; 
&lt;li&gt;
We’re a core group of extremely smart, experienced people who love (and know how!)
to get things done; 
&lt;li&gt;
Tackle challenges such as massive data volume, increasing scale and deceptively simple
business requirements which translate to bleeding-edge software; 
&lt;li&gt;
The Israeli R&amp;amp;D center is the only in-house engineering center for nBA. Employees
have unprecedented influence on the company, as well as direct communication with
customers. There’s nothing like actual business feedback to motivate and ensure success!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
If any of this resonates with you, go ahead and send your CV to &lt;a href="mailto:jobs@newbrandanalytics.com"&gt;jobs@newbrandanalytics.com&lt;/a&gt;,
or contact me directly at &lt;a href="mailto:tomer@tomergabel.com"&gt;tomer@tomergabel.com&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=8840cc0f-4ce3-4814-a0f0-ecec4f1a312d" /&gt;</description>
      <category>Personal</category>
    </item>
    <item>
      <trackback:ping>http://www.tomergabel.com/Trackback.aspx?guid=93d13e31-691e-410c-842d-8c1379e8bfdd</trackback:ping>
      <pingback:server>http://www.tomergabel.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.tomergabel.com/PermaLink,guid,93d13e31-691e-410c-842d-8c1379e8bfdd.aspx</pingback:target>
      <dc:creator>Tomer Gabel</dc:creator>
      <title>DevOps: Organically grown, no preservatives</title>
      <guid isPermaLink="false">http://www.tomergabel.com/PermaLink,guid,93d13e31-691e-410c-842d-8c1379e8bfdd.aspx</guid>
      <link>http://www.tomergabel.com/DevOpsOrganicallyGrownNoPreservatives.aspx</link>
      <pubDate>Mon, 11 Oct 2010 17:55:29 GMT</pubDate>
      <description>&lt;p&gt;
(Cross-posted on the &lt;a href="http://blog.delver.com/index.php/2010/10/11/devops-at-delver/"&gt;Delver
Blog&lt;/a&gt;)
&lt;/p&gt;
&lt;p&gt;
A little while ago I posted a job opening for the &lt;a href="http://www.tomergabel.com/SwitchingR%c3%b4les.aspx" target="_blank"&gt;application
engineer&lt;/a&gt; position at Delver, and one of the replies caught my interest: “so it’s
a DevOps position?” A Google search later and I was astounded to find what I tried
to explain has since grown into a &lt;a href="http://en.wikipedia.org/wiki/DevOps" target="_blank"&gt;fully&lt;/a&gt; &lt;a href="http://www.jedi.be/blog/2010/02/12/what-is-this-devops-thing-anyway/" target="_blank"&gt;fledged&lt;/a&gt; &lt;a href="http://www.devopsdays.org/" target="_blank"&gt;industry&lt;/a&gt; &lt;a href="http://agileoperations.net/index.php?/archives/24-Devops.html" target="_blank"&gt;trend&lt;/a&gt;&lt;?xml:namespace prefix = o /&gt;.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
I’ve learned to be mistrustful of such trends; in my experience they tend to inflate
and deflate regularly, and if you try to keep abreast of all the proposed improvements
to the development process you’re going to drown in overhead. Still, a critical percentage
of these trends have a valid rationale driving them: unit testing, concurrency constructs,
event-driven application servers, RESTful interfaces – all of these have very solid
theoretical and/or practical reasoning and have had significant impact on the software
development field. An additional commonality is: each took several years to gain acceptance
in leading R&amp;amp;D teams, and several more to become ingrained methodology. The key
word here is &lt;em&gt;risk management&lt;/em&gt;, which is typically avoided or ignored altogether
by the common developer.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
Don’t get me wrong: I come from a purely R&amp;amp;D background, and have shared that
trait for years. What started me on a different line of thinking was the distinct
pleasure of being woken up, once too often, by some poor NOC operator in the middle
of the night, and getting mad enough to do something about it. Like most R&amp;amp;D personnel
I was largely oblivious to the pains of deployment, availability, scaling, production
troubleshooting and customer support, and had to learn my lessons the hard way. I
believe most R&amp;amp;D people aren’t more minded of the pains inherent in each of these
domains because of the simplest of reasons: they’ve never been challenged to do so.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
This is where “DevOps” comes in.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
An application engineer (app engineer or “devops guy” if you will) has two primary
objectives:&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;ul type="disc"&gt;
&lt;li style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list .5in" class="MsoNormal"&gt;
&lt;span style="mso-fareast-font-family: 'Times New Roman'"&gt;Guide the R&amp;amp;D team in
risk assessment. Having a software-savvy operations team member participating in design
reviews is a huge boon to risk management; a better app engineer will want to participate
in the &lt;em&gt;design process itself,&lt;/em&gt; not necessarily designing the actual feature&lt;sup&gt;†&lt;/sup&gt;,
but even a quick overview of the proposed design is usually enough to provide operational
feedback. This, without fail, results in a better design: clearer error-handling semantics,
better monitoring and configuration facilities, high availability baked into the design,
and induction into the deployment/administration toolchain concurrently with development
efforts. This in turn leads to much better overall estimates and reduced failure rate. 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/li&gt;
&lt;li style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list .5in" class="MsoNormal"&gt;
&lt;span style="mso-fareast-font-family: 'Times New Roman'"&gt;Keep the system up and running!
This entails more than just observing the monitoring system (in my opinion, the less
time you spend that way the less you are likely to have to, ad vitam aut culpam).
The application engineer is in the relatively unique position of being both the &lt;em&gt;consumer&lt;/em&gt; and &lt;em&gt;producer&lt;/em&gt; of
his or her own tools; this is where the wheat is separated from the chaff: a great
app engineer will forever strive to improve and automate every nonfunctional aspect
of the system, diligently working towards that asymptotic 100% uptime&lt;sup&gt;‡&lt;/sup&gt;.
DevOps personnel are &lt;em&gt;the &lt;/em&gt;go-to people for getting systems off the ground;
they’ll sketch the solution out, provide short- and long-term plans for deployment,
monitoring and administration solutions both system-wide and component-specific. They’ll
devise automatic tools to identify problems and anomalies, they’ll work ever-more-specific
endpoints into their monitoring system, and they’ll be happy doing it because contrary
to nearly any other position in the industry &lt;em&gt;their interests and the business’s
inherently converge.&lt;/em&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Both DevOps and management would like nothing more than a clean, orderly universe
in which systems do not fail, no data is ever lost and the system performs optimally
on as little hardware as possible. Management’s business is budget and revenue; app
engineers simply do not want to be woken up in the middle of the night.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
Next up: Growing a DevOps organization, stay tuned!&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;sup&gt;†&lt;/sup&gt; While not mandatory by any means, some design cycles can significantly
benefit from an operational perspective; examples include static content management
for websites; high availability for various system components; and any subsystem with
external dependencies.&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;sup&gt;‡&lt;/sup&gt; A DevOps position is inherently multidisciplinary; for example, R&amp;amp;D
background can significantly assist in troubleshooting. design reviews and in rolling
your own tools. Strong system analysis skills, however, may be even more important,
as they enable the two most important functions of the application engineer: spotting
subtle holes in the design phase, and under-fire troubleshooting (which often requires
the elusive ability to rapidly - but accurately - jump to conclusions).&lt;o:p&gt;&lt;/o:p&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=93d13e31-691e-410c-842d-8c1379e8bfdd" /&gt;</description>
      <category>Development</category>
    </item>
    <item>
      <trackback:ping>http://www.tomergabel.com/Trackback.aspx?guid=7a6c8b16-6220-478d-84ce-4b423d0de0bf</trackback:ping>
      <pingback:server>http://www.tomergabel.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.tomergabel.com/PermaLink,guid,7a6c8b16-6220-478d-84ce-4b423d0de0bf.aspx</pingback:target>
      <dc:creator>Tomer Gabel</dc:creator>
      <title>Switching rôles</title>
      <guid isPermaLink="false">http://www.tomergabel.com/PermaLink,guid,7a6c8b16-6220-478d-84ce-4b423d0de0bf.aspx</guid>
      <link>http://www.tomergabel.com/SwitchingR%c3%b4les.aspx</link>
      <pubDate>Sun, 13 Dec 2009 12:54:30 GMT</pubDate>
      <description>&lt;p&gt;
When a company is acquired by another, some sort of restructuring is inevitable. As &lt;a href="http://www.tomergabel.com/LifeIsFullOfSurprises.aspx"&gt;Delver’s
acquisition&lt;/a&gt; by Sears Holdings became reality, it was also obvious that significant
changes were required to how we operate. The first and most pronounced of these changes
was that our social (or socially-connected, if you’re picky) search engine, the &lt;a href="http://www.readwriteweb.com/archives/delver_reinvents_search.php"&gt;first
product of its kind&lt;/a&gt; – we have enough ego to kick ourselves hard now that &lt;a href="http://mashable.com/2009/10/26/social-search-launch/"&gt;Google’s
version&lt;/a&gt; is out – was scrapped, and the entire team was put to work on a new product
for Sears Holdings. This, of course, meant restructuring the R&amp;D team.
&lt;/p&gt;
&lt;p&gt;
One of our tenants at Delver was that everything is open to interpretation, critique
and improvement. As an R&amp;D team we were always relentlessly self-improving; I believe
my two years at Delver were perhaps the best I have ever experienced professionally.
I’m happy to say that this approach still prevails under Sears Holdings, and we’ve
taken the first few months under the new management for some serious introspection,
trying to learn everything we can from the mistakes we made while still working under
the Delver banner. I believe the organization has improved across the board with these
sessions, resulting in significant improvements to everything from recruiting, HR
and managerial processes to source control, configuration and release management.
But as a developer I felt I was hitting a professional plateau.
&lt;/p&gt;
&lt;p&gt;
As the new product’s specs took shape I was initially meant to take charge of the
search engine implementation, continuing my original position at Delver. After nearly
two years of working on search it became obvious to me that it is a very broad and
nontrivial domain, and that to do a good job I will have to truly specialize in search.
While I knew I did not want to continue working on the search engine, I also knew
that the other developer positions would not satisfy me. While the product was being
specified I kept busy with tasks that were not directly related with the product itself:
setting up an integration testing framework (not trivial with a system comprising
both Java and .NET components, and which integrates a significant number of 3rd party
products), defining various development processes like version and branch guidelines,
and finally implementing a &lt;a href="http://code.google.com/p/ant-intellij-tasks/"&gt;proper
Java build system&lt;/a&gt; that still drives our builds today. The common ground here is
that, for the most part, the greatest enjoyment was derived from doing stuff that’s
“horizontal”, that crosses components and teams and sort of binds the entire development
effort together. With this in mind I approached my bosses at Sears and, after prolonged
discussions, we came up with the title of &lt;a href="http://www.slideshare.net/holograph/application-engineer-introductory-presentation"&gt;&lt;em&gt;Application
Engineer&lt;/em&gt;&lt;/a&gt;:
&lt;/p&gt;
&lt;center&gt;
&lt;div style="text-align: center; width: 425px" id="__ss_2708205"&gt;
&lt;p align="center"&gt;
&lt;object style="margin:0px" width="425" height="355"&gt;
&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=applicationengineer-091213064141-phpapp01&amp;rel=0&amp;stripped_title=application-engineer-introductory-presentation" /&gt;
&lt;param name="allowFullScreen" value="true" /&gt;
&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=applicationengineer-091213064141-phpapp01&amp;rel=0&amp;stripped_title=application-engineer-introductory-presentation" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;
&lt;/object&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/center&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
An application engineer, in Sears parlance at any rate, bridges the gap between R&amp;D
and IT (or rather, the support, deployment and administrative teams). Essentially,
where R&amp;D (and QA) ends, the app engineer’s role begins: the app engineer is directly
responsible for the smooth operation of the production system. This means that the
app engineer must not only be fully versed in the system architecture and inner workings,
but must also be an active participant in defining it. Wherever there is an overlap
between R&amp;D and IT is where you will find the app engineer: front-end server farms,
logging and profiling requirements, log aggregation and reporting, system monitoring
(which suddenly not only includes health, but applicative counters that must be correctly
specified and monitored), deployment and troubleshooting processes etc. Having been
assigned this role for the past few months I’ve reached the conclusion that an app
engineer is a cross between IT-oriented system architect and system administrator,
walking a fine line between a developer and a system adminstrator. I certainly hope
I don’t fall off!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=7a6c8b16-6220-478d-84ce-4b423d0de0bf" /&gt;</description>
      <category>Development</category>
      <category>Personal</category>
    </item>
    <item>
      <trackback:ping>http://www.tomergabel.com/Trackback.aspx?guid=b849579e-4637-4051-ba21-f87975905ca0</trackback:ping>
      <pingback:server>http://www.tomergabel.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.tomergabel.com/PermaLink,guid,b849579e-4637-4051-ba21-f87975905ca0.aspx</pingback:target>
      <dc:creator>Tomer Gabel</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>Download </em>
          <a href="http://ant-intellij-tasks.googlecode.com/files/ant-intellij-tasks-1.0-b1.zip">
            <em>ant-intellij-tasks-1.0-b1.zip</em>
          </a>
          <em>
          </em>
        </p>
        <p>
A great but oft-ignored feature of Visual Studio 2005 and up is the inherent consolidation
of an important developer tool: the build system. With a Visual Studio solution you
can simply run MSBuild and you get accurate, automated builds. This is an invaluable
capability: continuous integration is ridiculously easy to set up, as are nightly
builds and automated deployment tools.
</p>
        <p>
Since I started working for Delver (<a href="http://www.tomergabel.com/LifeIsFullOfSurprises.aspx">now
Sears</a>) I’ve been switching back and forth between C# (2.0 and later 3.0) and Java
1.6, and though the ecosystems share many similarities there are also several glaring
differences. The first of these differences is that, in the Java world, it is perfectly
acceptable – even traditional – to maintain a dual project structure, one using the
IDE (usually Eclipse or IntelliJ IDEA) and one using one of the build tools (commonly
Ant or Maven). The build scripts need to be continuously synchronized with the project
structure, and output parity between the two separate build systems is almost unheard-of.
</p>
        <p>
Because I had been a complete Java newbie when I started, I had never had the time
to really sit down and set up a continuous integration server for our Java codebase,
a mistake I did not intent to repeat when Sears took over. The first item on my agenda
was to do away with the dual project structure; we originally used Eclipse, so I built
a custom Ant script (my first, actually) around <a href="http://ant4eclipse.sourceforge.net/">ant4eclipse</a> and
managed to come up with a semi-satisfactory solution. This also gave us invaluable
insight when it was time to revisit our IDE choice; the lackluster project structure
offered by Eclipse, along with firm positive comments on IntelliJ IDEA from several
team members, tipped the balance and led us to switch to the alternative IDE, while
also creating the necessity for a revamped build system can that work on top of the
IntelliJ IDEA project structure.
</p>
        <p>
Out of necessity, a project was born. <a href="http://code.google.com/p/ant-intellij-tasks/">ant-intellij-tasks</a> is
the result of several months of all-night itch-scratching on my part. While not directly
affiliated with the company, we’ve been dogfooding the project at Sears for over a
month now, and while there are certainly rough edges it finally seems stable enough
for release! From the project website:
</p>
        <blockquote style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; background: #ccc; padding-top: 5px">
          <p>
            <a href="http://code.google.com/p/ant-intellij-tasks">ant-intellij-tasks</a> is a
self-contained build system for IntelliJ IDEA projects based around <a href="http://ant.apache.org/">Apache
Ant</a>. In essence, ant-intellij-tasks comprises three components: 
</p>
          <ol>
            <li>
An Ant task library that can extract and resolve the IntelliJ IDEA project and module
files (.ipr and .iml respectively), and provides a set of tasks and conditions around
the project structure; 
</li>
            <li>
A common build script which provides the four major build targets for modules: clean,
build, test and package (see <a href="http://code.google.com/p/ant-intellij-tasks/#Quickstart_Guide">the
quickstart guide</a>); 
</li>
            <li>
A master build script which extends these targets to the entire project. 
</li>
          </ol>
          <p>
The build system is designed to be extensible (e.g. by adding targets), customizable
(e.g. by overriding a target's behavior for a specific module) and self contained
in that it's a drop-in solution that should not require any significant modifications
to the code base. 
</p>
          <p>
          </p>
          <p>
This project is fully open source (distributed under an Apache license) and hosted
at Google Code. Please report any bugs or issues on the project <a href="http://code.google.com/p/ant-intellij-tasks/issues/list">issue
tracker</a>. 
</p>
          <p>
          </p>
          <p>
ant-intellij-tasks makes use of, and redistributes, the <a href="http://ant-contrib.sourceforge.net/">ant-contrib</a> task
library. 
</p>
        </blockquote>
        <img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=b849579e-4637-4051-ba21-f87975905ca0" />
      </body>
      <title>Announcing ant-intellij-tasks</title>
      <guid isPermaLink="false">http://www.tomergabel.com/PermaLink,guid,b849579e-4637-4051-ba21-f87975905ca0.aspx</guid>
      <link>http://www.tomergabel.com/AnnouncingAntintellijtasks.aspx</link>
      <pubDate>Wed, 30 Sep 2009 06:18:58 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;Download &lt;/em&gt;&lt;a href="http://ant-intellij-tasks.googlecode.com/files/ant-intellij-tasks-1.0-b1.zip"&gt;&lt;em&gt;ant-intellij-tasks-1.0-b1.zip&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
A great but oft-ignored feature of Visual Studio 2005 and up is the inherent consolidation
of an important developer tool: the build system. With a Visual Studio solution you
can simply run MSBuild and you get accurate, automated builds. This is an invaluable
capability: continuous integration is ridiculously easy to set up, as are nightly
builds and automated deployment tools.
&lt;/p&gt;
&lt;p&gt;
Since I started working for Delver (&lt;a href="http://www.tomergabel.com/LifeIsFullOfSurprises.aspx"&gt;now
Sears&lt;/a&gt;) I’ve been switching back and forth between C# (2.0 and later 3.0) and Java
1.6, and though the ecosystems share many similarities there are also several glaring
differences. The first of these differences is that, in the Java world, it is perfectly
acceptable – even traditional – to maintain a dual project structure, one using the
IDE (usually Eclipse or IntelliJ IDEA) and one using one of the build tools (commonly
Ant or Maven). The build scripts need to be continuously synchronized with the project
structure, and output parity between the two separate build systems is almost unheard-of.
&lt;/p&gt;
&lt;p&gt;
Because I had been a complete Java newbie when I started, I had never had the time
to really sit down and set up a continuous integration server for our Java codebase,
a mistake I did not intent to repeat when Sears took over. The first item on my agenda
was to do away with the dual project structure; we originally used Eclipse, so I built
a custom Ant script (my first, actually) around &lt;a href="http://ant4eclipse.sourceforge.net/"&gt;ant4eclipse&lt;/a&gt; and
managed to come up with a semi-satisfactory solution. This also gave us invaluable
insight when it was time to revisit our IDE choice; the lackluster project structure
offered by Eclipse, along with firm positive comments on IntelliJ IDEA from several
team members, tipped the balance and led us to switch to the alternative IDE, while
also creating the necessity for a revamped build system can that work on top of the
IntelliJ IDEA project structure.
&lt;/p&gt;
&lt;p&gt;
Out of necessity, a project was born. &lt;a href="http://code.google.com/p/ant-intellij-tasks/"&gt;ant-intellij-tasks&lt;/a&gt; is
the result of several months of all-night itch-scratching on my part. While not directly
affiliated with the company, we’ve been dogfooding the project at Sears for over a
month now, and while there are certainly rough edges it finally seems stable enough
for release! From the project website:
&lt;/p&gt;
&lt;blockquote style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; background: #ccc; padding-top: 5px"&gt; 
&lt;p&gt;
&lt;a href="http://code.google.com/p/ant-intellij-tasks"&gt;ant-intellij-tasks&lt;/a&gt; is a
self-contained build system for IntelliJ IDEA projects based around &gt;&lt;a href="http://ant.apache.org/"&gt;Apache
Ant&lt;/a&gt;. In essence, ant-intellij-tasks comprises three components: 
&lt;ol&gt;
&lt;li&gt;
An Ant task library that can extract and resolve the IntelliJ IDEA project and module
files (.ipr and .iml respectively), and provides a set of tasks and conditions around
the project structure; 
&lt;li&gt;
A common build script which provides the four major build targets for modules: clean,
build, test and package (see &lt;a href="http://code.google.com/p/ant-intellij-tasks/#Quickstart_Guide"&gt;the
quickstart guide&lt;/a&gt;); 
&lt;li&gt;
A master build script which extends these targets to the entire project. 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
The build system is designed to be extensible (e.g. by adding targets), customizable
(e.g. by overriding a target's behavior for a specific module) and self contained
in that it's a drop-in solution that should not require any significant modifications
to the code base. 
&lt;p&gt;
&lt;p&gt;
This project is fully open source (distributed under an Apache license) and hosted
at Google Code. Please report any bugs or issues on the project &lt;a href="http://code.google.com/p/ant-intellij-tasks/issues/list"&gt;issue
tracker&lt;/a&gt;. 
&lt;p&gt;
&lt;p&gt;
ant-intellij-tasks makes use of, and redistributes, the &lt;a href="http://ant-contrib.sourceforge.net/"&gt;ant-contrib&lt;/a&gt; task
library. 
&lt;/p&gt;
&lt;/blockquote&gt;&lt;img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=b849579e-4637-4051-ba21-f87975905ca0" /&gt;</description>
      <category>Development</category>
      <category>Development/Java</category>
      <category>Software</category>
      <category>ant-intellij-tasks</category>
    </item>
    <item>
      <trackback:ping>http://www.tomergabel.com/Trackback.aspx?guid=1e994572-66a8-4403-b947-f654b08fa361</trackback:ping>
      <pingback:server>http://www.tomergabel.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.tomergabel.com/PermaLink,guid,1e994572-66a8-4403-b947-f654b08fa361.aspx</pingback:target>
      <dc:creator>Tomer Gabel</dc:creator>
      <title>Headphones and the arcane art of sound, pt. 2</title>
      <guid isPermaLink="false">http://www.tomergabel.com/PermaLink,guid,1e994572-66a8-4403-b947-f654b08fa361.aspx</guid>
      <link>http://www.tomergabel.com/HeadphonesAndTheArcaneArtOfSoundPt2.aspx</link>
      <pubDate>Wed, 26 Aug 2009 01:34:40 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Headphonesandthearcaneartofsoundpt.2_12061/vdac_2.jpg"&gt;&lt;img style="border-right-width: 0px; margin: 0px 0px 15px 15px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Musical Fidelity V-DAC" border="0" alt="Musical Fidelity V-DAC" align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Headphonesandthearcaneartofsoundpt.2_12061/vdac_thumb.jpg" width="242" height="244"&gt;&lt;/a&gt; In
the &lt;a href="http://www.tomergabel.com/HeadphonesAndTheArcaneArtOfSound.aspx"&gt;previous
installment&lt;/a&gt; I have first experimented with rolling the tubes in my headphone amp,
and first introduced an external DAC into one of my audio setups. Replacing the Electro
Harmonix 6922EH tubes with a pair of matched JAN-Sylavnia 7308 tubes bought me a significant
improvement in soundstage and resolution, and adding a &lt;a href="http://www.musicalfidelity.com/products/vseries/vdac.html"&gt;Musical
Fidelity V-DAC&lt;/a&gt; into the mix resulted in even better resolution at the expense
of reduced imaging:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;span style="font-size: large"&gt;&lt;strong&gt;“&lt;/strong&gt;&lt;/span&gt;… the V-DAC features significantly
improved accuracy and resolution, and more and more often I’ve been rewinding tracks
just to make sure that, yes, I wasn’t imagining, I really have never heard this or
that detail before… In fact, the only disadvantage is in a certain change in the soundstage,
as though the stereo separation grew just a littler wider than I’d like. Don’t get
me wrong, the soundstage is huge and imaging is terrific, but it sometimes seems to
be that sounds tend to cluster a little closer to the extremes of the soundstage than
they should.”
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
When that upgrade was concluded I was left with an unfulfilled sense of curiosity.
The first tube upgrade was a huge success, and the new DAC added the detail I was
missing with the original setup, but I was not entirely happy with the difference
in soundstage. Along with the 7308 tubes I bought a pair of Mullard E88CC; from what
I’ve read on the tube I predicted that it would improve the soundstage, a theory which
immediately I put to the test.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Headphonesandthearcaneartofsoundpt.2_12061/IMG_1929.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 15px 15px 15px 0px; display: inline; border-top: 0px; border-right: 0px" title="IMG_1929" border="0" alt="IMG_1929" align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Headphonesandthearcaneartofsoundpt.2_12061/IMG_1929_thumb.jpg" width="324" height="244"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.entertonement.com/clips/kjmmznwltl--Great-Success"&gt;Great success&lt;/a&gt;!
The 7308 tubes were such a huge step up, I did not expect to be so well-rewarded the
second time around. The soundstage not only “deflated” to more natural-sounding positioning,
but it also deepened (i.e. became more three-dimensional). Instrument articulation
has improved dramatically: buzzing of metallic strings can be heard distinctly on
decent recordings, bass has deepened remarkably and the sense of air around instruments
can be absolutely mind-boggling. Even the noise floor dropped a few decibels. The
improvement was so pronounced I now have a renewed desire to test additional tube
amps, such as the Little Dot Mk IV SE or DarkVoice 336 SE. I’ll certainly post my
experiences if I manage to get my hands on one of these…
&lt;/p&gt;
&lt;p&gt;
Finally content with my primary setup (which I primarily use at work), I have turned
my attention to the secondary setup at home. At that point the setup consisted of
an onboard ALC889A codec, connected to an Aqua Mini-Head via a generic analog interconnect,
this in turn connected to ‘03 Beyerdynamic DT880 cans. In my previous post I had failed
to mention that I did test the ‘05 edition DT880s with the 7308 tubes and found the
new edition to be a downgrade: slightly better midbass marred by a muddy soundstage,
flat treble (without the sense of “air” I’ve begun to associate with tube-based amplification)
and a generally degraded experience than with the older edition. At that point I had
almost put my original setup up for sale in its entirety, but decided to hold on to
it for a few more experiments before I let it go. I took the opportunity to test those
cans with the upgraded Mullard tubes, but am sad to report that no new synergy is
to be found in that direction, and throwing the V-DAC into the mix did not result
in any improvement either.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Headphonesandthearcaneartofsoundpt.2_12061/IMG_1930.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 15px 0px 15px 15px; display: inline; border-top: 0px; border-right: 0px" title="Zhaolu D2.5 DAC" border="0" alt="Zhaolu D2.5 DAC" align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Headphonesandthearcaneartofsoundpt.2_12061/IMG_1930_thumb.jpg" width="324" height="244"&gt;&lt;/a&gt;As
it happens, an opportunity presented itself to buy an upgraded &lt;a href="http://diykits.com.hk/Zhaolu%20D2.5.htm"&gt;Zhaolu
D2.5 DAC&lt;/a&gt; for a very good price, and after arranging to loan it for a few days
I’ve had the chance to try out some interesting new combinations. The Zhaolu (apparently
pronounced chow-loo) D2.5 is a modular DAC that, at a cost of $215, is widely considered
as one of the finest and most customizable value-priced DACs on the market. There
are a lot of aftermarket upgrades available for the device, and it’s offered with
a headphone amplifier module for an extra $55. The device is based off of a CS4398
chip, and my particular unit comes with upgraded &lt;a href="http://www.national.com/pf/LM/LM4562.html"&gt;National
LM4562&lt;/a&gt; opamps. The unit is extremely large (24cm x 30cm x 5.5cm – about the same
surface area as the G&amp;W amp!) and surprisingly heavy. Build quality is fairly mediocre:
the markings on the front tend to easily wear off and the volume control produces
an audible distortion when adjusted. From a usability perspective the unit is decent
but does have a couple of minor annoyances, specifically the need to select the optical
channel every time I turn it on and an annoying blinking “mute” indicator when there
is no active signal from the computer.
&lt;/p&gt;
&lt;p&gt;
The D2.5 has only S/PDIF and TOSLINK inputs, and I did not experiment with the V-DAC’s
optical input to draw a comparison, so this is not a direct apples to apples comparison;
that said, I connected the D2.5 to my desktop via TOSLINK, connected it via the preamp
output to the G&amp;W amp and started with the ‘03 edition Beyerdynamic DT880 headphones.
&lt;/p&gt;
&lt;p&gt;
The initial impression was severely disappointing: while the resolution was incredible,
the sound had lost all warmth and the soundstage had lost all depth. Just to put things
in perspective: this sounded &lt;em&gt;significantly&lt;/em&gt; worse than with a straight analogue
connection from my computer at work. I figured that since the integrated headphone
amp in the D2.5 was designed along with the DAC the combination would probably work
better; unfortunately, this resulted in an even flatter soundstage, and imaging suffered
as well. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Headphonesandthearcaneartofsoundpt.2_12061/IMG_1919.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 15px 15px 15px 0px; display: inline; border-top: 0px; border-right: 0px" title="The entire setup: G&amp;W T-2.6F with Mullard E88CC tubes on top of the upgraded Zhaolu D2.5 amp, next to a Musical Fidelity V-DAC" border="0" alt="The entire setup: G&amp;W T-2.6F with Mullard E88CC tubes on top of the upgraded Zhaolu D2.5 amp, next to a Musical Fidelity V-DAC" align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Headphonesandthearcaneartofsoundpt.2_12061/IMG_1919_thumb.jpg" width="324" height="244"&gt;&lt;/a&gt;At
this point I had almost given up on the DAC, but decided to switch back to the G&amp;W
amp and try out the ‘05 edition DT880s. This resulted in a markedly improved sound
in comparison with the V-DAC and analogue connection; the sound gained some warmth,
the soundstage expanded significantly and imaging improved as well. This is still
a far cry from the ‘03 edition DT880 and V-DAC combination, but I could see how the
Zhaolu DAC would benefit the cans if it was paired with the right amp.
&lt;/p&gt;
&lt;p&gt;
While a definite improvement over the previous anemic combination, the results were
still not satisfying. I briefly tried running the D2.5 and V-DAC through the Aqua
amp but was not overly impressed; either the Mini-Head is not a good match for the
DT880s (it was supposedly designed around the Sennheiser HD600) or it simply isn’t
a very good amp. As an aside, in both cases the ‘03 edition sounded better to my ears
than the ‘05.
&lt;/p&gt;
&lt;p&gt;
Having tried nearly every combination of equipment at my disposal I nearly gave up
at this point, but for the sake of completeness decided to try out the D2.5 and its
integrated headphone amp with the ‘05 DT880s. To my surprise, this combination is
a winner: amazingly revealing, detailed sound combined with robust imaging and a wide
(albeit not as deep as I’d like) soundstage. While not as musical as my primary system
(G&amp;W amp, Mullard tubes, V-DAC), the Zhaolu D2.5 provides better resolution and an
experience that’s nearly as engaging as that combination for less than a fourth of
the cost. Value for the money indeed! If you can find one of these units, I definitely
suggest giving it a try; just make sure to test it first as it’s apparently quite
finicky with regards to its partners. For my part, the Zhaolu D2.5 has permanently
replaced the Aqua Mini-Head amp in my home setup; this, in turn, went to my brother
who is quite pleased with it driving ‘03 DT880s via a Creative X-Fi sound card.
&lt;/p&gt;
&lt;p&gt;
Visit my &lt;a href="http://www.flickr.com/photos/tomergabel/sets/72157622145150024/" rel="me"&gt;Flickr
account&lt;/a&gt; for more photos
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=1e994572-66a8-4403-b947-f654b08fa361" /&gt;</description>
      <category>Music</category>
      <category>Personal</category>
    </item>
    <item>
      <trackback:ping>http://www.tomergabel.com/Trackback.aspx?guid=6a6c2dc7-df2a-4bec-8a2b-0e7d1e652d3f</trackback:ping>
      <pingback:server>http://www.tomergabel.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.tomergabel.com/PermaLink,guid,6a6c2dc7-df2a-4bec-8a2b-0e7d1e652d3f.aspx</pingback:target>
      <dc:creator>Tomer Gabel</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Apparently Java has quite a few known but practically undocumented issues with its
handling of UNC paths under Windows. I’ve specifically encountered <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5086147">this
bug</a> albeit in a slightly different scenario:
</p>
        <div>
          <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">@Test<br /><span style="color: #0000ff">public</span><span style="color: #0000ff">void</span> test() <span style="color: #0000ff">throws</span> URISyntaxException
{<br /><span style="color: #0000ff">final</span> URI uri = <span style="color: #0000ff">new</span> URI( <span style="color: #006080">"file://c:/temp/test/ham.and.eggs"</span> );<br /><span style="color: #0000ff">new</span> File( uri ); <span style="color: #008000">//
IllegalArgumentException thrown here</span><br />
}</pre>
        </div>
        <div>
          <br />
Apparently the two slashes after file: are misinterpreted as the authority part of
the URI; <a href="http://stackoverflow.com/questions/1131273/java-file-touri-tourl-on-windows-file/1131465#1131465">this
thread</a> on StackOverflow may give a few starting points if want to delve deeper.
It seems Java implements an older RFC for URIs which has slightly different tokenization
rules.
</div>
        <div> 
</div>
        <div>At any rate, so far the only sensible solution I’ve managed to come with is to
manually remove or add (depending on your tastes…) a slash:
</div>
        <div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
          <pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">
            <p>
              <span style="color: #008000">/**</span>
              <br />
              <span style="color: #008000"> * Resolves the specified URI, and returns the file </span>
              <br />
              <span style="color: #008000"> * represented by the URI.</span>
              <br />
              <span style="color: #008000"> *</span>
              <br />
              <span style="color: #008000"> * @param uri The URI for which to return an absolute
path.</span>
              <br />
              <span style="color: #008000"> * @return The {@link File} instance represented by the</span>
              <br />
              <span style="color: #008000"> * specified URI.</span>
              <br />
              <span style="color: #008000"> * @throws IllegalArgumentException &lt;ul&gt;&lt;li&gt;The
URI cannot </span>
              <br />
              <span style="color: #008000"> * be null.&lt;/li&gt;&lt;li&gt;Wrong URI scheme for
path resolution;</span>
              <br />
              <span style="color: #008000"> * only file:// URIs are supported.&lt;/li&gt;&lt;/ul&gt;</span>
              <br />
              <span style="color: #008000"> */</span>
              <br />
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">static</span> File
getFile( URI uri )<br /><span style="color: #0000ff">throws</span> IllegalArgumentException {<br /><span style="color: #0000ff">if</span> ( uri == null )<br /><span style="color: #0000ff">throw</span><span style="color: #0000ff">new</span> IllegalArgumentException(<br /><span style="color: #006080">"The URI cannot be null."</span> );
</p>
            <p>
              <br />
              <br />
              <span style="color: #0000ff">if</span> ( !<span style="color: #006080">"file"</span>.equals(
uri.getScheme() ) )<br /><span style="color: #0000ff">throw</span><span style="color: #0000ff">new</span> IllegalArgumentException( <span style="color: #006080">"Wrong
URI "</span> + 
<br /><span style="color: #006080">"scheme for path resolution, expected \"file\" "</span> +<br /><span style="color: #006080">"and got \""</span> + uri.getScheme() + <span style="color: #006080">"\""</span> );
</p>
            <p>
              <br />
              <span style="color: #008000">// Workaround for the following bug: </span>
              <br />
              <span style="color: #008000">// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5086147</span>
              <br />
              <span style="color: #008000">// Remove extra slashes after the scheme part.</span>
              <br />
              <span style="color: #0000ff">if</span> ( uri.getAuthority() != null )<br /><span style="color: #0000ff">try</span> {<br />
uri = <span style="color: #0000ff">new</span> URI( uri.toString().replace( 
<br /><span style="color: #006080">"file://"</span>, <span style="color: #006080">"file:/"</span> )
);<br />
} <span style="color: #0000ff">catch</span> ( URISyntaxException e ) {<br /><span style="color: #0000ff">throw</span><span style="color: #0000ff">new</span> IllegalArgumentException( <span style="color: #006080">"The
specified "</span> +<br /><span style="color: #006080">"URI contains an authority, but could not be "</span> +<br /><span style="color: #006080">"normalized."</span>, e );<br />
}
</p>
            <p>
              <br />
              <br />
              <span style="color: #0000ff">return</span>
              <span style="color: #0000ff">new</span> File(
uri );<br />
}<br /></p>
          </pre>
          <br />
        </div>
        <div> 
</div>
        <div>This is definitely a workaround, but according to newsgroup and forum posts these
bugs have been around forever. If anyone has a more elegant solution I’d love to know.
</div>
        <img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=6a6c2dc7-df2a-4bec-8a2b-0e7d1e652d3f" />
      </body>
      <title>Java mishandles UNC paths on Windows</title>
      <guid isPermaLink="false">http://www.tomergabel.com/PermaLink,guid,6a6c2dc7-df2a-4bec-8a2b-0e7d1e652d3f.aspx</guid>
      <link>http://www.tomergabel.com/JavaMishandlesUNCPathsOnWindows.aspx</link>
      <pubDate>Mon, 03 Aug 2009 05:00:20 GMT</pubDate>
      <description>&lt;p&gt;
Apparently Java has quite a few known but practically undocumented issues with its
handling of UNC paths under Windows. I’ve specifically encountered &lt;a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5086147"&gt;this
bug&lt;/a&gt; albeit in a slightly different scenario:
&lt;/p&gt;
&lt;div&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;@Test&lt;br&gt;
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; test() &lt;span style="color: #0000ff"&gt;throws&lt;/span&gt; URISyntaxException
{&lt;br&gt;
&lt;span style="color: #0000ff"&gt;final&lt;/span&gt; URI uri = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; URI( &lt;span style="color: #006080"&gt;"file://c:/temp/test/ham.and.eggs"&lt;/span&gt; );&lt;br&gt;
&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; File( uri ); &lt;span style="color: #008000"&gt;//
IllegalArgumentException thrown here&lt;/span&gt;
&lt;br&gt;
}&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;
Apparently the two slashes after file: are misinterpreted as the authority part of
the URI; &lt;a href="http://stackoverflow.com/questions/1131273/java-file-touri-tourl-on-windows-file/1131465#1131465"&gt;this
thread&lt;/a&gt; on StackOverflow may give a few starting points if want to delve deeper.
It seems Java implements an older RFC for URIs which has slightly different tokenization
rules.
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div&gt;At any rate, so far the only sensible solution I’ve managed to come with is to
manually remove or add (depending on your tastes…) a slash:
&lt;/div&gt;
&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
&lt;p&gt;
&lt;span style="color: #008000"&gt;/**&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: #008000"&gt; * Resolves the specified URI, and returns the file &lt;/span&gt;
&lt;br&gt;
&lt;span style="color: #008000"&gt; * represented by the URI.&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: #008000"&gt; *&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: #008000"&gt; * @param uri The URI for which to return an absolute
path.&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: #008000"&gt; * @return The {@link File} instance represented by the&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: #008000"&gt; * specified URI.&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: #008000"&gt; * @throws IllegalArgumentException &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;The
URI cannot &lt;/span&gt;
&lt;br&gt;
&lt;span style="color: #008000"&gt; * be null.&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;Wrong URI scheme for
path resolution;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: #008000"&gt; * only file:// URIs are supported.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: #008000"&gt; */&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; File
getFile( URI uri )&lt;br&gt;
&lt;span style="color: #0000ff"&gt;throws&lt;/span&gt; IllegalArgumentException {&lt;br&gt;
&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; ( uri == null )&lt;br&gt;
&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; IllegalArgumentException(&lt;br&gt;
&lt;span style="color: #006080"&gt;"The URI cannot be null."&lt;/span&gt; );
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; ( !&lt;span style="color: #006080"&gt;"file"&lt;/span&gt;.equals(
uri.getScheme() ) )&lt;br&gt;
&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; IllegalArgumentException( &lt;span style="color: #006080"&gt;"Wrong
URI "&lt;/span&gt; + 
&lt;br&gt;
&lt;span style="color: #006080"&gt;"scheme for path resolution, expected \"file\" "&lt;/span&gt; +&lt;br&gt;
&lt;span style="color: #006080"&gt;"and got \""&lt;/span&gt; + uri.getScheme() + &lt;span style="color: #006080"&gt;"\""&lt;/span&gt; );
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
&lt;span style="color: #008000"&gt;// Workaround for the following bug: &lt;/span&gt;
&lt;br&gt;
&lt;span style="color: #008000"&gt;// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5086147&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: #008000"&gt;// Remove extra slashes after the scheme part.&lt;/span&gt;
&lt;br&gt;
&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; ( uri.getAuthority() != null )&lt;br&gt;
&lt;span style="color: #0000ff"&gt;try&lt;/span&gt; {&lt;br&gt;
uri = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; URI( uri.toString().replace( 
&lt;br&gt;
&lt;span style="color: #006080"&gt;"file://"&lt;/span&gt;, &lt;span style="color: #006080"&gt;"file:/"&lt;/span&gt; )
);&lt;br&gt;
} &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; ( URISyntaxException e ) {&lt;br&gt;
&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; IllegalArgumentException( &lt;span style="color: #006080"&gt;"The
specified "&lt;/span&gt; +&lt;br&gt;
&lt;span style="color: #006080"&gt;"URI contains an authority, but could not be "&lt;/span&gt; +&lt;br&gt;
&lt;span style="color: #006080"&gt;"normalized."&lt;/span&gt;, e );&lt;br&gt;
}
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; File(
uri );&lt;br&gt;
}&lt;br&gt;
&lt;/p&gt;
&lt;/pre&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div&gt;This is definitely a workaround, but according to newsgroup and forum posts these
bugs have been around forever. If anyone has a more elegant solution I’d love to know.
&lt;/div&gt;
&lt;img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=6a6c2dc7-df2a-4bec-8a2b-0e7d1e652d3f" /&gt;</description>
      <category>Development</category>
      <category>Development/Java</category>
    </item>
    <item>
      <trackback:ping>http://www.tomergabel.com/Trackback.aspx?guid=4d275a0e-f07d-4fe5-a019-869142585f0e</trackback:ping>
      <pingback:server>http://www.tomergabel.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.tomergabel.com/PermaLink,guid,4d275a0e-f07d-4fe5-a019-869142585f0e.aspx</pingback:target>
      <dc:creator>Tomer Gabel</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <u>Note:</u> This is more or less a translation of two forum posts in an Israeli home
theater website; if you can read Hebrew, you may be interested in the comments as
well. <a href="http://www.hometheater.co.il/vt85769.%D7%94%D7%9E%D7%9C%D7%A6%D7%95%D7%AA-DAC">First
post</a>, <a href="http://www.hometheater.co.il/vt87838.%D7%A8%D7%A9%D7%9E%D7%99-%D7%A6%D7%99%D7%95%D7%93-%D7%9C%D7%91%D7%99%D7%A0%D7%AA%D7%99%D7%99%D7%9D">second
post</a></p>
        <p>
          <a title="Original setup: Beyerdynamic DT880 original edition, G&amp;W T-2.6F with stock 6922EH tubes" href="http://www.tomergabel.com/content/binary/china_audio_large.jpg">
            <img style="border-right-width: 0px; margin: 0px 0px 0px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Original setup: Beyerdynamic DT880 original edition, G&amp;W T-2.6F with stock 6922EH tubes" border="0" alt="Original setup: Beyerdynamic DT880 original edition, G&amp;W T-2.6F with stock 6922EH tubes" align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Headphonesandthearcaneartofsound_6238/china_audio_large_3.jpg" width="324" height="224" />
          </a> Lately
I have been bit by the audio bug again, and have decided to experiment with my headphone
setup. This is the setup I use at work and listen to for hours at a time (often 5
or more hours a day), and which consists of a pair of 2003 model Beyerdynamic DT880
cans I bought on a <a href="http://www.tomergabel.com/TravellingToChinaShoppingAndTheWayBack.aspx">previous
trip to China</a>, hooked up to a G&amp;W T-2.6F amp I bought on the same trip after
having spent an hour listening to various equipment combinations. Unlike products
from other, internationally recognized brands with which I am familiar (Creek, Musical
Fidelity etc.) this product was completely out of my comfort zone: a Chinese-made
amplifier, which like many others I normally associate with cheap components and subpar
build quality. Additionally it is  rather large and bulky, and to top it off,
it is a hybrid design based on two Electro Harmonix 6922EH preamplifier tubes and
a solid state power section. Up until that point I had heard solid state equipment
exclusively, with the exception of two loudspeaker demonstrations in which the amplification
included tube components and was significantly more expensive than I could even consider.
Since I had not known what to expect I could not detect the subtleties of tube sound,
and had chosen this headphone/amp combination strictly on being the best I had heard
during that visit. 
</p>
        <p>
          <a href="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Headphonesandthearcaneartofsound_6238/IMG_1715.jpg">
            <img style="border-right-width: 0px; margin: 0px 10px 0px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Tube selection, left to right: Mullard E88CC, Electro Harmonix 6922EH, JAN-Sylavnia 7308" border="0" alt="Tube selection, left to right: Mullard E88CC, Electro Harmonix 6922EH, JAN-Sylavnia 7308" align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Headphonesandthearcaneartofsound_6238/IMG_1715_thumb.jpg" width="324" height="244" />
          </a> This
setup was, in turn, hooked via a generic interconnect to my work computer with onboard
HD audio, through which I play mostly lossless rips from my own CDs via <a href="http://www.exactaudiocopy.de/">Exact
Audio Copy</a>. It had faithfully served me for over three years, at which point I
decided to do some research and was first exposed to the vast world of tube-based
amplification and tube rolling. After several days of forum lurking and reading well
into the night I had placed my first ever tube order at <a href="http://thetubestore.com">thetubestore.com</a>.
With the help of the shop representative, Jon, and general recommendations around
the web, I had selected a matched pair of JAN-Sylvania 7308 tubes and yet another
matched pair of Mullard E88CC tubes and placed my order. I did not have to wait very
long, as the UPS delivery arrived amazingly fast (a single weekend, not too shabby
for an international delivery!), and decided to spend a few weeks with each pair to
be able to form an honest, educated opinion. I begun my experiments with what is,
according to general consensus, the weaker tube: the JAN-Sylvania 7308.
</p>
        <p>
What a shock! While I do not, for a moment, assert that similar or better sound cannot
be found in solid state amplifiers, I certainly did not expect such a dramatic difference
in sound quality. The soundstage, previously wide but shallow, simply exploded! It’s
as though the sound instantly multiplied its volume tenfold or more; highs became
wonderfully airy and distinct, and the resolution… let me put it this way: in every
audio enthusiast’s life there are but few such moments of enlightenment, where you
suddenly realize how much more is possible, and even attainable. The first time I’ve
listened to the very same equipment with upgraded tubes provided me with one of those
rare occasions, and from that point on I can never settle for less.
</p>
        <p>
          <a href="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Headphonesandthearcaneartofsound_6238/IMG_1732.jpg">
            <img style="border-right-width: 0px; margin: 0px 0px 0px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="JAN-Sylavnia 7308 tubes hooked up to the amp (and before dusting...)" border="0" alt="JAN-Sylavnia 7308 tubes hooked up to the amp (and before dusting...)" align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Headphonesandthearcaneartofsound_6238/IMG_1732_thumb.jpg" width="324" height="244" />
          </a>At
the same time I had a second such revelation, albeit by accident: because of the physical
layout of my desktop at work I was forced to place the amp further away from the computer,
which necessitated a longer interconnect cable. I did not have one at hand and until
I was done for the day I was left with no alternative but to use the iPod’s standard
analog output. The iPod is generally considered to have very poor analog performance,
which is why I was thoroughly surprised when, having brought a longer (and higher
quality) interconnect from home and hooked the computer up, I found that the iPod
actually sounded <em>better</em>. I recall when it was almost impossible to find a
decent quality audio card for your computer, and assumed that contemporary solutions
were at least adequate; indeed, the computer sound output was cleaner (better SNR)
but also had significantly diminished dynamic range and volume. This led me to the
conclusion that an audio card upgrade was in order. 
</p>
        <p>
A little research into the subject brought me to the the conclusion that what I’m
interested in is not, in fact, a computer audio card; what I want is an external DAC,
or more specifically a USB DAC. Getting a computer to output even half-decent analog
audio is pretty much a futile quest, and while hooking it up via coaxial/optical S/PDIF
would certainly work there are some significant disadvantages, namely: digital (lossy)
volume control, and jitter. With S/PDIF, both clock and data signals are encoded together
on a single data line, and the click has to be regenerated. This introduces subtle
timing inaccuracies, generally known as jitter, which in have an undesirable impact
on digital-to-analog conversion (a more scientific explanation can be found <a href="http://www.audiocraftersguild.com/AandE/npt.on.jitter2.htm">here</a>).
Just how significant an impact is a subject of much controversy, but at a USB DAC
has the theoretical advantage of significantly reduced jitter on the protocol level,
as well as removing the question of the onboard S/PDIF encoder’s clock accuracy from
the equation.
</p>
        <p>
          <img style="border-right-width: 0px; margin: 0px 10px 0px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Musical Fidelity V-DAC. Ugly but functional" border="0" alt="Musical Fidelity V-DAC. Ugly but functional" align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Headphonesandthearcaneartofsound_6238/v-dac_5.jpg" width="320" height="191" /> With
the advice of fellow forum members I resolved to try one of the following DAC trio:
Cambridge Audio <a href="http://www.cambridgeaudio.com/summary.php?PID=320">DacMagic</a>,
Oritek <a href="http://members.aceweb.com/orim/audio/OritekAudio/Zho_mod.html">OMZ
DAC</a> or Musical Fidelity <a href="http://www.musicalfidelity.com/products/vseries/vdac.html">V-DAC</a>.
Following a lead from a fellow forum member I eventually bought the V-DAC for a very
good price from a <a href="http://www.head-fi.org/">head-fi.org</a> forum member.
The V-DAC is a 192KHz/24-bit upsampling DAC with optical, coaxial and USB inputs that
has received <a href="http://www.head-fi.org/forums/f7/musical-fidelity-v-dac-owners-391721/index2.html">high
praise</a> in the head-fi circles and is even available in Israel for a surprisingly
reasonable price.
</p>
        <p>
          <a href="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Headphonesandthearcaneartofsound_6238/IMG_1740.jpg">
            <img style="border-right-width: 0px; margin: 0px 0px 0px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="JAN-Sylvania 7308 in action" border="0" alt="JAN-Sylvania 7308 in action" align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Headphonesandthearcaneartofsound_6238/IMG_1740_thumb.jpg" width="324" height="244" />
          </a>I
hooked the unit up with an unnamed but high quality silver interconnect, and after
significant critical listening I can draw the following conclusions: compared with
both iPod and onboard audio card (as well as an old Audigy 4 I had lying around) the
V-DAC features significantly improved accuracy and resolution, and more and more often
I’ve been rewinding tracks just to make sure that, yes, I wasn’t imagining, I really
have never heard this or that detail before. This is exactly what I got into audio
for in the first place! The bass is also much tighter, and in my opinion also extends
further down than it ever did. In fact, the only disadvantage is in a certain change
in the soundstage, as though the stereo separation grew just a littler wider than
I’d like. Don’t get me wrong, the soundstage is huge and imaging is terrific, but
it sometimes seems to be that sounds tend to cluster a little closer to the extremes
of the soundstage than they should.
</p>
        <p>
All in all I’m extremely happy with the upgrade, and luckily I still have some new
equipment left to play with: the Mullard E88CC tubes, patiently awaiting my pleasure.
Still, now that there’s such a significant difference in fidelity between my work
and home setup (which consists of an <a href="http://www.aqua-audio.com/index.html">Aqua</a> Mini-Head
amp and Beyerdynamic DT880 2005 edition cans) I feel compelled to experiment with
new equipment. Whatever shall I try next, a new DAC? Another amp? Different cans,
perhaps? The choices are endless, and that’s the beauty of it. See you on the next
upgrade.
</p>
        <p>
          <u>Update</u>: Some more pictures can be found <a href="http://www.flickr.com/photos/tomergabel/sets/72157620617979418/">here</a>.
</p>
        <img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=4d275a0e-f07d-4fe5-a019-869142585f0e" />
      </body>
      <title>Headphones and the arcane art of sound</title>
      <guid isPermaLink="false">http://www.tomergabel.com/PermaLink,guid,4d275a0e-f07d-4fe5-a019-869142585f0e.aspx</guid>
      <link>http://www.tomergabel.com/HeadphonesAndTheArcaneArtOfSound.aspx</link>
      <pubDate>Sat, 27 Jun 2009 04:17:10 GMT</pubDate>
      <description>&lt;p&gt;
&lt;u&gt;Note:&lt;/u&gt; This is more or less a translation of two forum posts in an Israeli home
theater website; if you can read Hebrew, you may be interested in the comments as
well. &lt;a href="http://www.hometheater.co.il/vt85769.%D7%94%D7%9E%D7%9C%D7%A6%D7%95%D7%AA-DAC"&gt;First
post&lt;/a&gt;, &lt;a href="http://www.hometheater.co.il/vt87838.%D7%A8%D7%A9%D7%9E%D7%99-%D7%A6%D7%99%D7%95%D7%93-%D7%9C%D7%91%D7%99%D7%A0%D7%AA%D7%99%D7%99%D7%9D"&gt;second
post&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a title="Original setup: Beyerdynamic DT880 original edition, G&amp;amp;W T-2.6F with stock 6922EH tubes" href="http://www.tomergabel.com/content/binary/china_audio_large.jpg"&gt;&lt;img style="border-right-width: 0px; margin: 0px 0px 0px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Original setup: Beyerdynamic DT880 original edition, G&amp;amp;W T-2.6F with stock 6922EH tubes" border="0" alt="Original setup: Beyerdynamic DT880 original edition, G&amp;amp;W T-2.6F with stock 6922EH tubes" align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Headphonesandthearcaneartofsound_6238/china_audio_large_3.jpg" width="324" height="224"&gt;&lt;/a&gt; Lately
I have been bit by the audio bug again, and have decided to experiment with my headphone
setup. This is the setup I use at work and listen to for hours at a time (often 5
or more hours a day), and which consists of a pair of 2003 model Beyerdynamic DT880
cans I bought on a &lt;a href="http://www.tomergabel.com/TravellingToChinaShoppingAndTheWayBack.aspx"&gt;previous
trip to China&lt;/a&gt;, hooked up to a G&amp;amp;W T-2.6F amp I bought on the same trip after
having spent an hour listening to various equipment combinations. Unlike products
from other, internationally recognized brands with which I am familiar (Creek, Musical
Fidelity etc.) this product was completely out of my comfort zone: a Chinese-made
amplifier, which like many others I normally associate with cheap components and subpar
build quality. Additionally it is&amp;nbsp; rather large and bulky, and to top it off,
it is a hybrid design based on two Electro Harmonix 6922EH preamplifier tubes and
a solid state power section. Up until that point I had heard solid state equipment
exclusively, with the exception of two loudspeaker demonstrations in which the amplification
included tube components and was significantly more expensive than I could even consider.
Since I had not known what to expect I could not detect the subtleties of tube sound,
and had chosen this headphone/amp combination strictly on being the best I had heard
during that visit. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Headphonesandthearcaneartofsound_6238/IMG_1715.jpg"&gt;&lt;img style="border-right-width: 0px; margin: 0px 10px 0px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Tube selection, left to right: Mullard E88CC, Electro Harmonix 6922EH, JAN-Sylavnia 7308" border="0" alt="Tube selection, left to right: Mullard E88CC, Electro Harmonix 6922EH, JAN-Sylavnia 7308" align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Headphonesandthearcaneartofsound_6238/IMG_1715_thumb.jpg" width="324" height="244"&gt;&lt;/a&gt; This
setup was, in turn, hooked via a generic interconnect to my work computer with onboard
HD audio, through which I play mostly lossless rips from my own CDs via &lt;a href="http://www.exactaudiocopy.de/"&gt;Exact
Audio Copy&lt;/a&gt;. It had faithfully served me for over three years, at which point I
decided to do some research and was first exposed to the vast world of tube-based
amplification and tube rolling. After several days of forum lurking and reading well
into the night I had placed my first ever tube order at &lt;a href="http://thetubestore.com"&gt;thetubestore.com&lt;/a&gt;.
With the help of the shop representative, Jon, and general recommendations around
the web, I had selected a matched pair of JAN-Sylvania 7308 tubes and yet another
matched pair of Mullard E88CC tubes and placed my order. I did not have to wait very
long, as the UPS delivery arrived amazingly fast (a single weekend, not too shabby
for an international delivery!), and decided to spend a few weeks with each pair to
be able to form an honest, educated opinion. I begun my experiments with what is,
according to general consensus, the weaker tube: the JAN-Sylvania 7308.
&lt;/p&gt;
&lt;p&gt;
What a shock! While I do not, for a moment, assert that similar or better sound cannot
be found in solid state amplifiers, I certainly did not expect such a dramatic difference
in sound quality. The soundstage, previously wide but shallow, simply exploded! It’s
as though the sound instantly multiplied its volume tenfold or more; highs became
wonderfully airy and distinct, and the resolution… let me put it this way: in every
audio enthusiast’s life there are but few such moments of enlightenment, where you
suddenly realize how much more is possible, and even attainable. The first time I’ve
listened to the very same equipment with upgraded tubes provided me with one of those
rare occasions, and from that point on I can never settle for less.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Headphonesandthearcaneartofsound_6238/IMG_1732.jpg"&gt;&lt;img style="border-right-width: 0px; margin: 0px 0px 0px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="JAN-Sylavnia 7308 tubes hooked up to the amp (and before dusting...)" border="0" alt="JAN-Sylavnia 7308 tubes hooked up to the amp (and before dusting...)" align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Headphonesandthearcaneartofsound_6238/IMG_1732_thumb.jpg" width="324" height="244"&gt;&lt;/a&gt;At
the same time I had a second such revelation, albeit by accident: because of the physical
layout of my desktop at work I was forced to place the amp further away from the computer,
which necessitated a longer interconnect cable. I did not have one at hand and until
I was done for the day I was left with no alternative but to use the iPod’s standard
analog output. The iPod is generally considered to have very poor analog performance,
which is why I was thoroughly surprised when, having brought a longer (and higher
quality) interconnect from home and hooked the computer up, I found that the iPod
actually sounded &lt;em&gt;better&lt;/em&gt;. I recall when it was almost impossible to find a
decent quality audio card for your computer, and assumed that contemporary solutions
were at least adequate; indeed, the computer sound output was cleaner (better SNR)
but also had significantly diminished dynamic range and volume. This led me to the
conclusion that an audio card upgrade was in order. 
&lt;/p&gt;
&lt;p&gt;
A little research into the subject brought me to the the conclusion that what I’m
interested in is not, in fact, a computer audio card; what I want is an external DAC,
or more specifically a USB DAC. Getting a computer to output even half-decent analog
audio is pretty much a futile quest, and while hooking it up via coaxial/optical S/PDIF
would certainly work there are some significant disadvantages, namely: digital (lossy)
volume control, and jitter. With S/PDIF, both clock and data signals are encoded together
on a single data line, and the click has to be regenerated. This introduces subtle
timing inaccuracies, generally known as jitter, which in have an undesirable impact
on digital-to-analog conversion (a more scientific explanation can be found &lt;a href="http://www.audiocraftersguild.com/AandE/npt.on.jitter2.htm"&gt;here&lt;/a&gt;).
Just how significant an impact is a subject of much controversy, but at a USB DAC
has the theoretical advantage of significantly reduced jitter on the protocol level,
as well as removing the question of the onboard S/PDIF encoder’s clock accuracy from
the equation.
&lt;/p&gt;
&lt;p&gt;
&lt;img style="border-right-width: 0px; margin: 0px 10px 0px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Musical Fidelity V-DAC. Ugly but functional" border="0" alt="Musical Fidelity V-DAC. Ugly but functional" align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Headphonesandthearcaneartofsound_6238/v-dac_5.jpg" width="320" height="191"&gt; With
the advice of fellow forum members I resolved to try one of the following DAC trio:
Cambridge Audio &lt;a href="http://www.cambridgeaudio.com/summary.php?PID=320"&gt;DacMagic&lt;/a&gt;,
Oritek &lt;a href="http://members.aceweb.com/orim/audio/OritekAudio/Zho_mod.html"&gt;OMZ
DAC&lt;/a&gt; or Musical Fidelity &lt;a href="http://www.musicalfidelity.com/products/vseries/vdac.html"&gt;V-DAC&lt;/a&gt;.
Following a lead from a fellow forum member I eventually bought the V-DAC for a very
good price from a &lt;a href="http://www.head-fi.org/"&gt;head-fi.org&lt;/a&gt; forum member.
The V-DAC is a 192KHz/24-bit upsampling DAC with optical, coaxial and USB inputs that
has received &lt;a href="http://www.head-fi.org/forums/f7/musical-fidelity-v-dac-owners-391721/index2.html"&gt;high
praise&lt;/a&gt; in the head-fi circles and is even available in Israel for a surprisingly
reasonable price.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Headphonesandthearcaneartofsound_6238/IMG_1740.jpg"&gt;&lt;img style="border-right-width: 0px; margin: 0px 0px 0px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="JAN-Sylvania 7308 in action" border="0" alt="JAN-Sylvania 7308 in action" align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Headphonesandthearcaneartofsound_6238/IMG_1740_thumb.jpg" width="324" height="244"&gt;&lt;/a&gt;I
hooked the unit up with an unnamed but high quality silver interconnect, and after
significant critical listening I can draw the following conclusions: compared with
both iPod and onboard audio card (as well as an old Audigy 4 I had lying around) the
V-DAC features significantly improved accuracy and resolution, and more and more often
I’ve been rewinding tracks just to make sure that, yes, I wasn’t imagining, I really
have never heard this or that detail before. This is exactly what I got into audio
for in the first place! The bass is also much tighter, and in my opinion also extends
further down than it ever did. In fact, the only disadvantage is in a certain change
in the soundstage, as though the stereo separation grew just a littler wider than
I’d like. Don’t get me wrong, the soundstage is huge and imaging is terrific, but
it sometimes seems to be that sounds tend to cluster a little closer to the extremes
of the soundstage than they should.
&lt;/p&gt;
&lt;p&gt;
All in all I’m extremely happy with the upgrade, and luckily I still have some new
equipment left to play with: the Mullard E88CC tubes, patiently awaiting my pleasure.
Still, now that there’s such a significant difference in fidelity between my work
and home setup (which consists of an &lt;a href="http://www.aqua-audio.com/index.html"&gt;Aqua&lt;/a&gt; Mini-Head
amp and Beyerdynamic DT880 2005 edition cans) I feel compelled to experiment with
new equipment. Whatever shall I try next, a new DAC? Another amp? Different cans,
perhaps? The choices are endless, and that’s the beauty of it. See you on the next
upgrade.
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;Update&lt;/u&gt;: Some more pictures can be found &lt;a href="http://www.flickr.com/photos/tomergabel/sets/72157620617979418/"&gt;here&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=4d275a0e-f07d-4fe5-a019-869142585f0e" /&gt;</description>
      <category>Music</category>
      <category>Personal</category>
    </item>
    <item>
      <trackback:ping>http://www.tomergabel.com/Trackback.aspx?guid=2f696dc0-edec-4b65-b408-81c5a4d89eb8</trackback:ping>
      <pingback:server>http://www.tomergabel.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.tomergabel.com/PermaLink,guid,2f696dc0-edec-4b65-b408-81c5a4d89eb8.aspx</pingback:target>
      <dc:creator>Tomer Gabel</dc:creator>
      <title>Presenting: Movies à la mode</title>
      <guid isPermaLink="false">http://www.tomergabel.com/PermaLink,guid,2f696dc0-edec-4b65-b408-81c5a4d89eb8.aspx</guid>
      <link>http://www.tomergabel.com/PresentingMovies%c3%80LaMode.aspx</link>
      <pubDate>Sun, 17 May 2009 22:59:33 GMT</pubDate>
      <description>&lt;p&gt;
As a huge movie buff I could always give quick opinion on a movie, a subject which
tends to come up quite often in conversation. It occurred to me that, although since
I’ve &lt;a title="It's a boy!" href="http://www.tomergabel.com/ItsABoy.aspx"&gt;finalized
my home theater setup&lt;/a&gt; I’ve been watching dozens if not hundreds of movies with
my girlfriend, the sheer volume makes it impossible to review the lot of them in blog
posts. Then the idea struck me that &lt;a href="http://www.twitter.com"&gt;Twitter&lt;/a&gt; is
the perfect platform for quick-and-dirty movie reviews:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Reviews have to be succinct; each review consists of up to 140 characters, a hard
limit inherent in the platform. Subtract from those characters the movie length, final
grade (more on that later) and (being as obsessive as I am about language) no skimping
on spelling or punctuation marks either. Condensing my thoughts on a movie to such
a limited medium means I have to focus on either one point with some elaboration,
or at most two with no embellishment of any sort.&lt;/li&gt;
&lt;li&gt;
It’s non-committal. I spend a minute or two thinking up a few angles on which I can
go, then another 2-5 minutes refining the text until I’m satisfied. It’s much easier
and much more pleasant to spend five minutes after a movie writing up a message on
Twitter than to spend a couple hours each week summing up movies days after I’ve seen
them; if I wanted to keep this in blog form I would have had to write up summaries
in the same manner anyway, why not just publish them directly?&lt;/li&gt;
&lt;li&gt;
Low overhead. Having a blog means I beat myself whenever I slack on posting, and I’m
committed to keeping it up and running, indexed and technologically relevant (if only
so I can move hosts freely and avoid spam). Twitter is a managed platform, means I
don’t have to worry about storage, bandwidth, backup or crappy web hosts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
With the rationale out of the way, I give you &lt;a title="Movies &amp;agrave; la mode" href="http://twitter.com/moviesalamode" rel="me"&gt;movies
à la mode&lt;/a&gt;: &lt;span class="bio"&gt;140-character movie reviews!&lt;/span&gt;
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;span class="bio"&gt;&lt;a title="Movies &amp;agrave; la mode" href="http://twitter.com/moviesalamode" rel="me"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="moviereviews.logo.shahar" border="0" alt="moviereviews.logo.shahar" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/PresentingMovieslamode_14A3/moviereviews.logo.shahar_3.gif" width="187" height="240"&gt;&lt;/a&gt; &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
The grade scale I use is my own, and while I believe it to be consistent I make no
guarantees. To give you some sort of reference point, I consider the original Matrix
a genre-redefining action movie, and as such would give it an 8; Reloaded, on the
other hand, not only pales compared to the first, it’s also horribly overblown and
would rate a 2 (for the effects and nostalgia).
&lt;/p&gt;
&lt;p&gt;
There are a few reviews up already, go read them and please do comment!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=2f696dc0-edec-4b65-b408-81c5a4d89eb8" /&gt;</description>
      <category>Movies</category>
      <category>Personal</category>
    </item>
    <item>
      <trackback:ping>http://www.tomergabel.com/Trackback.aspx?guid=cdd0991a-287c-4514-9a58-51378ace54b6</trackback:ping>
      <pingback:server>http://www.tomergabel.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.tomergabel.com/PermaLink,guid,cdd0991a-287c-4514-9a58-51378ace54b6.aspx</pingback:target>
      <dc:creator>Tomer Gabel</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A couple of years back I went to <a href="http://www.tomergabel.com/BREAAAAAAAAAAAAAAAAAAAAKPOIIIIIIIIINT.aspx">Breakpoint
2007</a>, which was my first international (read: non-Israeli) demo party, as well
as the first proper demo party I went to in 9 years (the Israeli demo scene had a
couple of small get-together events in <a href="http://en.wikipedia.org/wiki/Kamon,_Israel">Kamon</a> in
2000 and later <a href="http://www.tomergabel.com/DemosceneBBQ.aspx">in 2005</a>,
but I don’t consider those actual demo parties). Along with <a href="http://profile.myspace.com/index.cfm?fuseaction=user.viewprofile&amp;friendID=163707260">Bacter</a> and
my brother Mickey, we three were the only Israelis to be found at the party.
</p>
        <p>
I missed Breakpoint 2008 due to product release pressures, the normal state of affairs
while working for a small startup; I resolved not to miss it again this year, and
made plans with Bacter and Mickey to meet up at the party place. Executive summary:
a<em>mazing</em> people and <em>amazing</em> scene spirit. I spent nearly all of the
party outside with a beer in my hand chatting with people. It’s amazing just how much
diversity one can find in such a small group; really the only common grounds is a
general love for art, freedom of expression and the demoscene in particular. One moment
I may be involved in a deep political discussion with a bunch of Germans (greets Streettuff/TRSI),
and the next I’ll be drawing a comparison between English, Dutch, German and Hebrew
with a bunch of Dutch guys (hi <a href="http://www.cosmiq.nl/">Cosmiq</a>!) or quoting
Borat with our resident Portuguese <a href="http://scenept.blogspot.com/">Jeenio</a>.
While I’m at it, greets to Luise, Julius, Jan and Manu from München, Okkie, the Misfit
of the C64 scene and everyone else with whom I’ve spent with and whose name I can’t
remember :-)
</p>
        <p>
Although some of the compos this year had disappointing turn out (in particular, out
of 25 or so demos maybe two or three are noteworthy) the party was still great fun.
The lack of sponsors did very little to detract from the quality of the party, possibly
the opposite in fact: the event was sponsored out of the entrance fee and donations
made by sceners in the few months before it took place, the net result being that
everyone present was happy to be there and the party really took off. Kudos Breakpoint
organizers!
</p>
        <p>
I recommend watching the following productions from Breakpoint 2009:
</p>
        <p>
          <a href="http://www.pouet.net/prod.php?which=52647">
            <img style="border-right-width: 0px; margin: 0px 10px 0px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="bp2009_mfx" border="0" alt="bp2009_mfx" align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_mfx_3.jpg" width="133" height="100" />
          </a>
        </p>
        <p>
          <a href="http://www.pouet.net/prod.php?which=52647">Everything is Under Control</a> by
the ever-prolific <a href="http://www.pouet.net/groups.php?which=168">mfx</a> is the
invitation demo to Breakpoint 2009, which brings to the table mfx’s usual array of
amazing 3D graphics, 2D effects, fast code and coherent, though disturbing, design.
With its 1984-esque theme this demo set the theme for the entire party.
</p>
        <p>
 
</p>
        <p>
          <a href="http://www.pouet.net/prod.php?which=52995">
            <img style="border-right-width: 0px; margin: 0px 0px 0px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="bp2009_hullabaloo" border="0" alt="bp2009_hullabaloo" align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_hullabaloo_3.jpg" width="125" height="100" />
          </a>
        </p>
        <p>
One of the noteworthy demos from Breakpoint 2009 is <a href="http://www.pouet.net/prod.php?which=52995">Freedom
From State</a> by Hullabaloo: this demo was entirely written at the party-place by <a href="http://www.slengpung.com/?id=19713&amp;eventid=528">blala</a>,
who had been sitting with has MacBook right next to us the whole party and coding
furiously in Haskell. Yes, you heard me right: the demo is written in Haskell, which
(along with the party theme) is why Freedom From State is such an excellent name,
even though the demo itself is quite unremarkable.
</p>
        <p>
          <a href="http://www.pouet.net/prod.php?which=53003">
            <img style="border-right-width: 0px; margin: 0px 10px 0px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="bp2009_lft" border="0" alt="bp2009_lft" align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_lft_733c6fb4-9421-45e8-8361-380c0c4a96c9.jpg" width="125" height="100" />
          </a>And
in the wicked cool department, lft (of <a href="http://www.linusakesson.net/scene/craft/">Craft</a> fame)
is at it again with another microcontroller-based demo: <a href="http://www.linusakesson.net/scene/turbulence/index.php">Turbulence</a> (or
on <a href="http://pouet.net/prod.php?which=53003">pouët</a>). This time the custom
hardware platform is based on a Parallax Propeller chip, and the demo itself is both
good (in an oldskool kind of way) and damned technically impressive at that. Kudos!
</p>
        <p>
 
</p>
        <p>
          <a href="http://www.pouet.net/prod.php?which=53021">
            <img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_excelence." border="0" alt="bp2009_excelence." align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_excelence._3.jpg" width="133" height="100" />
          </a>
          <a href="http://www.pouet.net/prod.php?which=53021">Excelence</a> by
the group with the awesome name BraadWorsten Brigade is probably the world’s first
Excel demo, and proves just how fortunate we are that this is the case :-) Don’t take
me wrong, it’s awesome and even funny, but if no-one else ever makes another VBA demo
it won’t be soon enough…
</p>
        <p>
          <img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_panda" border="0" alt="bp2009_panda" align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_panda_3.jpg" width="155" height="100" />Breakpoint
2009 has seen a lot of first-time productions by new demo groups; of these my favorite
is <a href="http://www.pouet.net/prod.php?which=53013">PC-03 ON/OFF</a> by Panda Cube.
A stylized 3D flyby with subtle shades and nice presentation. I hope these guys go
on to make demos, lots of potential there!
</p>
        <p>
          <a href="http://www.pouet.net/prod.php?which=53033">
            <img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_systemk" border="0" alt="bp2009_systemk" align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_systemk_3.jpg" width="175" height="100" />
          </a> Although
this was not strictly their first production, <a href="http://www.pouet.net/prod.php?which=53033">Conscious
of Blue</a> by <a href="http://www.sys-k.net/">System-K</a> is another favorite of
mine: a clean, well-designed and imaginative demo that’s very different from the typical
European demo style. No surprises there; these guys come from Japan. I didn’t even
know Japan had an active demoscene, although for the life of me I don’t see why not.
Kudos guys!
</p>
        <p>
          <a href="http://www.pouet.net/prod.php?which=52992">
            <img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_crush." border="0" alt="bp2009_crush." align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_crush._6.jpg" width="178" height="100" />
          </a> While <a href="http://www.pouet.net/prod.php?which=52992">Crush</a> by
Anadune and Floppy was not the only enjoyable PC demo at Breakpoint 2009, it was certainly
the most impressive: the right blend of technology, design and music. Borrowing a
leaf from Debris by farbrausch, this demo features plenty of deformable objects and
lots of glow, but is different enough in style, pacing and content to stand out on
its own. Two or three scenes here (such as the one pictured) are simply astounding.
</p>
        <p>
          <a href="http://www.pouet.net/prod.php?which=52963">
            <img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_rebels" border="0" alt="bp2009_rebels" align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_rebels_3.jpg" width="182" height="100" />
          </a> It
seems white is the new black, with at least three white-themed productions at this
party alone. With that in mind, <a href="http://www.pouet.net/prod.php?which=52963">060659</a> by
Rebels is an excellent (if not groundbreaking), stylized 64k intro that’s always great
to watch. The commodore fan-service in the middle is gratuitous, although the effect
itself is absolutely brilliant. Music is also subpar, but the design more than makes
up for it IMO.
</p>
        <p>
          <a href="http://www.pouet.net/prod.php?which=53011">
            <img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_gottler." border="0" alt="bp2009_gottler." align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_gottler._3.jpg" width="141" height="100" />
          </a>
        </p>
        <p>
One of the most technically impressive C64 demo I’ve ever seen (possibly on par with
Second Reality 64), <a href="http://www.pouet.net/prod.php?which=53011">Das Gotler</a> by
Extend and Dekadence hits you from the very first moment (with how the C64 basic window
is cleared). The downside? Horrible, <em>horrible</em> music.
</p>
        <p>
 
</p>
        <p>
          <a href="http://www.pouet.net/prod.php?which=53045">
            <img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_julie." border="0" alt="bp2009_julie." align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_julie._3.jpg" width="178" height="100" />
          </a> The
last few years have seen some amazing new artistic outlets for the scene, particularly
commercial-quality animations in the compos. Breakpoint 2009 had a couple of fantastic
entries, notably the winning duo. 2nd place animation compo winner <a href="http://www.pouet.net/prod.php?which=53045">Julie</a> by
Nuance is both a fantastic artistic expression and a terrific tech demo: with a 300
Euro budget and stuff they had lying around at home, the team tried (rather successfully)
to imitate the bullet-time effect popularized by The Matrix. They’ve also released
a <a href="www.higher-lyrics.de/MakingOfJulie.pdf ">“making of” document</a> that’s
a fairly interesting read.
</p>
        <p>
          <a href="http://www.pouet.net/prod.php?which=52928">
            <img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_speichergurke." border="0" alt="bp2009_speichergurke." align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_speichergurke._3.jpg" width="178" height="100" />
          </a> On
the other end of the spectrum you’ll find JCO’s <a href="http://www.pouet.net/prod.php?which=52928">Spiechergurke</a>,
a fake commercial for a new kind of storage product (<a href="http://www.youtube.com/watch?v=cWYxYmsnQjw&amp;feature=related">watch
with subtitles</a>). Other than being <em>very</em> well made it made me laugh my
ass off. I think all in all Julie was the better production, but it was a very hard
toss-up between the two; at any rate I’m glad both won the competition (Speichergurke
took 1st place). 
</p>
        <p>
          <a href="http://www.pouet.net/prod.php?which=52968">
            <img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_jesus" border="0" alt="bp2009_jesus" align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_jesus_3.jpg" width="161" height="100" />
          </a>
        </p>
        <p>
          <a href="http://www.pouet.net/prod.php?which=52968">Jesus Christ Motocross</a> by
Nature and Traktor is, other than being a heavy hitting, funny and fun to watch, an
amazingly impressive Amiga demo. Nontrivial effects (all in software, obviously),
psychotic pacing and music and apparently artifact-free code are all fine and dandy,
but the <a href="http://en.wikipedia.org/wiki/Tron_(film)">Tron</a> tribute pictured
on the right won my heart.
</p>
        <p>
          <a href="http://www.pouet.net/prod.php?which=52998">
            <img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_lightshaft" border="0" alt="bp2009_lightshaft" align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_lightshaft_3.png" width="178" height="100" />
          </a>
        </p>
        <p>
That said, <a href="http://www.pouet.net/prod.php?which=52998">Lightshaft</a> by Elude
is a very strong runner-up; 2nd place Amiga demo compo winner, this demo combines
an incredibly impressive array of 3D scenes with epic design and pacing, terrific
graphics and excellent music. It’s ironic that the two winning Amiga demos were so
impressive whereas the PC demo compo suffered from general lack of enthusiasm and
polish.
</p>
        <p>
          <a href="http://www.pouet.net/prod.php?which=52938">
            <img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_elevated" border="0" alt="bp2009_elevated" align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_elevated_3.jpg" width="178" height="100" />
          </a> Easily
the best PC 4k intro I have ever seen, <a href="http://www.pouet.net/prod.php?which=52938">Elevated</a> by
Rgba and TBC is also possibly the first to ever get me excited. Astounding visuals,
top notch design and excellent music are only part of it; the picture on the right
really does not do this production justice, and you should definitely watch it in
its entirety at least once to appreciate just how amazingly good a demo can be at
4096 bytes!
</p>
        <p>
Other notable productions from Breakpoint 2009:
</p>
        <ul>
          <li>
            <a href="http://www.pouet.net/prod.php?which=53004">Defcon Zero</a> by Scarab for
the Nintendo DS</li>
          <li>
            <a href="http://www.pouet.net/prod.php?which=52983">Syntax Infinity</a> by Tulou and
Traktor for the <a href="http://en.wikipedia.org/wiki/MSX#MSX2">MSX2</a> platform</li>
          <li>
            <a href="http://www.pouet.net/prod.php?which=53000">fr-065: euphotic</a> by farbrausch,
a technically impressive but boring and uninspired PC demo</li>
          <li>
            <a href="http://www.pouet.net/prod.php?which=53052">Enigma Sequence</a> by Approximate,
a 64k intro that’s really close to being awesome. I think a couple more weeks of polish
would’ve really turned this one into a winner, but as is it’s quite raw.</li>
          <li>
            <a href="http://www.pouet.net/prod.php?which=52965">Luminagia</a> by Loonies, Amiga
4k intro. Not quite as polished as the PC 4ks of the last few years, but damned impressive
never-the-less.</li>
        </ul>
        <p>
I also got to watch the following productions on the big screen at Breakpoint, each
of which is a recommended watch:
</p>
        <p>
          <a href="http://pouet.net/prod.php?which=52931">
            <img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_other_rupture" border="0" alt="bp2009_other_rupture" align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_other_rupture_5.jpg" width="178" height="100" />
          </a> While
Breakpoint was still in progress, <a href="http://pouet.net/prod.php?which=52931">Rupture</a> by
Andromeda Software Development won 1st place in the demo party at The Gathering 2009
and with all due reason: this demo is <em>fantastic</em>. Coherent design, astounding
visuals, excellent pacing and music – it does everything well. For a demoscene fan,
watching this on the big screen was a little like watching Terminator 2 in the theater
for the first time: it gives you a profound sense of “this is what production values
are all about.” The screenshot can’t do it justice, just go watch it already!
</p>
        <p>
          <a href="http://www.pouet.net/prod.php?which=51438">
            <img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_other_stargazer" border="0" alt="bp2009_other_stargazer" align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_other_stargazer_3.jpg" width="178" height="100" />
          </a> Conversely,
NVScene 2008 winner <a href="http://www.pouet.net/prod.php?which=51438">Stargazer</a> by
Andromeda and Orb is not as fluently directed but at least as technically impressive.
I simply love Andromeda’s flow, the way they always manage to bring closure to a scene
before moving on to the next effect, even if the two aren’t related in any way. Stargazer
is a slideshow of some of the most impressive effects ever seen in a demo, with astonishing
visuals and excellent techno music; I’m not sure which of the two (Stargazer or Rupture)
I like better, but I guess they each appeal to a different school. Both are definitely
must-see.
</p>
        <p>
          <a href="http://www.pouet.net/prod.php?which=50131">
            <img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_other_masagin3" border="0" alt="bp2009_other_masagin3" align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_other_masagin3_3.jpg" width="178" height="100" />
          </a> A
veritable demoscene poster-boy, the NVScene 2008 invitation intro <a href="http://www.pouet.net/prod.php?which=50131">Masagin</a> is
the brainchild of <a href="http://www.paniq.org/">Paniq</a> (the guy behind <a href="http://www.pouet.net/prod.php?which=25864">Die
Ewigkeit Schmerzt</a>). A high quality production with an obvious artistic bent, Masagin
blends excellent music with unique effects and fluid design and is one of the most
engaging demos I’ve seen in years.
</p>
        <p>
          <a href="http://www.pouet.net/prod.php?which=51450">
            <img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_other_midnight2" border="0" alt="bp2009_other_midnight2" align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_other_midnight2_3.jpg" width="178" height="100" />
          </a>Andromeda
Software Development demos typically fall into one of two categories: artistically
done 3D slideshows (Dreamchild, Rupture), and technically impressive video art (Evolution
of Vision, Beyond the walls of Eryx). <a href="http://www.pouet.net/prod.php?which=51450">Midnight
Run</a>, 3rd place winner at NVScene 2008, is definitely of the latter sort, seamlessly
blending 2D and 3D graphics with a bizarre screenplay and excellent music. Although
not trivial by any means, if you’re looking for a technical demo to boggle your friends’
minds with, look elsewhere; Midnight Run is definitely for those not looking at demos
with just an analytic eye.
</p>
        <p>
          <a href="http://www.pouet.net/prod.php?which=51078">
            <img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_other_sizeanti." border="0" alt="bp2009_other_sizeanti." align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_other_sizeanti._3.jpg" width="180" height="100" />
          </a> Proving
my previous point, Euskal 2008 demo compo winner <a href="http://pouet.net/prod.php?which=51078">Size
Antimatters</a> by Andromeda Software Development is precisely the opposite of Mindight
Run: it’s a technological powerhouse with amazing effects and great techno music,
a lot faster paced than Midnight Run and built for a different audience. Along with
Rupture and Stargazer, these are my current “show off your rig” demos. Kudos!
</p>
        <p>
          <a href="http://www.pouet.net/prod.php?which=51144">
            <img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_other_fieldtrip" border="0" alt="bp2009_other_fieldtrip" align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_other_fieldtrip_3.png" width="179" height="100" />
          </a> ½-bit
Cheese are fast becoming my favorite demoscene animators. Their Assembly 2008 wild
compo tour de force <a href="http://www.pouet.net/prod.php?which=51144">Field Trip</a> features
some of the most amazing animation, visual effects, music and direction I’ve ever
seen, taking the already-excellent talents of Maxson and D-Fast (of <a href="http://www.pouet.net/prod.php?which=31591">Realtime
Demo Wannabe</a> fame) to the next level. Groundbreaking!
</p>
        <img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=cdd0991a-287c-4514-9a58-51378ace54b6" />
      </body>
      <title>Breakpoint 2009</title>
      <guid isPermaLink="false">http://www.tomergabel.com/PermaLink,guid,cdd0991a-287c-4514-9a58-51378ace54b6.aspx</guid>
      <link>http://www.tomergabel.com/Breakpoint2009.aspx</link>
      <pubDate>Sun, 03 May 2009 14:22:42 GMT</pubDate>
      <description>&lt;p&gt;
A couple of years back I went to &lt;a href="http://www.tomergabel.com/BREAAAAAAAAAAAAAAAAAAAAKPOIIIIIIIIINT.aspx"&gt;Breakpoint
2007&lt;/a&gt;, which was my first international (read: non-Israeli) demo party, as well
as the first proper demo party I went to in 9 years (the Israeli demo scene had a
couple of small get-together events in &lt;a href="http://en.wikipedia.org/wiki/Kamon,_Israel"&gt;Kamon&lt;/a&gt; in
2000 and later &lt;a href="http://www.tomergabel.com/DemosceneBBQ.aspx"&gt;in 2005&lt;/a&gt;,
but I don’t consider those actual demo parties). Along with &lt;a href="http://profile.myspace.com/index.cfm?fuseaction=user.viewprofile&amp;amp;friendID=163707260"&gt;Bacter&lt;/a&gt; and
my brother Mickey, we three were the only Israelis to be found at the party.
&lt;/p&gt;
&lt;p&gt;
I missed Breakpoint 2008 due to product release pressures, the normal state of affairs
while working for a small startup; I resolved not to miss it again this year, and
made plans with Bacter and Mickey to meet up at the party place. Executive summary:
a&lt;em&gt;mazing&lt;/em&gt; people and &lt;em&gt;amazing&lt;/em&gt; scene spirit. I spent nearly all of the
party outside with a beer in my hand chatting with people. It’s amazing just how much
diversity one can find in such a small group; really the only common grounds is a
general love for art, freedom of expression and the demoscene in particular. One moment
I may be involved in a deep political discussion with a bunch of Germans (greets Streettuff/TRSI),
and the next I’ll be drawing a comparison between English, Dutch, German and Hebrew
with a bunch of Dutch guys (hi &lt;a href="http://www.cosmiq.nl/"&gt;Cosmiq&lt;/a&gt;!) or quoting
Borat with our resident Portuguese &lt;a href="http://scenept.blogspot.com/"&gt;Jeenio&lt;/a&gt;.
While I’m at it, greets to Luise, Julius, Jan and Manu from München, Okkie, the Misfit
of the C64 scene and everyone else with whom I’ve spent with and whose name I can’t
remember :-)
&lt;/p&gt;
&lt;p&gt;
Although some of the compos this year had disappointing turn out (in particular, out
of 25 or so demos maybe two or three are noteworthy) the party was still great fun.
The lack of sponsors did very little to detract from the quality of the party, possibly
the opposite in fact: the event was sponsored out of the entrance fee and donations
made by sceners in the few months before it took place, the net result being that
everyone present was happy to be there and the party really took off. Kudos Breakpoint
organizers!
&lt;/p&gt;
&lt;p&gt;
I recommend watching the following productions from Breakpoint 2009:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.pouet.net/prod.php?which=52647"&gt;&lt;img style="border-right-width: 0px; margin: 0px 10px 0px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="bp2009_mfx" border="0" alt="bp2009_mfx" align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_mfx_3.jpg" width="133" height="100"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.pouet.net/prod.php?which=52647"&gt;Everything is Under Control&lt;/a&gt; by
the ever-prolific &lt;a href="http://www.pouet.net/groups.php?which=168"&gt;mfx&lt;/a&gt; is the
invitation demo to Breakpoint 2009, which brings to the table mfx’s usual array of
amazing 3D graphics, 2D effects, fast code and coherent, though disturbing, design.
With its 1984-esque theme this demo set the theme for the entire party.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.pouet.net/prod.php?which=52995"&gt;&lt;img style="border-right-width: 0px; margin: 0px 0px 0px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="bp2009_hullabaloo" border="0" alt="bp2009_hullabaloo" align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_hullabaloo_3.jpg" width="125" height="100"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
One of the noteworthy demos from Breakpoint 2009 is &lt;a href="http://www.pouet.net/prod.php?which=52995"&gt;Freedom
From State&lt;/a&gt; by Hullabaloo: this demo was entirely written at the party-place by &lt;a href="http://www.slengpung.com/?id=19713&amp;amp;eventid=528"&gt;blala&lt;/a&gt;,
who had been sitting with has MacBook right next to us the whole party and coding
furiously in Haskell. Yes, you heard me right: the demo is written in Haskell, which
(along with the party theme) is why Freedom From State is such an excellent name,
even though the demo itself is quite unremarkable.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.pouet.net/prod.php?which=53003"&gt;&lt;img style="border-right-width: 0px; margin: 0px 10px 0px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="bp2009_lft" border="0" alt="bp2009_lft" align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_lft_733c6fb4-9421-45e8-8361-380c0c4a96c9.jpg" width="125" height="100"&gt;&lt;/a&gt;And
in the wicked cool department, lft (of &lt;a href="http://www.linusakesson.net/scene/craft/"&gt;Craft&lt;/a&gt; fame)
is at it again with another microcontroller-based demo: &lt;a href="http://www.linusakesson.net/scene/turbulence/index.php"&gt;Turbulence&lt;/a&gt; (or
on &lt;a href="http://pouet.net/prod.php?which=53003"&gt;pouët&lt;/a&gt;). This time the custom
hardware platform is based on a Parallax Propeller chip, and the demo itself is both
good (in an oldskool kind of way) and damned technically impressive at that. Kudos!
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.pouet.net/prod.php?which=53021"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_excelence." border="0" alt="bp2009_excelence." align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_excelence._3.jpg" width="133" height="100"&gt;&lt;/a&gt; &lt;a href="http://www.pouet.net/prod.php?which=53021"&gt;Excelence&lt;/a&gt; by
the group with the awesome name BraadWorsten Brigade is probably the world’s first
Excel demo, and proves just how fortunate we are that this is the case :-) Don’t take
me wrong, it’s awesome and even funny, but if no-one else ever makes another VBA demo
it won’t be soon enough…
&lt;/p&gt;
&lt;p&gt;
&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_panda" border="0" alt="bp2009_panda" align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_panda_3.jpg" width="155" height="100"&gt;Breakpoint
2009 has seen a lot of first-time productions by new demo groups; of these my favorite
is &lt;a href="http://www.pouet.net/prod.php?which=53013"&gt;PC-03 ON/OFF&lt;/a&gt; by Panda Cube.
A stylized 3D flyby with subtle shades and nice presentation. I hope these guys go
on to make demos, lots of potential there!
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.pouet.net/prod.php?which=53033"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_systemk" border="0" alt="bp2009_systemk" align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_systemk_3.jpg" width="175" height="100"&gt;&lt;/a&gt; Although
this was not strictly their first production, &lt;a href="http://www.pouet.net/prod.php?which=53033"&gt;Conscious
of Blue&lt;/a&gt; by &lt;a href="http://www.sys-k.net/"&gt;System-K&lt;/a&gt; is another favorite of
mine: a clean, well-designed and imaginative demo that’s very different from the typical
European demo style. No surprises there; these guys come from Japan. I didn’t even
know Japan had an active demoscene, although for the life of me I don’t see why not.
Kudos guys!
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.pouet.net/prod.php?which=52992"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_crush." border="0" alt="bp2009_crush." align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_crush._6.jpg" width="178" height="100"&gt;&lt;/a&gt; While &lt;a href="http://www.pouet.net/prod.php?which=52992"&gt;Crush&lt;/a&gt; by
Anadune and Floppy was not the only enjoyable PC demo at Breakpoint 2009, it was certainly
the most impressive: the right blend of technology, design and music. Borrowing a
leaf from Debris by farbrausch, this demo features plenty of deformable objects and
lots of glow, but is different enough in style, pacing and content to stand out on
its own. Two or three scenes here (such as the one pictured) are simply astounding.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.pouet.net/prod.php?which=52963"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_rebels" border="0" alt="bp2009_rebels" align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_rebels_3.jpg" width="182" height="100"&gt;&lt;/a&gt; It
seems white is the new black, with at least three white-themed productions at this
party alone. With that in mind, &lt;a href="http://www.pouet.net/prod.php?which=52963"&gt;060659&lt;/a&gt; by
Rebels is an excellent (if not groundbreaking), stylized 64k intro that’s always great
to watch. The commodore fan-service in the middle is gratuitous, although the effect
itself is absolutely brilliant. Music is also subpar, but the design more than makes
up for it IMO.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.pouet.net/prod.php?which=53011"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_gottler." border="0" alt="bp2009_gottler." align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_gottler._3.jpg" width="141" height="100"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
One of the most technically impressive C64 demo I’ve ever seen (possibly on par with
Second Reality 64), &lt;a href="http://www.pouet.net/prod.php?which=53011"&gt;Das Gotler&lt;/a&gt; by
Extend and Dekadence hits you from the very first moment (with how the C64 basic window
is cleared). The downside? Horrible, &lt;em&gt;horrible&lt;/em&gt; music.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.pouet.net/prod.php?which=53045"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_julie." border="0" alt="bp2009_julie." align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_julie._3.jpg" width="178" height="100"&gt;&lt;/a&gt; The
last few years have seen some amazing new artistic outlets for the scene, particularly
commercial-quality animations in the compos. Breakpoint 2009 had a couple of fantastic
entries, notably the winning duo. 2nd place animation compo winner &lt;a href="http://www.pouet.net/prod.php?which=53045"&gt;Julie&lt;/a&gt; by
Nuance is both a fantastic artistic expression and a terrific tech demo: with a 300
Euro budget and stuff they had lying around at home, the team tried (rather successfully)
to imitate the bullet-time effect popularized by The Matrix. They’ve also released
a &lt;a href="www.higher-lyrics.de/MakingOfJulie.pdf "&gt;“making of” document&lt;/a&gt; that’s
a fairly interesting read.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.pouet.net/prod.php?which=52928"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_speichergurke." border="0" alt="bp2009_speichergurke." align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_speichergurke._3.jpg" width="178" height="100"&gt;&lt;/a&gt; On
the other end of the spectrum you’ll find JCO’s &lt;a href="http://www.pouet.net/prod.php?which=52928"&gt;Spiechergurke&lt;/a&gt;,
a fake commercial for a new kind of storage product (&lt;a href="http://www.youtube.com/watch?v=cWYxYmsnQjw&amp;amp;feature=related"&gt;watch
with subtitles&lt;/a&gt;). Other than being &lt;em&gt;very&lt;/em&gt; well made it made me laugh my
ass off. I think all in all Julie was the better production, but it was a very hard
toss-up between the two; at any rate I’m glad both won the competition (Speichergurke
took 1st place). 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.pouet.net/prod.php?which=52968"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_jesus" border="0" alt="bp2009_jesus" align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_jesus_3.jpg" width="161" height="100"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.pouet.net/prod.php?which=52968"&gt;Jesus Christ Motocross&lt;/a&gt; by
Nature and Traktor is, other than being a heavy hitting, funny and fun to watch, an
amazingly impressive Amiga demo. Nontrivial effects (all in software, obviously),
psychotic pacing and music and apparently artifact-free code are all fine and dandy,
but the &lt;a href="http://en.wikipedia.org/wiki/Tron_(film)"&gt;Tron&lt;/a&gt; tribute pictured
on the right won my heart.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.pouet.net/prod.php?which=52998"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_lightshaft" border="0" alt="bp2009_lightshaft" align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_lightshaft_3.png" width="178" height="100"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
That said, &lt;a href="http://www.pouet.net/prod.php?which=52998"&gt;Lightshaft&lt;/a&gt; by Elude
is a very strong runner-up; 2nd place Amiga demo compo winner, this demo combines
an incredibly impressive array of 3D scenes with epic design and pacing, terrific
graphics and excellent music. It’s ironic that the two winning Amiga demos were so
impressive whereas the PC demo compo suffered from general lack of enthusiasm and
polish.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.pouet.net/prod.php?which=52938"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_elevated" border="0" alt="bp2009_elevated" align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_elevated_3.jpg" width="178" height="100"&gt;&lt;/a&gt; Easily
the best PC 4k intro I have ever seen, &lt;a href="http://www.pouet.net/prod.php?which=52938"&gt;Elevated&lt;/a&gt; by
Rgba and TBC is also possibly the first to ever get me excited. Astounding visuals,
top notch design and excellent music are only part of it; the picture on the right
really does not do this production justice, and you should definitely watch it in
its entirety at least once to appreciate just how amazingly good a demo can be at
4096 bytes!
&lt;/p&gt;
&lt;p&gt;
Other notable productions from Breakpoint 2009:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.pouet.net/prod.php?which=53004"&gt;Defcon Zero&lt;/a&gt; by Scarab for
the Nintendo DS&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pouet.net/prod.php?which=52983"&gt;Syntax Infinity&lt;/a&gt; by Tulou and
Traktor for the &lt;a href="http://en.wikipedia.org/wiki/MSX#MSX2"&gt;MSX2&lt;/a&gt; platform&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pouet.net/prod.php?which=53000"&gt;fr-065: euphotic&lt;/a&gt; by farbrausch,
a technically impressive but boring and uninspired PC demo&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pouet.net/prod.php?which=53052"&gt;Enigma Sequence&lt;/a&gt; by Approximate,
a 64k intro that’s really close to being awesome. I think a couple more weeks of polish
would’ve really turned this one into a winner, but as is it’s quite raw.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.pouet.net/prod.php?which=52965"&gt;Luminagia&lt;/a&gt; by Loonies, Amiga
4k intro. Not quite as polished as the PC 4ks of the last few years, but damned impressive
never-the-less.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
I also got to watch the following productions on the big screen at Breakpoint, each
of which is a recommended watch:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://pouet.net/prod.php?which=52931"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_other_rupture" border="0" alt="bp2009_other_rupture" align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_other_rupture_5.jpg" width="178" height="100"&gt;&lt;/a&gt; While
Breakpoint was still in progress, &lt;a href="http://pouet.net/prod.php?which=52931"&gt;Rupture&lt;/a&gt; by
Andromeda Software Development won 1st place in the demo party at The Gathering 2009
and with all due reason: this demo is &lt;em&gt;fantastic&lt;/em&gt;. Coherent design, astounding
visuals, excellent pacing and music – it does everything well. For a demoscene fan,
watching this on the big screen was a little like watching Terminator 2 in the theater
for the first time: it gives you a profound sense of “this is what production values
are all about.” The screenshot can’t do it justice, just go watch it already!
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.pouet.net/prod.php?which=51438"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_other_stargazer" border="0" alt="bp2009_other_stargazer" align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_other_stargazer_3.jpg" width="178" height="100"&gt;&lt;/a&gt; Conversely,
NVScene 2008 winner &lt;a href="http://www.pouet.net/prod.php?which=51438"&gt;Stargazer&lt;/a&gt; by
Andromeda and Orb is not as fluently directed but at least as technically impressive.
I simply love Andromeda’s flow, the way they always manage to bring closure to a scene
before moving on to the next effect, even if the two aren’t related in any way. Stargazer
is a slideshow of some of the most impressive effects ever seen in a demo, with astonishing
visuals and excellent techno music; I’m not sure which of the two (Stargazer or Rupture)
I like better, but I guess they each appeal to a different school. Both are definitely
must-see.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.pouet.net/prod.php?which=50131"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_other_masagin3" border="0" alt="bp2009_other_masagin3" align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_other_masagin3_3.jpg" width="178" height="100"&gt;&lt;/a&gt; A
veritable demoscene poster-boy, the NVScene 2008 invitation intro &lt;a href="http://www.pouet.net/prod.php?which=50131"&gt;Masagin&lt;/a&gt; is
the brainchild of &lt;a href="http://www.paniq.org/"&gt;Paniq&lt;/a&gt; (the guy behind &lt;a href="http://www.pouet.net/prod.php?which=25864"&gt;Die
Ewigkeit Schmerzt&lt;/a&gt;). A high quality production with an obvious artistic bent, Masagin
blends excellent music with unique effects and fluid design and is one of the most
engaging demos I’ve seen in years.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.pouet.net/prod.php?which=51450"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_other_midnight2" border="0" alt="bp2009_other_midnight2" align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_other_midnight2_3.jpg" width="178" height="100"&gt;&lt;/a&gt;Andromeda
Software Development demos typically fall into one of two categories: artistically
done 3D slideshows (Dreamchild, Rupture), and technically impressive video art (Evolution
of Vision, Beyond the walls of Eryx). &lt;a href="http://www.pouet.net/prod.php?which=51450"&gt;Midnight
Run&lt;/a&gt;, 3rd place winner at NVScene 2008, is definitely of the latter sort, seamlessly
blending 2D and 3D graphics with a bizarre screenplay and excellent music. Although
not trivial by any means, if you’re looking for a technical demo to boggle your friends’
minds with, look elsewhere; Midnight Run is definitely for those not looking at demos
with just an analytic eye.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.pouet.net/prod.php?which=51078"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_other_sizeanti." border="0" alt="bp2009_other_sizeanti." align="left" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_other_sizeanti._3.jpg" width="180" height="100"&gt;&lt;/a&gt; Proving
my previous point, Euskal 2008 demo compo winner &lt;a href="http://pouet.net/prod.php?which=51078"&gt;Size
Antimatters&lt;/a&gt; by Andromeda Software Development is precisely the opposite of Mindight
Run: it’s a technological powerhouse with amazing effects and great techno music,
a lot faster paced than Midnight Run and built for a different audience. Along with
Rupture and Stargazer, these are my current “show off your rig” demos. Kudos!
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.pouet.net/prod.php?which=51144"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="bp2009_other_fieldtrip" border="0" alt="bp2009_other_fieldtrip" align="right" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Breakpoint2009_E681/bp2009_other_fieldtrip_3.png" width="179" height="100"&gt;&lt;/a&gt; ½-bit
Cheese are fast becoming my favorite demoscene animators. Their Assembly 2008 wild
compo tour de force &lt;a href="http://www.pouet.net/prod.php?which=51144"&gt;Field Trip&lt;/a&gt; features
some of the most amazing animation, visual effects, music and direction I’ve ever
seen, taking the already-excellent talents of Maxson and D-Fast (of &lt;a href="http://www.pouet.net/prod.php?which=31591"&gt;Realtime
Demo Wannabe&lt;/a&gt; fame) to the next level. Groundbreaking!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=cdd0991a-287c-4514-9a58-51378ace54b6" /&gt;</description>
      <category>Demos</category>
    </item>
    <item>
      <trackback:ping>http://www.tomergabel.com/Trackback.aspx?guid=0affc9f7-4ab1-49c2-a08e-4a0d650c0c26</trackback:ping>
      <pingback:server>http://www.tomergabel.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.tomergabel.com/PermaLink,guid,0affc9f7-4ab1-49c2-a08e-4a0d650c0c26.aspx</pingback:target>
      <dc:creator>Tomer Gabel</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I ran a Google image search today, and was surprised to see this:
</p>
        <p align="center">
          <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="google_images_color" border="0" alt="google_images_color" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/GoogleimagesearchWithcolor_E6E9/google_images_color_3.png" width="560" height="207" />
        </p>
        <p>
          <a href="http://googlesystem.blogspot.com/2009/04/google-image-search-color-filter.html">New
feature</a>, hurray! (and may actually prove useful…)
</p>
        <img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=0affc9f7-4ab1-49c2-a08e-4a0d650c0c26" />
      </body>
      <title>Google image search: With color?</title>
      <guid isPermaLink="false">http://www.tomergabel.com/PermaLink,guid,0affc9f7-4ab1-49c2-a08e-4a0d650c0c26.aspx</guid>
      <link>http://www.tomergabel.com/GoogleImageSearchWithColor.aspx</link>
      <pubDate>Mon, 20 Apr 2009 13:25:17 GMT</pubDate>
      <description>&lt;p&gt;
I ran a Google image search today, and was surprised to see this:
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="google_images_color" border="0" alt="google_images_color" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/GoogleimagesearchWithcolor_E6E9/google_images_color_3.png" width="560" height="207"&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://googlesystem.blogspot.com/2009/04/google-image-search-color-filter.html"&gt;New
feature&lt;/a&gt;, hurray! (and may actually prove useful…)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=0affc9f7-4ab1-49c2-a08e-4a0d650c0c26" /&gt;</description>
      <category>Software</category>
    </item>
    <item>
      <trackback:ping>http://www.tomergabel.com/Trackback.aspx?guid=4672705f-4f41-49e2-94b3-8ef57cf25536</trackback:ping>
      <pingback:server>http://www.tomergabel.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.tomergabel.com/PermaLink,guid,4672705f-4f41-49e2-94b3-8ef57cf25536.aspx</pingback:target>
      <dc:creator>Tomer Gabel</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
It seems nothing to do with maintaining this website is as easy or as simple as it
should be. Whenever I switch hosts it’s an uphill struggle to get the site up and
running again; whenever I upgrade <a href="http://www.dasblog.info/">dasBlog</a> to
a newer version I have to learn a lot about how it works, how ASP.NET works, how IIS
is configured etc. It’s enough to make me seriously consider hosting my blog elsewhere
and/or moving to another blogging platform, but the truth is I love dasBlog so much
I simply forget how complex and volatile it can be and have to go through the same
frustrating process whenever something changes.
</p>
        <p>
The way I update my site is usually this:
</p>
        <ol>
          <li>
Ensure I have an up-to-date local mirror of the website. dasBlog keeps all of its
data in XML files, so backing up the website is simply a question of <tt><a href="http://www.gnu.org/software/wget/">wget</a> –-passive-ftp
–m ftp://user:password@website.com</tt>; I have a daily scheduled task to take care
of this. 
</li>
          <li>
Copy the latest mirrored version to a working directory; set the directory up as an
IIS website/virtual directory. 
</li>
          <li>
Test the new working copy to make sure it works. 
</li>
          <li>
Perform whatever modifications are required. 
</li>
          <li>
Test again to make sure that the website works with multiple browsers (this time I
tested with <a href="http://www.google.com/chrome">Chrome</a> 2.0.170.0, <a href="http://www.mozilla.com/firefox/">Firefox</a> 3.1
Beta 3 and <a href="http://www.microsoft.com/windows/Internet-explorer/default.aspx">IE</a> 8) 
</li>
          <li>
Upload the website over FTP using the <a href="http://filezilla-project.org/">FileZilla</a> client.
I always verify that the relevant configuration files and binaries are overwritten
and nothing else.</li>
        </ol>
        <p>
This process generally allows me to test upgrades before uploading them to the “production”
website, as well as provides an easy rollback path if something goes wrong. Thing
is, something <em>always</em> goes wrong. In this case, although nothing’s changed
in the site configuration I started getting <tt>SecurityException</tt>s just after
the upgrade:
</p>
        <blockquote>
          <p>
            <tt>Request for the permission of type 'System.Security.Permissions.SecurityPermission,
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.</tt>
          </p>
        </blockquote>
        <p>
This is one of the least informative error messages I have ever seen. All it tells
me is that a request for some permission is denied; it doesn’t say what permission
was requested, nor by whom (the stack trace seemed to indicate the permission was
asserted from within <tt>System.Diagnostics.Trace</tt>, which doesn’t make much sense).
A quick web search brought me to <a href="http://bencoffman.com/blog/CommentView,guid,06e3fffc-b763-434e-ba10-6c44939c90ed.aspx">this
page</a>, which deals specifically with installing dasBlog on a <a href="http://www.godaddy.com">GoDaddy</a>-hosted
website. Because GoDaddy runs ASP.NET applications under a <a href="http://help.godaddy.com/article/1039">modified
medium trust</a> that allows file-system access only to the virtual directory hierarchy,
the site recommends adding a virtual directory for each of dasBlog’s writable directories
(content, siteconfig, logs); I tried this out and the problem was not resolved.
</p>
        <p>
At this point I was getting desperate, and was willing to try just about anything
to get the site up and running again. Eventually I ran a diff between the site backup
and the newly modified version, and found a new <tt>openidConsumerTrace.txt</tt> file
in the site root. I’ve never seen that one before; where'd it come from? A quick search
showed the following section in the <tt>web.config</tt> file:
</p>
        <div>
          <pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
            <span style="color: #0000ff">&lt;</span>
            <span style="color: #800000">system.diagnostics</span>
            <span style="color: #0000ff">&gt;</span>
            <span style="color: #0000ff">&lt;</span>
            <span style="color: #800000">assert</span>
            <span style="color: #ff0000">assertuienabled</span>
            <span style="color: #0000ff">="false"</span>
            <span style="color: #0000ff">/&gt;</span>
            <span style="color: #0000ff">&lt;</span>
            <span style="color: #800000">switches</span>
            <span style="color: #0000ff">&gt;</span>
            <span style="color: #0000ff">&lt;</span>
            <span style="color: #800000">add</span>
            <span style="color: #ff0000">name</span>
            <span style="color: #0000ff">="OpenID"</span>
            <span style="color: #ff0000">value</span>
            <span style="color: #0000ff">="4"</span>
            <span style="color: #0000ff">/&gt;</span>
            <span style="color: #0000ff">&lt;/</span>
            <span style="color: #800000">switches</span>
            <span style="color: #0000ff">&gt;</span>
            <span style="color: #0000ff">&lt;</span>
            <span style="color: #800000">trace</span>
            <span style="color: #ff0000">autoflush</span>
            <span style="color: #0000ff">="true"</span>
            <span style="color: #ff0000">indentsize</span>
            <span style="color: #0000ff">="4"</span>
            <span style="color: #0000ff">&gt;</span>
            <span style="color: #0000ff">&lt;</span>
            <span style="color: #800000">listeners</span>
            <span style="color: #0000ff">&gt;</span>
            <span style="color: #0000ff">&lt;</span>
            <span style="color: #800000">add</span>
            <span style="color: #ff0000">name</span>
            <span style="color: #0000ff">="fileLogger"</span>
            <span style="color: #ff0000">type</span>
            <span style="color: #0000ff">="System.Diagnostics.TextWriterTraceListener"</span>
            <span style="color: #ff0000">initializeData</span>
            <span style="color: #0000ff">="openidConsumerTrace.txt"</span>
            <span style="color: #ff0000">traceOutputOptions</span>
            <span style="color: #0000ff">="None"</span>
            <span style="color: #0000ff">/&gt;</span>
            <span style="color: #0000ff">&lt;/</span>
            <span style="color: #800000">listeners</span>
            <span style="color: #0000ff">&gt;</span>
            <span style="color: #0000ff">&lt;/</span>
            <span style="color: #800000">trace</span>
            <span style="color: #0000ff">&gt;</span>
            <span style="color: #0000ff">&lt;/</span>
            <span style="color: #800000">system.diagnostics</span>
            <span style="color: #0000ff">&gt;</span>
          </pre>
        </div>
        <p>
A-ha! So the OpenID activity trace log is written to the virtual root, which is not
writable (I set the ACLs to only allow writes to the above three directories). I tried
changing the trace file path to <tt>~/logs/openidConsumerTrace.txt</tt> (which is
a virtual directory and has the appropriate write ACL), but this did not resolve the
problem. At this point I was ready to roll back to the previous version and work on
switching to another (perhaps hosted) blogging platform, and in my despair I simply
commented out the whole <tt>system.diagnostics section</tt>; oddly enough, this resolved
the problem…
</p>
        <p>
Now I know dasBlog is free and there’s little or no point complaining, so I hope this
post helps someone handle the problem. And if anyone from the dasBlog team is reading
this… please be a little more careful with undocumented dependencies?
</p>
        <img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=4672705f-4f41-49e2-94b3-8ef57cf25536" />
      </body>
      <title>dasBlog 2.3 update woes: Dealing with SecurityException</title>
      <guid isPermaLink="false">http://www.tomergabel.com/PermaLink,guid,4672705f-4f41-49e2-94b3-8ef57cf25536.aspx</guid>
      <link>http://www.tomergabel.com/dasBlog23UpdateWoesDealingWithSecurityException.aspx</link>
      <pubDate>Thu, 26 Mar 2009 13:32:08 GMT</pubDate>
      <description>&lt;p&gt;
It seems nothing to do with maintaining this website is as easy or as simple as it
should be. Whenever I switch hosts it’s an uphill struggle to get the site up and
running again; whenever I upgrade &lt;a href="http://www.dasblog.info/"&gt;dasBlog&lt;/a&gt; to
a newer version I have to learn a lot about how it works, how ASP.NET works, how IIS
is configured etc. It’s enough to make me seriously consider hosting my blog elsewhere
and/or moving to another blogging platform, but the truth is I love dasBlog so much
I simply forget how complex and volatile it can be and have to go through the same
frustrating process whenever something changes.
&lt;/p&gt;
&lt;p&gt;
The way I update my site is usually this:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Ensure I have an up-to-date local mirror of the website. dasBlog keeps all of its
data in XML files, so backing up the website is simply a question of &lt;tt&gt;&lt;a href="http://www.gnu.org/software/wget/"&gt;wget&lt;/a&gt; –-passive-ftp
–m ftp://user:password@website.com&lt;/tt&gt;; I have a daily scheduled task to take care
of this. 
&lt;li&gt;
Copy the latest mirrored version to a working directory; set the directory up as an
IIS website/virtual directory. 
&lt;li&gt;
Test the new working copy to make sure it works. 
&lt;li&gt;
Perform whatever modifications are required. 
&lt;li&gt;
Test again to make sure that the website works with multiple browsers (this time I
tested with &lt;a href="http://www.google.com/chrome"&gt;Chrome&lt;/a&gt; 2.0.170.0, &lt;a href="http://www.mozilla.com/firefox/"&gt;Firefox&lt;/a&gt; 3.1
Beta 3 and &lt;a href="http://www.microsoft.com/windows/Internet-explorer/default.aspx"&gt;IE&lt;/a&gt; 8) 
&lt;li&gt;
Upload the website over FTP using the &lt;a href="http://filezilla-project.org/"&gt;FileZilla&lt;/a&gt; client.
I always verify that the relevant configuration files and binaries are overwritten
and nothing else.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
This process generally allows me to test upgrades before uploading them to the “production”
website, as well as provides an easy rollback path if something goes wrong. Thing
is, something &lt;em&gt;always&lt;/em&gt; goes wrong. In this case, although nothing’s changed
in the site configuration I started getting &lt;tt&gt;SecurityException&lt;/tt&gt;s just after
the upgrade:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;tt&gt;Request for the permission of type 'System.Security.Permissions.SecurityPermission,
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.&lt;/tt&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This is one of the least informative error messages I have ever seen. All it tells
me is that a request for some permission is denied; it doesn’t say what permission
was requested, nor by whom (the stack trace seemed to indicate the permission was
asserted from within &lt;tt&gt;System.Diagnostics.Trace&lt;/tt&gt;, which doesn’t make much sense).
A quick web search brought me to &lt;a href="http://bencoffman.com/blog/CommentView,guid,06e3fffc-b763-434e-ba10-6c44939c90ed.aspx"&gt;this
page&lt;/a&gt;, which deals specifically with installing dasBlog on a &lt;a href="http://www.godaddy.com"&gt;GoDaddy&lt;/a&gt;-hosted
website. Because GoDaddy runs ASP.NET applications under a &lt;a href="http://help.godaddy.com/article/1039"&gt;modified
medium trust&lt;/a&gt; that allows file-system access only to the virtual directory hierarchy,
the site recommends adding a virtual directory for each of dasBlog’s writable directories
(content, siteconfig, logs); I tried this out and the problem was not resolved.
&lt;/p&gt;
&lt;p&gt;
At this point I was getting desperate, and was willing to try just about anything
to get the site up and running again. Eventually I ran a diff between the site backup
and the newly modified version, and found a new &lt;tt&gt;openidConsumerTrace.txt&lt;/tt&gt; file
in the site root. I’ve never seen that one before; where'd it come from? A quick search
showed the following section in the &lt;tt&gt;web.config&lt;/tt&gt; file:
&lt;/p&gt;
&lt;div&gt;&lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;system.diagnostics&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;assert&lt;/span&gt; &lt;span style="color: #ff0000"&gt;assertuienabled&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="false"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;switches&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="OpenID"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="4"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;switches&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;trace&lt;/span&gt; &lt;span style="color: #ff0000"&gt;autoflush&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="true"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;indentsize&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="4"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;listeners&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="fileLogger"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="System.Diagnostics.TextWriterTraceListener"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;initializeData&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="openidConsumerTrace.txt"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;traceOutputOptions&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="None"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;listeners&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;trace&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;system.diagnostics&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
A-ha! So the OpenID activity trace log is written to the virtual root, which is not
writable (I set the ACLs to only allow writes to the above three directories). I tried
changing the trace file path to &lt;tt&gt;~/logs/openidConsumerTrace.txt&lt;/tt&gt; (which is
a virtual directory and has the appropriate write ACL), but this did not resolve the
problem. At this point I was ready to roll back to the previous version and work on
switching to another (perhaps hosted) blogging platform, and in my despair I simply
commented out the whole &lt;tt&gt;system.diagnostics section&lt;/tt&gt;; oddly enough, this resolved
the problem…
&lt;/p&gt;
&lt;p&gt;
Now I know dasBlog is free and there’s little or no point complaining, so I hope this
post helps someone handle the problem. And if anyone from the dasBlog team is reading
this… please be a little more careful with undocumented dependencies?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=4672705f-4f41-49e2-94b3-8ef57cf25536" /&gt;</description>
      <category>Development</category>
      <category>Software</category>
    </item>
    <item>
      <trackback:ping>http://www.tomergabel.com/Trackback.aspx?guid=2526021b-46e6-46a7-bbbb-192c59b69e2d</trackback:ping>
      <pingback:server>http://www.tomergabel.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.tomergabel.com/PermaLink,guid,2526021b-46e6-46a7-bbbb-192c59b69e2d.aspx</pingback:target>
      <dc:creator>Tomer Gabel</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I’ve been meaning to change the site’s theme for ages, and as often happens with these
things this gave me an excuse to overhaul various aspects of the site. Here’s a bunch
of stuff that’s changed:
</p>
        <ul>
          <li>
Upgraded to <a href="http://www.codeplex.com/dasBlog">dasBlog</a> 2.3 and tweaked
a whole bunch of settings. Hopefully this will enable all sorts of interesting stuff,
such as <a href="http://openid.net/">OpenID</a> commenter identification and <a href="http://www.cocomment.com/">coComment</a> support.
I’ll post my upgrade experiences separately; 
</li>
          <li>
Switched the theme to a slightly tweaked version of the dasBlog “business” theme by <a href="http://www.delarou.net/">Christoph
De Baene</a> (thanks for the help, <a href="http://www.kenegozi.com/blog/">Ken</a>!); 
</li>
          <li>
Got rid of the “advocacy” section on the right. I still strongly advocate <a href="http://www.mozilla.com/firefox/">Firefox</a>, <a href="http://xiph.org/vorbis/">Vorbis</a> and <a href="http://www.openoffice.org/">OpenOffice.org</a> (among
others), but there doesn’t seem to be much point in placing banners just for that; 
</li>
          <li>
Updated the blog-roll with my latest list.</li>
        </ul>
        <p>
Some code examples on the site may look a little weird on account of the CSS changes;
over the coming days/weeks I’ll be fixing those, as well as recompressing images and
other behind-the-scenes changes that will hopefully make the site look better and
load faster.
</p>
        <img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=2526021b-46e6-46a7-bbbb-192c59b69e2d" />
      </body>
      <title>Long due overhaul</title>
      <guid isPermaLink="false">http://www.tomergabel.com/PermaLink,guid,2526021b-46e6-46a7-bbbb-192c59b69e2d.aspx</guid>
      <link>http://www.tomergabel.com/LongDueOverhaul.aspx</link>
      <pubDate>Mon, 23 Mar 2009 12:38:33 GMT</pubDate>
      <description>&lt;p&gt;
I’ve been meaning to change the site’s theme for ages, and as often happens with these
things this gave me an excuse to overhaul various aspects of the site. Here’s a bunch
of stuff that’s changed:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Upgraded to &lt;a href="http://www.codeplex.com/dasBlog"&gt;dasBlog&lt;/a&gt; 2.3 and tweaked
a whole bunch of settings. Hopefully this will enable all sorts of interesting stuff,
such as &lt;a href="http://openid.net/"&gt;OpenID&lt;/a&gt; commenter identification and &lt;a href="http://www.cocomment.com/"&gt;coComment&lt;/a&gt; support.
I’ll post my upgrade experiences separately; 
&lt;li&gt;
Switched the theme to a slightly tweaked version of the dasBlog “business” theme by &lt;a href="http://www.delarou.net/"&gt;Christoph
De Baene&lt;/a&gt; (thanks for the help, &lt;a href="http://www.kenegozi.com/blog/"&gt;Ken&lt;/a&gt;!); 
&lt;li&gt;
Got rid of the “advocacy” section on the right. I still strongly advocate &lt;a href="http://www.mozilla.com/firefox/"&gt;Firefox&lt;/a&gt;, &lt;a href="http://xiph.org/vorbis/"&gt;Vorbis&lt;/a&gt; and &lt;a href="http://www.openoffice.org/"&gt;OpenOffice.org&lt;/a&gt; (among
others), but there doesn’t seem to be much point in placing banners just for that; 
&lt;li&gt;
Updated the blog-roll with my latest list.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Some code examples on the site may look a little weird on account of the CSS changes;
over the coming days/weeks I’ll be fixing those, as well as recompressing images and
other behind-the-scenes changes that will hopefully make the site look better and
load faster.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=2526021b-46e6-46a7-bbbb-192c59b69e2d" /&gt;</description>
      <category>Personal</category>
    </item>
    <item>
      <trackback:ping>http://www.tomergabel.com/Trackback.aspx?guid=1db72c20-3c25-42ad-93c4-b0551a0fed4e</trackback:ping>
      <pingback:server>http://www.tomergabel.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.tomergabel.com/PermaLink,guid,1db72c20-3c25-42ad-93c4-b0551a0fed4e.aspx</pingback:target>
      <dc:creator>Tomer Gabel</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <u>Update</u> (8 May 2009): Eli Ofek pointed out in the comments a little-known but
effective tool called the <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=80CF81F7-D710-47E3-8B95-5A6555A230C2&amp;displaylang=en">Managed
Stack Explorer</a>. Although it features a basic GUI, it can effectively be a .NET
equivalent of jstack if you add to the path; then it’s just a question of typing <tt>mse
/s /p <i>&lt;pid&gt;</i></tt>. It’s a little slower than jstack but <strong>worlds
better </strong>than the alternative suggested below.
</p>
        <p>
I’ve been working mostly with Java over the last year, and the .NET code I write is
usually limited to interface code between our .NET-based and Java-based components.
A long while away from production-grade code on Windows means I need to brush up on
my production debugging skills.
</p>
        <p>
On today’s menu: thread dumps, or per-thread stack traces if you will. With Java code
(at least starting with Java 5) this is as easy as <tt>jstack <i>&lt;pid&gt;</i></tt>;
with .NET it turns out to be quite a bit more complicated:
</p>
        <ol>
          <li>
Download and install the appropriate <a href="http://www.microsoft.com/whdc/DevTools/Debugging/default.mspx">Debugging
Tools for Windows</a> version for your architecture (x86/x64/Itanium) 
</li>
          <li>
If you need information about Windows function calls (e.g. you want to trace into
kernel calls), download and install the appropriate <a href="http://www.microsoft.com/whdc/DevTools/Debugging/symbolpkg.mspx">symbols</a>.
This isn't strictly necessary if you just want a thread dump of your own code. 
</li>
          <li>
If you need line numbers or any other detailed information, make sure to place your
assemblies' PDB files where the debugger can find them (normally you just put them
next to your actual assemblies). 
</li>
          <li>
Start-&gt;Programs-&gt;Debugging Tools for Windows [x64]-&gt;windbg 
</li>
          <li>
Attach the debugger to your running process using the menu 
</li>
          <li>
Load the SOS extension with "<tt>.loadby sos mscorwks</tt>" for .NET 2.0 ("<tt>.load
sos</tt>" for .NET 1.0/1.1) 
</li>
          <li>
Take a thread dump using "<tt>!eestack</tt>" 
</li>
          <li>
Detach using "<tt>.detach</tt>"</li>
        </ol>
        <p>
Quite a bit of work for something as trivial as a thread dump. I hope .NET diagnostic
and debugging tools improve with time (Process Explorer is definitely a step in the
right direction).
</p>
        <img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=1db72c20-3c25-42ad-93c4-b0551a0fed4e" />
      </body>
      <title>.NET production debugging 101</title>
      <guid isPermaLink="false">http://www.tomergabel.com/PermaLink,guid,1db72c20-3c25-42ad-93c4-b0551a0fed4e.aspx</guid>
      <link>http://www.tomergabel.com/NETProductionDebugging101.aspx</link>
      <pubDate>Thu, 19 Mar 2009 15:16:24 GMT</pubDate>
      <description>&lt;p&gt;
&lt;u&gt;Update&lt;/u&gt; (8 May 2009): Eli Ofek pointed out in the comments a little-known but
effective tool called the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=80CF81F7-D710-47E3-8B95-5A6555A230C2&amp;amp;displaylang=en"&gt;Managed
Stack Explorer&lt;/a&gt;. Although it features a basic GUI, it can effectively be a .NET
equivalent of jstack if you add to the path; then it’s just a question of typing &lt;tt&gt;mse
/s /p &lt;i&gt;&amp;lt;pid&amp;gt;&lt;/i&gt;&lt;/tt&gt;. It’s a little slower than jstack but &lt;strong&gt;worlds
better &lt;/strong&gt;than the alternative suggested below.
&lt;/p&gt;
&lt;p&gt;
I’ve been working mostly with Java over the last year, and the .NET code I write is
usually limited to interface code between our .NET-based and Java-based components.
A long while away from production-grade code on Windows means I need to brush up on
my production debugging skills.
&lt;/p&gt;
&lt;p&gt;
On today’s menu: thread dumps, or per-thread stack traces if you will. With Java code
(at least starting with Java 5) this is as easy as &lt;tt&gt;jstack &lt;i&gt;&amp;lt;pid&amp;gt;&lt;/i&gt;&lt;/tt&gt;;
with .NET it turns out to be quite a bit more complicated:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Download and install the appropriate &lt;a href="http://www.microsoft.com/whdc/DevTools/Debugging/default.mspx"&gt;Debugging
Tools for Windows&lt;/a&gt; version for your architecture (x86/x64/Itanium) 
&lt;li&gt;
If you need information about Windows function calls (e.g. you want to trace into
kernel calls), download and install the appropriate &lt;a href="http://www.microsoft.com/whdc/DevTools/Debugging/symbolpkg.mspx"&gt;symbols&lt;/a&gt;.
This isn't strictly necessary if you just want a thread dump of your own code. 
&lt;li&gt;
If you need line numbers or any other detailed information, make sure to place your
assemblies' PDB files where the debugger can find them (normally you just put them
next to your actual assemblies). 
&lt;li&gt;
Start-&amp;gt;Programs-&amp;gt;Debugging Tools for Windows [x64]-&amp;gt;windbg 
&lt;li&gt;
Attach the debugger to your running process using the menu 
&lt;li&gt;
Load the SOS extension with "&lt;tt&gt;.loadby sos mscorwks&lt;/tt&gt;" for .NET 2.0 ("&lt;tt&gt;.load
sos&lt;/tt&gt;" for .NET 1.0/1.1) 
&lt;li&gt;
Take a thread dump using "&lt;tt&gt;!eestack&lt;/tt&gt;" 
&lt;li&gt;
Detach using "&lt;tt&gt;.detach&lt;/tt&gt;"&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Quite a bit of work for something as trivial as a thread dump. I hope .NET diagnostic
and debugging tools improve with time (Process Explorer is definitely a step in the
right direction).
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=1db72c20-3c25-42ad-93c4-b0551a0fed4e" /&gt;</description>
      <category>Development</category>
    </item>
    <item>
      <trackback:ping>http://www.tomergabel.com/Trackback.aspx?guid=918cc1bd-e8bb-4952-a4e8-f7c06280c577</trackback:ping>
      <pingback:server>http://www.tomergabel.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.tomergabel.com/PermaLink,guid,918cc1bd-e8bb-4952-a4e8-f7c06280c577.aspx</pingback:target>
      <dc:creator>Tomer Gabel</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p align="center">
          <a href="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Andisntitironic_9F28/highscal_irony_2.png">
            <img title="highscal_irony" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="346" alt="highscal_irony" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Andisntitironic_9F28/highscal_irony_thumb.png" width="504" border="0" />
          </a>
        </p>
        <p>
Don’t ya think?
</p>
        <img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=918cc1bd-e8bb-4952-a4e8-f7c06280c577" />
      </body>
      <title>And isn&amp;rsquo;t it ironic</title>
      <guid isPermaLink="false">http://www.tomergabel.com/PermaLink,guid,918cc1bd-e8bb-4952-a4e8-f7c06280c577.aspx</guid>
      <link>http://www.tomergabel.com/AndIsnrsquotItIronic.aspx</link>
      <pubDate>Sun, 15 Mar 2009 09:19:18 GMT</pubDate>
      <description>&lt;p align="center"&gt;
&lt;a href="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Andisntitironic_9F28/highscal_irony_2.png"&gt;&lt;img title="highscal_irony" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="346" alt="highscal_irony" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Andisntitironic_9F28/highscal_irony_thumb.png" width="504" border="0"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Don’t ya think?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=918cc1bd-e8bb-4952-a4e8-f7c06280c577" /&gt;</description>
      <category>Development</category>
    </item>
    <item>
      <trackback:ping>http://www.tomergabel.com/Trackback.aspx?guid=e4daaeff-248e-4457-b74a-693cd44aa882</trackback:ping>
      <pingback:server>http://www.tomergabel.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.tomergabel.com/PermaLink,guid,e4daaeff-248e-4457-b74a-693cd44aa882.aspx</pingback:target>
      <dc:creator>Tomer Gabel</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
So I had to <a href="http://www.tomergabel.com/MovingOn.aspx">find myself a new job</a>.
Delver was about close down, the employees (including yours truly) were handed notices
and the next few weeks were spent searching for my next job. I guess breaks come not
only when you least expect them but also from the least likely direction: <a href="http://www.wikinomics.com/blog/index.php/2009/03/09/is-sears-making-a-move-into-social-commerce/">Delver
was bought by Sears</a> and made into SHC Israel, not to mention the company’s first
overseas headquarters and development center.
</p>
        <p align="center">
          <a href="http://www.searsholdings.com/">
            <img title="38_sears_holdings" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="255" alt="38_sears_holdings" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Lifeisfullofsurprises_F775/38_sears_holdings_3.jpg" width="340" border="0" />
          </a>
        </p>
        <p>
You’ve read correctly: Sears. Not Amazon, not Google, not Microsoft. Delver, a strictly
web-based startup, wasn’t acquired by a web company; not even by a technology company
at that. Instead we were acquired by one of the United States’ <a href="http://en.wikipedia.org/wiki/Sears_Holdings_Corporation">largest
retailers</a>. Why, you ask? Well, with any luck you’ll find out in a few months :-)
</p>
        <img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=e4daaeff-248e-4457-b74a-693cd44aa882" />
      </body>
      <title>Life is full of surprises</title>
      <guid isPermaLink="false">http://www.tomergabel.com/PermaLink,guid,e4daaeff-248e-4457-b74a-693cd44aa882.aspx</guid>
      <link>http://www.tomergabel.com/LifeIsFullOfSurprises.aspx</link>
      <pubDate>Wed, 11 Mar 2009 15:34:35 GMT</pubDate>
      <description>&lt;p&gt;
So I had to &lt;a href="http://www.tomergabel.com/MovingOn.aspx"&gt;find myself a new job&lt;/a&gt;.
Delver was about close down, the employees (including yours truly) were handed notices
and the next few weeks were spent searching for my next job. I guess breaks come not
only when you least expect them but also from the least likely direction: &lt;a href="http://www.wikinomics.com/blog/index.php/2009/03/09/is-sears-making-a-move-into-social-commerce/"&gt;Delver
was bought by Sears&lt;/a&gt; and made into SHC Israel, not to mention the company’s first
overseas headquarters and development center.
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;a href="http://www.searsholdings.com/"&gt;&lt;img title="38_sears_holdings" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="255" alt="38_sears_holdings" src="http://www.tomergabel.com/content/binary/WindowsLiveWriter/Lifeisfullofsurprises_F775/38_sears_holdings_3.jpg" width="340" border="0"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
You’ve read correctly: Sears. Not Amazon, not Google, not Microsoft. Delver, a strictly
web-based startup, wasn’t acquired by a web company; not even by a technology company
at that. Instead we were acquired by one of the United States’ &lt;a href="http://en.wikipedia.org/wiki/Sears_Holdings_Corporation"&gt;largest
retailers&lt;/a&gt;. Why, you ask? Well, with any luck you’ll find out in a few months :-)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.tomergabel.com/aggbug.ashx?id=e4daaeff-248e-4457-b74a-693cd44aa882" /&gt;</description>
      <category>Personal</category>
    </item>
  </channel>
</rss>