<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9103875830128984607</id><updated>2022-07-18T05:54:00.664-07:00</updated><category term="agile"/><category term="Books"/><category term="Hibernate"/><category term="ThoughtWorks"/><category term="dynamic list"/><category term="experience"/><category term="technology"/><category term="tools"/><category term="2009"/><category term="ALM"/><category term="AWS"/><category term="Bitcoin"/><category term="Collection data"/><category term="Consultant"/><category term="Continuous delivery"/><category term="Criteria"/><category term="Criteria.addOrder test"/><category term="Filter"/><category term="FilterDef"/><category term="Google"/><category term="Google code jam"/><category term="Google code jam 2009"/><category term="Hack"/><category term="LazyList"/><category term="Legacy Project"/><category term="Library"/><category term="List Data"/><category term="List validation"/><category term="OneToMany"/><category term="Oracle"/><category term="Order.asc. Order"/><category term="SQL"/><category term="Spring MVC"/><category term="TDD"/><category term="Unit testing"/><category term="Unit testing repository DAO classes"/><category term="Validation"/><category term="Validator"/><category term="Weblogic ant redeploy SUBST"/><category term="annotation"/><category term="annotation filter"/><category term="brute"/><category term="brute force"/><category term="brute force algorithm"/><category term="builder"/><category term="capybara"/><category term="card"/><category term="chain"/><category term="china"/><category term="column based"/><category term="contestants"/><category term="cucumber"/><category term="development"/><category term="easy"/><category term="excel"/><category term="force"/><category term="getAll"/><category term="github"/><category term="group"/><category term="highest record"/><category term="hybrid"/><category term="india"/><category term="issues"/><category term="java"/><category term="java brute force"/><category term="java cracker"/><category term="java pdf"/><category term="latest date"/><category term="latest record"/><category term="mediocre"/><category term="mining"/><category term="no constructor"/><category term="no setter"/><category term="out of the box"/><category term="parsing"/><category term="password"/><category term="password recovery"/><category term="pattern"/><category term="pdf"/><category term="pdf password"/><category term="physical"/><category term="physical card wall"/><category term="physical wall"/><category term="poi"/><category term="quickly"/><category term="rank"/><category term="rank()"/><category term="recommendation"/><category term="row based"/><category term="ruby"/><category term="selenium"/><category term="setup data"/><category term="solution"/><category term="sort"/><category term="statistics"/><category term="test"/><category term="time"/><category term="tips"/><category term="wall"/><title type='text'>Venky - Tech space</title><subtitle type='html'>&quot;Venkatesh Nannan&quot; - Ex-ThoughtWorker.&#xa;This blog provides me a platform to share and discuss some interesting things we face as developers.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.nvenky.in/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://www.nvenky.in/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08648834931491601830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9103875830128984607.post-7806321333474839658</id><published>2015-09-08T21:21:00.001-07:00</published><updated>2015-09-08T21:24:09.474-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="capybara"/><category scheme="http://www.blogger.com/atom/ns#" term="chain"/><category scheme="http://www.blogger.com/atom/ns#" term="cucumber"/><category scheme="http://www.blogger.com/atom/ns#" term="ruby"/><category scheme="http://www.blogger.com/atom/ns#" term="selenium"/><title type='text'>Triggering Cucumber tag from a Cucumber step</title><content type='html'>&lt;br /&gt;&lt;br /&gt;I am working on a legacy web application that has limited unit test and dependency on multiple applications. &amp;nbsp;To reduce the manual testing effort, we had to write end-to-end UI tests with help of Cucumber, Capybara.&lt;br /&gt;&lt;br /&gt;We had to chain few tests (generally BAD PRACTICE) as there was no way to create the seed data in every end-to-end test. We had to reuse the data from other scenarios. Rather than going into further details, here is an example where you can trigger another cucumber tag from a step:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;child_process.feature&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;background: #ffffff; border-width: .1em .1em .1em .8em; border: solid gray; overflow: auto; padding: .2em .6em; width: auto;&quot;&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt;&lt;span style=&quot;color: #aa6600;&quot;&gt;Feature&lt;/span&gt;: &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;As&lt;/span&gt; a &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;Cucumber&lt;/span&gt; user&lt;br /&gt;  I want to run other feature from a step&lt;br /&gt;&lt;br /&gt;  &lt;span style=&quot;color: #3333bb;&quot;&gt;@success_child_process&lt;/span&gt;&lt;br /&gt;  &lt;span style=&quot;color: #aa6600;&quot;&gt;Scenario&lt;/span&gt;: run job&lt;br /&gt;    &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;Given&lt;/span&gt; no exception is raised&lt;br /&gt;&lt;br /&gt;  &lt;span style=&quot;color: #3333bb;&quot;&gt;@failure_child_process&lt;/span&gt;&lt;br /&gt;  &lt;span style=&quot;color: #aa6600;&quot;&gt;Scenario&lt;/span&gt;: run job&lt;br /&gt;    &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;Given&lt;/span&gt; exception is raised&lt;br /&gt;&lt;br /&gt;  &lt;span style=&quot;color: #aa6600;&quot;&gt;Scenario&lt;/span&gt;: &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;Child&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;Given&lt;/span&gt; I trigger &lt;span style=&quot;color: #3333bb;&quot;&gt;@success_child_process&lt;/span&gt; job&lt;br /&gt;    &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;And&lt;/span&gt; no exception is raised&lt;br /&gt;    &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;And&lt;/span&gt; I trigger &lt;span style=&quot;color: #3333bb;&quot;&gt;@failure_child_process&lt;/span&gt; job&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;child_process_steps.rb&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;&lt;div style=&quot;background: #ffffff; border-width: .1em .1em .1em .8em; border: solid gray; overflow: auto; padding: .2em .6em; width: auto;&quot;&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt;&lt;span style=&quot;color: #aa0000;&quot;&gt;Given&lt;/span&gt; &lt;span style=&quot;color: #009999;&quot;&gt;/^no exception is raised$/&lt;/span&gt; &lt;span style=&quot;color: #0000aa;&quot;&gt;do&lt;/span&gt;&lt;br /&gt;  &lt;span style=&quot;color: #aaaaaa; font-style: italic;&quot;&gt;# do nothing here&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000aa;&quot;&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #aa0000;&quot;&gt;Given&lt;/span&gt; &lt;span style=&quot;color: #009999;&quot;&gt;/^exception is raised$/&lt;/span&gt; &lt;span style=&quot;color: #0000aa;&quot;&gt;do&lt;/span&gt;&lt;br /&gt;  &lt;span style=&quot;color: #0000aa;&quot;&gt;raise&lt;/span&gt; &lt;span style=&quot;color: #aa5500;&quot;&gt;&#39;Exception is raised&#39;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000aa;&quot;&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #aa0000;&quot;&gt;Given&lt;/span&gt; &lt;span style=&quot;color: #009999;&quot;&gt;/^I trigger (@.*) job$/&lt;/span&gt; &lt;span style=&quot;color: #0000aa;&quot;&gt;do&lt;/span&gt; |tag|&lt;br /&gt;  &lt;span style=&quot;color: #aa0000;&quot;&gt;CucumberChildProcess&lt;/span&gt;.run_tag tag&lt;br /&gt;&lt;span style=&quot;color: #0000aa;&quot;&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;cucumber_child_process.rb&lt;/b&gt; &lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style=&quot;background: #f8f8f8; border-width: .1em .1em .1em .8em; border: solid gray; overflow: auto; padding: .2em .6em; width: auto;&quot;&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;require&lt;/span&gt; &lt;span style=&quot;color: #ba2121;&quot;&gt;&#39;childprocess&#39;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: green; font-weight: bold;&quot;&gt;module&lt;/span&gt; &lt;span style=&quot;color: blue; font-weight: bold;&quot;&gt;CucumberChildProcess&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style=&quot;color: green; font-weight: bold;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color: blue; font-weight: bold;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;run_tag&lt;/span&gt;(tag)&lt;br /&gt;    logger&lt;span style=&quot;color: #666666;&quot;&gt;.&lt;/span&gt;info &lt;span style=&quot;color: #ba2121;&quot;&gt;&quot;Triggering the child process for tag &#39;&lt;/span&gt;&lt;span style=&quot;color: #bb6688; font-weight: bold;&quot;&gt;#{&lt;/span&gt;tag&lt;span style=&quot;color: #bb6688; font-weight: bold;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #ba2121;&quot;&gt;&#39;&quot;&lt;/span&gt;&lt;br /&gt;    process &lt;span style=&quot;color: #666666;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #880000;&quot;&gt;ChildProcess&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;.&lt;/span&gt;build(find_executable(&lt;span style=&quot;color: #ba2121;&quot;&gt;&#39;bundle&#39;&lt;/span&gt;), &lt;span style=&quot;color: #ba2121;&quot;&gt;&#39;exec&#39;&lt;/span&gt;, &lt;span style=&quot;color: #ba2121;&quot;&gt;&#39;cucumber&#39;&lt;/span&gt;, &lt;span style=&quot;color: #ba2121;&quot;&gt;&#39;-t&#39;&lt;/span&gt;, tag)&lt;br /&gt;    process&lt;span style=&quot;color: #666666;&quot;&gt;.&lt;/span&gt;io&lt;span style=&quot;color: #666666;&quot;&gt;.&lt;/span&gt;inherit!&lt;br /&gt;    process&lt;span style=&quot;color: #666666;&quot;&gt;.&lt;/span&gt;start&lt;br /&gt;    logger&lt;span style=&quot;color: #666666;&quot;&gt;.&lt;/span&gt;info &lt;span style=&quot;color: #ba2121;&quot;&gt;&quot;********* CHILD PROCESS LOGS for tag &#39;&lt;/span&gt;&lt;span style=&quot;color: #bb6688; font-weight: bold;&quot;&gt;#{&lt;/span&gt;tag&lt;span style=&quot;color: #bb6688; font-weight: bold;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #ba2121;&quot;&gt;&#39; - START **********&quot;&lt;/span&gt;&lt;br /&gt;    process&lt;span style=&quot;color: #666666;&quot;&gt;.&lt;/span&gt;wait&lt;br /&gt;    logger&lt;span style=&quot;color: #666666;&quot;&gt;.&lt;/span&gt;info &lt;span style=&quot;color: #ba2121;&quot;&gt;&quot;********* CHILD PROCESS LOGS for tag &#39;&lt;/span&gt;&lt;span style=&quot;color: #bb6688; font-weight: bold;&quot;&gt;#{&lt;/span&gt;tag&lt;span style=&quot;color: #bb6688; font-weight: bold;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #ba2121;&quot;&gt;&#39; - END **********&quot;&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: green; font-weight: bold;&quot;&gt;raise&lt;/span&gt; &lt;span style=&quot;color: #ba2121;&quot;&gt;&quot;Child process failed while running the tag &#39;&lt;/span&gt;&lt;span style=&quot;color: #bb6688; font-weight: bold;&quot;&gt;#{&lt;/span&gt;tag&lt;span style=&quot;color: #bb6688; font-weight: bold;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #ba2121;&quot;&gt;&#39;. Check the log for more information. Exit code: &lt;/span&gt;&lt;span style=&quot;color: #bb6688; font-weight: bold;&quot;&gt;#{&lt;/span&gt;process&lt;span style=&quot;color: #666666;&quot;&gt;.&lt;/span&gt;exit_code&lt;span style=&quot;color: #bb6688; font-weight: bold;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #ba2121;&quot;&gt;&quot;&lt;/span&gt; &lt;span style=&quot;color: green; font-weight: bold;&quot;&gt;unless&lt;/span&gt; process&lt;span style=&quot;color: #666666;&quot;&gt;.&lt;/span&gt;exit_code &lt;span style=&quot;color: #666666;&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: #666666;&quot;&gt;0&lt;/span&gt;&lt;br /&gt;    logger&lt;span style=&quot;color: #666666;&quot;&gt;.&lt;/span&gt;info &lt;span style=&quot;color: #ba2121;&quot;&gt;&quot;Successfully executed the tag &#39;&lt;/span&gt;&lt;span style=&quot;color: #bb6688; font-weight: bold;&quot;&gt;#{&lt;/span&gt;tag&lt;span style=&quot;color: #bb6688; font-weight: bold;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #ba2121;&quot;&gt;&#39; as Child process&quot;&lt;/span&gt;&lt;br /&gt;  &lt;span style=&quot;color: green; font-weight: bold;&quot;&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style=&quot;color: green; font-weight: bold;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color: blue; font-weight: bold;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;find_executable&lt;/span&gt;(cmd)&lt;br /&gt;    &lt;span style=&quot;color: #880000;&quot;&gt;ENV&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #ba2121;&quot;&gt;&#39;PATH&#39;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;].&lt;/span&gt;split(&lt;span style=&quot;color: #19177c;&quot;&gt;File&lt;/span&gt;:&lt;span style=&quot;color: #19177c;&quot;&gt;:PATH_SEPARATOR&lt;/span&gt;)&lt;span style=&quot;color: #666666;&quot;&gt;.&lt;/span&gt;each &lt;span style=&quot;color: green; font-weight: bold;&quot;&gt;do&lt;/span&gt; &lt;span style=&quot;color: #666666;&quot;&gt;|&lt;/span&gt;path&lt;span style=&quot;color: #666666;&quot;&gt;|&lt;/span&gt;&lt;br /&gt;      &lt;span style=&quot;color: green; font-weight: bold;&quot;&gt;next&lt;/span&gt; &lt;span style=&quot;color: green; font-weight: bold;&quot;&gt;if&lt;/span&gt; path&lt;span style=&quot;color: #666666;&quot;&gt;.&lt;/span&gt;empty?&lt;br /&gt;      path &lt;span style=&quot;color: #666666;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #880000;&quot;&gt;File&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;.&lt;/span&gt;join(path, cmd)&lt;br /&gt;      &lt;span style=&quot;color: #666666;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #ba2121;&quot;&gt;&#39;.exe&#39;&lt;/span&gt;, &lt;span style=&quot;color: #ba2121;&quot;&gt;&#39;.bat&#39;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;].&lt;/span&gt;each &lt;span style=&quot;color: green; font-weight: bold;&quot;&gt;do&lt;/span&gt; &lt;span style=&quot;color: #666666;&quot;&gt;|&lt;/span&gt;ext&lt;span style=&quot;color: #666666;&quot;&gt;|&lt;/span&gt;&lt;br /&gt;        &lt;span style=&quot;color: green; font-weight: bold;&quot;&gt;return&lt;/span&gt; path &lt;span style=&quot;color: #666666;&quot;&gt;+&lt;/span&gt; ext &lt;span style=&quot;color: green; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #880000;&quot;&gt;File&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;.&lt;/span&gt;exists?(path &lt;span style=&quot;color: #666666;&quot;&gt;+&lt;/span&gt; ext)&lt;br /&gt;      &lt;span style=&quot;color: green; font-weight: bold;&quot;&gt;end&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: green; font-weight: bold;&quot;&gt;end&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: green; font-weight: bold;&quot;&gt;raise&lt;/span&gt; &lt;span style=&quot;color: #ba2121;&quot;&gt;&quot;Unable to find command &#39;&lt;/span&gt;&lt;span style=&quot;color: #bb6688; font-weight: bold;&quot;&gt;#{&lt;/span&gt;cmd&lt;span style=&quot;color: #bb6688; font-weight: bold;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #ba2121;&quot;&gt;&#39; in the PATH&quot;&lt;/span&gt;&lt;br /&gt;  &lt;span style=&quot;color: green; font-weight: bold;&quot;&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: green; font-weight: bold;&quot;&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.nvenky.in/feeds/7806321333474839658/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.nvenky.in/2015/09/triggering-cucumber-tag-from-cucumber.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/7806321333474839658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/7806321333474839658'/><link rel='alternate' type='text/html' href='http://www.nvenky.in/2015/09/triggering-cucumber-tag-from-cucumber.html' title='Triggering Cucumber tag from a Cucumber step'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08648834931491601830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9103875830128984607.post-6279545856015918239</id><published>2014-10-21T17:02:00.001-07:00</published><updated>2014-10-21T17:07:10.718-07:00</updated><title type='text'>Upgrading to Yosemite - Rails development</title><content type='html'>&lt;br /&gt;&lt;br /&gt;It was very simple to upgrade to Yosemite from Mavericks.&lt;br /&gt;&lt;br /&gt;Once the OSX upgrade is done, follow these steps to get back to action.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1) Open XCode to install the components&lt;br /&gt;2) Install command line tools&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; xcode-select --install &lt;br /&gt;3) Reinstall Ruby&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;CC=/usr/bin/gcc &amp;nbsp;rbenv install 2.1.2&lt;br /&gt;4) Install bundler, libv8 and therubyracer gems&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; gem install bundler&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; gem install libv8 -v &#39;3.16.14.7&#39; -- --with-system-v8&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; gem install therubyracer -v &#39;0.12.1&#39;&lt;br /&gt;&lt;br /&gt;If you are using RubyMine, you have to install Java. Apple prompted me to download this when I opened RubyMine.&lt;br /&gt;&lt;br /&gt;http://supportdownload.apple.com/download.info.apple.com/Apple_Support_Area/Apple_Software_Updates/Mac_OS_X/downloads/031-03190.20140529.Pp3r4/JavaForOSX2014-001.dmg</content><link rel='replies' type='application/atom+xml' href='http://www.nvenky.in/feeds/6279545856015918239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.nvenky.in/2014/10/upgrading-to-yosemite-rails-development.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/6279545856015918239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/6279545856015918239'/><link rel='alternate' type='text/html' href='http://www.nvenky.in/2014/10/upgrading-to-yosemite-rails-development.html' title='Upgrading to Yosemite - Rails development'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08648834931491601830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9103875830128984607.post-6597405915893605941</id><published>2014-03-28T16:55:00.000-07:00</published><updated>2014-03-29T10:43:21.534-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AWS"/><category scheme="http://www.blogger.com/atom/ns#" term="Bitcoin"/><category scheme="http://www.blogger.com/atom/ns#" term="Hack"/><category scheme="http://www.blogger.com/atom/ns#" term="mining"/><title type='text'>Bitcoin mining? - Had to close my AWS account </title><content type='html'>When I read about a similar incident in hacker news&amp;nbsp;sometime back, &amp;nbsp;I felt sorry for that person and also happy that I had not exposed my secret key. I woke up this morning to see the same thing happen to my account. &amp;nbsp;I got an email this morning from AWS that my account was compromised and the secret key was available in github.&lt;br /&gt;&lt;br /&gt;When I looked at that Github project, I was cursing myself. It was created a year back when I was taking part in a startup weekend event. I don&#39;t even remember checking in my secret key in the rush for delivering something over the weekend. Now it has come to haunt me. Someone had launched almost 20 &quot;c3.8xlarge&quot; instances in each region and too many spot instances. Estimated bill is already $300 in a day. It was exhausting for me to find every resource launched in every region and terminate it. I had to close my AWS account to stop further charges and sent an email to the support team and hoping that they would consider that my account was compromised. I am guessing it is bitcoin mining incident again.&lt;br /&gt;&lt;br /&gt;I was using this account just for learning AWS and was launching EC2 micro/medium instances to try few things. &amp;nbsp;I assume most of the devs working in cloud projects would have their personal account to learn AWS and would never ever need to launch such Large instances. I hope that Amazon AWS would provide an option to create a developer account which gives access only to create micro/medium instances for learning AWS and not to worry about huge bill even if the key is exposed by mistake.&lt;br /&gt;&lt;br /&gt;Hope that AWS support team helps me this time.&lt;br /&gt;&lt;br /&gt;I wish I had the skills like Liam Neeson in &quot;Taken&quot; movie to go after them :)&lt;br /&gt;&lt;br /&gt;EDIT:&lt;br /&gt;&lt;br /&gt;Estimated bill is now $1534. I called up Amazon immediately and the customer care was very helpful. They informed me that they would arrange for one time credit and asked me to be careful with the Access keys. They also fixed my account and asked me to continue using it.&lt;br /&gt;&lt;br /&gt;As suggested by Garp in the comments, the first thing I did is to delete my AWS access keys and created a IAM user with permission to create only t1.micro instances in us-east-1 region.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;{&lt;br /&gt;  &quot;Version&quot;: &quot;2012-10-17&quot;,&lt;br /&gt;  &quot;Statement&quot;: [&lt;br /&gt;    {&lt;br /&gt;      &quot;Action&quot;: &quot;ec2:*&quot;,&lt;br /&gt;      &quot;Effect&quot;: &quot;Allow&quot;,&lt;br /&gt;      &quot;Resource&quot;: &quot;arn:aws:ec2:us-east-1:*&quot;,&lt;br /&gt;      &quot;Condition&quot;: {&lt;br /&gt;         &quot;StringEquals&quot;: {&lt;br /&gt;            &quot;ec2:InstanceType&quot;: &quot;t1.micro&quot;&lt;br /&gt;         }&lt;br /&gt;      }&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;Effect&quot;: &quot;Allow&quot;,&lt;br /&gt;      &quot;Action&quot;: &quot;elasticloadbalancing:*&quot;,&lt;br /&gt;      &quot;Resource&quot;: &quot;*&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;Effect&quot;: &quot;Allow&quot;,&lt;br /&gt;      &quot;Action&quot;: &quot;cloudwatch:*&quot;,&lt;br /&gt;      &quot;Resource&quot;: &quot;*&quot;&lt;br /&gt;    },&lt;br /&gt;    {&lt;br /&gt;      &quot;Effect&quot;: &quot;Allow&quot;,&lt;br /&gt;      &quot;Action&quot;: &quot;autoscaling:*&quot;,&lt;br /&gt;      &quot;Resource&quot;: &quot;*&quot;&lt;br /&gt;    }&lt;br /&gt;  ]&lt;br /&gt;}&lt;/pre&gt;&lt;pre&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style=&quot;font-family: Times; white-space: normal;&quot;&gt;Amazon customer care is the best.&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.nvenky.in/feeds/6597405915893605941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.nvenky.in/2014/03/bitcoin-mining-closed-my-aws-account.html#comment-form' title='194 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/6597405915893605941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/6597405915893605941'/><link rel='alternate' type='text/html' href='http://www.nvenky.in/2014/03/bitcoin-mining-closed-my-aws-account.html' title='Bitcoin mining? - Had to close my AWS account '/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08648834931491601830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>194</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9103875830128984607.post-1357907471392421527</id><published>2013-08-12T13:25:00.001-07:00</published><updated>2013-08-13T13:32:31.118-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="agile"/><category scheme="http://www.blogger.com/atom/ns#" term="Books"/><category scheme="http://www.blogger.com/atom/ns#" term="Continuous delivery"/><category scheme="http://www.blogger.com/atom/ns#" term="Legacy Project"/><category scheme="http://www.blogger.com/atom/ns#" term="TDD"/><title type='text'>Legacy project -  improving code quality by identifying technical debt</title><content type='html'>&lt;div class=&quot;p1&quot;&gt;I have always worked on new projects where we decide what technologies/framework/language to use. It is easier to follow good development practices from day one and Continuous delivery in a project is the new norm. More often large enterprises have a legacy projects that has to be maintained and enhanced with new features.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;p2&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;I recently had an opportunity to work on a consulting assignment where we had to work with client team, up skill them with good development practices and move towards continuous delivery model for their business critical application. It was a large program with 7 scrum teams and each team having 6-8 members. We initially started with couple of scrum teams as a POC(Proof of Concept) and tried to identify the issues/blockers in the process. These are the steps we followed while we tried to improve the code quality of a legacy project. &lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;p1&quot;&gt;&lt;b&gt;1. Identifying what to fix &lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;Every project that has good and bad parts of the code. First step in improving a legacy project is to identify what needs to be fixed in the existing system. &amp;nbsp;&lt;/div&gt;&lt;ul class=&quot;ul1&quot;&gt;&lt;li class=&quot;li1&quot;&gt;List the high risk areas in the codebase based on experience - There will be some parts of the code that no developer wants to touch. Every time we make a change to that piece of code hell breaks loose. Identify those classes/modules and categorize it as High/Medium/Low.&lt;/li&gt;&lt;li class=&quot;li1&quot;&gt;Run static code analysis tool (like Sonar for Java project) - Static code analysis tools immediately shows you the current state of the code.&lt;/li&gt;&lt;li class=&quot;li1&quot;&gt;Generate Heatmap from Version Control - There are few parts of the code that gets modified very frequently. It is important to identify those classes so that it can be refactored to smaller classes, wrapped with unit tests to improve resilience.&amp;nbsp;&lt;/li&gt;&lt;li class=&quot;li1&quot;&gt;Heatmap - Identify frequent code checkins for fixing bugs. Based on the commit message identify the classes that get frequent bug fixs. &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;2.&amp;nbsp;Prioritizing the changes&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Code which causes most of the defects&lt;/li&gt;&lt;li&gt;Code where the new enhancement work is going to happen&lt;/li&gt;&lt;li&gt;Bugs identified by the static code analysis tools&lt;/li&gt;&lt;li&gt;Refactor code to fix the&amp;nbsp;cyclomatic complexity, large classes/methods, etc based on static code analysis (if it satisfies 1 &amp;amp; 2 conditions)&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;p1&quot;&gt;&lt;b&gt;3. Items to exclude from scope&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&amp;nbsp;This is one of the important lessons I learnt while dealing with legacy projects.&amp;nbsp;If you come across a piece of code that is &quot;working&quot; and if there is no foreseeable changes happening in that code, don&#39;t fix/clean the code. Add it to the backlog of &quot;code to be refactored&quot; with a low priority. As a developer it is common to have an urge to clean everything, but we should keep in mind that lot of companies/projects have gone bust by spending their time and money on rewriting software.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;b&gt;4. Scheduling the changes as part of on going work&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;Once the backlog of tech debt has been identified, we need to plan it as part of on-going project work. Avoid the idea of spending dedicate time (few sprints/months) just for refactoring. This would not fly well with business as they don&#39;t see any returns after few months of refactoring. &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;I would recommend spending &lt;b&gt;10% - 40% &lt;/b&gt;of each sprint capacity to fixing the Tech debt based on the backlog you had come up with.&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;Also, In agile world, &lt;b&gt;don&#39;t add story points to tech debt stories&lt;/b&gt;. You are not delivering new &quot;business value&quot; and it should reflect in the velocity. It would make it obvious to the business on how much time is invested in tech debt and over time velocity would increase as the tech debt decreases.&lt;/div&gt;&lt;div class=&quot;p2&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;b&gt;5. Prepare the team&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;If the team is not familiar with TDD and other development practices, it would help in training the team before venturing into refactoring.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - TDD techniques&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Design patters&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Pair programming&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Brown bag sessions&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Code showcase&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;Few recommended books:&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Refactoring&lt;/li&gt;&lt;li&gt;TDD&lt;/li&gt;&lt;li&gt;Working with Legacy code&lt;/li&gt;&lt;li&gt;Refactoring DB&lt;/li&gt;&lt;li&gt;Pragmatic Programmer&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;p1&quot;&gt;&lt;b&gt;6. Working on the improvements&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Hire expert/coach to help team on the job (CRITICAL)&lt;/li&gt;&lt;li&gt;Break the silos (Architects, DBA, etc)&lt;/li&gt;&lt;li&gt;Retrospect frequently&lt;/li&gt;&lt;li&gt;Identify, raise and fix the blockers.&lt;/li&gt;&lt;li&gt;Improve efficiency&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Invest in new infrastructure (Cloud - is not a differentiator, a necessity)&lt;/li&gt;&lt;li&gt;Find alternate tools (Tomcat instead of Websphere, Weblogic, etc, Local database for each developer)&lt;/li&gt;&lt;li&gt;Good IDE environment&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Emphasis on using shortcuts&lt;/li&gt;&lt;li&gt;Never write code if IDE can generate&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Faster build&lt;/li&gt;&lt;li&gt;Identify bottlenecks&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div class=&quot;p1&quot;&gt;&lt;b&gt;7. Track the improvements&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Review the static code analysis metrics&lt;/li&gt;&lt;li&gt;Review the code coverage metrics&lt;/li&gt;&lt;li&gt;Introduce code coverage ratchet (Good and bad.. )&lt;/li&gt;&lt;li&gt;Track individual commits&lt;/li&gt;&lt;li&gt;Build a dashboard&lt;/li&gt;&lt;li&gt;GREEN build is a must&lt;/li&gt;&lt;li&gt;Don&#39;t refactor if it is not in the prioritized list. This is a important item to track as it would increase the scope of work.&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;p2&quot;&gt;&lt;b&gt;Testing Process &amp;amp; Deployment Process improvements:&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;Will be covered in the next blog post. &amp;nbsp; &amp;nbsp;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.nvenky.in/feeds/1357907471392421527/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.nvenky.in/2013/08/stepping-towards-continuous-delivery.html#comment-form' title='23 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/1357907471392421527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/1357907471392421527'/><link rel='alternate' type='text/html' href='http://www.nvenky.in/2013/08/stepping-towards-continuous-delivery.html' title='Legacy project -  improving code quality by identifying technical debt'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08648834931491601830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>23</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9103875830128984607.post-2244709964037398741</id><published>2012-04-24T16:05:00.001-07:00</published><updated>2012-04-24T16:06:31.315-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="agile"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="experience"/><category scheme="http://www.blogger.com/atom/ns#" term="mediocre"/><category scheme="http://www.blogger.com/atom/ns#" term="out of the box"/><category scheme="http://www.blogger.com/atom/ns#" term="solution"/><category scheme="http://www.blogger.com/atom/ns#" term="time"/><title type='text'>Are you settling for mediocre solution?</title><content type='html'>&quot;This is just an Intranet application&quot;&lt;br /&gt;&quot;People would hardly use this feature&quot;&lt;br /&gt;&quot;There will be only less than 100 users for this site&quot; &lt;br /&gt;How many times have you heard such arguments during discussions. I have heard similar comments many times and have also made such comments myself. I have just realized that I had been convincing myself with these arguments to settle with mediocre solution for some of the &quot;interesting&quot; problems. &lt;br /&gt;&lt;br /&gt;There is one particular requirement in my recent project where I faced similar situation.&lt;br /&gt;&lt;h4&gt;   Initial approach: &lt;/h4&gt;We came up with some sort of a &quot;conventional&quot; solution to address a requirement. This approach was not very clean as it had couple of issues &lt;br /&gt;- We were violating the general rule of the site to support browser back/forward actions&lt;br /&gt;- We were using URL query param to hide/show few links&lt;br /&gt;Even though we had these issues, I was convinced with the solution and wanted to go ahead with that. I had &quot;strong&quot; reasons (read as excuses :) ) for the same.&lt;br /&gt;&lt;h4&gt;   Reasons (Excuses):&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;This application doesn&#39;t deserve &quot;advanced/complex&quot; features / This requirement is unwanted: &lt;/b&gt;This project has only 100 end users. We don&#39;t have to spend much time on building this &quot;advanced/complex&quot; features just for these users. I am not convinced yet that this requirement is needed.&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Just enough design/This is an exceptional case:&lt;/b&gt; The conventional solution for this requirement works and we don&#39;t have to spend much time on this. We can violate the back/forward support for this requirement as it is an exception case&lt;b&gt;.&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Story points: &lt;/b&gt;It is only a 2 (S/something) pointer and we can&#39;t spend much time on this story. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;This scenario would never happen:&lt;/b&gt; NO user would be performing these sequence of steps (Even though I don&#39;t have any metrics to support this claim)&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;b&gt;But,&lt;/b&gt;&lt;br /&gt;Luckily in my project, all mediocre/conventional solutions were challenged and the team was not convinced with my reasons. We had to come up with a better solution.&lt;br /&gt;&lt;br /&gt;When we spent a little more time without thinking about excuses, we were able to come up with a better/cleaner solution. This out of the box solution met all our requirements and also made us feel good about. All it required was that little push from others and a little time to overcome the mediocre solution mode.&lt;br /&gt;&lt;br /&gt;Now when I look back at my &quot;strong reasons&quot;, everything seem to be flawed:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I could not see the difference between unwanted feature and differentiators. Without these features (related to usability), our site would end up being mediocre. It would not be able to get more users on to the system.&lt;/li&gt;&lt;li&gt;Looks like my notion of &quot;Just enough design&quot; also had &quot;taking exceptions&quot; for granted. In this particular case, I had already convinced myself that this requirement can take exceptions (like not supporting browser forward/backward) without exploring some more possibilities.&lt;/li&gt;&lt;li&gt;Story points are just a metrics to track progress and it should not be used for killing innovation/thinking out of the box.&lt;/li&gt;&lt;li&gt;I think, I had made up the &quot;scenario would never happen&quot; argument to support my &quot;this is an exception&quot; argument. &lt;/li&gt;&lt;/ol&gt;&lt;h4&gt;   Lessons learnt:&lt;/h4&gt;Mediocre solutions come into existence only by convincing ourselves that it is the right thing to do in THIS&amp;nbsp; case/application. All it needs is a little more time to come up with a better alternative.&lt;br /&gt;Team members should be constantly challenging each other on mediocre solutions in order to build a great product. It also helps the team to improve their technical and problem solving skills.&lt;br /&gt;&lt;br /&gt;Are you coming up with excuses or a better product?</content><link rel='replies' type='application/atom+xml' href='http://www.nvenky.in/feeds/2244709964037398741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.nvenky.in/2012/04/are-you-settling-for-mediocre-solution.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/2244709964037398741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/2244709964037398741'/><link rel='alternate' type='text/html' href='http://www.nvenky.in/2012/04/are-you-settling-for-mediocre-solution.html' title='Are you settling for mediocre solution?'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08648834931491601830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9103875830128984607.post-6339119665881898811</id><published>2012-04-23T07:40:00.002-07:00</published><updated>2012-04-23T07:42:30.750-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="agile"/><category scheme="http://www.blogger.com/atom/ns#" term="ALM"/><category scheme="http://www.blogger.com/atom/ns#" term="card"/><category scheme="http://www.blogger.com/atom/ns#" term="hybrid"/><category scheme="http://www.blogger.com/atom/ns#" term="issues"/><category scheme="http://www.blogger.com/atom/ns#" term="physical"/><category scheme="http://www.blogger.com/atom/ns#" term="physical card wall"/><category scheme="http://www.blogger.com/atom/ns#" term="physical wall"/><category scheme="http://www.blogger.com/atom/ns#" term="tools"/><category scheme="http://www.blogger.com/atom/ns#" term="wall"/><title type='text'>Physical card wall is injurious to health</title><content type='html'>...of the project.&lt;br /&gt;&lt;br /&gt;Don&#39;t get me wrong, let me finish it. Only if your project uses ALM tools and physical wall at the same time.&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;NOTE: ALM tools - Agile Lifecycle management tools (like Mingle, Version One, etc)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;            Physical Wall Vs ALM tools wall&lt;/h2&gt;&lt;br /&gt;We are not getting into this argument right now. By now most of us would have used both and know the pros &amp;amp; cons of each. Personally, I am OK with any one of these.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;            Physical Wall &amp;amp; ALM tools - Hybrid approach&lt;/h2&gt;&lt;br /&gt;This is where I have a problem. In most the projects I have worked on, we have used this hybrid model. We would use ALM tools to create story, prioritize and for discussions with client but use physical wall to track the progress of the sprint/iteration.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;            Issues (I faced) in this approach&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;No single source of truth:&lt;/b&gt; Few things would be up-to-date in physical wall but not on the tool and vice versa. Consider this case - You find that a story card is &#39;In Dev&#39; lane in physical wall and &#39;In QA&#39; lane in ALM wall. Does this mean that: &lt;ul&gt;&lt;li&gt;Story is &#39;Dev complete&#39; and moved to &#39;In QA&#39; by dev in ALM wall but not on Physical wall.&lt;/li&gt;&lt;li&gt;QA found a bug and moved the story back to &#39;In Dev&#39; in physical wall but not on ALM.&lt;/li&gt;&lt;/ul&gt;We cannot be sure and usually we end up chasing the team members working on the story for &quot;correct status&quot;. Is it worth maintaining two walls? &lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;b&gt;Duplication of effort:&lt;/b&gt; Duplication is painful even here. Imagine that you just did your team sign up on the physical wall. How motivated would you be to update the exact same information on the ALM tool. So you can&#39;t complain the team for not having things in sync. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt; ALM Tool is not a boon anymore but a burden:&lt;/b&gt; In most of the teams I have been, it is a burden for few individuals (like PM, BAs, sometime Devs) to keep the ALM tool in sync with the physical wall. A tool that was supposed to be helping the project becomes a burden. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Invalid metrics:&lt;/b&gt; ALM tools provide lot of useful metrics that can be used to track the project and make some useful decision. Since the tool is not used properly, metrics provided is also invalid.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt; Wrong/Incomplete status on the wall:&lt;/b&gt; One of the projects I worked on had distributed team members. The physical wall in offshore would have only the stories that are worked on by offshore team members as it was hard/painful to track the cards worked on by onshore members. This wall was actually projecting wrong state of the project to everyone. It is better not to have such a wall than to have with wrong/incomplete information. (In this case, we stopped having the physical wall) &lt;/li&gt;&lt;/ol&gt;And there are few more...&lt;br /&gt;&lt;br /&gt;It is hard to convince everyone and remove the physical wall from a project team that is used to having it.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;     Arguments in favor of Physical wall &lt;/h3&gt;Here are the few arguments that I have faced in favor of Physical wall:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I am used to doing signups and track things on Physical Wall&lt;/li&gt;&lt;li&gt;I prefer to physically feel story cards than rely on software tools.&lt;/li&gt;&lt;li&gt;Physical wall can promote more collaboration within team.&lt;/li&gt;&lt;li&gt;I have to click through 100 links to get the information I need in the ALM tool.&lt;/li&gt;&lt;li&gt;It is easy to refer to physical wall and get any information almost immediately. I don&#39;t want to login to ALM tool every time.&lt;/li&gt;&lt;li&gt;I prefer Physical Wall over ALM tools, it is simple.&lt;/li&gt;&lt;li&gt;It just takes couple of minutes to sync both tool and physical wall. Why do you bother?&lt;/li&gt;&lt;li&gt;Physical wall is an information radiator. Anyone walking-by can know the status of the project&lt;/li&gt;&lt;li&gt;Last but not the least - There are other major issues in our project. Can we look at this later? - :( YOU CAN NEVER FIND AN ANSWER TO THIS. &lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;       My take &lt;/h3&gt;I could find convincing reply to the above questions except the last two:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Reality:&lt;/b&gt; ALM tool has become a necessity in most of the projects because of the benefits and flexibility it brings in. Also, physical wall is not an option for a distributed team. It is the reality and you can&#39;t escape from ALM tools in many cases.&amp;nbsp;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Single source of truth:&lt;/b&gt; As discussed in the issues section, we all love to have single source of truth than to end up with conflicting information.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Personal preference is not an option:&lt;/b&gt; I can&#39;t introduce a new language or a framework into a project since I am comfortable in using it. When we are working as a team, we discuss the pros/cons and decide on one tool/language/framework. If ALM tool can&#39;t be replaced, try to embrace it rather than fighting it and maintaining a physical wall.&amp;nbsp;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Other benefits does not outweigh the issues:&lt;/b&gt; Few people claim that physical wall improves collaboration and some of them prefer to see stories as physical cards &amp;amp; track it through different lanes. On the collaboration part, I am not sure whether there is any fact to back this but I think ALM walls can also have the same effect. On the second benefit, most of the ALM tools provide standup / dashboard view, that mimics the physical wall. Even if we assume that the above benefits cannot be met with a tool, these are only side effects of a physical wall and it would take a back seat considering the issues it brings along.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Access to information immediately:&lt;/b&gt; Most of the ALM tools have long user session time, so we can keep a tab open in our browser(just like email/facebook) to refer whenever we need any information. So we can get necessary information in a click instead of the need to login everytime.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;ALM tool usability (100 click syndrome):&lt;/b&gt; It would take a day or two to get used to any new tool. Most of the product development companies would have usability experts to make the interface as easy as possible to stay in business. If we could just spend that short time to get used to the tool, we won&#39;t be exaggerating and complaining about &quot;100 clicks&quot; needed to do an operation in ALM tool.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Information radiator:&lt;/b&gt; Like build monitor, if each team can project their card wall on a monitor, it would still act as an information radiator. Even though this cannot exactly replace the physical wall, it is a trade off decision we have to go with to see the benefits of using just the ALM tool.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;And last, Does it really worth it:&lt;/b&gt; When you can get all the information that is needed from ALM tools dashboard/standup wall, why do we need to replicate the information on physical wall?&lt;/li&gt;&lt;/ol&gt;Even though we were able to try without physical wall successfully in a small team, I was not able to try it in my 20 member project because of the last argument(10 - Other issues take priority). But I would definitely try it in future.&lt;br /&gt;&lt;br /&gt;You could help in refining this by sharing your comments, views and experience. Also, it would be great if you shed some light on how you overcame the issues in the hybrid approach I mentioned earlier.</content><link rel='replies' type='application/atom+xml' href='http://www.nvenky.in/feeds/6339119665881898811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.nvenky.in/2012/04/physical-card-wall-is-injurious-to.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/6339119665881898811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/6339119665881898811'/><link rel='alternate' type='text/html' href='http://www.nvenky.in/2012/04/physical-card-wall-is-injurious-to.html' title='Physical card wall is injurious to health'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08648834931491601830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9103875830128984607.post-727284591793426372</id><published>2010-11-15T18:35:00.000-08:00</published><updated>2010-11-15T18:38:11.788-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="builder"/><category scheme="http://www.blogger.com/atom/ns#" term="no constructor"/><category scheme="http://www.blogger.com/atom/ns#" term="no setter"/><category scheme="http://www.blogger.com/atom/ns#" term="pattern"/><category scheme="http://www.blogger.com/atom/ns#" term="setup data"/><category scheme="http://www.blogger.com/atom/ns#" term="Unit testing"/><title type='text'>Builders to setup Unit test data</title><content type='html'>Exposing Setter methods or constructors in domain objects for setting up Unit test data should never be done. &lt;br /&gt;Builder pattern is a simple alternate to setup unit test data using reflection without exposing unnecessary setters and constructors in domain objects.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1) Abstract builder:&lt;/b&gt;&lt;br /&gt;Create an Abstract builder that will be extended by all domain builder objects.&lt;br /&gt;&lt;pre class=&quot;codeHighlight&quot;&gt;&lt;code class=&quot;codeContent&quot;&gt;import java.lang.reflect.Field;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.HashMap;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.Map;&lt;br /&gt;&lt;br /&gt;public class AbstractBuilder&amp;lt;E&amp;gt; {&lt;br /&gt;    private E domain;&lt;br /&gt;&lt;br /&gt;    public AbstractBuilder(E domain) {&lt;br /&gt;        this.domain = domain;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public E build() {&lt;br /&gt;        try {&lt;br /&gt;            List&amp;lt;Field&amp;gt; domainFields = getAllFields(new ArrayList&amp;lt;Field&amp;gt;(), domain.getClass());&lt;br /&gt;            Map&amp;lt;String, Field&amp;gt; builderFieldsMap = index(getAllFields(new ArrayList&amp;lt;Field&amp;gt;(), this.getClass()));&lt;br /&gt;            for (Field domainField : domainFields) {&lt;br /&gt;                Field builderField = builderFieldsMap.get(domainField.getName());&lt;br /&gt;                if (builderField != null) {&lt;br /&gt;                    copyFieldValue(domainField, builderField);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        } catch (Exception e) {&lt;br /&gt;            throw new RuntimeException(e);&lt;br /&gt;        }&lt;br /&gt;        return domain;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void copyFieldValue(Field domainField, Field builderField) throws IllegalAccessException {&lt;br /&gt;        domainField.setAccessible(true);&lt;br /&gt;        builderField.setAccessible(true);&lt;br /&gt;        domainField.set(domain, builderField.get(this));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private Map&amp;lt;String, Field&amp;gt; index(List&amp;lt;Field&amp;gt; allFields) {&lt;br /&gt;        Map&amp;lt;String, Field&amp;gt; map = new HashMap&amp;lt;String, Field&amp;gt;();&lt;br /&gt;        for (Field allField : allFields) {&lt;br /&gt;            map.put(allField.getName(), allField);&lt;br /&gt;        }&lt;br /&gt;        return map;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static List&amp;lt;Field&amp;gt; getAllFields(List&amp;lt;Field&amp;gt; fields, Class&amp;lt;?&amp;gt; type) {&lt;br /&gt;        for (Field field : type.getDeclaredFields()) {&lt;br /&gt;            fields.add(field);&lt;br /&gt;        }&lt;br /&gt;        if (type.getSuperclass() != null) {&lt;br /&gt;            fields = getAllFields(fields, type.getSuperclass());&lt;br /&gt;        }&lt;br /&gt;        return fields;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public E getDomain() {&lt;br /&gt;        return domain;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;2) Domain builder class:&lt;/b&gt;&lt;br /&gt;Consider a domain class Person with 4 attributes (firstName, lastName, gender, dateOfBirth). You should create the domain builder object with same 4 attributes.&lt;br /&gt;&lt;pre class=&quot;codeHighlight&quot;&gt;&lt;code class=&quot;codeContent&quot;&gt;&lt;br /&gt;public class PersonBuilder extends AbstractBuilder&amp;lt;Person&amp;gt; {&lt;br /&gt;    private String firstName;&lt;br /&gt;    private String lastName;&lt;br /&gt;    private String gender;&lt;br /&gt;    private Date dateOfBirth;&lt;br /&gt;&lt;br /&gt;    public PersonBuilder() {&lt;br /&gt;        super(new Person());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public PersonBuilder withFirstName(String firstName) {&lt;br /&gt;        this.firstName = firstName;&lt;br /&gt;        return this;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public PersonBuilder withLastName(String lastName) {&lt;br /&gt;        this.lastName = lastName;&lt;br /&gt;        return this;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public PersonBuilder withGender(String gender) {&lt;br /&gt;        this.gender = gender;&lt;br /&gt;        return this;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public PersonBuilder withDateOfBirth(Date dateOfBirth) {&lt;br /&gt;        this.dateOfBirth = dateOfBirth;&lt;br /&gt;        return this;&lt;br /&gt;    }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;3) Using Builders in Unit Tests:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You can use the builder as shown below&lt;br /&gt;&lt;pre class=&quot;codeHighlight&quot;&gt;&lt;code class=&quot;codeContent&quot;&gt;Person testPerson = new PersonBuilder().withFirstName(&quot;hello&quot;).withLastName(&quot;World&quot;).build();&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Tip:&lt;/b&gt;&lt;br /&gt;If you are using Intellij IDEA as the IDE, use Builder plugin to generate the &quot;with&quot; methods quickly.</content><link rel='replies' type='application/atom+xml' href='http://www.nvenky.in/feeds/727284591793426372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.nvenky.in/2010/11/builders-to-setup-unit-test-data.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/727284591793426372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/727284591793426372'/><link rel='alternate' type='text/html' href='http://www.nvenky.in/2010/11/builders-to-setup-unit-test-data.html' title='Builders to setup Unit test data'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08648834931491601830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9103875830128984607.post-5737761436907724885</id><published>2010-11-15T16:04:00.000-08:00</published><updated>2010-11-15T17:08:41.464-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Weblogic ant redeploy SUBST"/><title type='text'>Redeploy application to Weblogic Server through Ant script</title><content type='html'>The most time consuming task in a Web app development is to redeploy the application into the server for every change and test it.&lt;br /&gt;&lt;br /&gt;In Weblogic Workshop IDE, we have an option to redeploy the app into Weblogic server by just right clicking it. But in Intellij Idea, I was not able to find such feature. We spent considerable amount of time to redeploy application using &#39;Weblogic Console&#39; until we figured out the &#39;Ant&#39; script to do it.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;codeHighlight&quot;&gt;&lt;code class=&quot;codeContent&quot;&gt;&amp;lt;project&amp;gt;&lt;br /&gt;&amp;lt;property name=&quot;bea.home&quot; value=&quot;C:/bea&quot;/&amp;gt;&lt;br /&gt;&amp;lt;property name=&quot;wl.home&quot; value=&quot;${bea.home}/weblogic92&quot;/&amp;gt;&lt;br /&gt;&amp;lt;property name=&quot;wl.domain&quot; value=&quot;domainName&quot;/&amp;gt;&lt;br /&gt;&amp;lt;property name=&quot;wl.server&quot; value=&quot;serverName&quot;/&amp;gt;&lt;br /&gt;&amp;lt;!-- classpath to have weblogic.jar as the first jar --&amp;gt;&lt;br /&gt;&amp;lt;path id=&quot;base.path&quot;&amp;gt;&lt;br /&gt;&amp;lt;fileset file=&quot;${wl.home}/server/lib/weblogic.jar&quot;/&amp;gt;&lt;br /&gt;&amp;lt;fileset dir=&quot;${wl.home}/server/lib/&quot;&amp;gt;&lt;br /&gt;&amp;lt;include name=&quot;**/*.jar&quot;/&amp;gt;&lt;br /&gt;&amp;lt;/fileset&amp;gt;&lt;br /&gt;&amp;lt;pathelement path=&quot;${java.class.path}/&quot;/&amp;gt;&lt;br /&gt;&amp;lt;/path&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- weblogic tasks--&amp;gt;&lt;br /&gt;&amp;lt;taskdef name=&quot;wldeploy&quot; classname=&quot;weblogic.ant.taskdefs.management.WLDeploy&quot;&amp;gt;&lt;br /&gt;&amp;lt;classpath refid=&quot;base.path&quot;/&amp;gt;&lt;br /&gt;&amp;lt;/taskdef&amp;gt;&lt;br /&gt;&amp;lt;taskdef name=&quot;wlserver&quot; classname=&quot;weblogic.ant.taskdefs.management.WLServer&quot;&amp;gt;&lt;br /&gt;&amp;lt;classpath refid=&quot;base.path&quot;/&amp;gt;&lt;br /&gt;&amp;lt;/taskdef&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;target name=&quot;&lt;b&gt;deployApp&lt;/b&gt;&quot;&amp;gt;&lt;br /&gt;&amp;lt;wldeploy action=&quot;deploy&quot; verbose=&quot;true&quot; debug=&quot;true&quot;&lt;br /&gt;name=&quot;sampleApp&quot; source=&quot;z:/app/target/sampleApp.ear&quot;&lt;br /&gt;user=&quot;weblogic&quot; password=&quot;weblogic&quot;&lt;br /&gt;adminurl=&quot;t3://localhost:7001&quot; targets=&quot;${wl.server}&quot;/&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;target name=&quot;redeployApp&quot;&amp;gt;&lt;br /&gt;&amp;lt;wldeploy action=&quot;undeploy&quot; verbose=&quot;true&quot; debug=&quot;true&quot; name=&quot;sampleApp&quot; &lt;br /&gt;user=&quot;weblogic&quot; password=&quot;weblogic&quot;&lt;br /&gt;adminurl=&quot;t3://localhost:7001&quot; targets=&quot;${wl.server}&quot;/&amp;gt;&lt;br /&gt;&amp;lt;wldeploy action=&quot;deploy&quot; verbose=&quot;true&quot; debug=&quot;true&quot;&lt;br /&gt;name=&quot;sampleApp&quot; source=&quot;z:/app/target/sampleApp.ear&quot;&lt;br /&gt;user=&quot;weblogic&quot; password=&quot;weblogic&quot;&lt;br /&gt;adminurl=&quot;t3://localhost:7001&quot; targets=&quot;${wl.server}&quot;/&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;TIP:&lt;/b&gt;&lt;br /&gt;Use &lt;b&gt;SUBST&lt;/b&gt; command in Windows to map your project location to a new drive.&amp;nbsp;For eg.,&lt;br /&gt;&lt;pre style=&quot;-moz-background-inline-policy: continuous; background: url(&amp;quot;http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif&amp;quot;) repeat scroll 0% 0% rgb(240, 240, 240); border: 1px dashed rgb(204, 204, 204); color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;subst z: d:/venky/projects/utils/sampleApp&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Individual developers in the team can checkout the code to any location but using this SUBST command will help the team to refer the project from same location like &lt;b&gt;z:/src&lt;/b&gt;. Even though IDE&#39;s use relative path, it is nice to do this as the team can use these kinds of file without any customization.</content><link rel='replies' type='application/atom+xml' href='http://www.nvenky.in/feeds/5737761436907724885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.nvenky.in/2010/11/redeploy-application-to-weblogic-server.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/5737761436907724885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/5737761436907724885'/><link rel='alternate' type='text/html' href='http://www.nvenky.in/2010/11/redeploy-application-to-weblogic-server.html' title='Redeploy application to Weblogic Server through Ant script'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08648834931491601830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9103875830128984607.post-5824480199376368424</id><published>2010-07-20T18:56:00.000-07:00</published><updated>2010-11-15T17:10:30.189-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="annotation filter"/><category scheme="http://www.blogger.com/atom/ns#" term="Filter"/><category scheme="http://www.blogger.com/atom/ns#" term="FilterDef"/><category scheme="http://www.blogger.com/atom/ns#" term="Hibernate"/><category scheme="http://www.blogger.com/atom/ns#" term="latest date"/><category scheme="http://www.blogger.com/atom/ns#" term="OneToMany"/><title type='text'>Hibernate @OneToMany annotation filter by Latest date</title><content type='html'>When there is a @OneToMany relationship between domain objects, a&amp;nbsp;common requirement is to fetch the latest child record based on some date column or a version number column.&amp;nbsp;This can be easily implemented in Hibernate using @Filter annotation and some SQL as shown below.&lt;br /&gt;&lt;br /&gt;Consider a case where a Person has more than one Mobile phone and he always uses the latest mobile phone.&lt;br /&gt;&lt;br /&gt;Person object has a @OneToMany relationship to MobilePhone object .&lt;br /&gt;&lt;pre class=&quot;codeHighlight&quot;&gt;&lt;code class=&quot;codeContent&quot;&gt;@Entity&lt;br /&gt;@Table(name = &quot;PERSON&quot;)&lt;br /&gt;&lt;b&gt;@FilterDef(name = Person.LATEST_PHONE_FILTER)&lt;/b&gt;&lt;br /&gt;public class &lt;b&gt;Person&lt;/b&gt;{&lt;br /&gt;   public static final String LATEST_PHONE_FILTER = &quot;latestPhoneFilter&quot;;&lt;br /&gt;&lt;br /&gt;   @Column(name = &quot;PERSON_ID&quot;)&lt;br /&gt;   private Long id;&lt;br /&gt;&lt;br /&gt;   @Column(name = &quot;FIRST_NAME&quot;)   &lt;br /&gt;   private String firstName;&lt;br /&gt;&lt;br /&gt;   @Column(name = &quot;LAST_NAME&quot;)&lt;br /&gt;   private String lastName;&lt;br /&gt;&lt;br /&gt;   @OneToMany(mappedBy = &quot;owner&quot;, fetch = FetchType.EAGER)&lt;br /&gt;   @Filter(name = LATEST_PHONE_FILTER, condition = &quot;&lt;b&gt;PURCHASE_DATE &lt;/b&gt;=&lt;br /&gt;   (select max(M.PURCHASE_DATE) from MOBILE_PHONE M where &lt;b&gt;M.PERSON_ID= PERSON_ID&lt;/b&gt;&quot;)&lt;br /&gt;   private List&amp;lt;MobilePhone&amp;gt; mobilePhones;&lt;br /&gt;   &lt;br /&gt;   public MobilePhone &lt;b&gt;getLatestMobilePhone()&lt;/b&gt;{&lt;br /&gt;      return CollectionsUtil.isEmpty(mobilePhones) ? null: mobilePhones.get(0);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;@Entity&lt;br /&gt;@Table(name = &quot;MOBILE_PHONE&quot;)&lt;br /&gt;public class &lt;b&gt;MobilePhone&lt;/b&gt;{    &lt;br /&gt;    ..............&lt;br /&gt;    ..............&lt;br /&gt;    @Column(name = &quot;PURCHASE_DATE&quot;)&lt;br /&gt;    private Date purchaseDate;&lt;br /&gt;&lt;br /&gt;    @ManyToOne(fetch = FetchType.LAZY)&lt;br /&gt;    @JoinColumn(name = &quot;PERSON_ID&quot;)&lt;br /&gt;    private Person owner;&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If you notice the SQL used in the filter, it has a condition like &amp;nbsp;&lt;i&gt;&lt;b&gt;M.PERSON_ID= PERSON_ID&lt;/b&gt;&lt;/i&gt;.&lt;br /&gt;PERSON_ID column without alias name refers to the PERSON tables primary key. Hibernate takes care of giving proper alias name while generating SQL.  &lt;br /&gt;&lt;br /&gt;This configuration will always fetch only the latest mobile phone to the List of MobilePhone and the &lt;b&gt;getLatestMobilePhone()&lt;/b&gt; method can return that object.</content><link rel='replies' type='application/atom+xml' href='http://www.nvenky.in/feeds/5824480199376368424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.nvenky.in/2010/07/hibernate-onetomany-annotation-filter.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/5824480199376368424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/5824480199376368424'/><link rel='alternate' type='text/html' href='http://www.nvenky.in/2010/07/hibernate-onetomany-annotation-filter.html' title='Hibernate @OneToMany annotation filter by Latest date'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08648834931491601830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9103875830128984607.post-2958831128005616893</id><published>2010-05-29T12:09:00.000-07:00</published><updated>2010-06-28T03:50:20.718-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Books"/><category scheme="http://www.blogger.com/atom/ns#" term="dynamic list"/><category scheme="http://www.blogger.com/atom/ns#" term="Library"/><category scheme="http://www.blogger.com/atom/ns#" term="recommendation"/><category scheme="http://www.blogger.com/atom/ns#" term="technology"/><category scheme="http://www.blogger.com/atom/ns#" term="ThoughtWorks"/><title type='text'>Recommended Technical Books</title><content type='html'>Long time since I wrote any blog..&lt;br /&gt;We recently got new technical books for our office library. ThoughtWorkers pitched in with their books recommendation and we ended up getting a great collection of books. I hope these recommended books will help others too.&lt;br /&gt;&lt;br /&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoNormalTable&quot; style=&quot;border-collapse: collapse; width: 100%;&quot;&gt;&lt;tbody&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;background: none repeat scroll 0% 0% rgb(216, 216, 216); border: 1pt solid windowtext; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: center;&quot;&gt;&lt;a href=&quot;http://www.blogger.com/post-edit.g?blogID=9103875830128984607&amp;amp;postID=2958831128005616893&quot; name=&quot;RANGE!A3:D83&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Sl No.&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;b&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;background: none repeat scroll 0% 0% rgb(216, 216, 216); border-color: windowtext windowtext windowtext -moz-use-text-color; border-style: solid solid solid none; border-width: 1pt 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Title (Sorted Alphabetically)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;background: none repeat scroll 0% 0% rgb(216, 216, 216); border-color: windowtext windowtext windowtext -moz-use-text-color; border-style: solid solid solid none; border-width: 1pt 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Author&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;About Face 3: The Essentials Of Interaction   Design&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Alan Cooper, Robert Reimann, David Cronin&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;2&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap=&quot;nowrap&quot; style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; valign=&quot;bottom&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Agile Estimating and Planning&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Mike Cohn&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;3&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Agile Software Development 2ed- The   Cooperative Game&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Cockburn&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;4&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Agile Software Development, Principles,   Patterns, And Practices&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Robert C. Martin&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;5&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Agile Testing: Practical Guide For Testers&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Lisa Crispin&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;6&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Bargaining For Advantage: Negotiation   Strategies For Reasonable People 2nd Edition&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;G. Richard Shell&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;7&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Clean Code: A Handbook Of Agile Software   Craftsmanship&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Robert C. Martin, Michael C. Feathers, Timothy   R. Ottinger&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;8&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Clr Via C#: Applied Microsoft.net Programming   2e&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Richter J&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;9&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Cocoa Design Patterns&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Erik Buck, Donald Yacktman&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;10&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Cocoa Programming Developer&#39;s Handbook   (developer&#39;s Library)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;David Chisnall, Scott Anguish, Erik Buck,   Donald A. Yacktman&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;11&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Concepts, Techniques, And Models Of Computer   Programming&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Haridi Seif&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;12&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Concurrent Programming On Windows&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Joe Duffy&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;13&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap=&quot;nowrap&quot; style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; valign=&quot;bottom&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Core Python Programming 2nd Edition&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Chun &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;14&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Design Patterns: Elements Of Reusable Object   Oriented Software&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Gamma&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;15&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Designing Gestural Interfaces: Touchscreens   And Interactive Devices&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Dan Saffer&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;16&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Designing Interfaces: Patterns For Effective   Interaction Design&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Jenifer Tidwell&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;17&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Domain-driven Design&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Eric Evans&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;18&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Don&#39;t Make Me Think: A Common Sense Approach   To Web Usability, 2nd Edition&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Steve Krug&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;19&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Emotional Design: Why We Love (or Hate)   Everyday Things&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Donald A. Norman&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;20&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Enterprise Integration Patterns: Designing,   Building, And Deploying Messaging Solutions&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Gregor Hohpe, Bobby Woolf&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;21&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Essentials Of Programming Languages,3/ed.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Daniel P Friedman&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;22&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; valign=&quot;bottom&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 9pt;&quot;&gt;Ext Js 3.0 Cookbook&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; valign=&quot;bottom&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 9pt;&quot;&gt;Jorge Ramon &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;23&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap=&quot;nowrap&quot; style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; valign=&quot;bottom&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Extreme Programming Explained 2nd Edition&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Beck &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;24&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Getting Things Done: The Art Of Stress-free   Productivity&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;David Allen&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;25&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Groovy And Grails Recipes (recipes: A   Problem-solution Approach)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Bashar Abdul-jawad&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;26&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Groovy Recipes&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Scott Davis&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;27&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Growing Object-oriented Software, Guided By   Tests (beck Signature)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Steve Freeman, Nat Pryce&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;28&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Gui Bloopers 2.0, Second Edition: Common User   Interface Design Don&#39;ts And Dos (interactive Technologies)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Jeff Johnson&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;29&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Handbook Of Usability Testing: How To Plan,   Design And Conduct Effective Tests, 2nd Ed&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Jeffrey Rubin, Dana Chisnell&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;30&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Head First Ajax&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;M. Rebecca Riordan&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;31&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Head First Iphone Development&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Dan Pilone, Tracey Pilone&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;32&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Head First Javascript&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Michael Morrison&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;33&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Head First Object-oriented Analysis &amp;amp;   Design&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Brett Mclaughlin, Gary Pollice, David West&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;34&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;High Performance Web Sites: Essential   Knowledge For Front-end Engineers&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Steve Souders&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;35&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Implementation Patterns (addison-wesley   Signature)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Kent Beck&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;36&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Influence: The Psychology Of Persuasion   (collins Business Essentials)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Robert B. Cialdini&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;37&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Introduction To Algorithms 3e&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Thomas H Cormen&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;38&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Iphone For Programmers: An App-driven Approach   (deitel Developer)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Paul Deitel, Harvey Deitel, Abbey Deitel, Eric   Kern, Michael Morgano&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.8in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.8in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;39&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.8in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Iphone Hacks: Pushing The Iphone And Ipod   Touch Beyond Their Limits&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.8in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Damien Stolarz, Adam Stolarz, William Hurley,   David Jurick, Jurick David, Stolarz Adam, Stolarz Damien&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;40&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Iphone In Action: Introduction To Web And Sdk   Development&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Christopher Allen, Shannon Applecline&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;41&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Iphone Sdk Development (the Pragmatic   Programmers)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Bill Dudney, Christopher Adamson, Marcel   Molina&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;42&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Jasper Reports For Java Developers :   Create.design,format,and Export Reports With The Wor&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Heffelfinger&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;43&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Javascript Programmer&#39;s Reference&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Alexei White&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;44&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; valign=&quot;bottom&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 9pt;&quot;&gt;Jquery Cookbook&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap=&quot;nowrap&quot; style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; valign=&quot;bottom&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 9pt;&quot;&gt;Cody Lindley&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;45&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Lean Software Development: An Agile Toolkit&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Mary Poppendieck, Tom Poppendieck&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 24.6pt;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 24.6pt; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;46&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 24.6pt; padding: 0in 5.4pt; width: 55.08%;&quot; valign=&quot;bottom&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 9pt;&quot;&gt;Learning Ext JS&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 24.6pt; padding: 0in 5.4pt; width: 33.3%;&quot; valign=&quot;bottom&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 9pt;&quot;&gt;Shea Frederick, Colin   Ramsay, and Steve &#39;Cutter&#39; Blades&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;47&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Lessons Learned In Software Testing&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Bret Pittichord, James Bach, Cem Kaner&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;48&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Made To Stick: Why Some Ideas Survive And   Others Die&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Dan Heath Chip Heath&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;49&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Maverick!&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Ricardo Semler&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;50&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Modular Web Design: Creating Reusable   Components For User Experience Design And Documentation&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Nathan Curtis&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;51&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Patterns Of Enterprise Application   Architecture&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Martin Fowler&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;52&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Planning Extreme Programming&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Kent Beck, Martin Fowler, Martin Fowler&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;53&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Practical Common Lisp&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Peter Seibel&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;54&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Practices Of An Agile Developer&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Venkat Subramaniam, Andy Hunt&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;55&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Pragmatic Programmer, The&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Andy Hunt, David Thomas&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.8in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.8in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;56&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.8in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Professional Css: Cascading Style Sheets For   Web Design&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.8in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Christopher Schmitt, Mark Trammell, Ethan   Marcotte, Todd Dominey, Dunstan Orchard, Todd Dominey&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;57&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Programming F#: A Comprehensive Guide For   Writing Simple Code To Solve Complex Problems&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Chris Smith, Glen Smith&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 24.6pt;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 24.6pt; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;58&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 24.6pt; padding: 0in 5.4pt; width: 55.08%;&quot; valign=&quot;bottom&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 9pt;&quot;&gt;Programming Google App   Engine: Build and Run Scalable Web Apps on Google&#39;s Infrastructure (Animal   Guide)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td nowrap=&quot;nowrap&quot; style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 24.6pt; padding: 0in 5.4pt; width: 33.3%;&quot; valign=&quot;bottom&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 9pt;&quot;&gt;Dan Sanderso&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;59&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Programming In Objective-c: A Complete   Introduction To The Objective-c Language&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Kochan Stephen G.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;60&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Programming In Scala: A Comprehensive   Step-by-step Guide&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Martin Odersky, Lex Spoon, Bill Venners&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;61&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Pulling Strings With Puppet: Configuration   Management Made Easy&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;James Turnbull&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;62&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Python For Unix And Linux System   Administration&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Noah Gift, Jeremy Jones&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;63&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Refactoring Improving The Design Of Existing   Code&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Fowler Martin&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;64&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Restful Webservices&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Leonard Richardson, Sam Ruby, David Heinemeier&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;65&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Selfish Gene 30th Indian Edn.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Richard Dawkins&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;66&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Smalltalk Best Practice Patterns&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Kent Beck&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;67&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Software Testing: A Craftsman&#39;s Approach,   Third Edition&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Paul C. Jorgensen&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;68&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Structure And Interpretation Of Computer   Programs - 2nd Edition (mit Electrical Engineering And Computer Science)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Harold Abelson, Gerald Jay Sussman&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;69&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Succeeding With Agile: Software Development   Using Scrum (addison-wesley Signature)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Mike Cohn&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;70&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Test-driven Development By Example&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Beck&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;71&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Testing Computer Software, 2nd Edition&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Cem Kaner, Hung Quoc Nguyen, Jack Falk&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;72&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Testing Extreme Programming&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Lisa Crispin, Ken S. Rosenthal, Tip House&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;73&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;The Art Of Innovation&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Tom Kelley&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;74&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;The Design Of Everyday Things&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Donald A. Norman, Don Norman&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;75&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;The Knowledge-creating Company (harvard   Business Review Classics)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Ikujiro Nonaka&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;76&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;The New Turing Omnibus: Sixty-six Excursions   In Computer Science&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;A. K. Dewdney&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;77&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;The Psychology Of Computer Programming: Silver   Anniversary Edition&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Gerald M. Weinberg&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.4in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.4in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;78&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;What Customers Want: Using Outcome-driven   Innovation To Create Breakthrough Products And Services&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.4in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Anthony Ulwick&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;79&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Windows Presentation Foundation Unleashed   (wpf)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Adam Nathan, Daniel Lehenbauer&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr style=&quot;height: 0.2in;&quot;&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext; border-style: none solid solid; border-width: medium 1pt 1pt; height: 0.2in; padding: 0in 5.4pt; width: 11.62%;&quot; width=&quot;11%&quot;&gt;&lt;div align=&quot;right&quot; class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt; text-align: right;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;80&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 55.08%;&quot; width=&quot;55%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Working Effectively With Legacy Code&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; height: 0.2in; padding: 0in 5.4pt; width: 33.3%;&quot; width=&quot;33%&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: 0.0001pt;&quot;&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;&quot;&gt;Feathers&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.nvenky.in/feeds/2958831128005616893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.nvenky.in/2010/05/amazing-list-of-technical-books.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/2958831128005616893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/2958831128005616893'/><link rel='alternate' type='text/html' href='http://www.nvenky.in/2010/05/amazing-list-of-technical-books.html' title='Recommended Technical Books'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08648834931491601830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9103875830128984607.post-597329975132910251</id><published>2010-01-28T20:32:00.000-08:00</published><updated>2013-04-07T13:16:35.222-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="annotation"/><category scheme="http://www.blogger.com/atom/ns#" term="column based"/><category scheme="http://www.blogger.com/atom/ns#" term="easy"/><category scheme="http://www.blogger.com/atom/ns#" term="excel"/><category scheme="http://www.blogger.com/atom/ns#" term="github"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="parsing"/><category scheme="http://www.blogger.com/atom/ns#" term="poi"/><category scheme="http://www.blogger.com/atom/ns#" term="row based"/><title type='text'>Parsing Excel Sheet made easy with Annotations and POI</title><content type='html'>HSSF - Horrible Spreadsheet Format – not anymore. With few annotations, excel parsing can be done in one line.&lt;br /&gt;&lt;br /&gt;We had a requirement in our current project to parse multiple excel sheets and store the information to database. I hope most of the projects involving excel sheet parsing would be doing the same. We built a extensible framework to parse multiple sheets and populate JAVA objects with annotations.&lt;br /&gt;&lt;br /&gt;We will discuss the steps to use annotations to parse excel sheet and populate Java objects.&lt;br /&gt;&lt;br /&gt;Consider we have an excel sheet with student information.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; overflow: auto; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_OAeb_UFifRg/S2WiIfweGiI/AAAAAAAACCA/Sv36FYxed1E/s1600-h/Screenshot.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;138&quot; src=&quot;http://3.bp.blogspot.com/_OAeb_UFifRg/S2WiIfweGiI/AAAAAAAACCA/Sv36FYxed1E/s640/Screenshot.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;Parsing Logic:&lt;/b&gt;&lt;br /&gt;While parsing this excel sheet, we need to populate one “Section” object and multiple “Student” objects related to a Section. You can see that Student information is available in multiple rows whereas the Section details (Year, Section) is available in column B.  &lt;br /&gt;&lt;br /&gt;We will have to annotate the above information to the domain class, that can be interpretted by the sheet parser.&lt;br /&gt;&lt;br /&gt;1) Annotate Domain Class:&lt;br /&gt;First we will see the steps to annotate Section object:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;codeHighlight&quot;&gt;&lt;code class=&quot;codeContent&quot;&gt;&lt;b&gt;@ExcelObject(&lt;/b&gt;parseType = ParseType.COLUMN, start = 2, end = 2)&lt;br /&gt;public class Section {&lt;br /&gt; &lt;b&gt;@ExcelField&lt;/b&gt;(position = 2)&lt;br /&gt; private String year;&lt;br /&gt;&lt;br /&gt; &lt;b&gt;@ExcelField&lt;/b&gt;(position = 3)&lt;br /&gt; private String section;&lt;br /&gt; &lt;br /&gt; &lt;b&gt;@MappedExcelObject&lt;/b&gt;&lt;br /&gt; private List &amp;lt;Student&amp;gt; students;&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;You can find three different annotation in this class. &lt;br /&gt;i)&lt;b&gt;ExcelObject:&lt;/b&gt; This annotation tells the parser about the parse type (Row or Column), number of objects to create (start, end). Based on the above annotation, Section value should be parsed Columnwise and information can be found in Column 2 (“B”) of the Excelsheet.&lt;br /&gt;&lt;br /&gt;ii)&lt;b&gt;ExcelField:&lt;/b&gt; This annotation tells the parser to fetch “year” information from Row 2 and “section” information from Row 3.  &lt;br /&gt;&lt;br /&gt;iii)&lt;b&gt;MappedExcelObject:&lt;/b&gt; Apart from Simple datatypes like “Double”,”String”, we might also try to populate complex java objects while parsing. In this case, each section has a list of student information to be parsed from excel sheet. This annotation will help the parser in identifying such fields. &lt;br /&gt;&lt;br /&gt;Next step is to annotate Student class:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;codeHighlight&quot;&gt;&lt;code class=&quot;codeContent&quot;&gt;&lt;b&gt;@ExcelObject&lt;/b&gt;(parseType = ParseType.ROW, start = 6, end = 8)&lt;br /&gt;public class Student {&lt;br /&gt; &lt;b&gt;@ExcelField&lt;/b&gt;(position = 2)&lt;br /&gt; private Long roleNumber;&lt;br /&gt; &lt;br /&gt; &lt;b&gt;@ExcelField&lt;/b&gt;(position = 3)&lt;br /&gt; private String name;&lt;br /&gt; &lt;br /&gt; &lt;b&gt;@ExcelField&lt;/b&gt;(position = 4)&lt;br /&gt; private Date dateOfBirth;&lt;br /&gt; &lt;br /&gt; &lt;b&gt;@ExcelField&lt;/b&gt;(position = 5)&lt;br /&gt; private String fatherName;&lt;br /&gt; &lt;br /&gt; &lt;b&gt;@ExcelField&lt;/b&gt;(position = 6)&lt;br /&gt; private String motherName;&lt;br /&gt; &lt;br /&gt; &lt;b&gt;@ExcelField&lt;/b&gt;(position = 7)&lt;br /&gt; private String address;&lt;br /&gt; &lt;br /&gt; &lt;b&gt;@ExcelField&lt;/b&gt;(position = 8)&lt;br /&gt; private Double totalScore;&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;i) &lt;b&gt;ExcelObject&lt;/b&gt;: As shown above, this annotation tells parser to parse Rows 6 to 8 (create 3 student objects). NOTE: Optional field “zeroIfNull” , if set to true, will populate Zero to all number fields (Double,Long,Integer) by default if the data is not available in DB.&lt;br /&gt;&lt;br /&gt;ii) &lt;b&gt;ExcelField:&lt;/b&gt; Student class has 7 values to be parsed and stored in the database. This is denoted in the domain class as annotation.&lt;br /&gt;&lt;br /&gt;iii) &lt;b&gt;MappedExcelObject&lt;/b&gt;: Student class does not have any complex object, hence this annoation is not used in this domain class.&lt;br /&gt;&lt;br /&gt;Once the annotation is done, you have just invoke the parser with the Sheet and the Root class you want to populate.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;codeHighlight&quot;&gt;&lt;code class=&quot;codeContent&quot;&gt;//Get the sheet using POI API.&lt;br /&gt;String sheetName = &quot;Sheet1&quot;;&lt;br /&gt;SheetParser parser = new SheetParser();&lt;br /&gt;InputStream inputStream = getClass().getClassLoader().getResourceAsStream(&quot;Student Profile.xls&quot;);&lt;br /&gt;Sheet sheet = new HSSFWorkbook(inputStream).getSheet(sheetName);&lt;br /&gt;&lt;br /&gt;//Invoke the Sheet parser.&lt;br /&gt;List&lt;section&gt; entityList = parser.createEntity(sheet, sheetName, Section.class);&lt;br /&gt;&lt;/section&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Thats all it requires. Parser would populate all the fields based on the annotation for you.&lt;br /&gt;&lt;br /&gt;You can find the source code &lt;complete id=&quot;goog_2015259627&quot;&gt;in &lt;/complete&gt;&lt;a href=&quot;https://github.com/nvenky/excel-parser&quot; target=&quot;_blank&quot;&gt;Github&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.nvenky.in/feeds/597329975132910251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.nvenky.in/2010/01/parsing-excel-sheet-made-easy-with.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/597329975132910251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/597329975132910251'/><link rel='alternate' type='text/html' href='http://www.nvenky.in/2010/01/parsing-excel-sheet-made-easy-with.html' title='Parsing Excel Sheet made easy with Annotations and POI'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08648834931491601830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_OAeb_UFifRg/S2WiIfweGiI/AAAAAAAACCA/Sv36FYxed1E/s72-c/Screenshot.png" height="72" width="72"/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9103875830128984607.post-7744288647204207480</id><published>2010-01-07T18:16:00.000-08:00</published><updated>2010-11-15T17:13:39.834-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="brute"/><category scheme="http://www.blogger.com/atom/ns#" term="brute force"/><category scheme="http://www.blogger.com/atom/ns#" term="brute force algorithm"/><category scheme="http://www.blogger.com/atom/ns#" term="force"/><category scheme="http://www.blogger.com/atom/ns#" term="java brute force"/><category scheme="http://www.blogger.com/atom/ns#" term="java cracker"/><category scheme="http://www.blogger.com/atom/ns#" term="java pdf"/><category scheme="http://www.blogger.com/atom/ns#" term="password"/><category scheme="http://www.blogger.com/atom/ns#" term="password recovery"/><category scheme="http://www.blogger.com/atom/ns#" term="pdf"/><category scheme="http://www.blogger.com/atom/ns#" term="pdf password"/><title type='text'>Crack PDF password - Java Brute force algorithm</title><content type='html'>Recently I was in a big mess when I lost the password for an important PDF document. I ended up using the Brute force algorithm and cracked the PDF password.&lt;br /&gt;&lt;br /&gt;PDFBox API is being used in the below code to open the PDF file. Please download the dependent JAR files from &lt;a href=&quot;http://sourceforge.net/projects/pdfbox/files/PDFBox/PDFBox-0.7.3/PDFBox-0.7.3.zip/download&quot;&gt;&lt;b&gt;here&lt;/b&gt;&lt;/a&gt;.&lt;b&gt; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Word of caution: &lt;/b&gt;Based on the length of the password, it might even take few days to run it. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;codeHighlight&quot;&gt;&lt;code class=&quot;codeContent&quot;&gt;package com.bruteforce;&lt;br /&gt;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;&lt;br /&gt;import org.apache.pdfbox.exceptions.CryptographyException;&lt;br /&gt;import org.apache.pdfbox.exceptions.InvalidPasswordException;&lt;br /&gt;import org.apache.pdfbox.pdmodel.PDDocument;&lt;br /&gt;&lt;br /&gt;public class BruteForceDecryptPDF {&lt;br /&gt;&lt;br /&gt; private static final String PDF_FILE_PATH = &quot;c:/file2.pdf&quot;;&lt;br /&gt; private static final int PASSWORD_MAX_LENGTH = 4;&lt;br /&gt; private static final int PASSWORD_MIN_LENGTH = 2;&lt;br /&gt; // Array with characters to use in Brute Force Algorithm.&lt;br /&gt; // You can remove or add more characters in this array.&lt;br /&gt; private static char fCharList[] = { &#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;, &#39;f&#39;, &#39;g&#39;, &#39;h&#39;,&lt;br /&gt;   &#39;i&#39;, &#39;j&#39;, &#39;k&#39;, &#39;l&#39;, &#39;m&#39;, &#39;n&#39;, &#39;o&#39;, &#39;p&#39;, &#39;q&#39;, &#39;r&#39;, &#39;s&#39;, &#39;t&#39;, &#39;u&#39;,&lt;br /&gt;   &#39;v&#39;, &#39;w&#39;, &#39;x&#39;, &#39;y&#39;, &#39;z&#39;,&#39;0&#39;,&#39;1&#39;,&#39;2&#39;,&#39;3&#39;,&#39;4&#39;,&#39;5&#39;,&#39;6&#39;,&#39;7&#39;,&#39;8&#39;,&lt;br /&gt;   &#39;9&#39;};&lt;br /&gt;&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  long startTime=System.currentTimeMillis();&lt;br /&gt;  PDDocument document = null;&lt;br /&gt;  boolean found = false;&lt;br /&gt;  try {&lt;br /&gt;   document = PDDocument.load(PDF_FILE_PATH);&lt;br /&gt;&lt;br /&gt;   for (int i = PASSWORD_MIN_LENGTH; i &lt;= PASSWORD_MAX_LENGTH; i++) { &lt;br /&gt;    try {&lt;br /&gt;     startBruteForce(i, document);&lt;br /&gt;    }catch(PasswordFoundInterrupter ex){&lt;br /&gt;     found=true;&lt;br /&gt;     System.out.println(&quot;SUCCESS. PASSWORD: - &quot; + ex.getMessage());&lt;br /&gt;    }&lt;br /&gt;    catch (Exception e) {&lt;br /&gt;     e.printStackTrace();&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;   if(!found){&lt;br /&gt;    System.out.println(&quot;Failure - Password not found&quot;);&lt;br /&gt;   }&lt;br /&gt;   document.close();&lt;br /&gt;   long timeTaken=System.currentTimeMillis()-startTime;&lt;br /&gt;   System.out.println(&quot;TOTAL TIME TAKEN - &quot; + timeTaken);&lt;br /&gt;  } catch (IOException e) {&lt;br /&gt;   System.out.println(&quot;PDF File not found at - &quot;+ PDF_FILE_PATH);&lt;br /&gt;   throw new RuntimeException(e);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public static void startBruteForce(int length, PDDocument document) {&lt;br /&gt;  StringBuffer sb = new StringBuffer(length);&lt;br /&gt;  char currentChar = fCharList[0];&lt;br /&gt;&lt;br /&gt;  for (int i = 1; i &lt;= length; i++) {&lt;br /&gt;   sb.append(currentChar);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  changeCharacters(0, sb, length, document);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private static StringBuffer changeCharacters(int pos, StringBuffer sb,&lt;br /&gt;   int length, PDDocument document) {&lt;br /&gt;  for (int i = 0; i &lt;= fCharList.length - 1; i++) {&lt;br /&gt;   sb.setCharAt(pos, fCharList[i]);&lt;br /&gt;   if (pos == length - 1) {    &lt;br /&gt;    // Uncomment this to see the generated passwords. It may slow down if you are trying for larger size passwords.&lt;br /&gt;    //System.out.println(sb.toString());&lt;br /&gt;    if(valid(sb.toString(),document)){&lt;br /&gt;     throw new BruteForceDecryptPDF.PasswordFoundInterrupter(sb.toString());&lt;br /&gt;    }&lt;br /&gt;   } else {&lt;br /&gt;    changeCharacters(pos + 1, sb, length, document);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return sb;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public static boolean valid(String password, PDDocument document) {&lt;br /&gt;  System.out.println(password);&lt;br /&gt;  try {&lt;br /&gt;   document.decrypt(password);&lt;br /&gt;   System.out.println(&quot;Success - &quot; + password);&lt;br /&gt;   return true;&lt;br /&gt;  } catch (IOException e) {&lt;br /&gt;   throw new RuntimeException(e);&lt;br /&gt;  } catch (CryptographyException e) {&lt;br /&gt;   return false;&lt;br /&gt;  } catch (InvalidPasswordException e) {&lt;br /&gt;   return false;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private static class PasswordFoundInterrupter extends RuntimeException{&lt;br /&gt;  public PasswordFoundInterrupter(String message) {&lt;br /&gt;   super(message);&lt;br /&gt;  }  &lt;br /&gt; }&lt;br /&gt;}  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.nvenky.in/feeds/7744288647204207480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.nvenky.in/2010/01/crack-pdf-password-brute-force.html#comment-form' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/7744288647204207480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/7744288647204207480'/><link rel='alternate' type='text/html' href='http://www.nvenky.in/2010/01/crack-pdf-password-brute-force.html' title='Crack PDF password - Java Brute force algorithm'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08648834931491601830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9103875830128984607.post-5594110095323426903</id><published>2009-12-02T09:44:00.000-08:00</published><updated>2010-11-15T18:40:15.063-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Unit testing repository DAO classes"/><title type='text'>Unit testing repository/DAO classes</title><content type='html'>In an enterprise application we have many layers. As part of testing a layer, we would Mock the underlying layer objects and test it. But to test the DAO layer, we need to write integration test to perform DB operations.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1) Declare Spring &lt;/b&gt;&lt;b&gt;context aware Abstract Test class:&lt;/b&gt;&lt;br /&gt;&lt;pre class=&quot;codeHighlight&quot;&gt;&lt;code class=&quot;codeContent&quot;&gt;@ContextConfiguration(locations = {&quot;classpath:data-applicationContext.xml&quot;})  &lt;br /&gt; @TransactionConfiguration(transactionManager = &quot;transactionManager&quot;, defaultRollback = true)  &lt;br /&gt; @Transactional  &lt;br /&gt; public abstract class SpringTransactionTestContext extends AbstractTransactionalJUnit4SpringContextTests {  &lt;br /&gt; }  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;b&gt;2) Extend this class in all DAOTest and Autowire DAO:&lt;/b&gt;&lt;br /&gt;&lt;pre class=&quot;codeHighlight&quot;&gt;&lt;code class=&quot;codeContent&quot;&gt; public class StudentDaoImplTest extends SpringTransactionTestContext {  &lt;br /&gt;   @Autowired  &lt;br /&gt;   private StudentDaoImpl personDao;  &lt;br /&gt; }  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;b&gt;3) Setup Test data:&lt;/b&gt;&lt;br /&gt;If Student class is dependent on some School table, to test this class we need to insert School record.&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Options&lt;/b&gt;:&lt;br /&gt;&lt;u&gt;i) Using Session factory:&lt;/u&gt;&lt;br /&gt;Use SessionFactory instance and save School object as shown below: &lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;codeHighlight&quot;&gt;&lt;code class=&quot;codeContent&quot;&gt;@Autowired  &lt;br /&gt; private SessionFactory sessionFactory;  &lt;br /&gt; School school= new School(&quot;School Name&quot;);  &lt;br /&gt; sessionFactory.getCurrentSession().save(school);  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Also, builders can be used to create objects with required test data. Look at this &lt;a href=&quot;http://venky-techspace.blogspot.com/2010/11/builders-to-setup-unit-test-data.html&quot;&gt;post &lt;/a&gt;on how to use builder pattern in Unit tests.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;ii) Using SimpleJDBCTemplate - Less preferred:&lt;/u&gt;&lt;br /&gt;SimpleJDBCTemplate object is found in . This can be directly used to run SQL scripts to insert into tables.&lt;br /&gt;&lt;pre class=&quot;codeHighlight&quot;&gt;&lt;code class=&quot;codeContent&quot;&gt;String schoolInsertQuery = &quot;Insert into SCHOOL(ID,NAME) values (?,?)&quot;;  &lt;br /&gt; this.simpleJdbcTemplate.update(schoolInsertQuery, schoolId, schoolName);  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Once the Test execution is completed, it would automatically rollback the transaction (As defaultRollback is set true).</content><link rel='replies' type='application/atom+xml' href='http://www.nvenky.in/feeds/5594110095323426903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.nvenky.in/2009/12/simple-ways-to-setup-test-data-for.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/5594110095323426903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/5594110095323426903'/><link rel='alternate' type='text/html' href='http://www.nvenky.in/2009/12/simple-ways-to-setup-test-data-for.html' title='Unit testing repository/DAO classes'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08648834931491601830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9103875830128984607.post-6608115222748331537</id><published>2009-11-24T18:26:00.000-08:00</published><updated>2010-11-15T17:16:59.791-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="group"/><category scheme="http://www.blogger.com/atom/ns#" term="highest record"/><category scheme="http://www.blogger.com/atom/ns#" term="latest record"/><category scheme="http://www.blogger.com/atom/ns#" term="Oracle"/><category scheme="http://www.blogger.com/atom/ns#" term="rank"/><category scheme="http://www.blogger.com/atom/ns#" term="rank()"/><category scheme="http://www.blogger.com/atom/ns#" term="sort"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><category scheme="http://www.blogger.com/atom/ns#" term="tips"/><title type='text'>Picking up latest/highest record from a group using rank() function</title><content type='html'>Consider a example where we have Student, Subject and Mark information stored in different tables.&lt;br /&gt;&lt;br /&gt;If we need to retrieve the toppers in every subject for a given year through SQL, the usual way is to use a Subquery, sort the result descending and pick up the ROWNUM=1 record. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Instead of doing all that, Oracle&#39;s rank() function can help us to achieve the same in a simple way.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Table Structure:&lt;/b&gt;&lt;br /&gt;- STUDENT (ID, Name, Class)&lt;br /&gt;&lt;b&gt;- &lt;/b&gt;SUBJECT (ID, Name, Year)&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;- &lt;/b&gt;MARK (Subject_ID, Student_ID, Score)&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;SQL&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;pre class=&quot;codeHighlight&quot;&gt;&lt;code class=&quot;codeContent&quot;&gt; SELECT STUDENT.*, MARK.Mark, SUBJECT.Name  &lt;br /&gt; FROM STUDENT, SUBJECT,  &lt;br /&gt; (SELECT *, rank() OVER( partition by Subject_ID order by Score desc) rank FROM MARK )MARK  &lt;br /&gt; WHERE MARK.Student_ID=STUDENT.ID  &lt;br /&gt; AND MARK.Subject_ID=SUBJECT.ID  &lt;br /&gt; AND SUBJECT.Year=10  &lt;br /&gt; AND rank=1  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;In the above example, instead of joining MARK table directly, we use Oracle &lt;b&gt;rank()&lt;/b&gt; function to get the rank column also.&lt;br /&gt;&lt;br /&gt;Here we partition the table by Subject_Id, apply the descending order by Score and then rank the result. When we add the WHERE clause on &lt;b&gt;rank=1&lt;/b&gt; it would fetch the toppers in every Subject.&lt;br /&gt;&lt;br /&gt;This rank() function is also handy to get the latest record based on date from a given group.</content><link rel='replies' type='application/atom+xml' href='http://www.nvenky.in/feeds/6608115222748331537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.nvenky.in/2009/11/picking-up-latesthighest-record-from.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/6608115222748331537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/6608115222748331537'/><link rel='alternate' type='text/html' href='http://www.nvenky.in/2009/11/picking-up-latesthighest-record-from.html' title='Picking up latest/highest record from a group using rank() function'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08648834931491601830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9103875830128984607.post-2022832814450760388</id><published>2009-11-24T17:45:00.000-08:00</published><updated>2010-01-07T19:04:16.536-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Criteria"/><category scheme="http://www.blogger.com/atom/ns#" term="Criteria.addOrder test"/><category scheme="http://www.blogger.com/atom/ns#" term="getAll"/><category scheme="http://www.blogger.com/atom/ns#" term="Hibernate"/><category scheme="http://www.blogger.com/atom/ns#" term="Order.asc. Order"/><category scheme="http://www.blogger.com/atom/ns#" term="test"/><title type='text'>Testing Hibernate list() DAO method which fetches all records.</title><content type='html'>Consider the example where you have a static table &quot;VERSION&quot; and the DAO method that fetches all records from VERSION table through Hibernate.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;DAO Method:&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;pre  style=&quot;font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;&quot;&gt;&lt;code style=&quot;color:#000000;word-wrap:normal;&quot;&gt;   public List getAll() {  &lt;br /&gt;     Criteria crit = getSession().createCriteria(Version.class);  &lt;br /&gt;     crit.addOrder(Order.asc(&quot;name&quot;));  &lt;br /&gt;     return crit.list();  &lt;br /&gt;   }  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Poor Test case:&lt;/b&gt;&lt;br /&gt;Many occasions I have noticed Test cases that directly assert on the number of records being returned.&lt;br /&gt;&lt;pre  style=&quot;font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;&quot;&gt;&lt;code style=&quot;color:#000000;word-wrap:normal;&quot;&gt; public class VersionDaoImplTest extends AbstractTransactionalJUnit4SpringContextTests{  &lt;br /&gt;   @Autowired  &lt;br /&gt;   private VersionDao versionDao;  &lt;br /&gt;   @Test  &lt;br /&gt;   public void shouldReturnTheListOfVersions() {  &lt;br /&gt;     List versions = versionDao.getAll();  &lt;br /&gt;     assertEquals(5, versions.size());  &lt;br /&gt;   }  &lt;br /&gt; }  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;As seen above, this test case tries to assert Only 5 records are there in the Version Table. When a new record is added to this table, this test case would fail. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Proper test case:&lt;/b&gt;&lt;br /&gt;Other way of testing this method is given below.&lt;br /&gt;&lt;pre  style=&quot;font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;&quot;&gt;&lt;code style=&quot;color:#000000;word-wrap:normal;&quot;&gt; @Test  &lt;br /&gt;   public void shouldReturnTheListOfVersions() {    &lt;br /&gt;   List versions = ratingsDao.versionDao.getAll();  &lt;br /&gt;     assertNotNull(ratings);  &lt;br /&gt;     int prevSize = ratings.size();  &lt;br /&gt;     String insertSQL = &quot;Insert into VERSION (NAME,VERSION_NO) values (?,?)&quot;;  &lt;br /&gt;     this.simpleJdbcTemplate.update(insertSQL, &quot;TST+&quot;, 95);  &lt;br /&gt;     this.simpleJdbcTemplate.update(insertSQL, &quot;TST&quot;, 96);  &lt;br /&gt;     this.simpleJdbcTemplate.update(insertSQL, &quot;TST-&quot;, 97);  &lt;br /&gt;     versions = versionDao.getAll();  &lt;br /&gt;     assertEquals(prevSize + 3, ratings.size());  &lt;br /&gt;   }  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;In this test case, we get the number of records currently in the database. We then insert 3 new records into the table and try to assert whether the number of records being returned has increased by 3.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Testing Sort Order:&lt;/b&gt;&lt;br /&gt;Also to test the &lt;b&gt;Criteria.addOrder(Order.asc(&quot;name&quot;))&lt;/b&gt; you can enhance the test case with the following:&lt;br /&gt;&lt;pre  style=&quot;font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;&quot;&gt;&lt;code style=&quot;color:#000000;word-wrap:normal;&quot;&gt; for (int i = 1; i &amp;lt; versions.size(); i++) {  &lt;br /&gt;       assertTrue(versions.get(i - 1).getName().compareTo(versions.get(i).getName()) &amp;lt; 0);  &lt;br /&gt; }  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;This would assert that records are sorted by the NAME.</content><link rel='replies' type='application/atom+xml' href='http://www.nvenky.in/feeds/2022832814450760388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.nvenky.in/2009/11/testing-dao-method-that-fetches-all.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/2022832814450760388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/2022832814450760388'/><link rel='alternate' type='text/html' href='http://www.nvenky.in/2009/11/testing-dao-method-that-fetches-all.html' title='Testing Hibernate list() DAO method which fetches all records.'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08648834931491601830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9103875830128984607.post-6769650957865613644</id><published>2009-10-05T11:00:00.000-07:00</published><updated>2010-11-15T17:21:01.389-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Collection data"/><category scheme="http://www.blogger.com/atom/ns#" term="dynamic list"/><category scheme="http://www.blogger.com/atom/ns#" term="LazyList"/><category scheme="http://www.blogger.com/atom/ns#" term="List Data"/><category scheme="http://www.blogger.com/atom/ns#" term="List validation"/><category scheme="http://www.blogger.com/atom/ns#" term="Spring MVC"/><category scheme="http://www.blogger.com/atom/ns#" term="Validation"/><category scheme="http://www.blogger.com/atom/ns#" term="Validator"/><title type='text'>Spring MVC - Dynamic list binding and validating the input data</title><content type='html'>&lt;style&gt;pre{ background-color:#DDDDFF; overflow:auto; } &lt;/style&gt;&lt;br /&gt;It took quiet some time to figure out how to display a dynamic list of data on screen and get user input information back. We also had to perform validation on this dynamic list input data and display error message on the corresponding row. &amp;nbsp; &lt;br /&gt;Here is the simple example to achieve the above requirement.&lt;br /&gt;&lt;br /&gt;Consider that you need to display Parent and list of child information on a screen and get the Age and Sex information of each child. Also you need to show error message on the screen if the user has not entered the age or sex information.&lt;br /&gt;&lt;h3&gt;1) Form bean&lt;/h3&gt;&lt;pre class=&quot;codeHighlight&quot;&gt;&lt;code class=&quot;codeContent&quot;&gt;public class MotherFormBean{  &lt;br /&gt;   private String name;  &lt;br /&gt;   private List&amp;lt;Child&amp;gt; children;  &lt;br /&gt;   public MotherFormBean() {  &lt;br /&gt;     children= LazyList.decorate(new ArrayList(),  &lt;br /&gt;       FactoryUtils.instantiateFactory(Child.class));  &lt;br /&gt;   }  &lt;br /&gt; }  &lt;br /&gt; public class Child{  &lt;br /&gt;   private String name;  &lt;br /&gt;   private String age;  &lt;br /&gt;   private String sex;  &lt;br /&gt; }  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Instead of initializing the List&lt;child&gt; as normal ArrayList, use the LazyList class (Commons-collection package). This is to avoid &quot;&lt;b&gt;IndexOutOfBoundException&lt;/b&gt;&quot; when the data is submitted back to the controller.&lt;br /&gt;&lt;/child&gt;&lt;br /&gt;&lt;h3&gt;2) JSP&lt;/h3&gt;&lt;pre class=&quot;codeHighlight&quot;&gt;&lt;code class=&quot;codeContent&quot;&gt;&amp;lt;form:form action=&quot;${formAction}&quot; name=&quot;childrenDetails&quot;&amp;gt;  &lt;br /&gt; &amp;lt;table&amp;gt;&amp;lt;thead&amp;gt;  &lt;br /&gt;  &amp;lt;tr&amp;gt;  &lt;br /&gt;   &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Name&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;  &lt;br /&gt;   &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Sex&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;  &lt;br /&gt;   &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Age&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;  &lt;br /&gt;  &amp;lt;/tr&amp;gt;  &lt;br /&gt;  &amp;lt;/thead&amp;gt;   &lt;br /&gt;  &amp;lt;tbody&amp;gt;   &lt;br /&gt;   &amp;lt;c:foreach items=&quot;${command.children}&quot; var=&quot;child&quot; varStatus=&quot;loop&quot;&amp;gt;   &lt;br /&gt;    &amp;lt;tr&amp;gt;   &lt;br /&gt;     &amp;lt;td&amp;gt;&amp;lt;c:out value=&quot;${child.name}&quot;&amp;gt;&amp;lt;/c:out&amp;gt;  &lt;br /&gt;       &amp;lt;form:hidden path=&quot;children[${loop.index}].name&quot;/&amp;gt;   &lt;br /&gt;     &amp;lt;/td&amp;gt;  &lt;br /&gt;     &amp;lt;td&amp;gt;&amp;lt;form:select path=&quot;children[${loop.index}].sex&quot;&amp;gt;  &lt;br /&gt;        &amp;lt;option value=&quot;&quot;&amp;gt;--Please Select--&amp;lt;/option&amp;gt;  &lt;br /&gt;        &amp;lt;option value=&quot;M&quot;&amp;gt;Male&amp;lt;/option&amp;gt;  &lt;br /&gt;        &amp;lt;option value=&quot;F&quot;&amp;gt;Female&amp;lt;/option&amp;gt;   &lt;br /&gt;       &amp;lt;/form:select&amp;gt;  &lt;br /&gt;     &amp;lt;/td&amp;gt;  &lt;br /&gt;     &amp;lt;td&amp;gt;&amp;lt;form:input path=&quot;children[${loop.index}].age&quot;/&amp;gt;&amp;lt;/td&amp;gt;   &lt;br /&gt;    &amp;lt;/tr&amp;gt;  &lt;br /&gt;   &amp;lt;/c:foreach&amp;gt;   &lt;br /&gt;  &amp;lt;/tbody&amp;gt;   &lt;br /&gt;  &amp;lt;/table&amp;gt;  &lt;br /&gt; &amp;lt;/form:form&amp;gt;  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;This code will print all the children names and show input fields for Age and Sex field.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3) Validator Class&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;When the List data is submitted back, Spring constructs the data back to the Form bean with help of the LazyList collection. Validation and raising error on these fields is very simple.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;codeHighlight&quot;&gt;&lt;code class=&quot;codeContent&quot;&gt; public class MotherBeanValidator implements org.springframework.validation.Validator {  &lt;br /&gt; .......   &lt;br /&gt;   public void validate(Object target, Errors errors) {  &lt;br /&gt;     MotherFormBean bean = (MotherFormBean) target;  &lt;br /&gt;     List&amp;lt;Child&amp;gt; children = bean.getChildren();  &lt;br /&gt;     for (int i = 0; i &amp;lt; children.size(); i++) {  &lt;br /&gt;       if (StringUtils.isEmpty(children.get(i).getSex()))   &lt;br /&gt;        errors.rejectValue(&quot;children[&quot; + i + &quot;].sex&quot;, &quot;select.sex&quot;);  &lt;br /&gt;       if (StringUtils.isEmpty(children.get(i).getAge()))   &lt;br /&gt;        errors.rejectValue(&quot;children[&quot; + i + &quot;].age&quot;, &quot;select.age&quot;);  &lt;br /&gt;     }  &lt;br /&gt;   }  &lt;br /&gt; }  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;JSP Changes:&lt;br /&gt;Include &lt;b&gt;&amp;lt;form:errors&amp;gt;&lt;/b&gt; tag after the sex and age input fields.&lt;br /&gt;eg.) &lt;br /&gt;&lt;pre class=&quot;codeHighlight&quot;&gt;&lt;code class=&quot;codeContent&quot;&gt; &amp;lt;form:errors path=&quot;children[${loop.index}].sex&quot;/&amp;gt;   &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Hope this helps you in displaying the Collection data using Spring MVC and validating it. &lt;br /&gt;&lt;br /&gt;Thanks to &lt;a href=&quot;http://mattfleming.com/node/134&quot;&gt;Matt Flemings&lt;/a&gt; blog for shedding some light on the LazyList.</content><link rel='replies' type='application/atom+xml' href='http://www.nvenky.in/feeds/6769650957865613644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.nvenky.in/2009/10/spring-displaying-dynamic-list-and.html#comment-form' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/6769650957865613644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/6769650957865613644'/><link rel='alternate' type='text/html' href='http://www.nvenky.in/2009/10/spring-displaying-dynamic-list-and.html' title='Spring MVC - Dynamic list binding and validating the input data'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08648834931491601830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9103875830128984607.post-3249936616316995364</id><published>2009-09-13T07:26:00.000-07:00</published><updated>2009-09-13T07:35:49.117-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="2009"/><category scheme="http://www.blogger.com/atom/ns#" term="china"/><category scheme="http://www.blogger.com/atom/ns#" term="contestants"/><category scheme="http://www.blogger.com/atom/ns#" term="experience"/><category scheme="http://www.blogger.com/atom/ns#" term="Google"/><category scheme="http://www.blogger.com/atom/ns#" term="Google code jam"/><category scheme="http://www.blogger.com/atom/ns#" term="Google code jam 2009"/><category scheme="http://www.blogger.com/atom/ns#" term="india"/><category scheme="http://www.blogger.com/atom/ns#" term="statistics"/><title type='text'>Google Code Jam 2009 experience</title><content type='html'>&amp;nbsp;&amp;nbsp; I participated in &lt;a href=&quot;http://code.google.com/codejam/contest/&quot;&gt;Google code Jam 2009&lt;/a&gt; and tried to solve such problems for the first time in my life. As expected I could go only till Round 1 but it has been a great experience to participate in this event.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; It was amazing to see people solving the problems within few minutes which I had no idea where and how to start. I was particularly impressed by &quot;ACRush&quot; (Winner of Google Code Jam 2008) - before I could even understand the &lt;a href=&quot;http://code.google.com/codejam/contest/dashboard?c=186264#s=p1&quot;&gt;&quot;The next number&quot;&lt;/a&gt; problem in Round 1B he submitted the solution for it in 6 mins.&amp;nbsp; Google has again amazed me by providing such a platform for people to compete. The best part of it was making the solution submitted by all users available for download once the competition is over. &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; Having considerable professional experience in IT, I was hoping to fair better. But while attending the contest I felt that it had its own deterring factors. I was trying to visualize everything as Java objects and wasting time in modularizing code and naming it properly. Also having no exposure to such problems took its toll while racing against time. When I looked at the solutions from other users, most of them have used multi-dimensional arrays to solve the problems. Apart from my college days, I had almost never used multi-dimensional arrays in any of the professional projects. &quot;Complex business logic&quot; would typically involve complex queries and triggering different actions when an event occurs. We don&#39;t write algorithms or solve problems like these in a typical web application. Also maintaining state in multi-dimensional arrays is more prone to defect which would explain my lack of exposure to it.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; Another interesting thing about Google Code Jam is the competition statistics - by Country and Programming language. I was surprised to find that only 1220 contestants from India competed in the qualifiers second to China which had 1324 contestants. But in round one, only 6 from India had the &quot;Perfect Score&quot;. I assume most of the university students are not aware of this competition. Google should promote this event better as it is a great platform for students to compete against the world&#39;s top coders.&lt;br /&gt;Programming language: Java - 499 people but C++ - 1200 people. C++ has comfortably outnumbered Java as the preferred programming language in the code jam competition. Not happy to see this as a java developer :) &amp;nbsp; &lt;br /&gt;&lt;br /&gt;I would never miss Google Code Jam competition again. I hope that I would fair better in 2010 competition. Congratulations to all the participants of the code jam and thanks to Google for providing this opportunity. Keep going.</content><link rel='replies' type='application/atom+xml' href='http://www.nvenky.in/feeds/3249936616316995364/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.nvenky.in/2009/09/code-jam-experience.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/3249936616316995364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/3249936616316995364'/><link rel='alternate' type='text/html' href='http://www.nvenky.in/2009/09/code-jam-experience.html' title='Google Code Jam 2009 experience'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08648834931491601830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9103875830128984607.post-5513161610572220906</id><published>2009-08-26T12:51:00.000-07:00</published><updated>2009-08-26T12:51:24.019-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Consultant"/><category scheme="http://www.blogger.com/atom/ns#" term="quickly"/><category scheme="http://www.blogger.com/atom/ns#" term="technology"/><category scheme="http://www.blogger.com/atom/ns#" term="ThoughtWorks"/><category scheme="http://www.blogger.com/atom/ns#" term="tools"/><title type='text'>Consultant - &quot;Doing things quickly&quot; - Not really</title><content type='html'>I was working as a consultant&amp;nbsp;from an Indian IT company&amp;nbsp;at a client location in Melbourne for almost three years. It was an exiting place to work as I was given opportunity try out new technologies for the project.&lt;br /&gt;&lt;br /&gt;As a consultant, I had the following perspective on my role and&amp;nbsp;obliged with it:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I had to &lt;b&gt;quickly &lt;/b&gt;learn the tools and technologies used at my client place (like., Weblogic Portal, Spring, IBatis, Clearcase, etc)&amp;nbsp;&lt;/li&gt;&lt;li&gt;I had to do my job &lt;b&gt;quickly &lt;/b&gt;to add value to my customer.&lt;/li&gt;&lt;li&gt;I had to understand the project functionalities &lt;b&gt;quickly&lt;/b&gt;.&lt;/li&gt;&lt;li&gt;I had to adapt to new technologies &lt;b&gt;quickly &lt;/b&gt;and start contributing.&lt;/li&gt;&lt;/ul&gt;But only when my clients hired three consultants from &lt;b&gt;ThoughtWorks&lt;/b&gt;, I realized how little was my value add to the customer apart from my &quot;doing things quickly&quot;.&lt;br /&gt;&lt;br /&gt;I had gravely missed to think on these lines as a consultant...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. Are we using the right tools? &amp;nbsp;Are there better tools out there?&lt;/b&gt;&amp;nbsp;Clearcase&amp;nbsp;version control&amp;nbsp;- it is being used at my client place for more than 5 years.&amp;nbsp;After the initial&amp;nbsp;hiccups, I got used to it and tried to solve our problems within the tools limits. I never had a clue that this could be challenged. But TW, proposed Subversion as an alternate for development environment and integrated with&amp;nbsp;Subversion to&amp;nbsp;Clearcase behind the scene. Introduction of this SVN to the Test driven development environment is claimed to have helped the developers is refactoring the code at ease.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Are we using the right technology? Can it be done in a simple way with other technology?&lt;/b&gt;&lt;br /&gt;Weblogic Portal was traditionally used at my client place for more than five years. It is a good technology to work on if you are familiar with it. It had so many features and good IDE to develop things.&lt;br /&gt;But we had a big learning curve with Weblogic portal in our first project and it has always been difficult for new developers coming into project. Few developers tried proposing alternate technologies but was not able to convince everyone.&lt;br /&gt;Again TW consultants, annoyed with the time taken to learn,build and deploy portal applications, proposed Spring MVC as the alternate technology. But this time they presented it with a case study comparing the effort &amp;nbsp;involved in developing a functionality in Weblogic portal and Spring MVC. As it directly translated to $$$ terms, it caught the attention of everyone and Spring MVC was inducted into clients technology stack.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. Are we up-to-date with technology?&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;Being up-to-date with technology not only helps in doing things in a smarter way but also leads to doing things quicker. I am still wondering how few people are so familiar with the latest open source technologies. For example, which tool will you use for XML processing? &lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Do not choose the opensource library just because you have used it earlier.&lt;/li&gt;&lt;li&gt;Look out for better opensource libraries which will help you to achieve the result in a smart way.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Be up-to-date about the new libraries.&lt;/li&gt;&lt;/ul&gt;I never imagined that a technology like &quot;Weblogic Portal&quot; which was considered as the standard for all applications could be replaced. I never thought a tool like &quot;Clearcase&quot; which is being used for 5 years can have an alternate.The lesson I learnt from this experience is&amp;nbsp;&lt;b&gt;&quot;Never take anything for granted&quot;.&lt;/b&gt;&amp;nbsp;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I always thought that I had to learn the technologies used by the client but I have now realized that it is also my duty to identify what is right for the client.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.nvenky.in/feeds/5513161610572220906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.nvenky.in/2009/08/consultant-doing-things-quickly-not.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/5513161610572220906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9103875830128984607/posts/default/5513161610572220906'/><link rel='alternate' type='text/html' href='http://www.nvenky.in/2009/08/consultant-doing-things-quickly-not.html' title='Consultant - &quot;Doing things quickly&quot; - Not really'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/08648834931491601830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry></feed>