<?xml version="1.0"?>
<rss version="2.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007" xmlns:atom="http://www.w3.org/2005/Atom">
   <channel>
      <title>CITCON Blog Aggregator</title>
      <description>Aggregates the blogs from various CITCON participants, and filters out the dupes amongst them. Filters out posts not related to CI &amp; Testing.</description>
      <link>http://pipes.yahoo.com/pipes/pipe.info?_id=b787fd1ec5db6b74feb6129e9d55dfe8</link>
      <atom:link rel="next" href="http://pipes.yahoo.com/pipes/pipe.run?_id=b787fd1ec5db6b74feb6129e9d55dfe8&amp;_render=rss&amp;page=2"/>
      <pubDate>Thu, 01 Oct 2015 21:38:31 +0000</pubDate>
      <generator>http://pipes.yahoo.com/pipes/</generator>
      <item>
         <title>Wrong usage of metrics could be devastating</title>
         <link>http://zagorskisoftwaretester.blogspot.com/2015/09/wrong-usage-of-metrics-could-be.html</link>
         <description>&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float:left;margin-right:1em;text-align:left;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.canddi.com/images/blog/2014-09-03/quantity.jpg&quot; style=&quot;clear:left;margin-bottom:1em;margin-left:auto;margin-right:auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;136&quot; src=&quot;https://www.canddi.com/images/blog/2014-09-03/quantity.jpg&quot; width=&quot;320&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align:center;&quot;&gt;credit:&amp;nbsp;www.canddi.com&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;TL;DR&lt;br /&gt;&lt;br /&gt;In this blog post I will compare wrong usage of metric in economy and software testing.&lt;br /&gt;&lt;br /&gt;Croatian economy is on the wrong path. One of the main reasons is very low level of economy reforms. We are still in chains of economy from socialism era. Croatian forces that are against change enjoy using wrong metrics in their favor. One of my favorite is:&lt;br /&gt;&lt;br /&gt;&quot;It was much better economy situation during the socialism. For example, city of Sisak alone had 30000 jobs.&quot;&lt;br /&gt;&lt;br /&gt;Using that metric, they want to stress out that unemployment rate in &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://en.wikipedia.org/wiki/Sisak&quot;&gt;Sisak&lt;/a&gt; was very low and that was good for economy.&lt;br /&gt;&lt;br /&gt;Software tester does not need to be economy guru, but he/she has at disposal &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.developsense.com/blog/2012/07/few-hiccupps/&quot;&gt;HICCUPPS&lt;/a&gt; consistency heuristics. Let's take comparable product (Cuba) consistency heuristics. In 2014 Cuba &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.tradingeconomics.com/cuba/unemployment-rate&quot;&gt;unemployment&lt;/a&gt; rate was 3.3%. Something fishy?&lt;br /&gt;&lt;br /&gt;The problem was with efficiency of those 30000 jobs in Sisak. &amp;nbsp;There were jobs without any purpose, many of workers did not provide any additional value. Let me clear that that was the system problem, not the workers.&lt;br /&gt;&lt;br /&gt;In software testing we have comparable wrong metric situation: number of test cases created and executed. If you need to explain your product owner why counting test cases is this wrong metric, you can use this blog post as a claim to prove that this is wrong and dangerous metric.</description>
         <author>Karlo Smid</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-7981906488772673202.post-999625365885588624</guid>
         <pubDate>Sat, 26 Sep 2015 11:52:00 +0000</pubDate>
      </item>
      <item>
         <title>Report on Testival.eu</title>
         <link>http://zagorskisoftwaretester.blogspot.com/2015/09/report-on-testivaleu.html</link>
         <description>&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://2.bp.blogspot.com/-BeR4XsTVJWk/Vf_k2qY68XI/AAAAAAAAAzc/elKVeks56Es/s1600/testival_poster_print.png&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;http://2.bp.blogspot.com/-BeR4XsTVJWk/Vf_k2qY68XI/AAAAAAAAAzc/elKVeks56Es/s400/testival_poster_print.png&quot; width=&quot;288&quot;/&gt;&lt;/a&gt;TL;DR&lt;br /&gt;&lt;br /&gt;In this post I will give brief report how we successfully connected 35 software testers. Testival.eu is an software tester event that was held last weekend in Microsoft Inovation Center Split.&lt;br /&gt;&lt;br /&gt;Format&lt;br /&gt;&lt;br /&gt;We mixed unconference model with two speaker sessions.&lt;br /&gt;&lt;br /&gt;Venue&lt;br /&gt;&lt;br /&gt;We had at our disposal three rooms: one with 40 seats, smaller one with 15 seats, and hall that also contained chairs.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float:right;margin-left:1em;text-align:right;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/-h_Et1fIdsUI/Vf_qV-wgasI/AAAAAAAAA0E/aA9I-AK7eQM/s1600/big.jpg&quot; style=&quot;margin-left:auto;margin-right:auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;150&quot; src=&quot;http://3.bp.blogspot.com/-h_Et1fIdsUI/Vf_qV-wgasI/AAAAAAAAA0E/aA9I-AK7eQM/s200/big.jpg&quot; width=&quot;200&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align:center;&quot;&gt;big room&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float:left;margin-right:1em;text-align:left;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/-7tyhjp136UM/Vf_qVzlxpKI/AAAAAAAAA0A/NzB7z77lvQI/s1600/hall.jpg&quot; style=&quot;margin-left:auto;margin-right:auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;150&quot; src=&quot;http://1.bp.blogspot.com/-7tyhjp136UM/Vf_qVzlxpKI/AAAAAAAAA0A/NzB7z77lvQI/s200/hall.jpg&quot; width=&quot;200&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align:center;&quot;&gt;hallway&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left:auto;margin-right:auto;text-align:center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/-jhVZ9mJvQ7g/Vf_qVsd_nRI/AAAAAAAAAz8/flobxMxEVmA/s1600/small.jpg&quot; style=&quot;margin-left:auto;margin-right:auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;150&quot; src=&quot;http://4.bp.blogspot.com/-jhVZ9mJvQ7g/Vf_qVsd_nRI/AAAAAAAAAz8/flobxMxEVmA/s200/small.jpg&quot; width=&quot;200&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align:center;&quot;&gt;small room&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Participants.&lt;br /&gt;&lt;br /&gt;Conference was free. Problem with free conference is that some people will register, but will not show up at the event. Our heuristics is 50% drop offs, and that was the case with Testival.eu 2015. From 70 registrations, &amp;nbsp;we had 35 participants with 34% of female testers! In the week of event, we asked registered participant to confirm their arrival.&lt;br /&gt;&lt;br /&gt;Friday&lt;br /&gt;&lt;br /&gt;We started with introductions. After that, Zeljko, Davor and I explained unconference format using post-it cards, in manner that we first time saw at CITCON &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://vimeo.com/60536127&quot;&gt;conference&lt;/a&gt;. Great way to keep people interested in the conference. Here is table with proposed sessions:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/-ys27k3eFySg/Vf_o3Pqyu7I/AAAAAAAAAzo/sKimN9hdhUw/s1600/IMG_0729.jpg&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;http://1.bp.blogspot.com/-ys27k3eFySg/Vf_o3Pqyu7I/AAAAAAAAAzo/sKimN9hdhUw/s320/IMG_0729.jpg&quot; width=&quot;320&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/-2sZnpZay9C8/Vf_o3EqvSFI/AAAAAAAAAzs/9dCNasmQ5OE/s1600/IMG_0730.jpg&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;http://4.bp.blogspot.com/-2sZnpZay9C8/Vf_o3EqvSFI/AAAAAAAAAzs/9dCNasmQ5OE/s320/IMG_0730.jpg&quot; width=&quot;240&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Alert! In unconference manner, participant are encouraged that they arrange sessions and merge them. We forgot to put deadline on that action! For example, I found out too late that my proposed session was moved earlier and I miss it. Also, Maaret said that before merging topics, it is very important to consult the card authors before you can do that.&lt;br /&gt;&lt;br /&gt;Saturday&lt;br /&gt;&lt;br /&gt;We had open and closing sessions. Open session was &quot;Collaborative Exploratory and Unit Testing&quot; by Maaret Pyhäjärvi. That session created my a-ha moment. Maaret is putting a lot of effort in collaborative testing. Which I think is a great idea. She also had a session about mob testing.&lt;br /&gt;&lt;br /&gt;In between opening and closing keynote, we had unconference sessions. Microsoft Information Center was witness of lively discussions about software testing. We had lunch at konoba (dalmatian restaurant) with traditional local dishes.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float:left;margin-right:1em;text-align:left;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/-Hvkzr6hgpK0/Vf_sH6pnHeI/AAAAAAAAA0Y/YE5t-dkGjfk/s1600/IMG_0727.jpg&quot; style=&quot;clear:left;margin-bottom:1em;margin-left:auto;margin-right:auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;http://3.bp.blogspot.com/-Hvkzr6hgpK0/Vf_sH6pnHeI/AAAAAAAAA0Y/YE5t-dkGjfk/s320/IMG_0727.jpg&quot; width=&quot;320&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align:center;&quot;&gt;lunch time&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Closing session was &quot;How do natural scientists test their ideas?&quot; by dr. Dario Hrupec. Dario explained how scientists test ideas. After his discussion with Maaret, he got his A-ha moment, what scientists and testers have in common: they both need to explore in order to be able to discover potential problem and propose its solution. For that activity, intelligence is not enough, curiosity and creativity are also very important.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float:right;margin-left:1em;text-align:right;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://2.bp.blogspot.com/-FlTWuMfo76c/Vf_tSciOC1I/AAAAAAAAA0k/koXY1rIMMsE/s1600/IMG_0736.jpg&quot; style=&quot;clear:right;margin-bottom:1em;margin-left:auto;margin-right:auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;http://2.bp.blogspot.com/-FlTWuMfo76c/Vf_tSciOC1I/AAAAAAAAA0k/koXY1rIMMsE/s320/IMG_0736.jpg&quot; width=&quot;320&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align:center;&quot;&gt;closing session&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;In the end, every participant shared its a-ha moment. We also draw lucky winners of three tickets for &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://2015.webcampzg.org/&quot;&gt;WebCamp 2015&lt;/a&gt; conference.&lt;br /&gt;&lt;br /&gt;</description>
         <author>Karlo Smid</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-7981906488772673202.post-3360831806734580269</guid>
         <pubDate>Mon, 21 Sep 2015 13:51:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://2.bp.blogspot.com/-BeR4XsTVJWk/Vf_k2qY68XI/AAAAAAAAAzc/elKVeks56Es/s72-c/testival_poster_print.png" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>Continuous Integration with UrbanCode Deploy and IBM Business Process Server</title>
         <link>https://developer.ibm.com/urbancode/2015/09/18/continuous-integration-with-urbancode-deploy-and-ibm-business-process-server/</link>
         <description>I recently had the chance to put together a demo for IBM Business Process Manager which inspired me to share the results in this blog post. Before I continue, I wanted to set the context because BPM can cover many &lt;div class=&quot;inline-block&quot;&gt;... &lt;/div&gt;</description>
         <author>BorisBoris</author>
         <guid isPermaLink="false">http://developer.ibm.com/urbancode/?p=18979</guid>
         <pubDate>Fri, 18 Sep 2015 14:10:46 +0000</pubDate>
         <content:encoded><![CDATA[<p>I recently had the chance to put together a demo for <a rel="nofollow" target="_blank" href="http://www-03.ibm.com/software/products/en/business-process-manager-family">IBM Business Process Manager</a> which inspired me to share the results in this blog post. Before I continue, I wanted to set the context because BPM can cover many things as <a rel="nofollow" target="_blank" href="http://www.ibm.com/developerworks/bpm/bpm2.html">IBM has quite a rich product set</a> in this area. In this post I will cover the continuous integration life cycle of <a rel="nofollow" target="_blank" href="http://www-03.ibm.com/software/products/en/integration-designer">IBM Integration Designer</a> project builds into IBM Business Process Servers, <em>not</em> the IBM Business Process Center/Business Modeler-type deployments.</p>
<h1> Overview </h1>
<p>First, I&#8217;ll cover some of the products that are being leveraged in this demo scenario. I have already mentioned some but to be more specific:</p>
<ul>
<li><a rel="nofollow" target="_blank" href="http://www-03.ibm.com/software/products/en/integration-designer"><strong>IBM Integration Designer (IID) (previously known as WebSphere Integration Developer)</strong></a><br />
From the <a rel="nofollow" target="_blank" href="http://www-03.ibm.com/software/products/en/integration-designer">IBM product page</a>, <em>&#8220;an Eclipse-based software development tool that renders your current IT assets into service components for reuse in service-oriented architecture (SOA) solutions.&#8221;</em>. In simpler terms, it takes a bunch of business workflows, interface mappings and integration points described in XML and written in Java that can be deployed into a IBM Business Process Server.<br />
It also comes with an integrated Business Process Server test environment that allows a developer to deploy a project locally for development and testing purposes from the IDE. From within this environment, a developer can also export an ear file build that gets deployed to a Business Process Server.</li>
<li><a rel="nofollow" target="_blank" href="http://www-03.ibm.com/software/products/en/rtc"><strong>IBM Rational Team Concert (RTC)</strong></a><br />
In a nutshell: integrated source configuration, work item, tracking and planning and build management. RTC integrates with IBM Integration Designer so that these capabilities are part of thedevelopers working environment. From here, the IID developer, can check in those workflows, mappings, interface definitions and other code, start builds (either personal or team) and collaborate with other developers through work items in an all-in-one integrated experience.
<li><a rel="nofollow" target="_blank" href="http://www-03.ibm.com/software/products/en/ucdep"><strong>UrbanCode Deploy</strong></a><br />
Considering that this blog finds its home in the <a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/blog/">UrbanCode Blog</a>, I won&#8217;t waste too many words about its functionality as the multiple blogs by my colleagues do a great job already. If you&#8217;re new to this product, <a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/products/urbancode-deploy/">this page</a> gives an excellent description. For the purposes of the demo scenario, I&#8217;ll be using the <a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/plugin/ibm-websphere-application-deployment-2/">WebSphere Application Server &#8211; Deployment Plugin</a> and the <a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/plugin/rational-team-concert-build/">built-in integration</a> with <a rel="nofollow" target="_blank" href="https://www-01.ibm.com/support/knowledgecenter/SSYMRC_5.0.2/com.ibm.team.build.doc/topics/t_build_overview.html">RTC&#8217;s build system</a> to provide automated deployment to IBM Business Process Servers (which are essentially <a rel="nofollow" target="_blank" href="http://www-03.ibm.com/software/products/en/appserv-was">WebSphere Application Servers</a> with <a rel="nofollow" target="_blank" href="http://www-01.ibm.com/software/info/bpm/what-is-bpm/">Business Process Management</a> capabilities added).</li>
<li><a rel="nofollow" target="_blank" href="http://www-03.ibm.com/software/products/en/business-process-manager-advanced"><strong>IBM Business Process Manager Advanced (BPM) (includes IBM Process Server; formally known as WebSphere Process Server)</strong></a><br />
This contains the IBM Business Process Server that takes artifacts authored using IID and brings them to life. Any application (<a rel="nofollow" target="_blank" href="https://en.wikipedia.org/wiki/EAR_(file_format)">EAR</a>) file that has been build using IID can be deployed to the IBM Business Process Server and it will start the required interfaces and bind the integration points as described by the workflows designed in IID. We will use UCD in combination with RTC to automate this process.</li>
</ul>
<p>The relationships between the products in a topology would look something like this:<br />
<div id="attachment_18988" style="width:543px;" class="wp-caption aligncenter"><a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Topology1.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Topology1.png" alt="Product Roles" width="533" height="616" class="size-full wp-image-18988"/></a><p class="wp-caption-text">Product Roles</p></div>
<p>To make the demo realistic, I wanted to create a setup that somewhat reflected reality so I start out by setting up several BPM environments: Development (DEV), Integration (INT), Quality Assurance (QA), and Production (PROD). There are teams responsible for developing the code base that gets deployed onto these BPM servers. That is, they each have their own source code stream in RTC (besides PROD which receives build via promotion from other environments).</p>
<div id="attachment_18990" style="width:310px;" class="wp-caption aligncenter"><a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/BPMSetup.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/BPMSetup-300x169.png" alt="Environments and Teams" width="300" height="169" class="size-medium wp-image-18990"/></a><p class="wp-caption-text">Environments and Teams</p></div>
<p>The teams and environments are described as follows.</p>
<ul>
<li><strong>Development:</strong> This is representative of one more teams, each being principally responsible for the development of a product component (sometimes called a component team). The Development team&#8217;s team builds get deployed into the DEV environment.</li>
<li><strong>Integration:</strong> This team is responsible for maintaining a clean status of the integration build, the build that is backed by an integration stream (INT) that contains all the changes from all development teams. As there is the possibility of merges occurring, especially in a BPM scenario, the integration team is responsible for working across the development teams to ensure that merges occur cleanly.The INT BPM Server contains the build which integrates all teams’ builds prior to quality assurance subsequent to production.</li>
<li><strong>Quality Assurance:</strong> Integration Builds will be going through the rigor of QA testing and may contain additional artifacts (translation, legalese). There is an additional quirk in that a QA build can contain fixes performed by the Quality Assurance team that have not yet been integrated into development (now that&#8217;s agile!). This is why QA also has an RTC stream and build.</li>
<li><strong>Production:</strong> A production server heavily wrapped in red tape: approvals and gates. There is no RTC stream, as this is primarily a release engineering team.</li>
</ul>
<p>For this blog post, I’ll demonstrate the end-to-end continuous integration scenario for deploying a DEV build, so we’ll just be dealing with the Development (DEV) stream but you will see the other streams, environments and teams reflected in the setup and the screenshots.</p>
<h1> Setup </h1>
<p>Describing the setup in some detail goes a long way to explaining the scenario, so let’s dive right into it. You can follow along but you will need to already have the <a rel="nofollow" target="_blank" href="http://www-03.ibm.com/software/products/en/business-process-manager-advanced">IBM Business Process Manager Advanced</a> and <a rel="nofollow" target="_blank" href="http://www-03.ibm.com/software/products/en/integration-designer">IBM Integration Designer</a> products.  As they are no publically downloadable evaluations or trails you’ll need to contact an <a rel="nofollow" target="_blank" href="http://www.ibm.com/connect/ibm/us/en/">IBM Sales representative</a> to arrange one or already be entitled. There is, however, evaluations of <a rel="nofollow" target="_blank" href="http://www-03.ibm.com/software/products/en/ucdep">UrbanCode Deploy</a> server and <a rel="nofollow" target="_blank" href="http://www-03.ibm.com/software/products/en/rtc">Rational Team Concert</a> for which I provide the links for below.</p>
<ul>
<li><strong>UrbanCode Deploy Server</strong><br />
I downloaded and installed a UCD Server on a server machine.  If you don’t have UCD, you can fetch a trail version <a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/products/urbancode-deploy/">from here</a>.<br />
If you are not sure about how to install UCD, you can find <a rel="nofollow" target="_blank" href="http://www-01.ibm.com/support/knowledgecenter/SS4GSP/ucd_welcome.html">documentation here</a>.<br />
There is nothing special about the install itself, I installed a versioning UCD agent on the same machine although it’s unused when using the RTC build system integration as builds are pushed from RTC’s build engine (Jazz Build Engine/JBE) and do not need to be pulled from UCD. (Pulling versions requires a versioning agent.) I install it anyway to get rid of the warning on the UCD page about a missing versioning agent but this is optional, you can simply ignore the warning.
</li>
<li><strong>UrbanCode Deploy WebSphere Deploy Plugin</strong><br />
I downloaded the <a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/plugin/ibm-websphere-application-deployment-2/">WebSphere Application Server &#8211; Deployment plugin</a>, as for all intents and purposes installing an EAR file into IBM Process Server is identical.
</li>
<li><strong>RTC Server installation</strong><br />
I downloaded and installed RTC on a machine.  If you don’t have RTC, you can <a rel="nofollow" target="_blank" href="https://jazz.net/downloads/rational-team-concert">download a version that’s free for 10 developers</a>. If you are not sure about how to install and set up RTC, you can find <a rel="nofollow" target="_blank" href="http://www-01.ibm.com/support/knowledgecenter/SSCP65/welcome">documentation here</a>.<br />
Remember to set the public URL of the RTC to something that is accessible from the UCD server and from the developer’s workstation, which will have IID with the RTC client integration.
</li>
<li><strong>IBM Business Process Manger Advanced Servers</strong>
<ol style="list-style-type:lower-alpha;">
<li>I installed IBM Business Process Manger Advanced on all machines which constitute the environments (DEV, INT, QA, PROD) that will receive builds to deploy. The detailed installation instructions can be <a rel="nofollow" target="_blank" href="http://www-01.ibm.com/support/knowledgecenter/SSFTN5/welcome">found here</a>.<br />
I Installed the BPM into <em>C:&#92;IBM&#92;WebSPhere&#92;AppServer</em> (as I was using a Windows machine)
</li>
<li>The <a rel="nofollow" target="_blank" href="https://www-01.ibm.com/support/knowledgecenter/SS4GSP_6.1.1/com.ibm.udeploy.doc/topics/agent_installremote.html">UrbanCode Deploy Agent was installed</a> on each of the BPM and connected them to the UrbanCode Deploy Server. This will allow the ear files built by the RTC Build Engine to be deployed into BPM.</li>
<li>We also need to <a rel="nofollow" target="_blank" href="https://www-01.ibm.com/support/knowledgecenter/SSCP65_6.0.0/com.ibm.jazz.install.doc/topics/t_install_build_toolkit.html">install the RTC Build System Toolkit</a> on these machines. You can download the <a rel="nofollow" target="_blank" href="https://jazz.net/downloads/rational-team-concert/releases/6.0?p=allDownloads">RTC Build System Toolkit here</a>; it will need to be connected to the RTC server on start-up.<br />
As I installed BPM on Windows machines I created a build directory in C:&#92;build that looks like this:<br />
<div id="attachment_18996" style="width:505px;" class="wp-caption aligncenter"><a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_182.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_182.png" alt="Build Directory" width="495" height="141" class="size-full wp-image-18996"/></a><p class="wp-caption-text">Build Directory</p></div><br />
The <em>startJBE.bat</em> just contains the following line as I unzipped the Build System Toolkit into the root of C, <em>https://demo:10443/ccm</em> is the public url of my RTC server and I am using a <em>demo</em> user to connect. (You’d normally want to create a <em>build</em> user for these purposes.) I created a build engine definition in RTC called <em>dev</em> so that the build engine knows which RTC build engine definition it attached to. (More on this later). <em>Pass.txt</em> contains the encoded password for the demo user.
<p><code>C:&#92;jazz&#92;buildsystem&#92;buildengine&#92;eclipse&#92;jbe.exe -repository https://demo:10443/ccm -userId demo -passwordFile pass.txt -engineId dev</code></p>
<p>(It should be noted that these machines are great candidates for a Blueprint in <a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/products/urbancode-deploy-with-patterns/">UrbanCode Deploy Blueprint designer</a>.)</p>
<li>
<ol>
</li>
<li><strong>Development Workstation</strong><br />
The developer workstation has the IBM Integration Designer with the RTC capabilities installed via the the <a rel="nofollow" target="_blank" href="https://jazz.net/downloads/rational-team-concert/releases/6.0?p=allDownloads">RTC p2 Install Repository</a>.  You can use the Install repository as a local updates site to install RTC from.</li>
</ul>
<h1> Product Configurations </h1>
<h3>Rational Team Concert</h3>
<p>The idea is to set up a project area and several teams which are responsible for maintaining a team stream (responsible for development of some aspect of the system being deployed). Each team has a team lead and there could also be several other developers working on the teams. Each team member is responsible for ensuring that their team stream adopts changes from other teams via the integration stream and at the same time delivers changes into the integration stream. In doing so, they also need to ensure that they don’ break the team and integration builds.  The team lead monitors the team build to ensure that the build and the deployment are green but they also need to ensure the integration stream build and deployment are green. The integration team would be responsible for making sure all changes from team streams delivered into the integration stream doesn&#8217;t break the build.</p>
<p>A typical DEV team flow would look something like this:</p>
<div id="attachment_19002" style="width:310px;" class="wp-caption aligncenter"><a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/DEVTeam.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/DEVTeam-300x195.png" alt="DEV Team Delivery" width="300" height="195" class="size-medium wp-image-19002"/></a><p class="wp-caption-text">DEV Team Delivery</p></div>
<p>In order to shorten an already lengthy post, I will not go through such a large scenario in this blog and concentrate on this one team, DEV though I have set up the structure to respect the work flow depicted. Generally, the same pattern can be applied to the other teams and builds.</p>
<p>Check the <a rel="nofollow" target="_blank" href="http://www-01.ibm.com/support/knowledgecenter/SSCP65/welcome">RTC Knowledge Center</a> if you don’t know the details of how to perform these operations. These are the things that I did to get the basic flow working:</p>
<ol>
<li>As the RTC administrator user, created some other users in RTC: <em>DEV Developer</em> (devdeveloper), and <em>DEV Team Lead</em> (devlead).<a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_184.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_184.png" alt="Selection_184" width="888" height="220" class="aligncenter size-full wp-image-19020"/></a></li>
<li>Launched <em>IBM Integration Designer</em> and created a connection to RTC using the administrator (<em>demo</em> in my case) in the <em>Work Item</em> perspective.</li>
<li>Create a project area called <em>Demo</em> using the <em>Scrum Process</em> and assigned the administrator user as an administrator of the project and to the <em>Product Owner</em> role. I also assigned the <em>DEV Team Lead</em> (devlead) as a project <em>Team Member</em>.</li>
<li>I created a <em>DEV</em> team , assigned <em>DEV Team Lead</em> as the <em>Scrum Master</em> and the <em>DEV Developer</em> as a <em>Team Member</em><br />
<a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_1871.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_1871-300x159.png" alt="Selection_187" width="300" height="159" class="aligncenter size-medium wp-image-19103"/></a><br />
<a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_186.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_186.png" alt="Selection_186" width="295" height="159" class="aligncenter size-full wp-image-19109"/></a>
</li>
<li>In preparation for importing the IID sample project, I created Release 1.0 stream owned by the DEV team with four components:
<ol style="list-style-type:lower-alpha;">
<li><strong>Library -&gt;</strong> Contains the IID sample library project</li>
<li><strong>Mediation -&gt;</strong> Contains the IID sample Mediation Project</li>
<li><strong>Service -&gt;</strong> Container the IID Sample Service Project</li>
<li><strong>Release Engineering -&gt;</strong> Contains the build files</li>
</ol>
</li>
<p><a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_183.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_183-300x135.png" alt="Selection_183" width="300" height="135" class="aligncenter size-medium wp-image-19023"/></a>
</li>
</ol>
<p>We now have a basic stream setup and we should import some code. I switched to a new IID workspace and logged in as the DEV Team Lead user (devlead). Then I</p>
<ol>
<li>Created a workspace off of the DEV team’s Release 1.0 stream with team visibility (scope) with all components.<a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_191.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_191.png" alt="Selection_191" width="571" height="42" class="aligncenter size-full wp-image-19026"/></a></li>
<li>Imported the IID Hello World sample project completed artifacts which can be imported via the <em>Help-&gt;Samples and Tutorials -&gt; IID Integration Designer</em> menu.<br />
<a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_190.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_190-300x193.png" alt="Selection_190" width="300" height="193" class="aligncenter size-medium wp-image-19027"/></a></li>
<li>Created a <em>Release Engineering</em> Eclipse project in the Java perspective with the following structure and these two files. These will be the files used by the build, the <a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/build.xml">build.xml</a> is used to communicate with RTC, which the <a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/iidBuild.xml">iidBuild.xml</a> uses BPM server service deploy tags to build the ear file. I right clicked on the project context menu, <em>Team-&gt;Share Project…</em> and added the <em>Release Engineering</em> Project to the <em>Release Engineering</em> Component in Jazz SCM.<br />
<a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_178.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_178.png" alt="Selection_178" width="517" height="115" class="aligncenter size-full wp-image-19036"/></a></li>
<li>Switched to the Business Integration perspective, right clicked on the project context menu, <em>Team-&gt;Share Project</em> and added the sample:<br />
<a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_1761.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_1761-300x132.png" alt="Selection_176" width="300" height="132" class="aligncenter size-medium wp-image-19105"/></a>
<ol style="list-style-type:lower-alpha;">
<li><em>HelloService</em> to the <em>Service</em> Component</li>
<li><em>HelloWorldLibrary</em> to the <em>Library</em> Component</li>
<li><em>HellowWorldMediation</em> to the <em>Mediation</em> Component</li>
<li>Delivered into the <em>Release 1.0 (DEV)</em> stream using the <em>Pending Changes</em> view</li>
</ol>
<p><a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_1921.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_1921-300x70.png" alt="Selection_192" width="300" height="70" class="aligncenter size-medium wp-image-19106"/></a>
</li>
</ol>
<p>Once the code has been added, we can now create the build engine and definitions. To make things easier, I switch back over to the demo IID workspace as this is also our build user.  Then I:</p>
<ol>
<li>Created a build engine called <em>dev</em> which the build engine on the <em>dev</em> BPM machine will bind. There are several properties that are used by the ant scripts that should be defined here:<br />
<a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_148.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_148-300x139.png" alt="Selection_148" width="300" height="139" class="aligncenter size-medium wp-image-19044"/></a>
<table border="0" style="width:100%;" cellpadding="0" cellspacing="0">
<tr>
<td><strong>jazzBuildTookit</strong></td>
<td><code>C:&#92;jazz&#92;buildsystem&#92;buildtoolkit</code></td>
</tr>
<tr>
<td><strong>jbePasswordFile</strong></td>
<td><code>C:&#92;build&#92;pass.txt</code></td>
</tr>
<tr>
<td><strong>jbeProperties</strong></td>
<td><code>C:&#92;build&#92;jbe-properties&#92;${buildLabel}.properties</code></td>
</tr>
<tr>
<td><strong>jbeRoot</strong></td>
<td><code>C:&#92;build</code></td>
</tr>
<tr>
<td><strong>jbeWorkspaceRoot</strong></td>
<td><code>C:&#92;build&#92;workspaces</code></td>
</tr>
<tr>
<td><strong>wps.home</strong></td>
<td><code>C:&#92;IBM&#92;WebSphere&#92;AppServer</code></td>
</tr>
</table>
</li>
<li>We’ll create a build definition call <em>DEV Service Build</em> owned by the DEV team area using
<ol style="list-style-type:lower-alpha;">
<li>the <em>Ant &#8211; Jazz Build Engine</em> template</li>
<li>The <em>Jazz Source Control</em> pre-build step</li>
<li><em>Post-Build Deploy</em> post-build step</li>
</ol>
</li>
<li>In the <em>DEV Service Build Overview</em> tab, add <em>dev</em> as the <em>Supported Build Engine</em></li>
<li>In the <em>Properties</em> tab set the following properties<br />
<a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_150.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_150-300x148.png" alt="Selection_150" width="300" height="148" class="aligncenter size-medium wp-image-19050"/></a>
<table border="0" style="width:100%;" cellpadding="0" cellspacing="0">
<tr>
<td><strong>build.output.dir</strong></td>
<td><code>${jbeRoot}/builds</code></td>
</tr>
<tr>
<td><strong>build.working.dir</strong></td>
<td><code>${jbeRoot}</code></td>
</tr>
<tr>
<td><strong>componentVersion</strong></td>
<td><code>${stream}-${buildLabel}</code></td>
</tr>
<tr>
<td><strong>library</strong></td>
<td><code>HelloWorldLibrary</code></td>
</tr>
<tr>
<td><strong>module</strong></td>
<td><code>HelloService</code></td>
</tr>
<tr>
<td><strong>stream</strong></td>
<td><code>DEV</code></td>
</tr>
<tr>
<td><strong>team.udeploy.debug</strong></td>
<td><code>false</code></td>
</tr>
<tr>
<td><strong>team.udeploy.timeout</strong></td>
<td><code>480</code></td>
</tr>
</table>
</li>
<li>In the <em>Jazz Source Control</em> tab<br />
<a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_151.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_151-300x158.png" alt="Selection_151" width="300" height="158" class="aligncenter size-medium wp-image-19052"/></a>
<ol style="list-style-type:lower-alpha;">
<li>Create a workspace that flows from the <em>Release 1.0 (DEV)</em> stream called <em>Release 1.0 DEV Service Build</em> that is DEV team scoped and contains all the components.</li>
<li>In the <em>Load Options</em>, set the <em>Load directory</em> to <code>${jbeWorkspaceRoot}/${team.scm.workspaceUUID}</code></li>
<li>Select <em>Delete directory before loading</em> and all the <em>Accept Options</em></li>
</ol>
</li>
<li>In the Ant tab<br />
<a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_152.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_152-300x183.png" alt="Selection_152" width="300" height="183" class="size-medium wp-image-19067"/></a><a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_153.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_153-300x202.png" alt="Selection_153" width="300" height="202" class="size-medium wp-image-19068"/></a>
<ol style="list-style-type:lower-alpha;">
<li>set the <em>Build file</em> to <code>${team.scm.fetchDestination}/Release Engineering/ant/build.xml</code></li>
<li>Set the check mark to <em>include the Jazz build toolkit tasks</em></li>
<li>Set the <em>Properties file</em> to <code>${build.output.dir}/${componentVersion}/jbe.properties</code></li>
</ol>
</li>
<li>In the <em>Post-build deploy</em> tab<br />
<a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_154.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_154-300x203.png" alt="Selection_154" width="300" height="203" class="size-medium wp-image-19070"/></a><a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_1561.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_1561-300x204.png" alt="Selection_156" width="300" height="204" class="size-medium wp-image-19072"/></a><a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_155.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_155-300x203.png" alt="Selection_155" width="300" height="203" class="size-medium wp-image-19071"/></a>
<ol style="list-style-type:lower-alpha;">
<li>set the <em>Enable</em> flag and deploy <em>if build has no errors or warnings</em></li>
<li>Do not set deploy for personal builds</li>
<li>Set the Server URI of the UCD server. This is the URL you use to access the UCD web interface</li>
<li>Set a user name, the user needs to have appropriate access to the resource in UCD related to deploying the service component to the <em>DEV environment</em>. For now we can use the UCD <em>admin</em> user. This can be changed later. Test the connection to ensure connectivity.
</ol>
<p>Set these properties</p>
<ol style="list-style-type:lower-alpha;">
<li><strong>Component:</strong> <code>${module}</code></li>
<li><strong>Version:</strong> <code>${componentVersion}</code></li>
<li><strong>Base Directory:</strong> <code>${build.output.directory}</code></li>
<li><strong>Include Files:</strong> <code>${module}.ear</code></li>
<li><strong>Links:</strong> <code>RTC Build Result=${repositoryAddress}resource/itemOid/com.ibm.team.build.BuildResult/${buildResultUUID}</code></li>
</ol>
<p>In the Process Section Enable “Run Application Process” and set</p>
<ol style="list-style-type:lower-alpha;">
<li><strong>Application:</strong> <code>HelloWorld</code></li>
<li><strong>Environment:</strong> <code>${stream}</code></li>
<li><strong>Process:</strong> <code>Deploy</code></li>
</ol>
</li>
<li>You should now duplicate this build definition and call it <em>DEV Mediation Build</em>. Everything should be kept identical except:
<ol style="list-style-type:lower-alpha;">
<li>Create and use a new workspace called <em>Release 1.0 DEV Mediation Build</em> that also flows from the <em>Release 1.0 (DEV)</em> stream that is DEV team scoped and contains all the components.</li>
<li>Set the <strong>module</strong> property in the <em>Properties</em> tab to <code>HelloWorldMediation</code></li>
</ol>
</li>
</ol>
<p>At the end of this your project tree should looks something like this:<br />
<a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_1891.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_1891-195x300.png" alt="Selection_189" width="195" height="300" class="aligncenter size-medium wp-image-19108"/></a></p>
<p>Make sure not to forget to start the RTC build engine on the BPM DEV machine after which you should be able to create builds in RTC but unless we create the artifacts in UCD that are used by RTC, it won’t deploy.</p>
<h3>UrbanCode Deploy</h3>
<p>UCD will be much simpler to setup as I have exported the entire application. The only thing you need to make sure is that you have loaded the <a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/plugin/ibm-websphere-application-deployment-2/">WebSphere Application Server –Deployment Automation Plugin</a> in the UCD Settings before you attempt to import it or continue. We’ll need some of the resource roles provided by the plugin in order to set up the resource tree in UCD to reflect the BPM deployments.<br />
If the agents were installed correctly they should already be in the Agents tab under Resources. </p>
<ol>
<li>In the <em>Components</em> Tab Create two components called <em>HelloService</em> and <em>HelloWorldMediation</em>, leaving all the defaults. These are just placeholders for now.<a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_164.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_164.png" alt="Selection_164" width="882" height="270" class="aligncenter size-full wp-image-19078"/></a></li>
<li>In the Resource tree
<ol style="list-style-type:lower-alpha;">
<li>Create a folder called <em>DEV Servers</em> and add the DEV BPM server agent to the folder. This should create a new resource bound to the agent. If you want to keep things simple, rename the resource (not the agent) to <code>dev.example.com</code> as it will already be bound to the environment when you do the application import. (Otherwise you’ll have to bind it yourself)</li>
<li>Click <em>Show-&gt;Resource Roles</em> to bring up the resource roles panel and drag <em>WebSphere Cell</em> under <code>dev.example.com</code> and rename it to <em>PSCell1</em> (the default for BPM)</li>
<li>Modify the entries in the tree to facilitate this path, these are the defaults unless you changed them during BPM install and configuration, in which case use the value from the DEV environment BPM.<br />
<code>/DEV Servers/dev.example.com/PSCell1/Nodes/Node1/Servers/server1/</code></li>
<li>Add the <em>HelloService</em> and <em>HelloWorldMediation</em> components directly under <code>/DEV Servers/dev.example.com/PSCell1/Nodes/Node1/Servers/server1/</code></li>
</ol>
<p>When finished the resource tree should looke like:<br />
<a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_193.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_193.png" alt="Selection_193" width="1036" height="552" class="alignright size-full wp-image-19079"/></a>
</li>
<li>At this point is probably worthwhile to define a resource template for the agent so that when configuring the resource tree for other agents, the template can be implied instead of redoing the entire tree. (Unless the cell, node and server names are different for all your servers in which case a template may not be as useful.)</li>
<li>Finally, import the <a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/HelloWorld.zip">HelloWorld.json</a> Application in the zip file and selecting  “Upgrade Component If Exists”.<br />
<a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_194.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_194.png" alt="Selection_194" width="372" height="250" class="aligncenter size-full wp-image-19112"/></a>
</li>

<p>Feel free to examine the component processes in UCD and the environment, most of the heavy lifting is done by the WebSphere Plugin and all we do is provide bindings between the RTC build output and BPM.<br />
The last thing is to create users for the <em>DEV Team Lead</em> and <em>DEV developer</em> in urbancode deploy.  As I did in RTC, I also created team corresponding to the environments I then assigned <em>DEV Team Lead</em> and <em>DEV developer</em> to the <em>Development</em> team using the pre-packaged manager and developer roles. I then assigned the relevant objects using the team object mappings using the Standard type.<br />
<strong>Agent:</strong> <code>dev.example.com</code><br />
<strong>Application:</strong> <em>HelloWorld</em><br />
<strong>Component:</strong> <em>HelloService, HellowWorldMediation</em><br />
<strong>Environment</strong>: <em>HelloWorld/DEV</em><br />
<strong>Resource:</strong> <em>DEV Servers/** (the entire resource tree)</em><br />
<a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_195.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_195-300x247.png" alt="Selection_195" width="300" height="247" class="aligncenter size-medium wp-image-19113"/></a></p>
<p>That should do it; you now have a continuous integration pipeline! To see it in action kick off a build in RTC, this should succeed in create a build record linked to the version that is uploaded to UDC. This version will be deployed using the application process for the specific environment bound to the BPM server. Checkout the following screenshots to see it in action.<br />
<a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_168.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_168-300x188.png" alt="Selection_168" width="300" height="188" class="alignnone size-medium wp-image-19082"/></a><a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_169.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_169-300x94.png" alt="Selection_169" width="300" height="94" class="alignnone size-medium wp-image-19083"/></a><a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_170.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_170-300x109.png" alt="Selection_170" width="300" height="109" class="alignnone size-medium wp-image-19084"/></a><a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_171.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_171-300x70.png" alt="Selection_171" width="300" height="70" class="alignnone size-medium wp-image-19085"/></a><a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_172.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_172-300x86.png" alt="Selection_172" width="300" height="86" class="alignnone size-medium wp-image-19086"/></a><a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_173.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_173-300x124.png" alt="Selection_173" width="300" height="124" class="alignnone size-medium wp-image-19087"/></a><a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_174.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_174-300x48.png" alt="Selection_174" width="300" height="48" class="alignnone size-medium wp-image-19088"/></a><a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_175.png"><img src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2015/09/Selection_175-300x112.png" alt="Selection_175" width="300" height="112" class="alignnone size-medium wp-image-19089"/></a></p></ol></ol></ol>]]></content:encoded>
      </item>
      <item>
         <title>Pulse Admin UI Updates</title>
         <link>http://www.alittlemadness.com/2015/09/18/pulse-admin-ui-updates/</link>
         <description>In my previous post, Pulse Roadmap Update, I mentioned that we are working on major changes to the Pulse administration UI. I also mentioned these changes were worthy of their own post, so here we are! After an initial evaluation and prototyping period, work on the new administration UI is now in full swing. We&amp;#8217;ve [&amp;#8230;]</description>
         <author>JasonJason</author>
         <guid isPermaLink="false">http://www.alittlemadness.com/?p=927</guid>
         <pubDate>Fri, 18 Sep 2015 04:59:59 +0000</pubDate>
         <content:encoded><![CDATA[<p>In my previous post, <a rel="nofollow" target="_blank" href="http://www.alittlemadness.com/2015/03/26/pulse-roadmap-update/">Pulse Roadmap Update</a>, I mentioned that we are working on major changes to the <a rel="nofollow" target="_blank" href="http://zutubi.com/products/pulse/">Pulse</a> administration UI. I also mentioned these changes were worthy of their own post, so here we are!  After an initial evaluation and prototyping period, work on the new administration UI is now in full swing.  We&#8217;ve still got months of work to go, but the direction has become clear enough for us to communicate.</p>
<p>As I mentioned previously, the main goals of this rewrite are discoverability and efficiency. We want it to be easier for you to find the configuration you&#8217;re after, and faster to make changes when required. We&#8217;re also dragging the admin UI from it&#8217;s humble lightly-scripted beginnings into the brave new world of HTML5 (we might even drop the quaint &#8220;AJAX-powered&#8221; terminology from our website <img src="http://s.w.org/images/core/emoji/72x72/1f609.png" alt="&#x00d83d;&#x00de09;" class="wp-smiley" style="height:1em;max-height:1em;"/> ). For example: the new UI makes use of HTML history APIs to finally integrate with the back/forward navigation of the browser.</p>
<p>We&#8217;ll be making things more discoverable in two key ways:</p>
<ol>
<li>Providing an overview page for each project, which displays a summary of the main configuration in one place (key details from the SCM, recipes, requirements, properties, stages and dependencies). This will allow you to see what the project is about at a glance, without digging into the details.</li>
<li>Making it easier to find where projects override values set in their template ancestors, as these are usually the key things you want to see and/or change. Currently overrides are marked but can only be found by browsing to their specific location in the configuration tree.</li>
</ol>
<p>On the efficiency side, we also have multiple changes, some more visible than others:</p>
<ol>
<li>Navigating through the template hierarchy will be possible in a consistent way on every configuration page. You&#8217;ll be able to navigate to the same configuration in any other project (not just direct ancestors and descendants), where such configuration exists.</li>
<li>The project and agent trees will be searchable, making it easy to jump straight to the instance you&#8217;re after.</li>
<li>As mentioned above, proper browser history navigation is supported so you can easily jump back and forth.</li>
<li>Under the covers a lot less data will be transferred between the Pulse master and browser, and the master will do a lot less work. The existing implementation has become heavyweight through multiple iterations and is being replaced with a lighter HTTP-friendly API with more work done on the client.</li>
</ol>
<p>These are ambitious changes and as such we&#8217;ll be launching them in a new major version: Pulse 3.0!  The implementation will also lay the groundwork for updates to other parts of the UI, as well as a new config API, although these will be held back for future releases.  We prefer to ship sooner and tackle other areas incrementally rather than embark on a full rewrite.  As always, while the next major version is in the works, Pulse 2.7 will be actively maintained including minor feature updates where practical.</p>
<p>Now, back to the UI work!</p>]]></content:encoded>
      </item>
      <item>
         <title>Simple upgrade? Yeah, right!</title>
         <link>http://zagorskisoftwaretester.blogspot.com/2015/09/simple-upgrade-yeah-right.html</link>
         <description>&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float:left;margin-right:1em;text-align:left;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://kt421.files.wordpress.com/2014/07/teardown2.jpg?w=600&amp;amp;h=450&quot; style=&quot;clear:left;margin-bottom:1em;margin-left:auto;margin-right:auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;150&quot; src=&quot;https://kt421.files.wordpress.com/2014/07/teardown2.jpg?w=600&amp;amp;h=450&quot; width=&quot;200&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align:center;&quot;&gt;credit:&amp;nbsp;kt421.wordpress.com&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;TL;DR&lt;br /&gt;In this blog post I will explain how I was bitten by simple library update. This example could be used to learn how to create your testing strategy in such cases.&lt;br /&gt;&lt;br /&gt;I think that Ruby on Rails is very valuable web framework. You can be ready to create you first Rails application after you learn it by reading and doing examples in excellent free book: &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.railstutorial.org/book&quot;&gt;Ruby on Rails Tutorial&lt;/a&gt; by Michael Hartl. You will learn all development tools ecosystem that is needed in modern software development team. Ruby on Rails is one of Ruby libraries, or in Ruby world this is called &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://rubygems.org/gems/rails&quot;&gt;gem&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In order to apply what I had learn in Hartl book, I created my company &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.tentamen.hr/&quot;&gt;site&lt;/a&gt; in Ruby on Rails. It is basically static site, not many features, but despite that, it requires more than 200 Ruby gems in order to work.&lt;br /&gt;&lt;br /&gt;When there is Rails security issue, I always update Rails. My test strategy is very simple. Check static page's links and send inquiry using &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.tentamen.hr/contacts/new&quot;&gt;contact form&lt;/a&gt;. Contact form has the business value for my company, because if does not work, I will lose potential customers. And after one Rails upgrade, it stopped working with following &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://stackoverflow.com/questions/26453323/wrong-number-of-arguments-2-for-1-error-in-m-hartls-rails-tutorial-7-4-1&quot;&gt;error&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It was not in my code, issue was because of turbolinks gem &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://stackoverflow.com/a/26535657/1088504&quot;&gt;version&lt;/a&gt;. Rails upgrade broke the compatibility with dependent gem. So I had to upgrade all my gems with&lt;br /&gt;&lt;br /&gt;bundle update&lt;br /&gt;&lt;br /&gt;Point of this post is that software dependency libraries upgrade must also have appropriate testing strategy. There is no such thing as simple upgrade.</description>
         <author>Karlo Smid</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-7981906488772673202.post-6055086516064816661</guid>
         <pubDate>Sat, 12 Sep 2015 20:15:00 +0000</pubDate>
      </item>
      <item>
         <title>Selenium webdriver unable to connect issue</title>
         <link>http://zagorskisoftwaretester.blogspot.com/2015/09/selenium-webdriver-unable-to-connect.html</link>
         <description>&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float:left;margin-right:1em;text-align:left;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.seleniumhq.org/images/big-logo.png&quot; style=&quot;clear:left;margin-bottom:1em;margin-left:auto;margin-right:auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.seleniumhq.org/images/big-logo.png&quot; height=&quot;181&quot; width=&quot;200&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align:center;&quot;&gt;credit: seleniumhq.org&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;TL;DR&lt;br /&gt;&lt;br /&gt;In this post I will explain the cause of selenium webdriver unable to connect issue and how to resolve this issue.&lt;br /&gt;&lt;br /&gt;In order to understand this issue, you first have to understand selenium webdriver (also known as Selenium 2) architecture. Selenium webdriver is a http server that uses not standard 80 port. I will provide example in Ruby and watir-webdriver library. Watir webdriver library uses selenium-webdriver in order to create more intuitive api for browser manipulation.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Run this code in Ruby irb. You will first need to install watir-webdriver gem:&lt;br /&gt;&lt;br /&gt;gem install 'watir-webdriver'&lt;br /&gt;&lt;br /&gt;Now in your unix terminal, run:&lt;br /&gt;&lt;br /&gt;netstat -a | grep localhost&lt;br /&gt;&lt;br /&gt;and you will see something like this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;cp4 &amp;nbsp; &amp;nbsp; &amp;nbsp; 0&amp;nbsp; &amp;nbsp; &amp;nbsp; 0&amp;nbsp; localhost.7055 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *.*&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LISTEN&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;selenium-webdriver server is ready on your local machine on port 7055. So if you have anything that already runs on that port, selenium-webdriver will fail to start.&lt;br /&gt;&lt;br /&gt;Your selenium-webdriver tests, written in any language in which library is provided, are client to selenium-webdriver tests. So, there is possibility that in your console you see something like this:&lt;br /&gt;&lt;br /&gt;unable to connect to phantomjs&amp;nbsp;@ http://127.0.0.1:7055 after 20 seconds.&lt;br /&gt;&lt;br /&gt;If you see that error, you need to check if you run on your local machine any firewall software. If you are working in corporate environment, you are probably not aware that you are running firewall. Firewall default settings is to not allow any connections on localhost, because this is the usual way how malicious software operates. But in the case of selenium-webdriver, we have a false positive, selenium-webdriver is not malicious software.&lt;br /&gt;&lt;br /&gt;DO NOT TURN OFF YOUR FIREWALL! Often, this is not possible. You need to add firewall exception for port 7055. Here is how to do that for Symantec endpoint protection:&lt;br /&gt;&lt;br /&gt;In windows tray, right click on Endpoint protection icon and choose Open Symantec Endpoint Protection.&lt;br /&gt;Choose yes.&lt;br /&gt;Select Change settings.&lt;br /&gt;Select Exceptions configure settings.&lt;br /&gt;Add Security Risk Exceptions, Web Domain&lt;br /&gt;Enter 127.0.0.1 and click ok.&lt;br /&gt;Close exceptions window.&lt;br /&gt;Close settings window.&lt;br /&gt;&lt;br /&gt;Run your selenium-webdriver script in order to check that issue is gone.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description>
         <author>Karlo Smid</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-7981906488772673202.post-8616096303638882489</guid>
         <pubDate>Sat, 05 Sep 2015 09:56:00 +0000</pubDate>
      </item>
      <item>
         <title>30 second decision</title>
         <link>http://zagorskisoftwaretester.blogspot.com/2015/08/30-second-decision.html</link>
         <description>TL;DR&lt;br /&gt;Tester sometimes needs to act very fast. And that action should be based on decision that is made based on information and his testing knowledge. In this blog post I will give example how I made a 30 second decision that was not related with software testing, but was related with somebody's life circumstance.&lt;br /&gt;&lt;br /&gt;Here is excellent example from James Bach what is context driven tester:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;From the moment when I saw for the first time this video, I put it on my software testing craft training list. I reply it and try to approach to my testing issues in that way. Sometimes I apply that skill automatically.&lt;br /&gt;&lt;br /&gt;Here is example from real life situation. I was heading home from grocery shopping and my hands were full of bags. I was in a hurry. Then on bus stop, one elderly lady asked me to give her 20 kunas (3 $). She was on the verge of tears. She needed it because she was visiting her husband in hospital and she wanted to buy him some juice.&lt;br /&gt;&lt;br /&gt;I immediately started to process information:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;she asked for specific amount&lt;/li&gt;&lt;li&gt;she was dressed as person that is going to hospital to visit somebody&lt;/li&gt;&lt;li&gt;the bus stop was on the way to hospital&lt;/li&gt;&lt;li&gt;I had never seen that lady asking her for money&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;I automatically processed that information in my had, a gave her 20 kunas. Based on that facts, my conclusion was that her story was truthful. I have never seen that lady ever again begging for the money, which also could prove that her situation was real and one time life event.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description>
         <author>Karlo Smid</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-7981906488772673202.post-8418858800331768735</guid>
         <pubDate>Sat, 29 Aug 2015 14:24:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://img.youtube.com/vi/M37VOKIaDUw/default.jpg" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>Template Method or Dependency Injection?</title>
         <link>https://tamasrev.wordpress.com/2015/08/23/template-method-or-dependency-injection/</link>
         <description>Mystical Dependency Injection used was always something very mystical to me. Until I learned what it&amp;#8217;s really about. I&amp;#8217;d like to share this revelation with you. So let&amp;#8217;s take an easy problem and solve it in couple of different ways. Cowboy FizzBuzz &amp;#8230; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://tamasrev.wordpress.com/2015/08/23/template-method-or-dependency-injection/&quot;&gt;Continue reading &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;https://pixel.wp.com/b.gif?host=tamasrev.wordpress.com&amp;#038;blog=42985234&amp;#038;post=1290&amp;#038;subd=tamasrev&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <author>tamasrevtamasrev</author>
         <guid isPermaLink="false">http://tamasrev.wordpress.com/?p=1290</guid>
         <pubDate>Sun, 23 Aug 2015 20:56:07 +0000</pubDate>
         <content:encoded><![CDATA[<h2 style="text-align:justify;">Mystical</h2>
<p style="text-align:justify;">Dependency Injection used was always something very mystical to me. Until I learned what it&#8217;s really about.</p>
<p style="text-align:justify;">I&#8217;d like to share this revelation with you. So let&#8217;s take an easy problem and solve it in couple of different ways.</p>
<p style="text-align:justify;"><span id="more-1290"></span></p>
<h2 style="text-align:justify;">Cowboy FizzBuzz</h2>
<p style="text-align:justify;">The problem is the well-known <a rel="nofollow" target="_blank" href="http://codingdojo.org/cgi-bin/index.pl?KataFizzBuzz">FizzBuzz Kata</a>. This is the simplest code that makes it work:</p>
<pre>
public class FizzBuzzCowBoy {
    public static void main(final String... args) {
        for (int i = 1; i &amp;lt;= 100; i++) {
            if (i % 15 == 0) {
                System.out.println(&quot;FizzBuzz&quot;);
            } else if (i % 5 == 0) {
                System.out.println(&quot;Buzz&quot;);
            } else if (i % 3 == 0) {
                System.out.println(&quot;Fizz&quot;);
            } else {
                System.out.println(i);
            }
        }
    }
}
</pre>
<p style="text-align:justify;">What&#8217;s wrong with this code? First of all, it&#8217;s very difficult to test.</p>
<p style="text-align:justify;">Then, it&#8217;s unnecessarily difficult to make certain changes:</p>
<ul style="text-align:justify;">
<li>Collect 5 lines and print them in a separate Thread</li>
<li>Print the FizzBuzz of the first 20 Fibonacci number.</li>
<li>Or you could emit Fizz when the number is divisible with 3 or contains the digit 3</li>
</ul>
<p style="text-align:justify;">Suppose this code plays an important role in a lean startup. You need to make certain statistics whether the email FizzBuzz or the Standard out FizzBuzz is more profitable. So you want to do some <a rel="nofollow" target="_blank" href="https://en.wikipedia.org/wiki/A/B_testing">A/B testing</a>. Well, that&#8217;ll hurt.</p>
<h2 style="text-align:justify;">Template FizzBuzz</h2>
<p style="text-align:justify;">The <a rel="nofollow" target="_blank" href="https://en.wikipedia.org/wiki/Template_method_pattern">Template Method Pattern</a> is a straightforward way to decompose this cowboy code into smaller pieces.</p>
<p style="text-align:justify;">This is the template method:</p>
<pre>

public class FizzBuzzTemplate {
    
    public void doFizzBuzz() {
        getFizzBuzzNumbers.forEach(num -&gt; {
            final String msg = getFizzBuzzText(num);
            printFizzBuzz(msg);
        });
    }
    //...
}

</pre>
<p style="text-align:justify;">The template above needs three operations:</p>
<ul style="text-align:justify;">
<li>getFizzBuzzNumbers</li>
<li>getFizzBuzzText</li>
<li>printFizzBuzz</li>
</ul>
<p style="text-align:justify;">You can find the operations in the same class:</p>
<pre>

public class FizzBuzzTemplate {
    //...
    protected Stream getFizzBuzzNumbers() {
        return IntStream.rangeClosed(1, 100).boxed();
    }

    protected void printFizzBuzz(final String msg) {
        System.out.println(msg);
    }

    protected String getFizzBuzzText(final int num) {
        if (isDividable(num, 15)) {
            return &quot;FizzBuzz&quot;;
        }
        if (isDividable(num, 5)) {
            return &quot;Buzz&quot;;
        }
        if (isDividable(num, 3)) {
            return &quot;Fizz&quot;;
        }
        return Integer.toString(num);
    }

    private boolean isDividable(final int num, final int div) {
        return num % div == 0;
    }
}

</pre>
<h3 style="text-align:justify;">Invoking it</h3>
<p style="text-align:justify;">Finally, this is how we can invoke it from a main method:</p>
<pre>
public class Main {
    public static void main(final String[] args) {
        final FizzBuzzTemplate fizzBuzz = new FizzBuzzTemplate();
        fizzBuzz.doFizzBuzz();
    }
}
</pre>
<p style="text-align:justify;">A/B testing is a bit coarse-grained. We can use a system property or whatever so we run either FizzBuzzTemplateA or FizzBuzzTemplateB.</p>
<h3 style="text-align:justify;">Testing the template with test subclass</h3>
<p style="text-align:justify;">Now that we have well-factored methods, it&#8217;s easy to create a new FizzBuzz solution. <a rel="nofollow" target="_blank" href="http://well.actually.cat/">Well, actually</a> I already created one when I tested the template method:</p>
<pre>
public class TestFizzBuzzTemplateWithTestClass {
    // ... test methods that rely on the testing subclass
    private static class TestFizzBuzz extends FizzBuzzTemplate {

        private final List printed = new ArrayList();

        @Override
        protected Stream getFizzBuzzNumbers() {
            return IntStream.of(1, 2, 3).boxed();
        }

        @Override
        protected void printFizzBuzz(final String msg) {
            printed.add(msg);
        }

        @Override
        protected String getFizzBuzzText(final int num) {
            return &quot;TEST&quot;;
        }
    }

</pre>
<p style="text-align:justify;">Based on  <a rel="nofollow" target="_blank" href="http://www.amazon.com/JUnit-Recipes-Practical-Methods-Programmer/dp/1932394230">JUnit recipes</a>, this is how we should test template methods. See, this is a case when testing makes your code more flexible: we didn&#8217;t only test all the parts in isolation but we made sure that we can create new kind of FizzBuzz-es if we want to.</p>
<p style="text-align:justify;">Unfortunately, it takes lots of time to write these test-subclasses. It&#8217;s also difficult to read these test. What now?</p>
<h3 style="text-align:justify;">Partial Mocking</h3>
<p style="text-align:justify;">Alternatively, you can test the code with partial mocking, like <a rel="nofollow" target="_blank" href="http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#spy%28T%29">Mockito.spy</a>:</p>
<pre>
public class TestFizzBuzzTemplateWithSpy {

    private FizzBuzzTemplate sut;
    private Stream oneTwoThree;

    @BeforeMethod
    public void setUp() {
        final FizzBuzzTemplate template = new FizzBuzzTemplate();
        sut = spy(template);
        oneTwoThree = IntStream.of(1, 2, 3).boxed();
        doReturn(oneTwoThree).when(sut).getFizzBuzzNumbers();
        doNothing().when(sut).printFizzBuzz(anyString());
    }

    @Test
    public void testStreamRetrieved() {
        // WHEN
        sut.doFizzBuzz();

        // THEN
        verify(sut).getFizzBuzzNumbers();
    }
    // ... more test methods
}
</pre>
<p style="text-align:justify;">Are we happy? No, not really. According to <a rel="nofollow" target="_blank" href="http://stackoverflow.com/questions/18430915/partial-mocks-are-bad-why-exactly">this SO page</a> and to Mockito.spy documentation, partial mocking is a bad practice, recommended only for legacy code. You don&#8217;t use this with TDD, they say.</p>
<h2 style="text-align:justify;">Dependency injection</h2>
<p style="text-align:justify;">We can beautify this code even further. We can create method objects for the individual operators.</p>
<h3 style="text-align:justify;">The parts</h3>
<p style="text-align:justify;">One for the numbers we want to process:</p>
<pre>
public class FizzBuzzNumberProvider {
    public Stream getFizzBuzzNumbers() {
        return IntStream.rangeClosed(1, 100).boxed();
    }
}
</pre>
<p style="text-align:justify;">Another for deciding what to print:</p>
<pre>
public class FizzBuzzTextProvider {

    public String getFizzBuzzText(final Integer num) {
        if (isDividable(num, 15)) {
            return &quot;FizzBuzz&quot;;
        }
        if (isDividable(num, 5)) {
            return &quot;Buzz&quot;;
        }
        if (isDividable(num, 3)) {
            return &quot;Fizz&quot;;
        }
        return num.toString();
    }

    private boolean isDividable(final int num, final int div) {
        return num % div == 0;
    }
}
</pre>
<p style="text-align:justify;">And here is a class for printing the fizzbuzz text:</p>
<pre>
public class FizzBuzzPrinter {
    public void printFizzBuzz(final String msg) {
        System.out.println(msg);
    }
}
</pre>
<p style="text-align:justify;">Indeed, there&#8217;s a <a rel="nofollow" target="_blank" href="http://refactoring.com/catalog/replaceMethodWithMethodObject.html">Method Object</a> for printing FizzBuzz to the standard output. Isn&#8217;t it this overkill? It depends on <del>what your crystal ball tells you about upcoming requirements</del> how far you want to go for <a rel="nofollow" target="_blank" href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882">clean code</a>.</p>
<h3 style="text-align:justify;">Bringing the pieces together</h3>
<p style="text-align:justify;">I used constructor injection for this case.</p>
<p style="text-align:justify;">Constructor injection means that an object receives its collaborators in a constructor and stores them. Later it uses them when needed:</p>
<pre>
public class FizzBuzzManualInjection {

    private final FizzBuzzNumberProvider numberProvider;
    private final FizzBuzzTextProvider textProvider;
    private final FizzBuzzPrinter printer;

    public FizzBuzzManualInjection(final FizzBuzzNumberProvider numberProvider,
        final FizzBuzzTextProvider textProvider,
        final FizzBuzzPrinter printer) {
        this.numberProvider = numberProvider;
        this.textProvider = textProvider;
        this.printer = printer;
    }

    public void doFizzBuzz() {
        numberProvider.getFizzBuzzNumbers().forEach(num -&gt; {
            final String msg = textProvider.getFizzBuzzText(num);
            printer.printFizzBuzz(msg);
        });
    }
}
</pre>
<p style="text-align:justify;">And this is how they&#8217;re wired together in a main method:</p>
<pre>
public class Main {
    public static void main(final String[] args) {
        final FizzBuzzNumberProvider numberProvider = new FizzBuzzNumberProvider();
        final FizzBuzzTextProvider textProvider = new FizzBuzzTextProvider();
        final FizzBuzzPrinter printer = new FizzBuzzPrinter();
        final FizzBuzzManualInjection fizzBuzz = new FizzBuzzManualInjection(numberProvider, textProvider, printer);
        fizzBuzz.doFizzBuzz();
    }
}
</pre>
<p style="text-align:justify;">Testing it is quite easy now: you can mock out the collaborators.</p>
<h3 style="text-align:justify;">Invoking it</h3>
<p style="text-align:justify;">It&#8217;s easy to add different FizzBuzz implementations for A/B testing: We need some system property that helps us decide which particular implementation we need to inject.</p>
<h2 style="text-align:justify;">Wrapping up</h2>
<p style="text-align:justify;">In this post we could see that the Template Method is a good alternative to Dependency Injection.</p>
<p style="text-align:justify;">Well, good for the FizzBuzz kata. What about real world examples then? Why are there lots of frameworks for Dependency Injection, and only a few for Template Method? Let&#8217;s see:</p>
<ul style="text-align:justify;">
<li>Template Method won&#8217;t create separate code for configuration. That&#8217;s a must in complicated projects.</li>
<li>If you need to flexibly combine the pieces, then you need Dependency Injection.</li>
<li>If you have heavy-weight, general-purpose dependencies, like an <a rel="nofollow" target="_blank" href="http://hibernate.org/orm/what-is-an-orm/">ORM</a> or a <a rel="nofollow" target="_blank" href="http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html">Transaction Manager</a>, then Template Method just won&#8217;t fit.</li>
</ul>
<h2 style="text-align:justify;">Wrapping up, really</h2>
<p style="text-align:justify;">You can use Template Method for fairly simple cases. For Big Things (TM) you need Dependency Injection. Later we&#8217;re gonna explore that.</p>
<hr />
<h3 style="text-align:justify;">Where you can find the code</h3>
<p style="text-align:justify;">You can find the code on github: <a rel="nofollow" target="_blank" href="https://github.com/rev-tomi/fizzbuzz-cowboy">cowboy</a>, <a rel="nofollow" target="_blank" href="https://github.com/rev-tomi/fizzbuzz-template">template method</a> and <a rel="nofollow" target="_blank" href="https://github.com/rev-tomi/fizzbuzz-manual-injection">manual dependency injection</a>.</p><br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/tamasrev.wordpress.com/1290/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tamasrev.wordpress.com/1290/"/></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=tamasrev.wordpress.com&#038;blog=42985234&#038;post=1290&#038;subd=tamasrev&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="https://1.gravatar.com/avatar/113b0b46b3de42ce4dee28c6006a85c5?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">tamasrev</media:title>
         </media:content>
      </item>
      <item>
         <title>Announcing DaSpec — awesome executable specifications in Markdown</title>
         <link>http://gojko.net/2015/08/23/announcing-daspec-awesome-executable-specifications-in-markdown/</link>
         <description>It&amp;#8217;s my great pleasure to announce the immediate availability of DaSpec v1.0, the first stable version ready for production use. DaSpec is an automation framework for Executable Specifications in Markdown. It can help you: Share information about planned features with non-technical stakeholders easily, and get actionable unambiguous feedback from them Ensure and document shared understanding [&amp;#8230;]</description>
         <author>gojkogojko</author>
         <guid isPermaLink="false">http://gojko.net/?p=3463</guid>
         <pubDate>Sun, 23 Aug 2015 01:47:19 +0000</pubDate>
         <content:encoded><![CDATA[<p>It&#8217;s my great pleasure to announce the immediate availability of <a rel="nofollow" target="_blank" href="http://daspec.com">DaSpec v1.0</a>, the first stable version ready for production use. DaSpec is an automation framework for <a rel="nofollow" target="_blank" href="http://daspec.com/guides/executable_specifications.html">Executable Specifications</a> in Markdown. It can help you:</p>
<ul>
<li>Share information about planned features with non-technical stakeholders easily, and get actionable unambiguous feedback from them</li>
<li>Ensure and document shared understanding of the planned software, making the definition of done stronger and more objective</li>
<li>Document software features and APIs in a way that is easy to understand and maintain, so you can reduce the bus factor of your team and onboard new team members easily</li>
<li>Make any kind of automated tests readable to non-technical team members and stakeholders</li>
</ul>
<p>DaSpec helps teams achieve those benefits by validating human-readable documents against a piece of software, similar to tools such as FitNesse, Cucumber or Concordion. The major difference is that DaSpec works with Markdown, a great, intuitive format that is well supported by a large ecosystem of conversion, editing and processing tools. <a rel="nofollow" target="_blank" href="http://daspec.com/examples/">Run and play with the key examples in your browser</a> now, without installing any software, to see what DaSpec could do for you.</p>
<p>DaSpec’s primary target are teams practising Behaviour Driven Development, Specification by Example, ATDD and generally running short, frequent delivery cycles with a heavy dependency on test automation. It can, however, be useful to anyone looking to reduce the cost of discovering outdated information in documentation and tests.</p>
<p>For more information on what&#8217;s new in version 1.0, check out the <a rel="nofollow" target="_blank" href="http://daspec.com/news/2015/08/23/daspec-1.0.html">release notes</a>.</p>
<p>The first version of DaSpec supports automation using JavaScript only. We plan to port it to other platforms depending on the community feedback. <a rel="nofollow" target="_blank" href="https://groups.google.com/forum/#!forum/daspec">Get in touch</a> and let us know what you&#8217;d like to see next.</p>]]></content:encoded>
         <category>articles</category>
      </item>
      <item>
         <title>Testing with time variable is fun!</title>
         <link>http://zagorskisoftwaretester.blogspot.com/2015/08/testing-with-time-variable-is-fun.html</link>
         <description>&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float:left;margin-right:1em;text-align:left;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/-fM1ebTGKY28/VdhJLPzaB-I/AAAAAAAAAyo/Vhza8ufenrc/s1600/prague_clock.jpg&quot; style=&quot;clear:left;margin-bottom:1em;margin-left:auto;margin-right:auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;http://4.bp.blogspot.com/-fM1ebTGKY28/VdhJLPzaB-I/AAAAAAAAAyo/Vhza8ufenrc/s200/prague_clock.jpg&quot; width=&quot;200&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align:center;&quot;&gt;Prague astronomical clock&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;TL;DR&lt;br /&gt;&lt;br /&gt;Time is important variable that must be taken into account during software testing. In this post I will provide two examples how time influenced my software testing.&lt;br /&gt;&lt;br /&gt;First influence was basic time lapse. I wrote test automation script for forgot password process. Script accessed email provider through the api in order to get email. And it worked for some time. And then it stopped working. There was no any change in application code for that feature. If you raise statement: &quot;But previously that worked!&quot; know that time variable kicked in. As application had not changed, I started to investigate testing environment changes.&lt;br /&gt;&lt;br /&gt;I got message that username or password is wrong. But I was able to login in to email provider using those credentials. Error message had error code, and by searching for that error code I found out that there could be &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://support.google.com/mail/answer/78754&quot;&gt;several reasons&lt;/a&gt; for the error. &amp;nbsp;And my reason was that I was checking email above the allowed frequency threshold. Email provider changed that threshold from the moment when I wrote the script for the first time.&lt;br /&gt;&lt;br /&gt;Second influence was time zone. My client has &quot;heavy&quot; Javascript UI application. It also has feature that depends on time range. And that feature returned different results for same date range on my development machine than on my client machine. My first heuristic was to investigate different browsers, but browser vendor was not the cause.&lt;br /&gt;&lt;br /&gt;I had on my disposal Windows virtual machine in client's time zone, and using Chrome on that machine I got same result as my client. &amp;nbsp;Using Javascript console and following code snippet:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I got information about browser time zone settings.&lt;br /&gt;&lt;br /&gt;While you are investigating what could be cause of issue that you have found, do not forget time variable. You will definitely have fun during that investigation!&lt;br /&gt;&lt;br /&gt;This blog post appeared first time on zagorskisoftwaretester blog.</description>
         <author>Karlo Smid</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-7981906488772673202.post-9002927670180652047</guid>
         <pubDate>Sat, 22 Aug 2015 12:26:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://4.bp.blogspot.com/-fM1ebTGKY28/VdhJLPzaB-I/AAAAAAAAAyo/Vhza8ufenrc/s72-c/prague_clock.jpg" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>Black hole and RIMGEA</title>
         <link>http://zagorskisoftwaretester.blogspot.com/2015/08/black-hole-and-rimgea.html</link>
         <description>&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float:left;margin-right:1em;text-align:left;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.bug.hr/_cache/694beac69b48eced273a72755052589f.jpg&quot; style=&quot;clear:left;margin-bottom:1em;margin-left:auto;margin-right:auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.bug.hr/_cache/694beac69b48eced273a72755052589f.jpg&quot; height=&quot;160&quot; width=&quot;200&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align:center;&quot;&gt;credit: bug.hr&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;TL;DR&lt;br /&gt;&lt;br /&gt;In this post I will explain what black hole and RIMGEA acronym have in common.&lt;br /&gt;&lt;br /&gt;dr.sc. Dario Hrupec is a speaker at following Testival tester's event (free admission is &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.entrio.hr/en/event/testival-15-a-software-testers-event-2530&quot;&gt;here&lt;/a&gt;). I found Dario's work interesting and connected with software testing when I read his article about black holes (croatian version is &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.bug.hr/vijesti/hajka-ogromnu-crnu-rupu/142594.aspx&quot;&gt;here&lt;/a&gt;&amp;nbsp;and Google translate is &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://translate.google.com/translate?sl=hr&amp;amp;tl=en&amp;amp;js=y&amp;amp;prev=_t&amp;amp;hl=hr&amp;amp;ie=UTF-8&amp;amp;u=http%3A%2F%2Fwww.bug.hr%2Fvijesti%2Fhajka-ogromnu-crnu-rupu%2F142594.aspx&amp;amp;edit-text=&quot;&gt;here&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Every object in order to be able to &quot;escape&quot; from other object, needs to be accelerated to the escape velocity &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://en.wikipedia.org/wiki/Escape_velocity&quot;&gt;speed&lt;/a&gt;. Black hole is an object that has so strong gravitational field that even light speed is not enough for light to escape that object. So we see that object as black hole.&lt;br /&gt;&lt;br /&gt;Luckily for us, in human context, black hole is rare event. In the RIMGEA acronym, G stands for generalize. In order to generalize issue, you need to uncorner your corner case. Which means find corner values that are not at extreme borders. Values that are more probable in user context.&lt;br /&gt;&lt;br /&gt;Would you report black hole as an astronaut security risk on a trip from Earth to Moon?&lt;br /&gt;And on a trip from Earth to another galaxy? I would raise black hole as a security risk only in later case.&lt;br /&gt;&lt;br /&gt;If you ask yourself: Am I a good tester? Try to revalidate your issue reports. Issue report is one of the crucial tester artifact, it is a written proof how good tester are you. Always generalize your issue report. Uncorner your corner cases. Do not report black hole as a security issue on your project. Unless you are preparing for intergalactic travel.&lt;br /&gt;&lt;br /&gt;If you want to learn more about RIMGEA acronym, here are BBST free &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://testingeducation.org/BBST/bugadvocacy/&quot;&gt;resources&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;</description>
         <author>Karlo Smid</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-7981906488772673202.post-5016353924135237235</guid>
         <pubDate>Sat, 15 Aug 2015 17:34:00 +0000</pubDate>
      </item>
      <item>
         <title>Spot the ISS</title>
         <link>http://zagorskisoftwaretester.blogspot.com/2015/08/spot-iss.html</link>
         <description>&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float:left;margin-right:1em;text-align:left;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.nasa.gov/images/content/136314main_s114e7221_med.jpg&quot; style=&quot;clear:left;margin-bottom:1em;margin-left:auto;margin-right:auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.nasa.gov/images/content/136314main_s114e7221_med.jpg&quot; height=&quot;240&quot; width=&quot;320&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align:center;&quot;&gt;credit: nasa.gov&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;TL;DR&lt;br /&gt;&lt;br /&gt;In this post I will explain how I prepared in order to film flight of the International Space Station over my neighborhood.&lt;br /&gt;&lt;br /&gt;International Space Station is one of the most advanced systems created by human race. And as a software tester, I am very interested in those systems.&lt;br /&gt;&lt;br /&gt;Nasa offers free service called &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://spotthestation.nasa.gov/&quot;&gt;spot the station&lt;/a&gt;. Register your email and you will receive notification when ISS is going to overflight over your town. Here is email &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://spotthestation.nasa.gov/message_example.cfm&quot;&gt;content&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/-RpbyhGQmCbo/VcXJcBYGYcI/AAAAAAAAAyE/qbbFmSvxUMs/s1600/spot_the_iss.png&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;244&quot; src=&quot;http://3.bp.blogspot.com/-RpbyhGQmCbo/VcXJcBYGYcI/AAAAAAAAAyE/qbbFmSvxUMs/s640/spot_the_iss.png&quot; width=&quot;640&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;First advice, create alarm notification on your phone, 5 minutes before time noted in the email.&lt;br /&gt;&lt;br /&gt;Second, as a tester you should investigate meaning of other attributes of ISS overflight. This picture will help you to better understand those attributes:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left:auto;margin-right:auto;text-align:center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://spotthestation.nasa.gov/images/astro_horizon.jpg&quot; style=&quot;margin-left:auto;margin-right:auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://spotthestation.nasa.gov/images/astro_horizon.jpg&quot; height=&quot;243&quot; width=&quot;400&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align:center;&quot;&gt;credit: nasa.gov&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Time and visible are straightforward.&lt;br /&gt;&lt;br /&gt;Max Height.&lt;br /&gt;&lt;br /&gt;Unit are degrees. And now your high school trigonometry class should kick in. Those degrees represent the angle (elevation) where ISS will reach maximal height over your position. Angle is measured from horizon (in direction of ISS appearing) that represents 0 degrees. And software test goody: if you put your hand in horizon, than your fist approximately represents 10 degrees. Have you managed to measure those 10 degrees?&lt;br /&gt;&lt;br /&gt;Appears&lt;br /&gt;&lt;br /&gt;This is &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://en.wikipedia.org/wiki/Compass_rose&quot;&gt;compass rose&lt;/a&gt; value. Here is compass rose:&lt;br /&gt;&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left:auto;margin-right:auto;text-align:center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Windrose.svg/440px-Windrose.svg.png&quot; style=&quot;margin-left:auto;margin-right:auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Windrose.svg/440px-Windrose.svg.png&quot; width=&quot;320&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align:center;&quot;&gt;credit: wikipedia.org&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;In that direction ISS will appear.&lt;br /&gt;&lt;br /&gt;Disappears&lt;br /&gt;&lt;br /&gt;Compass rose direction where ISS will disappear.&lt;br /&gt;&lt;br /&gt;And here is the actual overflight:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Because of my position on my balcony, I caught 44 seconds of overflight.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description>
         <author>Karlo Smid</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-7981906488772673202.post-94247086512202787</guid>
         <pubDate>Sat, 08 Aug 2015 11:46:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://3.bp.blogspot.com/-RpbyhGQmCbo/VcXJcBYGYcI/AAAAAAAAAyE/qbbFmSvxUMs/s72-c/spot_the_iss.png" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>UrbanCode is All-In on Full-Stack</title>
         <link>https://developer.ibm.com/urbancode/2015/08/03/urbancode-is-all-in-on-full-stack/</link>
         <description>A little over a year ago, we announced &quot;IBM UrbanCode Deploy with Patterns&quot; which extended our release automation capabilities down the stack. With it, clients could easily spin up and update full-stack application environments (from compute-network-storage layers to application configuration). &lt;div class=&quot;inline-block&quot;&gt;... &lt;/div&gt;</description>
         <author>Eric MinickEric Minick</author>
         <guid isPermaLink="false">http://developer.ibm.com/urbancode/?p=18132</guid>
         <pubDate>Mon, 03 Aug 2015 14:29:39 +0000</pubDate>
         <content:encoded><![CDATA[<p>A little over a year ago, we announced "<a rel="nofollow" target="_blank" href="https://developer.ibm.com/urbancode/products/urbancode-deploy-with-patterns/">IBM UrbanCode Deploy with Patterns"</a> which extended our release automation capabilities down the stack. With it, clients could easily spin up and update full-stack application environments (from compute-network-storage layers to application configuration). We call this model a "cloud blueprint" or "pattern". Since then, what we have heard from the market is clear: <strong>this full stack approach is the future of application release automation</strong>.</p>
<p>Now, that left us with a problem. Our core UrbanCode Deploy offering (like its competitors) would be an incomplete solution for the new normal. Well, problem solved.</p>
<p>Today, we're excited to announce that <strong>we are including the cloud blueprint capability in UrbanCode Deploy</strong>. Existing customers can just download version 6.1.2, upgrade, and have the capability today.</p>
<p>So what new capabilities do UCD customers get today?</p>
<ul>
<li>A rich, graphical editor for OpenStack Heat that makes defining new environments easy and fast.</li>
<li>Full-stack management of applications, being able to promote infrastructure changes with code changes</li>
<li>The ability to provision or update cloud environments in SoftLayer, Amazon, VMWare and OpenStack compatible clouds.</li>
<li>Access to sandbox testing environments that are quick to create and destroy.</li>
</ul>
<p>&nbsp;</p>
<p><img class="alignnone" src="https://developer.ibm.com/urbancode/wp-content/uploads/sites/16/2014/07/ucdp-editor-graphical.png" alt="" width="613" height="330"/></p>
<p>How does it feel to use these cloud blueprints? It feels like the cloud actually helping our developers deliver quicker. So grab the new bits and start taking advantage!</p>]]></content:encoded>
      </item>
      <item>
         <title>Learning Tapestry, the Inversion of Control Framework</title>
         <link>https://tamasrev.wordpress.com/2015/08/02/learning-tapestry-the-inversion-of-control-framework/</link>
         <description>The framework I recently started to use Apache Tapestry for work. Tapestry is a web component framework with ambitious goals. E.g. it&amp;#8217;s a web component framework that&amp;#8217;s easy to extend. Also, it gives you the ease of development of scripting languages &amp;#8230; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://tamasrev.wordpress.com/2015/08/02/learning-tapestry-the-inversion-of-control-framework/&quot;&gt;Continue reading &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;https://pixel.wp.com/b.gif?host=tamasrev.wordpress.com&amp;#038;blog=42985234&amp;#038;post=1251&amp;#038;subd=tamasrev&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <author>tamasrevtamasrev</author>
         <guid isPermaLink="false">http://tamasrev.wordpress.com/?p=1251</guid>
         <pubDate>Sun, 02 Aug 2015 08:24:40 +0000</pubDate>
         <content:encoded><![CDATA[<h2 style="text-align:justify;">The framework</h2>
<p style="text-align:justify;">I recently started to use <a rel="nofollow" target="_blank" href="https://tapestry.apache.org/">Apache Tapestry</a> for work.</p>
<p style="text-align:justify;">Tapestry is a web component framework with ambitious goals. E.g. it&#8217;s a web component framework that&#8217;s easy to extend. Also, it gives you the ease of development of scripting languages within the java ecosystem. Moreover, it provides an Inversion of Control (IoC) container with nice aspect-oriented features too.</p>
<p style="text-align:justify;">This is my learning log: I completed the <a rel="nofollow" target="_blank" href="https://tapestry.apache.org/tapestry-tutorial.html">official tutorial</a>. Then completed an in-house tutorial that shows how tapestry and the other moving parts fit together in our application. Finally, I read the <a rel="nofollow" target="_blank" href="http://www.tapestry5book.com/">Tapestry 5 book</a>.</p>
<p style="text-align:justify;"><a rel="nofollow" target="_blank" href="https://tamasrev.wordpress.com/2015/06/26/learning-tapestry-the-component-framework/">Earlier</a> I wrote about its component and scripting parts. Here I&#8217;ll dissect its Dependency Injection parts</p>
<p style="text-align:justify;"><span id="more-1251"></span></p>
<h2 style="text-align:justify;">What is dependency injection?</h2>
<p style="text-align:justify;">J.B. Rainsberger wrote an <a rel="nofollow" target="_blank" href="http://blog.thecodewhisperer.com/2013/01/29/consequences-of-dependency-inversion-principle/">excellent post</a> about Dependency Injection in general. Here is a brief summary:</p>
<p style="text-align:justify;">When an object doesn&#8217;t create its collaborators, but instead a caller provides them then, then it&#8217;s dependency injection.</p>
<p>So if an object receives its collaborators through the constructor, then it&#8217;s <strong>constructor-based</strong> injection. If it receives them through setter methods, then it&#8217;s <strong>property-based</strong> injection. If the collaborators are <a rel="nofollow" target="_blank" href="http://hu.urbandictionary.com/define.php?term=automagically">automagically</a> set into the fields without constructor or setter then its <strong>field-based</strong> dependency injection.</p>
<h3 style="text-align:justify;">Why dependency injection good for us?</h3>
<p style="text-align:justify;">It&#8217;s good for us because you don&#8217;t have to type &#8216;new&#8217; that often. Pun intended.</p>
<p style="text-align:justify;">Dependency injection has a couple of advantages. First of all, it doesn&#8217;t tie one implementation class to another. I.e. your code depends on abstractions like EmailSender while you can <strong>configure</strong> to use RealEmailSender for production and FakeEmailSender for testing.</p>
<p style="text-align:justify;">Another advantage is that your framework can lazy-load your classes. So you can get the performance benefit without having to write extra code like <a rel="nofollow" target="_blank" href="https://en.wikipedia.org/?title=Proxy_pattern">Proxy pattern.</a> And that&#8217;s a great win, even though there&#8217;s default <a rel="nofollow" target="_blank" href="http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Proxy.html">class</a> for that.</p>
<p style="text-align:justify;">Funny, huh? When you talk about dependency injection, people will think about long xml configurations and annotation through the code. But that&#8217;s just a pattern that Spring and Java EE follows. Here we&#8217;ll see how Tapestry implements DI.</p>
<h3 style="text-align:justify;">But then, what&#8217;s an IoC container?</h3>
<p style="text-align:justify;">As a one-liner: an IoC container is an actual implementation of the concept of Dependency Injection.</p>
<p style="text-align:justify;">Other than that, an IoC container is a controversial thing. On the one hand, it makes it nicely separates configuration from the rest of your code. On the other hand, it makes you to deal with complicated framework like Spring or Java EE.</p>
<h2 style="text-align:justify;">Tapestry services</h2>
<p style="text-align:justify;">A service in Tapestry is an object that you can inject into your pages. See, in Tapestry calls the dependencies services.</p>
<p style="text-align:justify;">Tapestry has lots of services that help you to do stuff.</p>
<p style="text-align:justify;">First of all, you can configure Tapestry in class called AppModule. Well, that&#8217;s not entirely true. Tapestry defines three environments: Production, QA and Test. You can configure then in AppModule, QaModule and TestModule respectively.</p>
<p style="text-align:justify;">This might look a bit like magic. But it follows the usual Dependency Injection pattern. It&#8217;s common to see DI configuration in xml, like in Swing and Java EE. But <a rel="nofollow" target="_blank" href="https://github.com/google/guice/wiki/GettingStarted">Guice</a> too lets you configure your classes in java.</p>
<p style="text-align:justify;">For Tapestry-IoC, this is not the end of the story. The heart of Tapestry-IoC is a Registry. This is where the services are stored to and retrieved from. This Registry is configured through various modules. There are lots of predefined modules. AppModule QaModule, TestModule happen to be the ones that you can tweak.</p>
<h2 style="text-align:justify;">A custom service</h2>
<p style="text-align:justify;">Let&#8217;s pretend there&#8217;s a custom service that we need to inject. Basically, it can be anything. I.e. it can help us to persist object into a <a rel="nofollow" target="_blank" href="https://www.mongodb.org/">mongoDB</a> database. It can invoke a complicated calculation in a 3rd party system called <a rel="nofollow" target="_blank" href="http://www.aimms.com/">AIMMS</a>.</p>
<p style="text-align:justify;">It can also be a FooBar service. A Foobar service has a foo() method that returns a Bar object. From a programming point of view, there&#8217;s an object that has some methods that we can invoke from our Tapestry pages.</p>
<p style="text-align:justify;">So, this is our service definition:</p>
<pre>
public interface FooBar {
    public Bar foo();
}
</pre>
<p style="text-align:justify;">This interface has a production-quality implementation: FooBarImpl:</p>
<pre>
public class FooBarImpl implements FooBar {
    public FooBarImpl() {
        // Default no-arg constructor.
    }

    @Override
    public Bar foo() {
        //... doing important stuff
    }
}
</pre>
<p style="text-align:justify;">And this is how they&#8217;re wired together:</p>
<pre>
public class AppModule {
    public static void bind(ServiceBinder binder) {
        binder.bind(FooBar.class, FooBarImpl.class);
    }
}
</pre>
<h3 style="text-align:justify;">Why is this so simple?</h3>
<p style="text-align:justify;">FooBarImpl has a no-arg constructor so Tapestry knows how to build the service. There are some sophisticated rules how Tapestry finds the right constructor and injects its parameters &#8211; but I&#8217;ll skip it for the sake of simplicity.</p>
<p style="text-align:justify;">For the record, you can take more control over instantiation your service: you can write your builder method. In that method you can do whatever you need to initialize your service:</p>
<pre>
public class AppModule {
    public static FooBar buildFooBar() {
        ExperimentalFooBarImpl fooBar = new ExperimentalFooBarImpl(&quot;Haruki Murakami&quot;);
        return fooBar.dance().dance().dance();
    }
}
</pre>
<h3 style="text-align:justify;">How do you use it?</h3>
<p style="text-align:justify;">Tapestry has field-based injection. So you just create a private field, annotate it with @Inject, that&#8217;s it:</p>
<pre>
public class WriterPage {
    //...
    @Inject
    private FooBar fooBar;
    //...
    @OnEvent
    public Object handle() {
        return fooBar.foo();
    }
}
</pre>
<h3 style="text-align:justify;">Design issues</h3>
<p style="text-align:justify;">You could argue that injecting heavy-weight services into Tapestry pages isn&#8217;t right. You could come up with alternatives, like using another IoC container that injects Tapestry into other objects. However, your web pages are going to need an abstract service that they can call on user actions. At the end of the day, you&#8217;ll have to inject stuff into your pages.</p>
<p style="text-align:justify;">Still, you could ask, how do we inject not-so-controversial objects into our pages? Well, actually, the <a rel="nofollow" target="_blank" href="http://tapestry.apache.org/5.3/apidocs/org/apache/tapestry5/annotations/Component.html">@Component</a> annotation injects a Tapestry component. It can inject default components like <a rel="nofollow" target="_blank" href="http://tapestry.apache.org/5.3/apidocs/org/apache/tapestry5/corelib/components/Select.html">Select</a>, as well as it can inject your custom components too.</p>
<p style="text-align:justify;">So why didn&#8217;t I show examples like this? Because Tapestry provides a built-in method to inject them. Part of this built-in method is the <a rel="nofollow" target="_blank" href="http://tapestry.apache.org/5.3/apidocs/index.html?org/apache/tapestry5/services/ComponentClassResolver.html">ComponentClassResolver</a> that will find the components if you place them into the right package. Another part is the TapestryModule which has lots of built-in logic. Remember, AppModule is a module that you can tweak. Well, <a rel="nofollow" target="_blank" href="http://tapestry.apache.org/5.3/apidocs/index.html?org/apache/tapestry5/services/TapestryModule.html">TapestryModule</a> is one that you can not. Still, it&#8217;s nice to recognize the IoC methods in its <a rel="nofollow" target="_blank" href="http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tapestry/tapestry-core/5.3/org/apache/tapestry5/services/TapestryModule.java">source code</a>.</p>
<p style="text-align:justify;">By the way, I covered components in the <a rel="nofollow" target="_blank" href="https://tamasrev.wordpress.com/2015/06/26/learning-tapestry-the-component-framework/">previous post</a>.</p>
<h2 style="text-align:justify;">Contributing Value Encoders</h2>
<p style="text-align:justify;">You can not only define new services. You can contribute smaller sub-services to them too. ValueEncoders are a good example for this.</p>
<p style="text-align:justify;">ValueEncoders define how you can serialize and deserialize objects from and to String. They are used to send objects as HTTP parameters. Suppose you want to use a specific ValueEncoder. The only thing you need to do is to write a specific encoder, then contribute it to the AppModule:</p>
<pre>
publicclassAppModule {
    ...
    @Contribute(ValueEncoderSource.class)
    public staticvoidprovideEncoders(MappedConfiguration&lt;class, &lt;span=&quot;&quot; class=&quot;hiddenSpellError&quot; pre=&quot;&quot; data-mce-bogus=&quot;1&quot;&gt;ValueEncoderFactory&gt; configuration,final BlogService blogService) {
        ValueEncoderFactory&lt;/pre&gt;
&lt;article&gt; factory = new ValueEncoderFactory&lt;article&gt;() {
            public ValueEncoder&lt;article&gt; create(Class&lt;article&gt; clazz) {
                return ...;
            }
        }
        configuration.add(Article.class, factory);
    }
}
</pre>
 
 
 
 
<p style="text-align:justify;">So what can we see here?</p>
<p style="text-align:justify;">You can contribute your code in the very same class where you can define the services. All you need to do is to write a ValueEncoderFactory, then add it to the MappedConfiguration. ValueEncoderFactory is a Factory class so Tapestry can defer creating this encoder. MappedConfiguration works like a map so you can add your app-specific configurations.</p>
<h2 style="text-align:justify;">Benefits of Proxy pattern</h2>
<p style="text-align:justify;">Earlier I mentioned the proxy pattern. Tapestry-IoC actually uses proxies for its services &#8211; given that the service has one interface and one or more implementations. Let&#8217;s take a quick look on some of those benefits:</p>
<h3 style="text-align:justify;">Service Status</h3>
<p style="text-align:justify;">You can check the service status of your web app. All you need to do is to run your app in development mode and type <em><a rel="nofollow" target="_blank" href="http://yourhost/appname/servicestatus">http://yourhost/appname/servicestatus</a></em> in your browser. See <a rel="nofollow" target="_blank" href="https://tapestry.apache.org/service-status.html">this page</a> for further details.</p>
<p style="text-align:justify;">On that page you&#8217;ll see a list of your services. Some of them are loaded while others were not even referenced. So you have lazy-loading out of the box. Compare it with the burden of writing and maintaining it yourself.</p>
<p style="text-align:justify;">Writing lazy-loading is more difficult than you think. See <a rel="nofollow" target="_blank" href="http://stackoverflow.com/questions/15792186/singleton-pattern-with-combination-of-lazy-loading-and-thread-safety">this SO page</a> if you have any doubts.</p>
<h3 style="text-align:justify;">Method Advices</h3>
<p style="text-align:justify;">Proxy objects let you write <a rel="nofollow" target="_blank" href="http://docs.oracle.com/javaee/6/tutorial/doc/gkeci.html">interceptors</a>. Also known as <a rel="nofollow" target="_blank" href="http://www.mkyong.com/spring3/spring-aop-aspectj-annotation-example/">aspects</a>. These things let you do things before and/or after a certain method runs. These things let you do it very conveniently: you can write this before/after code in one class and apply them to another.</p>
<p style="text-align:justify;">The typical method advice examples are logging, security checks and transactions. No wonder that the <a rel="nofollow" target="_blank" href="http://tapestry.apache.org/5.3/apidocs/org/apache/tapestry5/hibernate/annotations/CommitAfter.html">CommitAfter</a> annotation is implemented with a method advice.</p>
<p style="text-align:justify;">The <a rel="nofollow" target="_blank" href="http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tapestry/tapestry-hibernate/5.1.0.1/org/apache/tapestry5/hibernate/HibernateModule.java">HibernateModule</a> (see, another Tapestry IoC module) has this method:</p>
<pre>
    /**
     * Adds the CommitAfter annotation work, to process the
     * {@link org.apache.tapestry5.hibernate.annotations.CommitAfter} annotation.
     */
    @Contribute(ComponentClassTransformWorker2.class)
    @Primary
    public static void provideCommitAfterAnnotationSupport(OrderedConfiguration configuration)
    {
        // If logging is enabled, we want logging to be the first advice, wrapping around the commit advice.
        configuration.addInstance(&quot;CommitAfter&quot;, CommitAfterWorker.class, &quot;after:Log&quot;);
    }
</pre>
<p style="text-align:justify;">If you check what <a rel="nofollow" target="_blank" href="http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tapestry/tapestry-hibernate/5.1.0.1/org/apache/tapestry5/internal/hibernate/CommitAfterWorker.java">CommitAfterWorker</a> does, it&#8217;ll lead you to the <a rel="nofollow" target="_blank" href="http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tapestry/tapestry-jpa/5.4-beta-26/org/apache/tapestry5/internal/jpa/CommitAfterMethodAdvice.java">CommitAfterMethodAdvice</a>. In the advise method we can see the real transaction handling logic:</p>
<pre>
@Override
public void advise(final MethodInvocation invocation)
{
    //... skipped some stuff for brevity
    if (transaction != null &amp;&amp; !transaction.isActive())
    {
        transaction.begin();
    }
    
    try
    {
        invocation.proceed(); // going on with the method being annotated
    } catch (final RuntimeException e)
    {
        if (transaction != null &amp;&amp; transaction.isActive())
        {
            rollbackTransaction(transaction);
        }
    
    throw e;
    }
    
    // Success or checked exception:
    
    if (transaction != null &amp;&amp; transaction.isActive())
    {
        transaction.commit();
    }
    //... skipped some stuff for brevity
}
</pre>
<h2 style="text-align:justify;">Wrapping up</h2>
<p style="text-align:justify;">This is what we learned so far:</p>
<ul>
<li style="text-align:justify;">Now we know what&#8217;s dependency injection and Inversion of Control</li>
<li style="text-align:justify;">We know that Tapestry has an extensible Inversion of Control framework</li>
<li style="text-align:justify;">We saw examples on how to extend this framework</li>
<li style="text-align:justify;">We know that tapestry relies heavily on this framework</li>
</ul><br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/tamasrev.wordpress.com/1251/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tamasrev.wordpress.com/1251/"/></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=tamasrev.wordpress.com&#038;blog=42985234&#038;post=1251&#038;subd=tamasrev&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="https://1.gravatar.com/avatar/113b0b46b3de42ce4dee28c6006a85c5?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">tamasrev</media:title>
         </media:content>
      </item>
      <item>
         <title>In order to drive safe, you need to do risk management</title>
         <link>http://zagorskisoftwaretester.blogspot.com/2015/08/in-order-to-drive-safe-you-need-to-do.html</link>
         <description>TL;DR&lt;br /&gt;In this post I will provide real life example that will explain how to do risk management while driving in order to avoid driving accident.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;While I am driving, I have different levels of alert. Here is intersection that always has my special attention (welcome to my neighborhood).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left:auto;margin-right:auto;text-align:center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/-jzUjP1N4KWg/VbyPIjFS_uI/AAAAAAAAAxs/u_FUomnqf_4/s1600/Screen%2BShot%2B2015-08-01%2Bat%2B11.11.35%2BAM.png&quot; style=&quot;margin-left:auto;margin-right:auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;265&quot; src=&quot;http://4.bp.blogspot.com/-jzUjP1N4KWg/VbyPIjFS_uI/AAAAAAAAAxs/u_FUomnqf_4/s640/Screen%2BShot%2B2015-08-01%2Bat%2B11.11.35%2BAM.png&quot; width=&quot;640&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align:center;&quot;&gt;credit: Google Maps&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Problematic part is when you drive in direction to south (to down in this photo, in Croatia we drive on the right side). Do you see anything special in this intersection?&lt;br /&gt;&lt;br /&gt;There are three lines, in leftmost you need to turn right, and in other two you need to go straight. But that straight is not straight, you have to go in sideling direction slightly to the right.&lt;br /&gt;&lt;br /&gt;And the issue is that drivers in the leftmost line very often go straight through intersection in my line. Because they do not pay attention to arrows drawn on the road and it feels natural to them to go straight through the intersection.&lt;br /&gt;&lt;br /&gt;And that is what makes this intersection special. Other thing is that the number of this type of intersections in Zagreb is low compared to &quot;normal&quot; intersections where you do not have to do sideling.&lt;br /&gt;&lt;br /&gt;So when I am in second and third line where I have to do sideling I am always extra cautious. It feels like I am on a start of formula one race. If there is a car on my right side (obligated to turn right), I always let him to go first, because I do not know if he would go straight without sideling in my line.&lt;br /&gt;&lt;br /&gt;And there was also one special case, when previous intersection (upper in this map) was closed because of roadworks, and drivers that are not used to this sideling intersection were forced to use it.&lt;br /&gt;&lt;br /&gt;How to apply this on software testing? If you notice during testing that you have to do &quot;sideling&quot; in order to use product feature, this is place where you should be extra cautious. Sideling in product is something in that product that is unnecessary overcomplicated and that could be done in simpler way. With simpler feature there is less chance for product issue.&lt;br /&gt;&lt;br /&gt;This post was first published at zagorski software tester blog.</description>
         <author>Karlo Smid</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-7981906488772673202.post-7791763726384210995</guid>
         <pubDate>Sat, 01 Aug 2015 12:27:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://4.bp.blogspot.com/-jzUjP1N4KWg/VbyPIjFS_uI/AAAAAAAAAxs/u_FUomnqf_4/s72-c/Screen%2BShot%2B2015-08-01%2Bat%2B11.11.35%2BAM.png" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
   </channel>
</rss>
<!-- fe8.yql.bf1.yahoo.com compressed/chunked Thu Oct  1 21:38:31 UTC 2015 -->
