<?xml version="1.0"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Yuriy Zubarev</title>
        <link>http://www.yuriy-zubarev.com/</link>
        <description>Personal blog of Yuriy Zubarev</description>
        <language>en-us</language>
        <pubDate>Mon, 30 Apr 2012 08:03:06 -0700</pubDate>
        <lastBuildDate>Mon, 30 Apr 2012 08:03:06 -0700</lastBuildDate>

        
        
        <item>
            <title>Cynical Agile and Scrum Dictionary</title>
            <link>http://www.yuriy-zubarev.com/blog/2012/04/24/cynical-agile-scrum-dictionary.html</link>
            <pubDate>Tue, 24 Apr 2012 00:00:00 -0700</pubDate>
            <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;As a&lt;/strong&gt; reader with a sense of humor,&lt;br /&gt;
&lt;strong&gt;I want&lt;/strong&gt; to find down-to-earth definitions,&lt;br /&gt;
&lt;strong&gt;So that&lt;/strong&gt; I can smile, frown, and reflect.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;dl&gt;
&lt;dt&gt;Agile&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a faith&lt;/li&gt;
	&lt;li&gt;is whatever you want it to be to achieve what you need to achieve&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Agile Certification&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a pilot license that both an eagle and an elephant can easily obtain&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Agile Manifesto&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a document that tipped the balance from analysis paralysis to refactor distractor&lt;/li&gt;
	&lt;li&gt;a proof that principles are often mistaken for rules&lt;/li&gt;
	&lt;li&gt;a license for avoiding documentation, and not having a plan&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Backlog&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a land of forgotten dreams&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;span class=&quot;caps&quot;&gt;BDD&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;an ironic example of a development community building tools for non developers, and ending up being the only ones using them&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Burn Down&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a condition of a Development Team at the end of a Sprint&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Code Review&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;the most common example of Technical Debt&lt;/li&gt;
	&lt;li&gt;a process of curing root rot by trimming leaves&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Continuous Delivery&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a blockbuster sequel to Continuous Integration&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Continuous Integration&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a good idea turned into a semi-automated Continuous Disaster&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Daily Scrum or Daily Stand-up&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;weekly two-hour long meeting&lt;/li&gt;
	&lt;li&gt;the three forbidden questions we never speak of&lt;/li&gt;
	&lt;li&gt;a license not to talk to your team members in between stand-ups&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Development Team&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;is the same as Development Team in waterfall but with an added illusion of empowerment&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;DevOps&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a new breed of professionals who can write &amp;#8220;Hello World&amp;#8221; and deploy it to Heroku&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;span class=&quot;caps&quot;&gt;DDD&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a methodology so advanced that it could only be used once to produce the venerable TimeAndMoney&lt;/li&gt;
	&lt;li&gt;Deadline Driven Development&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Emergent Design&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a process in which parents who read Tarzan abandon their infant in a forest only to see it grow into Bigfoot&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Enterprise Agile&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;an oxymoron&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Evolutionary Architecture&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a process equally capable of producing hummingbirds as well as vampire bats&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Extreme Programming (XP)&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a methodology that was so extreme that it&amp;#8217;s not practiced anymore&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Feedback&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a rare and valuable currency of Agile: everybody wants to receive it, nobody wants to give it away&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Impediment&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a manifestation of organizational culture&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Kanban&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a paradox where the Software Development industry tries very hard to differentiate itself from traditional manufacturing systems by borrowing a method originated in those very systems&lt;/li&gt;
	&lt;li&gt;an example that anything sounds more legitimate if it&amp;#8217;s in Japanese&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Pair Programming&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;an unsolved puzzle for economists, managers, and compensation specialists&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Planning Poker&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a parody on a real poker: everybody bluffs that they don&amp;#8217;t know the hands and the next moves, and pretend to have fun&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Product Owner&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a guardian to protect Stakeholders from an unwashed Development Team&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Refactoring&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a word one says before one sins&lt;/li&gt;
	&lt;li&gt;a source to bail out the global economy if Development Teams had one dollar for every promise to refactor&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Scrum&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a religion&lt;/li&gt;
	&lt;li&gt;a commercialization of Agile&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Scrum/Agile Project Management Software&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a kick in the stomach to the first principle of Agile Manifesto&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Scrum Master&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a person who removes stumbling blocks and in so-doing eventually self destructs&lt;/li&gt;
	&lt;li&gt;a person with a stopwatch, a squeaky toy, and a whistle&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Software Craftsmanship&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;an effort to turn one&amp;#8217;s hobby into a full time job and have one&amp;#8217;s employer to pay for it&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Spike&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a gas pedal for a Velocity of a Sprint&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Sprint&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;an enchanted quest to collect magical Story Points&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Sprint Planning&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a meeting where bells and whistles are prioritized over nuts and bolts&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Sprint Retrospective&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a mystical meeting that is always skipped to give the next Sprint more time&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Sprint Review&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a meeting ignored by Stakeholders&lt;/li&gt;
	&lt;li&gt;a ceremony where a production crew is watching their own movie and is handing themselves the Oscar statuette&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Stakeholders&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;people who secretly hate Agile&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Story Points&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a relative measure of absolute inability to estimate&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;an approach to build a car with hundred air bags and no engine&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Technical Debt&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a measurement of a sentiment of a Development Team&lt;/li&gt;
	&lt;li&gt;a plague ship that always sinks to the bottom of a Backlog&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;User Story&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;an oversimplification of requirements to the level where it&amp;#8217;s embarrassing to read it, so nobody does&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;Velocity&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;the next best thing after real results&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dt&gt;xDD Family of Methodologies&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
	&lt;li&gt;a choir made up of prophets each singing their own hymns&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;/dl&gt;</description>
        </item>
        
        
        
        <item>
            <title>Screaming architecture and the (one and only) architecture diagram</title>
            <link>http://www.yuriy-zubarev.com/blog/2011/12/06/one-and-only-architecture-diagram.html</link>
            <pubDate>Tue, 06 Dec 2011 00:00:00 -0800</pubDate>
            <description>&lt;p&gt;It&amp;#8217;s a wild wild west in the Software Architecture land! Uncle Bob and Simon Brown are not deferring to draw guns and fire bullets wrapped in carefully chosen words. The argument is centered around what is considered to be architecturally significant elements, and how long to defer &amp;#8220;annoying details&amp;#8221;: http://www.infoq.com/news/2011/11/Debate-The-Annoying-Detail. This is almost as raw and exciting as it gets in our land. We should probably get a 30 minute spot on Spike TV.&lt;/p&gt;
&lt;p&gt;I want to go to the start of the argument &amp;#8211; &amp;#8220;Screaming Architecture&amp;#8221; article: http://blog.8thlight.com/uncle-bob/2011/09/30/Screaming-Architecture.html. I understand what Uncle Bob was trying to say, and I believe he had only best intentions in his mind, but I&amp;#8217;m weary of the language of absolutes and concocted examples. Mostly important, the original article perpetuates the notion of &amp;#8220;the one and only architecture diagram&amp;#8221; which is rather harmful.&lt;/p&gt;
&lt;p&gt;The gist of the argument could be extracted from the first couple of paragraphs:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Imagine that you are looking at the blueprints of a building. This document, prepared by an architect, tells you the plans for the building. What do these plans tell you?&lt;/p&gt;
&lt;p&gt;&amp;#8230; As you looked at those plans, there’d be no question that you were looking at a house. The architecture would scream: house.&lt;/p&gt;
&lt;p&gt;So what does the architecture of your application scream? When you look at the top level directory structure, and the source files in the highest level package; do they scream: health care system, or accounting system, or inventory management system? Or do they scream: rails, or spring/hibernate, or asp?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ahh, the building blueprints! Those big, fancy and surprisingly easy to understand technical drawings that we see in spy and heist movies. Here is an entrance, here is a corridor, here is a switch to turn off the alarm, and finally here is a door and a safe! What we don&amp;#8217;t see are real life blueprints of heating, ventilation, cooling, electrical, water supply and sanitation systems. To an untrained eye those blueprints will scream absolutely nothing. Are they unimportant annoying details? Sure, if you don&amp;#8217;t mind spending a winter in Winnipeg with no heating, electricity, toilet, hot water and inadequate wind protection.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When you look at the top level directory structure, and the source files in the highest level package; do they scream: health care system, or accounting system, or inventory management system?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Judging architecture of a software system by top level directory structure is like judging building architecture by a construction site. Construction sites don&amp;#8217;t scream library or school or a city hall. They scream: raw materials. Yes, of course, it would be nice if the top level directory would be called &amp;#8220;amazon&amp;#8221; and the sub-directories &amp;#8211; &amp;#8220;books&amp;#8221;, &amp;#8220;magazines&amp;#8221;, &amp;#8220;electronics&amp;#8221;, etc. We would know right away what we&amp;#8217;re dealing with. The difference between construction industry and software industry is that we invent and deal with levels of abstraction. For a non trivial software system those abstractions could be multiple levels removed from something holistic that would scream back at us. At the level of the source code the abstractions are the raw materials.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If your architecture is based on frameworks, then it &lt;em&gt;cannot&lt;/em&gt; be based on your use cases.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yes it can, if a framework is based on my use cases.&lt;/p&gt;
&lt;p&gt;Enough of nitpicking. The bigger issue here is a pernicious trend similar to &lt;a href=&quot;http://en.wikipedia.org/wiki/Magnum_opus_(alchemy)&quot;&gt;magnum opus&lt;/a&gt;. While alchemists were trying to discover a philosopher&amp;#8217;s stone, we have a tendency to contrive The One And Only Architecture Diagram. As such, it should scream every answer to any question.&lt;/p&gt;
&lt;p&gt;There are many questions to be asked about a software system. What is it for? Who is it for? What does it do? How does it do it (that&amp;#8217;s a loaded one)? What does it consist of? How does it get deployed? How does it handle concurrency? How does it handle outages in dependent services? How does it map to the source code? Let&amp;#8217;s stop trying to pretend we can answer all questions with one architecture diagram. Better yet, let&amp;#8217;s stop avoiding those questions because we cannot address them with one diagram and let&amp;#8217;s &lt;a href=&quot;http://www.amazon.com/gp/product/0321552687/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=fibonaccisolu-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0321552687&quot;&gt;educate ourselves&lt;/a&gt;.&lt;/p&gt;</description>
        </item>
        
        
        
        <item>
            <title>Obscure Inheritance or Homomorphism</title>
            <link>http://www.yuriy-zubarev.com/blog/2011/11/22/obscure-inheritance-or-homomorphism.html</link>
            <pubDate>Tue, 22 Nov 2011 00:00:00 -0800</pubDate>
            <description>&lt;p&gt;Here is a rather simple class diagram:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.yuriy-zubarev.com/images/blog/obscure-inheritance-or-homomorphism.jpg&quot; class=&quot;fcenter&quot; alt=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;At the first glance it makes sense and it&amp;#8217;s rather self explanatory. If you&amp;#8217;re an experienced developer you can actually scream &amp;#8220;bloody murder&amp;#8221; right away, but let&amp;#8217;s take it slow. Here is a hint that something evil is happening here. The rest of a system has an explicit dependency on Displayable interface, which is a good intent, but the details are very ominous. Every implementation block always has the same structure:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;list&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;equals&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;displayble&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()))&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;then&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;paragraph&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;equals&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;displayble&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()))&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;then&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;section&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;equals&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;displayble&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()))&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;then&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This is a complete fiasco in abstraction, plain and simple. The code above might as well look like:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;displayable&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DisplayableList&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;displayable&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DisplayableParagraph&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;then&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;displayable&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DisplayableSectionName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;then&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;   
                
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The only thing that the base interface exposes is getName() method which is akin to Object.getClass() method. It doesn&amp;#8217;t encapsulate any useful behavior, it just provides a hook to query object&amp;#8217;s implementation structure.&lt;/p&gt;
&lt;p&gt;Depending on the original intent, this could be an example of either Obscure Inheritance or Homomorphism or both.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Inheritance is a way to reuse code of existing objects, establish a subtype from an existing object, or both, depending upon programming language support.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this situation there is zero code reuse. Sub-typing is rather superficial: it offers no more than a fact that the classes have getName() method. The method itself is not what consumers care about, but a hook to make further decisions based on essentially internal structure of a class. This is the example of Obscure Inheritance.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In computer science, polymorphism is a programming language feature that allows values of different data types to be handled using a uniform interface.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The word derives from the Greek &amp;#8220;πολυμορφισμός&amp;#8221; meaning &amp;#8220;having multiple forms&amp;#8221;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This case presents the exact opposite: different data types are handled without a uniformed interface. The presence of &amp;#8220;if&amp;#8221; statement per data type is the culprit. This is an example of Homomorphism.&lt;/p&gt;
&lt;h3&gt;Alternative&lt;/h3&gt;
&lt;p&gt;This family of classes deal with tree-like structures to display lists, headings, paragraphs, etc. There is a software design pattern that deals with this exact concern: &lt;a href=&quot;http://en.wikipedia.org/wiki/Composite_pattern&quot;&gt;composite pattern&lt;/a&gt;. The key benefit, as applied to this case, is &amp;#8220;&amp;#8230; lets clients treat individual objects and compositions uniformly&amp;#8221;.&lt;/p&gt;</description>
        </item>
        
        
        
        <item>
            <title>TDD aha moment</title>
            <link>http://www.yuriy-zubarev.com/note/2011/11/09/tdd-aha-moment.html</link>
            <pubDate>Wed, 09 Nov 2011 00:00:00 -0800</pubDate>
            <description>&lt;p&gt;Here is a new tag line for &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt;: &amp;#8220;spend more time with your family&amp;#8221;! &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; is an approach to a software development that ultimately saves time during a construction and maintenance cycles. Want to take your kids to an early game of their favorite team, or disappear for a couple of days with your significant other? If you do, then you cannot afford to waste hours per day restarting your applications and navigating to certain locations just to check a presence of a link. You cannot allow yourself to wait for servers to start up, and do a manual testing. On a more global scale, you cannot be interrupted by a call during a date because of an embarrassing bug in production. If you could shave off 20 minutes from one hour by test automation (not atypical), it runs up to saving about 3 hours during one day, and 2 days in a course of one week! Here is another tag line: &amp;#8220;&lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; &amp;#8211; go home early&amp;#8221;. Emergency calls at night make you drive to the office before the sun-rise? &amp;#8220;&lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; &amp;#8211; stay home late&amp;#8221;. Ok, ok, emergency calls at night cannot be completely eliminated, but the number can be reduced.&lt;/p&gt;
&lt;p&gt;The aha moment came to me one day when I made a tiny silly mistake. I wanted to fix it right away to regain some self-respect. It was one of those errors that you think even a human with a half brain cannot make, so writing a test for such a situation is below you. The fix would be so simple and straightforward and it would take me just 10 seconds to do it. Then I started thinking about starting a server, selecting a set of data that would trigger the exceptional situation and making a &amp;#8220;visual sign-off&amp;#8221; to confirm the correct behavior. This cycle would have taken me about 10 minutes. My enthusiasm started to fade away little by little. Aha! It would take me only 5 minutes to write a failing test, fix the code and re-run the test.&lt;/p&gt;
&lt;p&gt;I went home 5 minutes earlier that day.&lt;/p&gt;
&lt;p&gt;PS: &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; is a serious subject. There are excellent arguments out there why &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; is not just a fad, but an essential software engineering practice. For example, in an article &amp;#8220;What Is Software Design?&amp;#8221; (1), Jack W. Reeves suggests among other things that &amp;#8220;&amp;#8230; it is cheaper and simpler to just build the design and test it than to do anything else&amp;#8221;. It&amp;#8217;s a fascinating read where Jack convinces you that engineering rigor in software is testing.&lt;/p&gt;
&lt;p&gt;I should also recommend &amp;#8220;Neal Ford on Agile Engineering Practices&amp;#8221; (2) from O&amp;#8217;Reilly Media to learn more about &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;(1) http://www.developerdotstar.com/mag/articles/reeves_design.html&lt;br /&gt;
(2) http://shop.oreilly.com/product/0636920020271.do&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;caps&quot;&gt;PSS&lt;/span&gt;: &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; is not all or none proposition. I believe that a goal of 100% test coverage might be harmful if it&amp;#8217;s just a goal by itself without a broader context and a consideration of trade-offs. But that&amp;#8217;s a topic for a separate discussion.&lt;/p&gt;</description>
        </item>
        
        
        
        <item>
            <title>Set-up for Testing Solr backed Scalatra app with SBT and ScalaTest</title>
            <link>http://www.yuriy-zubarev.com/blog/2011/08/20/scala-sbt-solr-scalatest-setup.html</link>
            <pubDate>Sat, 20 Aug 2011 00:00:00 -0700</pubDate>
            <description>&lt;p&gt;We are in a process of rolling out Scalatra application that will be powering our new inventory Web Services at Dominion Marine Media. Everything about the new stack has been new to me, and it took me some time to get the project in a state where an automated unit/functional testing is set up in a decent way. Here I&amp;#8217;m going to share the project set-up and hopefully it will help somebody to save hours or days. I fully aknowledge that there might be a better way of doing the same thing, so you&amp;#8217;re warned.&lt;/p&gt;
&lt;p&gt;Technology stack:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Scala 2.9&lt;/li&gt;
	&lt;li&gt;Solr 3.3&lt;/li&gt;
	&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;SBT&lt;/span&gt; 0.10&lt;/li&gt;
	&lt;li&gt;Scalatra 2.0.0.M4&lt;/li&gt;
	&lt;li&gt;ScalaTest 1.6&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Project layout and the key files:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;my-project\
    |- build.sbt
    |- project\
        |- build.properties
        |- plugins\
            |- build.sbt
    |- src\
        |- main\
            |- scala\
                |- MyResource.scala
                |- SolrServerProvider.scala
            |- webapp\
        |- test\
            |- scala\
                |- EmbeddedSolr.scala
                |- MyResourceTest.scala
                |- ScalatraSolrSuite.scala
            |- resources\
                |- solr\
                    |- solr.xml
                    |- conf\
                        |- schema.xml
                        |- solrconfig.xml
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Project files:&lt;/p&gt;
&lt;p&gt;my-project\build.sbt:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;scala&quot;&gt;&lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;scalaVersion&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;2.9.0&amp;quot;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;resolvers&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;++=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Seq&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&amp;quot;Sonatype Nexus Releases&amp;quot;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;at&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;https://oss.sonatype.org/content/repositories/releases&amp;quot;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;libraryDependencies&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;++=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Seq&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&amp;quot;org.scalatra&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%%&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;scalatra&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;2.0.0.M4&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&amp;quot;org.scalatra&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%%&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;scalatra-scalatest&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;2.0.0.M4&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&amp;quot;org.mortbay.jetty&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;jetty&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;6.1.22&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&amp;quot;org.mortbay.jetty&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;servlet-api&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;2.5-20081211&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;provided&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&amp;quot;org.apache.solr&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;solr-solrj&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;3.3.0&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&amp;quot;org.apache.solr&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;solr-core&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;3.3.0&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&amp;quot;org.apache.solr&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;solr-test-framework&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;3.3.0&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&amp;quot;commons-codec&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;commons-codec&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;1.5&amp;quot;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;seq&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;webSettings&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;:_&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;my-project\project\build.properties:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;properties&quot;&gt;&lt;span class=&quot;na&quot;&gt;sbt.version&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;0.10.1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;my-project\project\plugins\build.sbt:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;scala&quot;&gt;&lt;span class=&quot;n&quot;&gt;resolvers&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;Web plugin repo&amp;quot;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;at&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;http://siasia.github.com/maven2&amp;quot;&lt;/span&gt;    
&lt;span class=&quot;n&quot;&gt;libraryDependencies&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sbtVersion&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;com.github.siasia&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%%&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;xsbt-web-plugin&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;0.1.1-&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;my-project\src\main\scala\SolrServerProvider.scala:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;scala&quot;&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.apache.solr.client.solrj.SolrServer&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;trait&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SolrServerProvider&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;solrServer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;SolrServer&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;my-project\src\main\scala\MyResource.scala:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;scala&quot;&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.scalatra._&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;scala.collection.mutable.&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;ArrayBuffer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.apache.solr.client.solrj.&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;SolrServer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SolrQuery&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.apache.solr.client.solrj.impl.CommonsHttpSolrServer&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.apache.solr.client.solrj.response.QueryResponse&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.apache.solr.common.SolrDocumentList&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;collection.JavaConversions._&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MyResource&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ScalatraServlet&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SolrServerProvider&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    
    &lt;span class=&quot;n&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;/owner/:partyid/boats&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;query&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SolrQuery&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;setQuery&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;my query&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addField&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;myfiled&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rsp&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;QueryResponse&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;solrServer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;docs&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;SolrDocumentList&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rsp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getResults&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// generate appropriate output&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    
    &lt;span class=&quot;k&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;solrServer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;SolrServer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;CommonsHttpSolrServer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;URL to your Solr instance&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;my-project\src\test\scala\EmbeddedSolr.scala:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;scala&quot;&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.apache.solr.client.solrj.SolrServer&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.apache.solr.util.TestHarness&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.apache.solr.core.SolrConfig&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.apache.solr.SolrTestCaseJ4&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.apache.solr.client.solrj.embedded.EmbeddedSolrServer&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.apache.solr.common.SolrInputDocument&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;trait&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;EmbeddedSolr&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SolrServerProvider&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;solrServer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;SolrServer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;InstantiatedOnceEmbeddedSolr&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;solrServer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;addToSolr&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;solr&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;SolrServer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fields&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;, &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;document&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SolrInputDocument&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
        
        &lt;span class=&quot;n&quot;&gt;fields&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addField&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
        
        &lt;span class=&quot;n&quot;&gt;solr&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;solr&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;object&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;InstantiatedOnceEmbeddedSolr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;solr&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;SolrServer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;_&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;solrServer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;SolrServer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;solr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;nc&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;setProperty&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;solr.directoryFactory&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;solr.RAMDirectoryFactory&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dataDir&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;java&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;io&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;File&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getProperty&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;java.io.tmpdir&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getClass&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;-&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;currentTimeMillis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;())&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;dataDir&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mkdirs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;configFile&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getSolrConfigFile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
            &lt;span class=&quot;nc&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;setProperty&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;solr.solr.home&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SolrTestCaseJ4&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;TEST_HOME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;())&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;solrConfig&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;SolrConfig&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;TestHarness&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;createConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getSolrConfigFile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;());&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;TestHarness&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;TestHarness&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dataDir&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getAbsolutePath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;solrConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getSchemaFile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;())&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lrf&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getRequestFactory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;standard&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;version&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;2.2&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;solr&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;EmbeddedSolrServer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getCoreContainer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getCore&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;())&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;solr&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getSolrConfigFile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&amp;quot;&amp;quot;&amp;quot;solrconfig.xml&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
  
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getSchemaFile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&amp;quot;&amp;quot;&amp;quot;schema.xml&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;my-project\src\test\scala\ScalatraSolrSuite.scala:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;scala&quot;&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.scalatra.test.scalatest._&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.scalatest.matchers.ShouldMatchers&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.scalatest.BeforeAndAfterEach&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;trait&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ScalatraSolrSuite&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ScalatraFunSuite&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;BeforeAndAfterEach&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ShouldMatchers&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;EmbeddedSolr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;solr&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;solrServer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
    
    &lt;span class=&quot;k&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;beforeEach&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;solr&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;deleteByQuery&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;*:*&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;addToSolr&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fields&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;, &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;addToSolr&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;solr&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fields&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;my-project\src\test\scala\MyResourceTest.scala:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;scala&quot;&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MyResourceTest&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ScalatraSolrSuite&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;addServlet&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MyResource&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;EmbeddedSolr&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;/*&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    
    &lt;span class=&quot;n&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;get two documents for the owner&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;addToSolr&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;, &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;DocumentID&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;11&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;OwnerPartyID&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;100&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;))&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;addToSolr&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;, &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;DocumentID&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;21&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;OwnerPartyID&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;100&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;))&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;addToSolr&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;, &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;DocumentID&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;31&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;OwnerPartyID&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;101&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;))&lt;/span&gt;
        
        &lt;span class=&quot;n&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;/owner/100/boats&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;status&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;should&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;equal&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;vrCount&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;should&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;equal&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// &amp;quot;vrCount&amp;quot; is our implicit &lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
  
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;And finally the coveted test results:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;$ sbt test

[info] ...
[info] MyResourceTest:
[info] - get two documents for the owner
[info] ... many other tests ...
[info] Passed: : Total 42, Failed 0, Errors 0, Passed 39, Skipped 3
[success] Total time: 24 s, completed Aug 20, 2011 10:28:48 AM
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</description>
        </item>
        
        
        
        <item>
            <title>Airplanes are Obsolete</title>
            <link>http://www.yuriy-zubarev.com/blog/2011/07/11/airplanes-are-obsolete.html</link>
            <pubDate>Mon, 11 Jul 2011 00:00:00 -0700</pubDate>
            <description>&lt;blockquote&gt;
&lt;p&gt;&lt;span class=&quot;caps&quot;&gt;NASA&lt;/span&gt; declared airplanes obsolete and not capable of meeting demands of orbital and interplanetary space flights.&lt;/p&gt;
&lt;p&gt;“We’re not just talking about propeller aircrafts anymore. Even the latest airliners like Airbus A380 and Boeing 747 fall short of modest expectations of simple sub-orbital space flights.” &amp;#8211; commented Joanna Igobins, the official &lt;span class=&quot;caps&quot;&gt;NASA&lt;/span&gt; spokesperson. “How is one supposed to reach an altitude of a mere 100 km if those birds already want to nose dive at 15 km? And even if one could, it would take a heck of a long time doing so at 1,000 km/h” &amp;#8211; she added forcing an awkward smile.&lt;/p&gt;
&lt;p&gt;Chief &lt;span class=&quot;caps&quot;&gt;NASA&lt;/span&gt; technologist John Binogis was even more critical: “Space exploration is not on a fringe anymore. Today you may need to cover a range of only 15,000 km, and the next week you might be thinking of traveling distances of 100 and 1000 times longer. Turbines got you here but they are not going to thrust you to the Mars. It was a good technology for its days and those days are over. The days of Airbus and Boeing are over as well. They are trying to sell us their outdated technologies at the time when everybody knows that rocket-powered spacecrafts can handle bigger payloads at significantly longer distances.”&lt;/p&gt;
&lt;p&gt;“You can trick your grandma but you ain’t tricking me. You cannot call yourself a pilot if you’re still flying those dinosources. It ain’t no cool, it ain’t no hardcore.” &amp;#8211; stated Johny Gobi, a young astronaut with over-developed sense of self-importance.&lt;/p&gt;
&lt;p&gt;Jouahn Gisbinos, a representative from one of &lt;span class=&quot;caps&quot;&gt;NASA&lt;/span&gt; fulfilment partners observed that: “&amp;#8230; we haven’t received a single order for atmospheric crafts in the last 3 years. We are recommending to all of our customers to start looking past conventional airplanes if they don’t want to be left behind”.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sounds silly and far-fetched? Not if you’re in IT and software industry. It ain’t no hardcore if you’re not running NoSQL on the cloud. After all, that what Facebook might be doing, and clearly, we all have the same scalability concerns as they do.&lt;/p&gt;</description>
        </item>
        
        
        
        <item>
            <title>Macleans - Our Biggest News Issue Ever</title>
            <link>http://www.yuriy-zubarev.com/note/2011/05/12/macleans-biggest-issue-ever.html</link>
            <pubDate>Thu, 12 May 2011 00:00:00 -0700</pubDate>
            <description>&lt;p&gt;&lt;img src=&quot;/images/macleans-biggest-ever.jpg&quot; class=&quot;fright&quot; alt=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s a funny coincidence. Last week I unsubscribed from Macleans magazine and earlier this week I received yet another confirmation supporting my decision. Macleans proudly stated on the front: &amp;#8220;Our Biggest News Issue Ever&amp;#8221;.&lt;/p&gt;
&lt;p&gt;The magazine flirted with increasing of its size for awhile already and that&amp;#8217;s exactly what got me thinking of cancelling my subscription. Every time I received a bit fatter issue bragging about gaining extra pounds, I wanted to throw it back at the publisher. If you don&amp;#8217;t want me as your customer, just tell it  directly, I won&amp;#8217;t be insulted. In this day and age when information overload is every day reality, increasing a dose seems to be rather counter-productive. I have blogs, &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt;, twits, wall posts, emails, podcasts, books and e-books to follow, read and provide feedback. Did I mention video casts and presentations? Do you think I have extra time or energy to digest your extra pages? Or even leaf through them? Heck no. I do appreciate reading analysis, investigations  and different takes on popular issues but not at an expense of having to spend more time on it when there is so much medium competing for my eyes and ears.&lt;/p&gt;
&lt;p&gt;Here is an idea, Macleans. I caught myself thinking couple of times that I would be willing to pay more for thinner issues&amp;#8230;&lt;/p&gt;</description>
        </item>
        
        
        
        <item>
            <title>Time Travel</title>
            <link>http://www.yuriy-zubarev.com/blog/toastmasters/2011/05/12/cc-2-time-travel.html</link>
            <pubDate>Thu, 12 May 2011 00:00:00 -0700</pubDate>
            <description>&lt;h4&gt;Competent Communication. Project 2.&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;http://www.yuriy-zubarev.com/images/iceland-1.jpg&quot; class=&quot;fright&quot; alt=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;I always had a very narrow vision of a time travel. Having seen Hollywood movies on this subject, I had a picture of being strapped to a chair and moving convulsively, closing my eyes, letting out a wild scream of pain and then, all of a sudden, feeling woken up hundreds of years in the past. With this vivid imagination there was also a realization of unlikely plausibility of the whole enterprise. I hoped for it, but deep inside I didn’t believe in time travel. This all changed last year&amp;#8230; when I travelled to Iceland.&lt;/p&gt;
&lt;p&gt;I don’t know exactly how many years back I went but the time shift was felt everywhere. It was evident in the place itself and in the people who lived there.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.yuriy-zubarev.com/images/iceland-2.jpg&quot; class=&quot;fright&quot; alt=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;First of all there was this nature as I never saw it before. At the time I was already spoiled by our magnificent West coast. Only more treacherous mountains and more thicker and taller trees could evoke a sense of awe in me. This is what I thought before being completely awestruck by a unique beauty of lava fields, stone deserts and&amp;#8230; moss. Moss! I never thought one could be so amazed by moss. I always pictured it as wet, nasty and bacteria infested stuff leaching to a rock in some cold and dark place. Iceland moss was nothing less but a luxurious carpet with intricate tapestry and bright colors stretching miles and miles in every direction. Countless ship were peacefully grazing all around while being completely oblivious to strong winds, frequent rains and how naturally they fit into this silent picture of perfection.&lt;/p&gt;
&lt;p&gt;Nature surprises didn’t stop there. Next came a lifeless sight of a rock desert. It was cooked by mixing a cooled magma with geothermal chemistry, and produced Moon landscapes right here, on Earth. Every picture of a Moon surface I ever saw, manifested right in front of my eyes, indistinguishable from the real thing, as much as I could judge. It was very clear to me then why &lt;span class=&quot;caps&quot;&gt;NASA&lt;/span&gt; sent Apollo astronauts to train into this very desert.&lt;/p&gt;
&lt;p&gt;Couple of days into my travel around the island I noticed a troubling trend. I saw so much beauty that I was getting de-sensitised by it. Looking at dozens waterfalls on each side of a road made me speechless just yesterday, but today these densely packed sites of amazement didn’t inspire but irritated me. “Oh, please, another breath-taking waterfall! Is it even real?!”. I managed to quell seeds of modern cynicism and went on to be further inspired.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.yuriy-zubarev.com/images/iceland-3.jpg&quot; class=&quot;fright&quot; alt=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;The highlight of my trip was one of the natural wonders of Iceland &amp;#8211; Jökulsárlón, also known as Glacier Lagoon. It presented a picturesque parade of ghostly and luminous blue ice-bergs. Ever since I was a child, I wanted to see and touch an ice-berg. I don’t remember the root of this desire, but I always wanted to stand next to a still and cold giant and touch it with an open palm. There is something majestic about them. Describing them as chunks of frozen water is so simplistic and unimaginative. The sheer size, unlimited combination of forms and ever so intricate reflections of light, make those boulders look like pedestals for all the drama and triumph unfolded during tens of thousands of years as nature shaped itself. I took about 500 pictures of the lagoon and I still cannot reduce them to a manageable number &amp;#8211; no two pictures are alike when you are admiring something as harmonious as a lake full of ice-bergs.&lt;/p&gt;
&lt;p&gt;No travel story could be complete without mentioning people you meat on your journey.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.yuriy-zubarev.com/images/iceland-4.jpg&quot; class=&quot;fright&quot; alt=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;One evening, after a regretful whale watching trip where I disgorged plenty, I was sitting in a restaurant in a northern-most harbour, together with other tourists. We met just earlier that day and a conversation was warm and engaging. What struck me the most, is that the island that is relatively young in geological terms, and therefore somewhat situated back in time, drew people who wanted to go back in time themselves. I remember this young woman from Germany earnestly trying to understand the appeal of Face-book but not able to put her finger on it. In her opinion, it just didn’t have the same punch as sending a friend a physical postcard from a remote place, or picking up a phone and having a conversation. She then went on to describe advantages of a traditional film camera. Limited number of available shots makes you  think twice about a composition and it is the best antidote from being a shutter-happy. Next she completely won me over with her description of a time when she waits for pictures to be developed in a photo studio. Not knowing how pictures are going to come out and discovering them one by one &amp;#8211; is a joy, she explained, that can only be matched  by a joy of taking these pictures in the first place.&lt;/p&gt;
&lt;p&gt;I will always remember native Icelanders by two aspects. First, their language seemed to be made up entirely form consonants; and second, their faces were a living example of natural purity. I am in a danger of over generalizing here or making observations on a relatively small sample, but I cannot forget the admiration I experienced while looking into their eyes. There was a complete absence of anxiety and a pointless haste. It was so refreshing. All I saw was kindness and serenity&amp;#8230; And how difficult is it to remain calm when red signals on many traffic lights have a heart shape?! I dare you to have a road rage when you look at a heart. How difficult is it to be placid if you can leave your bike outside of your apartment building during night, unsecured and fully assembled, and find it in exactly same conditions the next morning?&lt;/p&gt;
&lt;p&gt;I don’t if whether it’s a place that makes people who they are or the other way around, but there is something magical about Iceland. It draws me back, and I hope, that may be in 10 years, I will re-discover it again &amp;#8211; the secret of a time travel.&lt;/p&gt;</description>
        </item>
        
        
        
        <item>
            <title>Reach Your Escape Velocity</title>
            <link>http://www.yuriy-zubarev.com/note/ecorner-stanford/2011/05/10/reach-your-escape-velocity.html</link>
            <pubDate>Tue, 10 May 2011 00:00:00 -0700</pubDate>
            <description>&lt;p&gt;Source: &lt;a href=&quot;http://ecorner.stanford.edu/authorMaterialInfo.html?mid=2725&quot;&gt;http://ecorner.stanford.edu/authorMaterialInfo.html?mid=2725&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This notion of the problem of we&amp;#8217;re stuck and it just &amp;#8212; I have to say it&amp;#8217;s virtually universal. People kind of get, look, we have a successful franchise but you can&amp;#8217;t stand still intact between technology and globalization. Things are really, really moving. Now, that&amp;#8217;s great news for opportunity but it&amp;#8217;s also for people that stand still, it&amp;#8217;s a threat. As our friends at Boarders, for example, discovered this year and numerous other companies. So everybody gets that they&amp;#8217;ve got to engage growth. It&amp;#8217;s not like, hey, I&amp;#8217;ve got an idea for you. They got it. What they don&amp;#8217;t like talking about which they universally acknowledge is there is massive internal resistance to moving resources away from established activities into new activities; massive.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;So the problem is the new stuff, it&amp;#8217;s not that there&amp;#8217;s not new stuff, there&amp;#8217;s tons of new stuff but it doesn&amp;#8217;t ever reach materiality. Meaning, in never reaches like being 10 or 20% of the total company&amp;#8217;s revenue. It gets announced, it gets started and then somewhere along the line it dies from the vine. And so that&amp;#8217;s where we came with this notion. These are questions that basically our clients ask us. That&amp;#8217;s where the title came from. How can we achieve a escape velocity? How do we free ourselves from the pull of the past? So just to make clear, this is not a trivial problem nor is it trivial companies that have struggled with this problem.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;So the question then becomes, what the heck is going on?&lt;/p&gt;
&lt;p&gt;So what&amp;#8217;s the mistake we keep making over and over again? So it turns out the way that the global management system works, and largely this is a management system that was developed in the United States, but it&amp;#8217;s become completely global. It&amp;#8217;s a performance-oriented management system. That&amp;#8217;s how people get compensated in large corporations.&lt;/p&gt;
&lt;p&gt;And we&amp;#8217;re good at managing it, but here is the second sense, power fuels performance and performance consumes power. That is not visible in a large corporation.&lt;/p&gt;
&lt;p&gt;Well, consuming power in most compensation systems, in most corporations is free. And further more, creating power, say around a new strategy, is not compensated. So I get compensated for consuming power for my performance. I do not get compensated nor do am I held accountable except in the most kind of qualitative ways for generating power. So why would you be surprised that large organizations systematically consume their power?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;And so what the &amp;#8212; we created a model called the hierarchy of powers. It&amp;#8217;s kind of a framework of frameworks. And the intention of this hierarchy is to let people sort out the power equation in a set of levels that make sense. So the hierarchy of power is just five powers but you talk about each power separately from the other four and you talk about them in sequence from top to bottom.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;#8230; category power has to do with how fast are the categories that you are in growing? Because if you&amp;#8217;re in a category that&amp;#8217;s growing 100%, even if you&amp;#8217;re kind of a doofus, you&amp;#8217;re probably going to do pretty well this year. And investors aren&amp;#8217;t stupid. By the way, vice versa, if you&amp;#8217;re in a category that&amp;#8217;s growing at 4%, you have enormous pressure on you to make sure you make every penny of your earnings. And it&amp;#8217;s very, very hard for you to do much better than that because the category is giving you no lift whatsoever. You can take share in a category that&amp;#8217;s not growing but not forever. Eventually, you run into a wall. So investors at the margin would prefer your company to be in high-growth categories, not low growth. So a company like General Electric would routinely sell off low-growth businesses in order to get capital to buy high-growth businesses and they would kind of migrate the footprint of the corporation going forward. That&amp;#8217;s in order to have more category or power. You can hold your company accountable to what category is you&amp;#8217;re in. The board of directors can hold the management team accountable to that.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The next one is company power. So in the categories you&amp;#8217;re in, how powerful? Do you control your own destiny or somebody else is calling the tune and you&amp;#8217;re just trying to keep step and keep pace with them? This is market share. This is Jack Welch saying, you want to be number one or number two or you don&amp;#8217;t want to play because you wouldn&amp;#8217;t have enough company power to get the return on being in that category. You ought to get out of that category and get into some categories where you can be number one or number two. So it&amp;#8217;s about power.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The third one is market power that has to do with, are you in the markets that are the fastest growing segments or the more strategic segments? Now, category and market sometimes get confused but &lt;strong&gt;category is defined by a group of competitors and markets are defined by a group of customers.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So a market is about getting a group of customers and the idea here is a little bit like winning primaries for a presidential nomination. You want to win in New Hampshire primary. There are not very many delegates in New Hampshire but is a very strategic primary to win. And in markets, there are always segments that are early bellwether segments that are different for different markets, different technology, different categories, well, there&amp;#8217;s always some. And so winning those early or maybe there&amp;#8217;s a segment that&amp;#8217;s in transition where the segment like this particular part of the economy is completely being disrupted by the Internet this year so whatever they&amp;#8217;re going to buy, they&amp;#8217;re going to buy this year. So get in there and be successful if it&amp;#8217;s the kind of stuff that you sell. That&amp;#8217;s what market power is about; winning segment shares in the critical segments.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Offer power is based on how compelling is your offer compared to the rest. We&amp;#8217;re talking about differentiation. How different is it, but then also how comparable is it to the &amp;#8212; are you living up to the norms of your category?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;And then execution power is, when you guys set yourself out to do something, when you&amp;#8217;re going to enter a new category, when you&amp;#8217;re going to do one of these transformational initiatives, can you actually get it done or do you find yourself kind of redoing it?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;#8230; One of the things Steve is about is he cares about power and he assumed performance will take care of itself. Jeff Bezos is the same way to Amazon, that&amp;#8217;s why periodically, he does stuff that just drive the shareholders crazy because he gives away performance in the short-term because he says, I want the power.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;OK, great, great, great. What do you do? How do we start?&lt;/p&gt;
&lt;p&gt;You can start at any point in this hierarchy. You can start with the category power level which tends to be we need to look at portfolio. We tend to have way too much money in aging categories with the Boston Consulting Group calls, cash cows and we don&amp;#8217;t have enough rising stars. So that could be the problem. Or we can say, no, it&amp;#8217;s a company power problem and the problem is we can never &amp;#8212; first of all, we can kill nothing and second of all, we can never really make any big bets. Every big bet we hedge and after a while we&amp;#8217;re like the person at the roulette table who put the chip on every single square. So we win every time. Except, we just lose money. So on the market focus, we can actually go after markets in a directive way. It turns out it&amp;#8217;s extremely hard for large corporations to go after niche markets. But it&amp;#8217;s critical. It&amp;#8217;s critical because otherwise, you&amp;#8217;ll end up coming in second or third in every primary in the entire election and you don&amp;#8217;t get nominated, right?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;There are ways to organize inside a large company to create &amp;#8212; carve out an entrepreneurial space not just to incubate innovation because all of them do that but to actually go from an incubated innovation to a material business. That&amp;#8217;s when they all get killed and so there&amp;#8217;s a whole thing around execution power and organization for dealing with that.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;In general, by the way, venture investing is about power and public exchange investing is about performance if you think about it. Because in a venture-backed company, there&amp;#8217;s not enough revenue to really say the performance is the game changer. It&amp;#8217;s power is the game changer in venture.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;I am now &amp;#8212; what is amazing about tech by the way, is that product managers &amp;#8212; the unit of wealth creation in tech all of my life has been the product. Now increasing the service as a sort of invisible product. The product and product management is largely conducted by people in the first 10 years of employment. So all of a sudden, relatively early in a career, unlike most professions, most other industries, you actually have your hand on the tiller that changes that fate of your company. So it&amp;#8217;s an amazing privilege to work in a high tech company because the amount of power you get short &amp;#8212; particularly if you can get into this role of product marketing and product management.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;And whenever you charter a single team in a single project stream to do two or more, you&amp;#8217;re screwing up. And I would say that 99% of all the project streams I see are combinations of those three things which is a fairly high ratio for screwing up.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;#8230; Pretty obvious and pretty exciting and by the way, every engineer in the world wakes up thinking that&amp;#8217;s what I do for a living. I&amp;#8217;m the smartest person on the planet and I will be able to demonstrate it. Neutralize, catch up with the competition, nobody likes to do this. Nobody likes to do this. But they get &amp;#8212; but it&amp;#8217;s part of being an adult.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;So differentiation. First of all, well, it&amp;#8217;s different but the thing is if you&amp;#8217;ve ever actually noticed the world, everything is different. There&amp;#8217;s no two things that are the same, right? So different isn&amp;#8217;t a big deal, OK?&lt;/p&gt;
&lt;p&gt;This differentiation along a vector value, OK, so how much differentiation do we have and can we go beyond the limits of the competitive set?&lt;/p&gt;
&lt;p&gt;So you can&amp;#8217;t just say I&amp;#8217;m different, you have to say I&amp;#8217;m also meeting the norms of the category in the stuff that I&amp;#8217;m not trying to differentiate&amp;#8230;&lt;/p&gt;
&lt;p&gt;So the net differentiation is what &amp;#8212; as an offer manager, product manger, service manger, that&amp;#8217;s what I want you to think about. Every year my power increased because my net differentiation increased relative to my competitive set in my category.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;There&amp;#8217;s a sentence in that thing, the new &lt;span class=&quot;caps&quot;&gt;CEO&lt;/span&gt; of Nokia, he writes a memo that&amp;#8217;s a public memo to the world which says how is it possible that Apple came out with an iPhone in 2007 and Nokia does not have response? Would you want to answer that question? Gee, Steven, I wasn&amp;#8217;t the product manager.&lt;/p&gt;
&lt;p&gt;But the point was &amp;#8212; so ask yourself why. Why do you think? I don&amp;#8217;t know but my bet is because the engineers at Nokia were too proud to neutralize because they wanted to differentiate. They wanted to over leap the over leaper. And when you do that, you leave year after year after year of no effective response in the market which is absolutely fatal.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Google apps versus Microsoft Office, Google is not trying to beat Microsoft Office, it&amp;#8217;s just trying to annoy them. It&amp;#8217;s just trying to keep them busy and to kind of keep something going. Yahoo on the other hand, was more like Nokia. Yahoo wanted to overtake Google Search. It was kind of like Captain Ahab and the white whale and it was a quest. And it was a fatal quest. And so what Carol had to do is get in and sell off the business because she had to free her company&amp;#8217;s future from the pull of the past. That was a really, really important thing for her to do.&lt;/p&gt;
&lt;p&gt;Apple and Kindle, so what did Apple do with Kindle? It co-opted it. Kindle &amp;#8212; most people &amp;#8212; most read their Kindle books on iPads because they co-opted it. Whereas the borders and their thing&amp;#8230;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;#8230; This is what Microsoft does better than any company in the world by about an order of magnitude and maybe not so much anymore as they used to. But this is the thing, this is why Microsoft could routinely let anybody innovate anything and say I&amp;#8217;m going to take it away from you. I&amp;#8217;m going to take it away. I&amp;#8217;m going to be good enough very quickly and then eventually I&amp;#8217;m going to assimilate it either Windows or Office. One of the two. All life will be part of either Windows or Office.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;OK, so this leads to a concept we call one playbook per project. Now, the way you fund things in the world probably you have one budget that has to be split among those three things. All I&amp;#8217;m asking you to do is don&amp;#8217;t tie the differentiation train to the neutralization train or either of them to the optimization train. Have three trains manage them separately. You manage it one for speed, one for distance and one for fuel.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;#8230; Or optimization &amp;#8212; optimization projects that don&amp;#8217;t really go after the sacred cows. So you optimize everything except sales and engineering. So you just beat the &amp;#8212; out of the people that are in the cafeteria but if it&amp;#8217;s an engineer or sales person, oh, wow, I can&amp;#8217;t touch those two. Well, 85% of your head count it&amp;#8217;s 100% of the things that are making the difference, so it&amp;#8217;s like crazy enough to optimize important things.&lt;/p&gt;
&lt;/blockquote&gt;</description>
        </item>
        
        
        
        <item>
            <title>Developing Products that Save Lives</title>
            <link>http://www.yuriy-zubarev.com/note/ecorner-stanford/2011/05/07/developing-products-that-save-lives.html</link>
            <pubDate>Sat, 07 May 2011 00:00:00 -0700</pubDate>
            <description>&lt;p&gt;Source: &lt;a href=&quot;http://ecorner.stanford.edu/authorMaterialInfo.html?mid=2716&quot;&gt;http://ecorner.stanford.edu/authorMaterialInfo.html?mid=2716&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I have to say I give the company a lot of credit because, basically, I think it has paid off for them. But it took me two years before I had any idea what I was even doing in business. I mean, I knew about science but it really was a steep learning curve but not something that happens overnight.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;One of the huge differences is, I found that in business, you actually get feedback on how you&amp;#8217;re doing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Well, gee, people say I&amp;#8217;m aloof, dismissive and arrogant and I can understand this. I mean, my parents said that. My wife says that, my colleges at Stanford say that. You say that. I cannot figure out how you&amp;#8217;re all wrong in the same way.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;So, I would say, from the concept of &amp;#8220;maybe this molecule would work in this disease&amp;#8221; to actually marketing the drug, well, it depends. If it went incredibly fast it could be ten years. It&amp;#8217;s more like 15 years and the average cost is about $1.5 billion to get it to the market. Now the $1.5 billion includes the failures. So that&amp;#8217;s taken into account. So how many make it? That varies from company to company. I would say probably on the average 10 percent make it. For us, it&amp;#8217;s probably more like 25 percent. But I think the industry is going to do much, much better in the next decade. And the reason is that there&amp;#8217;s been an explosion in knowledge about biology.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;I voted for Obama that is charging Genentech $550 million this year to pay for Obama care. Now, where do we get $550 million? We fired $550 million worth of people. Where else are we going to get the money? So now they don&amp;#8217;t have jobs or health care.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;What are the things do you wished you have learned when you were in school? What would have been the most valuable things that would have helped you really hit the ground running when you were walking into a really important leadership position?&lt;/p&gt;
&lt;p&gt;People ask that and I think any time that I would have spent getting an &lt;span class=&quot;caps&quot;&gt;MBA&lt;/span&gt;, for example, wouldn&amp;#8217;t have been worth it. I really think that the reason I was hired is because I was a really, really good scientist and taking-you notice the was-any time away from that would have frankly been a mistake, I think. And the only reason our company will be successful in the future is if the right technical decisions are made. And people don&amp;#8217;t get that. It all depends on the science. If we pick the wrong target, if we make the wrong molecule, if we choose the wrong disease, we try and develop it and it doesn&amp;#8217;t or run over and over again, the company is finished. It&amp;#8217;s all driven by the scientific decisions that are made at the early stages and through development. You can have all&amp;#8230; I mean we need the commercial folks. So they&amp;#8217;re terrific, I love going to the sales meeting and the manufacturing people and the finance folks, that&amp;#8217;s all absolutely critical. But if the science is wrong, there&amp;#8217;s no foundation, there&amp;#8217;s no basis for the company. So I think just becoming the absolute best scientist that I could be in being just so focused on that was actually the best use of my time to be the best head of R&amp;amp;D. So, nothing. Nothing different.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;How much science is needed between your job versus the management and leadership skills?&lt;/p&gt;
&lt;p&gt;You can go really far in life with a little common sense. The kinds of leadership issues that come up, I just sort of resort back to my roots and my beliefs and why I&amp;#8217;m at Genentech. If you keep patients in mind, and if you&amp;#8217;re always doing the best thing for patients in your decisions, usually, it&amp;#8217;s just pretty clear what to do. So it&amp;#8217;s sort of hard for me to say much more than that. And by the way, I have a small lab. So I have every Tuesday at noon, a lab meeting. And most of the higher level management people at Genentech have a lab. I think that&amp;#8217;s really, really important. Otherwise, it gets too easy. You go sit and some big rooms and when one makes a presentation, you say, &amp;#8220;Do this, spend some money here, do that,&amp;#8221; You forget how hard it is to actually make an experiment work unless you&amp;#8217;re sitting with your lab group. And then when you see how &amp;#8220;Jeez, it didn&amp;#8217;t work again. What are we going to do?&amp;#8221; It keeps you grounded in reality. So I think that&amp;#8217;s extremely important and I&amp;#8217;m extremely proud of the fact that the high level scientist at Genentech still have labs and white papers and so on.&lt;/p&gt;
&lt;/blockquote&gt;</description>
        </item>
        
        
        
        
        
        
        <item>
            <title>Performance Testing - Starting Out</title>
            <link>http://www.yuriy-zubarev.com/blog/2011/03/17/performance-testing-starting-out.html</link>
            <pubDate>Thu, 17 Mar 2011 00:00:00 -0700</pubDate>
            <description>&lt;p&gt;We recently started implementing performance testing procedures for our products in my company. The trigger wasn&amp;#8217;t an execution of some thought-out plan but a desperate measure following a service disruption unfortunately. I always thought that we had more time. I have to admit, it was very naive and irresponsible thinking. Regardless of the precursor, here are some initial observations after I started looking for performance testing practices.&lt;/p&gt;
&lt;p&gt;First of all, in comparison to all resources dedicated to scalability and NoSQL, the web felt semi abandoned when it came to performance testing. The reason for this comparison is not arbitrary. My line of thinking was that before jumping on scalability initiatives, and before moving from relational databases to document ones to address performance concerns, for example, people would first need to show that those are, in fact, concerns. I thought I wouldn&amp;#8217;t have any problems locating first hand accounts on how teams approached performance testing and found pressing needs to tackle scalability and try out NoSQL. No such luck. I hope folks choose NoSQL because it&amp;#8217;s a better tool for certain jobs, not because it solves imaginary performance issues.&lt;/p&gt;
&lt;p&gt;Search results for performance testing tools was a list of well known and old suspects. Some of them weren&amp;#8217;t updated in years. By itself it&amp;#8217;s not such a bad thing. The tools could have matured and reached a level where frequent updates weren&amp;#8217;t necessary any longer. The biggest surprise was a discovery of almost perfect vacuum in place of how-tos and tutorials on integration performance testing as a part of an application lifecycle management. No set-ups shared, no words of wisdom, no proverbial best practices.&lt;/p&gt;
&lt;p&gt;There are two reasons that I can think of to explain this:&lt;/p&gt;
&lt;p&gt;1) Performance testing is bordering art and magic, and it&amp;#8217;s very dependent on the application or system being tested. There may be hundreds of companies in my city only, that do this every day, but their set-ups are so custom that they don&amp;#8217;t feel sharing any details would benefit anybody else.&lt;/p&gt;
&lt;p&gt;2) Performance testing is not really common. Applications go down generating wake up calls  to development and operation teams, who them scramble in haste to fix the problem.&lt;/p&gt;
&lt;p&gt;What is your experience?&lt;/p&gt;</description>
        </item>
        
        
        
        
        
        
        <item>
            <title>Frantic pace of technology</title>
            <link>http://www.yuriy-zubarev.com/note/2010/07/23/frantic-pace-of-technology.html</link>
            <pubDate>Fri, 23 Jul 2010 00:00:00 -0700</pubDate>
            <description>&lt;p&gt;The latest issue of &amp;#8220;Computer&amp;#8221; has an informative article &amp;#8220;Simplicity as a Driver for Agile Innovation&amp;#8221; with the following gem:&lt;/p&gt;
&lt;blockquote&gt;&amp;#8230; The frantic pace of technology provides its own chaos: before a certain technology reaches maturity and can repay the enormous investments for its development and production, a newer option attracts attention with novelty and fresh promises.&lt;/blockquote&gt;
&lt;p&gt;This quote succinctly describes the environment of IT and underlines my own 10+ years of experience. At every point and with almost every decision we have to balance out maturity of incumbent products and promises of new ones.&lt;/p&gt;
</description>
        </item>
        
        
        
        <item>
            <title>Ominous hashCode() method</title>
            <link>http://www.yuriy-zubarev.com/note/2010/03/05/ominous-hashcode-method.html</link>
            <pubDate>Fri, 05 Mar 2010 00:00:00 -0800</pubDate>
            <description>&lt;p&gt;I just spent couple of hours debugging a subtle problem only to pinpoint the root cause to an erroneous implementation of &lt;strong&gt;hashCode()&lt;/strong&gt; method. It was a nice refresher in Java basics. Here is the culprit:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;  &lt;span class=&quot;nd&quot;&gt;@Override&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;hashCode&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;hashCode&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;code&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;hashCode&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;());&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Any guesses?&lt;/p&gt;</description>
        </item>
        
        
        
        <item>
            <title>CAS - Non Sharable Credentials</title>
            <link>http://www.yuriy-zubarev.com/blog/2010/02/26/cas-non-sharable-credentials.html</link>
            <pubDate>Fri, 26 Feb 2010 00:00:00 -0800</pubDate>
            <description>&lt;p&gt;We have a requirement that a certain type of users cannot use the same credentials to have two or more simultaneous active sessions. I called this feature as &amp;#8220;Non Sharable Credentials&amp;#8221;. Probably there is a better name for it, but this one will do.&lt;/p&gt;
&lt;p&gt;I first posted a question to &lt;a href=&quot;http://www.mail-archive.com/cas-user@lists.jasig.org/msg03195.html&quot;&gt;cas-user&lt;/a&gt; mailing list and got a rather encouraging response. Even though &lt;a href=&quot;http://www.jasig.org/cas&quot;&gt;&lt;span class=&quot;caps&quot;&gt;CAS&lt;/span&gt;&lt;/a&gt; doesn&amp;#8217;t provide such functionality right out of the box, it seems possible to search ticket registries to find existing ticket for a given &lt;a href=&quot;http://en.wikipedia.org/wiki/Security_principal&quot;&gt;principal&lt;/a&gt;. Luckily we have &lt;span class=&quot;caps&quot;&gt;JPA&lt;/span&gt;-backed registry and at the time I didn&amp;#8217;t quite understand why Scott Battaglia cautioned against loading the entire table of tickets. Couldn&amp;#8217;t I just craft an appropriate &lt;span class=&quot;caps&quot;&gt;JPA&lt;/span&gt; query?&lt;/p&gt;
&lt;p&gt;Upon further inspection of database table-backed ticket registries it was quickly discovered that a principal for a ticket doesn&amp;#8217;t have a dedicated column. Instead, this information is a small part of a serialized object stored in a &lt;span class=&quot;caps&quot;&gt;BLOB&lt;/span&gt; field. I couldn&amp;#8217;t query for it directly, so I had no choice but load records into memory, de-serialize the &lt;span class=&quot;caps&quot;&gt;BLOB&lt;/span&gt; field and then check for my principal until the match is found. This approach could seriously slow down authentication process and therefore was quickly ruled out.&lt;/p&gt;
&lt;p&gt;I really needed an efficient way to search for tickets belonging to a specified principal. I didn&amp;#8217;t want to modify &lt;span class=&quot;caps&quot;&gt;CAS&lt;/span&gt; code and change structure of database tables for the ticket registries. There is always a new version of &lt;span class=&quot;caps&quot;&gt;CAS&lt;/span&gt; and an upgrade should be as easy as possible. Instead, I create another simple table:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;principalticket&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ticket_id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;varchar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;principal&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;varchar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;PRIMARY&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;KEY&lt;/span&gt;  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ticket_id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The purpose for this table is self-evident. The real question is how to populate it every time a new ticket is issued. &lt;span class=&quot;caps&quot;&gt;CAS&lt;/span&gt; is a perfect example of well written code thoroughly utilizing &lt;a href=&quot;http://www.springsource.org/about&quot;&gt;Spring framework&lt;/a&gt;. I decided to use &lt;a href=&quot;http://static.springsource.org/spring/docs/2.5.x/reference/aop.html&quot;&gt;Spring &lt;span class=&quot;caps&quot;&gt;AOP&lt;/span&gt;&lt;/a&gt; and have an aspect that would be run as a ticket gets persisted. A snippet from &lt;strong&gt;deployerConfigContext.xml&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;xml&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;beans&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;http://www.springframework.org/schema/beans&amp;quot;&lt;/span&gt;
       &lt;span class=&quot;na&quot;&gt;xmlns:xsi=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;/span&gt;
       &lt;span class=&quot;na&quot;&gt;xmlns:p=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;http://www.springframework.org/schema/p&amp;quot;&lt;/span&gt;
       &lt;span class=&quot;na&quot;&gt;xmlns:aop=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;http://www.springframework.org/schema/aop&amp;quot;&lt;/span&gt;
       &lt;span class=&quot;na&quot;&gt;xsi:schemaLocation=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;

  &lt;span class=&quot;nt&quot;&gt;&amp;lt;aop:aspectj-autoproxy/&amp;gt;&lt;/span&gt;

  &lt;span class=&quot;nt&quot;&gt;&amp;lt;aop:config&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;aop:aspect&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;ticketAddAspect&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;ref=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;nscBean&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;aop:pointcut&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;interceptingAddTicket&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;expression=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;bean(ticketRegistry) and execution(public * add*(..))&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;aop:around&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;pointcut-ref=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;interceptingAddTicket&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;method=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;addTicket&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/aop:aspect&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/aop:config&amp;gt;&lt;/span&gt;

  &lt;span class=&quot;nt&quot;&gt;&amp;lt;bean&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;nscBean&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;com...NSCBean&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;constructor-arg&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;index=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;ref=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;entityManagerFactory&amp;quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/bean&amp;gt;&lt;/span&gt;

  ...
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;I wanted to use the same approach for &lt;strong&gt;deleteTicket&lt;/strong&gt; pointcut on &lt;strong&gt;ticketRegistry&lt;/strong&gt; bean but I kept running into &lt;span class=&quot;caps&quot;&gt;AOP&lt;/span&gt; related exceptions when a scheduled quartz job was trying to clean up ticket registries. I was not &lt;span class=&quot;caps&quot;&gt;AOP&lt;/span&gt; guru and I had to finish the task in 2 days and I opted for a less glamorous solution of removing records from &lt;strong&gt;principalticket&lt;/strong&gt; table. If I get back to this task and refactor the approach then I will update this post as well.&lt;/p&gt;
&lt;p&gt;NSCBean (NonSharableCredentialsBean) is rather simple:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;&lt;span class=&quot;kn&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;...;&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;javax.persistence.EntityManager&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;javax.persistence.EntityManagerFactory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.aspectj.lang.JoinPoint&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.jasig.cas.ticket.TicketGrantingTicket&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.springframework.orm.jpa.JpaTemplate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;NSCBean&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

  &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;JpaTemplate&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;jpaTemplate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;NSCBean&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EntityManagerFactory&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;factory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;jpaTemplate&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;JpaTemplate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;factory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;addTicket&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;JoinPoint&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;point&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Throwable&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;point&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getArgs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;point&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getArgs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;length&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;point&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getArgs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TicketGrantingTicket&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;TicketGrantingTicket&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ticket&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TicketGrantingTicket&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;point&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getArgs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;];&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ticket&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getAuthentication&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ticket&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getAuthentication&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getPrincipal&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;principal&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ticket&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getAuthentication&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getPrincipal&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getId&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;EntityManager&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;em&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;jpaTemplate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getEntityManagerFactory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;createEntityManager&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;em&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;createNativeQuery&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;select * from principalticket where ticket_id = &amp;#39;&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ticket&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getId&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getResultList&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;em&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getTransaction&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;em&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;createNativeQuery&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;insert into principalticket (ticket_id, principal) values (&amp;#39;&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ticket&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getId&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;&amp;#39;, &amp;#39;&amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;principal&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;&amp;#39;)&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;executeUpdate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;em&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getTransaction&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;c1&quot;&gt;// ticket/principal is already recorded&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; 

    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;point&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MethodInvocationProceedingJoinPoint&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MethodInvocationProceedingJoinPoint&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;proceed&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getArgs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;());&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; 
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Records from &lt;strong&gt;principalticket&lt;/strong&gt; table are cleaned up in a rather contentious way. During authentication process, if a ticket doesn&amp;#8217;t exist in &lt;strong&gt;ticketgrantingticket&lt;/strong&gt; but exists in &lt;strong&gt;principalticket&lt;/strong&gt; then it gets deleted from the latter. Authentication itself, checking for non sharable credentials and cleaning up the new table is all part of a custom &lt;strong&gt;AuthenticationHandler&lt;/strong&gt;. There is no point providing its code here as it deals with lots of logic particular to my company.&lt;/p&gt;
&lt;p&gt;This post explains one way of achieving non-sharable credentials with &lt;span class=&quot;caps&quot;&gt;CAS&lt;/span&gt;. At the heart of the approach is a usage of Spring &lt;span class=&quot;caps&quot;&gt;AOP&lt;/span&gt;. &lt;span class=&quot;caps&quot;&gt;AOP&lt;/span&gt; is usually advocated while dealing with cross-cutting concerns but it also comes very handy when you want to extend functionality of an existent product beyond its predefined extension hooks.&lt;/p&gt;</description>
        </item>
        
        
        
        <item>
            <title>CAS "branded" Authentication Filter</title>
            <link>http://www.yuriy-zubarev.com/blog/2010/02/15/cas-branded-authentication-filter.html</link>
            <pubDate>Mon, 15 Feb 2010 00:00:00 -0800</pubDate>
            <description>&lt;p&gt;Seemingly complex tasks can have surprisingly easy resolutions. All is needed is not trying to make things more complex than they are.&lt;/p&gt;
&lt;p&gt;We have two domain names for two distinct categories of customers: &lt;strong&gt;www.example1.com&lt;/strong&gt; and &lt;strong&gt;www.example2.com&lt;/strong&gt;. These domains point to the very same Web application &amp;#8211; Super Widgets 2.0. The application has to redirect new visitors to &lt;span class=&quot;caps&quot;&gt;CAS&lt;/span&gt; log-in page. Super Widgets 2.0 provides &amp;#8220;&lt;strong&gt;service&lt;/strong&gt;&amp;#8221; (or &amp;#8220;&lt;strong&gt;serverName&lt;/strong&gt;&amp;#8221;, please read on) parameter to &lt;span class=&quot;caps&quot;&gt;CAS&lt;/span&gt; so that &lt;span class=&quot;caps&quot;&gt;CAS&lt;/span&gt; can redirect users back to Super Widgets 2.0 after a successful authentication. &amp;#8220;&lt;strong&gt;service&lt;/strong&gt;&amp;#8221; parameter comes from &lt;strong&gt;web.xml&lt;/strong&gt; of Super Widgets 2.0 and it&amp;#8217;s a constant value as far as &lt;a href=&quot;http://www.ja-sig.org/wiki/display/CASC/Configuring+the+JA-SIG+CAS+Client+for+Java+in+the+web.xml&quot;&gt;&lt;span class=&quot;caps&quot;&gt;CAS&lt;/span&gt; Client&lt;/a&gt; is concerned. So the &amp;#8220;&lt;strong&gt;service&lt;/strong&gt;&amp;#8221; value can either be &lt;strong&gt;http://www.example1.com&lt;/strong&gt; or &lt;strong&gt;http://www.example2.com&lt;/strong&gt;. When it comes to &lt;span class=&quot;caps&quot;&gt;CAS&lt;/span&gt;, it knows where to redirect users after the authentication but it doesn&amp;#8217;t know the original &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt; users tried to access (&lt;span class=&quot;caps&quot;&gt;CAS&lt;/span&gt; Client doesn&amp;#8217;t pass Referer &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; header).&lt;/p&gt;
&lt;p&gt;On &lt;span class=&quot;caps&quot;&gt;CAS&lt;/span&gt; log-in page we would have to know the original &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt; so that we could greet users with either &amp;#8220;Welcome to Example 1&amp;#8221; or &amp;#8220;Welcome to Example 2&amp;#8221; messages (can be easily achieved with a simple &lt;span class=&quot;caps&quot;&gt;JSP&lt;/span&gt; scriplet).&lt;/p&gt;
&lt;p&gt;In the nutshell the solution (suggested by my colleague Alexey Malyshev) is to initialize and call &lt;strong&gt;org.jasig.cas.client.authentication.AuthenticationFilter&lt;/strong&gt; from within our own custom filter. As we initialize Jasig&amp;#8217;s AuthenticationFilter we calculate &amp;#8220;&lt;strong&gt;service&lt;/strong&gt;&amp;#8221; value dynamically based on the value of &lt;strong&gt;request.getServerName()&lt;/strong&gt;. I&amp;#8217;m not really sure what design pattern should be selected form the &lt;a href=&quot;http://www.answers.com/main/ntquery?s=software+design+patterns&amp;gwp=13#Classification_and_list&quot;&gt;list&lt;/a&gt; to describe this approach.&lt;/p&gt;
&lt;p&gt;First, we need a custom but simple implementation of &lt;strong&gt;FilterConfig&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;[sourcecode lang=&amp;#8220;java&amp;#8221;]&lt;br /&gt;
package com.superwidgets;&lt;/p&gt;
&lt;p&gt;&amp;#8230;&lt;br /&gt;
import javax.servlet.FilterConfig;&lt;br /&gt;
import javax.servlet.ServletContext;&lt;/p&gt;
&lt;p&gt;public class BrandingFilterConfig implements FilterConfig {&lt;/p&gt;
private FilterConfig parent;
private Map&amp;lt;String, String&amp;gt; params = new HashMap&amp;lt;String, String&amp;gt;();
public BrandingFilterConfig(FilterConfig parent) {
this.parent = parent;
}
public String getFilterName() {
return &amp;#8220;Super Widgets Branded Filter&amp;#8221;;
}
public ServletContext getServletContext() {
return this.parent.getServletContext();
}
public String getInitParameter(String s) {
if (this.params.containsKey(s)) {
return this.params.get(s);
} else {
return this.parent.getInitParameter(s);
}
}
public Enumeration getInitParameterNames() {
return this.parent.getInitParameterNames();
}
public void setParam(String key, String value) {
params.put(key, value);
}
public void removeParam(String key) {
params.remove(key);
}
&lt;p&gt;}&lt;br /&gt;
[/sourcecode]&lt;/p&gt;
&lt;p&gt;Second, we need to implement our own &lt;strong&gt;Authentication Filter&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;[sourcecode lang=&amp;#8220;java&amp;#8221;]&lt;br /&gt;
package com.superwidgets;&lt;/p&gt;
&lt;p&gt;import javax.servlet.Filter;&lt;br /&gt;
&amp;#8230;&lt;/p&gt;
&lt;p&gt;public class AuthenticationFilter implements Filter {&lt;/p&gt;
protected final Log log = LogFactory.getLog(getClass());
private String serviceMapping;
private Properties serviceProperties = new Properties();
private String serverNameMapping;
private Properties serverNameProperties = new Properties();
private BrandingFilterConfig filterConfig;
public String getServiceMapping() {
return serviceMapping;
}
public void setServiceMapping(String serviceMapping) {
this.serviceMapping = serviceMapping;
}
public void init(FilterConfig fc) throws ServletException {
this.filterConfig = new BrandingFilterConfig(fc);
// service
this.serviceMapping = fc.getInitParameter(&amp;#8220;serviceMapping&amp;#8221;);
log.info(&amp;quot;serviceMapping = &amp;quot; + this.serviceMapping);
try {
if (this.serviceMapping != null) {
this.serviceProperties.load(new ByteArrayInputStream(this.serviceMapping.getBytes()));
}
} catch (Exception ex) {
log.error(&amp;quot;Cannot load serviceMapping property: &amp;quot; + ex.getMessage());
}
log.info(&amp;quot;serviceProperties = &amp;quot; + this.serviceProperties);
// serverName
this.serverNameMapping = fc.getInitParameter(&amp;#8220;serverNameMapping&amp;#8221;);
log.info(&amp;quot;serverNameMapping = &amp;quot; + this.serverNameMapping);
try {
if (this.serverNameMapping != null) {
this.serverNameProperties.load(new ByteArrayInputStream(this.serverNameMapping.getBytes()));
}
} catch (Exception ex) {
log.error(&amp;quot;Cannot load serverNameMapping property: &amp;quot; + ex.getMessage());
}
log.info(&amp;quot;serverNameProperties = &amp;quot; + this.serverNameProperties);
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
org.jasig.cas.client.authentication.AuthenticationFilter realFilter = new org.jasig.cas.client.authentication.AuthenticationFilter();
String hostKey = request.getServerName();
log.debug(&amp;quot;hostKey = &amp;quot; + hostKey);
if (serviceMapping != null) {
if (serviceProperties.containsKey(hostKey)) {
this.filterConfig.setParam(&amp;#8220;service&amp;#8221;, serviceProperties.getProperty(hostKey));
} else {
this.filterConfig.removeParam(&amp;#8220;service&amp;#8221;);
}
}
if (serverNameMapping != null) {
if (serverNameProperties.containsKey(hostKey)) {
this.filterConfig.setParam(&amp;#8220;serverName&amp;#8221;, serverNameProperties.getProperty(hostKey));
} else {
this.filterConfig.removeParam(&amp;#8220;serverName&amp;#8221;);
}
}
realFilter.init(this.filterConfig);
realFilter.doFilter(request, response, chain);
realFilter.destroy();
}
public void destroy() {
// nothing to do
}
public Properties getServiceProperties() {
return serviceProperties;
}
public Properties getServerNameProperties() {
return serverNameProperties;
}
&lt;p&gt;}&lt;br /&gt;
[/sourcecode]&lt;/p&gt;
&lt;p&gt;Now we have to modify &lt;strong&gt;web.xml&lt;/strong&gt; and everything falls into places:&lt;/p&gt;
&lt;p&gt;[sourcecode lang=&amp;#8220;xml&amp;#8221;]&lt;br /&gt;
&lt;del&gt;-&lt;/del&gt;&lt;br /&gt;
&lt;filter&gt;&lt;br /&gt;
  &lt;filter-name&gt;&lt;span class=&quot;caps&quot;&gt;CAS&lt;/span&gt; Authentication Filter&lt;/filter-name&gt;&lt;br /&gt;
  &lt;filter-class&gt;com.superwidgets.AuthenticationFilter&lt;/filter-class&gt;&lt;br /&gt;
  &lt;init-param&gt;&lt;br /&gt;
    &lt;param-name&gt;casServerLoginUrl&lt;/param-name&gt;&lt;br /&gt;
    &lt;param-value&gt;https://cas.superwidgets.com/login&lt;/param-value&gt;&lt;/p&gt;
&lt;/init-param&gt;
&lt;init-param&gt;
    &lt;param-name&gt;service&lt;/param-name&gt;
    &lt;param-value&gt;http://www.example1.com&lt;/param-value&gt;
&lt;/init-param&gt;
&lt;init-param&gt;
&lt;!-- new --&gt;
    &lt;param-name&gt;serviceMapping&lt;/param-name&gt;
&lt;param-value&gt;
www.example2.com=http://www.example2.com
www.example3.com=http://www.example3.com
www.example4.com=http://www.example4.com
&lt;/param-value&gt;
&lt;/init-param&gt;
&lt;/filter&gt;
&lt;hr /&gt;
&lt;p&gt;[/sourcecode]&lt;/p&gt;
&lt;p&gt;&amp;#8220;&lt;strong&gt;serviceMapping&lt;/strong&gt;&amp;#8221; is a secret sauce here. The value is loaded in an instance of &lt;strong&gt;java.util.Properties&lt;/strong&gt; class and then it&amp;#8217;s used to dynamically calculate &amp;#8220;&lt;strong&gt;service&lt;/strong&gt;&amp;#8221; value for Jasig&amp;#8217;s AuthenticationFilter.&lt;/p&gt;
&lt;p&gt;If AuthenticationFilter is using &amp;#8220;&lt;strong&gt;serverName&lt;/strong&gt;&amp;#8221; parameter instead of &amp;#8220;&lt;strong&gt;service&lt;/strong&gt;&amp;#8221;, then instead of &amp;#8220;&lt;strong&gt;serviceMapping&lt;/strong&gt;&amp;#8221; parameter, &amp;#8220;&lt;strong&gt;serverNameMapping&lt;/strong&gt;&amp;#8221; should be used.&lt;/p&gt;
&lt;p&gt;A little summary. AuthenticationFilter has a dynamic behavior based on the original &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt; a user was trying to access. To achieve this we wrapped Jasig&amp;#8217;s filter inside our own filter and we didn&amp;#8217;t have to change Jasig&amp;#8217;s filter internals in any way. Jasig&amp;#8217;s AuthenticationFilter filter is initialized on every request and this has a light and acceptable (for us) performance implication.&lt;/p&gt;</description>
        </item>
        
        
        
        <item>
            <title>New York ITARC 2009, Final Thoughts</title>
            <link>http://www.yuriy-zubarev.com/blog/2009/10/18/new-york-itarc-2009-final-thoughts.html</link>
            <pubDate>Sun, 18 Oct 2009 00:00:00 -0700</pubDate>
            <description>&lt;p&gt;During the Architect Boot-camp Paul ran through perspectives people have about architects and architecture and one of them was Cult of Personality. The idea is that some people respond on challenges, uncertainties and arguments in a somewhat predictable way: &amp;#8220;Grady Booch already figured it out&amp;#8221;, &amp;#8220;Eric Evans solved that problem already&amp;#8221;, etc. After 3 days of lectures, presentations and discussions I think I found an antidote for the Personality Cult.&lt;/p&gt;
&lt;p&gt;All you have to do is attend a similar industry event like New Your &lt;span class=&quot;caps&quot;&gt;ITARC&lt;/span&gt;. The biggest discovery for me was how individually smart but collectively distant though leaders were. Everybody was paying a due respect for each other but was also quick to note that they disagreed with many points as well.&lt;/p&gt;
&lt;p&gt;As a side observer I didn&amp;#8217;t think any of the statements of any of thought leaders were particularly wrong. In my opinion it&amp;#8217;s all about context. Give me a pattern and anti-pattern and I can turn them upside down by changing the context within which they were applied. The same is with thought leaders. They worked for decades on a certain slice of a huge IT Architecture pie and they were influenced and constrained by a corresponding context. They figured out patterns and anti-patterns but they were not universal. So when I saw, for example, Rogers Sessions disagreeing with Grady Booch, I was witnessing a clash of different opinions stemming from different contexts and nothing more than that.&lt;/p&gt;
&lt;p&gt;Next time I develop a Cult of Personality, I only wish it&amp;#8217;s going to be within the right context.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://midnightit.wordpress.com/2009/10/18/new-york-itarc-2009-day-1/&quot;&gt;Day 1&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://midnightit.wordpress.com/2009/10/18/new-york-itarc-2009-day-2/&quot;&gt;Day 2&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://midnightit.wordpress.com/2009/10/18/new-york-itarc-2009-day-3/&quot;&gt;Day 3&lt;/a&gt;&lt;/p&gt;</description>
        </item>
        
        
        
        <item>
            <title>New York ITARC 2009, Day 3</title>
            <link>http://www.yuriy-zubarev.com/blog/2009/10/18/new-york-itarc-2009-day-3.html</link>
            <pubDate>Sun, 18 Oct 2009 00:00:00 -0700</pubDate>
            <description>&lt;p&gt;The third day started with probably the best keynote presentation of the whole conference. Of course I&amp;#8217;m talking about &lt;strong&gt;Grady Booch &lt;/strong&gt;and his &lt;strong&gt;&amp;#8220;Thoughts on Architecture&amp;#8221;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://midnightit.files.wordpress.com/2009/10/grady-booch.png&quot; width=&quot;450&quot; height=&quot;338&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;If I had the whole day I would tell you all the things that I don&amp;#8217;t understand about architecture. But I have 1 hour only, so I will tell you what I reasonably understand.&lt;/blockquote&gt;
&lt;p&gt;I took a picture of almost every slide from this presentation but I probably shouldn&amp;#8217;t post them here. Even if the legal aspects don&amp;#8217;t prohibit me from doing so, the bare slides wouldn&amp;#8217;t make a justice to Grady&amp;#8217;s talk. You have to be there to hear how intelligently he weaves the slides together and produces a though-provoking story on architecture. Here are just some notes I found particularly memorable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One of the greatest challenges is to connect Enterprise Architecture to Software Architecture&lt;/li&gt;
&lt;li&gt;Google is not search but an advertising companies. Interesting to see where they end up.&lt;/li&gt;
&lt;li&gt;Innovation cannot be outsourced. Grady gave GM a really hard time here, calling their decision to outsource all software development the stupidest thing.&lt;/li&gt;
&lt;li&gt;Grady was surprised and pleased to see how far &lt;span class=&quot;caps&quot;&gt;UML&lt;/span&gt; went but he never intended it to be a programming language (shot at &lt;span class=&quot;caps&quot;&gt;MDD&lt;/span&gt;)&lt;/li&gt;
&lt;li&gt;It was interesting to learn that Grady was a very spiritual person. He is on the board of Iliff School of Theology in Denver.&lt;/li&gt;
&lt;li&gt;Presence of software intensive systems changes the context in which they run &amp;#8211; it offers additional capabilities.&lt;/li&gt;
&lt;li&gt;Grady disagreed with previous comparison of architecture to a road, made by William H. Inmon on the first day. He said the road was just a tactical decision. Grady then spent some time going through his famous &amp;#8220;Architecture is like river&amp;#8221; work.&lt;blockquote&gt;You cannot move the river. You can only move banks. The river will do what it will do.&lt;/blockquote&gt; &lt;p&gt;There are many forces in the river ecosystem. Architecture is to balance those forces.&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;The industry has responsibility for legal, ethical and moral aspects of the architecture profession. This is one of the biggest challenges for the future.&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;Third edition of &amp;#8220;Documenting Software Architecture&amp;#8221; is coming!&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;The reason why we have so many EA frameworks is because we don&amp;#8217;t have the right answer yet.&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;The reason why we have fewer number of technical frameworks is because we are closer to the right answer here. Example: &lt;a href=&quot;http://people.cs.ubc.ca/~gregor/teaching/papers/4%2b1view-architecture.pdf&quot;&gt;4+1&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;Models should be predictable and elicit questions&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;IRS&lt;/span&gt; has an assembly program comprised of 5000 lines they cannot replace. Only one person knew how to run tax rebates promised by government last year. Ouch.&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;Good documentation tip: if you can express it in programming language &amp;#8211; don&amp;#8217;t put it in &lt;span class=&quot;caps&quot;&gt;UML&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;Google and Facebook also have architectural problems. (but he didn&amp;#8217;t elaborate)&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;eBay spends 10% of their budget on refactoring&lt;/li&gt;&lt;/p&gt;
&lt;/ul&gt;
&lt;p&gt;Grady&amp;#8217;s presentation was unique. He has the best grasp of English language I&amp;#8217;ve ever heard. Each slide was like a poem: deep and beautiful. There was something profound in every statement he made. He&amp;#8217;s a very humble person and his eyes are paragon of sadness. I think they reveal the true love for what he does, acceptance of never ending challenges and a refusal to give up. He is an excellent ambassador for IT architects and it was my sincere privilege to see and hear him speak.&lt;/p&gt;
&lt;p&gt;The next session was by &lt;strong&gt;Roger Sessions&lt;/strong&gt; and it was called &lt;strong&gt;&amp;#8220;Simple Iterative Partitioning&amp;#8221;&lt;/strong&gt;. Behind the cryptic name there was a straightforward message: complexity is the root of all IT troubles and we should relentlessly attack and eliminate complexity.&lt;/p&gt;
&lt;p&gt;Roger introduced Glass&amp;#8217;s Law and its application for IT. He used it to devise a concept of &lt;span class=&quot;caps&quot;&gt;SCU&lt;/span&gt; &amp;#8211; Standard Complexity Unit. He then used this combination to calculate a number that gave a certain design a definite numeric value for its complexity. This is an exciting development as far as I&amp;#8217;m concerned. As a saying goes: &amp;#8220;you can&amp;#8217;t manage what you can&amp;#8217;t measure&amp;#8221;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://midnightit.files.wordpress.com/2009/10/glass-law.png&quot; width=&quot;450&quot; height=&quot;338&quot; /&gt;&lt;br /&gt;
&lt;br&gt;
&lt;img src=&quot;http://midnightit.files.wordpress.com/2009/10/glass-law-it.png&quot; width=&quot;450&quot; height=&quot;338&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Here are some highlights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;blockquote&gt;Grady said we have to have simple systems. But how do we know the system is simple? Grady gave metrics but they are not enough. Sometimes they can only be applied to the system once it&amp;#8217;s completely built.&lt;/blockquote&gt;&lt;/li&gt;
&lt;li&gt;Code re-use can sometimes create more complex systems.&lt;/li&gt;
&lt;li&gt;There is no simplicity, there is a relative absence of complexity just like there is cold, there is an absence of heat.&lt;/li&gt;
&lt;li&gt;Yesterday Len Bass presented us with six key non-functional architectural requirements, but where is simplicity among those six?&lt;/li&gt;
&lt;li&gt;By measuring complexity of solutions and using &lt;span class=&quot;caps&quot;&gt;SIP&lt;/span&gt;, we can part ways with &amp;#8220;decibel based decision making&amp;#8221;&lt;/li&gt;
&lt;li&gt;If you want high availability, you build simplicity, not redundancy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There parting thoughts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Complexity is the enemy&lt;/li&gt;
&lt;li&gt;It&amp;#8217;s simple to make things complex. It&amp;#8217;s complex to make things simple, thus the paradox.&lt;/li&gt;
&lt;li&gt;Only the simple will survive&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The conference ended with a &lt;strong&gt;thought leaders panel&lt;/strong&gt;. All the questions but one was asked by Paul Preiss. Here are some most memorable excerpts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Q: what&amp;#8217;s in store for architecture in 5 years?&lt;br /&gt;
&lt;ul&gt;&lt;br /&gt;
&lt;li&gt;Scott Anderson: cloud computing will mean more changes to service companies than to architects themselves&lt;/li&gt;
&lt;li&gt;Lean Bass: a) we will see a bigger split between state of art and state of practice in the architecture; b) the trend is that we&amp;#8217;re casting ourselves as dictators on what should be done&lt;/li&gt;
&lt;li&gt;Paul: questions of ethics and integrity will move closer toward central stage&lt;/li&gt;
&lt;li&gt;Angela: a) I would like to see us more as a community; b) architects in large companies will get a seat at stakeholders table&lt;/li&gt;
&lt;li&gt;Roger Sessions: problem of complexity will be the most critical one&lt;/li&gt;
&lt;li&gt;Grady Booch: a) software intensive systems will keep increasing in their complexity and we have to counter-balance it by increasing transparency; b) we will still be arguing what architecture means&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q: What would our commercial be?&lt;br /&gt;
&lt;ul&gt;&lt;br /&gt;
&lt;li&gt;Scott: &amp;#8220;Architects &amp;#8211; we make order out of IT chaos&amp;#8221;&lt;/li&gt;
&lt;li&gt;Paul: &amp;#8220;Technology working for you and making you more human&amp;#8221;&lt;/li&gt;
&lt;li&gt;Angela: &amp;#8220;First call you make is for architects. Architects &amp;#8211; foundation of your business&amp;#8221;&lt;/li&gt;
&lt;li&gt;Roger: &amp;#8220;Simplifying world one IT project at a time&amp;#8221;&lt;/li&gt;
&lt;li&gt;Booch: &amp;#8220;Join &lt;span class=&quot;caps&quot;&gt;IASA&lt;/span&gt; and improve your sex live&amp;#8221;. (did I miss something about this conference?)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Q: what would you take with you on a deserted island?&lt;br /&gt;
&lt;ul&gt;&lt;br /&gt;
&lt;li&gt;Grady: &amp;#8220;How to build a boat&amp;#8221; book&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;http://midnightit.files.wordpress.com/2009/10/thought-leaders-day3.png&quot; width=&quot;450&quot; height=&quot;338&quot; /&gt;&lt;/p&gt;</description>
        </item>
        
        
        
        <item>
            <title>New York ITARC 2009, Day 2</title>
            <link>http://www.yuriy-zubarev.com/blog/2009/10/18/new-york-itarc-2009-day-2.html</link>
            <pubDate>Sun, 18 Oct 2009 00:00:00 -0700</pubDate>
            <description>&lt;p&gt;Today I had a notepad with me, so be ready for a long read. Additional observations about New York: mountains of garbage bags are along sides of streets ready for collections. I think it&amp;#8217;s because there are no back alleys in Manhattan. So much different from Vancouver. I also tried and beat couple of cars by crossing on the red line. I got couple of honor honks. I felt completely assimilated.&lt;/p&gt;
&lt;p&gt;The day was opened by &lt;strong&gt;Paul Preiss&lt;/strong&gt; who talked about &lt;strong&gt;&amp;#8220;Next Generation Activities&amp;#8221;&lt;/strong&gt;. After having gone to Architect Boot-camp, most of Paul&amp;#8217;s talk sounded already familiar but there was new information as well. Paul said that he started in the industry as a programmer but he didn&amp;#8217;t feel completely at home doing that. He noted that it wasn&amp;#8217;t like he didn&amp;#8217;t like programming, it just didn&amp;#8217;t make sense for him. He didn&amp;#8217;t like writing code for the sake of writing code. This sounded familiar to me. Sometimes I felt a void inside me, some dissatisfaction about my role and my contributions. I went on crazy programming spikes, creating solid and sometimes elegant code, and wholeheartedly enjoying the process of discovery and creation. I finished those spikes only to discover the void inside me grew even bigger. The code did solve some problem, but the amount of effort and sophistication was disproportionally big compared to the actual problem being solved. In many cases I was writing code and refactoring it only for the sake of writing code and refactoring.&lt;/p&gt;
&lt;p&gt;Paul then went on to deliver one of his, in my opinion, main statements. He argued that we&amp;#8217;re the only group that separates us from the rest of the company &amp;#8211; &amp;#8220;the business&amp;#8221;. We&amp;#8217;re just IT and we&amp;#8217;re here to server &amp;#8220;the business&amp;#8221;. Finance doesn&amp;#8217;t &amp;#8220;serve the business&amp;#8221;. They do what they are good at and they are part of the business. This caught me by surprise. I was completely content with being a second class citizen to &amp;#8220;the business&amp;#8221;. That is what was engraved in my head. Well, it&amp;#8217;s a good practice to question everything and this was an excellent example.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;alignright size-full wp-image-77&quot; title=&quot;Paul&quot; src=&quot;http://midnightit.files.wordpress.com/2009/10/paul.png&quot; alt=&quot;Paul&quot; width=&quot;450&quot; height=&quot;338&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This central thought led him to suggest that &lt;span class=&quot;caps&quot;&gt;IASA&lt;/span&gt; was to make architecture actionable. He was surprised that there were no solid requirements for entry for profession that impacts so many people and influences budget of billions dollars. He joked that his hair-dresser had to meet more state requirements before they can practice their trade than an IT Architects had. Comparisons with professions in medicine was even more grimmer.&lt;/p&gt;
&lt;p&gt;Paul continued and underlined that &lt;span class=&quot;caps&quot;&gt;IASA&lt;/span&gt; chapter was not meant to be a user group. The chapter is there to support us and our career growth, give us jobs and make sure they&amp;#8217;re paid well. I see where Paul is going and what he want &lt;span class=&quot;caps&quot;&gt;IASA&lt;/span&gt; to become. What&amp;#8217;s different about &lt;span class=&quot;caps&quot;&gt;IASA&lt;/span&gt; that it&amp;#8217;s not run by geeks. Paul is a business savvy and a shrew person and he wants to carve out a bigger piece of the corporate pie for IT Architects. He will have lots of challenges and resistance from other groups along the way. But this is where we, as members, here to support and help. He emphasized that he&amp;#8217;s practicing architecture only 20% of his time and he&amp;#8217;s selling it 80% of his time. This is what chapter leadership also has to expect.&lt;/p&gt;
&lt;p&gt;He then shared some numbers, problems and priorities for &lt;span class=&quot;caps&quot;&gt;IASA&lt;/span&gt;. The association has more than 8000 members. He acknowledged the &lt;span class=&quot;caps&quot;&gt;IASA&lt;/span&gt; web site sucked, they knew about it and kept working. That&amp;#8217;s nice to know. About 6 months ago I sent email to Paul to confirm &lt;span class=&quot;caps&quot;&gt;IASA&lt;/span&gt; is still alive since the web site didn&amp;#8217;t give me any signal of pulse at that time. &lt;span class=&quot;caps&quot;&gt;IASA&lt;/span&gt; problems included being to big, underfunded and unfocused. The problem of size would be solved by giving local regions more responsibilities. Focus for the next year was to create filters for bad architects and recognize good ones through education, certification and accreditation.&lt;/p&gt;
&lt;p&gt;Paul then introduced various aspects of body of knowledge for architects. He mentioned, among other things, rigorous taxonomy of skills and that the foundational skills for architects was Business Technology Strategy. He cut to the chase by stating that developers were there to write code and architect to get rid of code. Code has to make money. Architects should concentrate on delivering the most value for the least number of lines written. I tend to agree. This could be also a reason why some good coders fail to become good architects. They always stay coders in their hearts and cannot have no code written either by themselves or developers in their companies.&lt;/p&gt;
&lt;p&gt;Paul also clarified &lt;span class=&quot;caps&quot;&gt;IASA&lt;/span&gt; position that Enterprise Architect is not a specialization but a role. The comparison was with a chief of surgery in hospitals. I had a benefit of learning this statement from Max Poliashenko, digesting it and having agreed with it, but I wonder what Rogers Sessions would say. Paul then outlined four levels of Architect certification. This is the quick summary:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Aspiring architect &amp;#8211; knowledge test&lt;/li&gt;
&lt;li&gt;Associate architect &amp;#8211; experience + knowledge test&lt;/li&gt;
&lt;li&gt;Professional architect &amp;#8211; experience + board exam&lt;/li&gt;
&lt;li&gt;Master architect &amp;#8211; thought leaders, speakers, writers and notable contributors&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Local chapters would run certification board as local values matter for every profession.&lt;/p&gt;
&lt;p&gt;Paul concluded that IASA&amp;#8217;s mission statement is to empower the profession and, as an example, added that cloud wasn&amp;#8217;t future. Cloud is just another tool. Future are people standing up and speaking for themselves and &lt;span class=&quot;caps&quot;&gt;IASA&lt;/span&gt; is there help and facilitate.&lt;/p&gt;
&lt;p&gt;I liked Paul&amp;#8217;s speech (I can give Toastmaster evaluation as usual, if he interested). I think &lt;span class=&quot;caps&quot;&gt;IASA&lt;/span&gt; has a good leadership. Paul possesses the right amount of technical and business knowledge, energy and charisma.&lt;/p&gt;
&lt;p&gt;The next key note &lt;strong&gt;&amp;#8220;Principles of Software Architecture Design&amp;#8221;&lt;/strong&gt; was delivered by &lt;strong&gt;Len Bass&lt;/strong&gt;. Lean is a legend and I personally read couple of books he co-authored. Seeing him and listening him was a great opportunity. He started with outlining types of requirements and noting that requirements are good things. Requirements are constraints and the more we have the less decisions we have to make.&lt;/p&gt;
&lt;p&gt;Len then delved into non-functional requirements and ways of their elicitation. He explained differences between categories and taxonomies and suggested to stick with categories. The essence is that in taxonomies, a thing can only fall under one taxonomy element. His example with &amp;#8220;denial of service&amp;#8221; proved to be a challenge for taxonomies. During denial of service, many non-functional requirements are impacted: availability, performance, security, usability. He offered then a common for for quality attributes:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://midnightit.files.wordpress.com/2009/10/len-availability-table.png&quot; alt=&quot;&quot; width=&quot;450&quot; height=&quot;338&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Len followed with a really deep dive into concepts of &lt;span class=&quot;caps&quot;&gt;ASP&lt;/span&gt; &amp;#8211; Architecturally Significant Requirements. He started describing &lt;span class=&quot;caps&quot;&gt;ATAH&lt;/span&gt; &amp;#8211; Architecture Trade-off Analysis Method, utility trees and designing paths. One interesting thought he offered was that in many cases architecture and design testing are thought experiments. So much for xUnit frameworks. At some point I caught myself losing my attention. What was supposed to be a keynote speech turned into highly technical lecture by a university professor. His topic was much better suited for one of the tracks rather than a keynote address.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://midnightit.files.wordpress.com/2009/10/len-summary.png&quot; alt=&quot;&quot; width=&quot;450&quot; height=&quot;338&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The day was coming to the end closing keynote speech was presented by &lt;strong&gt;Angela Yochem&lt;/strong&gt;. It was titled &lt;strong&gt;&amp;#8220;Architecture &lt;strong&gt;is&lt;/strong&gt; the business&amp;#8221;&lt;/strong&gt;. This was a logical continuation of Pauls&amp;#8217;s message and I liked this connection through a common theme. Paul introduced Angela with humor: &amp;#8220;Somebody told me that enterprise architects are like unicorns. Yes, they would be pretty if they existed. But they do exists!&amp;#8221;, and he gave her a stage.&lt;/p&gt;
&lt;p&gt;Angela started with a message that already had a chance to be absorbed by the audience: we&amp;#8217;re just as business as finance, HR, purchasing, legal, etc. We&amp;#8217;re all partners. She then compared architects to a really bad salesmen: they annoy people by asking them for couple of hours of undivided attention so that they could learn about our problems and then offer us products and services to solve them. I recognized here myself on a couple of occasions&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://midnightit.files.wordpress.com/2009/10/angela-architecture-obligations.png&quot; alt=&quot;&quot; width=&quot;450&quot; height=&quot;338&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Angela threw another observation that caught me by surprise: there was no reasons architects couldn&amp;#8217;t apply for funding for some future benefits. She saw it done successfully. Hm&amp;#8230; Here is a thought. Now I just have to come up with a value proposition.&lt;/p&gt;
&lt;p&gt;For all us, wondering where to start, she suggested creating a functional view of our business or a segment to gain a perspective and to spot inefficiencies.&lt;/p&gt;
&lt;p&gt;Angela concluded with a bitter pill. She paraphrased John Zachman: if you cannot describe your value to your company then may be you&amp;#8217;re not bringing that much value. I&amp;#8217;m definitely bringing value as a developer, designer and occasional operational support but hardly any value as an architect. Well, I honestly have to thank Angela for this perspective.&lt;/p&gt;
&lt;p&gt;Brief Q&amp;amp;A session then followed:&lt;/p&gt;
&lt;p&gt;Q: what organizational metrics could be used in architecture?&lt;br /&gt;
A: develop architecture scorecards. Track delivery of components and enablers by all company units that contribute to enterprise architecture.&lt;/p&gt;
&lt;p&gt;Q: how to sell architecture initiatives?&lt;br /&gt;
A: Understand the value you deliver. Formulate the value as clear as possible.&lt;/p&gt;
&lt;p&gt;Q: One thing you wish you knew looking back (asked by Grady Booch)&lt;br /&gt;
A: Waited many years to be noticed as a decision maker. The reason was not taking ownership of problems.&lt;/p&gt;
&lt;p&gt;The day ended with a productive &lt;strong&gt;Open Space&lt;/strong&gt; session. I heard about this concept from &lt;a href=&quot;http://www.javaposse.com/&quot;&gt;Java Posse&lt;/a&gt; but never participated before. I threw 3 topics in the mix:&lt;/p&gt;
&lt;p&gt;1) Documenting software architecture&lt;br /&gt;
2) &lt;span class=&quot;caps&quot;&gt;CTO&lt;/span&gt; vs. Architect role (since architects own IT strategy)&lt;br /&gt;
3) Company&amp;#8217;s revenue level to afford dedicated architects&lt;/p&gt;
&lt;p&gt;The first topic received a critical mass of votes and was included in the main session. Hedging the bets paid off. When the discussion started, my corner got fewer people than votes &amp;#8211; it&amp;#8217;s hard to compete with Grady Booch&amp;#8217;s topic.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://midnightit.files.wordpress.com/2009/10/open-session-topics.png&quot; alt=&quot;&quot; width=&quot;450&quot; height=&quot;338&quot; /&gt;&lt;/p&gt;
&lt;p&gt;My discussion was interesting but not in the best way &amp;#8211; everybody had questions but hardly anyone could offer answers. The group ended up sharing what worked for them and what didn&amp;#8217;t &amp;#8211; that the main point of Open Space. One person recommended &lt;a href=&quot;http://www.amazon.com/gp/product/0321112296?ie=UTF8&amp;tag=fibonaccisolu-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0321112296&quot;&gt;Software Systems Architecture: Working With Stakeholders Using Viewpoints and Perspectives&lt;/a&gt; which I should definitely investigate. There was a consultant from Sparx System among us who advocated Enterprise Architect and a certain framework he developed. I also own a copy of this package. Almost everything he was suggesting wasn&amp;#8217;t applicable to small and medium companies unfortunately.&lt;/p&gt;
&lt;p&gt;For the second round of discussions I joined &amp;#8220;Web Frameworks Components&amp;#8221; discussions. I pitched in by describing our experience with Open Social &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; and Shindig in particular and contrasted it with Java Portlet &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;. Other people described their experiences with Flex, Google Gears, etc. After the session, one gentleman approached me with some questions about Shindig. We had a good conversation and found that we have similar set-ups in our companies. The last discussion I jumped to was revolving around a question of a single IT architect in a company. This situation was common among attendees. It looked like if a company had only one IT Architect, then what they really had was a senior developer and a team lead who happened to be called an architect for whatever reason. Oh, that sounds very familiar. Some people were seriously upset by not being able to escape from the chains of development, testing, deployment, etc. I offered a thought that &amp;#8220;pure&amp;#8221; IT architects are not needed for all companies. Not all companies have a dedicated lawyer. This is actually why we need a profession and this is why I wanted to discuss &amp;#8220;Company&amp;#8217;s revenue level to afford dedicated architects&amp;#8221; topic. We also agreed that everybody in this position should do what Angela prescribed &amp;#8211; articulate our value proposition as architects, and if we cannot &amp;#8211; well, keep writing more code pal.&lt;/p&gt;</description>
        </item>
        
        
        
        <item>
            <title>New York ITARC 2009, Day 1</title>
            <link>http://www.yuriy-zubarev.com/blog/2009/10/18/new-york-itarc-2009-day-1.html</link>
            <pubDate>Sun, 18 Oct 2009 00:00:00 -0700</pubDate>
            <description>&lt;p&gt;I&amp;#8217;m a lucky attendant of &amp;#8220;&amp;#8221;http://www.iasahome.org/web/itarc/2009/NYC&amp;quot;&amp;gt;IT Architect Regional Conference&lt;/a&gt;&amp;quot; held in New York City from October 12-14. I signed up for the conference mainly because of the impressive line-up of speakers, many of which I admire professionally, and I also wanted to learn more about &lt;span class=&quot;caps&quot;&gt;IASA&lt;/span&gt;, its president, its mission and other people behind it.&lt;/p&gt;
&lt;p&gt;This was my first time being in Manhattan, New York. Some quick observations and impressions: it&amp;#8217;s big, it&amp;#8217;s insanely busy, seems like half of the traffic are cabs and people always try to cross streets on the red light. Being from Vancouver, the last point feels especially foreign. Oh yes, and on my first day walking to a conference, I saw a celebrity: Elizabeth Hurley.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://midnightit.files.wordpress.com/2009/10/el.png&quot; alt=&quot;Elizabeth Hurley&quot; title=&quot;Elizabeth Hurley&quot; width=&quot;450&quot; height=&quot;337&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The opening ceremony was started by Timothy Leonard who joined &lt;span class=&quot;caps&quot;&gt;IASA&lt;/span&gt; less than an year ago as a president. He explained that he came on board with the sole purpose of adding more clarity to IASA&amp;#8217;s mission and to grow the organization. The growth would be quantitative and qualitative. Members would now see the clear benefits of joying the association: body of knowledge, white papers, variety of on-line courses, certification and accreditation. Tim then invited VP of Education to expand on the last two benefits. Certification path &lt;span class=&quot;caps&quot;&gt;IASA&lt;/span&gt; is taking is drawing from examples of other, more established, disciplines (medicine, construction architecture, etc) and it looks well thought-out and beneficial for the members and potential employers. Board certification is the most respectful aspect of the whole package. I hope &lt;span class=&quot;caps&quot;&gt;IASA&lt;/span&gt; will make it tough (but relevant and fare) and will never back down from it. I have one architecture certification, which I will not name here, that wasn&amp;#8217;t a piece of cake to obtain. It took me some time and effort to do an assignment and write two exams. Still, I would be so much more satisfied and proud had a board certification was a part of that process.&lt;/p&gt;
&lt;p&gt;Everybody was treated by a keynote speech by John A. Zachman, the famous creator of &lt;a href=&quot;http://www.zachmaninternational.com/index.php/home-article/13#maincol&quot;&gt;Zachman Framework&lt;/a&gt;. John was a very passionate, animated and authentic speaker. It seemed like he wasn&amp;#8217;t given all the time he would love to for his presentation, so he simply &lt;a href=&quot;http://picasaweb.google.com/lh/photo/gcT1cApxFAdobIWkeRidpw?feat=directlink&quot;&gt;flew&lt;/a&gt; through his slides using an antiquated overhead projector. It&amp;#8217;s amazing how much he managed to deliver though: the history of his studies, parallels between his framework and works of ancient philosophers and knowledge seekers, and conceptual similarities between his schema and periodic table of elements. Seemingly dry topic was sprinkled by his own funny stories which made everybody constantly engaged and the time went really fast.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://midnightit.files.wordpress.com/2009/10/zachman.png&quot; alt=&quot;John Zachman&quot; title=&quot;John Zachman&quot; width=&quot;450&quot; height=&quot;337&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Next there was an &lt;strong&gt;Architect Boot-camp&lt;/strong&gt; &amp;#8211; pretty much the main reason I came here for. The boot-camp was held by Paul Preiss, President and Founder of &lt;span class=&quot;caps&quot;&gt;IASA&lt;/span&gt;. Paul is one of those people who &amp;#8220;have you at hello&amp;#8221;. His energy, passion and love for what he does and what he stands for is second to none. Being a member of &lt;a href=&quot;http://seymourspeakers.freetoasthost.net/&quot;&gt;Toastmasters&lt;/a&gt; club, I cannot help it but to evaluate each in every speaker in my head. Let me tell you that Paul has it all figured out. He did have quite a few &amp;#8220;ums&amp;#8221; and &amp;#8220;ahs&amp;#8221; and his body language wasn&amp;#8217;t always sharp, but it didn&amp;#8217;t matter in this case. He was prepared, he sounded authoritative, knowledgeable and personal. Vocal variety was rich and appropriate and his eye contact made me feel welcomed. OK, enough about Toastmasters stuff.&lt;/p&gt;
&lt;p&gt;The main point about Architect Boot-camp is in its content. I was simply blown away. Five years that Paul and his associates spent on making &lt;span class=&quot;caps&quot;&gt;IASA&lt;/span&gt; what it is and working on all educational material manifested itself right there and then. I will not reproduce content of his slides here, I just want to point out three things. First, I got my main question answered. I now know the value proposition of &lt;span class=&quot;caps&quot;&gt;IASA&lt;/span&gt; and what differentiates it from other IT architecture associations and institutions. In the nutshell, &lt;span class=&quot;caps&quot;&gt;IASA&lt;/span&gt; strives to make &amp;#8220;IT Architect&amp;#8221; a profession in its fullest meaning of the word. This is exciting. I cannot help but feel sometimes as a hobbyist and amateur compared to people from law, medical and traditional engineering fields. This doesn&amp;#8217;t have to be this way. Second, the breath and depth of software architecture is staggering and it seems like &lt;span class=&quot;caps&quot;&gt;IASA&lt;/span&gt; has all the bases covered. As I continue my studies I will test this assumption, but so far I&amp;#8217;m impressed. Third, many things Paul mentioned really resonated with me and I want to be a more integral part of &lt;span class=&quot;caps&quot;&gt;IASA&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;The boot-camp was going at a tremendous pace, delivering lots of value, but then Paul had to leave and Cliff Berg stepped up to deliver the next chapter. This is where the fairy tale ended. The reason why this session was so useful and full with insight and knowledge was only in part because of content. The delivery of the content was an essential catalyst. Cliff is a seasoned IT professional and a smart man but he wasn&amp;#8217;t ready to lead the boot-camp. I don&amp;#8217;t mean any disrespect here, may be there was a miss-communication, lack of time, or any other objective reason. The end result was that we covered only about 20% of what was intended. Paul came back couple of hours later and finished the course as best as he could.&lt;/p&gt;
&lt;p&gt;The day ended with another treat for all attendees: &lt;strong&gt;thought leadership panel&lt;/strong&gt; with Angela Yochem, Grady Booch, Eric Evans, John Zachman, Roger Sessions and William H. Inmon. This was absolutely worth it. John predicted a new role of VP of Change in the future of organizations and William compared architecture with a road to his house. If I was making notes, I would have remembered much more&amp;#8230; One interesting thing that I noticed is that in more than couple occasions, Grady was shaking his head in disagreement when John was answering questions. I wish the host would have caught it all those times and let Grady offer his side. John was only present at the first day of the conference, so that was the only chance for him and Grady to exchange opinions.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://midnightit.files.wordpress.com/2009/10/panel.png&quot; alt=&quot;Panel&quot; title=&quot;Panel&quot; width=&quot;450&quot; height=&quot;337&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Looking forward for the day two now!&lt;/p&gt;</description>
        </item>
        
        
        
        <item>
            <title>Reboot</title>
            <link>http://www.yuriy-zubarev.com/blog/toastmasters/2009/07/30/reboot.html</link>
            <pubDate>Thu, 30 Jul 2009 00:00:00 -0700</pubDate>
            <description>&lt;p&gt;It&amp;#8217;s my first inspirational 2 minutes speech for Seymore Speakers club of Toastmasters International. I was extremely nervous earlier today and my voice trembled a bit during the presentation. Anyway, here it goes:&lt;/p&gt;
&lt;p&gt;Reboot. It&amp;#8217;s a very simple and short procedure that could yield very long lasting benefits. You reboot your computer when its performance becomes sluggish. It sometimes reboots itself when you try to stress it beyond its capacity. After a clean start, it is ready to take your orders again, and it generally performs faster and feels snappier, at least for some time. Even cell phones have become so much more sophisticated nowadays that they also demand an occasional reboot from their picky users.&lt;/p&gt;
&lt;p&gt;As advanced as the modern gadgets are, they are still like awkward, wooden toys compared to a complex nature of human body and mind. We granted reboot capability to these toys but we often fail to apply it to ourselves. It&amp;#8217;s time we learn back from our own creations.&lt;/p&gt;
&lt;p&gt;We live in a fast paced world. We try to multitask but fall short because only few people can truly multitask. The rest of us simply switch-tasking. Still, we want to stay competitive and we try even harder. We want to be nice to people who surround us and we make genuine promises that we find it harder and harder to keep. We get caught in a vortex of resolutions , deadlines, promises, goals and numerous to-do lists. We often burn ourselves, we get stressed and&lt;br /&gt;
sluggish. It is time to reboot.&lt;/p&gt;
&lt;p&gt;Meet with a person who you made the most promises to but weren&amp;#8217;t able to keep them. Apologize and ask to reboot your relationship. Make one promise and keep it.&lt;/p&gt;
&lt;p&gt;Throw away all your to-do lists, give yourself a week or few just to enjoy life without any guilt or stress. Compose then a new list with some goals that are really important to you and pursue them with a rekindled eagerness and enthusiasm.&lt;/p&gt;
&lt;p&gt;Sooner or later we may find ourselves exactly where we started: tired and frustrated, but we will know what to do. Reboot, and start all over again.&lt;/p&gt;</description>
        </item>
        
        
        
        <item>
            <title>97 Things Every Software Architect Should Know</title>
            <link>http://www.yuriy-zubarev.com/blog/2009/07/11/97-things-every-software-architect-should-know.html</link>
            <pubDate>Sat, 11 Jul 2009 00:00:00 -0700</pubDate>
            <description>&lt;p&gt;This is a Twitter of a book: 97 short but precise and relevant advices for software architects. Many advices may not address all of your concerns on particular topics and leave you only half-satisfied. Please don&amp;#8217;t fall into this trap! This book is not meant to be the main architecture book in your bookshelf with answers on all the questions. For me personally, reading &amp;#8220;97 Things&amp;#8221; was like looking into a mirror. I recollected doing some things right and other things wrong in the past; I saw myself making a good progress in one areas and luck of sufficient advancements in another ones. The book helped me to do a quick check of my skills and classify my experiences that I almost forgot. What more, it added more oil to the fire of wanting to keep learning and practicing software architecture.&lt;/p&gt;
&lt;p&gt;Overall, I would definitely recommend the book but only as a desert to a main course of classical books on software architecture. I would also like to provide some suggestions for improvements for the format.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Advices from giants of software architecture are noticeably missing. If you had to collect 97 pearls of wisdom, wouldn&amp;#8217;t you ask what Grady Booch, Philippe Kruchten and John A. Zachman, for example, have to say?&lt;/li&gt;
&lt;li&gt;Many advices convey the same point using a slightly different language. Because all the advices are not grouped in any way, the repetition doesn&amp;#8217;t seem to accentuate the point but rather appears as a filler. Offending topics are&lt;br /&gt;
&lt;ul&gt;&lt;br /&gt;
&lt;li&gt;Architect is a coder as well&lt;/li&gt;
&lt;li&gt;Data is a king&lt;/li&gt;
&lt;li&gt;Don&amp;#8217;t over-engineer&lt;/li&gt;
&lt;li&gt;Don&amp;#8217;t leave your soft skills undeveloped&lt;/li&gt;
&lt;li&gt;Architect is a leader&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
        </item>
        
        
        
        <item>
            <title>Communications of the ACM 02/09 vol. 52 no. 02</title>
            <link>http://www.yuriy-zubarev.com/note/2009/03/22/communications-of-the-acm-vol-52-no-02.html</link>
            <pubDate>Sun, 22 Mar 2009 00:00:00 -0700</pubDate>
            <description>&lt;h2&gt;Photography&amp;#8217;s Bright Future&lt;/h2&gt;
&lt;blockquote&gt;“There is tremendous enthusiasm for computational photography,” says Shree Nayar, a professor of computer science at Columbia University. “The game becomes interesting when you think about optics and computation within the same framework, designing optics for the computations and designing computations to support a certain type of optics.”&lt;br /&gt;
&lt;br /&gt;
One of the most visually striking examples of computational photography is high dynamic range (&lt;span class=&quot;caps&quot;&gt;HDR&lt;/span&gt;) imaging, a technique that involves using photoediting software to stitch together multiple images taken at different exposures.&lt;br /&gt;
&lt;br /&gt;
“We’d like to do the same thing with cameras,” Levoy says. “We’d like to allow a researcher to program a camera in a high-level language, like C++ or Python. I think we should have something in a year or two.”&lt;/blockquote&gt;
&lt;p&gt;This is pretty interesting. Cameras are following the footsteps of mobile phones. Soon, taken YachtWorld.com as an example, we will be writing Python scripts to automatically upload photos of yachts our brokers are taking. Those photos will be automatically cropped inside the camera itself and then uploaded to our Inventory Management Tool providing right credentials. Future does look interesting.&lt;/p&gt;
&lt;h2&gt;The Extent of Globalization of Software Innovation&lt;/h2&gt;
&lt;blockquote&gt;Has innovative activity in software become global? The question attracts interest because software has become a global business. For example, exports of business services and computer and information services grew at an average annual rate&lt;br /&gt;
of 27% in India (1995–2003) and at a rate of 46% in Ireland (1995–2004), with similar rapid growth in Brazil, China, and Israel. Yet, the question remains open. While software production takes place in many countries, innovative software is not created everywhere.&lt;br /&gt;
&lt;br /&gt;
In many cases innovation cannot be defined. For that matter, sometimes software cannot be defined.&lt;br /&gt;
&lt;br /&gt;
One measure of innovation appears in patent data. To be sure, not all inventions are patented and not all patents are important. &amp;#8230; In 2007, 12,692 U.S. software patents were issued to inventors in the U.S.—a larger number of patents than all other areas of the world combined (6,397).&lt;br /&gt;
&lt;br /&gt;
A key determinant of the location of development activities in software is the location of the user. This is particularly true with business software, which is often bundled with a set of business rules and assumptions about business processes.&lt;br /&gt;
&lt;br /&gt;
We see the same pattern today. Conditions for development of innovative new software products (and software firms) are propitious when they occur in proximity to potential lead users. A good example is Israel’s longstanding strength in security software, which arose in part due to the advanced needs of the Israeli defense forces.&lt;br /&gt;
&lt;br /&gt;
&amp;#8230; The firms we interviewed told us that supplies of fresh engineering graduates were plentiful in India, but it was much more difficult to find developers with project management experience and more difficult still to find those with critical business knowledge.&lt;br /&gt;
&lt;br /&gt;
What will the future bring? First, it does appear software product development and testing activities have become increasingly global. &amp;#8230; &lt;br /&gt;
&lt;br /&gt;
Many of these entry-level jobs are now going overseas. A declining demand today for entry-level programming jobs in the U.S. and increasing demand elsewhere could make it more difficult for U.S. workers—and relatively easier for those from other countries—to perform complex software design activity in the future. The implications of this would be a more globally dispersed pattern of innovation in software than we see today.&lt;/blockquote&gt;
&lt;p&gt;This makes a lot of sense. If I take only a technical knowledge from my 10 year IT experience, it wouldn&amp;#8217;t be valued that much on its own. What gives it an extra value is a context of business problems that I had to understand first before coming up with a technical solution. I&amp;#8217;ve been fortunate to participate in many sessions with subject matter experts and acquire knowledge from many different areas: HR, telecommunications, billing, sales, advertising and management. Having technical skills and understanding of a business is exactly what gives me, and many others like me, an advantage in coming up with innovative solutions. But it all started with me, as a junior programmer listening to &amp;#8220;mambo-jumbo&amp;#8221; of our director of HR. If today&amp;#8217;s junior developers cannot get jobs because those jobs are mostly technical and it&amp;#8217;s cheaper to outsource them, then developers from other countries will slowly start building up business knowledge and centers of innovations will be indeed dispersed. The lesson here is to be more then just a programmer to be in demand &amp;#8211; you have to have people, organizational and leadership skills, and business knowledge from couple of areas.&lt;/p&gt;
&lt;h2&gt;Parallel Programming with Transactional Memory&lt;/h2&gt;
&lt;p&gt;Good article that goes through theory, problems, potential solution and current state of Transactional Memory. It was interesting to see that databases were used to illustrate how transactions help with the problem of consistency. Everything old is new again. I already saw couple of projects using Transactional memory approach popping up on the horizon. I think I will wait a bit longer before given them a try:&lt;/p&gt;
&lt;blockquote&gt;TM promises to make parallel programming much easier. The concept of transaction is already present in many programs (from business programs to dynamic Web applications) and it proved to be reasonably easy to grasp for programmers. We can see fi rst implementations coming out now, but all are far from ready for prime time. Much research remains to be done.&lt;/blockquote&gt;
&lt;h2&gt;Improving Performance on the Internet&lt;/h2&gt;
&lt;p&gt;The article is written by co-founder of Akamai Technologies who serves as chief scientist there. The article introduces the concept of &amp;#8220;middle mile&amp;#8221;, highlights the challenges it presents and offers a look at the approaches to overcome these challenges.&lt;/p&gt;
&lt;blockquote&gt;When it comes to achieving performance, reliability, and scalability for commercial-grade Web applications, where is the biggest bottleneck? In many cases today, we see that the limiting bottleneck is the middle mile, or the time data spends traveling back and forth across the Internet, between origin server and end user.&lt;br /&gt;
&lt;br /&gt;
On the other hand, the Internet’s middle mile—made up of the peering and transit points where networks trade traffic—is literally a no man’s land. Here, economically, there is very little incentive to build out capacity. If anything, networks want to minimize&lt;br /&gt;
traffic coming into their networks that they don’t get paid for. As a result, peering points are often overburdened, causing packet loss and service degradation.&lt;br /&gt;
&lt;br /&gt;
It turns out that because of the way the underlying network protocols work, latency and throughput are directly coupled. &lt;span class=&quot;caps&quot;&gt;TCP&lt;/span&gt;, for example, allows only small amounts of data to be sent at a time (that is, the &lt;span class=&quot;caps&quot;&gt;TCP&lt;/span&gt; window) before having to pause and wait for acknowledgments from the receiving end. This means that throughput is effectively throttled by network round-trip time (latency), which can become the bottleneck for file download speeds and video viewing quality.&lt;br /&gt;
&lt;br /&gt;
Four Approaches to Content Delivery&lt;br /&gt;
&lt;br /&gt;
Centralized Hosting. Traditionally architected Web sites use one or a small number of collocation sites to host content.&lt;br /&gt;
&lt;br /&gt;
“Big Data Center” CDNs. Content delivery networks offer improved scalability by offloading the delivery of cacheable content from the origin server onto a larger, shared network. It may seem counterintuitive that having a presence in a couple dozen major&lt;br /&gt;
backbones isn’t enough to achieve commercial-grade performance. In fact, even the largest of those networks controls very little end-user access traffic. For example, the top 30 networks combined deliver only 50% of end-user traffic, and it drops off quickly from there, with a very long tail distribution over the Internet’s 13,000 networks. Even with connectivity to all the biggest&lt;br /&gt;
backbones, data must travel through the morass of the middle mile to reach most of the Internet’s 1.4 billion users.&lt;br /&gt;
&lt;br /&gt;
Highly Distributed CDNs. Another approach to content delivery is to leverage a very highly distributed network—one with servers in thousands of networks, rather than dozens. On the surface, this architecture may appear quite similar to the “big data center” &lt;span class=&quot;caps&quot;&gt;CDN&lt;/span&gt;. In reality, however, it is a fundamentally different approach to content-server placement, with a difference of two orders of magnitude in the degree of distribution.&lt;br /&gt;
&lt;br /&gt;
Peer-to-Peer Networks. P2P can be thought of as taking the distributed architecture to its logical extreme, theoretically providing nearly infi nite scalability. Moreover, P2P offers attractive economics under current network pricing structures. In reality, however, P2P faces some serious limitations, most notably because the total download capacity of a P2P network is throttled by its total uplink capacity.&lt;br /&gt;
&lt;br /&gt;
&amp;#8230; but many optimizations are made possible by using a highly distributed infrastructure:&lt;br /&gt;
&lt;br /&gt;
Optimization 1: Reduce transportlayer overhead.&lt;br /&gt;
Optimization 2: Find better routes.&lt;br /&gt;
Optimization 3: Prefetch embedded content.&lt;br /&gt;
Optimization 4: Assemble pages at the edge.&lt;br /&gt;
Optimization 5: Use compression and delta encoding.&lt;br /&gt;
Optimization 6: Offload computations to the edge.&lt;br /&gt;
&lt;br /&gt;
Designing a scalable system that works under these conditions means embracing the failures as natural and expected events. The network should continue to work seamlessly despite these occurrences. We have identified some practical design principles that result from this philosophy, which we share here:&lt;br /&gt;
&lt;br /&gt;
Principle 1: Ensure significant redundancy in all systems to facilitate failover.&lt;br /&gt;
Principle 2: Use software logic to provide message reliability.&lt;br /&gt;
Principle 3: Use distributed control for coordination.&lt;br /&gt;
Principle 4: Fail cleanly and restart.&lt;br /&gt;
Principle 5: Phase software releases.&lt;br /&gt;
Principle 6: Notice and proactively quarantine faults.&lt;/blockquote&gt;</description>
        </item>
        
        
        
        <item>
            <title>IEEE Computer January 2009</title>
            <link>http://www.yuriy-zubarev.com/note/2009/02/02/ieee-computer-january-2009.html</link>
            <pubDate>Mon, 02 Feb 2009 00:00:00 -0800</pubDate>
            <description>&lt;h2&gt;Is Cloud Computing Really Ready for Prime Time?&lt;/h2&gt;
&lt;blockquote&gt;Proponents tout the technology&amp;#8217;s advantages, including cost savings, high availability, and easy scalability.&lt;/blockquote&gt;
&lt;blockquote&gt;&amp;#8230; IT departments are still wary of it because they don&amp;#8217;t control the cloud-computing platform.&lt;/blockquote&gt;
&lt;blockquote&gt;&amp;#8230; So far, venture capitalists have not invested a lot of money in cloud-computing providers.&lt;/blockquote&gt;
&lt;blockquote&gt;&amp;#8230; key risks include reliability, security, the additional cost of the necessary network bandwidth, and getting locked into specific cloud-computing vendor.&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;strong&gt;Types of cloud services&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;Services.&lt;/strong&gt; Some products offer internet-based services &amp;#8211; such as storage, middleware, collaboration, and database capabilities &amp;#8211; directly to users.&lt;br /&gt;
&lt;strong&gt;IaaS&lt;/strong&gt;. Infrastructure-as-a-service products deliver a full computer infrastructure via the Internet.&lt;br /&gt;
&lt;strong&gt;PaaS&lt;/strong&gt;. Platform-as-a-service products offer a full a partial application development envirnment that users can access and utilize online, even in collaboration with others.&lt;br /&gt;
&lt;strong&gt;SaaS.&lt;/strong&gt; Software-as-a-service products provide a complete, turnkey applications &amp;#8211; including complex programs such as those for &lt;span class=&quot;caps&quot;&gt;CRM&lt;/span&gt; or enterprise-resource management via the Internet.&lt;/blockquote&gt;
&lt;blockquote&gt;A recent survey of CIOs and IT executives by &lt;span class=&quot;caps&quot;&gt;IDC&lt;/span&gt; rated security as their main cloud-computing concern. Almost 75 percent of respondents said they were worried about security.&lt;/blockquote&gt;
&lt;blockquote&gt;&amp;#8230; data stored in the cloud night be used anywhere in the world and thus might be subject to state or national data-storage laws related to privacy or record keeping.&lt;/blockquote&gt;
&lt;blockquote&gt;&amp;#8220;This has caused Amazon and other companies to develop offerings using storage facilities located in the EU.&amp;#8221;&amp;quot;&lt;/blockquote&gt;
&lt;blockquote&gt;Companies cannot pass audits of their capabilities by prospective clients if they can&amp;#8217;t demonstrate who has access to their data and how they keep unauthorized personnel from retrieving information.&lt;br /&gt;
&lt;br /&gt;
Cloud-computing vendors are addressing this concern by having third parties audit their systems in advance and by documenting procedures designed to address customers&amp;#8217; data-security needs.&lt;/blockquote&gt;
&lt;blockquote&gt;Cloud computing hasn&amp;#8217;t always provided round-the-clock reliability.&lt;br /&gt;
&lt;br /&gt;
For example, Salesforce.com left customers without service for six hours on 12 February 2008.&lt;br /&gt;
&lt;br /&gt;
And Amazon&amp;#8217;s S3 and EC2 services suffered a three-hour outage three days later.&lt;/blockquote&gt;
&lt;h2&gt;The changing paradigm of data-intensive computing&lt;/h2&gt;
&lt;p&gt;I get easily mesmerized by big scales, and the cover feature of the issue delivered on this premise. Words like Tbyte, Pbyte and &amp;#8220;1000-fold increase&amp;#8221; are common occurrences throughout this issue and this article in particular.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m also fortunate to work at &lt;a href=&quot;http://www.yachtworld.com&quot;&gt;YachtWorld.com&lt;/a&gt;. This is not the first time when the main theme of the current issue of a magazine strikes an accord with the progress and challenges we experience at YachtWorld. No, we don&amp;#8217;t process Pbytes of raw data (yet) but we recently hit a bar with Tbyte of raw data to be crunched and data-intensive computing is now a part of our world as well.&lt;/p&gt;
&lt;p&gt;How can a mid-size company can be constantly on the cutting edge of so many facets of IT? I think it&amp;#8217;s because we&amp;#8217;re a niche company. Our niche is a marine industry and we develop and support software solutions for nearly all facets of that industry: portals, &lt;span class=&quot;caps&quot;&gt;SEO&lt;/span&gt;, web services, &lt;span class=&quot;caps&quot;&gt;CMS&lt;/span&gt;, data warehousing, data exchange, inventory managements, ad management, e-commerce, etc.&lt;/p&gt;
&lt;blockquote&gt;The continued exponential growth of computational power, data-generation sources, and communication technologies is giving rise to a new era in information processing: data-intensive computing.&lt;br /&gt;
&lt;br /&gt;
&amp;#8230; Ability to tame a tidal wave of information will distinguish the most successful scientific, commercial, and national-security endeavors.&lt;/blockquote&gt;
&lt;blockquote&gt;&amp;#8230; found that &amp;quot;datasets being produced by experiments and simulations are rapidly outstripping our ability to explore and understand them&amp;#8230;&lt;/blockquote&gt;
&lt;blockquote&gt;The North American electric power grid operations generate 15 terabytes of raw data per year, and estimates for analytic results from control, market, maintenance, and business operations exceed 45 Tbytes/day. As developers add new high-resolution sensors to the grid, &lt;strong&gt;this data volume is increasing rapidly while the time available to make control decision remains constant&lt;/strong&gt;.&lt;/blockquote&gt;
&lt;p&gt;I think the highlighted portion of the quote above is the universal challenge for all data-intensive computing.&lt;/p&gt;
&lt;blockquote&gt;High-energy physics remains a leading generator of raw data. For example, the Atlas experiment for the Large Hadron Collider &amp;#8230; will generate raw data at a rate of 2 Pbytes per second beginning in 2008 and store about 10 Pbytes per year of processed data.&lt;/blockquote&gt;
&lt;p&gt;This is simply unbelievable! I fish these guys did a presentation on how they handle data processing at such an enormous rate.&lt;/p&gt;
&lt;blockquote&gt;In contrast to compute-intensive tasks where available processing power is the rate-limiting factor, data-intensive computing could be qualitatively defined as &amp;#8220;any computational task where data availability is the rate-limiting factor to producing time-critical solutions.&amp;#8221;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;strong&gt;Data-intensive computing styles&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Data-processing pipelines&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Data warehouses.&lt;/strong&gt; &amp;#8230; Wal-Mart&amp;#8217;s, has grown over a decade to store more than a petabyte, fueled by daily data from 800 million transactions generated by its 30 million customers.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Data centers&lt;/strong&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;Underlying the MapReduce programming model is the Google File System, along with its open source counterpart, the Hadoop Distributed File System. While these systems have much in common with traditional distributed file systems, they differ in that they are built based on the assumption that terabyte datasets will be distributed across thousands of disks attached to commodity compute nodes. In such environments, hardware failure occurs regularly. Hence, data redundancy, fault detection, and computation recovery are core facilities that the file system provides transparently to applications.&lt;/blockquote&gt;
&lt;blockquote&gt;The speed of light ultimately limits latency; this problem is at the heart of many data-intensive analyses.&lt;/blockquote&gt;
&lt;h2&gt;The 24-hour knowledge factory: can it replace the graveyard shift?&lt;/h2&gt;
&lt;p&gt;Discovery of the issue! I&amp;#8217;m already planning to talk to my boss about feasibility of this approach.&lt;/p&gt;
&lt;blockquote&gt;Collaborating centers in time zones six to eight hours apart can transfer work so that every center is working during the daytime. Although this concept avoids the hazards of night work, it requires careful planning and a way to automatically capture evolving knowledge.&lt;/blockquote&gt;
&lt;blockquote&gt;The key issues are how to hand over work in progress, decompose tasks into relatively autonomous units, and manage operations effectively in such a decentralized environments.&lt;/blockquote&gt;
&lt;blockquote&gt;&amp;#8230; Work transfer is really like work transformation, since each worker adds and reshapes knowledge before passing it on. Transformed tasks, in turn, lead to redefined job descriptions, which require expertise to break down and define.&lt;/blockquote&gt;
&lt;blockquote&gt;One obvious advantage was less time for tasks resolution. The gradual one-to-one pairing between onshore and offshore members made is easier to transfer tasks and knowledge. In one case, the US and Indian developers working in an interlaced mode (US sending the code for testing in the evening and getting programmer feedback from India in the morning) resolved a bug in half the time they would have taken in a conventional structure.&lt;/blockquote&gt;
&lt;blockquote&gt;A by-product of constant communication is superior documentation and knowledge dissemination.&lt;/blockquote&gt;
&lt;blockquote&gt;Geographic distance also means considerable handoff overhead. Work is transitioned every eight hours, and time and effort are involved in each handoff activity. The factory paradigm also involves considerable upfront effort in task decomposition. Someone must decide how to break down tasks in the various disciplines.&lt;br /&gt;
&lt;br /&gt;
Management and quality control become more burdensome.&lt;/blockquote&gt;
&lt;h2&gt;Professional and ethical dilemmas in software engineering&lt;/h2&gt;
&lt;blockquote&gt;The authors identify, categorize, and name nine specific ethical and professional dilemmas in software engineering, placing them in the context of the &lt;span class=&quot;caps&quot;&gt;IEEE&lt;/span&gt; code of conduct&amp;#8230;&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Mission imposible&lt;/li&gt;
&lt;li&gt;Mea culpa&lt;/li&gt;
&lt;li&gt;Rush job&lt;/li&gt;
&lt;li&gt;Not my problem&lt;/li&gt;
&lt;li&gt;Red lies&lt;/li&gt;
&lt;li&gt;Fictionware versus vaporware&lt;/li&gt;
&lt;li&gt;Nondiligence&lt;/li&gt;
&lt;li&gt;Canceled vacation&lt;/li&gt;
&lt;li&gt;Sweep it under the rug&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Web 3.0 emerging&lt;/h2&gt;
&lt;blockquote&gt;With Web 3.0, on the other hand, the explosion of data on the Web has emerged as a new problem space, and the new game-changing applications of this next generation of technology have yet to be developed.&lt;/blockquote&gt;
&lt;p&gt;In one article I read about an year ago, it was suggested that Web 3.0 is going to be a contest between 3 enablers: semantic web, rich multimedia and personalization/suggestion technologies. Please don&amp;#8217;t quote me on this but that&amp;#8217;s what I remember. This article declares a winner and it&amp;#8217;s Semantic Web (&lt;span class=&quot;caps&quot;&gt;RDFS&lt;/span&gt;, &lt;span class=&quot;caps&quot;&gt;OWL&lt;/span&gt;) and Linked Data (&lt;span class=&quot;caps&quot;&gt;RDF&lt;/span&gt;, &lt;span class=&quot;caps&quot;&gt;SPARQL&lt;/span&gt;). The previous article also outlined a challenge for semantic web adoption which was an unclear business model for profitability. I have to agree here. Let&amp;#8217;s take YachtWorld.com where we could expose boat information in a more semantic way. The first thing this would enable is for our competitors to scrape our data more easily than ever and present this data as their own. The current article is rather silent about this point but provides lots of success stories for non-commercial application of the technology. I&amp;#8217;m still very interested about a potential business model for semantic web applications but so far I failed to see it.&lt;/p&gt;</description>
        </item>
        
        
        
        <item>
            <title>IEEE Computer December 2008</title>
            <link>http://www.yuriy-zubarev.com/note/2009/01/26/ieee-computer-december-2008.html</link>
            <pubDate>Mon, 26 Jan 2009 00:00:00 -0800</pubDate>
            <description>&lt;h2&gt;Third-Generation &lt;span class=&quot;caps&quot;&gt;RFID&lt;/span&gt; Is on It&amp;#8217;s Way&lt;/h2&gt;
&lt;blockquote&gt;Early tags were passive, using signals from &lt;span class=&quot;caps&quot;&gt;RFID&lt;/span&gt; readers to power up. Newer technologies use active tags, which have their own battery power. The added power increases their communication range.&lt;br /&gt;
&lt;br /&gt;
The third generation of &lt;span class=&quot;caps&quot;&gt;RFID&lt;/span&gt; &amp;#8211; called wireless-sensor-network (&lt;span class=&quot;caps&quot;&gt;WSN&lt;/span&gt;) technology &amp;#8211; works with active tags. They gather information and then send it from tag to tag over a mesh network until it reaches the location at which the data will be processed.&lt;/blockquote&gt;</description>
        </item>
        
        
        
        <item>
            <title>Communications of the ACM 01/09 vol. 52 no. 01</title>
            <link>http://www.yuriy-zubarev.com/note/2009/01/26/communications-of-the-acm-vol-52-no-01.html</link>
            <pubDate>Mon, 26 Jan 2009 00:00:00 -0800</pubDate>
            <description>&lt;h2&gt;Students flock to game design&lt;/h2&gt;
&lt;blockquote&gt;As governments and universities worldwide develop strategies to reverse a dizzying downturn in computer science students, a hot field of study is getting even hotter and helping to rekindle interest in computer science. Game design has become a popular new major at more than 200 schools across the US&amp;#8230; Because game creation crosses several disciplines, the diversity of programs that offer such courses is stunning: Fine arts colleges, engineering schools, film schools, music schools, and even drama programs&amp;#8230; The jobs vary from inventing characters, to writing dialogs, composing music, creating digital scenes, and writing software that rules the fantasy worlds.&lt;/blockquote&gt;
&lt;h2&gt;Calculating the future&lt;/h2&gt;
&lt;p&gt;The article is about the scope and challenges of computer power in climate research. It&amp;#8217;s amazing how many input variables researchers have to account for considering all the possible permutations and a complex effect of one variable on others. Multiply this on the number of 3D points the calculations have to be applied on and you get a clear picture of how process intensive those calculations are. The scope and complexity also results in a trade-off: &lt;blockquote&gt;Is it better to compute existing models in finer details, or to make the models bigger by adding more scientific content?&lt;/blockquote&gt;&lt;/p&gt;
&lt;blockquote&gt;If the limiting factor in running a climate model on a multiprocessor system is inefficient communication of information within the program, then the amount of processing power dedicated to solving equations falls and the model fails to take advantage of the raw processing power available. The programming model we use now is not viable anymore in the next couple of generations of computers&amp;#8230;&lt;/blockquote&gt;
&lt;p&gt;As in many other areas, the software is slow to take advantage of hardware evolution.&lt;/p&gt;
&lt;h2&gt;The universe in Your Computer&lt;/h2&gt;
&lt;p&gt;The article describes Microsoft&amp;#8217;s WorldWide Telescope (&lt;span class=&quot;caps&quot;&gt;WWT&lt;/span&gt;) and Google sky. As a former teenager astronomer-enthusiast I found it fascinating that future generations of kids won&amp;#8217;t even have to have a telescope to study sky. All they would need is a computer and the Internet connection. I don&amp;#8217;t think, though, telescopes would ever go out of fashion. There is something magical in exploring the sky with your own eyes and catching a glimpse of a fallen star.&lt;/p&gt;
&lt;p&gt;Interesting excerpt in regards to bringing new forms of education into classrooms: &lt;blockquote&gt;Christin believes the key to Google Sky&amp;#8217;s success will be innovative educators. &amp;#8220;I&amp;#8217;m coming across the problem that the kids are way ahead of teachers,&amp;#8221; he says. &amp;#8220;We need to get teachers&amp;#8230; to understand that the student of the future and the worker of the future needs to be facile with finding information, analyzing it, applying critical thinking, making decisions, and finding the data they need to answer a question.&amp;#8221;&lt;/blockquote&gt;&lt;/p&gt;
&lt;h2&gt;Payment Via Wallet Phone&lt;/h2&gt;
&lt;blockquote&gt;There is also the major obstacle of working out new business models as the lines blur between banks, financial institutions, and cellphone companies.&lt;/blockquote&gt;
&lt;h2&gt;Get Smart&lt;/h2&gt;
&lt;p&gt;The article is about context aware capabilities of future generations of smartphones.&lt;/p&gt;
&lt;blockquote&gt;The problem with today&amp;#8217;s smartphones is that there&amp;#8217;s nothing terribly smart about them. Even the most souped-up devices amount to little more than stripped-down PCs, with tiny screens and maddening keyboards.&lt;br /&gt;
&lt;br /&gt;
The next generation of context-aware smartphones will take advantage of the growing availability of built-in physical sensors and better data exchange capabilities to support new applications that not only keep track of your personal data, but can also track your behavior and &amp;#8211; this is where truly smart part will finally come into play &amp;#8211; anticipate your intentions.&lt;br /&gt;
&lt;br /&gt;
Researches at &lt;span class=&quot;caps&quot;&gt;PARC&lt;/span&gt;, based in Palo Alto, CA, proposed four levels of system awareness: basic context awareness (including location, time, and other details of physical environment); behavior awareness (typing, walking, standing, or clicking a button); activity awareness (shopping, dining, or traveling); and intent awareness (predicting the future).&lt;br /&gt;
&lt;br /&gt;
&amp;#8230; To bring contextual computing to the masses, phone manufacturers and software vendors will have to overcome some major hurdles. Not the least of these is the lack of open standards for exchanging context data between applications.&lt;/blockquote&gt;
&lt;p&gt;This seems to be the rule of the game. When any software or hardware technology advances high enough to create a niche market, one of the biggest hurdles to bring the technology to the masses is the lack of open standards.&lt;/p&gt;
&lt;h2&gt;Law and Technology. The End of the Generative Internet&lt;/h2&gt;
&lt;p&gt;Jonathan Zittrain, the author of &lt;a href=&quot;http://www.amazon.com/gp/product/0300151241?ie=UTF8&amp;tag=fibonaccisolu-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0300151241&quot;&gt;The Future of the Internet&amp;#8212;And How to Stop It&lt;/a&gt;&lt;img src=&quot;http://www.assoc-amazon.com/e/ir?t=fibonaccisolu-20&amp;l=as2&amp;o=1&amp;a=0300151241&quot; width=&quot;1&quot; height=&quot;1&quot; border=&quot;0&quot; alt=&quot;&quot; style=&quot;border:none!important;margin:0!important;&quot; /&gt;, shares his thoughts on platforms market and its future implications. This is a pretty interesting analysis of likes of Apple and Facebook.&lt;/p&gt;
&lt;blockquote&gt;The book&amp;#8217;d thesis is that the mainstream computing environment we&amp;#8217;ve experienced for the past 30-plus years &amp;#8230; is an anomaly&amp;#8230; The basic building blocks of modern IT are PCs that anyone can reprogram, connected to an Internet that unquestioningly routes bits between two arbitrary points. This has led to a generative revolution  where novel and disruptive technologies have come from obscure backwaters &amp;#8211; and conquered. While incumbents bet on gated-community networks like CompuServe, Prodigy, and &lt;span class=&quot;caps&quot;&gt;AOL&lt;/span&gt;, or maker of &amp;#8220;smart appliances&amp;#8221; such as dedicated word processors and video-game consoles, dark-hourse candidates like the Internet and the PC emerged unexpectedly and triumphed, helped along by commercial forces that belatedly hpped on their bandwagons.&lt;br /&gt;
&lt;br /&gt;
So why anomalous?&lt;/blockquote&gt;
&lt;p&gt;Interesting thesis and even more interesting analysis.&lt;/p&gt;
&lt;blockquote&gt;Imagine if Windows had adjusted Windows to act the way the iPhone and Facebook aoos platforms do.&lt;br /&gt;
&lt;br /&gt;
The iPhone apps model is powerful, and it is serving some useful purpose in shielding people, prospectively and retroactively against bad code.&lt;/blockquote&gt; 
&lt;p&gt;&amp;#8230; but not against bad apps. Couldn&amp;#8217;t refuse to add. Anyway this is a serious article with many provocative points:&lt;/p&gt;
&lt;blockquote&gt;&amp;#8230; We likely wouldn&amp;#8217;t accept this situation in PC architecture, and yet it is commonplace in the ecosystem that will soon replace it. &amp;#8230; but even if one vendor doesn&amp;#8217;t capture the mobile phone or social networking spaces, the choices among them are shaping up to be choices among gates communities: equivalent of old &lt;span class=&quot;caps&quot;&gt;AOL&lt;/span&gt; vs. Prodigy vs. CompuServe&amp;#8230; This is one reason why Google&amp;#8217;s Android project is so fascinating: and attempt to bring the generativity of the PC to the mobile phone space. Without a security model better than the PC&amp;#8217;s security provisions, however, Android is a tough proposition. How long will users tolerate a phone for which clicking on the wrong link can disable it?&lt;/blockquote&gt;
&lt;p&gt;Good question especially if you take into consideration the previous article from the same issue: &amp;#8220;Payment Via Wallet Phone&amp;#8221;. If you phone is more then just a phone then will you be comfortable without a centralized body of control?&lt;/p&gt;
&lt;blockquote&gt;The way forward &amp;#8211; for both PCs and smartphones &amp;#8211; lies in a new security architecture that lets users make better-informed decisions about whether to run new software&amp;#8230;  There are many details to work out, but without ways of managing our generative platforms without a central gatekeeper, chances seem strong that most people will accept &amp;#8211; even demand &amp;#8211; outside control.&lt;/blockquote&gt;
&lt;h2&gt;From the Front Lines. Ground Control to Architect Tom&amp;#8230;&lt;/h2&gt;
&lt;p&gt;Humorous article with an awesome summary:&lt;/p&gt;
&lt;blockquote&gt;The ability to create an illusion of knowledge among people who don&amp;#8217;t know any better is really a trait of a shrewd salesperson, not a software architect.&lt;/blockquote&gt;
&lt;p&gt;I&amp;#8217;m heavily involved in hiring processes of technical talent at Boats.com/YachtWorld.com and I can attest that there are few shrewd and really slick people who are pretty good at creating illusion of knowledge.&lt;/p&gt;
&lt;h2&gt;The Business of Software. The Ontology of Paper.&lt;/h2&gt; 
&lt;p&gt;Interesting article about a diminishing role of paper in designing complex systems. The author still pays respect to paper and gives examples what it&amp;#8217;s good for. One aspect of the article that drew my attention is a reference to steam engines. Now, as a software engineer, I know exactly when to start thinking about a new career.&lt;/p&gt;
&lt;blockquote&gt;It&amp;#8217;s a common cliche that we are currently going through an &amp;#8220;Information Revolution&amp;#8221; that may be more profound in its consequences than the development of steam engines was in the Industrial Revolution. This is undoubtedly true, but it is missing one important point: the Industrial Revolution did not occur when we built steam engines, it occurred when we used steam engines to build steam engines.&lt;br /&gt;
&lt;br /&gt;
The true information and computing revolution will not occur until we use software to build software; until we really use executable knowledge to create executable knowledge.&lt;/blockquote&gt;
&lt;h2&gt;Eventually Consistent&lt;/h2&gt;
&lt;p&gt;If you&amp;#8217;re looking at this issue in a store then this article is enough to swing your vote and get the magazine. I follow religiously the blog of Werner Vogels where he published the &lt;a href=&quot;http://www.allthingsdistributed.com/2007/12/eventually_consistent.html&quot;&gt;original post&lt;/a&gt; served as a basis for this article. That blog post was the most interesting in 2007 in my books. When I first read it I felt enlightened because so much new knowledge opened before my eyes, and I also felt insignificant and dwarfed before challenges some people were facing. I think every IT professional should read this article.&lt;/p&gt;
&lt;h2&gt;The Long Road To 64 Bits&lt;/h2&gt;
&lt;p&gt;Discovery of the issue. I ventured to read this article thinking that I would drop it soon after because it would cater primary to hardware folks. I was wrong. I finished it in one gulp and found it extremely interesting for software people as well. The article masterfully tells a story of a painful progress to 64 bits and shares invaluable lessons:&lt;/p&gt;
&lt;blockquote&gt;Standards often get created in nonstandard ways, and often, de facto standards long precede oficial ones.&lt;br /&gt;
&lt;br /&gt;
Reasonable people can disagree, especially when looking at different sets of data.&lt;br /&gt;
&lt;br /&gt;
Sometimes one must work with competitors to make anything reasonable happen.&lt;br /&gt;
&lt;br /&gt;
Programmers take advantage of extra bits or ambiquity of specification&amp;#8230;&lt;br /&gt;
&lt;br /&gt;
Code can be recompiled, but once data gets written somewhere, any new code must still be able to describe it cleanly. Current software is rarely done from scratch but has to exist inside a large ecosystem.&lt;br /&gt;
&lt;br /&gt;
Hardware decisions last a long time, but software decisions may well last longer. If you&amp;#8217;re a practicing programmer, take pity on those who end up maintaining your code, and spend sometime thinking ahead. Allow for natural expansion of hardware, hide low-level details, and use the highest-level language you can. C&amp;#8217;s ability to make efficient use of hardware can be both a blessing and a curse.&lt;/blockquote&gt;
&lt;h2&gt;Computational Challenges in E-Commerce&lt;/h2&gt;
&lt;blockquote&gt;In this article, we prove an overview of four areas of computation in which incentives play a crucial role: resource allocation, knowledge integration, peer production and interaction, and the security and privacy.&lt;br /&gt;
&lt;br /&gt;
Allocating scarce resources &amp;#8211; from bread to bytes &amp;#8211; is a fundamental process that permeates economics and, indeed, society&amp;#8230;&lt;br /&gt;
&lt;br /&gt;
Advertising is a business based on allocating attention, one of the scarcest and most valuable of resources&amp;#8230;&lt;/blockquote&gt;
&lt;h2&gt;Voyagers and Voyeurs: Supporting Asynchronous Collaborative Visualization&lt;/h2&gt;
&lt;blockquote&gt;This article describes mechanisms for asynchronous collaboration in the context of information visualization, recasting visualization as not just analytic tool, but social spaces. We contribute the design and implementation of sense.us&amp;#8230;&lt;/blockquote&gt;
&lt;h2&gt;My sentiment from this issue&lt;/h2&gt;
&lt;p&gt;Mobile computing is rivaling PCs.&lt;/p&gt;</description>
        </item>
        
        

    </channel> 
</rss>

