<?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-7818882524515880477</id><updated>2024-09-07T21:56:40.379+01:00</updated><category term="Product Reviews"/><category term="C#"/><category term="Management"/><category term="People"/><category term=".Net"/><category term="Personal"/><category term="Silverlight"/><category term="VB"/><category term="Cloud Computing"/><category term="SQL Server"/><category term="Security"/><category term="TeamCity"/><category term="Use of Technology"/><category term="VBlogs (discontinued)"/><category term="ASP.Net"/><category term="Azure"/><category term="Continuous Integration"/><category term="Current Afffairs"/><category term="Dell"/><category term="MEF"/><category term="MVVM"/><category term="NAnt"/><category term="Open Source Projects"/><category term="Prism"/><category term="Running"/><category term="Screwfix"/><category term="Unit Testing"/><category term="Wago"/><title type='text'>Rachel Pierson, Work In Progress</title><subtitle type='html'>A blog about software development in general, and .Net in particular.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rachelpierson.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>27</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7818882524515880477.post-3998111180042871853</id><published>2019-02-26T15:22:00.000+00:00</published><updated>2019-02-26T23:10:21.233+00:00</updated><title type='text'>Carpe Diem</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
It was a beautiful Spring morning today. So I decided to take a walk in Cambusnethan Cemetery. It&#39;s a very quiet, peaceful place where you can get a lot of thinking done. I hope you enjoy these photos as much as I enjoyed taking them.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOfpH1qMbhfKo0N7VCxWl-xR5idh7MJiBv9csypiZ3mXZdPQX_fsotAlKJr4OmppqbVXUgFou6hmsPmVyqIuXdX7QkKvjVBM1kmYCMBGBU1zKOHEGeZXJfXakk_5YryHEp8FSjGHpswkSq/s1600/20190226_120329.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOfpH1qMbhfKo0N7VCxWl-xR5idh7MJiBv9csypiZ3mXZdPQX_fsotAlKJr4OmppqbVXUgFou6hmsPmVyqIuXdX7QkKvjVBM1kmYCMBGBU1zKOHEGeZXJfXakk_5YryHEp8FSjGHpswkSq/s640/20190226_120329.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEif8d7kXP5wJkFcNPrfUyFid9Xyj5ocEWAxckZtAgpyOk9_BApCqwzewjFC2yBNYVvQ1HUMJqIuNeALjSXkoyxmcccbojp7kcKZImTggjxyDmaOJjxznfTVpAtZYN_t-HNlpYbfrZrsDFG5/s1600/20190226_120459.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEif8d7kXP5wJkFcNPrfUyFid9Xyj5ocEWAxckZtAgpyOk9_BApCqwzewjFC2yBNYVvQ1HUMJqIuNeALjSXkoyxmcccbojp7kcKZImTggjxyDmaOJjxznfTVpAtZYN_t-HNlpYbfrZrsDFG5/s640/20190226_120459.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh3gVqBtJUZS24ELEmfyF49o8FhxWetPbTX64uJ9UPM5lDis6QXXJtL0RNNAAQdUV0EKYK78Nn3Fqu02kltEDvML0Jq7bu4gTEuiz64LjuKWFMXs7a1vRyS2iHzWtuv8UfcOsaLKoF7IUE/s1600/20190226_120717.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh3gVqBtJUZS24ELEmfyF49o8FhxWetPbTX64uJ9UPM5lDis6QXXJtL0RNNAAQdUV0EKYK78Nn3Fqu02kltEDvML0Jq7bu4gTEuiz64LjuKWFMXs7a1vRyS2iHzWtuv8UfcOsaLKoF7IUE/s640/20190226_120717.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvjV69FbGlsmMMqzHwkddRL1NK35g3JjzwIWzqWbCJNqxESI4ktmjc0gqQfqJr7PSLC2XsOKs5Z18_XU6TtMg-YaVFIQl25F_nxYqnzd8iX2nWGG2ytln7gLQrnMQJbxku5rfCPE-ZTg1P/s1600/20190226_120801.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvjV69FbGlsmMMqzHwkddRL1NK35g3JjzwIWzqWbCJNqxESI4ktmjc0gqQfqJr7PSLC2XsOKs5Z18_XU6TtMg-YaVFIQl25F_nxYqnzd8iX2nWGG2ytln7gLQrnMQJbxku5rfCPE-ZTg1P/s640/20190226_120801.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6nc3gTdgSsb6t-13I-cM9OSANxbEstiEIYzSkEw38E1g4Yy22iEcCtR0sfB1WzV3KFnKo336sT9pqz10VZ86kCUvrMQn20LV9-wy7BDWZy7NiACrQWQMwCZuTNJQkoktoSr7Mxo_-7opb/s1600/20190226_120811.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6nc3gTdgSsb6t-13I-cM9OSANxbEstiEIYzSkEw38E1g4Yy22iEcCtR0sfB1WzV3KFnKo336sT9pqz10VZ86kCUvrMQn20LV9-wy7BDWZy7NiACrQWQMwCZuTNJQkoktoSr7Mxo_-7opb/s640/20190226_120811.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFahvQsbxBQin9P93H2WIjDb8mnsf6AlXGHkTYZlbkXdL5N4j_6-0zGBjFXPTGZdI_Z20bQfWIr1PPld5X-6tl9lXJAKiSSW0cc846WhE1kRK9lmkz-S9WHRahUfBFM6nJ9c8B4n3HcYzK/s1600/20190226_121127.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFahvQsbxBQin9P93H2WIjDb8mnsf6AlXGHkTYZlbkXdL5N4j_6-0zGBjFXPTGZdI_Z20bQfWIr1PPld5X-6tl9lXJAKiSSW0cc846WhE1kRK9lmkz-S9WHRahUfBFM6nJ9c8B4n3HcYzK/s640/20190226_121127.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC57Fc6iAu7aHh_vt9V9VD18aWve7ia7pvLO0kBSE7IgZ6876w0uQfJGbSKLLzofzD4eDgnY01MUX_BZz2TRbMgKjEvN7ugq3yxQrxlMNwpaTdoX6vwdXxHOBsynrznhUy8du4RcfopOZY/s1600/20190226_121356.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC57Fc6iAu7aHh_vt9V9VD18aWve7ia7pvLO0kBSE7IgZ6876w0uQfJGbSKLLzofzD4eDgnY01MUX_BZz2TRbMgKjEvN7ugq3yxQrxlMNwpaTdoX6vwdXxHOBsynrznhUy8du4RcfopOZY/s640/20190226_121356.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuorQBGxTCKu-XIDWhbLbexvVq-qHtMwxQzd95rJpbbQgcP7fNlXAIntvXUAK2ij7Ik7LU1teh52ZriHgm1pHRh0h48iQmT0jgaHw6TOBUxjqDTfpVUoemZTRoCrhQY_8sK4rjIKMl_R-A/s1600/20190226_121413.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuorQBGxTCKu-XIDWhbLbexvVq-qHtMwxQzd95rJpbbQgcP7fNlXAIntvXUAK2ij7Ik7LU1teh52ZriHgm1pHRh0h48iQmT0jgaHw6TOBUxjqDTfpVUoemZTRoCrhQY_8sK4rjIKMl_R-A/s640/20190226_121413.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZKbnuF1YDf-G7YGkVtMV9HgkQ-vzx271eSvZ3qAjI0v5is0Y_L7J1QI_Xg9Ac1yOMWyidu2iddSIWVjb-3WjX0_non2EolQEIWDJG5G723ABswWruX6FCrI1gCWwW7DbAn3aW9PKpbiWe/s1600/20190226_121522.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1600&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZKbnuF1YDf-G7YGkVtMV9HgkQ-vzx271eSvZ3qAjI0v5is0Y_L7J1QI_Xg9Ac1yOMWyidu2iddSIWVjb-3WjX0_non2EolQEIWDJG5G723ABswWruX6FCrI1gCWwW7DbAn3aW9PKpbiWe/s640/20190226_121522.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTiU21aGt-8VsNveRpuNIc29azGM9kjMAIrhZUKeeYA-PhXz-kCZf2LSwq4FiCBmPFeW3Aks18ZqkPKXS38CYzEoexOeYZHEMA4y2ZA5AocxQxJUK7xt7EGYczPfxMNvIh8jJCRyW9XB7-/s1600/20190226_121537.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1600&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTiU21aGt-8VsNveRpuNIc29azGM9kjMAIrhZUKeeYA-PhXz-kCZf2LSwq4FiCBmPFeW3Aks18ZqkPKXS38CYzEoexOeYZHEMA4y2ZA5AocxQxJUK7xt7EGYczPfxMNvIh8jJCRyW9XB7-/s640/20190226_121537.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgYtXg5dgwDPuHaIc-q2J83sj8CS_MXyAm3X9iNULE94KrQ9OoHDm0eiFTAPZ0Gp-IxnJ19dcGEnWvOVkiq-Lkc6hX_tVMQnBlRjaZA1C9JVZP-tMkHZpOZESLKrcQFn0Dc2_MgRKE_30T/s1600/20190226_121557.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1600&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgYtXg5dgwDPuHaIc-q2J83sj8CS_MXyAm3X9iNULE94KrQ9OoHDm0eiFTAPZ0Gp-IxnJ19dcGEnWvOVkiq-Lkc6hX_tVMQnBlRjaZA1C9JVZP-tMkHZpOZESLKrcQFn0Dc2_MgRKE_30T/s640/20190226_121557.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVkYyxuoxo2g3iijKtiy5EZqMNFTA6UhFtf7150_jGS276zNNBEVHqjAqrxhbriJlas3rYWvFPaTPuaILqLWJlKY_ikG8IWioAlcyLAZu1jB9Ww97c4xRjC6zeu3BGZrO681ALVnkpHgD4/s1600/20190226_121617.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVkYyxuoxo2g3iijKtiy5EZqMNFTA6UhFtf7150_jGS276zNNBEVHqjAqrxhbriJlas3rYWvFPaTPuaILqLWJlKY_ikG8IWioAlcyLAZu1jB9Ww97c4xRjC6zeu3BGZrO681ALVnkpHgD4/s640/20190226_121617.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1raL-xVbQVBlLvg62Fyu347hpywdtR7UcqEG_wKiXzm4GK_GjapeqgnHsz2XMUWvHaPIoWQ9A9AqWgE9SORrFy22GAPEfOs8a2qkktt_cth9edUDfYE9O-Kwt1bZPlOcGeHE3aSyRa3d2/s1600/20190226_121715.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1raL-xVbQVBlLvg62Fyu347hpywdtR7UcqEG_wKiXzm4GK_GjapeqgnHsz2XMUWvHaPIoWQ9A9AqWgE9SORrFy22GAPEfOs8a2qkktt_cth9edUDfYE9O-Kwt1bZPlOcGeHE3aSyRa3d2/s640/20190226_121715.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgi7NQbgpQJKtyDCq6eCb7NBC6HrDYxGX51Zj63lc7_1kkFImjCH4QdByu873NDcMAf4HUy1v8SfbT59rNATWDNARatd-JsPe6dfSzjmO1tnLNakN13zSZtm27iMiMqWQDzVqsoENybTPa3/s1600/20190226_121744.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgi7NQbgpQJKtyDCq6eCb7NBC6HrDYxGX51Zj63lc7_1kkFImjCH4QdByu873NDcMAf4HUy1v8SfbT59rNATWDNARatd-JsPe6dfSzjmO1tnLNakN13zSZtm27iMiMqWQDzVqsoENybTPa3/s640/20190226_121744.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiCEO7p9kAyEWDMEIgV5012ABdqY0-UwVZCqXLcvx75A2kVAv7PCnMUd2aZU6cXhOKSM_gFGBDqqoKxXgo-cXqNqMBUt-wNN8CbMwy2sgVbcgBUiF8p0pLrUfXuPxvcpUL8zxtEtP_CFlV/s1600/20190226_121805.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiCEO7p9kAyEWDMEIgV5012ABdqY0-UwVZCqXLcvx75A2kVAv7PCnMUd2aZU6cXhOKSM_gFGBDqqoKxXgo-cXqNqMBUt-wNN8CbMwy2sgVbcgBUiF8p0pLrUfXuPxvcpUL8zxtEtP_CFlV/s640/20190226_121805.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE1ZsZtGShuA0GvRFGLeWlqp7Xh5-3UN5AorjAwWL93SgSzOIlmXJ0aYDCqXWaU1kbOAt0nzskMm7Zp6yF2Z9wCOxKcNcNViQ4mFLdnqUGf0lGJEyXZaIp5Eg9MEe1yIL5sBE0fifYScMm/s1600/20190226_121959.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE1ZsZtGShuA0GvRFGLeWlqp7Xh5-3UN5AorjAwWL93SgSzOIlmXJ0aYDCqXWaU1kbOAt0nzskMm7Zp6yF2Z9wCOxKcNcNViQ4mFLdnqUGf0lGJEyXZaIp5Eg9MEe1yIL5sBE0fifYScMm/s640/20190226_121959.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIbQbmVLUwKh0da6DsW7cLFRhxKgCTbfT96zmuu1XNSRXgWP_womZDGxPC-2UQVjkT0F0Mo0fu-S6jDHI4qv-50Yx30uI_6VEecbVofHzl9w41S00lwy494ZjJ2GoV9qmG0KdlTvH9ddpk/s1600/20190226_122021.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIbQbmVLUwKh0da6DsW7cLFRhxKgCTbfT96zmuu1XNSRXgWP_womZDGxPC-2UQVjkT0F0Mo0fu-S6jDHI4qv-50Yx30uI_6VEecbVofHzl9w41S00lwy494ZjJ2GoV9qmG0KdlTvH9ddpk/s640/20190226_122021.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh25dZUfSusXw6gRx1lO4nqxteZ_GS7MfK8Y1NrlDQz5M_5QiszYl80UUupibm6vyvdCozeHuWrcTn3i5yKtMvPlnPdkXjtP5tzgmee_rWoaROX-tLwwzYMpqFa9Z5Eag3K1Ige-hoCK7LF/s1600/20190226_122030.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh25dZUfSusXw6gRx1lO4nqxteZ_GS7MfK8Y1NrlDQz5M_5QiszYl80UUupibm6vyvdCozeHuWrcTn3i5yKtMvPlnPdkXjtP5tzgmee_rWoaROX-tLwwzYMpqFa9Z5Eag3K1Ige-hoCK7LF/s640/20190226_122030.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIAf2spYMlWoE7u8PnoGenaYXh4Hpe1ZqYjxpypAHv74VKNriSyh-vDDZvuUSsO60t4xKIycCuiF9DvsLGdiQrwLi2C4-BJubvP_w-vyGX5RjHJ0jOsDTHFJv-XH1YU37-Ekozf2Ir4Qoh/s1600/20190226_122200.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIAf2spYMlWoE7u8PnoGenaYXh4Hpe1ZqYjxpypAHv74VKNriSyh-vDDZvuUSsO60t4xKIycCuiF9DvsLGdiQrwLi2C4-BJubvP_w-vyGX5RjHJ0jOsDTHFJv-XH1YU37-Ekozf2Ir4Qoh/s640/20190226_122200.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn9N5JDouJOFsdUmhSNkGrs068fIXShEBZ3aR9GaoOpK1m7_6kezjFn28rVg_hsKo0OiemoK4sxDcmLpkPrsI6AVu_AE9LId7KpjbYCN930E-N8e3M8ActNp6j1i01eXXVf27aezSYZz53/s1600/20190226_122215.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn9N5JDouJOFsdUmhSNkGrs068fIXShEBZ3aR9GaoOpK1m7_6kezjFn28rVg_hsKo0OiemoK4sxDcmLpkPrsI6AVu_AE9LId7KpjbYCN930E-N8e3M8ActNp6j1i01eXXVf27aezSYZz53/s640/20190226_122215.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3JBKDK3UsNeY-b1NXLSzEkA7WYyCidxKnIO1rWyQ0-qgqh4kM3skzmLUdJDL6Kw7Xk9cXydElK5TXbH_vmCVlKtDmYZdzbgaau4CP8EBE4k1ZA9hQU5aLRvAMjF8DDmaUtiMBc2UKigMF/s1600/20190226_122801.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3JBKDK3UsNeY-b1NXLSzEkA7WYyCidxKnIO1rWyQ0-qgqh4kM3skzmLUdJDL6Kw7Xk9cXydElK5TXbH_vmCVlKtDmYZdzbgaau4CP8EBE4k1ZA9hQU5aLRvAMjF8DDmaUtiMBc2UKigMF/s640/20190226_122801.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqtyfMJYQ8X5sxSlsCY13jJcVOEOSMIARTS62lZq8WmSWefMmC7o3enfthIsiMmqSWNyQVnLLKg71XzL-qA48wK2Zk80F2UdE0c4Cmn6l5-BMp0OgDiZfGnq0AZu9mS883UEcR6pRvUKZh/s1600/20190226_122818.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqtyfMJYQ8X5sxSlsCY13jJcVOEOSMIARTS62lZq8WmSWefMmC7o3enfthIsiMmqSWNyQVnLLKg71XzL-qA48wK2Zk80F2UdE0c4Cmn6l5-BMp0OgDiZfGnq0AZu9mS883UEcR6pRvUKZh/s640/20190226_122818.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjaIlPZnO9WrHwX7ZgDdD4arF8M95cftYMwMsKr0xWj1jaX7biYKGvhQrDu7zdG5M3_wgnwsIEIihoGUq6u1eGjqau9rGFGD0iVoYW55l9Jh73-eVq32nWmTGUQ3dBu0Ho75OkHVz8HeD8/s1600/20190226_122949.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjaIlPZnO9WrHwX7ZgDdD4arF8M95cftYMwMsKr0xWj1jaX7biYKGvhQrDu7zdG5M3_wgnwsIEIihoGUq6u1eGjqau9rGFGD0iVoYW55l9Jh73-eVq32nWmTGUQ3dBu0Ho75OkHVz8HeD8/s640/20190226_122949.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ0iUGgKwmswiFDa_HzsvaM0o-0Pwrjx-hZVC8m753dFRjV6k7dIW3VSNHDMCJzoCb_MkHf-gx-8upVaXgiXngouPrR0POoSOib55olN9__nTUjf8L-tuATwmn-5zBsaqgx93Ur9d8Xpj8/s1600/20190226_122958.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ0iUGgKwmswiFDa_HzsvaM0o-0Pwrjx-hZVC8m753dFRjV6k7dIW3VSNHDMCJzoCb_MkHf-gx-8upVaXgiXngouPrR0POoSOib55olN9__nTUjf8L-tuATwmn-5zBsaqgx93Ur9d8Xpj8/s640/20190226_122958.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgk9fejh0iEolBiwYHRchCFO-IDBHlGR5S4G67EecH2r9l2hFUrDswCi9qEF8_Vk_BVFfEb-4en71cyz7b1rTfr5Xzh-ND2qhRFEMJE-nlL-IbPZ-Ya-NDMNVfNzKab7cH-xMZwyJRSx90t/s1600/20190226_123147.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1600&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgk9fejh0iEolBiwYHRchCFO-IDBHlGR5S4G67EecH2r9l2hFUrDswCi9qEF8_Vk_BVFfEb-4en71cyz7b1rTfr5Xzh-ND2qhRFEMJE-nlL-IbPZ-Ya-NDMNVfNzKab7cH-xMZwyJRSx90t/s640/20190226_123147.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQJn0PLDOx5fqvllNJKIIcnHO_FVhqnAnlzz1xq6gvtmPy_qBtFRS8zQkHSFtbDhaD8SBhlEAetMBfL8UlOEVBbbmms7lGFfI3iEVe3UFHC4SAhnBPeATtju7MdrQ2CAJpm8aYCgSaqC_m/s1600/20190226_123210.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1600&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQJn0PLDOx5fqvllNJKIIcnHO_FVhqnAnlzz1xq6gvtmPy_qBtFRS8zQkHSFtbDhaD8SBhlEAetMBfL8UlOEVBbbmms7lGFfI3iEVe3UFHC4SAhnBPeATtju7MdrQ2CAJpm8aYCgSaqC_m/s640/20190226_123210.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjbwDfc8qwt65ORSyvimcYOA3MgQzsSQuvbQtQXK7d0nI0JzoSHyLp1VV2i8UE1sxu-8IhhpkV8Gsoa-bx2h1KMRk0HfJRkjz_2JScM3Ahu3n5io6zu4l48i9-SzulHJBDUqf5sfIBoYb5/s1600/20190226_123230.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjbwDfc8qwt65ORSyvimcYOA3MgQzsSQuvbQtQXK7d0nI0JzoSHyLp1VV2i8UE1sxu-8IhhpkV8Gsoa-bx2h1KMRk0HfJRkjz_2JScM3Ahu3n5io6zu4l48i9-SzulHJBDUqf5sfIBoYb5/s640/20190226_123230.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-vucwBIuYjsGeHkrk6ZiN-0tKXRHXB1QicjkHSP5lI-ISOEdjpqxEO5cbrOMDlNMMEOrPzIo7vGAV1NedC46oFB_FavosUYJKm_wfI7MM33_fmtX9VZ8Nto7tzZ72Vbpn_ZttOZwqp0_2/s1600/20190226_123242.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-vucwBIuYjsGeHkrk6ZiN-0tKXRHXB1QicjkHSP5lI-ISOEdjpqxEO5cbrOMDlNMMEOrPzIo7vGAV1NedC46oFB_FavosUYJKm_wfI7MM33_fmtX9VZ8Nto7tzZ72Vbpn_ZttOZwqp0_2/s640/20190226_123242.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSv8H7n7S4Nrnq69_heog3jvt7_-oZYkKyBFuEgG8tN2U9hxda2esZYCVogz2DkzUCVCNtKyaqGCQylvKmxXjF3GPtND-nOjzASc5J9Xd3konZcmod6zw51ME9v3OpW67sq_eN2WE_Fpqv/s1600/20190226_123345.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSv8H7n7S4Nrnq69_heog3jvt7_-oZYkKyBFuEgG8tN2U9hxda2esZYCVogz2DkzUCVCNtKyaqGCQylvKmxXjF3GPtND-nOjzASc5J9Xd3konZcmod6zw51ME9v3OpW67sq_eN2WE_Fpqv/s640/20190226_123345.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkHlI2LzeUGts8VD_YFLpmHfNLKl-ep0xhvuQrIxdXEvkwZ1D-kRNp0fqFbzzc4WejRbBfBi4tGsaeoE5TdpYhhUkPRlgKm8I0lNd5qNtHYUbeDTnhXXl4mj6EEHlGJc6uxXEBQK-2UvU_/s1600/20190226_123722.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkHlI2LzeUGts8VD_YFLpmHfNLKl-ep0xhvuQrIxdXEvkwZ1D-kRNp0fqFbzzc4WejRbBfBi4tGsaeoE5TdpYhhUkPRlgKm8I0lNd5qNtHYUbeDTnhXXl4mj6EEHlGJc6uxXEBQK-2UvU_/s640/20190226_123722.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpIptWAkS3W-L_G7oDZPN6un01NW31_CzQrE21la71F8TuUF4nNXvM_EJf9OIM92QSYHdsUMRpqxV8Fvk79hHKLMQ2hNCvVz7tadoFqCgZD59Lb3qc3Oel0c2BDYQv4o1MTubvx0g6ijUx/s1600/20190226_123759.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpIptWAkS3W-L_G7oDZPN6un01NW31_CzQrE21la71F8TuUF4nNXvM_EJf9OIM92QSYHdsUMRpqxV8Fvk79hHKLMQ2hNCvVz7tadoFqCgZD59Lb3qc3Oel0c2BDYQv4o1MTubvx0g6ijUx/s640/20190226_123759.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCbXbzUEuERpCt2E6aRFThekfETjXt8AcvPTsesfy_C579f9Yktx3-BeC0CQ8Zhu0rj4NIz7ZIGXUSL1xGoE9JRo8FxOMrkUsz2n8WXE8NhGMtsAmbaEBQOAL7g82Yg0PC5bwFhDz953-Y/s1600/20190226_123851.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCbXbzUEuERpCt2E6aRFThekfETjXt8AcvPTsesfy_C579f9Yktx3-BeC0CQ8Zhu0rj4NIz7ZIGXUSL1xGoE9JRo8FxOMrkUsz2n8WXE8NhGMtsAmbaEBQOAL7g82Yg0PC5bwFhDz953-Y/s640/20190226_123851.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsOZA5Gym67tyd5BpOJCb1yoff9I-4U1wA70LChTlzl3NUrjcaje-tpI-8NHevjTjfqaTRZwKhM6TBF135f4X4Am_4gUJBAuMy6Ajcu35qZWIsx5flca-if8qsADTf5Xr20F2DRXsxZYgN/s1600/20190226_123912.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsOZA5Gym67tyd5BpOJCb1yoff9I-4U1wA70LChTlzl3NUrjcaje-tpI-8NHevjTjfqaTRZwKhM6TBF135f4X4Am_4gUJBAuMy6Ajcu35qZWIsx5flca-if8qsADTf5Xr20F2DRXsxZYgN/s640/20190226_123912.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFm4es4NPIXy99dswJlCAIXOts58Jdr4CdL7R0mWlpGYGEhvTOAdKviVnEfbbhVeY33otxi1EWlYJ2vgLspxt_K4VnRcAaYmArDWLUyoVTTK-lJD1oHrmASl46q2Po2vAXCPC1kzpfISRg/s1600/20190226_124011.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFm4es4NPIXy99dswJlCAIXOts58Jdr4CdL7R0mWlpGYGEhvTOAdKviVnEfbbhVeY33otxi1EWlYJ2vgLspxt_K4VnRcAaYmArDWLUyoVTTK-lJD1oHrmASl46q2Po2vAXCPC1kzpfISRg/s640/20190226_124011.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGKtkUGLWjiRPilppIY3I3usRk2h0NswNclh1qli6YZvioLZDB4oMsoXEirouYKPNrR1kXfQogP8gxUcwmIe1Q0Bzs1dIzbgSyhNVPuf0wv_9CIM1AyY5nxn4MfCxp1ImLcR64qh0ofWmm/s1600/20190226_124041.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGKtkUGLWjiRPilppIY3I3usRk2h0NswNclh1qli6YZvioLZDB4oMsoXEirouYKPNrR1kXfQogP8gxUcwmIe1Q0Bzs1dIzbgSyhNVPuf0wv_9CIM1AyY5nxn4MfCxp1ImLcR64qh0ofWmm/s640/20190226_124041.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjp_h4MjWv4gLXmvihEsVRrP8Sa8X8DkAIz_6mJeITYDL6H1tQnAD84U-MfUd7tn0z1fn_lsV7RuMfChSlHdDcfXKp3lohpsxfQWfNPvnkXoWyYWkrIeJvtDJxcVheDa0ndmrIpZUx4rFok/s1600/20190226_124137.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjp_h4MjWv4gLXmvihEsVRrP8Sa8X8DkAIz_6mJeITYDL6H1tQnAD84U-MfUd7tn0z1fn_lsV7RuMfChSlHdDcfXKp3lohpsxfQWfNPvnkXoWyYWkrIeJvtDJxcVheDa0ndmrIpZUx4rFok/s640/20190226_124137.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipXUM4EysAfID9z2UsDmprX_48mFF6xOQrz8JC3_Tbv_wo81kwB2ajvozWIGtrYFktxCX94GKoiRO7qJp-jicJ_c70rfLytWocWr83Ylq_sRmrG0XjmAzp6R037dfN4qyfwJ0uC60FwsLC/s1600/20190226_124201.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipXUM4EysAfID9z2UsDmprX_48mFF6xOQrz8JC3_Tbv_wo81kwB2ajvozWIGtrYFktxCX94GKoiRO7qJp-jicJ_c70rfLytWocWr83Ylq_sRmrG0XjmAzp6R037dfN4qyfwJ0uC60FwsLC/s640/20190226_124201.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiInhq4KM8WMFnZeFHzOFudn8YC1iZ7qbN8tIbeuJ8gOlo8ytgbkaFk81LidB0PTreIwz4jUgbK0fxjlfBKLM_2Gne4W6-6DlhEhBKgFeG-cK8eowdsvSOsaav44mBnA3LBiBM3wA932efd/s1600/20190226_124213.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiInhq4KM8WMFnZeFHzOFudn8YC1iZ7qbN8tIbeuJ8gOlo8ytgbkaFk81LidB0PTreIwz4jUgbK0fxjlfBKLM_2Gne4W6-6DlhEhBKgFeG-cK8eowdsvSOsaav44mBnA3LBiBM3wA932efd/s640/20190226_124213.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5fVNspIf2zCe4HX7ofaY_6fRUJk_wvNSFmdMYXvFhW4X-jF-A4_Ly8ESmD44kAJXLmfA6n5r6VJuOArKXJzG6Ofk_Bm6NCDUS_9jaNIM0FtShTKSK7FfO5_tM94aP4X-tfVqPSPCqjHlM/s1600/20190226_124323.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5fVNspIf2zCe4HX7ofaY_6fRUJk_wvNSFmdMYXvFhW4X-jF-A4_Ly8ESmD44kAJXLmfA6n5r6VJuOArKXJzG6Ofk_Bm6NCDUS_9jaNIM0FtShTKSK7FfO5_tM94aP4X-tfVqPSPCqjHlM/s640/20190226_124323.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAvPplkbl7uj5LTtjWhyQnE0z750L7WbTCvew4JfrW1AJy-tft9jCOlNLGwRHPgccMfh4Joe6LfNU9aPJ-lZ5lW5eCFOvmOu-4R738VUrJURGpnIrNBYM8x1FBG05_BJLCZAVNhABsLP8s/s1600/20190226_124342.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAvPplkbl7uj5LTtjWhyQnE0z750L7WbTCvew4JfrW1AJy-tft9jCOlNLGwRHPgccMfh4Joe6LfNU9aPJ-lZ5lW5eCFOvmOu-4R738VUrJURGpnIrNBYM8x1FBG05_BJLCZAVNhABsLP8s/s640/20190226_124342.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLbwyjIleNyIbf4IE81LDqPvhMG-VlQwbvpVbqKQ1wluhC8UBd6UC1x8jQlUactQMkMphyphenhyphen56Jpf-0qBLPP3i1NMVjMxfumcMgYUxSd_izO9m5ZPAJWiqoJcex_1pe9oOlvhjGHP0p9tT0L/s1600/20190226_124354.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLbwyjIleNyIbf4IE81LDqPvhMG-VlQwbvpVbqKQ1wluhC8UBd6UC1x8jQlUactQMkMphyphenhyphen56Jpf-0qBLPP3i1NMVjMxfumcMgYUxSd_izO9m5ZPAJWiqoJcex_1pe9oOlvhjGHP0p9tT0L/s640/20190226_124354.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgo4TREMNsHW6j9Q6SkksX_1e-aGYsCsQYy-a7rFiwRO0oS-vvUxHK3nRLdUhv3LulL9x-F1vM8b5VcyTVuIU3tQyTHwxjPF4DK1hZx-sTA4i_PQSJL3sQPEll02Mtdg6cR4Ee-3siSYuDx/s1600/20190226_124503.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgo4TREMNsHW6j9Q6SkksX_1e-aGYsCsQYy-a7rFiwRO0oS-vvUxHK3nRLdUhv3LulL9x-F1vM8b5VcyTVuIU3tQyTHwxjPF4DK1hZx-sTA4i_PQSJL3sQPEll02Mtdg6cR4Ee-3siSYuDx/s640/20190226_124503.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZv1V19vdCqIQV-Jc-BAncikY5K38dhvcuVEu-oFt5ouir6QkCAG_TPny_YvoltIwRCspd9zUti2stwGriaX5K9GUV9JARyBPPKtrGTPDfexvTfZ3ZfnfWhS3-vUYR6uJv8R9AJxYbDD3P/s1600/20190226_124532.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZv1V19vdCqIQV-Jc-BAncikY5K38dhvcuVEu-oFt5ouir6QkCAG_TPny_YvoltIwRCspd9zUti2stwGriaX5K9GUV9JARyBPPKtrGTPDfexvTfZ3ZfnfWhS3-vUYR6uJv8R9AJxYbDD3P/s640/20190226_124532.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7TEC0_s1DUQWyyVYKps-DHlfMeUkVU2MiKPW18MFDXU0XHzgwO6v5fCGhrlhbz1mfmOsTRPpGE0zgbbIWEdkQ7UGPcg_DWdXANbUpz4zx4eOmpl9p4YpwIuURzCAtxR9kGnMlUgXsiiKu/s1600/20190226_124542.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7TEC0_s1DUQWyyVYKps-DHlfMeUkVU2MiKPW18MFDXU0XHzgwO6v5fCGhrlhbz1mfmOsTRPpGE0zgbbIWEdkQ7UGPcg_DWdXANbUpz4zx4eOmpl9p4YpwIuURzCAtxR9kGnMlUgXsiiKu/s640/20190226_124542.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW_RkJvbNf_fC9JmiSE08aeAInKXWTDTYQc6mJTdryJr5n4SVCDAvwO5vm7zYjJu8AZutEyc7OBTYhNVbVPB90r_3FmFXTl68_zdC3V1HyaYql0upW3_HmN65PboNf-DYTZqhQeCOfJcfj/s1600/20190226_124557.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW_RkJvbNf_fC9JmiSE08aeAInKXWTDTYQc6mJTdryJr5n4SVCDAvwO5vm7zYjJu8AZutEyc7OBTYhNVbVPB90r_3FmFXTl68_zdC3V1HyaYql0upW3_HmN65PboNf-DYTZqhQeCOfJcfj/s640/20190226_124557.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhj24exa9bir4QQrtRrDwiLJBY_ekNUOsVjpQ5AgPaSCgW4NYvcTX2quecOH4IqK30TZVBRwhp9HPa_NxOSU8o9goyLFRDVXtWSccWFBlL-QugoD-3KUdoCgYSyeOHZx-R1Z9QLE0J3Kdq5/s1600/20190226_124641.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhj24exa9bir4QQrtRrDwiLJBY_ekNUOsVjpQ5AgPaSCgW4NYvcTX2quecOH4IqK30TZVBRwhp9HPa_NxOSU8o9goyLFRDVXtWSccWFBlL-QugoD-3KUdoCgYSyeOHZx-R1Z9QLE0J3Kdq5/s640/20190226_124641.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6nnEo2VHbC_O0p2n_F3nR7PbY0zEQQ48io39rRJrL4ikFqocxlt22bFVioAxLQosalUPbZ98z9KA7AVMgyIz-QIj7ih_vh9m2Z478OqQlJEQjGNb4M9cCIp2ArkGdOZJOfjOp2nDZX9EJ/s1600/20190226_124649.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6nnEo2VHbC_O0p2n_F3nR7PbY0zEQQ48io39rRJrL4ikFqocxlt22bFVioAxLQosalUPbZ98z9KA7AVMgyIz-QIj7ih_vh9m2Z478OqQlJEQjGNb4M9cCIp2ArkGdOZJOfjOp2nDZX9EJ/s640/20190226_124649.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgquZN9s5byzajXgA1p1JwMbw0gQlbVPgynP2X8jsn4I8nel4TTdv2w3fRB0L3YFXYFjVgvtruB-bQ3QS_2o8hDp5tISEeNKrPbRE_bhvMn084hFaKGBTFI-RilWJ6JzOKtUjKc1wiZZPCh/s1600/20190226_124731.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgquZN9s5byzajXgA1p1JwMbw0gQlbVPgynP2X8jsn4I8nel4TTdv2w3fRB0L3YFXYFjVgvtruB-bQ3QS_2o8hDp5tISEeNKrPbRE_bhvMn084hFaKGBTFI-RilWJ6JzOKtUjKc1wiZZPCh/s640/20190226_124731.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjye8tgtnqeAIds-mKaXD6ZWGA1ukSOv53qBEKN2OXA9UvyRKdhCq8w32CLjZKpHvLCUHC_k2CU6xGOPzcYPQpAvPiHgnlM5B_HSDuBNpZx3hKcjNYdFl3bK020_bTMTps237Gg87QhcOw0/s1600/20190226_125127.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1600&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjye8tgtnqeAIds-mKaXD6ZWGA1ukSOv53qBEKN2OXA9UvyRKdhCq8w32CLjZKpHvLCUHC_k2CU6xGOPzcYPQpAvPiHgnlM5B_HSDuBNpZx3hKcjNYdFl3bK020_bTMTps237Gg87QhcOw0/s640/20190226_125127.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrNDrAXzAZuSyxCoXqMoTryisICvUoO2C034TB9T0OhpjNZKBCfQkCMb5HCUJB6ztKiUz5_LVL62vCr5LPwE-mCSTs2_zEb5SajQEYDNWmlJ_U2-I5e-KTReZUwQ-63xRMX_2h1bKuCbba/s1600/20190226_125831.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrNDrAXzAZuSyxCoXqMoTryisICvUoO2C034TB9T0OhpjNZKBCfQkCMb5HCUJB6ztKiUz5_LVL62vCr5LPwE-mCSTs2_zEb5SajQEYDNWmlJ_U2-I5e-KTReZUwQ-63xRMX_2h1bKuCbba/s640/20190226_125831.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheVCnWzdOheeUsFbIsDp0otu8crlOMGcjSWJwsgHefpRl9SNrAN7lA22Ij79jAiKRsZoeZcrfEoLtXJrg5FmAuI_RUc6Exi0LcW8Ni5L1BU1Iv8LYQyn_mKVM6Rec0xabAFZxNnRgLDVAk/s1600/20190226_125219.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1600&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheVCnWzdOheeUsFbIsDp0otu8crlOMGcjSWJwsgHefpRl9SNrAN7lA22Ij79jAiKRsZoeZcrfEoLtXJrg5FmAuI_RUc6Exi0LcW8Ni5L1BU1Iv8LYQyn_mKVM6Rec0xabAFZxNnRgLDVAk/s640/20190226_125219.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/3998111180042871853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/3998111180042871853'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/2019/02/carpe-diem.html' title='Carpe Diem'/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOfpH1qMbhfKo0N7VCxWl-xR5idh7MJiBv9csypiZ3mXZdPQX_fsotAlKJr4OmppqbVXUgFou6hmsPmVyqIuXdX7QkKvjVBM1kmYCMBGBU1zKOHEGeZXJfXakk_5YryHEp8FSjGHpswkSq/s72-c/20190226_120329.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7818882524515880477.post-6363122341036716122</id><published>2017-11-25T14:12:00.001+00:00</published><updated>2017-11-28T01:47:21.063+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Dell"/><category scheme="http://www.blogger.com/atom/ns#" term="Product Reviews"/><title type='text'>Product Review – Dell XPS 13   </title><content type='html'>&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;o:OfficeDocumentSettings&gt;
  &lt;o:AllowPNG/&gt;
 &lt;/o:OfficeDocumentSettings&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRs5wP6gQwpqPRjCJFfIR3NojUGIdtcFxXTsQRxjb9o780ydbFkOIW8pxV_LI-82611CZTV7AAtKYFP2HMfJ1q5Ak9laFCNLWSvKvEkUjHEDszgRlDCX-LpjtcoE0HNfclVOODkskS0HfI/s1600/XPS+13+product+image.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;548&quot; data-original-width=&quot;962&quot; height=&quot;227&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRs5wP6gQwpqPRjCJFfIR3NojUGIdtcFxXTsQRxjb9o780ydbFkOIW8pxV_LI-82611CZTV7AAtKYFP2HMfJ1q5Ak9laFCNLWSvKvEkUjHEDszgRlDCX-LpjtcoE0HNfclVOODkskS0HfI/s400/XPS+13+product+image.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;I left my old job recently. And consequently found myself
in the market for a new laptop. I hadn’t bothered replacing my old Acer Aspire
V3-571 with custom 1TB Samsung SSD that had failed within two years. Because the
Toshiba Satellite Pro P50-C-12Z my old job supplied worked fine as both a home
and work machine. Especially once I upgraded it with the SSD from my home
laptop. However, once I left that job, I found myself relying on a 10-year-old Dell
Inspiron for a couple of weeks:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg397KhLR_lU15qh_wTu2CHOaT2idT6125h2eFxsdP8S1FXLBYHl_TqoKQKu9tYDu7zVrvFdTh7D33IVJfuibpCBaPeTJku0WGdkqpLn9g4USVrNLDc3FIflFptyPAdVOjAOJSqbV85VyNZ/s1600/Inspiron+Rear.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1600&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg397KhLR_lU15qh_wTu2CHOaT2idT6125h2eFxsdP8S1FXLBYHl_TqoKQKu9tYDu7zVrvFdTh7D33IVJfuibpCBaPeTJku0WGdkqpLn9g4USVrNLDc3FIflFptyPAdVOjAOJSqbV85VyNZ/s320/Inspiron+Rear.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;That Inspiron is a loyal old work horse that
has served me well as both a dev laptop and file server for a decade. And has
been my go-to machine whenever other, newer, higher-spec machines have failed. It&#39;s had its screen and hinges replaced. And has had its hard drive upgraded several times with various SSDs. So saying it has lasted 10 years is a wee bit Ship of Theseus-y. But the motherboard, fans, etc have all stood the test of time. However,
it just isn’t fast enough any more for modern development, so I needed a new
machine.&lt;/span&gt;

&lt;br /&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVpWgP6ZwMwonyeBIckveiWEBmjmuofF1UzI6TQdYTws8FP-AOu9OxuyW7Zpf0jBz6T77KlZfWbrZCzyGYUCgtN1ruHphPV0_T9o_N7QMWspHy6xPhMaZIoQWRye8lq3RrLis5oG_Q2V-I/s1600/XPS+13+Front.jpg&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1600&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVpWgP6ZwMwonyeBIckveiWEBmjmuofF1UzI6TQdYTws8FP-AOu9OxuyW7Zpf0jBz6T77KlZfWbrZCzyGYUCgtN1ruHphPV0_T9o_N7QMWspHy6xPhMaZIoQWRye8lq3RrLis5oG_Q2V-I/s320/XPS+13+Front.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;After some research, I ended up opting for the Dell XPS
13. With 16GB RAM, 512GB PCIe SSD hard drive and the new 8&lt;sup&gt;th&lt;/sup&gt; generation Kaby
Lake Processor (i7-8550U.) I initially ordered the previous model. Which was
identical in all respects to the above spec except the processor (it was an
i7-7550U), and the price tag: the old spec was £300 cheaper. However, &lt;a href=&quot;https://www.laptopmag.com/articles/dell-xps-13-8th-gen-core-60-percent-faster-longer-battery-life-prior-model&quot;&gt;after reading&amp;nbsp; several reviews that all suggested the improvement in performance with the 8th gen processor is significant&lt;/a&gt;, I cancelled and ordered the new spec. It cost £1649 in early
November 2017. At this time, in late November 2017, it is now retailing at
£1547 on Amazon. That’s quite a price change in only a few weeks. Not waiting a
few weeks to see how the price settled is my only regret so far about buying
this machine.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS2qOOyFPv8xYkh8oHljuxKNZswv9PO9njYWq7RLYqJDdN12lQ6L_RR4mde-2fZSj7SMVijZ3Fk3p9xn0S7ch3NZlxxsIfV5doQmC6i6CL6jiAkewmjH5DCA13CJW_0lrihq1QDqlOUTYf/s1600/XPS+13+Rear.jpg&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1600&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS2qOOyFPv8xYkh8oHljuxKNZswv9PO9njYWq7RLYqJDdN12lQ6L_RR4mde-2fZSj7SMVijZ3Fk3p9xn0S7ch3NZlxxsIfV5doQmC6i6CL6jiAkewmjH5DCA13CJW_0lrihq1QDqlOUTYf/s320/XPS+13+Rear.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;The main thing that makes the 8&lt;sup&gt;th&lt;/sup&gt; generation
processor so much better is that it has a Quad Core, compared to the
previous generation’s dual core. So, even with a lower clock speed, the newer
processor burns through tasks like building Visual Studio solutions about 60%
faster than its predecessor. That’s pretty significant. Performance gains are
usually on the order of 10-20% increases between adjacent versions. As the
newer processors have a lower speed, they also run cooler. So, except when you’re
building solutions, you almost never hear the fan kick in. I&#39;ve found that browsing the
internet, watching videos, and even using MS Office are all silent experiences
on this machine.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;I had heard that coil whine (a low pitched noise that accompanies
processor-intensive tasks like watching videos) was a problem in the previous
model. But I haven’t experienced that problem myself in the three weeks I’ve been using my new machine. Similarly, I had read reports of the wireless network card
being unreliable; but my machine has performed perfectly. It hasn&#39;t dropped connection to my home wireless even once. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;The main things that drew me to this model were the form
factor. (A 13.3 inch screen in a machined aluminium chassis, that would usually
only be large enough to hold a 11 inch screen in other models.) And the battery life. (Dell reports
16 hours; I’m finding more like 9 or 10. But I do have the QHD screen,
which is more battery-intensive.) Every time I’ve bought a laptop before, I’ve
gone for power over convenience. But to be honest, the sort of 15-inch laptops
I’ve opted for in the past aren’t great for commuting (small tables on trains.) And they typically don’t have a good battery life.
(I’d have been lucky to get an hour or so on battery on my old Satellite Pro.) By comparison, this
machine runs and runs. If I take it to bed at night, I have to be careful not
to surf (do people still say &quot;surf&quot;?) or work too long. Because that battery could easily see me through til
dawn. As it is, if I browse the internet or watch a video for 3&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp; &lt;/span&gt;hours or so at night on battery, I find I
still have 70% battery the next morning. That, to me, is better than having a
10% faster machine that doesn’t last as long.)&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;u&gt;As a development machine&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;Honestly, I’ve not used this laptop heavily as a development
machine yet. Though I have experimented with running old Visual Studio
solutions on it. A solution with 36 projects &lt;i&gt;Builds&lt;/i&gt; in 1-2 seconds in Visual
Studio 2015 Professional and VS2017 Community from a cold start. And &lt;i&gt;Re-builds&lt;/i&gt; in about 15 seconds. That&#39;s amazing - better than any laptop or desktop I&#39;ve ever had, full size or not, with or without SSD. On my old full-size Satellite Pro laptop with 1TB Samsung
SSD, that Rebuild would have taken about 20 seconds. I should warn that there are some gotchas in VS2017. e.g., if you leave the &lt;i&gt;Lightweight Solution Load&lt;/i&gt; option on (as it is by default), then the initial build time for that same project is about 40 seconds in VS2017
Community. Also, the solution sometimes doesn&#39;t build at all. So, my advice is to switch &lt;i&gt;Lightweight Solution Load &lt;/i&gt;off completely. It&#39;s not stable enough at the current time to be of any use.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;I’m always dubious about using versions of Visual Studio in the same
year as they are named for. But VS2017 appears to be particularly bad in terms
of buggy-ness and generally poor design decisions. (e.g., I found that the &lt;a href=&quot;https://developercommunity.visualstudio.com/content/problem/130929/the-javascript-language-service-has-been-disabled.html&quot;&gt;Javascript Language Service (the part that should make Intellisense work for Typescipt and JS files) has been arbitrarily turned off in VS2017 for some of my existing solutions. Seemingly because some Microsoft developer had put it in the “too hard” pile to make Javascript / Typescript work properly in VS2017&lt;/a&gt;.) Note to Microsoft developers: if you can’t handle more
than 20MB of Javascript / Typescript files for a single solution, you’re just
wasting developers’ time. Don’t bother doing less than that and considering the
job done. Turning off features that worked perfectly well in previous versions
of VS is pretty inexcusable. The only reason for using Typescript over
Javascript is that it provides object-oriented capabilities. But you can only
leverage those features meaningfully if you have Intellisense. Disabling such a
key feature at such a stupidly-low threshold is like having a car whose doors
fall off if you go over 30 MPH. And closing bugs about same on the basis that you &lt;i&gt;meant &lt;/i&gt;to do something that stupid is even more stupid than the design decision was in the first place. FWIW, I fixed the problems with JS/Typescript Intellisense that are evident in VS2017 by disabling the new Language Service completely using this option:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioNNQTMcCxhv5o0fkMpIi0GHFr2WtkU6mMccz9TE3YSYASp-Nr_i0gigWvdwm8y4Emh7j7iyXGgd499Cjl8luc1MY51oHshSxrwmx0psBhuGRDW3d1K67Ki1FA8vfryJZyj_kle2BatOnQ/s1600/Disable+Language+Service.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1194&quot; data-original-width=&quot;1600&quot; height=&quot;298&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioNNQTMcCxhv5o0fkMpIi0GHFr2WtkU6mMccz9TE3YSYASp-Nr_i0gigWvdwm8y4Emh7j7iyXGgd499Cjl8luc1MY51oHshSxrwmx0psBhuGRDW3d1K67Ki1FA8vfryJZyj_kle2BatOnQ/s400/Disable+Language+Service.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;and including the following settings in a file named &quot;tsconfig.json&quot; in the root of my web project:&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &quot;compilerOptions&quot;: {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&quot;disableSizeLimit&quot;: true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&quot;module&quot;: &quot;commonjs&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&quot;allowJs&quot;: true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&quot;outDir&quot;: &quot;out&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &quot;exclude&quot;: [&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&quot;node_modules&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&quot;wwwroot&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&quot;out&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; ],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &quot;compileOnSave&quot;: true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &quot;typeAcquisition&quot;: {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&quot;enable&quot;: true&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/b&gt; &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;Anyway, this review is about my XPS 13, not the poor
design decisions of the Visual Studio 2017 development team. I mention these issues
with VS2017 vs VS2015 purely to note how hard it is to assess new hardware if
running new software too. Sometimes, it’s not the hardware that&#39;s to blame for any failings
observed. Overall, like-for-like, my XPS 13 performs better than my old
Satellite Pro + SATA 3 Samsung SSD. Even though that machine was no slouch. I’m glad I bought
it, and will continue to use it as my main development laptop. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;u&gt;Battery Life&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;In terms of battery life, the XPS 13 is a world away from
any laptop I’ve owned before. Realistically, I get about 10 hours out of it if
I’m just browsing the internet, or watching videos. As noted, I haven’t used it for
actual development in anger yet. But going by the way the fan kicks when I build VS solutions, I’d
suspect that I’d get around 4-5 hours max out of it at full throttle, possibly less. All previous laptops I’ve used have
only got around 1-1.5 hours on battery, even if I were only browsing. So, whilst I have to be
careful this doesn’t make me sit up too long at night. It is a huge
improvement. That battery life is the main reason I bought the XPS 13 over its big brother,
the XPS 15. Every time I’ve bought a laptop in the past 10 years, my ‘sensible’
head has kicked in and coaxed me to go for raw power over portability and
battery life. With this machine, I don’t need to compromise. It provides both ultra-portability, and processing power in one package.
Whilst no doubt the latest generation XPS 15 probably could out-perform this model in sheer processing time. You can’t argue with sub-5 second builds in VS2015, combined with a full
day’s battery life for commuting or using in the evening for lighter tasks.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;u&gt;Other features&lt;/u&gt; &lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;The XPS 13 has two features that I particularly like. Firstly, it has a nice, carbon fibre, rubberised keyboard surface. The keys themselves are pretty tactile, chicklet-style. As a touch typist, I find it suits me very well. But the palm rest is rubberised, which makes the keyboard pleasant to use if the laptop is cold. Had Dell opted for Aluminium all round, I think that would have made for some pretty cold hands when typing a quick email first thing in the morning. Or when transferring the laptop from a cold car boot to a warm office.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;Secondly, the keyboard is well-lit. With differing levels of white lighting available. Including &quot;off.&quot; In a dark room, that backlighting makes positioning your hands far easier. Also, the keyboard light only comes on when you type; so it&#39;s not distracting if you generally want a keyboard light, but also don&#39;t want to be distracted by same when watching a video.&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;u&gt;Minor Quibbles&lt;/u&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;My old Inspiron and new XPS 13 both have one design feature that I find annoying. Namely, there is a battery charging light right on the front of the machine. And it can&#39;t be disabled. It goes off when the battery is fully charged, but it&#39;d have been nice to be able to switch it off electively. My old Inspiron battery has reached a stage where it doesn&#39;t hold a charge any more; it&#39;s therefore even more annoying, as it flashes orange to warn that the battery needs replaced. My new XPS 13 is too new to be able to tell if it does the same thing, though my understanding is that it will when the battery is too old to charge any more. It&#39;d be nice not to have to use black electrical tape to switch this feature &quot;off.&quot;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;Secondly, the webcam is badly-placed. I don&#39;t use it anyway, so it&#39;s not an issue for me. But if you do a lot of web conferencing, be aware that it is placed on the bottom-left of the screen. This is because the 13.3 inch display takes up nearly all of the height and width available. But it means that any Webex you have will involve participants looking right up your nose. Not pleasant.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;Lastly, the hinge on the lid is very strong. I personally like this, as it means the screen doesn&#39;t move when you use the touchscreen. But some people have complained about having to use a whole two hands instead of one to open the lid. The main issue I do have with the lid is that it doubles as a very effective set of pliers if you placed your fingers on the hinge whilst opening. (Just as well you need both hands to open it then really, isn&#39;t it?) &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;u&gt;Other options&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;Other options I considered included the &lt;a href=&quot;https://www.amazon.co.uk/Razer-13-3-Inch-QHD-Ultrabook-Black/dp/B072JQWZLL/ref=sr_1_2&quot;&gt;Razer Blade Stealth&lt;/a&gt;.
(In the end, I decided the lack of a 8&lt;sup&gt;th&lt;/sup&gt; gen processor, combined
with the fact I could only get the “gamer” version with a green logo and
rainbow-coloured keyboard lighting were deal breakers for me. Plus, support
is US-based whilst I’m in the UK.) I also liked the &lt;a href=&quot;https://youtu.be/_XLTaK5oz3c&quot;&gt;HP Spectre&lt;/a&gt; very much indeed – it seems a very
nice machine. Just not quite as capable as the XPS 13 in terms of power or
battery life. Beautiful, though. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNoSpacing&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/6363122341036716122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/6363122341036716122'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/2017/11/product-review-dell-xps-13.html' title='Product Review – Dell XPS 13   '/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRs5wP6gQwpqPRjCJFfIR3NojUGIdtcFxXTsQRxjb9o780ydbFkOIW8pxV_LI-82611CZTV7AAtKYFP2HMfJ1q5Ak9laFCNLWSvKvEkUjHEDszgRlDCX-LpjtcoE0HNfclVOODkskS0HfI/s72-c/XPS+13+product+image.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7818882524515880477.post-7474084015962157507</id><published>2017-08-17T10:27:00.003+01:00</published><updated>2017-08-17T11:26:55.669+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Product Reviews"/><category scheme="http://www.blogger.com/atom/ns#" term="Screwfix"/><category scheme="http://www.blogger.com/atom/ns#" term="Wago"/><title type='text'>Product Review - Wago Connectors</title><content type='html'>&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif; font-size: large;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif; font-size: large;&quot;&gt;I was re-wiring my garage recently, when I got fed up screwing wires into choc blocks. I figured someone must have come up with a better way of connecting wires together, got Googling, and found these guys - Wago Connectors:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2Zj3Jo-pSo-1a42YCWFrtjg8Pbxgg2Y5Fmzz2ulW9xRRgXZD5HnOwNOVhxo0-FgENElWwPrm2n6mx-zYxSaLH5t883OSicDdUhh-J9mDGfeOcjp8E_LLsAvVOJ1znvvokdIO8T2FmXs4f/s1600/Wago+Connectors.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;678&quot; data-original-width=&quot;1071&quot; height=&quot;202&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2Zj3Jo-pSo-1a42YCWFrtjg8Pbxgg2Y5Fmzz2ulW9xRRgXZD5HnOwNOVhxo0-FgENElWwPrm2n6mx-zYxSaLH5t883OSicDdUhh-J9mDGfeOcjp8E_LLsAvVOJ1znvvokdIO8T2FmXs4f/s320/Wago+Connectors.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif; font-size: large;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif; font-size: large;&quot;&gt;Wago make&lt;/span&gt;&lt;span style=&quot;font-size: large;&quot;&gt; lots of different kinds of connectors, some of which are re-usable. Those are the ones I went for. For historical reasons, there are two kinds of re-usable connectors. The 222s:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif; font-size: large;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqTwFXYAa-yBj3ULqKsV8FXvPb4d593FfyMtNCvoZkHdg8dxD_Rkws5rDxZ_iRKYUbMk8n_ODntar-OcHJ3opAEwP3wys-MCgUU66054ny-yHDDgvmwnRN93C9a8LfMGdIFkFqukthQlMS/s1600/222s.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1044&quot; data-original-width=&quot;1410&quot; height=&quot;236&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqTwFXYAa-yBj3ULqKsV8FXvPb4d593FfyMtNCvoZkHdg8dxD_Rkws5rDxZ_iRKYUbMk8n_ODntar-OcHJ3opAEwP3wys-MCgUU66054ny-yHDDgvmwnRN93C9a8LfMGdIFkFqukthQlMS/s320/222s.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif; font-size: large;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-size: large;&quot;&gt;And newer 221s:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOBB1-mU3op7sY_fI-HmF5Z9AVpjz1QtjAg-1aQt6L4ie5Rqrb8soKEUcWSAdVyEtI2NR-nLWqewwsLF5G_2863f-B7l03elhEBVolVl3Awg1-cG9J2tDBn8XovoQ9uUCmhNB4Idur5yI2/s1600/5-way+221.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1320&quot; data-original-width=&quot;1152&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOBB1-mU3op7sY_fI-HmF5Z9AVpjz1QtjAg-1aQt6L4ie5Rqrb8soKEUcWSAdVyEtI2NR-nLWqewwsLF5G_2863f-B7l03elhEBVolVl3Awg1-cG9J2tDBn8XovoQ9uUCmhNB4Idur5yI2/s320/5-way+221.jpg&quot; width=&quot;279&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif; font-size: large;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif; font-size: large;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Both kinds come in 2-way, 3-way and 5-way forms. (For connecting the respective number of wires together&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;.)&lt;/span&gt; The 221s are sligh&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;tly &lt;/span&gt;more expensive, and take up about 40% less space. But they do the same job of letting you join wires together&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;.&lt;/span&gt; &lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;P&lt;/span&gt;otentially wi&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;res &lt;/span&gt;of different gauges (such as when connecting twin and earth solid-core to multi-core flex cable used by most appliances in the UK.)&lt;br /&gt;&lt;br /&gt;I can highl&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;y&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;-&lt;/span&gt;&lt;/span&gt;recommend the&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;se useful little guys&lt;/span&gt;. They sped up the job considerably, and have proven very reliable in use. &lt;br /&gt;&lt;br /&gt;I don’t have a fidget spinner, so I kept a few of &lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;these connectors&lt;/span&gt; on my desk &lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;over&lt;/span&gt; the next month or so to footer with whilst coding. Opening and closing the levers repeatedly. From that unscientific &quot;test&quot;, I can say that the 222s are quite a bit more robust than the 221s. After a few hundred “opening and closing” operations on their leve&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;r&lt;/span&gt;s, the more expensive 221 wouldn’t stay open fully any more. It is still usable, and I could hold it open whilst inserting a wire if I &lt;i&gt;really &lt;/i&gt;needed to. But then it becomes just as fiddly to use as a choc block. So if you&#39;re going to be installing&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;/uninstalling and re-building a lot&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;, I&#39;d say go for the 222s. If weight is a primary concern (&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;e.g., building a dr&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;one) then use the 221&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;s or just solder and acce&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;pt that &lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;greater&lt;/span&gt; build ti&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;me&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and reduce&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;d a&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;bility to dis-assemble &lt;/span&gt;&lt;/span&gt;is the price you pay for less weight.&lt;br /&gt;&lt;br /&gt;On the upside, &lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;t&lt;/span&gt;he levers on the 221s are considerably easier to open. Though neither is particularly difficult. There is a &lt;a href=&quot;https://www.homelectrical.com/operating-tool-opening-221-series-splicing-connectors.wag-210102.1.html?mode=listsearch/{search_term}&quot;&gt;dedic&lt;/a&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;a href=&quot;https://www.homelectrical.com/operating-tool-opening-221-series-splicing-connectors.wag-210102.1.html?mode=listsearch/{search_term}&quot;&gt;a&lt;/a&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;a href=&quot;https://www.homelectrical.com/operating-tool-opening-221-series-splicing-connectors.wag-210102.1.html?mode=listsearch/{search_term}&quot;&gt;ted &lt;/a&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;a href=&quot;https://www.homelectrical.com/operating-tool-opening-221-series-splicing-connectors.wag-210102.1.html?mode=listsearch/{search_term}&quot;&gt;tool for opening them&lt;/a&gt; that costs over £100, but &lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;really it&#39;s a ridiculously over-engineer&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;ed&lt;/span&gt; solution&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt; that I can&#39;t imag&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;e anybody needing. Even people that are installing these all day would have &lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;no difficulty opening them with just their fingers.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif; font-size: large;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;The first time you open one of the 222s, you’ll be unsure if it’s broken. Because its jaws init&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;ially &lt;/span&gt;open to about half way quite easily, then you need to use substantially more force to open the leve&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;r&lt;/span&gt; all the way. It can also give you a nasty “mouse trap” snap on your fingers if you’re not careful whilst you close the lever to clamp your wire in place.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz50OARF6muiLkqlbgAtEWNTtcW55BvQulZGdSUhZz9-iX4wvLfH_SrKOp2yro9c1oNMhkZIV9JLUYymljD3AhfOCw5Eq62l9B9ygB2Dj6kVwklGt1LC4sHWO9PLiIhHsNzOZSux641ig6/s1600/222+lever+opening.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1560&quot; data-original-width=&quot;1347&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz50OARF6muiLkqlbgAtEWNTtcW55BvQulZGdSUhZz9-iX4wvLfH_SrKOp2yro9c1oNMhkZIV9JLUYymljD3AhfOCw5Eq62l9B9ygB2Dj6kVwklGt1LC4sHWO9PLiIhHsNzOZSux641ig6/s320/222+lever+opening.jpg&quot; width=&quot;276&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif; font-size: large;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif; font-size: large;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Over all, I think I’ll be using the cheaper 222s where space isn’t a consideration. To that end, I bought a box of the 3-way and 2-way 222s, and a box of the 5-way 221s. (Since when I need to connect 5 wires together, that’s usually when space is tightest.)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif; font-size: large;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;With rega&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;rd to th&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;eir ratings, I&#39;m honestly not quite sure what amperage / voltage the&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;y&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; can take. The problem is there are two ratings on each model&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;. (Presumably to satisfy more than one set of tests for different markets.)&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif; font-size: large;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;The 22&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;2s are rated at &quot;20A&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt; 300V&quot; on one side and &quot;600V&quot; on the other side. The 221s have labels showing they are variously rated at &quot;450V 32A&quot; or &quot;20A 300V&quot;. Confused?, you will be?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;a href=&quot;https://www.youtube.com/watch?v=fjNUzd6LDsU&quot;&gt;Her&lt;/a&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=fjNUzd6LDsU&quot;&gt;e &lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;i&lt;/span&gt;s a YouTube &lt;/a&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=fjNUzd6LDsU&quot;&gt;v&lt;/a&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=fjNUzd6LDsU&quot;&gt;ideo o&lt;/a&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=fjNUzd6LDsU&quot;&gt;f someone actually bur&lt;/a&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=fjNUzd6LDsU&quot;&gt;ning the things out to test their limits&lt;/a&gt;.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif; font-size: large;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;In pr&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;actical use, I&#39;ve &lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;had no problems having about 10 of these things in the same switch&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt; &lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;I&#39;ve also used&lt;/span&gt; three in series on the same c&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;ircuit&lt;/span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif; font-size: large;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;a href=&quot;http://www.screwfix.com/p/2-way-lever-connector-222-series-pack-of-50/97689&quot;&gt;2-way 222 connectors: £13.23 for a pack of 50 @ Screwfix&lt;/a&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.screwfix.com/p/3-way-lever-connector-222-series-pack-of-50/76776&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif; font-size: large;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;3-way 222 connectors: £15.13 for a pack of 50 @ Screwfix&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif; font-size: large;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;&lt;a href=&quot;http://www.screwfix.com/p/wago-5-way-lever-connector-221-series-32a-pack-of-25/5201r&quot;&gt;5-way 221 connectors: £13.&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif;&quot;&gt;80&lt;/span&gt; for a pack of 25 @ Screwfix&lt;/a&gt;&amp;nbsp;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif; font-size: large;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Addendum:
 Thelma quite enjoyed these little devices too. She reports that the 
222s, being rounder, are 50% “more chasy” than the “boring” more square 
221s. They therefore fly faster when she bats them with her paws to 
simulate spontaneous movement.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif; font-size: large;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2pe0-xzpJh7x8ikQyFhtcCh895dUTKQ9LzS1B3nSfDgMymsE9hlkKD5t_BbgmJPtDIxc-pEJmZejnCjkn3iQKafL31udS593kqexOMdi7U_jJU4xGH0O1SwU1izcqCAqqY1VKTmP5wH_S/s1600/Lazing.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1600&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2pe0-xzpJh7x8ikQyFhtcCh895dUTKQ9LzS1B3nSfDgMymsE9hlkKD5t_BbgmJPtDIxc-pEJmZejnCjkn3iQKafL31udS593kqexOMdi7U_jJU4xGH0O1SwU1izcqCAqqY1VKTmP5wH_S/s320/Lazing.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif; font-size: large;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/7474084015962157507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/7474084015962157507'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/2017/08/product-review-wago-connectors.html' title='Product Review - Wago Connectors'/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2Zj3Jo-pSo-1a42YCWFrtjg8Pbxgg2Y5Fmzz2ulW9xRRgXZD5HnOwNOVhxo0-FgENElWwPrm2n6mx-zYxSaLH5t883OSicDdUhh-J9mDGfeOcjp8E_LLsAvVOJ1znvvokdIO8T2FmXs4f/s72-c/Wago+Connectors.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7818882524515880477.post-6710542941653418642</id><published>2016-10-17T15:06:00.002+01:00</published><updated>2020-12-20T13:17:10.103+00:00</updated><title type='text'>Another TrustPilot whitewash artist - Fenix Torch (www.fenixtorch.co.uk)</title><content type='html'>&lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;I got this spam after making a purchase on Fenix Tor&lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;ch re&lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;cently. I would note that I have o&lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;pted out of TrustPilot spam emails several times in the past:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGo1NzGBGNFSjEmvO9PvjEZo8ZocmDNiyN-8rzL55P0GlE3MO9DaNi7xJOgDBLXbcWAJv6PmFvjOKw9yI6WDzmsWRwQSawsZGVL5V3MK7kFWdm4CwqGxPT-ug3uO6vebmllByecotQZN72/s1600/Fenix+Torch+we+publish+negative+reviews+-+highlight.gif&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGo1NzGBGNFSjEmvO9PvjEZo8ZocmDNiyN-8rzL55P0GlE3MO9DaNi7xJOgDBLXbcWAJv6PmFvjOKw9yI6WDzmsWRwQSawsZGVL5V3MK7kFWdm4CwqGxPT-ug3uO6vebmllByecotQZN72/s640/Fenix+Torch+we+publish+negative+reviews+-+highlight.gif&quot; width=&quot;537&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;I&amp;nbsp; particula&lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;rly like the bit that &lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;says &quot;All reviews, good, bad&lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;, or otherwise will be viewable im&lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;med&lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;iately.&quot;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;What it doesn&#39;t say is that &lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;any negative fe&lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;edback will be im&lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;med&lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;iately sub&lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;jected to attempted whitewashing:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnoBsgpksyyHxaXWUoS6uHvPG3JS5umldMRuohaX16ouWVETIdYUoY2nkdUYJS9QHzXLOGaEHeEkuImcQZQ8c6b4XRMwD8mgUwVhhxV_JG-CoJFNMfC7stdYtY0B5usJhnplQcfLExomuK/s1600/Another+TrustPilot+Whitewasher+-+Fenix+Torch.gif&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnoBsgpksyyHxaXWUoS6uHvPG3JS5umldMRuohaX16ouWVETIdYUoY2nkdUYJS9QHzXLOGaEHeEkuImcQZQ8c6b4XRMwD8mgUwVhhxV_JG-CoJFNMfC7stdYtY0B5usJhnplQcfLExomuK/s1600/Another+TrustPilot+Whitewasher+-+Fenix+Torch.gif&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;When
 will these companies learn? Trying to suppress negative reviews leads 
to worse publicity than the original review ever could have on its own&lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Fenix Torch&lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt; &lt;/span&gt;really should look up the &lt;a href=&quot;https://en.wikipedia.org/wiki/Streisand_effect&quot;&gt;Streisand Effect&lt;/a&gt; some time. Beca&lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;use behaviour like this only makes &lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;them&lt;/span&gt; look fool&lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;ish. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidfyGEkBEK2gO8y8RfzHmFCVcRuiXqCe1OGi7cxJz1W9degAXNQP4ezKiGyY4Gdd6kPO9F3frh0ir_gDLpWR0RbTKhO5lnlyXRV-fqLyb-G6fUPMg_Q6URbLzjmNi3iUZKPncDTf3Cibt2/s1600/Streisand_Effect-270x300.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidfyGEkBEK2gO8y8RfzHmFCVcRuiXqCe1OGi7cxJz1W9degAXNQP4ezKiGyY4Gdd6kPO9F3frh0ir_gDLpWR0RbTKhO5lnlyXRV-fqLyb-G6fUPMg_Q6URbLzjmNi3iUZKPncDTf3Cibt2/s1600/Streisand_Effect-270x300.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0kurYJrlOfTndn-UB8PYL6EMZBUP_7xGqI4QWr59MAeB77fOXc9rPZqCPIur0HZuEA73LZTqLn8SAUtAL-GN98CPwY8BYH8HfIE6zYlg-gh9P8ihJcWO_uqpd58UUGgGlm8A9ZheRWCcO/s1600/Streisand+Effect+Definition.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0kurYJrlOfTndn-UB8PYL6EMZBUP_7xGqI4QWr59MAeB77fOXc9rPZqCPIur0HZuEA73LZTqLn8SAUtAL-GN98CPwY8BYH8HfIE6zYlg-gh9P8ihJcWO_uqpd58UUGgGlm8A9ZheRWCcO/s1600/Streisand+Effect+Definition.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span face=&quot;&amp;quot;arial&amp;quot; , &amp;quot;helvetica&amp;quot; , sans-serif&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/6710542941653418642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/6710542941653418642'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/2016/10/another-trustpilot-whitewash-artist.html' title='Another TrustPilot whitewash artist - Fenix Torch (www.fenixtorch.co.uk)'/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGo1NzGBGNFSjEmvO9PvjEZo8ZocmDNiyN-8rzL55P0GlE3MO9DaNi7xJOgDBLXbcWAJv6PmFvjOKw9yI6WDzmsWRwQSawsZGVL5V3MK7kFWdm4CwqGxPT-ug3uO6vebmllByecotQZN72/s72-c/Fenix+Torch+we+publish+negative+reviews+-+highlight.gif" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7818882524515880477.post-8751981169046094960</id><published>2015-12-25T02:33:00.000+00:00</published><updated>2015-12-29T20:51:38.950+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Continuous Integration"/><category scheme="http://www.blogger.com/atom/ns#" term="NAnt"/><category scheme="http://www.blogger.com/atom/ns#" term="TeamCity"/><category scheme="http://www.blogger.com/atom/ns#" term="Unit Testing"/><title type='text'>Building a Total Quality Software environment, with Continuous Integration, Unit Testing, and Dependency Injection. And Futurama.</title><content type='html'>&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
 &lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;

&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0cm;&quot;&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;Recently at work, I’ve been working
with my colleagues to set up a Total Quality software environment. I’ve been
learning a lot from my peers about topics such as VMware, RTI and Code-First EF. (I’d
previously used Schema-First, but Code First brings its own advantages and
challenges). What I brought to the party was some project experience in:&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;Continuous
Integration platforms (specifically in this case, TeamCity.)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;Unit
Testing and Test-Driven Development techniques.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;Dependency
Injection to support writing testable code.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;NAnt
scripting.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;Futurama.&lt;br /&gt; &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;We’ll get to that last one in a
minute. Let’s go through the others in order first.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;

&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0cm;&quot;&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif; font-size: large;&quot;&gt;

&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0cm;&quot;&gt;
&lt;span style=&quot;color: #6aa84f;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;u&gt;&lt;span style=&quot;line-height: 107%;&quot;&gt;Continuous Integration (CI)&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;

&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0cm;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhR0nW8dAR-1ssO9PofTkQ6R1s6BOm06a2RiOHi9k3MOOaQMI3kSzWIi8CD3aPKKNBRTtKMaSbJF2YCRvej_9DPTdk7RxuDeKeZ5na2kuUQEWZuLgwV6A1V2nK-O3yyL41ZLs23PrOT4wnA/s1600/TeamCity.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhR0nW8dAR-1ssO9PofTkQ6R1s6BOm06a2RiOHi9k3MOOaQMI3kSzWIi8CD3aPKKNBRTtKMaSbJF2YCRvej_9DPTdk7RxuDeKeZ5na2kuUQEWZuLgwV6A1V2nK-O3yyL41ZLs23PrOT4wnA/s640/TeamCity.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0cm;&quot;&gt;
&lt;/div&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;

&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0cm;&quot;&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;Everygeek who’s anynerd is using it
these days. But lots of development teams and companies still avoid it, imagining
it to be too difficult, too time-consuming, or just not worth the hassle. (For
that matter, those same fallacious criticisms can be levelled at every other
item in the list above too. Except Futurama.) A decade ago people used to say
the same things about Source Control; thankfully there aren’t too many teams I
encounter these days that haven’t got their head around how important &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;that&lt;/i&gt; is. &lt;br /&gt;
&lt;br /&gt;
Some teams aren’t even sure what CI is, what it does, or what advantages it
brings. They’ve always worked by developers just producing software on their
own PCs. And they just deal with any time-consuming fallout when it comes to
making that software work in the real world as part of the cost of doing
business.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;OK, so here’s the unique selling
point if you’re trying to make the case for introducing this where you work. Are
you ready? What CI adds to your team’s game is simply this: &lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;repeatable,&lt;span style=&quot;mso-spacerun: yes;&quot;&gt; &lt;/span&gt;verifiable deployment.&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;color: #6aa84f;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;u&gt;&lt;span style=&quot;line-height: 107%;&quot;&gt;Unit Testing and Test-Driven
Development techniques&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;Unit Testing has been around for a
Very Long Time. I know a lot of people who are otherwise very good developers
but who &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;“don’t see the point”&lt;/i&gt; of unit
testing. And I have been such a developer myself in the murky past.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;The misconception that unit testing is pointless generally comes down to a few
fallacies:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0cm;&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;They
believe that their own code always works.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;The
wider team and stakeholders place more value on quantity of new features than
upon quality of existing features. &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;They
believe that they will always personally be around to ensure that their code
doesn’t get broken in the future.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;ListParagraphCxSpLast&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0cm; mso-add-space: auto; mso-list: l2 level1 lfo2; text-indent: -18.0pt;&quot;&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;Like most good fallacies, there’s
just enough truth in most of these to preserve the illusion that unit testing
doesn’t provide enough advantages to the person that has to implement it. Not
when compared to the opportunity costs of them learning how to do it, or the
kudos of pushing out new features (that don’t work as intended.)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;Part of the reason more developers
don’t give it a go, is that you have to change the way you write code. Most
code I’ve seen in the wild is &lt;i&gt;tightly-coupled&lt;/i&gt;. This is a phrase that many
developers are familiar with, but in my experience vanishingly few know what it
means. Basically, it means that if you are writing Class A, and your class
depends upon Class B to do its job, your class will instantiatiate a new
instance of Class B itself. This means that if Class B stops working, all you
(and Users) know is that your class “doesn’t work.” They won&#39;t care if your code is perfect, and it&#39;s just that damn Class B that let you down.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;So, when doing test-driven
development, developers need to add another couple of skills to their arsenal.
Which brings us to…&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #93c47d;&quot;&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif; font-size: large;&quot;&gt;&lt;u&gt;&lt;span style=&quot;line-height: 107%;&quot;&gt;Dependency Injection (DI)&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;One type of Tight Coupling is defined
above. Code is also tightly coupled when it is too closely tied to one UI. So,
if you’re a developer that puts all their business logic in code-behind files
or controller actions, your code won’t be testable. Because your code needs the
UI to do its job, before it will be able to be verified.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;Fortunately, there are frameworks and
coding styles out there that help developers implement &lt;i&gt;loose coupling&lt;/i&gt;, to make
their code independently testable.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;The basic idea behind all of these is that
instead of your Class A consuming Class B directly to perform some function, it
consumes Interface B instead. That is, some object that Class A doesn’t
instantiate itself, satisfies some interface that represents the job Class B
was doing for Class A. Typically this is achieved by making the constructor of Class A look like this&amp;nbsp;:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxG1JWw6Y_cvYgIhvooeI3u5q5rfxbymP94i29WBj3p5ZFk-opqw0p1RK1KCfMeswuYpRli0GBK8FGrIVcGOGFD80ZWi2XpaKqyUXIFnZogErVL1o0aZ75YD0VXwfP1naIrTpDn6dkTFpy/s1600/Constructor+Injection.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;321&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxG1JWw6Y_cvYgIhvooeI3u5q5rfxbymP94i29WBj3p5ZFk-opqw0p1RK1KCfMeswuYpRli0GBK8FGrIVcGOGFD80ZWi2XpaKqyUXIFnZogErVL1o0aZ75YD0VXwfP1naIrTpDn6dkTFpy/s640/Constructor+Injection.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;The above pattern is known as &lt;i&gt;Constructor Injection&lt;/i&gt;. What it gives you is the ability to swap out whatever is implementing Interface B when it comes to unit testing Class A. So, instead of the object that really does implement Interface B in live use, you can use what is called a &lt;i&gt;mock instance&lt;/i&gt; of Interface B. That is typically some object that always gives you anticipated responses. So you can concentrate on testing Class A. That way, any errors you see can be wholly attributed to Class A.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;When you write your classes using the Constructor Injection pattern demonstrated above, DI frameworks provide concrete implementations of objects that implement interfaces at runtime. So, you &#39;magically&#39; find a usable implementation or Interface B available in Class A&#39;s constructor. As the developer of Class A, you don&#39;t care particularly about where that implementation of Interface B comes from; that is the responsibility and concern of the developer of Interface B and your chosen DI framework.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;This is just one of the techniques that developers moving from code that &quot;just works&quot; need to learn if they want their code to be verifiable. It is difficult to embrace. Because frankly writing code that &quot;just works&quot; is hard enough. And because using these techniques opens up the possibility of developers having to recognise errors in their own code. But unit testing also brings with it a huge number of advantages: The ability to prove that a given piece of code works, not just at the time of writing but every single time you build. And it protects your work from being modified in adverse ways by subsequent developers.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;Unit testing and Dependency Injection are whole topics on their own, so I won&#39;t say more about them here. (I&#39;ll perhaps save that for future blogs.) With regard to understanding tight and loose coupling, though, I&#39;ll leave you with an analogy. If a
traveller wants to get to some destination, they don’t need to know what the
bus driver’s name will be, the vehicle registration, what type of fuel the bus uses,
etc. They just need to know what bus stop to be at, what time, and what is the
correct bus number to get on. Similarly, Class A doesn’t need to know
everything about Class B or where it comes from. It just needs to know that
when it requires an object to do some job, one will be available at an agreed
time. Class A instantiating Class B itself is analogous to a traveller trying
to build their own bus.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;Last time I checked, there were
something like 22 DI frameworks that you can use with .Net. The one I
implemented at work recently is called &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;Castle
Windsor&lt;/i&gt;, which I’ve been using for a few years. In benchmark tests it’s not
the fastest. It’s not the simplest. And it’s not the most
customisable/powerful. But it is the one that for my money strikes the right
balance between those competing factors. And it integrates particularly well
with ASP.Net MVC and Entity Framework.&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #93c47d;&quot;&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif; font-size: large;&quot;&gt;&lt;u&gt;&lt;span style=&quot;line-height: 107%;&quot;&gt;NAnt Scripting&lt;/span&gt;&lt;/u&gt;&lt;span style=&quot;line-height: 107%;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;Continuous Integration platforms on
their own give you a powerful way of automating builds and deployments.
However, there are advantages to be gained to farming out some of that work to
a more specialised tool. NAnt is one such tool.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;For any system that gets developed,
there are typically 10-25 individual “jobs” that are involved in setting up a
copy of the system that Testers and ultimately Users can access. e.g, for a web
app you might need to: &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;

&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;

&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;Create
some Virtual Directories in IIS.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;Copy
the files that the website is made of into the folders those VDs point at.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;Customise
a web config that tells the site how to access the underlying database.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;Create
the underlying database in SQL Server.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;Populate
the database with data.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;Create
an App Pool in IIS under which the site will run.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;Grant
the relevant App Pool access to the database &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;

&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;

&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0cm;&quot;&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;You’d also be well-advised to have
steps that involve:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;

&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;

&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;Running
unit tests, so you don’t deploy broken code.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;Updating
Assembly Information so that each build has an identifying number. That way,
bugs can be reported against specific builds. &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;Backing
up any prior version so that you can rollback any of the above steps if the
deployment fails.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;

&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0cm;&quot;&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;If you put these in a script that
lives in your project instead of in build steps on your CI server, you can more
easily mirror steps between different branches in your builds.&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #c27ba0;&quot;&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif; font-size: large;&quot;&gt;&lt;u&gt;&lt;span style=&quot;line-height: 107%;&quot;&gt;Futurama&lt;/span&gt;&lt;/u&gt;&lt;span style=&quot;line-height: 107%;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;One of the things that motivates me
is getting to have a bit of fun whilst I work. In the team I joined a few
months ago, there has been one common theme tying all of the above threads
together: Futurama.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;Myself and my colleagues have set up about
10 Windows Server 2012 machines that perform various jobs. e.g., One of them is
a Domain Controller. Another is our CI server. Several more act as paired web
and sql servers that can be temporarily allocated to testing, by internal
testers or by end users. Or they can be used by developers to test the
deployment process.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh12wkO394IOsbjNgIX-pnEM1xFdeaEqlCpYwqhPkEnyzo7CF2xQuwKp-nVDbpRuF9Uqp75mX1jUUaiYNLYTd2FwaBQmqZIIVUKQBg53cU_8MBKpKPtw2md6PflDkeaiq4CCeuoiGvQlQGK/s1600/Development+Network+Machines.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh12wkO394IOsbjNgIX-pnEM1xFdeaEqlCpYwqhPkEnyzo7CF2xQuwKp-nVDbpRuF9Uqp75mX1jUUaiYNLYTd2FwaBQmqZIIVUKQBg53cU_8MBKpKPtw2md6PflDkeaiq4CCeuoiGvQlQGK/s1600/Development+Network+Machines.gif&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;Each of our VMs is named after a
Futurama character and has its own distinct colour scheme. (NB: They have a fully-qualified name too, like DVL-SQLALPHA, that describes their actual role.) This helps developers stay oriented when RDP-ing around
what would otherwise be nearly-identical machines. &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;It’s also fun. &lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;You saw how TeamCity / Professor Farnsworth looked above. This is how one of our Web Servers, characterised after Zapp Brannigan, looks. As you can see, it&#39;s easy to tell which VM you&#39;re on, even from a distance:&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMYxUj2yvwI_0JO_cNthXgljmGNR419QfvwhL78Xa7zfQMLQwuAJhnKeMWr3eDGTUhaJlInSNgqM6m6XrXWpvYb9xPb-iyCGsEhxJMu_kyZFkneh4hoHN_rSp3I8cfhK1acOUxuRvlfLZ1/s1600/Zapp.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMYxUj2yvwI_0JO_cNthXgljmGNR419QfvwhL78Xa7zfQMLQwuAJhnKeMWr3eDGTUhaJlInSNgqM6m6XrXWpvYb9xPb-iyCGsEhxJMu_kyZFkneh4hoHN_rSp3I8cfhK1acOUxuRvlfLZ1/s640/Zapp.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;

&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;

&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;There are Futurama-themed Easter Eggs hidden in other parts
of our build process too. e.g., each CI build produces a log file. At the end of
which, a build gets reported as “Successful” or “Failed” for some detailed
reason. A recent evening in my own time, I wanted to test implementing custom
NAnt functions. (NAnt is written in C#, and you can write functions in C# to
augment what it does.) In order to test this with something non-critical, I
augmented that custom “Success” or “Failure” method thus:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;

&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;

&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0cm;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCjVg4CxPD8BF6ObGCmkbC9URTYUA1UFobXJT6h99N5hSugi7n9dAIu96lJWI54wrV3uS-tMxYXVNZ5e2oXoXb_UP1sKqtymhO2WolhMKOk3mr-2xsfR2bg3BBtIuRSj_h4gt0FWIx8iEh/s1600/ASCII+Art.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;348&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCjVg4CxPD8BF6ObGCmkbC9URTYUA1UFobXJT6h99N5hSugi7n9dAIu96lJWI54wrV3uS-tMxYXVNZ5e2oXoXb_UP1sKqtymhO2WolhMKOk3mr-2xsfR2bg3BBtIuRSj_h4gt0FWIx8iEh/s640/ASCII+Art.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;

&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0cm;&quot;&gt;
&lt;/div&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;

&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0cm;&quot;&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;The exact piece of ASCII art that
gets rendered reflects whether the build was successful or not, and is semi-random.
So, you might get Hermes with a brain slug saying something dumb if the build
is broken. Or you might get Professor Farnsworth announcing “Good news,
everyone!” if all went as planned.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;These &#39;features&#39; are of course whimsical. But at worst they give developers a smile during some of the tougher moments of the job. And at best they give you a chance to test out new techniques on non-critical features. As well as giving your brain a rest between more intensive tasks.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;The best teams&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp; &lt;/span&gt;I’ve worked with all knew their onions on a
technical level, but also knew when to have fun too. I&#39;m glad to be working in such a team at present. e.g., I recently implemented the
following function:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;

&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;

&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjy5IdUXji9FOzhnbMWhSB1SaeX6s-E-je0Vb3xKN3lzPR4aed3rL1fL11bgf1cYBdBJ438Gd5YWkO8klFsIr2JvCZUFAbeWOf-UgSLxd_LJC8lw1eeq44wSS6UP2wmNx0XavsufZTO_AWm/s1600/StarBar.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;336&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjy5IdUXji9FOzhnbMWhSB1SaeX6s-E-je0Vb3xKN3lzPR4aed3rL1fL11bgf1cYBdBJ438Gd5YWkO8klFsIr2JvCZUFAbeWOf-UgSLxd_LJC8lw1eeq44wSS6UP2wmNx0XavsufZTO_AWm/s640/StarBar.gif&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;

&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;

&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0cm;&quot;&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt; line-height: 107%;&quot;&gt;My colleague Ian made me chuckle
when I discovered this in our code repository a few weeks later:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;

&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVe6t5da9LSF7OIqX4tYpentYTqGnoFBsPBOVwRVqpPGsIcOnyN5kAzQg0OP7ezSBUb-mpVpOJCJ98OTz3ctoyIxXnrVlNhUFqzctPrf1bcfeCOLVuH8l86WXLXMI38HdAI6OkdnWoAG0u/s1600/RageBar.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;302&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVe6t5da9LSF7OIqX4tYpentYTqGnoFBsPBOVwRVqpPGsIcOnyN5kAzQg0OP7ezSBUb-mpVpOJCJ98OTz3ctoyIxXnrVlNhUFqzctPrf1bcfeCOLVuH8l86WXLXMI38HdAI6OkdnWoAG0u/s640/RageBar.gif&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState=&quot;true&quot; LatentStyleCount=&quot;156&quot;&gt;
  &lt;w:LsdException Locked=&quot;true&quot; Name=&quot;Default Paragraph Font&quot;/&gt;
  &lt;w:LsdException Locked=&quot;true&quot; Name=&quot;No List&quot;/&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:Calibri;
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
&lt;/style&gt;
&lt;![endif]--&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/8751981169046094960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/8751981169046094960'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/2015/12/building-total-quality-software.html' title='Building a Total Quality Software environment, with Continuous Integration, Unit Testing, and Dependency Injection. And Futurama.'/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhR0nW8dAR-1ssO9PofTkQ6R1s6BOm06a2RiOHi9k3MOOaQMI3kSzWIi8CD3aPKKNBRTtKMaSbJF2YCRvej_9DPTdk7RxuDeKeZ5na2kuUQEWZuLgwV6A1V2nK-O3yyL41ZLs23PrOT4wnA/s72-c/TeamCity.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7818882524515880477.post-5684685673453829389</id><published>2015-10-10T19:40:00.003+01:00</published><updated>2015-11-07T19:59:08.252+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Product Reviews"/><title type='text'>Product Review - Wrappz Laptop Decals and Custom Phone Skins </title><content type='html'>&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
 &lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;br /&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState=&quot;false&quot; LatentStyleCount=&quot;156&quot;&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
&lt;/style&gt;
&lt;![endif]--&gt;

&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Like many developers, I get
my money&#39;s worth out of the laptops I buy. Sometimes it seems I use them every
minute of the day. And, over the years, I&#39;ve accumulated quite a collection of
physical machines in addition to the various VMs I have carrying out miscellaneous
tasks around the house. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;I secretly love the
obviously-marketed-at-women ones that have cases made of pink brushed aluminium and the like.
But, also being a professional developer, I have to say that almost always that
fancy case comes accompanied by last year&#39;s technology (or older.) It simply
isn&#39;t a good business decision to buy them when you review the spec.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwbdjAs0n28ZM0EkDoHR0Z5b9v-2yxnJS95s-7B2DgpmERXFHQ2Y5emPZTazi7OgtPUmV00GVkl2Tlt_Wah5NFrFxcp_GWg0yukIhhGxlk3KW9bwR-aGMFNTQkW1k2ghlhYpZhNhHqfIha/s1600/Pink+Laptop.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;244&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwbdjAs0n28ZM0EkDoHR0Z5b9v-2yxnJS95s-7B2DgpmERXFHQ2Y5emPZTazi7OgtPUmV00GVkl2Tlt_Wah5NFrFxcp_GWg0yukIhhGxlk3KW9bwR-aGMFNTQkW1k2ghlhYpZhNhHqfIha/s320/Pink+Laptop.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;As a wise philosopher once said, I&#39;m a Barbie Girl in a Barbie World.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;So, I often end up buying
machines that have phenomenally-fast dual/quad processors with acres of RAM capable of running lots of memory-intensive applications concurrently. And
I switch out the standard platter drive for a 1 TB SSD. (I usually also swap out
the optical drive for a second 1TB SSD. And &lt;a href=&quot;http://www.amazon.co.uk/gp/product/B010UFKDHY&quot; target=&quot;_blank&quot;&gt;2TB SSDs&lt;/a&gt; that I&#39;ve not yet had a chance
to get my hands on have also now become available, so my next dev machine will have 4TB total, but that&#39;s really a
different review.)&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Anyway, for some reason the
most performant laptops always seem to come in boring black boxes. When you
acquire a few of these over the years, it becomes difficult to tell them apart.
So for a few years now I&#39;ve been putting decals on the back and naming the
machine according to which decal adorns it. I also make the &lt;a href=&quot;http://www.howtogeek.com/112110/how-to-set-a-custom-logon-screen-background-on-windows-7/&quot; target=&quot;_blank&quot;&gt;login screen&lt;/a&gt; and
&lt;a href=&quot;http://windows.microsoft.com/en-gb/windows/change-desktop-background-wallpaper#1TC=windows-7&quot; target=&quot;_blank&quot;&gt;desktop background&lt;/a&gt; of these machines match the decal. This all helps keep you
oriented when you&#39;re navigating around, RDP-ing from one machine to another.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTkOwtYwc5AZr1JAVsa3rWFBhbcw3SyGiLMWIg59mii6bTcu0D5wTjCLxDhhorVsnIzgzc_Y9AGigHm5C6zFP2-0Lm0uUcG3y3eLoh4TkA-lx48Fu55ezZ0hbhAaBas2RFo_UIOgX72NDU/s1600/TaylorHe+Decals.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;61&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTkOwtYwc5AZr1JAVsa3rWFBhbcw3SyGiLMWIg59mii6bTcu0D5wTjCLxDhhorVsnIzgzc_Y9AGigHm5C6zFP2-0Lm0uUcG3y3eLoh4TkA-lx48Fu55ezZ0hbhAaBas2RFo_UIOgX72NDU/s400/TaylorHe+Decals.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;TaylorHe Decals&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Up to now, my go-to decal
manufacturer has been &lt;a href=&quot;http://www.amazon.co.uk/15-6-inch-TaylorHe-Skins/b/ref=bl_dp_s_web_3782108031?ie=UTF8&amp;amp;node=3782108031&amp;amp;field-lbr_brands_browse-bin=15.6+inch+TaylorHe+Skins&quot; target=&quot;_blank&quot;&gt;TaylorHe&lt;/a&gt;. They do some very nice pre-made patterns that
suit almost every taste. With my new work laptop, however, I fancied doing
something a bit more bespoke. I&#39;m a huge Breaking Bad fan, so I wanted a
machine that had a theme related to that.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;&amp;nbsp;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpeLn30r2FrJU-lqGutpfi2iBLZxGmL6p-T-InzTyu3PaHu0Ol_O6kPE5jBTC9sscZzoR8jMhG6pmJrYvpSHZKqTCbZW_9v9RRG1P21owHh3w8Vc5U3Sw78dbh2poaO9-m_G_SKbi9Txiv/s1600/Heisenberg.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;414&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpeLn30r2FrJU-lqGutpfi2iBLZxGmL6p-T-InzTyu3PaHu0Ol_O6kPE5jBTC9sscZzoR8jMhG6pmJrYvpSHZKqTCbZW_9v9RRG1P21owHh3w8Vc5U3Sw78dbh2poaO9-m_G_SKbi9Txiv/s640/Heisenberg.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Since the device that I usually take pictures with is in this photo, my friend Ian O&#39;Friel&lt;br /&gt;
kindly helped me take this. Which made it a much better photo than it would otherwise have &lt;br /&gt;
been as he has a real eye for photography. (You can see more of &lt;a href=&quot;https://www.flickr.com/photos/ianjofriel/&quot; target=&quot;_blank&quot;&gt;Ian&#39;s fab photos here&lt;/a&gt;. I &lt;br /&gt;
particularly like the one of the old rusty gate and the South Side At Night.)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt; &lt;/span&gt;

&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1cAMvdBO4i2DuqrUGla3nyYTMBaErUByNYZS5txBIn737-vj6ftxJRZKvVM3Ko6YSN4wp20V9uuGhMSTGmcAcNf09I3qHJNo9Zs-2p4ZaUsWX1pQKg-hT4SHIU-WJfrUcbvr44zZqlm53/s1600/wrappz-logo.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1cAMvdBO4i2DuqrUGla3nyYTMBaErUByNYZS5txBIn737-vj6ftxJRZKvVM3Ko6YSN4wp20V9uuGhMSTGmcAcNf09I3qHJNo9Zs-2p4ZaUsWX1pQKg-hT4SHIU-WJfrUcbvr44zZqlm53/s1600/wrappz-logo.png&quot; /&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Looking around, I found a
company called &lt;a href=&quot;http://www.wrappz.com/&quot; target=&quot;_blank&quot;&gt;Wrappz&lt;/a&gt; that provides exactly this type of product. Not only do
they produce decals with custom designs, but they also print them on a
custom-sized sheet. So you don&#39;t have to trim them to fit your machine. This may seem like a
small advantage, but it was nice just to be able to use them out of the box
like that rather than messing around with a scalpel or scissors. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Like TaylorHe, Wrappz also do
custom phone cases. So I got one of those to match the decal. (Not that I actually own a
phone, incidentally - I&#39;m one of the few people I know that doesn&#39;t use one,
and doesn&#39;t miss it. I have a Samsung Galaxy S2 &#39;phone&#39;, but it acts as a personal
organiser rather than as a communication device. I only put a temporary SIM in
it when I have a reason to, which is almost never.)&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;If you want to order some of
these decals / phone cases for yourself, here are some discount codes you can use to get them more
cheaply. NB: I&#39;ve got no commercial relationship with Wrappz, and I haven&#39;t benefitted in
any way from this review. Also, I won&#39;t know whether anyone has used these codes:&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;&amp;nbsp;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibJHQCPrUZPD-dMy07EOKfR7u40xfP3LuHJXnJwzD516ZWxff4rPScVUmpktxXw1XE6RziK61XovzDM6G64Xs8B9fih5Prtxb83uYTO_pH8cMi0K23rGR5qnmBY7DiYARaY4UfFK8gGzdp/s1600/Wrappz+25pc+off.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;173&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibJHQCPrUZPD-dMy07EOKfR7u40xfP3LuHJXnJwzD516ZWxff4rPScVUmpktxXw1XE6RziK61XovzDM6G64Xs8B9fih5Prtxb83uYTO_pH8cMi0K23rGR5qnmBY7DiYARaY4UfFK8gGzdp/s320/Wrappz+25pc+off.gif&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Wrappz discount codes&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkVGWnqNHECcSjLguhK80poOtlSxSpiZlfTQOdlJwixnNH3tG22W_g6H2VAGf7S_okQLt9ribkmABGXZY8i3LWx0yfYvZ4qxAKS8IGPCX1-rHUI8IqS6Tzf8bzHuMO1RXaV4uAtJ7ERiTC/s1600/Wrappz+Discount+Codes.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkVGWnqNHECcSjLguhK80poOtlSxSpiZlfTQOdlJwixnNH3tG22W_g6H2VAGf7S_okQLt9ribkmABGXZY8i3LWx0yfYvZ4qxAKS8IGPCX1-rHUI8IqS6Tzf8bzHuMO1RXaV4uAtJ7ERiTC/s640/Wrappz+Discount+Codes.gif&quot; width=&quot;449&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;More Wrappz discount codes&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Last small tip for those who,
like me, have multiple laptops in their network to access. You can place the
name of each machine in the Task Bar by creating a new Toolbar, and calling it
&quot;\\%computername%&quot;, &lt;a href=&quot;http://www.nextofwindows.com/how-to-show-your-computer-name-on-the-taskbar-in-windows-7-just-in-one-step&quot; target=&quot;_blank&quot;&gt;as described here&lt;/a&gt;. It makes it amazingly easy to
see which machine you&#39;re on, even if you have a full-screen program running,
and even if you&#39;re accessing it from another physical device.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4F7nZETqqhpn5cbjE2_cmxhBaEEc4iXuXRNllZX_qV__r9qokjhqUAeziYODBxl7Ld2ORyfMRslDWeONy10iX0VZVBnoZXHY7IxcEuzLp8Kg10MZo8vK3Emv-gSRMTq8Hn5EiWxcb47PH/s1600/Computer+Name+on+Task+Bar.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;356&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4F7nZETqqhpn5cbjE2_cmxhBaEEc4iXuXRNllZX_qV__r9qokjhqUAeziYODBxl7Ld2ORyfMRslDWeONy10iX0VZVBnoZXHY7IxcEuzLp8Kg10MZo8vK3Emv-gSRMTq8Hn5EiWxcb47PH/s640/Computer+Name+on+Task+Bar.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Computer Name on Task Bar&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/5684685673453829389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/5684685673453829389'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/2015/10/product-review-wrappz-laptop-decals-and.html' title='Product Review - Wrappz Laptop Decals and Custom Phone Skins '/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwbdjAs0n28ZM0EkDoHR0Z5b9v-2yxnJS95s-7B2DgpmERXFHQ2Y5emPZTazi7OgtPUmV00GVkl2Tlt_Wah5NFrFxcp_GWg0yukIhhGxlk3KW9bwR-aGMFNTQkW1k2ghlhYpZhNhHqfIha/s72-c/Pink+Laptop.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7818882524515880477.post-6111889734702069943</id><published>2014-12-14T16:37:00.001+00:00</published><updated>2015-01-12T17:24:59.750+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Product Reviews"/><category scheme="http://www.blogger.com/atom/ns#" term="Running"/><title type='text'>Product Review - LED Lenser LED7299R H14R.2 Rechargeable Head Torch</title><content type='html'>&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
 &lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;

&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI37hoC8y-pVcprqG_V1jUvaRqJoDdY87D_wvaGF-BKhyphenhyphen34ZGaE1yEuM9HdnSy8qwl8gYBaJeNiEzyKP3wDCFBHtTF9d2PH2PIMuLOf8BJNVKoj2kIAH_M44PtA4GDtmRJMqL0NmWELye5/s1600/LED+Lenser+H14+R2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI37hoC8y-pVcprqG_V1jUvaRqJoDdY87D_wvaGF-BKhyphenhyphen34ZGaE1yEuM9HdnSy8qwl8gYBaJeNiEzyKP3wDCFBHtTF9d2PH2PIMuLOf8BJNVKoj2kIAH_M44PtA4GDtmRJMqL0NmWELye5/s1600/LED+Lenser+H14+R2.jpg&quot; height=&quot;293&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;I bought one of these for
running during the Winter months, when you inevitably find yourself having to
make some runs in the dark or twilight.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;There are plenty of options
out there - ranging from an offering at &lt;a href=&quot;http://www.tesco.com/direct/uni-com-ultra-bright-3-led-head-torch/106-7812.prd&quot;&gt;£5
from Tesco&lt;/a&gt;, right the way through to &lt;a href=&quot;http://www.amazon.co.uk/Hollis-Canister-LED25-Complete-Diving/dp/B0081M79DA/ref=sr_1_4&quot;&gt;Hollis
Canister diving head torches&lt;/a&gt; at £800. Obviously, there’s a trade off
between getting what you pay for, choosing a light that’s suitable to your
purpose, and not spending more than you need to.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;After checking out other
reviews for several different options, I opted for the &lt;a href=&quot;http://www.ffx.co.uk/tools/product/Led%20Lenser%20Led7299R%204029113729932%20H14R.2%20Rechargeable%20Head%20Torch&quot;&gt;LED
Lenser LED7299R H14R.2 Rechargeable Head Torch&lt;/a&gt;. You can spend anything from
£90 to £130 depending on where and when you choose to buy this model. There’s
also a similar-but-cheaper model in the same range that isn’t rechargeable. (No
reason that you couldn’t buy separate rechargeable batteries of course.)
However, I liked the convenience of having the recharging unit built in. It can alternatively take four conventional AA batteries, which you can use as a backup.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;For running, it was important
that the torch had enough light output to be able to see in pitch darkness on unlit trails with occasional tree cover that blocks ambient light. It
was also important that it was comfortable to run with. A lot of runners
recommended the Petzl range of head torches. I can see why. They’re a lot
lighter than the one I chose (whilst at the same&amp;nbsp; time being a lot dimmer - typically about a
third to a quarter of the light output.) My main criticism of the LED Lenser
H14 R2 is that it can feel a bit hard and uncomfortable on your head,
particularly the front torch holder. A softer, more padded material behind the
lamp would have made it much more useable. As is, it’s more comfortable with a beanie hat
underneath, but I wouldn’t fancy trying to run with it overnight in the Summer
when a hat would make you overheat.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;In terms of light output, it was difficult to find reliable information. The minimum light output was fairly consistently reported by various sources to be 60 &lt;a href=&quot;http://en.wikipedia.org/wiki/Lumen_%28unit%29&quot;&gt;Lumens&lt;/a&gt;. The product box and the &lt;a href=&quot;http://www.ffx.co.uk/tools/product/Led%20Lenser%20Led7299R%204029113729932%20H14R.2%20Rechargeable%20Head%20Torch&quot;&gt;site where I bought it&lt;/a&gt; both say the maximum output is 850 Lumens. Other sources quoted as low as 260 to 350 Lumens.There appears therefore to be some confusion about what is meant by &quot;maximum&quot;. Namely, the torch has a &#39;boost&#39; setting that increases brightness for 10 seconds at a time. However, there is a second definition which is the maximum brightness that the torch is able to consistently maintain. I suspect this distinction accounts for many of the differences reported by different sources.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;60 Lumens is about as good as the
majority of the Petzl range. The brightest setting for the H14 R2, whatever the real value in Lumens,&amp;nbsp; is a very bright light
that is uncomfortable to look at directly at the highest setting. The very highest setting (known as the &quot;boost&quot; setting) only stays on for 10 seconds at a time. Most of the rest of the time, I used it at the highest &#39;stable&#39; setting. &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;On that highest constant-current setting, the
light can be diffused over an area about 5m wide and 10m far directly in front of you. You can also elect to have a narrower but more intense beam. The specs say it will
project light up to about 260m. I found that not to be the case, though I did
stick to the “wide and bright” setting throughout my run. Perhaps the boost setting when combined with the narrowest beam &lt;i&gt;would&lt;/i&gt; momentarily illuminate the farther &quot;260m&quot; distance quoted for 10 seconds at a time; I didn&#39;t test that, because such brief and narrow momentary brightness isn&#39;t relevant for my use case or many others I can imagine. I did test the range on the max consistent setting combined with a wide beam when I returned to my car. I found that whilst that setting is quite good enough for running/walking in the pitch dark by allowing you to see what&#39;s immediately in front of you, the light didn’t even
make it across to the trees at the far end of the 100m or so car park I was in.
I’ll try it again on the “narrow beam, temporary boost” setting during my next night run.
However, whilst I suspect that the specs are technically correct and that objects will be
able to be illuminated at that distance, albeit briefly, it is only with a beam that’s about 1m
wide. It&#39;s for the reader to decide whether that performance meets their actual needs.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;I found the light was good
enough for my use case. I ran during astronomical twilight (the third darkest
phase of the night; pretty much pitch black for the purposes of this test.)
Without the torch, I would just about have been able to see my hand in front of
my face in open ground, but not the path I was running on. On stretches covered by trees, it&#39;d have been completely dark. As it was, I missed a pothole in the
same forested location (once on the way out, and once on the way back.) I couldn’t see
how I’d done this at the time, as I felt I’d been seeing the path well enough
to run at a normal pace. I stumbled at the exact same spot &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;again&lt;/i&gt;, however the very next day during daylight. So, it just
appeared to be a particularly well-camouflaged pothole, rather than a failing
of the torch.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;The final lighting feature of note in this torch is the rear red light that you can turn on to allow traffic and cyclists to see you more easily. I thought that was a nice little safety feature. Although, there&#39;s no real way to tell if it&#39;s on or off once you have the torch on, and the button is very sensitive. Other non-lighting features include a battery-power indicator (the rear LED glows red, amber or green for five seconds when you switch it on, to let you know how charged up the battery is.) I&#39;ve used mine for less than an hour so far, and it&#39;s still in the green from its first charge. I&#39;ll update this review with how long a full charge lasts when I&#39;ve gone through a full cycle. Lastly, you can detach the battery pack (and the front torch itself if you want) and wear them as a belt attachment. I personally prefer the light being cast wherever I&#39;m looking, and didn&#39;t find the battery pack intrusive where it was, so haven&#39;t used this option.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;The last point I want to note about this product isn&#39;t about the torch itself. It&#39;s about the user manual that comes with it. For a top-of-the-range piece of kit, the quality of the instruction manual translation leaves a lot to be desired. It&#39;s some of the worst Deutsch-glish I&#39;ve ever seen. Take this excerpt for example:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihCD498Nd6w13wfd0SYEW7dOSdowPq_jM01oi3X6Ql_cOTq2Q5p0FeLsT6LTLBnsRlhar_B_M0h5pXqhj5NWDMp-_fNIqWLjhi746t0A8xB_3-COwjc1fbc7W9uHKfpSqsMCLz-x1464Y1/s1600/Instruction+Manual+Deutschglish.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihCD498Nd6w13wfd0SYEW7dOSdowPq_jM01oi3X6Ql_cOTq2Q5p0FeLsT6LTLBnsRlhar_B_M0h5pXqhj5NWDMp-_fNIqWLjhi746t0A8xB_3-COwjc1fbc7W9uHKfpSqsMCLz-x1464Y1/s1600/Instruction+Manual+Deutschglish.gif&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;It&#39;s so bad that at first I thought I might have been sent a fake item, since I couldn&#39;t imagine any self-respecting manufacturer allowing such a poorly-translated document to accompany their product. But, the supplier I used (ffx.co.uk&#39;s) bona fides checked out. And, checking with LED Lenser&#39;s own website, it seems that they&#39;ve just done a very bad job of translating the user manual of an otherwise very good product. You can read the full manual (downloaded from LED Lenser&#39;s US site) for yourself &lt;a href=&quot;https://www.ledlenserusa.com/on/demandware.static/Sites-leatherman-Site/Sites-master/en_US/v1419017173239/userGuides/H14R-2-Manual.pdf&quot;&gt;here&lt;/a&gt;.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgo86w99TK5vUPamndHDqHxreej0pYyQAGXV95o2AmdAptHgBvvbSSOmHBaNfpf-ikTEY47qu8yOelaIj21QoOX2U0efehIFzu-b9gWu_-MO1qALM5MI5qUgtuQI-nZeu5YW5IBNP-XnaAv/s1600/Instruction+Manual+Deutschglish.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgo86w99TK5vUPamndHDqHxreej0pYyQAGXV95o2AmdAptHgBvvbSSOmHBaNfpf-ikTEY47qu8yOelaIj21QoOX2U0efehIFzu-b9gWu_-MO1qALM5MI5qUgtuQI-nZeu5YW5IBNP-XnaAv/s1600/Instruction+Manual+Deutschglish.gif&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;All-in-all, I’m glad I bought
this piece of kit. It’s good enough for what I need it for. The head harness could be a
little more comfortable, but it’s very usable for its intended purpose
nonetheless. I feel a Petzl and other cheaper options would probably not have
been bright enough for what I need. And other more expensive options would have
been brighter still, but wouldn’t have been designed to wear out of water. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;Times New Roman&amp;quot;; font-size: 13.0pt; mso-ansi-language: EN-GB; mso-bidi-language: AR-SA; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: EN-GB;&quot;&gt;Not a bad purchase : 7/10&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Times New Roman&amp;quot;; font-size: 12.0pt; mso-ansi-language: EN-GB; mso-bidi-language: AR-SA; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: EN-GB;&quot;&gt; &lt;/span&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState=&quot;false&quot; LatentStyleCount=&quot;156&quot;&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0pt 5.4pt 0pt 5.4pt;
 mso-para-margin:0pt;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
&lt;/style&gt;
&lt;![endif]--&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/6111889734702069943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/6111889734702069943'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/2014/12/product-review-led-lenser-led7299r.html' title='Product Review - LED Lenser LED7299R H14R.2 Rechargeable Head Torch'/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI37hoC8y-pVcprqG_V1jUvaRqJoDdY87D_wvaGF-BKhyphenhyphen34ZGaE1yEuM9HdnSy8qwl8gYBaJeNiEzyKP3wDCFBHtTF9d2PH2PIMuLOf8BJNVKoj2kIAH_M44PtA4GDtmRJMqL0NmWELye5/s72-c/LED+Lenser+H14+R2.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7818882524515880477.post-4032972335567379178</id><published>2014-02-20T16:29:00.001+00:00</published><updated>2014-02-27T19:53:14.517+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cloud Computing"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><title type='text'>Scalability, Performance and Database Clustering.</title><content type='html'>&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:WordDocument&gt;   &lt;w:View&gt;Normal&lt;/w:View&gt;   &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:PunctuationKerning/&gt;   &lt;w:ValidateAgainstSchemas/&gt;   &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:Compatibility&gt;    &lt;w:BreakWrappedTables/&gt;    &lt;w:SnapToGridInCell/&gt;    &lt;w:WrapTextWithPunct/&gt;    &lt;w:UseAsianBreakRules/&gt;    &lt;w:DontGrowAutofit/&gt;   &lt;/w:Compatibility&gt;   &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:WordDocument&gt;   &lt;w:View&gt;Normal&lt;/w:View&gt;   &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:PunctuationKerning/&gt;   &lt;w:ValidateAgainstSchemas/&gt;   &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:Compatibility&gt;    &lt;w:BreakWrappedTables/&gt;    &lt;w:SnapToGridInCell/&gt;    &lt;w:WrapTextWithPunct/&gt;    &lt;w:UseAsianBreakRules/&gt;    &lt;w:DontGrowAutofit/&gt;   &lt;/w:Compatibility&gt;   &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;b&gt;&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt; &lt;/span&gt;&lt;/b&gt; &lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:LatentStyles DefLockedState=&quot;false&quot; LatentStyleCount=&quot;156&quot;&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-size: 13.0pt; font-family:&quot;Times New Roman&quot;;
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
&lt;/style&gt; &lt;![endif]--&gt;  &lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 15.0pt;&quot;&gt;What the Exxon Valdez and database clusters have in common&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:LatentStyles DefLockedState=&quot;false&quot; LatentStyleCount=&quot;156&quot;&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-size: 13.0pt; font-family:&quot;Times New Roman&quot;;
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
&lt;/style&gt; &lt;![endif]--&gt;  &lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;I was recently asked to comment on the proposed design for a project by a prospective new customer. The project involved a high number of simultaneous users, contributing small amounts of data each, and was to be hosted in the Cloud. The exact details were To Be Decided, but Amazon EC2 and MySQL were floated as likely candidates for the hosting and RDMS components. (Although my ultimate recommendations would have at least considered using SQL Azure instead, given some of the time constraints and other technologies involved that would have dovetailed into the wider solution.) &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_l__xusTRZ11_kSWu-0c2J0oQWWiQxJzE_6yQpQ_GMaeR0kxe59Y4Z8qItGfeeZ0d6fX7lAnqVdRNlF_zcZskgNi-SibPiIpN0QBvJEqtYDHGLl4g-qIrNcCnEdJyIW2w0RFWdiOQTX-_/s1600/cluster_balloon.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_l__xusTRZ11_kSWu-0c2J0oQWWiQxJzE_6yQpQ_GMaeR0kxe59Y4Z8qItGfeeZ0d6fX7lAnqVdRNlF_zcZskgNi-SibPiIpN0QBvJEqtYDHGLl4g-qIrNcCnEdJyIW2w0RFWdiOQTX-_/s1600/cluster_balloon.jpg&quot; height=&quot;320&quot; width=&quot;256&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;The discussion got me thinking about the topic of database clustering, as it relates to performance and scalability concerns. During the course of the discussion of the above project with the client’s Technical Director, it transpired that, despite the organisation concerned having used clustering in an attempt to improve performance previously, that approach had failed.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;The above discussion didn’t surprise me. It’s a misunderstanding I’ve witnessed a number of times, whereby people confuse the benefit that database clustering actually bestows. In short, people often believe that using such a design aids scalability and performance. Unfortunately, this isn’t the case. What such an architecture actually provides is increased &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;reliability&lt;/i&gt;, not performance. (It’s actually less performant than a standalone database, since any CRUD operations need to be replicated out to duplicate databases). Which is to say that if one database goes down, another is in place to quickly take over and keep processing transactions until the failed server can be brought back online.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;The analogy I usually give people when discussing the benefits and limitations of clustering is that it’s a bit like the debate about double hulls on oil tankers. As you may know, after the Exxon Valdez disaster the US Government brought in legislation that stated every new oil tanker built for use in US ports was to be constructed with double hulls. The aim was admirable enough: to prevent such an ecological disaster from ever happening again. However, it was also a political knee-jerk reaction of the worst kind. Well intentioned, but not based on measurable facts. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;Of perhaps most relevance to the topic was the small fact that those parts of the Exxon Valdez that were punctured &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;were&lt;/i&gt; in fact double-hulled (the ship was punctured on its underside, and it was double-hulled on that surface). Added to this is the fact that a double hull design makes ships less stable, so they’ll be that little bit more likely to collide with obstacles that more manoeuvrable designs can avoid . And, just like in database clustering, the added complexity involved actually reduces capacity. (In the case of ships, the inner hull is smaller; in databases the extra replication required means less transactions can be processed in the same amount of time with the same processing power.) &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;As with all things, the devil is in the details. You can design clustered solutions to minimise the impact of replication (e.g., if you make sure the clustered elements of your schema only ever do INSERTs, the performance hit will be almost negligible). But, many people just assume that because they are clustering that in itself will automagically increase performance, and it’s that misconception that leads to most failed designs.&lt;/span&gt; &lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;I’ve been involved in a couple of projects that involved either large amounts of data in one transaction impacting on a replicated database, or large numbers of smaller individual transactions being conducted by simultaneous users. In neither case, in my experience, was clustering a good solution to the design challenges faced.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;The first project I have as a point of reference was one I worked on back in 2007, that involved a business intelligence application that collected around a million items of data a month via a userbase of 400 or so. I was the lead developer on that 7-person team, and so had complete control over the design chosen. I also had the advantage of having at my disposal one of the finest technical teams I’ve ever worked with. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;The system involved a SQL Server database that was used by around 30 back office staff, OLAP cubes being built overnight for BI analysis, and certain sub-sections of the schema being replicated out to users that accessed the system via PDAs over GPRS (which of course will have been replaced by 3G / 4G now). The PDA users represented the bulk of those 400 users of the system.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;The design we settled upon was one that traded off normalisation and database size for the least impact on those parts of the schema that needed to be replicated out to the PDAs. So, CRUD updates made in the back office system were only transferred to near-identical, read-only tables used by the PDAs once an hour (this could be fine-controlled during actual use to aid performance or to speed up propagation of information as required). This approach meant that the affected tables had less sequential CRUD operations to be carried out whenever the remote users synched over their low-bandwidth connections. And if they were out of range of connectivity at all, their device still worked using on-board, read-only copies of the backoffice data required. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;The second main consideration in the design involved a large data import task that happened once every six weeks. One of my developers produced a solution that was algorithmically sound, but that quickly reached the limitations of what an ORM-driven approach can do. In short, it took several hours to run, grinding through thousands of individual DELETE, INSERT and UPDATE statements. And if any consistency errors were found in the data to be imported (which was not an uncommon occurrence) the whole process needed to be gone through again, and again, until eventually it ran without hiccups. It wasn’t uncommon to take a skilled DBA 24 hours to cleanse the data and complete the import task successfully. Meanwhile, the efficiency of those replicated parts of the schema used by the PDAs would be taking a battering. A better approach was needed.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;In the end, I opted for using SQL Server’s XML data type to pass the bulk upload data into a stored procedure in a single transaction. Inside the procedure, wrapped in a reversible TRANSACTION, just those parts of the data that represented actual changes were updated. (E.g., it wasn’t uncommon in the imported data to have a DELETE instruction, followed by an INSERT instruction that inserted exactly the same data; the stored proc was smart enough to deal with that and only make those changes that affected the net state of the system). I designed the stored proc so that any errors would cause the process to be rolled back, and the specific nature of the error to be reported via the UI. The improved process ran in under a second, and no longer required the supervision of a DBA. Quite a difference from 24 hours. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;The second project that informs my views of clustered database designs was one that I wasn’t the design authority on. In this case, I was just using the database(s) for some other purpose. Prior to my involvement, a SQL Server cluster involving three instances of the database was set up, and kept in sync. The solution was designed for use by a vendor of tickets for all sorts of events, including popular rock concerts. It wasn’t an uncommon occurrence for the tickets to go on sale, and for an allocation of many thousands to be sold out in literally ten seconds flat, as lots of fans (and I’m sure ticket touts too) sat feverishly pressing F5, waiting for the frenzy to start. (And sometimes, if the concert organiser got their price point wrong, you’d find that only a few tickets were sold for an over-priced event, but that’s another story!)&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;In the case of this design, I never did see the failover capabilities come into play. Which is to say that each of the three SQL Server instances that replicated the same data for reliability reasons all stayed up all of the time. I had a feeling that if one ever went down for reasons of load, however, it wouldn’t have been long before the others would have suffered the same fate. And since it was an on-premise deployment rather than being cloud-based, something like a power cut would have stopped the show dead. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;It’s not that common for hardware to fail just because a high number of requests are being made simultaneously. All that will happen is that some users won’t get through (and you as the site owner will never know that was the case). It’s not like the server will shut down in shock. Even the recent low-tech attacks to large online retailers like Amazon using amateur tools like &lt;a href=&quot;http://en.wikipedia.org/wiki/Low_Orbit_Ion_Cannon&quot; target=&quot;_blank&quot;&gt;LOIC&lt;/a&gt; didn’t damage any critical infrastructure. At best, such conditions can saturate traffic for a short while. And often they don’t achieve even that much.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;As a final point, I’d note that there are far greater concerns when designing an authenticated, public-facing system, such as &lt;a href=&quot;http://en.wikipedia.org/wiki/Cross-site_request_forgery&quot; target=&quot;_blank&quot;&gt;CSRF vulnerabilities&lt;/a&gt;. Any attempt to address performance concerns by using clustering will inevitably adversely affect those security concerns. Because &lt;a href=&quot;http://www.codinghorror.com/blog/2008/09/cross-site-request-forgeries-and-you.html&quot; target=&quot;_blank&quot;&gt;commonly-accepted solutions&lt;/a&gt; to same typically rely on data being reliably saveable and retrievable across short time frames (rather than getting in sync eventually as most clustering solutions allow for). &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13.0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Times New Roman&amp;quot;; font-size: 13.0pt; mso-ansi-language: EN-GB; mso-bidi-language: AR-SA; mso-fareast-font-size: 13.0pt; mso-fareast-language: EN-GB;&quot;&gt;So, in summary, whilst there’s a place for database clustering for reasons of reliability, my earnest advice to anyone considering using that design for reasons of performance or scalability is to reconsider. There are usually changes you can make to your database schema itself that will have the same or better impact on the amount of data you can cope with in a short timeframe, and the impacts that data will have on your wider design. Don’t end up like &lt;a href=&quot;http://www.imdb.com/title/tt0584452/quotes?item=qt0318506&quot; target=&quot;_blank&quot;&gt;Fry from Futurama&lt;/a&gt;, lamenting how your design might have worked had you only used (n+1) hulls/servers rather than n :&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;object class=&quot;BLOGGER-youtube-video&quot; classid=&quot;clsid:D27CDB6E-AE6D-11cf-96B8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0&quot; data-thumbnail-src=&quot;https://ytimg.googleusercontent.com/vi/kagq_a-BkW8/0.jpg&quot; height=&quot;266&quot; width=&quot;320&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;https://youtube.googleapis.com/v/kagq_a-BkW8&amp;source=uds&quot; /&gt;&lt;param name=&quot;bgcolor&quot; value=&quot;#FFFFFF&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot; /&gt;&lt;embed width=&quot;320&quot; height=&quot;266&quot;  src=&quot;https://youtube.googleapis.com/v/kagq_a-BkW8&amp;source=uds&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitjy_YJbYh0U2acrIRASoLkSWjgyYFzu95wc9GBdq-Hqabxy3vPJo_bCkmHYCl5AX12e1IqA0I0tw5YYTWxaqiLa2mTMxqQIWkwwo5qtpdTEOWU3TOt6h4053L9RCV5OEqBaRo2frPhACX/s1600/SixThousandAndOneHulls.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitjy_YJbYh0U2acrIRASoLkSWjgyYFzu95wc9GBdq-Hqabxy3vPJo_bCkmHYCl5AX12e1IqA0I0tw5YYTWxaqiLa2mTMxqQIWkwwo5qtpdTEOWU3TOt6h4053L9RCV5OEqBaRo2frPhACX/s1600/SixThousandAndOneHulls.gif&quot; height=&quot;240&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/4032972335567379178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/4032972335567379178'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/2014/02/scalability-performance-and-database.html' title='Scalability, Performance and Database Clustering.'/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_l__xusTRZ11_kSWu-0c2J0oQWWiQxJzE_6yQpQ_GMaeR0kxe59Y4Z8qItGfeeZ0d6fX7lAnqVdRNlF_zcZskgNi-SibPiIpN0QBvJEqtYDHGLl4g-qIrNcCnEdJyIW2w0RFWdiOQTX-_/s72-c/cluster_balloon.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7818882524515880477.post-2682078483249443324</id><published>2013-07-16T20:46:00.000+01:00</published><updated>2015-05-05T12:56:30.706+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Management"/><category scheme="http://www.blogger.com/atom/ns#" term="People"/><title type='text'>Tools for Assessing Software Developers</title><content type='html'>&lt;div style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:WordDocument&gt;   &lt;w:View&gt;Normal&lt;/w:View&gt;   &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:PunctuationKerning/&gt;   &lt;w:ValidateAgainstSchemas/&gt;   &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:Compatibility&gt;    &lt;w:BreakWrappedTables/&gt;    &lt;w:SnapToGridInCell/&gt;    &lt;w:WrapTextWithPunct/&gt;    &lt;w:UseAsianBreakRules/&gt;    &lt;w:DontGrowAutofit/&gt;   &lt;/w:Compatibility&gt;   &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:LatentStyles DefLockedState=&quot;false&quot; LatentStyleCount=&quot;156&quot;&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
&lt;/style&gt; &lt;![endif]--&gt;  &lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;It’s been a while since I last wrote on the subject of how to hire great software developers and weed out any applicants that aren’t experienced enough for the more senior positions within your team. Given the advent of new tools that are available to conduct such interviews, I felt it was worth updating my previous advice on the subject.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLhvzh83L93UBipzlWbkL6u_rlgta76ybiArOV0rDAXs6xWxAiFtu5UuqflDJBI1f0nlzw-7t2xKzZe9A1yoxxHLP-8iUUH5P5T6PBzCjQg7zhdakXMNm7KFr2z4NSNVuhhZCODQUGk6ki/s1600/SkypeBlueSLargeWhiteBG.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLhvzh83L93UBipzlWbkL6u_rlgta76ybiArOV0rDAXs6xWxAiFtu5UuqflDJBI1f0nlzw-7t2xKzZe9A1yoxxHLP-8iUUH5P5T6PBzCjQg7zhdakXMNm7KFr2z4NSNVuhhZCODQUGk6ki/s1600/SkypeBlueSLargeWhiteBG.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;&lt;a href=&quot;http://www.skype.com/&quot; target=&quot;_blank&quot;&gt;Skype&lt;/a&gt; is probably the single biggest game-changer in technical recruiting in recent years. Particularly if distance is an issue, using Skype to conduct interviews is a no-brainer. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Previously, phone screens were the de facto best way of carrying out an initial sift of shortlisted candidates. And to be honest they were never that good of a predictive indicator. What’s different about Skype is that, provided the candidate in question has an IDE at home (and most experienced developers do) you can use it to quickly screen candidates’ coding ability. There’s nothing like seeing someone actually &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;using&lt;/i&gt; an IDE right from your very first ‘meeting’ to get a feel for whether the experience they profess to have on their CV actually translates into meaningful skills that they’re capable of applying to realistic business problems. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Skype allows you and the candidate to see one another. For the hirer, that enables you to get feedback from any non-verbal cues about their interest in the job and aptitude for same. It also allows you to screen-share, so you can see what they’re typing in real time in their IDE. In those respects, Skype is even better than trying to conduct a similar process in person, because you don’t need to crowd around a laptop screen or use a projector to be able to see them at work.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;So, by all means don’t rule any interesting CVs out on the mere grounds that the applicant doesn’t have a webcam, a development setup at home, or a fast enough internet connection to facilitate a video call. But if they do have those assets available it makes it much easier to confirm their ability in a matter of minutes, before either party has invested any great amount of time in the process.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;br /&gt;
&lt;/span&gt; &lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisdsxP5fD5fnlOXMFO-P1OMYglHYLUS1P2_XNUgAWBH2NyHFh6UP-i0eO8MrzLv22cwsSp46pUbSAw9FL6923elhM-qhpeyE4eTTk7IvU56tCUYfGHecWMzqmrQldaWC6EBl7XMnCNyXTv/s1600/GithubSmall.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; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisdsxP5fD5fnlOXMFO-P1OMYglHYLUS1P2_XNUgAWBH2NyHFh6UP-i0eO8MrzLv22cwsSp46pUbSAw9FL6923elhM-qhpeyE4eTTk7IvU56tCUYfGHecWMzqmrQldaWC6EBl7XMnCNyXTv/s1600/GithubSmall.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;The second biggest innovation in recent years, in my opinion, is &lt;a href=&quot;https://en.wikipedia.org/wiki/Github&quot; target=&quot;_blank&quot;&gt;Github&lt;/a&gt;. It’s always been desirable for candidates to provide code samples as a means of demonstrating their skill. However, previously you could never be sure that any work submitted was a candidate&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;’&lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;s own. Most candidates are honest. Just occasionally, however, you’d identify someone that had provided an impressive ‘code sample’, but who it later transpired couldn’t programme a tenner out of a cash machine. Wherever they had plagiarised such samples from, it was clear that they didn&#39;t actually understand them themselves. (&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Such antics are quite probably how &lt;a href=&quot;http://edition.cnn.com/2013/01/17/business/us-outsource-job-china/&quot; target=&quot;_blank&quot;&gt;this guy here&lt;/a&gt; got his job.) &lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;It’s a waste of both of your time if you only discover this fact when it comes to sitting down in front of a laptop at interview and you ask the candidate to take you through their solution, only to find they can’t explain the first thing about how it works or why certain design choices have been made.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Github aids candidates’ credibility by being a freely-available online source control solution, that verifiably identifies the authors of any content submitted. Not only can you freely download any complete solutions that have been placed there, but you can see the individual check-ins that went in to producing each solution and the thought processes indicated by the comments associated with same. If you know what you’re looking at, those fine details tell you much more about a candidate than a mere CV full of buzzwords and all the glowing references in the world ever could. And unlike copying whole solutions you didn&#39;t write yourself, forging a history of the individual check-ins that go in to making up a complete solution is all but impossible.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;With Github, you can also confirm a demo project’s creation date. This is important. Do you ever get the impression that candidates’ CVs are merely re-wordings of your job spec? This is in some ways understandable, and arises from the fact that the standard advice jobseekers are given is to tailor their CVs to highlight relevant experience. But still, as a hiring manager you sometimes would prefer to see what a candidate felt their own strengths were, before they knew what you were &lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;actually &lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;looking for. Github gives you that insight. If you’re looking for someone that has experience in Technology ‘X’, being able to see that they’ve completed a project using that technology some months before your particular requirement even came up is a pretty convincing demonstration that the candidate actually does know what they’re talking about when it comes to the subject concerned*. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9vRFeQYZD6Ou3ZI-6docMrD9p2tqtc5zkaRF5T8bX207Ii7e5Pm35cbbgbdw1FFNLfLY5l0s21r-QOWy9_ia002wdgwyt3GwoI285RF8XrOD0BHDlPOsa3xr9uFkaolNu27gjcCcSvzAA/s1600/NoJerks.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; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9vRFeQYZD6Ou3ZI-6docMrD9p2tqtc5zkaRF5T8bX207Ii7e5Pm35cbbgbdw1FFNLfLY5l0s21r-QOWy9_ia002wdgwyt3GwoI285RF8XrOD0BHDlPOsa3xr9uFkaolNu27gjcCcSvzAA/s320/NoJerks.png&quot; height=&quot;320&quot; width=&quot;204&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;mso-bidi-font-size: 13.0pt;&quot;&gt;(* That said, outside of specialist contracting roles, where you do expect new hires to hit the ground running from day 1, hiring software developers should rarely if ever merely be about hiring a particular skillset. It’s always better to instead hire for aptitude and attitude, and train for skill when you need to. Because new technologies come up all the time, and it’s no good hiring one-trick ponies that are incapable of keeping up with constantly-emerging technologies. Or, worse still, &lt;a href=&quot;http://www.amazon.co.uk/The-Asshole-Rule-Civilised-Workplace/dp/0749954035/ref=sr_1_1?ie=http://www.amazon.co.uk/The-Asshole-Rule-Civilised-Workplace/dp/0749954035/ref=sr_1_1&quot; target=&quot;_blank&quot;&gt;people that may be gifted as individuals but whose personality problems render them unsuitable for teamwork&lt;/a&gt;. You can teach people with the right aptitude and temperament almost any technical skill they need to know. The best ones will be capable of constantly improving themselves. But you can’t teach them not to try and use their one golden hammer to solve every single problem they come across. And you can’t teach them not to be an arrogant control freak that alienates their peers.)&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;The above are great ways to identify talent. That said, I know from working with a great many talented software developers over the years, that a lot of them don’t have the time to work on open source projects on Github whilst they’re fitting a family life around about being great assets to their existing employer. And some of them live in places where the internet connection is slow, making Skype a difficult option. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrLq6cHiy_F0K44OyHWWznoEDG5SSl75x3IZg3nH9IQNETippFvX3vMXRccyZitGxS9h7MUjlSmz9zOpE8naPRG8W-DvMH_F8p5_rLY0IOBehvwWQwba6NfpBlecOupGZB2E2cgfQLMUiT/s1600/PhoneQuestion.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrLq6cHiy_F0K44OyHWWznoEDG5SSl75x3IZg3nH9IQNETippFvX3vMXRccyZitGxS9h7MUjlSmz9zOpE8naPRG8W-DvMH_F8p5_rLY0IOBehvwWQwba6NfpBlecOupGZB2E2cgfQLMUiT/s1600/PhoneQuestion.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;So, for people for whom Skype and Github aren’t options, there is a Plan ‘B’ you can use. A less-preferable secondary approach that also works is to conduct an initial phone screen using a stock list of questions. I’m loathe to suggest an undue correlation between merely knowing the answers to some coding trivia questions and actual meaningful ability as a software developer. One is merely knowledge, the other is a demonstration of actual intelligence. However, there are just some basic things that you should know about any language or technology you profess to be proficient in, and that knowledge can be used as a baseline check if need be. &lt;br /&gt;
&lt;br /&gt;
E.g., for a junior level C# developer, I’d expect them to know:&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;&lt;span style=&quot;-moz-font-feature-settings: normal; -moz-font-language-override: normal; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;Q. What is an Abstract Class?&lt;/span&gt;&lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
A. &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/k535acbf%28v=vs.71%29.aspx&quot; target=&quot;_blank&quot;&gt;One that is only intended to be used as the base for other classes, but that may not be directly instantiated in and of itself.&lt;/a&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;&lt;span style=&quot;-moz-font-feature-settings: normal; -moz-font-language-override: normal; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;Q. Tell me three basic variable types in the common type system?&lt;/span&gt;&lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
A. &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ya5y69ds.aspx&quot; target=&quot;_blank&quot;&gt;Take your pick from any of these.&lt;/a&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;&lt;span style=&quot;-moz-font-feature-settings: normal; -moz-font-language-override: normal; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;Q. What are the scopes you may use to limit Field/Property visibility, and to what extent do they make these aspects of a class visible?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
A. &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ba0a1yw2%28v=vs.71%29.aspx&quot; target=&quot;_blank&quot;&gt;Public, Private, Protected, Internal and Protected Internal.&lt;/a&gt; &lt;span style=&quot;font-size: 13.0pt;&quot;&gt;&lt;/span&gt;&lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;&lt;span style=&quot;mso-bidi-font-size: 13.0pt;&quot;&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;(NB: I wouldn’t fault anyone for failing to name that last as a distinct scope in its own right, whose limit is a combination of that afforded by ‘Protected’ and ‘Internal’.)&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; margin-left: 18pt; text-indent: -18pt;&quot;&gt;
&lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt; &lt;br style=&quot;mso-special-character: line-break;&quot; /&gt; &lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;The key thing is that there are no trick questions here that would require knowledge of obscure parts of the .Net framework. Candidates may or may not not happen to have used certain discrete parts of the 4000-plus namespaces in the .Net Framework, but good developers could easily look up and utilise any part of the Framework if they needed to with only a couple of hours research. Asking about the features of a specific namespace is therefore pretty meaningless. The questions above instead just concern basic, core features of the C# language. Anyone that has used C# at all should be reasonably expected to be aware of them. &lt;br /&gt;
&lt;br /&gt;
Questions like these don’t help you identify whether someone is a great developer or not. Seeing how candidates write actual code using a real IDE is the only thing that enables you to do that. These questions are purely intended as a baseline negative check to help you identify any manifestly-unqualified candidates where the other preferred means of confirming ability mentioned earlier are unavailable. &lt;br /&gt;
&lt;br /&gt;
For more senior C#&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp; &lt;/span&gt;developers, I’d expect them to know more advanced, but still core, features of the language. E.g., :&lt;br style=&quot;mso-special-character: line-break;&quot; /&gt; &lt;br style=&quot;mso-special-character: line-break;&quot; /&gt; &lt;/span&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;Q. What is a Delegate?&lt;/span&gt;&lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
A.&lt;/i&gt; &lt;i&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/900fyy8e%28v=vs.71%29.aspx&quot; target=&quot;_blank&quot;&gt;A pointer to a function. They’re used in lots of ways, but a typical example would be to assign a handler to an event.&lt;/a&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;&lt;span style=&quot;-moz-font-feature-settings: normal; -moz-font-language-override: normal; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;Q. What’s the difference between a class and a struct?&lt;/span&gt;&lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
A.&lt;/i&gt; &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;&lt;a href=&quot;http://www.rachelpierson.blogspot.com/2010/08/structs-and-classes.html&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&lt;/span&gt;The first is a Reference type, the second is a Value type. This affects where they’re stored in memory, and how assignment between variables of the types concerned work.&lt;/a&gt;&lt;/i&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;&lt;span style=&quot;-moz-font-feature-settings: normal; -moz-font-language-override: normal; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;Q. Can you explain the principles of object oriented design?&lt;/span&gt;&lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
A. I’m looking for them to be able to succinctly tell me what &lt;a href=&quot;http://en.wikipedia.org/wiki/Inheritance_%28object-oriented_programming%29&quot; target=&quot;_blank&quot;&gt;Inheritance&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Abstraction_%28computer_science%29&quot; target=&quot;_blank&quot;&gt;Abstraction&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Polymorphism_%28computer_science%29&quot; target=&quot;_blank&quot;&gt;Polymorphism&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Encapsulation_%28object-oriented_programming%29&quot; target=&quot;_blank&quot;&gt;Encapsulation&lt;/a&gt; are. &lt;/i&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; margin-left: 18pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt; &lt;br style=&quot;mso-special-character: line-break;&quot; /&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;For a Lead Developer or Architect, I’d expect them to be able to speak meaningfully about:&lt;br style=&quot;mso-special-character: line-break;&quot; /&gt; &lt;br style=&quot;mso-special-character: line-break;&quot; /&gt; &lt;/span&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;&lt;span style=&quot;-moz-font-feature-settings: normal; -moz-font-language-override: normal; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;Can you describe some Design Patterns? (e.g., please explain what Singleton is, What is the Decorator pattern? Tell me about a time when you used them?)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;What are your thoughts on Inversion of Control / Dependency Injection? What about Test Driven Development? Do you always use them on every solution?* If not, what criteria do you use when deciding whether to expend the additional effort? What are the limitations of IoC? Which of the 22 plus frameworks that presently exist have you encountered on live projects?&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;mso-bidi-font-size: 13.0pt;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:WordDocument&gt;   &lt;w:View&gt;Normal&lt;/w:View&gt;   &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:PunctuationKerning/&gt;   &lt;w:ValidateAgainstSchemas/&gt;   &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:Compatibility&gt;    &lt;w:BreakWrappedTables/&gt;    &lt;w:SnapToGridInCell/&gt;    &lt;w:WrapTextWithPunct/&gt;    &lt;w:UseAsianBreakRules/&gt;    &lt;w:DontGrowAutofit/&gt;   &lt;/w:Compatibility&gt;   &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:LatentStyles DefLockedState=&quot;false&quot; LatentStyleCount=&quot;156&quot;&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
&lt;/style&gt; &lt;![endif]--&gt;&lt;span style=&quot;mso-bidi-font-size: 13.0pt;&quot;&gt;(* FWIW, I personally believe that using these presently-fashionable methodologies and techniques on every single project is about as misguided as never using them.)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;&lt;span style=&quot;-moz-font-feature-settings: normal; -moz-font-language-override: normal; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;What is an abstract class?*&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;mso-bidi-font-size: 13.0pt;&quot;&gt;(* The observant will notice that this last question is the same question used for junior developers. It’s amazing how many Architects can recite high-level summaries of chapters from the Gang of Four, but who’ve lost touch with how coding actually works in the trenches. It gets more difficult as your career develops to keep in touch with the front line, but my personal belief is that you can only lead great developers if you actually share their pain by hitting a keyboard yourself once in a while. You certainly shouldn’t exhibit any signs of Hero Syndrome or micro-managerial tendencies by needing to be involved in writing every line of code yourself, and you shouldn’t try to do developers’ thinking for them. You need to entrust and empower those you lead by allowing them the freedom to get on with any tasks you delegate to them using their own skill. However, it is important to implement a particular feature yourself every so often, purely to keep your own skills current in an ever-changing technical landscape. Otherwise you only lose touch with emergent technologies. A clear sign that you aren’t getting enough personal keyboard time is when you begin to lose the basic knowledge that even junior developers working under you are expected to possess.)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; margin-left: 18pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt; &lt;br style=&quot;mso-special-character: line-break;&quot; /&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;For any one topic that I consider myself experienced enough to assess others in, I have a list of about 200 such questions that represent basic knowledge I’d expect most people to know at each level. During an initial phone screen, selecting two or three such questions as baseline checks is the next best alternative to using Skype or Github to assess whether there’s any potential. &lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNsCQnc-iozNh_0ANbWTkTm-PW4ajUUDsFmm75ouQ72Mw2UiENGW18EM3widARUvaxymmqEJwIaVaPgajhnGalfdtNWcFygqQXnTwtDJuN0xw1VmB-Qxb38ONT3F2fIsOwAgu_seieUhcg/s1600/incompetence_small.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNsCQnc-iozNh_0ANbWTkTm-PW4ajUUDsFmm75ouQ72Mw2UiENGW18EM3widARUvaxymmqEJwIaVaPgajhnGalfdtNWcFygqQXnTwtDJuN0xw1VmB-Qxb38ONT3F2fIsOwAgu_seieUhcg/s1600/incompetence_small.jpg&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;I wouldn’t lose sleep over anyone getting any one individual question wrong. (Especially if they’re honest enough to admit they don’t know a particular fact. The very best people show awareness of things they don’t presently know, whilst less skilled individuals are often paradoxically unaware of their own current limitations. That inability to perceive their own present weaknesses leads to them failing to ever improve. This is known as the &lt;a href=&quot;http://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect&quot; target=&quot;_blank&quot;&gt;Dunning-Kruger Effect&lt;/a&gt;.) I still prefer actually seeing a person code using Skype, Github or even YouTube in preference to using coding trivia as an initial screening tool, but phone screens using basic questions to eliminate candidates is the next best option for the initial sift of candidates that invariably apply to almost any openly-advertised technical position. You can apologise to the ones that find it ridiculously easy afterwards, and explain the reasoning behind your using such simple baseline checks.&lt;br /&gt;
&lt;br /&gt;
Skype and Github are better options because they represent positive checks &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;for&lt;/i&gt; ability, whilst asking baseline questions is merely a negative check to identify the &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;absence&lt;/i&gt; of basic knowledge. However, if a candidate can’t answer &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;any&lt;/i&gt; of the simple baseline questions appropriate to their level of seniority, that’s clearly someone that you won’t take forward to interview. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;For anyone that attends an in-person interview, I’d always recommend seeing them code using an actual IDE. (If you’ve seen them do so via Skype previously, obviously you can skip this step). The best way to do this is to attach a projector to a laptop that’s loaded up with a full IDE and an internet connection, and watch them work. I once had a hiring manager tell me that they used pen and paper coding exercises instead &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;“because they didn’t want the candidate to have access to Intellisense, and all those other ‘cheats’ that a full IDE provides”&lt;/i&gt;. No, I don’t understand the logic behind that one either. I found myself wondering if they’d ask a prospective master carpenter to bang in nails wearing a blindfold, and decide from how swollen their thumbs were afterwards which was the ‘best’ at their craft. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSkRVzK5tluDkfrR0hGi9vdlEvtaRMuyNsF51FOoHBHpDexs10Np_MUovxHN28hGzT4yQQqhr2Bb5vj0oP-akLmd5bKOomiBqvsJ_AfjSPLioqWrxCQcCZ1qsFc7EYyHNQowG0WWV1tSpT/s1600/Camstudio.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSkRVzK5tluDkfrR0hGi9vdlEvtaRMuyNsF51FOoHBHpDexs10Np_MUovxHN28hGzT4yQQqhr2Bb5vj0oP-akLmd5bKOomiBqvsJ_AfjSPLioqWrxCQcCZ1qsFc7EYyHNQowG0WWV1tSpT/s1600/Camstudio.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Just like when you’re using Skype, you can record candidates’ efforts to build a quick solution using free tools like &lt;a href=&quot;http://camstudio.org/&quot; target=&quot;_blank&quot;&gt;CamStudio recorder&lt;/a&gt; if you like. That approach can be very useful if you work in a large organisation and have a wider selection committee that will need to review the interview later on. It can also feel a little like an unfriendly interrogation, though, so you need to decide what’s right for your own organisational culture. Personally, I’d only record a coding test if there were a need to show the recording to other members of your recruitment panel afterwards. And I would explain to the candidate that the purpose was to save them having to demonstrate their ability multiple times to different people. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;It’s important to make clear that the problem you’re asking them to solve constitutes &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;realistic&lt;/i&gt; work, but not &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;real&lt;/i&gt; work on an actual business problem. The first activity is a meaningful test of their skill. The second would merely represent unpaid work, and that would risk making you look like a freeloader. One problem I’ve seen used in the past and that I thought was a pretty fair baseline check read something like this:&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; margin-left: 27pt;&quot;&gt;
&lt;span style=&quot;font-size: 11pt;&quot;&gt;“Design a system that allows you to model shapes as objects. Each shape should be capable of outputting a text description of itself. The description given in each case will be:&lt;br /&gt;
&lt;br /&gt;
‘I am a _________. I have ____ sides, and ____ corners. My colour is ______. Their lengths are _______.’&lt;br style=&quot;mso-special-character: line-break;&quot; /&gt; &lt;br style=&quot;mso-special-character: line-break;&quot; /&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; margin-left: 27pt;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: 11pt;&quot;&gt;There will be appropriate Properties in any classes you use to model such shapes to store the information to be supplied in the blanks in the above description. &lt;br /&gt;
&lt;br /&gt;
You can implement this solution using any UI you like. Have specific classes that describe the shapes ‘triangle’, ‘square’, ‘rectangle’ and ‘circle’” &lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;A developer should be able to come up with a simple design that has a base (possibly abstract) class that provides any shared Properties like colour, numSides, etc. They can either implement a Method in that abstract class to allow a string description to be output, or they can override the default &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;ToString&lt;/i&gt; method. Classes describing the specific shapes requested should be inherited from this base. Extra points for having the perception to make appropriate properties/fields read only in more specific classes (i.e., you don’t want consumers to be able to create a triangle with four sides). Points too for using inheritance where appropriate (e.g., realising that a square is just a more specific instance of a rectangle.)&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp; &lt;/span&gt;Nothing too taxing, and no trick questions or tasks that would take an unreasonable amount of time. Just a simple problem to allow developers to show that they’re not a &lt;a href=&quot;http://www.codinghorror.com/blog/2007/02/why-cant-programmers-program.html&quot; target=&quot;_blank&quot;&gt;non Fizz-buzzer&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzzVpo1G6TQlL9Kp4L9peLzhT3U5l6yv0CWmQAPv7MmL6S0bdHP9uqEnpDFWRu7oE7SzGc-GDo50EyXgRAgz-4yQKvohy8iiAGtIkUEpIseJroDHDaovNARyNKhdtC28HkscrWICtVa7By/s1600/IntelligenceTest.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzzVpo1G6TQlL9Kp4L9peLzhT3U5l6yv0CWmQAPv7MmL6S0bdHP9uqEnpDFWRu7oE7SzGc-GDo50EyXgRAgz-4yQKvohy8iiAGtIkUEpIseJroDHDaovNARyNKhdtC28HkscrWICtVa7By/s320/IntelligenceTest.png&quot; height=&quot;228&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;As this is a blog about assessment tools, it’s worth mentioning ‘online’ tests like &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;ProveIT&lt;/i&gt;, &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;Brain Bench&lt;/i&gt;, and &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;Codility&lt;/i&gt;. These ‘tests’ fall into two main categories:&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; margin-left: 18pt; text-indent: -18pt;&quot;&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;Tests that attempt to assess ability based on being able to instantly-recall knowledge of obscure parts of particular frameworks. &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;&lt;span style=&quot;-moz-font-feature-settings: normal; -moz-font-language-override: normal; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Tests that try to assess an actual ability to write code, but not using an actual IDE.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;My opinion on using obscure trivia to assess problem-solving ability is well-documented. I’m with Einstein on this one, who when asked what the speed of sound was once said that: &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:WordDocument&gt;   &lt;w:View&gt;Normal&lt;/w:View&gt;   &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:PunctuationKerning/&gt;   &lt;w:ValidateAgainstSchemas/&gt;   &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:Compatibility&gt;    &lt;w:BreakWrappedTables/&gt;    &lt;w:SnapToGridInCell/&gt;    &lt;w:WrapTextWithPunct/&gt;    &lt;w:UseAsianBreakRules/&gt;    &lt;w:DontGrowAutofit/&gt;   &lt;/w:Compatibility&gt;   &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:LatentStyles DefLockedState=&quot;false&quot; LatentStyleCount=&quot;156&quot;&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
&lt;/style&gt; &lt;![endif]--&gt;  &lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 18.0pt;&quot;&gt;
&lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;“[I do not] carry such information in my mind since it is readily available in books. ...The value of a college education is not the learning of many facts but the training of the mind to think.” *&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;[ * &lt;i&gt;New York Times, &lt;/i&gt;18 May 1921 ]&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;mso-bidi-font-size: 13.0pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;I don’t consider memorising a lot of obscure and easily-obtainable facts to be a good indicator of programming ability. Nor do I consider not being able to recall such facts at will to be an indicator of a lack of ability. Developers have Google and reference books available on the job. I’m therefore only concerned with testing those aspects of a developer’s ability that those tools can’t provide.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;That leaves those online ‘tests’ that attempt to assess coding skill, such as Codility. There’s nothing wrong with the basic idea of getting candidates to write code as a demonstration of their existing ability and potential. However, there’s a big difference between writing code using an actual IDE, and attempting to write code using a web browser (which is how Codility works). In a real IDE, you have Intellisense, code snippets, meaningful object navigation (e.g., if you place the carat on the usage of a class or property in Visual Studio and use the F12 key, it’ll take you to where that class/property is implemented), colour coding of keywords and objects, compilation checking as you type, etc, etc. Codility advocates believe that because that assessment tool has a “compile solution now” button at the bottom of the browser window that amounts to the same thing. It simply doesn’t. Going back to my earlier analogy about inappropriate ways to assess carpentry skills, you’ve merely gone from using a blindfold to asking the candidate to wear sunglasses in a dimly-lit room.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_VEuN0Yi5MTwI9GdhmCkWvWdESkUi-jYcH7SoHITRsL4reu5X5Bz0DMYfn9Bdr2zj1rt-nHu0Cy7Xxyk9SAP_9tl8CYp39_8Io9nxkWkQBNT7HhY9EG44-KEJxoIashxAsHYTWo-bh5pT/s1600/TestWindow.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_VEuN0Yi5MTwI9GdhmCkWvWdESkUi-jYcH7SoHITRsL4reu5X5Bz0DMYfn9Bdr2zj1rt-nHu0Cy7Xxyk9SAP_9tl8CYp39_8Io9nxkWkQBNT7HhY9EG44-KEJxoIashxAsHYTWo-bh5pT/s400/TestWindow.png&quot; height=&quot;215&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Codility tests run in a web browser&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;The main problem with Codility et al, however, is simply this. They don’t give you anything that you don’t also get by watching a candidate solve a real problem using a real IDE. Because of this, you invariably find that these tools are preferred by interviewers that don’t possess skills in the language concerned themselves. Such interviewers don’t use an IDE / laptop with a projector approach, because they simply wouldn’t understand what it was they were looking at. By using Codility instead, they’re generally looking for an ‘easy’ way to understand whether a given solution is ‘right’ or ‘wrong’, without having to go to the trouble of understanding &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;why&lt;/i&gt; such a value judgement has been arrived at themselves. Good candidates are aware of this, and the best of them will be concerned that if you only understand how good they are because some automagically-marked test tells you what to think, how are you going to be able to fairly assess their performance on the actual job in the absence of such feedback?&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Everyone knows that good interviews are a two-way street. Candidates are assessing you and your organisation just as you are assessing them. Sending a signal that you don’t understand what it is that they do can damage your credibility and your employer/manager brand considerably. So, if you’re not technical yourself (and some managers aren’t), I’d generally recommend instead asking one of your existing staff that you trust to be able to make a meaningful assessment of a candidate&#39;s ability to accompany you when assessing candidates’ technical fit. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;A second problem with Codility, in my opinion, is that solving discrete problems using technology in the real world rarely works in such black and white terms as a solution being ‘more’ or ‘less’ right than other approaches. There are generally a great many ways to satisfy any one problem. Which one(s) is/are ‘correct’ is all about context. Tests that focus on an overly-narrow set of criteria when determining success may not always identify the best candidate, even if they identify someone that produces the fastest solution, or the one that uses the least (or most) lines of code to solve a problem. e.g., if someone were to use the line&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: 13pt;&quot;&gt;123 &amp;lt;&amp;lt; 4&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp; &lt;/span&gt;to get the result &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: 13pt;&quot;&gt;1968&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt; instead of writing&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: 13pt;&quot;&gt;123 * 16&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp; &lt;/span&gt;, that might be the genius you need to optimise nanoseconds on calculations within the firmware for a graphics card, or they might just be That One Guy that writes unreadable code that produces hard to find bugs. (Mostly, though, they’ll just be someone that doesn’t realise low-level arithmetic optimisations like bitwise operators are largely meaningless in languages like C#, where high-level code is converted at compile time into optimised MSIL before being converted into even more optimised machine code specific to the hardware it’s running on.)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;You can &lt;a href=&quot;http://codility.com/demo/take-sample-test/&quot; target=&quot;_blank&quot;&gt;try Codility for yourself here&lt;/a&gt;, and I&#39;d strongly recommend that you do so if you&#39;re considering using it to fairly assess candidates. It&#39;s not enough just to get someone else to look at the test for you, unless you ask your chosen guinea pig to work under the exact same time constraints as candidates will be asked to work to. That also means they only get one shot at the test, just like candidates.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;In the interests of debunking &lt;i&gt;The Emperor&#39;s New Code&lt;/i&gt;, when I tested Codility out as an assessment tool I found that I didn&#39;t produce a 100% solution myself first time in the time allowed. I therefore felt it&#39;d be unfair to ask candidates to do something that I myself couldn&#39;t. &lt;br /&gt;
&lt;br /&gt;
I doubt that many people could produce an &#39;optimal&#39; result in the timeframe allowed, particularly when you don&#39;t get to see the criteria that will be deemed to constitute an &#39;optimal&#39; solution before submitting your answer. When they only have a short window to think about the problem, candidates will be inclined to focus on providing a solution that works rather than one that shaves milliseconds off of the runtime. And even where candidates do provide an &#39;optimal&#39; solution, there doesn&#39;t seem to be much allowance for readability in the simplistic percentage score returned. &lt;br /&gt;
&lt;br /&gt;
I suspect that most 100% results that users might see from this tool may be best explained by the fact that there are many solutions to the tests published online, and some candidates will be inclined to copy one of those. &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr style=&quot;align: centre;&quot;&gt;  &lt;td&gt;&lt;br /&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left; margin-right: 1em; text-align: left;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1h0eMza4iuCZkdaB8_GNcn9iTDDlWdKT_Is0VZ9MZ0Ltfzi0TWnpeIBkEwB7tbCjYWlXd7kayBlqAml0wRJ2nnqlBb4lvwiO7lUdqRs_Tbuy2wUizLuO8idn3kIRE71GFdJimeSYSl-8h/s1600/DeliberatelyObscureSolutionStillGets100Percent.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1h0eMza4iuCZkdaB8_GNcn9iTDDlWdKT_Is0VZ9MZ0Ltfzi0TWnpeIBkEwB7tbCjYWlXd7kayBlqAml0wRJ2nnqlBb4lvwiO7lUdqRs_Tbuy2wUizLuO8idn3kIRE71GFdJimeSYSl-8h/s320/DeliberatelyObscureSolutionStillGets100Percent.png&quot; height=&quot;320&quot; width=&quot;149&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;This deliberately-obscure and unreable&lt;br /&gt;
solution scores 100%&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;(&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1h0eMza4iuCZkdaB8_GNcn9iTDDlWdKT_Is0VZ9MZ0Ltfzi0TWnpeIBkEwB7tbCjYWlXd7kayBlqAml0wRJ2nnqlBb4lvwiO7lUdqRs_Tbuy2wUizLuO8idn3kIRE71GFdJimeSYSl-8h/s1600/DeliberatelyObscureSolutionStillGets100Percent.png&quot; target=&quot;_blank&quot;&gt;Full-size view available here&lt;/a&gt;)&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;/td&gt; &lt;td style=&quot;valign: top;&quot;&gt;&lt;br /&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: right; margin-left: 1em; text-align: right;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEPHz5_4hrWsCPOjQwz1_BsKMCN8NkTR-xD8kiUi_bX4huZyfDWyfYL5_FW37hwab0KJ6w_dmW3fKPBr8okplVLIA-Y_U32mQThJLLB0x1ufHYLGTnqc9ITRVx5Vwhmm-By4VQR9McPYJR/s1600/SimplestReadableSolutionThatScores100Percent.gif&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEPHz5_4hrWsCPOjQwz1_BsKMCN8NkTR-xD8kiUi_bX4huZyfDWyfYL5_FW37hwab0KJ6w_dmW3fKPBr8okplVLIA-Y_U32mQThJLLB0x1ufHYLGTnqc9ITRVx5Vwhmm-By4VQR9McPYJR/s320/SimplestReadableSolutionThatScores100Percent.gif&quot; height=&quot;172&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;This shorter and more readable solution also scores 100%&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/td&gt;   &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;My overall conclusion: companies that let computer algorithms select the best people to work for them rather than the other way round may well be disappointed by the results. &lt;/span&gt;&lt;/div&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/2682078483249443324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/2682078483249443324'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/2013/07/tools-for-assessing-software-developers.html' title='Tools for Assessing Software Developers'/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLhvzh83L93UBipzlWbkL6u_rlgta76ybiArOV0rDAXs6xWxAiFtu5UuqflDJBI1f0nlzw-7t2xKzZe9A1yoxxHLP-8iUUH5P5T6PBzCjQg7zhdakXMNm7KFr2z4NSNVuhhZCODQUGk6ki/s72-c/SkypeBlueSLargeWhiteBG.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7818882524515880477.post-1966587982769429776</id><published>2013-06-30T19:10:00.000+01:00</published><updated>2014-02-22T17:56:26.817+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Open Source Projects"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><category scheme="http://www.blogger.com/atom/ns#" term="VBlogs (discontinued)"/><title type='text'>BranchedMigrator : A Database Schema Management Tool</title><content type='html'>&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
 &lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState=&quot;false&quot; LatentStyleCount=&quot;156&quot;&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
&lt;/style&gt;
&lt;![endif]--&gt;

&lt;span style=&quot;color: red;&quot;&gt;&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13pt;&quot;&gt;NB: Owing to YouTube&#39;s policy of trying to force Google+ on YouTube members, I no longer&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13pt;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; host content on YouTube. Apologies for the inconvenience.&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13pt;&quot;&gt;I recently got round to doing a bit of work
on an open source project of mine called &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;BranchedMigrator&lt;/i&gt;.
Inspired by Sean Chambers’ wonderful &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;FluentMigrator&lt;/i&gt;,
it’s a database schema versioning tool for use in continuous integration environments.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;You can download a copy &lt;a href=&quot;http://rachelppierson.github.io/RPPBranchedMigrator/&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;360&quot; src=&quot;http://www.youtube.com/embed/MLP0hFBBvBA?feature=player_detailpage&quot; width=&quot;640&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/1966587982769429776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/1966587982769429776'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/2013/07/branchedmigrator-database-schema.html' title='BranchedMigrator : A Database Schema Management Tool'/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/MLP0hFBBvBA/default.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7818882524515880477.post-2976759215304091643</id><published>2013-03-02T17:00:00.000+00:00</published><updated>2013-04-18T17:00:08.116+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Azure"/><category scheme="http://www.blogger.com/atom/ns#" term="Cloud Computing"/><category scheme="http://www.blogger.com/atom/ns#" term="Management"/><category scheme="http://www.blogger.com/atom/ns#" term="TeamCity"/><title type='text'>A Guide to The Cloud,  Part 1 - For Muggles</title><content type='html'>&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
 &lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState=&quot;false&quot; LatentStyleCount=&quot;156&quot;&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
&lt;/style&gt;
&lt;![endif]--&gt;

&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;In recent years, I’ve been
involved in a number of cloud computing projects. Most recently, this included
a very enjoyable project working for a forward-looking games company based
in Glasgow. This blog post is intended to dispel some of the myths that linger
about the various technologies that enable cloud computing projects to work. The
content in this first part is primarily aimed at non-technical managers looking
to get an understanding of what the cloud can do for them. In Part 2, aimed at
a more technical audience, I’ll delve more deeply into the underlying
technologies.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;-moz-border-bottom-colors: none; -moz-border-image: none; -moz-border-left-colors: none; -moz-border-right-colors: none; -moz-border-top-colors: none; border-color: -moz-use-text-color -moz-use-text-color windowtext; border-style: none none solid; border-width: medium medium 1.5pt; font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; padding: 0cm 0cm 1pt;&quot;&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: none; mso-border-bottom-alt: solid windowtext 1.5pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm; padding: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://www.youtube.com/watch?v=PyeWRd7ZEBs&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;Let&#39;s Make Lots of Money&quot; border=&quot;0&quot; height=&quot;119&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYPIPIlGkUQBXzoUMwqchgajGGHo4PtwCCuxrCQJNxHW4NGU3pgyI-LbD0h8mdMaE8r5NeyMxXa2wM_bqu8a1jFo3uJ7VgljjYBocIgL3N3MGd2wDhp-jmMy8N-4Tg1Erho0LOGLLnxvua/s320/LetsMakeLotsOfMoney.jpg&quot; title=&quot;The Cloud&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;“The Cloud” is one of those
buzzword phrases that’s been bandied around an awful lot. In the process, it’s
had its meaning stretched and diluted a great deal. There’s been a lot of
misinformation about what does and does not constitute a cloud computing
project / platform. Common aspects of the various definitions I’ve encountered
have included: &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;ul style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Applications that
are web-based.&lt;br style=&quot;mso-special-character: line-break;&quot; /&gt;
&lt;br style=&quot;mso-special-character: line-break;&quot; /&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;The hosting of
those web applications, and the databases that underlie them, on remote
hardware that isn’t located in the same building as the development team. &lt;br style=&quot;mso-special-character: line-break;&quot; /&gt;
&lt;br style=&quot;mso-special-character: line-break;&quot; /&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Lower hardware
maintenance costs.&lt;br style=&quot;mso-special-character: line-break;&quot; /&gt;
&lt;br style=&quot;mso-special-character: line-break;&quot; /&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;The ability to
scale applications as an application’s user base grows.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;&lt;br /&gt;
A difficulty with some of the discussion that has fallen under the “cloud”
umbrella, is that some or all of these qualities are also found in projects
that are not true “cloud” applications, and never will be. &lt;br style=&quot;mso-special-character: line-break;&quot; /&gt;
&lt;br style=&quot;mso-special-character: line-break;&quot; /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;For the avoidance of doubt, when
I speak of cloud computing projects, I am talking specifically about projects
that encapsulate all of the following discrete qualities:&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;ul style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;They are web applications
that are accessible across the open internet, and are designed from the ground
up to be deployed to dedicated cloud-computing platforms. This involves
considering scalability, security and ease of deployment (discussed below) as
primary design goals. It is not simply taking an existing Java EE 6 or ASP.Net
application that was once hosted on internally-managed hardware and deploying
it to a small number of servers in a single data centre.&lt;br style=&quot;mso-special-character: line-break;&quot; /&gt;
&lt;br style=&quot;mso-special-character: line-break;&quot; /&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Projects where
the hardware to which the above solutions are deployed is not directly managed
by the party that owns/writes the software. That is, an organisation that
deploys a solution ‘to the cloud’ typically doesn’t know or care about where
the physical server upon which their application runs resides, beyond broad
geographical considerations. So, whilst it’s often possible to choose between
“Asia”, “Europe”, “North America”, etc, when deciding roughly where your
application will be hosted, if your hardware management is any more
fine-grained than that then you are not using cloud technologies at all; you’re
simply remotely-managing hardware that you are still heavily-invested in
maintaining yourself.&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;br style=&quot;mso-special-character: line-break;&quot; /&gt;
&lt;br style=&quot;mso-special-character: line-break;&quot; /&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;&lt;span style=&quot;-moz-font-feature-settings: normal; -moz-font-language-override: normal; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Solutions where
you can scale your application to serve a greater number of users quickly and
reliably. This typically involves a combination of leaving managing any
physical hardware up to the third party you purchase cloud hosting services from,
and an awareness within the development team of scalability issues as they
apply to software design.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;In Part 2 of this blog post
I’ll get into some specific technical implementation details involving one
particular set of cloud technologies: &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;Windows
Azure&lt;/i&gt; and &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;ASP.Net MVC&lt;/i&gt;, in
conjunction with &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;SQL Azure&lt;/i&gt;. But
first, let’s have a look at some general design considerations that apply whichever
cloud platform you are using, and that should be clearly understood by
technical and non-technical managers of cloud computing projects alike: &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 18.0pt;&quot;&gt;&lt;b&gt;Security&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;I’ve worked on a range of
types of application that have been used for a wide variety of purposes, from the very
most trivial you can think of to mission-critical applications that needed to
work every single time. An example of the diverse range of problems I’ve been
involved in solving includes:&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; margin-left: 54pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;·&lt;span style=&quot;-moz-font-feature-settings: normal; -moz-font-language-override: normal; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Automating precision
engineering manufacturing processes for producing delicate parts that keep
satellites in orbit&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; margin-left: 54pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;·&lt;span style=&quot;-moz-font-feature-settings: normal; -moz-font-language-override: normal; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;National power
utility infrastructure management&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; margin-left: 54pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;·&lt;span style=&quot;-moz-font-feature-settings: normal; -moz-font-language-override: normal; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;DV-cleared national government work &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; margin-left: 54pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;·&lt;span style=&quot;-moz-font-feature-settings: normal; -moz-font-language-override: normal; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;A national police
project&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; margin-left: 54pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;·&lt;span style=&quot;-moz-font-feature-settings: normal; -moz-font-language-override: normal; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Investment
banking applications aimed at Anti Money Laundering&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; margin-left: 54pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;·&lt;span style=&quot;-moz-font-feature-settings: normal; -moz-font-language-override: normal; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;A system for
designing custom zombies for use in online games (seriously)&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;All of which is to say, I
fully appreciate the need for security and I have a wide enough grounding in a diverse
range of applications that required same to be able to make an informed
judgement about whether cloud technologies are sufficiently well-protected to
be able to use for each of the above discrete applications. I get it. Really I
do. (Hey, there’s nothing more important than protecting society against the
ever-present threat of a zombie apocalypse, right?) &lt;br style=&quot;mso-special-character: line-break;&quot; /&gt;
&lt;br style=&quot;mso-special-character: line-break;&quot; /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;I suspect that most if not all
of the Public Sector and banking organisations with whom I’ve worked would be
horrified at the idea of storing their sensitive data on hardware they didn’t physically
control. (&lt;a href=&quot;http://www.bbc.co.uk/news/business-19107537&quot; target=&quot;_blank&quot;&gt;Even though many organisations in those sectors experience very serious problems anyway, even when working solely with hardware they get to fully manage in ways with which they are more comfortable.&lt;/a&gt;)&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp; &lt;/span&gt;There’s something falsely-comforting to the
uninitiated about having physical control of actual touchable hardware. It’s the same misguided
illusion of security that makes some people store all their life savings under
a mattress rather than putting it in a bank for safekeeping.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiswVUQoeHYsKafo3FFt2iurfcC_PYTJft8GfIuTciOBTxdMC22sEk77jFYYFlmW1KvcuZtP7rOpfOJdaUhG759j4C4DK_IrOPpyHZV_3y6EhyUToaoMf1KcyHIqrmEKkq3CM8yE8Fqykyj/s1600/MoneyUnderTheMattress.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;257&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiswVUQoeHYsKafo3FFt2iurfcC_PYTJft8GfIuTciOBTxdMC22sEk77jFYYFlmW1KvcuZtP7rOpfOJdaUhG759j4C4DK_IrOPpyHZV_3y6EhyUToaoMf1KcyHIqrmEKkq3CM8yE8Fqykyj/s320/MoneyUnderTheMattress.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;As well as the psychological
difficulties some organisations/managers have in letting go control of physical
hardware, in Europe specifically there are also some rather ill-conceived and
as yet legally-untested rules concerning the processing of data outside the EU.
So, if you operate there you might be forgiven for wondering whether you are &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;allowed&lt;/i&gt; to store sensitive customer
information on physical hardware that may be located outside Europe, even if
you might wish to do so. Like the EU cookie law, it’s nonsense that’ll get over
itself soon enough. But still, misguided and vague concerns like these allow
people with a predilection to do so to spread worry and doubt about the
security and legality of using cloud technologies they don’t fully understand,
to solve problems they’d rather would just go away.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Without getting into the
technical details too deeply at this juncture, in summary it is possible to easily encrypt data
to a level where even the most sophisticated state/non-state actors can’t
access it. If desired, it’s possible to encrypt all of the data you store on cloud
servers, or just those parts that are particularly sensitive like passwords.
Implementation details aside, most of the encryption schemes in use today use
the same &lt;a href=&quot;http://en.wikipedia.org/wiki/Public-key_cryptography&quot;&gt;public
key cryptography&lt;/a&gt; principle (though &lt;a href=&quot;http://en.wikipedia.org/wiki/Elliptic_curve_cryptography&quot;&gt;new approaches can
and are being developed all the time&lt;/a&gt;). It’s the same process that allows
you to safely access your bank account online, and make purchases from online
retailers without risk of a third party being able to intercept and misuse your
details. It’s safe: if it weren’t, there would be a lot more online fraud than
there is. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Some organisations that
operate in the cloud include: &lt;a href=&quot;http://aws.amazon.com/ec2/&quot;&gt;Amazon&lt;/a&gt;, &lt;a href=&quot;https://cloud.google.com/products/compute-engine&quot;&gt;Google&lt;/a&gt;, &lt;a href=&quot;http://www.windowsazure.com/en-us/&quot;&gt;Microsoft&lt;/a&gt; and the &lt;a href=&quot;http://www.nsa.gov/research/_files/publications/cloud_computing_overview.pdf&quot;&gt;National
Security Agency&lt;/a&gt;. So, if anyone ever tries to tell you that you shouldn’t use
a cloud solution purely on the grounds of security, I suggest you point them at
the above links and invite them to come up with a more supportable
rationalisation for their preferred approach.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot; /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 18.0pt;&quot;&gt;&lt;b&gt;Scalability&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Aside from security, this is
probably the second most important concern for cloud applications. Scalability
is the ability of a given application to be able to adequately and reliably serve the needs of
users under a diverse range of conditions. This involves several discrete
design considerations, some or all of which may affect your project, depending
on its nature:&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;The ability to support many concurrent users&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiecsBkEGdkpAYxWrSZE5icQXVvVOd_zy2yDipwxeLROiI6vAhepnWJ6vuHGmrjLUbvrznceFAKAiHcHLicSkAAziR5c8YNnx3NKuveGp3CF76y7_5-NzOzf_tgG0c2MQP-608rxioXgKGV/s1600/SpaghettiForks.gif&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;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiecsBkEGdkpAYxWrSZE5icQXVvVOd_zy2yDipwxeLROiI6vAhepnWJ6vuHGmrjLUbvrznceFAKAiHcHLicSkAAziR5c8YNnx3NKuveGp3CF76y7_5-NzOzf_tgG0c2MQP-608rxioXgKGV/s200/SpaghettiForks.gif&quot; width=&quot;196&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;First and foremost, your
application must have the ability to support many thousands of concurrent users
equally as well as supporting individual users in isolation. This design
consideration is very easy to overlook when you’re working on a Proof Of
Concept, where you’re mainly focused on providing features and the only people developers
need to satisfy are the rest of their peers in the development team (hopefully
augmented by some independent testers that will have the luxury of working on a
version of the system that has not yet gone live and where they are
consequently not using the system under stress). To be able to have confidence
that systems work under the stress of heavy concurrent use, it’s important to
test for that specific design goal using appropriate methods. There are various
ways to do so that typically involve using a test harness to simulate such use;
more on the technical implementation details of that in Part 2. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Considering the strengths of multi-tenancy vs single
tenancy&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Most software that’s used
today tends to be written with a single end-user organisation in mind. If
that’s the type of project you’re working on, you can dispense with this
consideration altogether, since it doesn’t affect you. However, for some types
of application, it’s the case that the same basic application gets delivered to
multiple end user organisations, each of whom will have their own user base and
subtle usage considerations. In these circumstances, an assessment must be made
about the relative benefits and drawbacks of allowing different organisations
to share instances of your application (known as &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;multi-tenancy&lt;/i&gt; solutions) vs allowing each customer to have their
own instance (known as &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;single tenancy&lt;/i&gt;).
&lt;br /&gt;
&lt;br /&gt;
There’s no ‘right’ or ‘wrong’ answer that fits every situation. However, some
things to consider include: Will different customers want to use different
versions of your application at the same time? E.g., if customer ‘A’ buys
version 1 of your application, and some time later customer ‘B’ comes along and
purchases your latest improved version with additional features (version 2),
are you going to move every customer that is presently on version 1 up to the
latest version for free to satisfy the desire of your latest customer to buy
the latest version? And if so, are your existing customers going to be happy to
make the move? &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;The answers to these
questions will dictate whether you should provide everyone with their own
instance of your application, or attempt to cater to the needs of multiple
organisations using one dedicated version.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 18.0pt;&quot;&gt;&lt;b&gt;Deployment&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe-lvi7pH4RdJoCB1RglOzoADKdIpCPBccqozf-gaCqZemCNc606tFwEQmmJ5aizsC2f7fvPmoFgK2Cu27GoHlmzHd2T7UKENaux3Hec46Uzuv7OKV_3BaBVTa8Mq7P_-tzghUz_SGdjJN/s1600/SpecialDelivery.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe-lvi7pH4RdJoCB1RglOzoADKdIpCPBccqozf-gaCqZemCNc606tFwEQmmJ5aizsC2f7fvPmoFgK2Cu27GoHlmzHd2T7UKENaux3Hec46Uzuv7OKV_3BaBVTa8Mq7P_-tzghUz_SGdjJN/s200/SpecialDelivery.jpg&quot; width=&quot;193&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;As new customers of your
cloud-hosted solution come on board, you’ll need to consider how you are going
to cater for providing them with the service they will be paying for. Whether
you’re going to take a multi- or single- tenancy approach is a separate
consideration. You also need to consider &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;how&lt;/i&gt;
you are going to get from the point of a customer requesting the ability to use
your service, and that service being up and running. This typically involves,
but is not necessarily limited to :&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;br style=&quot;mso-special-character: line-break;&quot; /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Setting up a
database to contain the end-user organisation’s information. &lt;br style=&quot;mso-special-character: line-break;&quot; /&gt;
&lt;br style=&quot;mso-special-character: line-break;&quot; /&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Providing an
instance of the web application that is specific to the end user organisation.
E.g., you might provide the exact same stock management solution to a
supermarket as you do to a company that makes metal parts. If you do, the
supermarket is unlikely to want to direct their customers to
www.shinymetalparts.com to check the price of milk at their local superstore.&lt;br style=&quot;mso-special-character: line-break;&quot; /&gt;
&lt;br style=&quot;mso-special-character: line-break;&quot; /&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;You don’t want to
get too deeply into managing physical hardware (not having that headache is one
of the advantages that cloud computing is meant to bring you). However, you may
still want to take an interest in the general geographical area that your
solution will be deployed to. If you acquire a customer that has a large user
base in Asia, for reasons of bandwidth management you’re unlikely to want to
route all the traffic to that customer’s instance of your solution via the
North American cloud hub that you used to develop and test your solution. &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Most importantly, as an
organisation that provides a cloud-hosted Software As A Service solution to others, you do not want
to waste a great deal of time and effort getting developers involved in the
above matters at the time of deployment. Planning and preparation for
deployment needs to be done in advance if it’s to be executed efficiently. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Ideally, you’d like it to be
the case that your salespeople can speak with potential new
customers, and for those customers to be up and running with a minimum of fuss
as soon as a contract for service has been signed. You shouldn’t need a DBA to
set up the database, a developer to create a copy of the web application, and a
tester to make sure it all still works as intended, just to supply something to
customer ‘B’ that you’ve already supplied to Customer ‘A’. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Fortunately, there are
solutions to the deployment process that involve minimal work at deployment
time. I’ll get into the technical details more in Part 2, but for now I’ll just
note that there are tools that, provided they’re used correctly, make the
process as simple as running a single script to achieve All Of The Above goals.
&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;In Part 2 I’ll discuss in
detail how you can use a combination of &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;Powershell&lt;/i&gt;,
&lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;NAnt&lt;/i&gt;, and &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;FluentMigrator&lt;/i&gt; to automate the deployment process. Key to the
success of these is one final piece of the puzzle…&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 18.0pt;&quot;&gt;&lt;b&gt;Continuous Integration and
Version Control&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;text-decoration: none;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;u&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;&lt;span style=&quot;text-decoration: none;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/u&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;The &lt;a href=&quot;http://www.joelonsoftware.com/articles/fog0000000043.html&quot;&gt;Joel Test&lt;/a&gt;
has been kicking around for quite a while now, and whilst it is showing its age
a little, many of the most savvy developers ask questions from it when deciding
where to work. &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;(Side note: yes, believe
it or not, the best developers do still get to do that. Even in this economy.
Think of the number of businesses that don’t use the internet or IT in some
way; that’s the number of places good developers can’t find work, and those
organisations are consequently who you’re competing against for the best
talent)&lt;/i&gt;. There aren’t too many organisations still operating today, thank
goodness, that don’t provide basic tools like bug tracking and source control.
Rather fewer have testing teams that are completely independent from the
development team. Fewer still ensure quiet conditions for developers, and in my
experience almost no organisation has been capable of doing daily builds or
builds in one step at will.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;The ability to deploy easily
and at will is covered above. Related to that, however, is the consideration of
how you will support multiple versions of your solution, some of which may be
being used by different customers simultaneously. Part of the reason that most
organisations aren’t able to deploy different versions at will is that, as
noted earlier, most software today is simply written for one group of users and
will only ever been used by and updated for that one specific group of users.
If that’s the category your project falls into, then you don’t need to read any
further. For those organisations that produce solutions for use by more than
one customer at a time, sooner or later you’re going to have to delve into the
topic of version control and continuous integration.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Continuous Integration is the
process of managing features that are being developed by your R&amp;amp;D /
development team, and determining which version(s) of your product will be
benefactors of new features / bug fixes that are continually being developed.
One day your R&amp;amp;D team might be working on Super Duper feature ‘X’ that is
only going to be made available to new customers or ones that upgrade to your
latest version. Another day those same developers might be addressing a
critical bug that’s been discovered, the fix to which will be rolled out to
users of all versions as soon as it’s been through development and testing. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;There are tools available
that automate and manage this process as a separate activity to development.
I’ll discuss one of these tools – &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;TeamCity&lt;/i&gt;
– in detail in Part 2. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/2976759215304091643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/2976759215304091643'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/2013/03/a-guide-to-cloud-part-1-for-muggles.html' title='A Guide to The Cloud,  Part 1 - For Muggles'/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYPIPIlGkUQBXzoUMwqchgajGGHo4PtwCCuxrCQJNxHW4NGU3pgyI-LbD0h8mdMaE8r5NeyMxXa2wM_bqu8a1jFo3uJ7VgljjYBocIgL3N3MGd2wDhp-jmMy8N-4Tg1Erho0LOGLLnxvua/s72-c/LetsMakeLotsOfMoney.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7818882524515880477.post-326681830149029215</id><published>2013-01-04T18:06:00.002+00:00</published><updated>2013-04-13T19:35:31.765+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Personal"/><category scheme="http://www.blogger.com/atom/ns#" term="Product Reviews"/><title type='text'>Turning Coffee Into Code : Delonghi Magnifica ESAM04.110.S Espresso Maker</title><content type='html'>&lt;div style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
 &lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState=&quot;false&quot; LatentStyleCount=&quot;156&quot;&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
&lt;/style&gt;
&lt;![endif]--&gt;

&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
 &lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState=&quot;false&quot; LatentStyleCount=&quot;156&quot;&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
&lt;/style&gt;
&lt;![endif]--&gt;

&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
 &lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState=&quot;false&quot; LatentStyleCount=&quot;156&quot;&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
&lt;/style&gt;
&lt;![endif]--&gt;&lt;span style=&quot;font-family: &amp;quot;Times New Roman&amp;quot;; font-size: 13.0pt; mso-ansi-language: EN-GB; mso-bidi-language: AR-SA; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: EN-GB;&quot;&gt;OK, you got me. This blog is neither about
software development in general, nor .Net in particular. But it is about a
topic that&#39;s close to many developers&#39; hearts: coffee. &lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;border: medium none; font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; padding: 0cm 0cm 1pt;&quot;&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: medium none; padding: 0cm;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;______________________________________________________________________________&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
 &lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState=&quot;false&quot; LatentStyleCount=&quot;156&quot;&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
&lt;/style&gt;
&lt;![endif]--&gt;

&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;I&#39;ll prefix this by saying
that I&#39;m not a coffee snob, though I do have some pretty specific ideas about
what I enjoy in a good cup. I don&#39;t like the stuff they sell at Starbucks, for
example, and I find Costa&#39;s brew is way too bitter for me. The nicest
store-bought coffee I&#39;ve tasted actually comes from McDonalds fast food
restaurants – their blend tastes really nice. If I didn&#39;t have to stand in a
line six people deep, all trying in vain to order the food they actually want
whilst some poor underpaid student embarrassedly tries to upsell them Things
They Don&#39;t Want, I&#39;d probably grab a coffee at McD&#39;s more often.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;My usual brew at home until
recently has been Gold Blend instant coffee. That said, I&#39;ve been working in
the centre of Glasgow with a great bunch of guys in a games company for the past couple of months (the first time I&#39;ve been
back there to work in a while). Being in a location that&#39;s surrounded
by every conceivable type of coffee outlet imaginable, including all of those
mentioned above within 100 yards of my office door, has got me to thinking
about coffee seriously again. That&#39;s led me to invest in a good bean-to-cup
machine, so that I can enjoy my coffee just how I want it whilst working at
home once my present contract has finished.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt; mso-ansi-language: EN-GB; mso-bidi-language: AR-SA; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: EN-GB;&quot;&gt;After some research, I chose the following machine; the
Delonghi Magnifica&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp; &lt;/span&gt;ESAM04.110.S espresso
maker :&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiramtPXCGFPFeae4EPwMlHZFd2DL5cIMp14GbZ1WfaICTXHOkAuR9YaTMAz-vxHDkJpRe8_7KdBuU0ffbOJYuUQb3gRvQ3ycFyDr9GAP1c7lBw_grMapEIkZQP9ebuP9A4kgYwrdzMcK7W/s1600/MagnificaCoffeeMaker.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiramtPXCGFPFeae4EPwMlHZFd2DL5cIMp14GbZ1WfaICTXHOkAuR9YaTMAz-vxHDkJpRe8_7KdBuU0ffbOJYuUQb3gRvQ3ycFyDr9GAP1c7lBw_grMapEIkZQP9ebuP9A4kgYwrdzMcK7W/s320/MagnificaCoffeeMaker.jpg&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
 &lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState=&quot;false&quot; LatentStyleCount=&quot;156&quot;&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
&lt;/style&gt;
&lt;![endif]--&gt;

&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;I&#39;ve tried other coffee
machines that use pre-ground coffee in the past. To be honest, the results were
not at all good. As mentioned above, I find some brands of instant coffee to be
very nice. However, if you are going to grind the beans and attempt to make the
real thing, then buying pre-ground beans is frankly a step backwards rather
than forwards from instant coffee. Coffee beans lose their flavour very quickly
indeed: within seven days of being ground. So, unless you&#39;re grinding your own
as part of the processs, you&#39;re probably not getting anywhere like the intended
flavour. Pre-ground coffees tend to have been sitting in a warehouse for
anything up to six months by the time consumers get them, so they&#39;re already
well past their best, however they&#39;ve been packaged, and whichever temperature
or atmosphere they&#39;ve been stored in.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt; mso-ansi-language: EN-GB; mso-bidi-language: AR-SA; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: EN-GB;&quot;&gt;Other unfavourable aspects of those machines I&#39;d tried
in the past (which typically cost less than £50) included the fact that they
just didn&#39;t get the water hot enough to make a great cup. So, even if the
ground coffee going in had been right, the results would still have been mediocre.
So, I thought I&#39;d invest in a &#39;proper&#39; bean-to-cup machine this time, to see if
better results were achievable at home&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 15pt;&quot;&gt;&lt;b&gt;The Good Stuff&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;1) Takes the grind out of grinding&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: 13.0pt; mso-ansi-language: EN-GB; mso-bidi-language: AR-SA; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: EN-GB;&quot;&gt;The model above alleviates the issue of ground
beans quickly losing their flavour by having an internal grinder that you can
fine tune to your own taste. You can set it to grind the beans more finely if you
want a smoother brew. (In practice, I&#39;ve found that leaving it at the median
factory setting has achieved just the right balance between a quick brew and a
fine enough grind that you get all the flavour). Because the coffee is ground
only in the right amount to make each cup and right before it&#39;s used, the
resulting flavour is generally excellent. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQj27NH9A1y1QHoQujS4yCLcUk9Lui_EVCLaayLVo_q7DN9Pe63g09NM-2OwBTOIJbN9wjSxgztQ7lLbd2BgPfeGZHO2VvdC0Pd0q-2-OQVVSIItxFoADH0aR-K8NddS22kHOAQYtaZRZU/s1600/InternalGrinder.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQj27NH9A1y1QHoQujS4yCLcUk9Lui_EVCLaayLVo_q7DN9Pe63g09NM-2OwBTOIJbN9wjSxgztQ7lLbd2BgPfeGZHO2VvdC0Pd0q-2-OQVVSIItxFoADH0aR-K8NddS22kHOAQYtaZRZU/s400/InternalGrinder.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
 &lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState=&quot;false&quot; LatentStyleCount=&quot;156&quot;&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
&lt;/style&gt;
&lt;![endif]--&gt;

&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;With this particular model,
you can also use pre-ground coffee if you really want to. However, since whole
coffee beans are generally cheaper or the same price as pre-ground coffee, and
tastes very much better, there&#39;s really no incentive to.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;2) Hot stuff&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;As it only makes one or two
cups at a time, the coffee produced is always piping hot. You can also adjust
that setting to suit your own tastes: for me, the hottest setting felt about
right. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;You can also adjust the
strength of the coffee itself. I quite like mine about 25% of the maximum possible
strength: strong enough to get a nice caffeine buzz, but without being
overpowering or resulting in too bitter a brew à la Starbucks or Costa!&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;3) Lots of choice, and beans are inexpensive&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;For beans, I&#39;ve tried two
varieties thus far: Italian &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;Lavazza&lt;/i&gt;
espresso beans, and a blend called &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;Lazy
Sunday&lt;/i&gt; by Taylors of Harrogate.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdVDpXUCku3stL6tWifLLD5c1zOnpPo99_1CsUW70dp85xHZh_Q4eKeYK6zL70uezIw_gY9QjIrH87-rBSE4oiIU49tD5ewDzI6TqPsMpqVjbjNv2rM2C0qiG1GKrStKHauGb2NMBqUyny/s1600/CoffeeBeansTried.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;259&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdVDpXUCku3stL6tWifLLD5c1zOnpPo99_1CsUW70dp85xHZh_Q4eKeYK6zL70uezIw_gY9QjIrH87-rBSE4oiIU49tD5ewDzI6TqPsMpqVjbjNv2rM2C0qiG1GKrStKHauGb2NMBqUyny/s320/CoffeeBeansTried.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;They&#39;re both nice and give a mild, creamy
coffee. However, Lazy Sunday just edges it for me. I&#39;ve also bought some &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;Illy&lt;/i&gt; beans to try in the coming weeks;
we&#39;ll see how that goes. I&#39;m looking forward to trying some other blends after
that to compare and contrast: that&#39;s all part of the fun. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;In essence, there are two
types of bean: Arabica and Robusta. There are also lots of different types of
roast, typically graded from 1 (Mild) through to 5 (Dark). &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Arabica beans (which as the
name suggests come from high-altitude regions within the Arabian Peninsula) are
the oldest and probably more mild of the two, with chocolaty tones. If your
tastes are anything like mine, they&#39;ll probably suit your palate best. Robusta
beans are grown further afield, in places like South America, the Caribbean and
Africa, at the same high altitudes. Robusta beans taste earthier and
stronger than Arabica. Some blends use a mixture of the two types: &lt;i&gt;Lazy Sunday&lt;/i&gt; is in that category.&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;The roast gradings of 1
(Mild) to 5 (Dark) are a little easier to get a handle on. Counter-intuitively,
the middle grade of 3 (Medium) is actually the most flavourful, and the one I
like the best. If the bean is roasted less than 3 then the cup will be very
mild indeed, and will contain a lot of caffeine. If it&#39;s roasted very darkly
then it&#39;ll taste very smoky, but won&#39;t contain as much caffeine since it&#39;ll
have been burnt up during the roasting process. A medium blend preserves that
caffeine kick with a nice, mild flavour: a winning combination for me! &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
 &lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState=&quot;false&quot; LatentStyleCount=&quot;156&quot;&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
&lt;/style&gt;
&lt;![endif]--&gt;

&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;4) Easy to clean&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;The Magnifica machine itself
has proven easy to clean and maintain. The coffee grounds are condensed into
little discs during the brewing process: one for each brew made.&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWHDAVaNnE2lrqsygI6Co-MFMfA8jlLhQo2fm7_gfcwHJwQLXYm1Ts8a1FaJTKPS7AhWqqPmNiwo2DjDtQ6oBxi7U444kAYhuF2OBuo7EjlwAxHgD_M8-od0N7JtuMIWwnqJTDpkyVen4v/s1600/CoffeeGroundsCompactedIntoDiscs.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWHDAVaNnE2lrqsygI6Co-MFMfA8jlLhQo2fm7_gfcwHJwQLXYm1Ts8a1FaJTKPS7AhWqqPmNiwo2DjDtQ6oBxi7U444kAYhuF2OBuo7EjlwAxHgD_M8-od0N7JtuMIWwnqJTDpkyVen4v/s320/CoffeeGroundsCompactedIntoDiscs.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
 &lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState=&quot;false&quot; LatentStyleCount=&quot;156&quot;&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
&lt;/style&gt;
&lt;![endif]--&gt;

&lt;br /&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
 &lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState=&quot;false&quot; LatentStyleCount=&quot;156&quot;&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
&lt;/style&gt;
&lt;![endif]--&gt;

&lt;br /&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
 &lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState=&quot;false&quot; LatentStyleCount=&quot;156&quot;&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
&lt;/style&gt;
&lt;![endif]--&gt;

&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;It&#39;s easy just to empty the
container out whenever the appropriate warning light comes on (about every fifteen
cups or so), then give the container a rinse out and dry it ready for the next
brew. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;The instructions advise
cleaning out the internal filter around once a month, and not to use a
dishwasher or any form of soap for cleaning (as soap can jam the very fine
metal filter the machine uses). In practice I find it easiest just to give the
filter a rinse under the tap and then dry it with a paper towel whenever the grounds container needs
emptying, and you&#39;re set to go for the next few days&#39; worth of coffee.&lt;/span&gt;&lt;/span&gt;&lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 15.0pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;The Bad Stuff&lt;/span&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;1) Price&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;The machine itself costs in
the region of £350. There are various models in the Delonghi range that go down
to about £275, and as a beginner to using espresso machines it&#39;s not that easy
to see what the benefits of one model against another are. And it&#39;s not just as
simple as choosing the newest, whizziest-bangiest option either: some of the
older models in the same range are more expensive and give better results in
terms of reliability/performance/features than newer ones. &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;I found &lt;a href=&quot;http://espresso-machine.findthebest.com/compare/549-553/DeLonghi-Magnifica-ESAM-04-110-vs-DeLonghi-Magnifica-ESAM-4200-S-EX1&quot;&gt;this
site to be quite useful for providing an independent guide&lt;/a&gt;, and for
allowing you to directly compare and contrast the different models that are
available. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;In the end, I chose the model
I did mostly because other Delonghi models in the same range had &lt;a href=&quot;http://www.amazon.co.uk/product-reviews/B001EOMZ5E/ref=sr_cr_hist_all?ie=UTF8&amp;amp;showViewpoints=1&quot;&gt;a
lot of very good customer reviews on Amazon&lt;/a&gt;, and because it happened to be
the model in the Delonghi range that was available from my local electrical
retailer. With Christmas approaching, and consequent delays in the post, I
wanted to enjoy my machine whilst I had a couple of weeks away from my current
contract over Christmas and New Year, rather than having to wait for an item to
be delivered from Amazon (which I&#39;d have been quite happy to do at other times
in the year). &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;I&#39;ve been very happy with the
model I got, though I&#39;m sure the cheaper one available through Amazon would
have been just as good.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;2) Designed by committee&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;When I was researching which
machine was right for me, I noticed a lot of variety in the options that were available.
The cost ranged from between about £250 and £900. The main thing that seemed to
differentiate the more expensive models were that they had digital controls,
and the ability to store and retrieve different settings. That didn&#39;t seem
particularly important to me, since once I&#39;d found the settings I liked I
intended to keep them that way. However, if you&#39;re buying a machine for an
office where each person has their own individual taste, the ability to store
and replicate multiple different preferences rather than fiddling with the controls
manually each time might make more sense. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;The unintuitive way that
machines in the £250-£500 bracket work is my only real quibble about the
Magnifica. It appears to have been designed by the same guy that was
responsible for Windows Vista: the controls are &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;horrible&lt;/i&gt;, and it&#39;s very easy to get confused about how to use the
machine at first, particularly for accessing the type of features you&#39;ll only
set infrequently, such as the water hardness setting.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt; mso-ansi-language: EN-GB; mso-bidi-language: AR-SA; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: EN-GB;&quot;&gt;These are the controls:&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7MHmTm0JcmF07XTK7Xe_t77yXNrervpsW_P_yf-dWW8pcJF7oh3zzek186X6F1P8MnL1C_BsXJLoHBfGrxqaKz5luLwMc9absJmNsl2-BIG-BntvKqHmck51o8gUWRClMNEHanPR1rqCM/s1600/MagnificaControlsLabelled.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7MHmTm0JcmF07XTK7Xe_t77yXNrervpsW_P_yf-dWW8pcJF7oh3zzek186X6F1P8MnL1C_BsXJLoHBfGrxqaKz5luLwMc9absJmNsl2-BIG-BntvKqHmck51o8gUWRClMNEHanPR1rqCM/s320/MagnificaControlsLabelled.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
 &lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState=&quot;false&quot; LatentStyleCount=&quot;156&quot;&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
&lt;/style&gt;
&lt;![endif]--&gt;

&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;I won&#39;t go on ad infinitum
about each individual feature, but describing just one in detail may help
demonstrate the issue. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;The coffee comes out of the
two nozzles marked &#39;A&#39; in the photograph above. These&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp; &lt;/span&gt;nozzles are also where water comes out around
twenty seconds after you switch on the machine, as it goes through a cleaning
cycle. That same cleaning cycle is repeated (with attendant unexpected hot
water flow) when the machine turns itself off after two hours on standby. There&#39;s
a drip tray on the machine, but it still makes a bit of a mess when a full flow
of water is deluged into it unexpectedly. So, I&#39;ve taken to having a cup
positioned under those nozzles at all times when I&#39;m not making a brew, just in
case it catches me unawares. The cleaning cycle can be sort of useful as you
can use the water to pre-heat your cup(s), provided you remember to position
them under the nozzles before turning the machine on!&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;So far, so good. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;Then we come to the milk
frother &#39;wand&#39; (labelled &#39;B&#39; in the photo above). This device is meant to provide
steam to froth milk for making cappuccinos. And it does. Provided you master
the magical ritual for making it work first (I suspect that&#39;s how it came to be
known as a &quot;wand&quot;). &lt;br /&gt;
&lt;br /&gt;
The process for getting frothy milk involves first pressing the button marked
&#39;C&#39;, then turning the knob marked &#39;D&#39; anti-clockwise. But don&#39;t go putting your
milk cup under the wand straight away or anything crazy like that, because what
comes out of that &#39;wand&#39; at first is - yes, you&#39;ve guessed it - boiling hot water! &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;To get the process to work
properly, you need to get that same cup that you use to catch unexpected water
flows from the coffee nozzles, and place it under the wand. Then you turn the
knob and let the boiling water turn to steam over the next ten seconds or so.
Only then do you switch over to your pre-prepared cup of milk (which should
only be about a third&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp; &lt;/span&gt;full, since it
expands in volume as you steam/froth it). If you forget to press the button
marked &#39;C&#39; before you turn the knob &#39;D&#39; you&#39;ll be waiting a long time for that flow
of boiling water to turn to steam. I personally found that a little pointless
initially: if knob &#39;D&#39; had been dedicated to the function of producing steam
there would have been no need for button &#39;C&#39; at all. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;When you&#39;re done steaming the
milk, naturally you&#39;re going to want to make some coffee to put that freshly-frothed
milk into. However, &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;Cappuccino By Vista&lt;/i&gt;
has thwarted you once again. Because it&#39;s at this juncture you&#39;ll find that the
machine is too hot to make coffee, and needs to be left alone for ten minutes or
so to cool down (by which time your milk will be flat and cold). &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13.0pt;&quot;&gt;There is a solution that
doesn&#39;t require access to a Tardis to be able to go back in time and make sure you prepare
the coffee first. That solution is to press button &#39;C&#39; again until the light
next to it goes out. This causes knob &#39;D&#39; to stop being able to produce steam and
puts it into &quot;hot water&quot; mode. Whilst in this mode, you place a cup
under knob &#39;D&#39; and turn it until steam stops flowing and boiling water resumes once
again (takes about ten seconds again). This has the corollary effect of cooling
the machine down enough to make coffee once more. See?, I knew there must be a
&#39;logical&#39; purpose to requiring two controls (a button &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;and&lt;/i&gt; a knob) to control the frother wand when at first it seemed that only one should be needed. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: &amp;quot;Times New Roman&amp;quot;; font-size: 13.0pt; mso-ansi-language: EN-GB; mso-bidi-language: AR-SA; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: EN-GB;&quot;&gt;&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;I think you&#39;ll agree the above isn&#39;t entirely logical
or user-friendly. It has the feel of a Beta Version about it. When researching which machine to buy, I read a lot of
opinion to the effect that &quot;coffee makers just do what it takes to make
great coffee, whether they&#39;re easy or intuitive to use is a secondary
consideration &quot;. I don&#39;t agree with that outlook: great tools don&#39;t just
need to produce great results, they also need to be user-friendly in order to
make the power they facilitate available to us mere mortals. So, whilst the
sometimes-obscure controls on the Magnifica may well double-up as a useful test
of debugging skills for new developers should you decide to install one in the
office (see, I&#39;m getting back on topic now), it is still a pretty inexcusable limitation
in a machine that costs £350.&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;border: medium none; font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; padding: 0cm 0cm 1pt;&quot;&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: medium none; padding: 0cm;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;_______________________________________________________________________________&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
 &lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState=&quot;false&quot; LatentStyleCount=&quot;156&quot;&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
&lt;/style&gt;
&lt;![endif]--&gt;&lt;span style=&quot;font-family: &amp;quot;Times New Roman&amp;quot;; font-size: 13.0pt; mso-ansi-language: EN-GB; mso-bidi-language: AR-SA; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: EN-GB;&quot;&gt;Bottom line, I&#39;m glad I got one. It&#39;s nice to be
able to enjoy a decent cup of Joe or two in the morning before heading out to
face the day. And, minor quibbles aside, it is actually pretty easy to use
to get a normal cup of coffee once you&#39;ve got it set up. All-in-all, I&#39;m pleased with the results and would recommend it.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQKMTtvk86ojcNlcxDZ_uYEF8hzdqR0ZR4mebQ9cfLUGv1WEV_bLkP9HfNdONaK88PcW1DBqpKkVkaPZvLUBw9bkslifVam18pkZyOnn3SzsCmUzOWJA6IqIFH4zOf0CYSB7WI7cWYFIUX/s1600/CupOfCoffee.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQKMTtvk86ojcNlcxDZ_uYEF8hzdqR0ZR4mebQ9cfLUGv1WEV_bLkP9HfNdONaK88PcW1DBqpKkVkaPZvLUBw9bkslifVam18pkZyOnn3SzsCmUzOWJA6IqIFH4zOf0CYSB7WI7cWYFIUX/s400/CupOfCoffee.jpg&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/326681830149029215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/326681830149029215'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/2013/01/turning-coffee-into-code.html' title='Turning Coffee Into Code : Delonghi Magnifica ESAM04.110.S Espresso Maker'/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiramtPXCGFPFeae4EPwMlHZFd2DL5cIMp14GbZ1WfaICTXHOkAuR9YaTMAz-vxHDkJpRe8_7KdBuU0ffbOJYuUQb3gRvQ3ycFyDr9GAP1c7lBw_grMapEIkZQP9ebuP9A4kgYwrdzMcK7W/s72-c/MagnificaCoffeeMaker.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7818882524515880477.post-761389736509129545</id><published>2012-07-12T19:58:00.000+01:00</published><updated>2012-08-06T13:25:04.427+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Management"/><category scheme="http://www.blogger.com/atom/ns#" term="People"/><category scheme="http://www.blogger.com/atom/ns#" term="Personal"/><category scheme="http://www.blogger.com/atom/ns#" term="Use of Technology"/><title type='text'>Amazon Kindle: One of the Best Tools in a Technical Pro&#39;s Arsenal</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;a href=&quot;http://1.bp.blogspot.com/-VbBNu5OLVjs/T_8ctMY_jvI/AAAAAAAAAMw/83jLX7DI4qQ/s1600/KindleForAndroid_Phone.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;a href=&quot;http://2.bp.blogspot.com/-Fd682IjJGjc/T_8cOf1uyQI/AAAAAAAAAMg/0gXTAVP_kK0/s1600/Amazon_ManageYourKindle.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;As any professional knows,
you can&#39;t get by in technology without constantly keeping your skills up to
date with emergent technologies. Of the various ways to do this, one of the
best is to choose some detailed technical books in those fields that are
presently of interest. Preferably ones that have been written by people that are
actual hands-on developers themselves, rather than those by authors that merely have an academic
interest in the subject under discussion. &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;Wrox
Press&lt;/i&gt; does an excellent line of books called &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;Programmer to Programmer&lt;/i&gt;, which are very useful in this regard. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;Once you&#39;ve absorbed the
material, and have used the technologies concerned on a few live projects,
these books become an excellent source of reference material, which you can
refer back to time and time again. If you&#39;re anything like me, you&#39;ll have a
bookshelf at home that looks something like this:&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2QgRsAZX7hL1C9ebAdNnSen_j6i5FoW6869wmryq_uNwxYvG-2H6OSPK9aBXs2QWpplPBPGxiXaqpSLZ1-sTq4v5fIPn-DxqcmH2LgY3409OgZknhmw1BP4JyRyt6GUnlak8DCUH7Lkpp/s1600/Bookshelf.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;251&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2QgRsAZX7hL1C9ebAdNnSen_j6i5FoW6869wmryq_uNwxYvG-2H6OSPK9aBXs2QWpplPBPGxiXaqpSLZ1-sTq4v5fIPn-DxqcmH2LgY3409OgZknhmw1BP4JyRyt6GUnlak8DCUH7Lkpp/s320/Bookshelf.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;RP&#39;s old technical library&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;The only downside to Wrox
books (and any other type of reference manual) is their weight. It&#39;s typically
handy to have those books that are relevant to the discrete areas you&#39;re
working in at a given time to hand as you tackle a real project. Given that even
a few books combined generally weigh around 2-3kg, that can be a real strain on
your back, especially if you&#39;re already carrying a laptop and other bits and
pieces around too.&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;Around about two years ago, I
bought an Amazon Kindle, for the express purpose of carrying around these tomes
without dislocating my spine. The passive e-ink display of the basic Kindle
device is great for reading in bright sunlight: &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipEgBIkVWreSWgrw17JTvVRc3rn0f8Dy3mDKu5a18Cuodir5HRyuhI8_67qNEgmv0txDcBUJij0HxLW6sE3-BpDHXMS9O0MJ7wt35seAByM815JRNNnJkMGqGcRCWb1T481YWPg3DmZDFJ/s1600/KindleDevice.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipEgBIkVWreSWgrw17JTvVRc3rn0f8Dy3mDKu5a18Cuodir5HRyuhI8_67qNEgmv0txDcBUJij0HxLW6sE3-BpDHXMS9O0MJ7wt35seAByM815JRNNnJkMGqGcRCWb1T481YWPg3DmZDFJ/s320/KindleDevice.jpg&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Physical Kindle Device&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;And there&#39;s a handy little
management tool on the Amazon website that allows you to keep your books safe
and available at all times, wherever you may be:&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibWCPlHHwqyIUvcJCAYwJ9gv8PYbSPik8_nDw0eUUUL-hhmxHfZRhD_ttL15l05n_eGnC8VBsJgRWcVqd7rY5nfCPduxaTosD4aYgJfxHH5ZOYcXgpt4NqhySMhSPvza3E53kIX6cJjHm8/s1600/Amazon_ManageYourKindle.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibWCPlHHwqyIUvcJCAYwJ9gv8PYbSPik8_nDw0eUUUL-hhmxHfZRhD_ttL15l05n_eGnC8VBsJgRWcVqd7rY5nfCPduxaTosD4aYgJfxHH5ZOYcXgpt4NqhySMhSPvza3E53kIX6cJjHm8/s400/Amazon_ManageYourKindle.jpg&quot; width=&quot;236&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Amazon&#39;s &quot;Manage Your Kindle&quot; tool&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;i&gt;(View full size &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibWCPlHHwqyIUvcJCAYwJ9gv8PYbSPik8_nDw0eUUUL-hhmxHfZRhD_ttL15l05n_eGnC8VBsJgRWcVqd7rY5nfCPduxaTosD4aYgJfxHH5ZOYcXgpt4NqhySMhSPvza3E53kIX6cJjHm8/s1600/Amazon_ManageYourKindle.jpg&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;)&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;The battery on a physical
Kindle device lasts for a very long time (at least a month of continual use
between charges), and the device itself has room for loads and loads of books.
There&#39;s also a free PC-for-Kindle application that allows you to view the
e-books you&#39;ve purchased on any PC. And for Android users, there&#39;s a nifty free
Kindle-for-Android app that allows you to view your books on your tablet:&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA6Hg1vL2ZX-etpSHAE9Q01TlFnC4yjbIrXFkjEcEfg4ND9vv9uOwp2HVvKf_LNOnkg36tn-utgf1BV3qGPCwQeKRyVFY7rNaWaSDYObIgyIfoYaZEIQ3NoCDok8OhbyyhmQdTiP0kxOlq/s1600/KindleForAndroid_Library.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA6Hg1vL2ZX-etpSHAE9Q01TlFnC4yjbIrXFkjEcEfg4ND9vv9uOwp2HVvKf_LNOnkg36tn-utgf1BV3qGPCwQeKRyVFY7rNaWaSDYObIgyIfoYaZEIQ3NoCDok8OhbyyhmQdTiP0kxOlq/s320/KindleForAndroid_Library.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Kindle for Android tablet, Library View&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&amp;nbsp;&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13pt;&quot;&gt;or on your Android phone:&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1Zw7Be7kaHilAR8ayvfDpXDdu76dhGzJuKq9y70JO1ImsukRCp1VvADFHJGZlTe6hjC62pWnVDhMyHJXnYjngobo6_qqwyQzqoVKovv8mdnEcqY4HFOjzZgK1zISRdVh_XTXMzNmhlX-3/s1600/KindleForAndroid_Phone.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1Zw7Be7kaHilAR8ayvfDpXDdu76dhGzJuKq9y70JO1ImsukRCp1VvADFHJGZlTe6hjC62pWnVDhMyHJXnYjngobo6_qqwyQzqoVKovv8mdnEcqY4HFOjzZgK1zISRdVh_XTXMzNmhlX-3/s320/KindleForAndroid_Phone.jpg&quot; width=&quot;206&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Kindle for Android phone&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp; &lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;These latter applications are
particularly useful if a book you happen to be using utilises colour to convey
meaning:&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left; margin-right: 1em; text-align: left;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4ENnDXFqq_CquJ-fRWr4mH2GIHAicq27lAzWKL1ZCM-JOAL9eSx6q1gD4fcsfOOHAu6XJSHMMmzftlsgGx5Ji_NhVG2Q0IwCckXurEWw93xojOyyuQau3Ct3FXovUXvsjAXxZzmf3z7_r/s1600/KindleForAndroid_ColouredCode.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4ENnDXFqq_CquJ-fRWr4mH2GIHAicq27lAzWKL1ZCM-JOAL9eSx6q1gD4fcsfOOHAu6XJSHMMmzftlsgGx5Ji_NhVG2Q0IwCckXurEWw93xojOyyuQau3Ct3FXovUXvsjAXxZzmf3z7_r/s400/KindleForAndroid_ColouredCode.jpg&quot; width=&quot;250&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Colour-Coded Keywords&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: right;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOAcL4GiTiycYXYfWF-WeCUvU1FzVfpsvp-f0eXO9HMoa9s8Pvm8elgs0Bm-YvPrJOGZ_gOBoOUVBVyvkHEanm799azBm6FB4mPGPpY7_-0E6lEnD734ok2LjOsmZcR0FkKw2kQ0cBrujW/s1600/KindleForAndroid_ColouredGraphics.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOAcL4GiTiycYXYfWF-WeCUvU1FzVfpsvp-f0eXO9HMoa9s8Pvm8elgs0Bm-YvPrJOGZ_gOBoOUVBVyvkHEanm799azBm6FB4mPGPpY7_-0E6lEnD734ok2LjOsmZcR0FkKw2kQ0cBrujW/s400/KindleForAndroid_ColouredGraphics.jpg&quot; width=&quot;250&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Coloured Graphics&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;i&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;font-size: large;&quot;&gt;(&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4ENnDXFqq_CquJ-fRWr4mH2GIHAicq27lAzWKL1ZCM-JOAL9eSx6q1gD4fcsfOOHAu6XJSHMMmzftlsgGx5Ji_NhVG2Q0IwCckXurEWw93xojOyyuQau3Ct3FXovUXvsjAXxZzmf3z7_r/s1600/KindleForAndroid_ColouredCode.jpg&quot; target=&quot;_blank&quot;&gt;View full size&lt;/a&gt;)&lt;/span&gt;&lt;/i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;i&gt;&lt;span style=&quot;font-size: large;&quot;&gt;(&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOAcL4GiTiycYXYfWF-WeCUvU1FzVfpsvp-f0eXO9HMoa9s8Pvm8elgs0Bm-YvPrJOGZ_gOBoOUVBVyvkHEanm799azBm6FB4mPGPpY7_-0E6lEnD734ok2LjOsmZcR0FkKw2kQ0cBrujW/s1600/KindleForAndroid_ColouredGraphics.jpg&quot; target=&quot;_blank&quot;&gt;View full size&lt;/a&gt;)&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;However, the best thing about
using Kindle as your technical library, which all technical departments should
take heed of, is that &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;you need only buy
each book once&lt;/i&gt;. If you&#39;ve got a department full of 20 developers (within
which there will undoubtedly be a huge overlap of skillsets), it makes sense to
buy one copy of each book, and allow each developer access to that library of virtual
books via their own PC. An organisation that wants to make effective use of
technology will also probably find it profitable to fork out for a few Tablets
and physical Kindle devices for taking into meetings. In terms of increased
profitability for individual developers, they&#39;ll pay for themselves in no time.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/761389736509129545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/761389736509129545'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/2012/07/amazon-kindle-one-of-best-tools-in.html' title='Amazon Kindle: One of the Best Tools in a Technical Pro&#39;s Arsenal'/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2QgRsAZX7hL1C9ebAdNnSen_j6i5FoW6869wmryq_uNwxYvG-2H6OSPK9aBXs2QWpplPBPGxiXaqpSLZ1-sTq4v5fIPn-DxqcmH2LgY3409OgZknhmw1BP4JyRyt6GUnlak8DCUH7Lkpp/s72-c/Bookshelf.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7818882524515880477.post-2978103644141403750</id><published>2012-04-11T13:00:00.009+01:00</published><updated>2012-07-18T17:19:58.913+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Current Afffairs"/><category scheme="http://www.blogger.com/atom/ns#" term="Use of Technology"/><title type='text'>Academia: The Internet, You&#39;re Doing It Wrong.</title><content type='html'>&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;There was an interesting article on Radio 4&#39;s &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;Today&lt;/i&gt; programme yesterday, concerning the way peer-reviewed research journals such as &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;Science&lt;/i&gt; and &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;Nature&lt;/i&gt; charge British Universities hundreds of millions of pounds each year for access to the scientific research they publish on academics&#39; behalves. In many cases, in a bizarre reversal of the normal economics of the process of publication, these journals also both charge the publishers of the research themselves for the act of publishing, &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;and&lt;/i&gt; require those authors to sign away copyright to the journals involved so the originators of the work can&#39;t even reproduce their own articles elsewhere (hence the fees – to the publisher, not to the author - when other academics later want to see what&#39;s been written by their peers).&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;The wider piece centred around a new website that&#39;s about to be launched, &lt;a href=&quot;http://wellcometrust.wordpress.com/2011/11/07/elife-a-journal-by-scientists-for-scientists/&quot;&gt;called eLife&lt;/a&gt;. The project is being championed by Sir Mark Walport, the director of the Wellcome Trust, and aims to provide a free, centralised place for research to be published instead.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;The whole piece got me thinking about how Universities, and for that matter most publicly-funded bodies, don&#39;t seem to use information technology at all well, most particularly the web. The apparent benefits of peer-reviewed publications, at least in the eyes of those academics that choose to publish their work through them, is that they allow other academics in their fields an easy way to find and review their research. This apparently enables them to collaborate better and promotes further scientific development. Because, you know, unless publications like &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;Nature&lt;/i&gt; et al existed, academic research would be otherwise impossible to publicise, find and share.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOSiIu8LOTZo9rhON8c_qLqNd0X7PWmXPhbUzZ8miVhTKhBQVkOtQVIsf6gADv_wM260MKQo-Oz8cbQtuWBk4DGhmm6V7QHlf8lWx_yxQXzsQ9lQl1Azrc-1HSu5jKJVATVJc9nvAYRNy0/s1600/WhatIsWikipedia.gif&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOSiIu8LOTZo9rhON8c_qLqNd0X7PWmXPhbUzZ8miVhTKhBQVkOtQVIsf6gADv_wM260MKQo-Oz8cbQtuWBk4DGhmm6V7QHlf8lWx_yxQXzsQ9lQl1Azrc-1HSu5jKJVATVJc9nvAYRNy0/s1600/WhatIsWikipedia.gif&quot; /&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;If only there were an effective way to search the internet using some sort of tool – kind of like an engine for searching, if you will – that could enable academics to allow their work to be discovered that way instead? And wouldn&#39;t it also be nice if there were some existing, free, centralised, widely-respected encyclopaedia of knowledge, that was editable by anyone, and that was well-indexed by these &#39;search engines&#39;. In an ideal world we could even make that online encyclopaedia itself searchable in its own right. In such a technological Nirvana, academics of all flavours could easily just publish their own original research on their own blogs, within their own institutions&#39; websites, whenever they liked for little to no cost, retain the copyright themselves, then provide an entry in that centralised encyclopaedia of knowledge containing links to their own independently-published research. That way anyone, including other academics, could then subsequently easily find and develop their ideas. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;But no, I can&#39;t see us having that sort of technology until at least the next millennium, so I guess Universities will just have to keep handing over millions of their tuition fees and state research funding money to journals that provide a shadow of the above service for a fee instead. And who then also charge anyone that wants to read it too. &lt;/span&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/2978103644141403750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/2978103644141403750'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/2012/04/academia-internet-youre-doing-it-wrong.html' title='Academia: The Internet, You&#39;re Doing It Wrong.'/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOSiIu8LOTZo9rhON8c_qLqNd0X7PWmXPhbUzZ8miVhTKhBQVkOtQVIsf6gADv_wM260MKQo-Oz8cbQtuWBk4DGhmm6V7QHlf8lWx_yxQXzsQ9lQl1Azrc-1HSu5jKJVATVJc9nvAYRNy0/s72-c/WhatIsWikipedia.gif" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7818882524515880477.post-5615678070054894178</id><published>2012-04-09T13:46:00.005+01:00</published><updated>2012-04-24T09:40:36.242+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Product Reviews"/><category scheme="http://www.blogger.com/atom/ns#" term="Security"/><title type='text'>Update: Loftek Sentinel D1 Review</title><content type='html'>&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13pt;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;Despite the Loftek Sentinel D1 CCTV camera that I &lt;a href=&quot;http://www.rachelpierson.blogspot.com/2012/04/product-review-loftek-sentinel-d1-cctv.html&quot; target=&quot;_blank&quot;&gt;reviewed recently&lt;/a&gt; performing well when first installed, I regret to report that it unfortunately developed a fault within 2 days of installation, ultimately necessitating my returning the unit for a refund. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;The fault manifested itself by the camera stopping working during a pan &lt;span style=&quot;font-family: &amp;quot;Times New Roman&amp;quot;;&quot;&gt;movement&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Times New Roman&amp;quot;; font-size: 13pt;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;on day 2 of operation. I had thought perhaps that it might be a temporary fault that could be easily rectified. Being a professional geek, I tried all of the obvious solutions before concluding the problem was with the unit itself:&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; margin-left: 72pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;1)&lt;span style=&quot;-moz-font-feature-settings: normal; -moz-font-language-override: normal; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;Resetting the unit, both using the power supply itself and the reset button on the cable bundle.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; margin-left: 36pt;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; margin-left: 72pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;2)&lt;span style=&quot;-moz-font-feature-settings: normal; -moz-font-language-override: normal; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;Hard-wiring a connection to the camera to check if it&#39;d lost network configuration settings somehow (it hadn&#39;t).&lt;br style=&quot;mso-special-character: line-break;&quot; /&gt; &lt;br style=&quot;mso-special-character: line-break;&quot; /&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; margin-left: 72pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;3)&lt;span style=&quot;-moz-font-feature-settings: normal; -moz-font-language-override: normal; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;Checking whether my router&#39;s signal had for some reason stopped reaching the location of the camera (located only 10m from the router, on the outside of my property). Both my mobile phone and my laptop could &#39;see&#39; my router from the camera&#39;s location without difficulty, leading me to conclude that the problem was definitely with the camera&#39;s own ability to communicate over that distance, rather than being a problem with the router itself.&lt;br style=&quot;mso-special-character: line-break;&quot; /&gt; &lt;br style=&quot;mso-special-character: line-break;&quot; /&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; margin-left: 72pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;4)&lt;span style=&quot;-moz-font-feature-settings: normal; -moz-font-language-override: normal; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;Despite the fact that (3) above tended to rule out any problem with the router&#39;s signal, I tried alternative channels on the router, including auto-channel select (which should find the best available channel), with no success. &lt;br style=&quot;mso-special-character: line-break;&quot; /&gt; &lt;br style=&quot;mso-special-character: line-break;&quot; /&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; margin-left: 72pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;5)&lt;span style=&quot;-moz-font-feature-settings: normal; -moz-font-language-override: normal; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;Bringing my router out to my garage, less than 1 metre from the camera, did cause the camera to begin being able to transmit on the network once again. This conclusively proved that the problem wasn&#39;t with the configuration settings, power to the camera or a mechanical issue with the camera, but was definitively a camera to router signal propagation issue. [If it had been a router to camera propagation issue, then my other wireless devices wouldn&#39;t have been able to communicate from the camera&#39;s location whilst the router was in its usual indoor position. Also, it was clearly a fault that had developed, rather than simply being a characteristic of the camera, since the camera itself had been able to communicate with my router in its indoor location for the initial 48 hours after first installation.] Unfortunately, I couldn&#39;t leave my router outside in the garage just to allow the camera to work over a much shorter distance, as it would then be out of range of my hard-wired internet connection, negating the purpose of having a wireless camera in the first place.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;I contacted Loftek to give them a fair chance to recommend a fix to the problem. Unfortunately, their technical advice appeared limited to suggestions that frankly I could have got by watching an old episode of &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;The IT Crowd&lt;/i&gt;. They said to try changing the router&#39;s channel (I hadn&#39;t told them that I&#39;d already tried that, but I had explained in my e-mail that other wireless devices could connect to my router over the same distance, which should have ruled out frequency interference as a possibility). In their only other suggestion, they actually used the phrase &quot;try switching the camera off and back on again&quot;. Really, any techie that still gives the old &quot;try switching it off and on again&quot; advice to someone that&#39;s demonstrated they&#39;re reasonably technically proficient should be deeply, deeply embarrassed.&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;So, with regret, my ultimate conclusion about the Loftek Sentinel D1 is that it was a good idea, but the unit itself is so unreliable as to make it unworkable in practice. Going by the mass of traffic to my blog with search terms such as &quot;Loftek Sentinel D1 wireless doesn&#39;t work&quot; since posting my review, I&#39;m guessing I&#39;m not the only one that&#39;s experienced difficulty. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;Good luck, dear readers, with your own technical woes. I hope you have better luck making this product work than I did. If not, try switching it off and.......never mind. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/5615678070054894178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/5615678070054894178'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/2012/04/update-loftek-sentinel-d1-review.html' title='Update: Loftek Sentinel D1 Review'/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7818882524515880477.post-2810535065387131740</id><published>2012-04-08T00:07:00.020+01:00</published><updated>2012-07-12T23:32:11.556+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Product Reviews"/><category scheme="http://www.blogger.com/atom/ns#" term="Security"/><title type='text'>Product Review: Loftek Sentinel D1 CCTV camera</title><content type='html'>&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqwiKAeba94pWrNsURMPgP_r60nL4T4G3t21zByExtLvSLShxZ4yiBs5arihu0Y1qXb4oTAeJMZjgY6q2wOwk5XIkGOQFlCm402fDcARNXQSawqVzn_XoRi-Amb-dnCYyWwBZh2ObKPJZU/s1600/LoftekManufacturersImage.jpg&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; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqwiKAeba94pWrNsURMPgP_r60nL4T4G3t21zByExtLvSLShxZ4yiBs5arihu0Y1qXb4oTAeJMZjgY6q2wOwk5XIkGOQFlCm402fDcARNXQSawqVzn_XoRi-Amb-dnCYyWwBZh2ObKPJZU/s1600/LoftekManufacturersImage.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;This is a product review for the Loftek Sentinel D1 CCTV security camera that I installed at home &lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;recently&lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;, &lt;a href=&quot;http://www.amazon.co.uk/Sentinel-d1-Professional-Wireless-Surveillance-Department/dp/B006MQPJUM/ref=sr_1_1?ie=UTF8&amp;amp;qid=1333839995&amp;amp;sr=8-1&quot; target=&quot;_blank&quot;&gt;available in the UK for £115 from Amazon&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;NB&lt;/span&gt;&lt;/b&gt;: Please read the post below in conjunction with my &lt;a href=&quot;http://www.rachelpierson.blogspot.com/2012/04/update-loftek-sentinel-d1-review.html&quot; target=&quot;_blank&quot;&gt;subsequent update to this review&lt;/a&gt;.&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;________________________________________________________________________________&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;I chose this particular camera because I wanted a more subtle method of security for my property than a more in-your-face CCTV system could have provided. The dome design on this model means that it can easily pass for a light fitting, and is therefore not too obtrusive, thereby allowing me to beef up security in a subtle but effective way, without making my home feel like Fort Knox. Other more overt camera systems may provide a greater degree of visible deterrence to vandals and thieves, if that&#39;s what you&#39;re looking for, but for a home setting in a quiet residential area that you want to remain welcoming, this felt like the right choice.&lt;br /&gt;
&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: right; margin-left: 1em; text-align: right;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoBDy4uGC24NaYzFd3VICcWBa_Lmi81XtO8IE8TcNJ2tflEgYQTVAeYXZs9HTlmnpRfV1QGzBkBTugpdZc1zqv-XLNXTXHSWE4U98ETyppu3S1Tu5eEeIkp4kElpBnUL0CCcGv0PSGTtO9/s1600/Wosthis.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoBDy4uGC24NaYzFd3VICcWBa_Lmi81XtO8IE8TcNJ2tflEgYQTVAeYXZs9HTlmnpRfV1QGzBkBTugpdZc1zqv-XLNXTXHSWE4U98ETyppu3S1Tu5eEeIkp4kElpBnUL0CCcGv0PSGTtO9/s320/Wosthis.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Wos this?&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;On the technical front, being a geek by profession, I found no difficulty in getting this item set up within minutes of opening the box. It was merely a matter of attaching the camera to my wired network (via a LAN port on my wireless router) in the first instance, then you have the option of either installing the enclosed IP Camera software to obtain the device&#39;s IP address, or simply use your router management software to identify the IP address that your home network has assigned to the camera. After that, just use any popular browser (Firefox worked for me, and I tested IE9 too) to navigate to the camera&#39;s setup page, by typing the camera&#39;s IP address into the browser. &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left; margin-right: 1em; text-align: left;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX4BAXmdaIKTEc4475mA5TbDMQG4ehTgxO_1pEbup1YZL6Pum9V-1SXYE-LZl6J4M7vJXjQ4fLbqxWt47h8edkw_WNFipX7vFeriJ_zoguod8QYatwChpeAJeNwT2zqDq5Tbs1j8IuLeq3/s1600/TabletApp.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX4BAXmdaIKTEc4475mA5TbDMQG4ehTgxO_1pEbup1YZL6Pum9V-1SXYE-LZl6J4M7vJXjQ4fLbqxWt47h8edkw_WNFipX7vFeriJ_zoguod8QYatwChpeAJeNwT2zqDq5Tbs1j8IuLeq3/s320/TabletApp.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;tinyCam for Android running on an ASUS Transformer tablet PC&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh_BZ3ph5b1A1CZT3aEqvgHN6ZpL_Ij-JK9HUIBQq0efQYwOSqubYI-h1ZYTjZv5Cfe76IRQbH0djRiZ4_xOoBB0q39ciwghE_FpfBd1XEbyXBUQ4ZnPgkE88KJQBqTpqCiNhZ3-9-0mpf/s1600/AndroidPhoneApp.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh_BZ3ph5b1A1CZT3aEqvgHN6ZpL_Ij-JK9HUIBQq0efQYwOSqubYI-h1ZYTjZv5Cfe76IRQbH0djRiZ4_xOoBB0q39ciwghE_FpfBd1XEbyXBUQ4ZnPgkE88KJQBqTpqCiNhZ3-9-0mpf/s320/AndroidPhoneApp.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;...and on an Android phone&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: right; margin-left: 1em; text-align: right;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0cSByuYrBF3e31x0mtNFWbyMu-JxsDdlRA2uVdjn-W-RZnCExiiJz23DQAv8oMOXBihMhLgVLIykHOlYxSVdinwRLMBTfC1qMdbLBoYHDx6NHbcGo0rg4KAiRMa85WvsIkWW23zaDJN7N/s1600/Web-basedcameramanager.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;173&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0cSByuYrBF3e31x0mtNFWbyMu-JxsDdlRA2uVdjn-W-RZnCExiiJz23DQAv8oMOXBihMhLgVLIykHOlYxSVdinwRLMBTfC1qMdbLBoYHDx6NHbcGo0rg4KAiRMa85WvsIkWW23zaDJN7N/s320/Web-basedcameramanager.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Screen dump of the browser-based configuration utility&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;The home page guides you to install some third party software from VLC to view and control the actual camera feed, and you&#39;re off. Finally, use the camera&#39;s web-based configuration utility to provide the device with your wireless network settings. After that you can dispense with the wired connection, which you wont need again. I found that the camera retained wireless configuration settings, even when switched off during the actual installation process. So, once set up, the device seems to be pretty stable to issues like power cuts that might otherwise have been a problem for a less well thought out design. I also tested accessing the camera using my Android tablet, and found that to be very easy too. There&#39;s a free app called tinyCam monitor that does the job. There are also other applications for a modest fee (typically less than £5) that purport to enable you to store images online or on your device&#39;s SD card, based on real time rolling imagery or on motion-sensitive images. I haven&#39;t tested any of these capabilities, and therefore can&#39;t comment on whether this model or the Android apps mentioned work for these purposes.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left; margin-right: 1em; text-align: left;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimkU5b1ScUSFryIB4BvxsCKgTStERc4313tKGrK-VdDwYsxx6zadeTlzZM0gREHeViMMMuqEvSzoeifqeCAlz5xJ1tSdvThOZ06fSdt9QjlymW-cWc1zgBrC0a9dEDpkqa9MgfxprTvkkQ/s1600/InSitu.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimkU5b1ScUSFryIB4BvxsCKgTStERc4313tKGrK-VdDwYsxx6zadeTlzZM0gREHeViMMMuqEvSzoeifqeCAlz5xJ1tSdvThOZ06fSdt9QjlymW-cWc1zgBrC0a9dEDpkqa9MgfxprTvkkQ/s320/InSitu.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;My installation &lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;With regard to the hardware itself, the only slightly-misleading thing for me was the fact that the unit requires a wireless antenna, which screws into the side of the camera itself rather than being located in a more subtle location such as at the cabling terminus. This isn&#39;t shown in the product photographs provided. If you look at the manufacturer&#39;s images, there&#39;s a little gold protrusion shown, that looks like the end of a screw that goes right through the bracket holding the unit.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: right; margin-left: 1em; text-align: right;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJS7KmnHAGPh1bv3qRIGJIyJVIQuZKtJ_ox2nKkm6RD29X1vq8WIxOhWMUmR1N010hS7sNsMQfm7qe1335u5m-AwRWCXPO3d8CbH10JAdS2LAqQai8RkXyqlem8ZkfA60DcU76OJt9P-Ss/s1600/Antennamissingfrommanufacturersimages.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;262&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJS7KmnHAGPh1bv3qRIGJIyJVIQuZKtJ_ox2nKkm6RD29X1vq8WIxOhWMUmR1N010hS7sNsMQfm7qe1335u5m-AwRWCXPO3d8CbH10JAdS2LAqQai8RkXyqlem8ZkfA60DcU76OJt9P-Ss/s320/Antennamissingfrommanufacturersimages.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Manufacturer&#39;s image, with antenna missing&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;/div&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;That&#39;s not actually a screw, though: it&#39;s the connector for the antenna, which isn&#39;t shown, and which is about 7 inches in length when fitted. This reduces the visual appeal of the device, by making it more obvious that it&#39;s a camera. There is still the option of connecting a wireless access point to the cabling terminus of the device (which is hidden away near the power supply), but still, it&#39;d have been nice to see the product as it really appears, rather than having visual details like this being left off of the product photos. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;Having read some of the &lt;a href=&quot;http://www.amazon.com/sentinel-Professional-Waterproof-Surveillance-Department/product-reviews/B0067WL60I/ref=sr_cr_hist_all?ie=UTF8&amp;amp;showViewpoints=1&quot; target=&quot;_blank&quot;&gt;other reviews available online for this item&lt;/a&gt;, I had been a little worried that I might experience some issues with autofocus whilst panning to areas at different focal lengths (some of the American reviewers referenced above had indicated that they&#39;d had difficulty in this regard, and had been instructed by the retailer to adjust the focus manually by removing the camera&#39;s cover and using a screwdriver). However, I needn&#39;t have worried, as I simply didn&#39;t experience this issue. If this were ever a problem, the current model doesn&#39;t appear to suffer from it. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;The low light facility on this camera is pretty damn impressive. It&#39;s not an infrared camera, and that&#39;s not what I&#39;d decided upon for this particular installation, preferring instead to rely on visible lighting around my property. The first day after I installed the camera, though, I was in the position of still having to replace some external lighting that had failed over time (job now done, though it took an angle grinder and a lot of sparks to remove one of the old light fittings - apologies to any of my neighbours disturbed by the brief but wrenching noise of that process!). Because I &lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;had a day of darkness before I replaced that broken external lighting, &lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;I &lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;inadvertently &lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;had the opportunity to see how the camera performed in near-complete darkness. Under those conditions, I could still make out a reasonable amount of detail and colour, just from the ambient light provided by a streetlight across the road (see the sample photos below for a comparison of daylight, full dark, and moderately lit nighttime camera images). I felt that the &#39;moderately lit by a 60W door light&#39; images were quite good enough for my purposes, negating the need for a camera with full night vision capabilities that I had been considering as an alternative.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left; margin-right: 1em; text-align: left;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD7zmzDFXOxKhdLO6cqzddvgTZYylpC3LkABdNeQa0P8nyii8e0wCZzV1OQ-aQxr5r9Sv4TIenwuU97fJXokj1INtUvCt-X9V_xIHgbuScWqhR_dWpDa5LJVJUDU1NHdXOCuCQe9RCZKl1/s1600/DaylightImage.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;150&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD7zmzDFXOxKhdLO6cqzddvgTZYylpC3LkABdNeQa0P8nyii8e0wCZzV1OQ-aQxr5r9Sv4TIenwuU97fJXokj1INtUvCt-X9V_xIHgbuScWqhR_dWpDa5LJVJUDU1NHdXOCuCQe9RCZKl1/s200/DaylightImage.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Daylight&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: right; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJO4-A55daoukaH8gy03WpdY_nwOH4PmUpZUK9HvlSeNHWvli_gHo6sea1XgugLhcWiK1X4zSvvbSPQqWCRO0_CGeE4JCkLNyAR5uOdRytsYL2rryL9dPXV3OG7V1a2pLk66DbVzS2BvVK/s1600/Lit+by+one+60W+bulb.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;150&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJO4-A55daoukaH8gy03WpdY_nwOH4PmUpZUK9HvlSeNHWvli_gHo6sea1XgugLhcWiK1X4zSvvbSPQqWCRO0_CGeE4JCkLNyAR5uOdRytsYL2rryL9dPXV3OG7V1a2pLk66DbVzS2BvVK/s200/Lit+by+one+60W+bulb.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Lit by one 60W bulb&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiXTUFMcHRLEDEyqmSrQ9vbjFETkaHROEkHFJ4Ff30bZtTWbYtwb-QTkZ4xR9pImj13nGxTDomP4sRv_mcNRC7QUoMvenbO0eE4alJ3updkJvvuN__TXwmtskrWitCK_jHqS42MoMwUsni/s1600/CompleteDarkness.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;150&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiXTUFMcHRLEDEyqmSrQ9vbjFETkaHROEkHFJ4Ff30bZtTWbYtwb-QTkZ4xR9pImj13nGxTDomP4sRv_mcNRC7QUoMvenbO0eE4alJ3updkJvvuN__TXwmtskrWitCK_jHqS42MoMwUsni/s200/CompleteDarkness.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Complete Darkness&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;Lastly, I&#39;d say this model is a good option for securing your own property, whilst respecting the privacy of your neighbours. I can see everything I need to see on my own property. However, the fact that the camera is limited to a moderate 3x zoom means that whilst it&#39;s more than enough to identify callers at the front door, the view it necessarily gives of any public areas and neighbouring houses actually has less resolution than the view I can get from looking out of my own front window or walking down the public street. I see this as a good thing. Some of the cameras I reviewed before deciding upon this item were way too highly-powered for a residential area, offering up to 22x magnification in some cases; it&#39;d be hard to justify the need for that sort of resolution outside an industrial setting.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;Overall: I think this an excellent camera, at a reasonable price that represents good value for money, and that&#39;s not too hard to set up. I&#39;d recommend it for use in a domestic setting, especially for areas where fixed cabling may be an issue, provided you don&#39;t require true night vision for your specific purposes. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/2810535065387131740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/2810535065387131740'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/2012/04/product-review-loftek-sentinel-d1-cctv.html' title='Product Review: Loftek Sentinel D1 CCTV camera'/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqwiKAeba94pWrNsURMPgP_r60nL4T4G3t21zByExtLvSLShxZ4yiBs5arihu0Y1qXb4oTAeJMZjgY6q2wOwk5XIkGOQFlCm402fDcARNXQSawqVzn_XoRi-Amb-dnCYyWwBZh2ObKPJZU/s72-c/LoftekManufacturersImage.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7818882524515880477.post-6440201861084867957</id><published>2012-02-06T17:35:00.003+00:00</published><updated>2014-02-22T17:56:48.443+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Silverlight"/><category scheme="http://www.blogger.com/atom/ns#" term="VBlogs (discontinued)"/><title type='text'>Silverlight Data Binding: A comparison of INotifyPropertyChanged and DependencyObject.</title><content type='html'>&lt;div style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13pt;&quot;&gt;NB: Owing to YouTube&#39;s policy of trying to force Google+ on YouTube members, I no&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; longer&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; font-size: 13pt;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt; host content on YouTube. Apologies for the inconvenience.&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;The project I worked on most recently involved using Silverlight 4 in conjunction with Prism and MEF. This entry is a brief tutorial on one of the core concepts in Silverlight : data binding, which can be achieved in two main ways, each with benefits specific to the contexts in which they&#39;re best suited.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/Hx4l2N_z-_g?ap=%2526fmt%3D22&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/6440201861084867957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/6440201861084867957'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/2012/02/silverlight-data-binding-comparison-of.html' title='Silverlight Data Binding: A comparison of INotifyPropertyChanged and DependencyObject.'/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/Hx4l2N_z-_g/default.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7818882524515880477.post-634542740087305628</id><published>2011-11-26T11:45:00.007+00:00</published><updated>2012-07-16T23:34:32.203+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Personal"/><title type='text'>Moving, keep on moving.</title><content type='html'>&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;The company that I’m working for at present is in the process not just of designing their latest product, but of moving offices. A small advance party has been sorting out arrangements at our new location over the past few weeks, and, on Friday, our team became the first group to take up permanent residence. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;This is how the new place looks. Somewhere in that photo, there are eight developers hard at work &lt;i&gt;[clue: the kitchen, containing the coffee machine, is just out of shot on the left]&lt;/i&gt;. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZcIaxCLZ127vi5sGyFz7OIdLbxGM6plf4FcW8V8K5I8oJsoYN4eUD3W4b2kRfd2l1xkRNFoGUiqgPmTheoVH2itGiYYaVnRdFiXK_Gzxvv-1S9KKOLQxb8YXSjeQEefy_73vG-r6JSKp0/s1600/NewLocation.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZcIaxCLZ127vi5sGyFz7OIdLbxGM6plf4FcW8V8K5I8oJsoYN4eUD3W4b2kRfd2l1xkRNFoGUiqgPmTheoVH2itGiYYaVnRdFiXK_Gzxvv-1S9KKOLQxb8YXSjeQEefy_73vG-r6JSKp0/s400/NewLocation.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;It was kind of weird having the whole place to ourselves for now. I guess that will change soon enough, as the rest of the company ships across over the next month. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;The open-plan layout represents a stark contrast to the previous location, which was rather warren-like in character. It’s nice – I like it. The only thing that had me slightly perturbed was that, despite only being a couple of miles from the old place, my satnav decided to get creative when I left for the evening, and took me home via an entirely different route to the one it recommended from the old place, involving lots of unfamiliar local roads. &amp;nbsp;It turned out to be a very fast route indeed, but it did make me wonder, as I belted along in the dark, about the &lt;a href=&quot;http://en.wikipedia.org/wiki/Chaos_theory&quot; target=&quot;_blank&quot;&gt;mathematical implications&lt;/a&gt; of the &lt;a href=&quot;http://en.wikipedia.org/wiki/A-star_algorithm&quot; target=&quot;_blank&quot;&gt;common algorithms used&lt;/a&gt; by satnav devices in selecting the ‘best route’ from A to B that could result in such radically different conclusions when A moves by just 2 miles. I think that must mean I’m a software developer at heart. :)&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/634542740087305628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/634542740087305628'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/2011/11/moving-keep-on-moving.html' title='Moving, keep on moving.'/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZcIaxCLZ127vi5sGyFz7OIdLbxGM6plf4FcW8V8K5I8oJsoYN4eUD3W4b2kRfd2l1xkRNFoGUiqgPmTheoVH2itGiYYaVnRdFiXK_Gzxvv-1S9KKOLQxb8YXSjeQEefy_73vG-r6JSKp0/s72-c/NewLocation.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7818882524515880477.post-6206658377273798611</id><published>2011-11-05T20:56:00.010+00:00</published><updated>2013-06-22T11:42:40.666+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MEF"/><category scheme="http://www.blogger.com/atom/ns#" term="MVVM"/><category scheme="http://www.blogger.com/atom/ns#" term="Prism"/><category scheme="http://www.blogger.com/atom/ns#" term="Silverlight"/><title type='text'>Silverlight, Prism &amp; MEF</title><content type='html'>&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;In my latest project I’ve been working with &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;Silverlight&lt;/i&gt; (version 4), in conjunction with Microsoft’s &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;Prism&lt;/i&gt; framework, and the &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;Managed Extensibility Framework&lt;/i&gt; (MEF). &lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;Prism was designed by Microsoft&#39;s Patterns 
&amp;amp; Practices group, and is also sometimes known by the somewhat less catchy title of 
“Compososite Application Guidance”. It&#39;s a generalised framework for 
composing UIs in WPF and Silverlight that are comprised of loosely-coupled parts. It makes use of patterns like Dependency Injection / Inversion of Control to achieve loose coupling between the various constituent components of a solution. This means that those components can be designed by teams working in isolation, and leaves the design open to be extended in the future. Whilst Prism itself isn’t specifically tied to the MVVM pattern, the loose coupling it enables is typically used by developers &lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;working in Silverlight or WPF &lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;as a mechanism to help implement that pattern, and to thereby leverage the testability and extensibility benefits that MVVM bestows. My current project has also provided some other interesting challenges for me, in the form of technologies that I’ve been encountering for the first time in a live project. Specifically, for reasons related to the product itself, the project I’m working on utilises several &lt;i&gt;Postgres&lt;/i&gt; databases running within a &lt;i&gt;Linux&lt;/i&gt; environment – not an everyday challenge for a .Net developer by any means. This blog entry provides a brief overview of the above toolsets, and their purpose within the overall design.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;border-bottom: double windowtext 2.25pt; border: none; mso-element: para-border-div; padding: 0cm 0cm 1.0pt 0cm;&quot;&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: none; mso-border-bottom-alt: double windowtext 2.25pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm; padding: 0cm;&quot;&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;  &lt;/span&gt;&lt;br /&gt;
&lt;hr align=&quot;center&quot; size=&quot;2&quot; width=&quot;100%&quot; /&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI-AVlhhBsn0LgduHl6jhMTI3HQo4pWYNoFtUHGfaKYuwZAU6GhDNUaGPz5zL1X6kvofEHPd84qTXs5sYU5RIfKHRjJ8kySF2oF1EHdyY7WNiJskDVpVThRKx15iZ64W0a9dAJa38ZXNa1/s1600/MVVM.gif&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI-AVlhhBsn0LgduHl6jhMTI3HQo4pWYNoFtUHGfaKYuwZAU6GhDNUaGPz5zL1X6kvofEHPd84qTXs5sYU5RIfKHRjJ8kySF2oF1EHdyY7WNiJskDVpVThRKx15iZ64W0a9dAJa38ZXNa1/s1600/MVVM.gif&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;MVVM&lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt; (Model View ViewModel) is a development pattern that was first proposed by John Gossman, and is based on an even earlier pattern by Martin Fowler called the &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;Presentation Model&lt;/i&gt;. I wont attempt to describe MVVM in full here (there are a great many other articles available on the web that do that far better than I could, for example &lt;a href=&quot;http://msdn.microsoft.com/en-us/magazine/dd419663.aspx&quot;&gt;this one here&lt;/a&gt;, as well as useful training videos that give you an introduction to some actual coding techniques to implement the pattern. More on those later.) For the purposes of this blog, I’ll just summarise by saying that MVVM is a pattern that takes code that would ordinarily reside in code behind files, and pushes that code into separate areas of the application known as ViewModels. The code that resides in these separate ViewModel classes represents the pure business logic of the application. This is where the pattern starts to become useful in ways that have made it the most popular and widely-adopted approach for extensible WPF and Silverlight applications. Separating concerns in this way makes the ViewModels in which the business logic resides independently unit testable, which in turn makes the design more resilient to ongoing development and change. So, any developers that need to alter the design in the future after initial development has been completed and the product is in a care and maintenance phase can have greater confidence that any changes they may implement will not break existing code.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left; margin-right: 1em; text-align: left;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4UUiSLFFCB9PLPTDTFv62ozbevDhwjV9xIebWRAT7fUPu9Wx2R08nvaNQj4x-CX0gFI_KJiqaA3jcNq4B9AEX-pH6X00eKSDMoQfnqM8kBypxjQSXmNGdMX9hpeVRLxm9b-949krwbNkH/s1600/MVVMLightToolkit.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;107&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4UUiSLFFCB9PLPTDTFv62ozbevDhwjV9xIebWRAT7fUPu9Wx2R08nvaNQj4x-CX0gFI_KJiqaA3jcNq4B9AEX-pH6X00eKSDMoQfnqM8kBypxjQSXmNGdMX9hpeVRLxm9b-949krwbNkH/s200/MVVMLightToolkit.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Prism: Not the only option for implementing MVVM&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;Prism isn&#39;t the only option for implementing the MVVM pattern. There are many alternative MVVM frameworks out there, e.g. the &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;&lt;a href=&quot;http://mvvmlight.codeplex.com/&quot;&gt;MVVM Light Toolkit&lt;/a&gt;&lt;/i&gt;. As noted, &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;&lt;a href=&quot;http://compositewpf.codeplex.com/wikipage?title=Model%20View%20ViewModel%20%28MVVM%29&quot;&gt;Prism version 4&lt;/a&gt;&lt;/i&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;isn&#39;t in itself tied to MVVM in any way. It’s just a generalised framework for designing extensible, composite UIs that exhibit loose coupling. However, the loose coupling that Prism provides is commonly used by WPF and Silverlight developers as an enabling mechanism for implementing MVVM&lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;. Which framework and pattern you may choose for a given solution is entirely a judgement call. Prism and/or MVVM may well be over-complicated for some types of simple application. Just because you&#39;re working in WPF or Silverlight, doesn&#39;t mean you should de facto be using Prism, or implementing MVVM. There are overheads involved in deciding to use each, and it&#39;s worth noting that they won’t be the right choice for every single project that uses those technologies. Even John Gossman himself has suggested that some of the approaches that MVVM facilitates may be overkill for simpler applications that are not intended to be long-lived, extendable or scalable. Prism contains a great many discrete features for building composite UIs. (e.g., it provides a selection of Navigation frameworks, the ability to group individual Views into Regions and Modules, has integration with the separate Unity or MEF components for Dependency Injection, and even facilitates the option to use your own preferred DI framework of which there are &lt;a href=&quot;http://www.palmmedia.de/Blog/2011/8/30/ioc-container-benchmark-performance-comparison&quot; target=&quot;_blank&quot;&gt;literally dozens of options&lt;/a&gt; if you prefer, as well as features such as its Event Aggregator which facilitates communication between loosely-coupled components in a way that leaves the publishing and consuming components freely independent of one another). However, what&#39;s nicest about Prism is that developers are free to pick and choose which specific parts of that significant set of features they will use for their own particular solution. You don’t have to use it. And, if you do choose to, you’re not forced to use it all.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;When implementing MVVM, Prism may be used in a range of discrete ways to facilitate reliable, scalable results in a reasonable amount of time. &lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-NLpQG9rN3lMyY9MjfCUaNP2jFHMFLlD3MQ1dk-p1hYoaWlJGbqo8zPQqSLuyMfv5iHs1Vts9WYI1n86Fg8wi50ru63eygybYt8SsHBvr-2Q3VCXOde2KGgm8254ddyroo6_FK8yhhLo8/s1600/Prism4BookCover.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-NLpQG9rN3lMyY9MjfCUaNP2jFHMFLlD3MQ1dk-p1hYoaWlJGbqo8zPQqSLuyMfv5iHs1Vts9WYI1n86Fg8wi50ru63eygybYt8SsHBvr-2Q3VCXOde2KGgm8254ddyroo6_FK8yhhLo8/s200/Prism4BookCover.jpg&quot; width=&quot;162&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;I wont go into all of Prism’s more discrete areas that I touched upon above within this blog, but can recommend &lt;a href=&quot;http://www.amazon.co.uk/gp/product/B004VB3URY/ref=docs-os-doi_0&quot;&gt;this excellent guide to Prism&lt;/a&gt; in conjunction with &lt;a href=&quot;http://www.amazon.co.uk/gp/product/B0047T86IS/ref=docs-os-doi_0&quot;&gt;this equally-enlightening guide to Silverlight 4 development&lt;/a&gt; for further reading. The Prism guide is part-written by the lovely Ward Bell, whose insightful videos on IdeaBlade’s &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;DevForce&lt;/i&gt; ORM tool gave me many an enlightening chuckle a few years back. Get ’em on Kindle so that you can read them on your PC instead of lugging heavy books around – you know it makes sense. &lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;;)&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYHB2x0azbyYHwK3FB18ubM-96SNtLCEdAo-whak7c-AfZEmWniqDve6JvVkNRPa1PlI0I_bUnCqs2DDcQAgcBsDoUgRxx5Xqknh9CSNcnkh56RrOLW6JY3TlXQUvrZHzQGbKEMPook9Gl/s1600/DLL_Hell.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;Before moving on from this discussion of Prism and MVVM, I&#39;ll just lastly note that there&#39;s a &lt;a href=&quot;http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2009/10/27/prism-and-silverlight-screencasts-on-channel-9.aspx&quot; target=&quot;_blank&quot;&gt;great little series of instructional videos by Microsoft&#39;s Mike Taulty&lt;/a&gt; available.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;iframe allowfullscreen=&#39;allowfullscreen&#39; webkitallowfullscreen=&#39;webkitallowfullscreen&#39; mozallowfullscreen=&#39;mozallowfullscreen&#39; width=&#39;320&#39; height=&#39;266&#39; src=&#39;https://www.youtube.com/embed/ni5YuyYR8-Q?feature=player_embedded&#39; frameborder=&#39;0&#39;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;It&#39;s a rare individual that can grasp technical concepts clearly, and communicate them to others. Mike manages to do so beautifully over the course of just a few hours. His videos are great for getting a feel not just for what Prism and MVVM can do, but also along the way they give quite a bit of insight into how composite applications can be more complicated to understand than traditional, tightly-coupled designs. And they demonstrate how easy it is to build up an &lt;i&gt;illusion&lt;/i&gt; of loose coupling using frameworks like Prism, whilst in realty just turning turning tight coupling that would otherwise cause build errors at design time into breaking functionality at runtime that are harder to track down and eliminate from the design. When you get to the part of the videos where Mike is having to copy DLLs into bin folders by hand to ensure that the project still works as expected you&#39;ll see what I mean. &lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYHB2x0azbyYHwK3FB18ubM-96SNtLCEdAo-whak7c-AfZEmWniqDve6JvVkNRPa1PlI0I_bUnCqs2DDcQAgcBsDoUgRxx5Xqknh9CSNcnkh56RrOLW6JY3TlXQUvrZHzQGbKEMPook9Gl/s1600/DLL_Hell.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;160&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYHB2x0azbyYHwK3FB18ubM-96SNtLCEdAo-whak7c-AfZEmWniqDve6JvVkNRPa1PlI0I_bUnCqs2DDcQAgcBsDoUgRxx5Xqknh9CSNcnkh56RrOLW6JY3TlXQUvrZHzQGbKEMPook9Gl/s320/DLL_Hell.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;I appreciate that Mike&#39;s videos do contain some contrived examples, but still voluntarily immersing yourself back in the Bad Old Days of DLL Hell isn&#39;t what any pattern or practice that&#39;s meant to make developers’ lives easier should be about.&amp;nbsp; That illusion of loose coupling whilst really still having all the same interdependencies of tight coupling in disguise is also evident when Mike doesn&#39;t attempt to type in the XAML configuration files that describe how his Modules should be loaded and what dependencies they will have on one another. He instead stops the video when it gets to those points and gets said config files from a Blue Peter -stylie pre-prepared example, because in his own words typing in such config files by hand is “prone to error”. It&#39;s ridiculously easy to get such configuation information wrong in ways that will only become apparent when a user tries to use the components controlled by them at runtime. And it&#39;s even easier to get the configs &lt;i&gt;right&lt;/i&gt; in the first instance, but for them to become invalidated at some later point during the lifetime of the extensible application involved by later development work. It&#39;s a judgement call for the developer/architect to make as to whether the risks vs rewards of using Prism make using it the right decision for a given project. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;Getting back to MVVM as a concept in its own right, as I mentioned the last time I wrote about Silverlight, one of the main strengths of and purposes behind the XAML-based design environment that each of these technologies uses is the separation of concerns that XAML facilitates between the related but distinct goals of design and development. Using XAML as a common medium allows designers that are primarily concerned with the look and feel of an application to work hand-in-hand with developers, whose primary responsibility is making sure the application actually does what it was functionally intended to do. MVVM adds a further refinement to that collaborative effort within WPF/Silverlight. It enables developers to protect their work against any unintended behaviour that may be introduced after initial development, by allowing their business logic code to be unit tested in isolation from the purely visual elements of the solution. For designers, MVVM allows the visual elements that they are most interested in (called the &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;Views&lt;/i&gt;) to be designed independently from the application state and business logic stored in the ViewModels. In the case of designers, using MVVM is also useful for simulating application state at design time, thereby allowing them to refine the visual representation that the UI will be required to have when it experiences those states when the application actually runs. The final part of MVVM – Models – concerns those parts of the application that are purely concerned with the business of communicating with whichever specific back-end database is being used. This is particularly useful in allowing developers to focus on business logic in isolation, without becoming overly-involved in issues that are more generally within the purview of DBAs. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left; margin-right: 1em; text-align: left;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6HkCMHZxLfqMeeIMNku_bF_hi48mhNBm_DoL0TULHzPj1ojIz6fMDB08SdRGB2nhvOmZrvzj5llzAUgrZjZPKHA6IKkOHPw4eLh-niA-ClOVmAi_mSqfKrK9qXY11Hi9gauwmuwOk6drW/s1600/WixDesignersAndDevelopers.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6HkCMHZxLfqMeeIMNku_bF_hi48mhNBm_DoL0TULHzPj1ojIz6fMDB08SdRGB2nhvOmZrvzj5llzAUgrZjZPKHA6IKkOHPw4eLh-niA-ClOVmAi_mSqfKrK9qXY11Hi9gauwmuwOk6drW/s320/WixDesignersAndDevelopers.jpg&quot; width=&quot;205&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Some clichés about Web Designers &lt;br /&gt;
and Developers. And Women.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;Designers use a tool called &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;Expression Blend&lt;/i&gt; to work on the visual elements of WPF/Silverlight applications. As a developer, you can think of &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;Blend&lt;/i&gt; as a great big Photo Shop for Visual Studio 2010. It allows all those subtle little visual effects that differentiate between professional and amateur software products to be applied to functional designs in a way that takes those designs from being merely useable to being useable + refined. One of the first problems that users of &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;Blend&lt;/i&gt; typically experience when working with .Net projects is that any moderately-complex business logic that is tightly coupled with UI elements has a fairly high probability of completely breaking Blend. Typically, problems that will break Blend in this way include things like database connectivity that is not available at design time being required to provide data for the UI Element’s initialisation. Since Blend semi-initialises components in order to render them in its design surface, this presents an additional challenge for developers. If you’re a developer user of Blend, initialisation issues of the type described are just about a manageable problem, since it’s possible to attached Visual Studio’s debugger to the Blend executable using Visual Studio’s &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;“Debug -&amp;gt; Attach to Process…”&lt;/i&gt; feature, and thereby discover at precisely which point in the code Blend is failing to render a given control. Fixes to such problems will typically involve using C#’s &lt;/span&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:WordDocument&gt;   &lt;w:View&gt;Normal&lt;/w:View&gt;   &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:PunctuationKerning/&gt;   &lt;w:ValidateAgainstSchemas/&gt;   &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:Compatibility&gt;    &lt;w:BreakWrappedTables/&gt;    &lt;w:SnapToGridInCell/&gt;    &lt;w:WrapTextWithPunct/&gt;    &lt;w:UseAsianBreakRules/&gt;    &lt;w:DontGrowAutofit/&gt;   &lt;/w:Compatibility&gt;   &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:LatentStyles DefLockedState=&quot;false&quot; LatentStyleCount=&quot;156&quot;&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
&lt;/style&gt; &lt;![endif]--&gt;&lt;span style=&quot;font-family: Consolas; font-size: 10.5pt; mso-ansi-language: EN-GB; mso-bidi-font-family: &amp;quot;Times New Roman&amp;quot;; mso-bidi-language: AR-SA; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: EN-GB;&quot;&gt;System.ComponentModel.&lt;span style=&quot;color: #2b91af;&quot;&gt;DesignerProperties&lt;/span&gt;.IsInDesignTool&lt;/span&gt;&lt;span style=&quot;font-size: 10.5pt;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;Property to intelligently protect those areas of code that are erroring out. For designers, who typically don’t touch the underlying code, this issue can present more of a brick wall – if there’s an area of code underlying a UI element that they need to style that doesn’t work, they’re pretty much stuck without a developer’s help. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;By using MVVM, any code that UI Elements use can be separated out into their own classes (called ViewModels). By separating concerns in this way from the outset, it makes it less likely that UI Elements will be fundamentally unable to be rendered in Blend at design time. Most MVVM frameworks will render any constructor logic within a base ViewModel class that utilises the &lt;/span&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:WordDocument&gt;   &lt;w:View&gt;Normal&lt;/w:View&gt;   &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:PunctuationKerning/&gt;   &lt;w:ValidateAgainstSchemas/&gt;   &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:Compatibility&gt;    &lt;w:BreakWrappedTables/&gt;    &lt;w:SnapToGridInCell/&gt;    &lt;w:WrapTextWithPunct/&gt;    &lt;w:UseAsianBreakRules/&gt;    &lt;w:DontGrowAutofit/&gt;   &lt;/w:Compatibility&gt;   &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:LatentStyles DefLockedState=&quot;false&quot; LatentStyleCount=&quot;156&quot;&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-ansi-language:#0400;
 mso-fareast-language:#0400;
 mso-bidi-language:#0400;}
&lt;/style&gt; &lt;![endif]--&gt;&lt;span style=&quot;color: #2b91af; font-family: Consolas; font-size: 10.5pt; mso-ansi-language: EN-GB; mso-bidi-font-family: &amp;quot;Times New Roman&amp;quot;; mso-bidi-language: AR-SA; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: EN-GB;&quot;&gt;DesignerProperties&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 10.5pt; mso-ansi-language: EN-GB; mso-bidi-font-family: &amp;quot;Times New Roman&amp;quot;; mso-bidi-language: AR-SA; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: EN-GB;&quot;&gt;.IsInDesignTool&lt;/span&gt;&lt;span style=&quot;font-size: 10.5pt;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;Property mentioned above within a common base constructor. By solving this problem once and for all, and avoiding rather than dealing with the consequences of designtime / runtime issues of this type, MVVM helps to significantly reduce the number of occasions when design members of the team will have to call on busy developers for help.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;Concentrating on the developer-centric benefits of MVVM, by separating out business logic code into ViewModels developers obtain in return greater control over the stability and testability of their functional code. If you’ve worked on a software product of any level of complexity with a moderately-sized team, you’ll know that there is ample scope for code that has been written, debugged and tested to begin experiencing unanticipated behaviour at some later point in the development cycle, through no fault of the original developer or tester. Developers that are starting out (and even some that have been around long enough to know better!) are sometimes misguided enough to believe that their own code is bug-free. &lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMHu48_jBZmEk37pv15ZLGHxFo5WJ_lOCytj3eNcytMLsNNBJ-RHh52nDfMrcVLVrkF0giJikqbdl-TM8LezPSbzWsn8J2lnbKtK_ARgMOsnPriAApiB6LpMiSg1p23Shl5JkQM6LypvYn/s1600/ITestInProduction.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMHu48_jBZmEk37pv15ZLGHxFo5WJ_lOCytj3eNcytMLsNNBJ-RHh52nDfMrcVLVrkF0giJikqbdl-TM8LezPSbzWsn8J2lnbKtK_ARgMOsnPriAApiB6LpMiSg1p23Shl5JkQM6LypvYn/s320/ITestInProduction.jpg&quot; width=&quot;256&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;This is usually not the case, but, even if we were living in some mythical Nirvana universe where we were all super-developers that produced error-free code first time every time, there is still ample scope for any developer of any level of ability to have bugs inadvertently introduced into their code by other team members as the collaborative software product you’re building together evolves over the course of the project. This is where the Unit Testing that MVVM facilitates becomes useful. Just to make my position clear on this subject: I’m not an advocate of what I would term ‘fundamentalist’ Test Driven Development. Which is to say that I don’t advocate the approach to TDD that involves writing tests before writing code, or that encourages writing lots of meaningless tests for even the most simplistic parts of the system. I do, however, support the concept of writing tests to protect existing human-tested code against unanticipated bugs being introduced by subsequent development. MVVM allows various frameworks such as the Managed Extensibility Framework (&lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;MEF&lt;/i&gt;) and &lt;i&gt;Unity&lt;/i&gt; to work in conjunction with Unit Testing and Mocking frameworks such as &lt;i&gt;xUnit&lt;/i&gt; and &lt;i&gt;Moq&lt;/i&gt; to test ViewModels in isolation at design/test time. This allows developers to set up unit tests that automate the process of confirming &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;‘What should happen if…’&lt;/i&gt; scenarios. [And, in the case of MEF, there is also lots more functionality on offer, including the ability to group loosely-coupled independent components of the solution into a coherent composite application. You can find lots of good info about &lt;a href=&quot;http://msdn.microsoft.com/en-us/Silverlight4TrainingCourse_SL4LOB_08_05_MEF&quot;&gt;how to use MEF in conjunction with Silverlight here&lt;/a&gt;. ]&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;Well, so much for this overview. I’m enjoying working with Prism, as well as the other tools/environments that I mentioned such as Postgres and Linux for the first time, and thereby evolving into an ever-more-experienced developer with first-hand insight into how a range of technologies are being used on live projects. As the name of this blog suggests, it’s not just the code or the software products that I’ve been involved in building over the years that’s a Work In Progress, it’s myself and my professional experience that are ever-evolving. One of the things that makes that process of learning and personal development possible is having a great team to work with in a positive and forward-thinking environment. I’m very pleased to be working with such a knowledgeable team at this time, who have many strengths in those areas that are newest to me, and are open enough in their outlook to allow my ideas and discrete experience to be part of their already-impressive mix too.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/6206658377273798611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/6206658377273798611'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/2011/11/silverlight-prism-mef.html' title='Silverlight, Prism &amp; MEF'/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI-AVlhhBsn0LgduHl6jhMTI3HQo4pWYNoFtUHGfaKYuwZAU6GhDNUaGPz5zL1X6kvofEHPd84qTXs5sYU5RIfKHRjJ8kySF2oF1EHdyY7WNiJskDVpVThRKx15iZ64W0a9dAJa38ZXNa1/s72-c/MVVM.gif" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7818882524515880477.post-8566681003705993187</id><published>2011-08-08T20:36:00.009+01:00</published><updated>2012-07-16T22:26:45.083+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Product Reviews"/><title type='text'>Product Review: 120 Gb Outbacker MXP Biometric Hard Drive</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVJOu9qeD7f6PO3kHr4qXOeLeG_85xPWy29x2OvM7GyjnmX-uul2EnMubkUIxULSAAyFp3KuBraaAbZIJ7r9W9xc_bT4GQ8wx4Qx788pTwzAE4bJ3wVTxiOgiESNugne8O5TmzsyzNH9Hg/s1600/McAfee_Outbacker_MXP_120Gb.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVJOu9qeD7f6PO3kHr4qXOeLeG_85xPWy29x2OvM7GyjnmX-uul2EnMubkUIxULSAAyFp3KuBraaAbZIJ7r9W9xc_bT4GQ8wx4Qx788pTwzAE4bJ3wVTxiOgiESNugne8O5TmzsyzNH9Hg/s320/McAfee_Outbacker_MXP_120Gb.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;This is a great little tool for using in environments where you’re required to work with sensitive data. The biometrics in the device behave flawlessly (having heard about some other less-than-impressive implementations of fingerprint recognition technology, I had been a little worried that this item would be one of those that had lots of ‘false negatives’, but I needn’t have worried – it does what it’s designed to do, and it does it every time). The drive itself is sturdy, small and absolutely silent in operation. It doesn’t heat up in the slightest, and the rubber feet and chunky construction mean that it sits steadily on whichever surface you put it on, so you can use the fingerprint reader with one hand, without having to use your other hand to steady the unit. It also comes with a power adapter (which, admittedly, looks a little flimsy and makeshift once you plug the UK adapter into the two-pronged US-format base unit). On my PC and laptop, the power adapter wasn’t needed anyway, provided I plugged it straight into a USB port (it wouldn’t work on its own through an unpowered USB hub). For £40, I think the fact that it comes packaged with an adapter at all is pretty impressive; many of the more expensive drives I’ve bought have had adapter sockets, but haven’t come with an adapter unit. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;The pre-loaded software works seamlessly in Windows 7, and is well thought-out. You just plug the unit in, and a new drive appears in your list that contains the start.exe programme you need to get going. Double-clicking on start.exe guides you through the simple (less than one minute) process of registering two fingerprints and setting you up to use the drive. You choose an administrator password during that initial setup (which you can use to access the drive should the biometrics fail at any point, or should you be in a position where you can’t physically access the drive but still want to unlock it; e.g., if you’re using VPN to access a PC it’s connected to). After that initial setup, it’s just a matter of plugging the drive into whichever PC you want to use it on, swiping your finger once over the reader, and you’re good to go. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;My only slight quibble is the ugly, branded “McAfee” logo that’s been plastered over the top of the drive! It’s hideous!! If you want to, you can remove this eyesore easily enough with the edge of a coin, just like using a scratch card, without damaging the underlying silver paint. To avoid any mess as the little flecks of powder-coat paint re-adhere themselves to the silver case after rubbing off the logo, I recommend covering the logo with ordinary, clear sellotape first, then rubbing gently over the tape with the edge of a coin, then peeling back the tape to remove the logo (which adheres neatly to the tape and comes off cleanly in one piece rather than turning into thousands of individual sticky dust particles). &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;In terms of transfer speed, the on-the-fly encryption used is just about noticeable. The transfer speed I saw on large ( &amp;gt; 6Gb) files was around 10Mb/s. My unencrypted SATA II drive manages around 40Mb/s by comparison. This was still a good enough performance for me, and compared favourably with the SSD + TrueCrypt Traveller Disk arrangement I had been using prior to this purchase. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;All in all, minor quibbles aside, this is easily the best bargain I’ve seen in a while. £40 for a reliable 120Gb biometric drive that has reasonable transfer speed is simply superb value. I recommend this item for anyone that’s serious about security, but who doesn’t want to have the hassle of setting up TrueCrypt/Bitlocker etc, or remembering passwords, whilst moving data around.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;You can buy one &lt;a href=&quot;http://www.amazon.co.uk/exec/obidos/ASIN/B004ULFWB2/ref=ox_ya_os_product&quot;&gt;here&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/8566681003705993187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/8566681003705993187'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/2011/08/product-review-120-gb-outbacker-mxp.html' title='Product Review: 120 Gb Outbacker MXP Biometric Hard Drive'/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVJOu9qeD7f6PO3kHr4qXOeLeG_85xPWy29x2OvM7GyjnmX-uul2EnMubkUIxULSAAyFp3KuBraaAbZIJ7r9W9xc_bT4GQ8wx4Qx788pTwzAE4bJ3wVTxiOgiESNugne8O5TmzsyzNH9Hg/s72-c/McAfee_Outbacker_MXP_120Gb.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7818882524515880477.post-8037219184046411440</id><published>2011-02-19T23:49:00.039+00:00</published><updated>2012-07-16T22:31:28.200+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Management"/><category scheme="http://www.blogger.com/atom/ns#" term="People"/><title type='text'>Code Reviews</title><content type='html'>&lt;style&gt;
&lt;!--
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
 {mso-style-parent:&quot;&quot;;
 margin:0cm;
 margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:12.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-fareast-font-family:&quot;Times New Roman&quot;;}
@page Section1
 {size:612.0pt 792.0pt;
 margin:72.0pt 90.0pt 72.0pt 90.0pt;
 mso-header-margin:36.0pt;
 mso-footer-margin:36.0pt;
 mso-paper-source:0;}
div.Section1
 {page:Section1;}
--&gt;
&lt;/style&gt;  &lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;One of the practices that&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;’&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;s become semi-common within development teams over the past ten years or so has been the observance of formalised management/peer reviews of team members’ work, known as &lt;i&gt;Code Reviews&lt;/i&gt;. The specific format these reviews take, and who carries them out, varies quite a bit from workplace to workplace, and project to project. This article covers some of the approaches I’ve encountered within various working environments, and provides some personal viewpoints on what works and what doesn’t when carrying out reviews.&amp;nbsp; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;  &lt;/span&gt;&lt;br /&gt;
&lt;hr align=&quot;center&quot; size=&quot;2&quot; width=&quot;100%&quot; /&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;When I first started writing software professionally, in the late 1980’s, it was a fairly solitary activity. Development ‘Teams’ tended to be comprised of at most two or three individuals. Often, only one of those people would be writing the actual code, and it was rarely the case that anyone other than that single coder would take an interest in the actual implementation of the solution (as distinct from a user-level understanding of the functionality being developed). Code reviews were therefore fairly superfluous to the development process – solutions either worked, or they didn’t, and it was usually fairly easy to see what was or wasn’t working without having to enter into too much analysis of the subject. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;In recent years, since around about the turn of the millennium, it’s become more popular to have larger development teams, comprised of more specialised (and less broadly-skilled) individuals. The reasons for this change in approach are many and varied, but perhaps one of the main drivers is that there are so many more development technologies available now in comparison to those early days, and having larger teams allows different parts of those larger and more diverse teams to better focus on more specific parts of the solution. It’s common nowadays to find 3-4 developers, a DBA (sometimes more than one, especially in the Public Sector), Business Analysts (including some that don’t have a coding background), Project Managers, and specialist users with expert knowledge of the problem being solved, all working together within dedicated teams aimed at producing a single software product. There are some advantages to this more modern approach, including greater support for individuals within the team and an increased ability to fill gaps left by any departing members, though there are some disadvantages too. Specifically, a corollary of working within those larger and more diverse teams is that, when working on multiple fronts consecutively, there is more chance of any one particular area of work getting out of sync with the rest of the team’s activity. By increasing the separation of concerns, development teams also multiply their potential points of failure. This is where Code Reviews come in. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Code Reviews, when done correctly, can have multiple benefits to a properly-functioning and well-motivated team. They can help individuals to communicate their ideas with, and engage in mutual learning from the experience of, their peers and technical management, thereby facilitating a two-way process of learning and mutual understanding. They can make the product being developed more robust and maintainable, since it stands to reason that the more members of the team that know about the logic behind the wider implementation (including parts of that implementation they may not have worked on directly themselves), the easier it’ll be for any one developer to take over another’s work if the demands of the team (sickness, holidays, re-prioritisation, etc) dictate. Perhaps most importantly, though, Code Reviews enable individual developers to understand the impact that their own work has within the context of the wider team’s direction. They enable individual members of the team to contribute their own part of the wider effort in conjunction with rather than in isolation from the concurrent activity going on around about them. In this way, they encourage each member of the team’s work to be part of a widely-understood set of greater goals, rather than just leaving each individual to contribute their part of what eventually becomes a patchwork quilt of loosely-aligned ideas.&amp;nbsp; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;If carried out incorrectly, on the other hand, Code Reviews can be extremely damaging to a team’s morale. If conducted in the wrong spirit, advice passed on during code reviews can seem, from the perspective of the recipient, to merely represent unnecessary interference in, unwelcome distraction from, and unjustified criticism of, their work. They can create a climate of fear that stifles individual initiative. If done badly enough, they can breed resentment that ultimately leads otherwise skilled people to (correctly or not) conclude that they can’t do right for doing wrong, sapping their confidence and motivation, and diminishing the team&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;’s productivity&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;So, how best do them properly? Well, in my humble opinion from two decades of being on the receiving and delivering end of same, here are some of the things that I’ve seen work worst and best during my career:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;1) Keep It Private&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOY8yi-Syrru6xMXqb8YC6nuwLXfItiA7W2wSIkLMLceVNESKrWEi88s-Xjkfgg9bRd9Y5oKeA5rr_K4KsHuLJrAsWYunrpIAq0ZV0OAMpG_5Bf1FottsS6K5qBRc6oIL-SGC2CnkAgVuQ/s1600/Mega.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOY8yi-Syrru6xMXqb8YC6nuwLXfItiA7W2wSIkLMLceVNESKrWEi88s-Xjkfgg9bRd9Y5oKeA5rr_K4KsHuLJrAsWYunrpIAq0ZV0OAMpG_5Bf1FottsS6K5qBRc6oIL-SGC2CnkAgVuQ/s320/Mega.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;I’ve found it best to always give reviews about individual developers’ work directly to the person concerned, face-to-face and in private. If more than one individual is involved in a particular piece of discrete work, it’s of course fine to have a conversation together with all of the parties concerned aside from the wider team, but any discussion of individuals’ work should never be done in front of uninvolved members of the team. It’s human nature to perceive even constructive criticism as a negative experience, where that constructive criticism is delivered before an audience of the recipient(s)’ peers. The self-same feedback that would be perceived as well-meaning advice if delivered in private, can sound like the harshest criticism if given in public; context is everything. I once knew a lead developer that not only gave code reviews in public at individual developers’ desks in front of the whole development office, but who also later wrote about those individuals’ work in clearly-identifying terms on his internet-facing public blog. I guess he must have mistakenly thought of the internet as an anonymous medium and considered his blog in much the same way that other people might think of their private diaries. Ouch. My advice is to never behave in this way, however tempted you may be to vent frustration and however much you may feel that an individual deserves it. Criticising your peers (or, even worse, your direct reports, who look to you for even-handed guidance and leadership) in public is never a classy way to behave. Doing so is guaranteed to immediately lose you credibility with the very people whose work you should be trying to positively influence – who wants to work for someone that appears only to be interested in embarrassing and deriding them in public? What you should aim to achieve out of each Code Review is a more motivated and better-informed team member, and an insight into that team member’s thought processes for yourself; it’s plain to see that you’re unlikely to achieve either of those outcomes by merely seeking to criticise or denigrate people in public.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Code Reviews are either Win-Win or they are Lose-Lose for the parties involved; by providing any constructive criticism you have to make in private, you’ll help ensure the former rather than the latter outcome.&lt;br /&gt;
&lt;br /&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;2)&amp;nbsp; It’s Not All About The Negatives&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;One of the things that can make Code Reviews become a morale-sapping chore rather than the productive exercise they should be is if a perception is allowed to develop amongst the team that they&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;’&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;re merely used to provide oversight of those being reviewed, to pick up on any areas where there&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;’&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;s room for improvement. For experienced technical professionals (who are most often experts in their particular field, and are regularly the most experienced member of the team in whatever it is that they individually specialise in) this can sometimes feel like a wholly-negative experience. Even where the technical reviewer is of equal experience in a given technology, it’ll certainly be the case that the person being reviewed has a greater knowledge of the solution as it was developed, since they will be the very person that built the thing. They’ll know precisely why they chose implementation ‘X’ over possible alternative ‘Y’, and can resent it if someone with ten minutes’ understanding of their work chooses to focus exclusively upon perceived negatives in preference to recognising the bigger picture. It’s not that reviewers should be afraid of giving relevant feedback where necessary – they should by all means do so, that’s one of the things they’re there to do – but it is highly beneficial to the process if that feedback can be delivered in a way that avoids alienating the skilled people whose initiative and expertise the reviewer should be seeking to encourage and nurture. One of the key things that makes for such an effective review is that the reviewer should make clear that any constructive criticism being passed on is being given within the context of a generally acceptable performance by the person being reviewed (if indeed that is the case, which it should be in all bar exceptional circumstances: if the reviewer was responsible for mentoring and briefing the person whose work they are now reviewing, and the reviewer has been keeping an eye on source control during the development process, any major problems discussed during a code review shouldn’t come as a total surprise to either the reviewer or the developer – unaddressed major problems should have been spotted and raised well in advance of a retrospective code review). Showing appreciation for the many positives of your direct reports’ efforts within the wider context of a rounded and balanced review of what they have produced goes a long way to lending credibility to any suggestions for improvement you may have to make. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;3) Don’t Nit Pick&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQYW_im2FyxVcfIEJGWx-_LqTgVw5yi84KjC9sFY7VO1qyVPBa3eBFr_BJIqM3d0mNXn7rHuUVTY9Ft_QAzT5eVefrfD9SxFCOGFxoRbiwu504_j8Y7Q6EaWlLrN0zskCSOwmwnYYJgVti/s1600/Pedantry.gif&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;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQYW_im2FyxVcfIEJGWx-_LqTgVw5yi84KjC9sFY7VO1qyVPBa3eBFr_BJIqM3d0mNXn7rHuUVTY9Ft_QAzT5eVefrfD9SxFCOGFxoRbiwu504_j8Y7Q6EaWlLrN0zskCSOwmwnYYJgVti/s320/Pedantry.gif&quot; width=&quot;292&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;This is related to but subtly different from &lt;i&gt;It’s Not All About The Negatives&lt;/i&gt; above. The first and foremost consideration when you’re giving a review should be whether the work you’re reviewing actually does what it was functionally intended to by the developer, and envisaged to by any specification document. If the solution does meet those criteria, that’s the biggest single tick in the box, whether or not you may have implemented things subtly differently yourself. Within the context of that big picture, a rounded review may also encompass some more esoteric developer-level issues such as the coupling and cohesion evident in the design, how well abstraction of concerns has been achieved, whether the developer has adhered to any design patterns that had been set in advance, the readability of the code, whether the developer has included meaningful comments, etc. However, it’s advisable to avoid commenting on trivial issues, such as the variable names used, or the developer’s use of white space (unless there are glaring and inconsistent gaps that make the code hard to read). The only time it’s appropriate to comment on something as subjective and individual as variable names is if the developer is using generic names like String1, String2, etc, instead of labels that make it clear what the variable is actually for. Perceived wisdom on the ‘best’ naming conventions for Variables, Classes, etc varies wildly from workplace to workplace, and even from project to project within the same workplace. On the whole, it’s best not to focus too much on minor details like these during formal reviews. If you make the mistake of being over-controlling, whatever you may ‘gain’ from that approach in terms of control and code consistency, you invariably lose in terms of individual initiative and the developer’s pride of ownership in their work (and the inner motivation to do their best that professional pride brings). Trying to micromanage every aspect of a person’s work is a sure-fire way to stifle their initiative, and ruin their self-confidence, which in the long run reduces the team&#39;s productivity. It’s far more beneficial if developers walk away from code reviews with an accurate sense that the reviewer trusted their judgement enough not to sweat the small stuff, and only bothered them with feedback that was worth their time and the reviewer’s time. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;4) Use The Review To Communicate Across The Team&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd13d15anTWWlUmVf_ADdVhL4uuhkgmP098laYs00yJB-wtfdbFgZQ0W3tHltaRlspIJtdgCfUENuNjNHzra1LJlHf6SJJu3z8C0fSF_ZA5Y8HVNkKsAnU4Xg-d_bvACuxkYGDvA67NQER/s1600/Comms.gif&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd13d15anTWWlUmVf_ADdVhL4uuhkgmP098laYs00yJB-wtfdbFgZQ0W3tHltaRlspIJtdgCfUENuNjNHzra1LJlHf6SJJu3z8C0fSF_ZA5Y8HVNkKsAnU4Xg-d_bvACuxkYGDvA67NQER/s1600/Comms.gif&quot; /&gt;&lt;/a&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;I mentioned above that one of the most beneficial aspects of Code Reviews are that they allow individuals within the team to gain a broader perspective on where their work falls into the bigger picture of concurrent activity going on within the wider team. Code Reviews can be a good time to discuss other areas of the wider solution with developers that are uninvolved with those areas, and to explain where the work being reviewed is intended to fit in with those separate parts of the wider team’s activity. This helps provide an element of useful redundancy within the team (in case developers need to cover for one another or take over one another’s responsibilities for a time), and helps communicate a greater understanding of why certain strategic decisions have been made. From the perspective of the reviewer (who will generally be the lead developer or development manager), Code Reviews also help communicate intent from individual developers back to those guiding the overall solution; as touched upon earlier, good reviews should involve a two-way flow of useful information and feedback.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;5) Write It Down&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Code Reviews should be formally documented, and held confidentially for later reference only by the reviewer and the person whose work was the subject of the review. This formal record of the review should ideally only be 1-2 pages long, will contain less than 500 words in most cases, and no more than 1000 words in any event. The written outcome should be a list of bullet points of any positive and negative observations to be raised, that the reviewer brings two copies of to the meeting and uses to guide the discussion, then e-mails to the person being reviewed after the meeting. It’s advisable not to send this document in advance, since the brief nature of a bulleted list can be taken out of context if the issues it pertains to aren’t given context by being elaborated upon in person. Another reason for waiting until after the meeting to mail the document to the recipient of the review is that it allows you to incorporate any feedback from the meeting itself into the formal record, and to note any specific outcomes that are expected (such as any remedial work that may have been&amp;nbsp; requested). If you’re feeling brave and you’d like to encourage openness and communication, it’s also an idea to include a section at the bottom of the document headed : &lt;i&gt;“And how did I do?”&lt;/i&gt;. This encourages the recipient of the review to give you any feedback they wish on any aspect of the process. Any given project needs to have one distinct individual that is entrusted with responsibility for the overall direction of the solution, and that individual will usually be the person conducting the code review&lt;/span&gt;&lt;style&gt;
&lt;!--
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
 {mso-style-parent:&quot;&quot;;
 margin:0cm;
 margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:12.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-fareast-font-family:&quot;Times New Roman&quot;;}
@page Section1
 {size:595.3pt 841.9pt;
 margin:72.0pt 90.0pt 72.0pt 90.0pt;
 mso-header-margin:35.4pt;
 mso-footer-margin:35.4pt;
 mso-paper-source:0;}
div.Section1
 {page:Section1;}
--&gt;
&lt;/style&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;s (though I have seen working environments where developers have been asked to review one another’s code on a regular basis, which I don’t think worked particularly well - developers like to be able to focus on their own work in the main, and they often perceive it as a distracting and unnecessary chore if they&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;’&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;re instead tasked with regularly commenting on their peers’ work; perhaps most importantly, though, developers’ time is too valuable to waste on administrative tasks that the technical leadership of the team should be shouldering for themselves&lt;span style=&quot;color: black;&quot;&gt;). &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Meaningful communication between members of the team is the key to making sure that the main technical decision maker knows everything they need to know to do their job effectively. If communication is truly to be bi-directional, in a code review it’s advisable to document any feedback from the person being reviewed alongside any critique the reviewer may have made of their work.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;  &lt;/span&gt;&lt;br /&gt;
&lt;hr align=&quot;center&quot; size=&quot;2&quot; width=&quot;100%&quot; /&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;So much for Code Reviews, and the best and worst of how I’ve seen them employed in various places. I of course welcome any reviews of the above that anyone out there may care to make. ;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/8037219184046411440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/8037219184046411440'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/2011/02/code-reviews.html' title='Code Reviews'/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOY8yi-Syrru6xMXqb8YC6nuwLXfItiA7W2wSIkLMLceVNESKrWEi88s-Xjkfgg9bRd9Y5oKeA5rr_K4KsHuLJrAsWYunrpIAq0ZV0OAMpG_5Bf1FottsS6K5qBRc6oIL-SGC2CnkAgVuQ/s72-c/Mega.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7818882524515880477.post-7474015880848320063</id><published>2011-02-10T21:24:00.064+00:00</published><updated>2012-07-16T22:43:46.116+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ASP.Net"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="VB"/><title type='text'>ASPX Page Life Cycle</title><content type='html'>&lt;style&gt;
&lt;!--
 /* Font Definitions */
 @font-face
 {font-family:Wingdings;
 panose-1:5 0 0 0 0 0 0 0 0 0;
 mso-font-charset:2;
 mso-generic-font-family:auto;
 mso-font-pitch:variable;
 mso-font-signature:0 268435456 0 0 -2147483648 0;}
@font-face
 {font-family:Consolas;
 panose-1:2 11 6 9 2 2 4 3 2 4;
 mso-font-charset:0;
 mso-generic-font-family:modern;
 mso-font-pitch:fixed;
 mso-font-signature:-520092929 1073806591 9 0 415 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
 {mso-style-parent:&quot;&quot;;
 margin:0cm;
 margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:12.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-fareast-font-family:&quot;Times New Roman&quot;;}
a:link, span.MsoHyperlink
 {color:blue;
 text-decoration:underline;
 text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
 {color:purple;
 text-decoration:underline;
 text-underline:single;}
pre
 {margin:0cm;
 margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:&quot;Courier New&quot;;
 mso-fareast-font-family:&quot;Times New Roman&quot;;}
span.htmltag1
 {mso-style-name:html_tag1;
 color:blue;}
span.htmlelm1
 {mso-style-name:html_elm1;
 color:maroon;}
span.htmlatr1
 {mso-style-name:html_atr1;
 color:red;}
span.htmlval1
 {mso-style-name:html_val1;
 color:blue;}
@page Section1
 {size:595.3pt 841.9pt;
 margin:72.0pt 90.0pt 72.0pt 90.0pt;
 mso-header-margin:35.4pt;
 mso-footer-margin:35.4pt;
 mso-paper-source:0;}
div.Section1
 {page:Section1;}
 /* List Definitions */
 @list l0
 {mso-list-id:1073628246;
 mso-list-type:hybrid;
 mso-list-template-ids:-1405045304 134807553 134807555 134807557 134807553 134807555 134807557 134807553 134807555 134807557;}
@list l0:level1
 {mso-level-number-format:bullet;
 mso-level-text:;
 mso-level-tab-stop:54.0pt;
 mso-level-number-position:left;
 margin-left:54.0pt;
 text-indent:-18.0pt;
 font-family:Symbol;}
@list l0:level2
 {mso-level-number-format:bullet;
 mso-level-text:o;
 mso-level-tab-stop:72.0pt;
 mso-level-number-position:left;
 text-indent:-18.0pt;
 font-family:&quot;Courier New&quot;;}
@list l1
 {mso-list-id:2073232353;
 mso-list-type:hybrid;
 mso-list-template-ids:859873540 -631316818 134807555 134807557 134807553 134807555 134807557 134807553 134807555 134807557;}
@list l1:level1
 {mso-level-start-at:0;
 mso-level-number-format:bullet;
 mso-level-text:;
 mso-level-tab-stop:72.0pt;
 mso-level-number-position:left;
 margin-left:72.0pt;
 text-indent:-36.0pt;
 font-family:Symbol;
 mso-fareast-font-family:&quot;Times New Roman&quot;;
 mso-bidi-font-family:&quot;Times New Roman&quot;;}
ol
 {margin-bottom:0cm;}
ul
 {margin-bottom:0cm;}
--&gt;
&lt;/style&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;  &lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;One of the most fundamental concepts of ASP.Net – and indeed of any transactional web development technology – is the concept of &lt;i&gt;Postbacks&lt;/i&gt;. That is, the idea that an interactive web page may be used by inputting information via the interface presented at the client (i.e. web browser) side of the transaction, and then ‘submitting’ the page so-influenced by user input for processing by the web server. Web users are highly familiar with this concept from a user perspective – whether they’re shopping at Amazon, commenting on stories on the BBC News Site, posting threads on web forums, or whatever, it’s widely understood that in order to affect any change whatsoever with an interactive website users need to input what they want at the browser UI, and ‘post’ the page back in some way (often by simply hitting a button marked ‘submit’, but also in may other ways specific to context). &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;For web developers, facilitating this type of interaction with users presents many challenges, not least of which is the fact that the web is essentially a ‘stateless’ medium. Which is to say that each time an interactive web page is ‘submitted’ for processing, from the perspective of the web server it’s as if it is the first time it has interacted with the user in question, and so everything about the transaction that is being attempted must be included in the page that has been submitted (including information that, from the user’s perspective, they may have submitted several steps previously, e.g., they may have entered their Amazon user account name and password previously, and have added several items to their ‘basket’ in the meantime, but they don’t expect to have to enter their credentials again when they click ‘Purchase’ as the final step in the process – they expect the page to somehow have ‘remembered’ that they had provided that information already). &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;This article is about how ASP.Net handles Postbacks in a stateless medium, and focuses in particular on the .Net-specific concept of the page life cycle of an ASPX page. &amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;  &lt;/span&gt;&lt;br /&gt;
&lt;hr align=&quot;center&quot; size=&quot;2&quot; width=&quot;100%&quot; /&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;As mentioned above, facilitating interaction between website owners and website users, and between website users with one another, presents many challenges, whatever development technology you’re using. The HTTP protocol upon which the internet was originally based, and that it still relies heavily upon today, was really designed for allowing people to share ‘static’ content with one another. The web, as it was originally envisioned, allowed users to share simple text files of a fixed content with their peers. Each request for a ‘page’ would result in the exact same HTML being rendered, until and unless the publisher of that page deliberately changed the content manually. For this type of interaction, a stateless communication protocol is perfectly suitable : user requests a page, user gets that page; simple. However, that original concept isn’t how users expect the web to work any more. Today, they expect to be able to interact with, not merely consume, the content of the websites they use. Providing this type of interactivity has involved developers finding ways to allow an essentially static medium to somehow ‘remember’ individual users, and interact with them in ways that make sense within the context of those preceding interactions. ‘Remembering’ previously-encountered information in this way is known as ‘persisting state’. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;The main tool that ASP.Net provides to facilitate the illusion of persisting state in interactive web pages is the concept of an ASPX page. Simply put, an ASPX page, also known as a ‘web form’, is a type of container that can hold several discrete types of object – collectively known as ‘controls’ – that allow a user to input information, or otherwise interact with the page. The types of control that can be placed in an ASPX page (which I’ll refer to simply as a ‘page’ from here on in) are many any varied. There is, for example, a particular class of objects known as ‘web controls’, which are defined in the &lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 9.5pt;&quot;&gt;System.Web.UI.WebControls &lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;.net framework namespace. These controls provide many ready-made interactive elements, such as text boxes, radio buttons, drop down lists, and others, that retain the values entered into them by users across different postbacks of the page. Developers can additionally create more complex interactive elements of their own design, known as ‘user controls’. User controls employ many of the same paradigms as web controls, but require more developer knowledge to build, whilst providing a greater degree of control over visual presentation for the developer. The last thing that developers should know about controls (of whatever type) is that they may facilitate custom &lt;i&gt;Events&lt;/i&gt;, specific to the type of control. That is, they can be designed/used in such a way as to ensure that a postback occurs and that specific code runs at the web server in response to users interacting with the controls in a certain pre-defined way. E.g., textboxes may be designed to respond to users entering text in them, and buttons and images may be designed to respond to being clicked, etc. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;The way that ASPX pages manage the feat of appearing to persisting data within the confines of the stateless medium of the internet is by using something called &lt;i&gt;ViewState&lt;/i&gt;. In essence, ViewState is a special type of non-visible or ‘hidden’ control, contained within the ASPX page, whose job, amongst other things, is to keep track of all of the data entered in and required by each of the other data-dependent controls on the web form. It is the ViewState mechanism that allows a web server running Internet Information Services (IIS) to interpret the virtual ‘state’ of a page (a ‘state’ that was potentially built up over several preceding postbacks). If you ever look at the underlying page source of an ASPX page as it is rendered in a browser, you may well see something that looks like this somewhere in the middle of the HTML:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span class=&quot;htmltag1&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;htmlelm1&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;input&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;htmltag1&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;htmlatr1&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;type&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;htmltag1&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;htmlval1&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&quot;hidden&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;htmltag1&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;htmlatr1&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;name&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;htmltag1&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;htmlval1&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&quot;__VIEWSTATE&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;htmltag1&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;htmlatr1&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;id&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;htmltag1&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;htmlval1&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&quot;__VIEWSTATE&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;htmltag1&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;htmlatr1&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;value&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;htmltag1&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;htmlval1&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&quot;/wEPDwUJNjI0NjY1NDA2DxYCHgpNeVByb3BlcnR5BQMxMjNkZNsT9/JHdta88TymHVqnYrr7vzIS8vtD3DxRcAt1+MLp&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;htmltag1&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;This is the page&#39;s ViewState. It’s not visible to the user (hence the &lt;/span&gt;&lt;span class=&quot;htmlatr1&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;htmltag1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;htmlval1&quot;&gt;&quot;hidden&quot;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; attribute of the &lt;/span&gt;&lt;span class=&quot;htmlelm1&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; HTML element tag), but it is nonetheless very important to maintaining the illusion that the system the user is interacting with ‘remembers’ key aspects of the user’s preceding interaction, thereby providing the illusion of persisting state. The value contained in the&lt;/span&gt;&amp;nbsp; &lt;span class=&quot;htmlatr1&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;htmltag1&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;htmlval1&quot;&gt;&quot;......&quot;&lt;/span&gt; &lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;tag is a &lt;u&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms950721.aspx&quot;&gt;&lt;u&gt;&lt;span style=&quot;color: black;&quot;&gt;serialised&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt; representation of the data used by other controls in the form. There’s a lot more to ViewState, and indeed optimising it is a whole other topic in itself that I’ll perhaps write about another time. Within the scope of this discussion, though, it can be understood to be a serialised &lt;/span&gt;&lt;u&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Hash_table&quot;&gt;&lt;u&gt;&lt;span style=&quot;color: black;&quot;&gt;hash table&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;/u&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;, that ‘stores’ named Properties of controls on the page and their values across different postbacks of the page. There’s another type of object, known as ControlState, that performs a similar job to ViewState, but which specifically exists to track properties of controls regardless of any other settings a developer may choose to implement. The main distinction between ViewState and ControlState is that, whilst ViewState may optionally be developer-configured to be disabled, ControlState cannot; where ViewState doesn’t exist ControlState is necessary to do all the work of tracking control properties on its own.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;So, to recap, ASPX pages contain various types of &lt;i&gt;control&lt;/i&gt;, and the page itself may be submitted by users to the web server for further processing in a process known as making a &lt;i&gt;postback&lt;/i&gt;. From the users’ perspective, making a postback conceptually involves ‘submitting’ the page, thereby performing some data-driven action, such as processing an order, making a post on a forum, etc., in a way that is abstracted from and invisible to the user. Now, let’s look at what actually happens from a developer perspective at the web server when such a postback actually takes place.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;As well as allowing developers to design the visual and non-visual elements of the user interface, at design time ASPX pages also include a separate developer tool known as the &lt;i&gt;Code Behind&lt;/i&gt; element of the page. This part of the design may be thought of as representing that part of the design that gets executed at the web server end (as opposed to anything that happens in the users’ browsers). The Code Behind part of the page facilitates interaction between disconnected users submitting pages via postbacks out in the stateless web, and those ‘back end’ parts of the system that turn those user postbacks into meaningful actions, such as facilitating transactions with underlying databases. For example, this is the part of the wider system that allows product orders placed by users on commercial websites and posts made on internet forums to be turned into records in a more permanently-stored medium, such as a relational database. The way that the Code Behind element of the page facilitates this interaction relies heavily on several of those elements already touched upon, as well as some others that will be discussed below. In summary, whenever a postback takes place, the following Events will take place in the order presented below within the Code Behind:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;style&gt;
&lt;!--
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
 {mso-style-parent:&quot;&quot;;
 margin:0cm;
 margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:12.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-fareast-font-family:&quot;Times New Roman&quot;;}
@page Section1
 {size:612.0pt 792.0pt;
 margin:72.0pt 90.0pt 72.0pt 90.0pt;
 mso-header-margin:36.0pt;
 mso-footer-margin:36.0pt;
 mso-paper-source:0;}
div.Section1
 {page:Section1;}
 /* List Definitions */
 @list l0
 {mso-list-id:568997716;
 mso-list-type:hybrid;
 mso-list-template-ids:-1374908404 134807567 134807577 134807579 134807567 134807577 134807579 134807567 134807577 134807579;}
@list l0:level1
 {mso-level-tab-stop:72.0pt;
 mso-level-number-position:left;
 margin-left:72.0pt;
 text-indent:-18.0pt;}
ol
 {margin-bottom:0cm;}
ul
 {margin-bottom:0cm;}
--&gt;
&lt;/style&gt;  &lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 72pt; text-indent: -18pt;&quot;&gt;
1.&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Pre-Init &lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 72pt; text-indent: -18pt;&quot;&gt;
2.&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Init &lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 72pt; text-indent: -18pt;&quot;&gt;
3.&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;InitComplete &lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 72pt; text-indent: -18pt;&quot;&gt;
4.&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Pre-Load &lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 72pt; text-indent: -18pt;&quot;&gt;
5.&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Load &lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 72pt; text-indent: -18pt;&quot;&gt;
6.&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Control Events&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 72pt; text-indent: -18pt;&quot;&gt;
7.&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;LoadComplete &lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 72pt; text-indent: -18pt;&quot;&gt;
8.&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;PreRender &lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 72pt; text-indent: -18pt;&quot;&gt;
9.&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;PreRenderComplete &lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 72pt; text-indent: -18pt;&quot;&gt;
10.&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp; &lt;/span&gt;SaveStateComplete&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 72pt; text-indent: -18pt;&quot;&gt;
11.&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp; &lt;/span&gt;Render*&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 72pt; text-indent: -18pt;&quot;&gt;
12.&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp; &lt;/span&gt;Unload&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 36pt;&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;&lt;o:p&gt;&lt;br /&gt;
&lt;/o:p&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 54pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;* &amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color: black; font-size: 11pt;&quot;&gt;Render &lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;color: black; font-size: 11pt;&quot;&gt;isn’t an Event per se, but a Protected Method that gets called for each control on the page at this point in the proceedings.&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;You can ‘subscribe’ to these Events by creating an appropriate ‘handler’ in the code behind. For example, to create a handler for the page &lt;i&gt;Pre-Init&lt;/i&gt; Event, simply enter the following code:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;C#:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 36pt;&quot;&gt;
&lt;span style=&quot;color: blue; font-family: Consolas; font-size: 11.5pt;&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 11.5pt;&quot;&gt; Page_PreInit(&lt;span style=&quot;color: blue;&quot;&gt;object&lt;/span&gt; sender, &lt;span style=&quot;color: #2b91af;&quot;&gt;EventArgs&lt;/span&gt; e)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 36pt;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 11.5pt;&quot;&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 72pt;&quot;&gt;
&lt;span style=&quot;color: green; font-family: Consolas; font-size: 11.5pt;&quot;&gt;&#39;Your custom code here&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 36pt;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 11.5pt;&quot;&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;VB:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 36pt;&quot;&gt;
&lt;span style=&quot;color: blue; font-family: Consolas; font-size: 11.5pt;&quot;&gt;Private&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 11.5pt;&quot;&gt; &lt;span style=&quot;color: blue;&quot;&gt;Sub&lt;/span&gt; Page_PreInit&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 36pt;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 11.5pt;&quot;&gt;(&lt;span style=&quot;color: blue;&quot;&gt;ByVal&lt;/span&gt; sender &lt;span style=&quot;color: blue;&quot;&gt;As&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;Object&lt;/span&gt;, &lt;span style=&quot;color: blue;&quot;&gt;ByVal&lt;/span&gt; e &lt;span style=&quot;color: blue;&quot;&gt;As&lt;/span&gt; System.&lt;span style=&quot;color: #2b91af;&quot;&gt;EventArgs&lt;/span&gt;) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 36pt;&quot;&gt;
&lt;span style=&quot;color: blue; font-family: Consolas; font-size: 11.5pt;&quot;&gt;Handles&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 11.5pt;&quot;&gt; &lt;span style=&quot;color: blue;&quot;&gt;Me&lt;/span&gt;.PreInit&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 72pt;&quot;&gt;
&lt;span style=&quot;color: green; font-family: Consolas; font-size: 11.5pt;&quot;&gt;&#39;Your custom code here&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 36pt;&quot;&gt;
&lt;span style=&quot;color: blue; font-family: Consolas; font-size: 11.5pt;&quot;&gt;End&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 11.5pt;&quot;&gt; &lt;span style=&quot;color: blue;&quot;&gt;Sub&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;In VB this is slightly easier than in C#, in that you need only select the Event you want to create a handler for from the drop-down list provided in the Visual Studio IDE, as demonstrated:&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkqMEZEyphWnFzDiUxB3SFDwfO4egfUQmDTdwFpz2fAcxSl57WczPTQddB5FcODnI42BwMOTbtfWHNMrVa5ckQ0liXFlvETiUbQAMq0NYKQe6Yn1tNNXu51jhI3_GE03ytYlerNbMzNPhp/s1600/CreateHandlerVB.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;379&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkqMEZEyphWnFzDiUxB3SFDwfO4egfUQmDTdwFpz2fAcxSl57WczPTQddB5FcODnI42BwMOTbtfWHNMrVa5ckQ0liXFlvETiUbQAMq0NYKQe6Yn1tNNXu51jhI3_GE03ytYlerNbMzNPhp/s640/CreateHandlerVB.gif&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;&lt;br /&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;In C#, you either need to type the code by hand, or use the following method:&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg85d7KXJdRx8x6misu3du3oMsWEUDjYUKwRA3FRtf5obHtAZf635dpoJaO5rp-8W-E6DhQyjkG-IlTHIgI06NsZ4AX3ftfd153fPEK8ERNyAJfxkI_uGxJ96DMIwwIV58gDaGIJNh03cS0/s1600/CreateHandlerCS.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;344&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg85d7KXJdRx8x6misu3du3oMsWEUDjYUKwRA3FRtf5obHtAZf635dpoJaO5rp-8W-E6DhQyjkG-IlTHIgI06NsZ4AX3ftfd153fPEK8ERNyAJfxkI_uGxJ96DMIwwIV58gDaGIJNh03cS0/s640/CreateHandlerCS.gif&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;&lt;br /&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;As noted in the C# version, using the above method will insert a Handler that is specific to the individual ASPX page, rather than one that is generally applicable to the &lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 9.5pt;&quot;&gt;System.Web.UI.&lt;span style=&quot;color: #2b91af;&quot;&gt;Page&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; object that all ASPX pages are based upon. This isn’t hugely problematic, but it is just a little neater and generates less code to be maintained if you rename the Handler using the nomenclature “Page_&lt;i&gt;EventName&lt;/i&gt;” as suggested in the example, then delete the line reading: &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-indent: 36pt;&quot;&gt;
&lt;span style=&quot;color: blue; font-family: Consolas; font-size: 9.5pt;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 9.5pt;&quot;&gt;.PreInit += &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;EventHandler&lt;/span&gt;(WhateverYourPageIsCalled_PreInit);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;that you used temporarily. You delete this line because upon renaming the Handler it becomes superfluous, because the ‘&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 9.5pt;&quot;&gt;WhateverYourPageIsCalled_PreInit&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;’ Handler to which it refers no longer exists, and because for exactly the same reason you’ll get a compilation error telling you about the Handler it refers to not existing. The reason that the “Page_&lt;i&gt;EventName&lt;/i&gt;” Handler naming format is slightly more robust is that, provided you include the &lt;/span&gt;&lt;span style=&quot;color: red; font-family: Consolas; font-size: 9.5pt;&quot;&gt;AutoEventWireup&lt;/span&gt;&lt;span style=&quot;color: blue; font-family: Consolas; font-size: 9.5pt;&quot;&gt;=&quot;true&quot;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; attribute in the &lt;/span&gt;&lt;span style=&quot;color: blue; font-family: Consolas; font-size: 9.5pt;&quot;&gt;@ &lt;/span&gt;&lt;span style=&quot;color: maroon; font-family: Consolas; font-size: 9.5pt;&quot;&gt;Page &lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;directive within the markup component of the ASPX page (and that attribute is included by default: see screen dump below), the ASPX page creates appropriate add handler code for any Page_Event handlers you define for you behind the scenes, rather than you having to maintain your own.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_vPNV_TxKWu9xhVXQ4Z6mbERukgtL1Y6vVutKP4WxukkGg8LLbx76qt1iZ0wruN1N5OrLj0rQOTwDNu4Fk9x7weDk3PkBMPyBEBD7HbzK5dT2sL5YewL8Lbw1kJf0iGITjLKJ0bFU_Eak/s1600/AutoEventWireup.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;370&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_vPNV_TxKWu9xhVXQ4Z6mbERukgtL1Y6vVutKP4WxukkGg8LLbx76qt1iZ0wruN1N5OrLj0rQOTwDNu4Fk9x7weDk3PkBMPyBEBD7HbzK5dT2sL5YewL8Lbw1kJf0iGITjLKJ0bFU_Eak/s640/AutoEventWireup.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;&lt;br /&gt;
The VB environment is just a little bit smarter on this occasion than the C# one, and makes use of this useful feature without having to be overtly told to do so.&lt;/span&gt;&lt;span style=&quot;color: maroon; font-family: Consolas; font-size: 9.5pt;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Moving on, the following sections describe what each of the Events you may create handlers for actually do, and provides suggestions for when you may want to use them.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;i&gt;&lt;u&gt;&lt;span style=&quot;color: black; font-size: 14pt;&quot;&gt;Pre-Init&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;By the time this event runs, certain pre-processing will have occurred that allows the developer to decide what should happen at this juncture. Certain useful page properties will have been set, including the &lt;/span&gt;&lt;u&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.web.ui.page.ispostback.aspx&quot;&gt;&lt;u&gt;&lt;span style=&quot;color: black;&quot;&gt;IsPostBack&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;/u&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; and &lt;/span&gt;&lt;u&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.web.ui.page.iscallback.aspx&quot;&gt;&lt;u&gt;&lt;span style=&quot;color: black;&quot;&gt;IsCallBack&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;/u&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; properties. Respectively, these properties allow the developer to know whether the page is being ‘submitted’ for the first time by a user (in which case IsPostBack will be false), and whether the ‘submit’ action was triggered as a result of client script utilising a CallBack (a sort of mini-postback, involving processing of the code behind by the server without utilising the ‘submit’ mechanism or refreshing the page, used in AJAX-enabled applications). &amp;nbsp;It’s possible in ASP.Net to submit the results from one ASPX page into the code behind for another ASPX page; if this is the case, then the &lt;/span&gt;&lt;u&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.web.ui.page.iscrosspagepostback.aspx&quot;&gt;&lt;u&gt;&lt;span style=&quot;color: black;&quot;&gt;IsCrossPagePostBack&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;/u&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; property of the page will be true at this stage. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;As well as using the above properties to direct which Methods of your code behind to run, it’s common to use the Pre-Init handler to dynamically set any desired aspects of the page, such as setting the Theme or Master Page (both of which can affect the appearance and layout significantly), depending on the context. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;It’s important to note that at this stage of the page life cycle, the controls on the page will not have had their values retrieved from the page’s ViewState yet. So, don’t use this handler to try and retrieve and act upon user input just yet. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;i&gt;&lt;u&gt;&lt;span style=&quot;color: black; font-size: 14pt;&quot;&gt;Init&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Each control on the page has an &lt;i&gt;Init&lt;/i&gt; Event, which may be separately handled. Each of the individual controls’ &lt;i&gt;Init&lt;/i&gt; Events will run before the page’s &lt;i&gt;Init&lt;/i&gt; Event does. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;MSDN advises to use this Event to “read and initialise” control properties, and also states that &lt;i&gt;“controls typically turn on view state tracking immediately after they raise their Init event”&lt;/i&gt;. Be advised, however, that when I double-checked the actual behaviour under Framework version 4 and IIS 7 for writing this article, the specific behaviour I observed appeared to be as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 54pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;color: black; font-family: Symbol; font-size: 13pt;&quot;&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;You may validly set properties of controls during this Event only where the current page is not experiencing a PostBack (i.e., provided that this is the first time the user has submitted this page). Where you do initialise any properties here, you may expect those properties you initialise to be persisted to the control/page sent to the client during the first time the page is loaded only. i.e., if you set the ‘Text’ Property of a textbox during this Event, whatever you set that ‘Text’ Property to will be shown on the page as seen by the user, during the first processing of the page only, but not during any subsequent postbacks. &lt;br /&gt;
&lt;br /&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 54pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;color: black; font-family: Symbol; font-size: 13pt;&quot;&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;ViewState is made active for individual controls during their own individual Init events, but be advised that setting values in ViewState directly is not possible within the &lt;i&gt;Init&lt;/i&gt; event. NB: this is usually done to model generic ‘Properties’ within code behind pages, and the syntax takes the form:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 9.5pt;&quot;&gt;ViewState(&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;MyProperty&quot;&lt;/span&gt;) = &lt;span style=&quot;color: #a31515;&quot;&gt;&quot;123&quot;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;(VB)&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 9.5pt;&quot;&gt;ViewState[&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;MyProperty&quot;&lt;/span&gt;] = &lt;span style=&quot;color: #a31515;&quot;&gt;&quot;123&quot;&lt;/span&gt;;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (C#).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 54pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;color: black; font-family: Symbol; font-size: 13pt;&quot;&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;If you set default values for control properties in the ASPX page Markup, you can read those initialised properties during this Event. Any dynamically-initialised properties of user controls may also be read here (which might be important, depending on what you intended your user control to do). However, please note that whilst the above is all well and good, other behaviour observed during this event is a bit odd and counterintuitive. Specifically, you should be aware that, if this is a postback, and if the user has set a Property of a control, that user-set control property will not yet reflect the value contained by the control during this Event. Even worse, during this event any user-set controls will incorrectly appear to show the initial values they held when the page was ‘new’; so, control properties are not merely missing, but misleading and incorrect, during postbacks. Please remember this fact, and surround any code you may place within the &lt;i&gt;Init&lt;/i&gt; event handler within a&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: blue; font-family: Consolas; font-size: 9.5pt;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;font-family: Consolas; font-size: 9.5pt;&quot;&gt; (Page.IsPostBack)&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;&amp;nbsp; block to ensure that it behaves as you intend during all stages of the page’s life cycle. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;i&gt;&lt;u&gt;&lt;span style=&quot;color: black; font-size: 14pt;&quot;&gt;InitComplete&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Between the &lt;i&gt;Init&lt;/i&gt; and &lt;i&gt;InitComplete&lt;/i&gt; Events precisely one thing happens: ViewState tracking gets turned on. So, using the &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 36pt;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 9.5pt;&quot;&gt;&lt;br /&gt;
ViewState[&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;MyProperty&quot;&lt;/span&gt;] = &lt;span style=&quot;color: #a31515;&quot;&gt;&quot;123&quot;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-indent: 36pt;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;syntax mentioned earlier will cause values to be ‘permanently’ persisted to ViewState during this Event. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;i&gt;&lt;u&gt;&lt;span style=&quot;color: black; font-size: 14pt;&quot;&gt;PreLoad&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;MSDN says that this Event runs after the page loads ViewState for itself and all child controls on the page. As noted above, however, I found that ViewState had already loaded during InitComplete. All postback data processing should have been completed by the time this Event runs. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;i&gt;&lt;u&gt;&lt;span style=&quot;color: black; font-size: 14pt;&quot;&gt;Load&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;The page’s own &lt;i&gt;Load&lt;/i&gt; Event runs, then the &lt;i&gt;Load&lt;/i&gt; Event for each individual control on the page runs. Event handlers for the page and individual control’s Load events may be reliably used to set control properties programmatically during postbacks. &lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Load&lt;/i&gt; Event Handlers are a good place to initialise and open any database connections that may be required for further processing during the next stage.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;i&gt;&lt;u&gt;&lt;span style=&quot;color: black; font-size: 14pt;&quot;&gt;Control Events&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Individual control Event Handlers will run at this point in the page’s processing. So, if you’ve created a TextChanged event handler for a TextBox, this is the point in the page’s life cycle where that handler’s code would run.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;i&gt;&lt;u&gt;&lt;span style=&quot;color: black; font-size: 14pt;&quot;&gt;LoadComplete&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;LoadComplete runs for the page only, not for individual controls. Place any code that relies on individual control event handling to be complete here (e.g., you may have code that determines whether a ‘Complete Transaction’ button is enabled here, depending on whether all necessary data has been entered in other controls first). &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;i&gt;&lt;u&gt;&lt;span style=&quot;color: black; font-size: 14pt;&quot;&gt;PreRender&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;An important part of what an ASPX page does is that it dynamically generates HTML markup pertinent to the present state of the page and its constituent controls (remember that discussion about how the web was originally conceived to be a static medium earlier? – well, it still is, and dynamic rendering of HTML in this way is the part of the whole ‘page life cycle’ process that makes it appear that a static medium is capable of generating interactive content based on user input). At this stage in the cycle, all controls have been added to the page, have been updated with the latest data from user input and server-side processing, and are ready to be rendered as HTML. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;This Event may be used to make any final changes to control properties before final rendering takes place.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;i&gt;&lt;u&gt;&lt;span style=&quot;color: black; font-size: 14pt;&quot;&gt;PreRenderComplete&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;This Event fires just after all data bound controls whose DataSourceID property has been set call their DataBind methods. Data Binding is outside the scope of this article. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;i&gt;&lt;u&gt;&lt;span style=&quot;color: black; font-size: 14pt;&quot;&gt;SaveStateComplete&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;The &lt;i&gt;SaveStateComplete&lt;/i&gt; Event fires after ViewState and ControlState have been finalised. MDSN advice says that any changes to controls made during or after this Event will be rendered, but will not be persisted during the next Postback. I didn’t find this to be the case – for example, setting the ‘Text’ property of a TextBox during this event will both change what gets rendered in the textbox when the page is presented to the user, and will persist the value set through to the next postback (and beyond). It just goes to show, it pays to check advice, even advice from the horse’s mouth, with each new release of the framework and IIS. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;i&gt;&lt;u&gt;&lt;span style=&quot;color: black; font-size: 14pt;&quot;&gt;Render&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Render isn’t an Event that can be handled, but a Protected Method that exists for each control on an ASPX page, that gets called for each control on the page at this point in the proceedings. This is the Method that is used to output the actual HTML that has been dynamically generated from all the foregoing processing within the page. The ASPX page passes a Framework object called a HTMLTextWriter into the Method as an argument. That HTMLTextWriter contains the page’s calculated HTML output specific to the present context of the control.&amp;nbsp; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;In 99% of all cases, the HTML generated by ASP.Net will be smart enough to ensure that what the developer intended to be presented to the user is what actually gets sent. However, there are a small number of cases where pages are just a little too complex, or where the evolving capabilities of the evermore complex browsers that are continually being developed falls out of sync with the most recent version of the .Net framework, leading to the ASP.Net rendering process sending HTML that is inappropriate for a particular user’s setup. In these cases, the Render Method may be overridden by the developer. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;The following example shows one way of overriding the Render Method, that I used on a live project recently. The basic crux of the problem was that the ‘name’ attributes of the HTML tags rendered by the ASP.Net engine were of a particular format, and, for the purposes of working in harmony with another solution that I didn’t have access to the source code for, those name tags had to take on a different naming convention. I tried a couple of approaches, but the one that produced the most satisfactory results is reproduced below. The basic jist of the solution is that the Render Method is overridden in my custom user control, and &lt;/span&gt;&lt;span style=&quot;color: #2b91af; font-family: Consolas; font-size: 9.5pt;&quot;&gt;HtmlTextWriter&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; object that the Render Method takes as input from the ASPX page is tinkered with to ensure that each of the name attriubtes inserted by the ASP.Net engine is replaced by deliberately-set name tags chosen by the developer instead: &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;protected override void Render(HtmlTextWriter writer)
{
    if (QuestionLabel != String.Empty &amp;amp;&amp;amp; RenameControlsAsPerQuestionLabel == true)
    {
        StringBuilder sb = new StringBuilder();
        StringWriter sw = new StringWriter(sb);
        HtmlTextWriter hw = new HtmlTextWriter(sw);

        base.Render(hw);

        if (ResponseControlType == ControlTypeEnum.CheckboxGroup)
        {
            foreach (ResponseOption o in AvailableResponses)
            {
                sb.Replace(
                    &quot;name=\&quot;&quot; + o.ResponseCheckBoxForCheckBoxGroupTypeQuestions.UniqueID + &quot;\&quot;&quot;,
                    &quot;name=\&quot;&quot; + o.ResponseControlName + &quot;\&quot;&quot;);                
            }
        }
        else
        {
             sb.Replace(&quot;name=\&quot;&quot; + responseCtl.UniqueID + &quot;\&quot;&quot;, &quot;name=\&quot;&quot; + QuestionLabel + &quot;\&quot;&quot;);
        }

        writer.Write(sb.ToString());
    }
    else
    { 
        base.Render(writer);
    }
}
&lt;/pre&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;The times when developers should need to override ASP.Net’s natively-generated HTML are few and far between, but it’s useful to know how to do this should it be required.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;i&gt;&lt;u&gt;&lt;span style=&quot;color: black; font-size: 14pt;&quot;&gt;Unload&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;The last thing that happens before the processed page gets output to the user that submitted/requested it is that the &lt;i&gt;Unload&lt;/i&gt; Event gets called for each control on the page, then for the page itself. This is the best place to close any open connections to databases or files at the server side (either in the page level event for general connections, or in control-level &lt;i&gt;Unload&lt;/i&gt; events where a specific control has exclusively used a particular resource during the processing of the page). &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;  &lt;/span&gt;&lt;br /&gt;
&lt;hr align=&quot;center&quot; size=&quot;2&quot; width=&quot;100%&quot; /&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;That’s pretty much it for the page life cycle. It should be noted that the life cycle for a CallBack is slightly different, but similar in most of the important respects noted above (the main difference is that Callbacks don’t involve submitting the whole page for processing, only discrete elements of it, and that consequently ViewState is therefore unaffected by Callbacks). It’s pretty amazing to think how much innovation and ingenuity has gone into making what was originally a static document delivery system into the fully-interactive medium that it’s since become. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/7474015880848320063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/7474015880848320063'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/2011/02/aspx-page-life-cycle.html' title='ASPX Page Life Cycle'/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkqMEZEyphWnFzDiUxB3SFDwfO4egfUQmDTdwFpz2fAcxSl57WczPTQddB5FcODnI42BwMOTbtfWHNMrVa5ckQ0liXFlvETiUbQAMq0NYKQe6Yn1tNNXu51jhI3_GE03ytYlerNbMzNPhp/s72-c/CreateHandlerVB.gif" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7818882524515880477.post-6965541042108662361</id><published>2010-08-13T23:55:00.015+01:00</published><updated>2012-07-16T22:50:36.789+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Management"/><category scheme="http://www.blogger.com/atom/ns#" term="People"/><title type='text'>How to Recruit and Vet Technical Professionals</title><content type='html'>&lt;style&gt;
&lt;!--
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
 {mso-style-parent:&quot;&quot;;
 margin:0cm;
 margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:12.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-fareast-font-family:&quot;Times New Roman&quot;;}
@page Section1
 {size:595.3pt 841.9pt;
 margin:72.0pt 90.0pt 72.0pt 90.0pt;
 mso-header-margin:35.4pt;
 mso-footer-margin:35.4pt;
 mso-paper-source:0;}
div.Section1
 {page:Section1;}
 /* List Definitions */
 @list l0
 {mso-list-id:2044020080;
 mso-list-type:hybrid;
 mso-list-template-ids:1428854052 134807569 134807577 134807579 134807567 134807577 134807579 134807567 134807577 134807579;}
@list l0:level1
 {mso-level-text:&quot;%1\)&quot;;
 mso-level-tab-stop:18.0pt;
 mso-level-number-position:left;
 margin-left:18.0pt;
 text-indent:-18.0pt;}
ol
 {margin-bottom:0cm;}
ul
 {margin-bottom:0cm;}
--&gt;
&lt;/style&gt;  &lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;Over the years, I’ve had several experiences of being on either side of the recruitment table. At different times, I’ve been the hiring manager looking to augment the team I’ve been leading with a skilled technical professional, and at other times I’ve been that external technical professional, with skills, experience and insights to offer the team I’d be joining. Those experiences on either end of the equation have led me to some conclusions about the best way to go about ensuring that each party to the process gets what they intend out of the deal. For the hiring manager, that’s a new and well-motivated team member that’s able to bring some desired skills into the team, and for the candidate it’s the opportunity to meaningfully demonstrate what they can do and determine what the opportunity has to offer them. Those goals aren’t in competition with one another; a “win, win” is what each party should be looking for when it comes to matching the right people to the right roles. It’s only when each party gets what they’re looking for that everyone involved (the hirer, the hired, and any intermediaries) can consider that the process has been truly successful. This article contains some thoughts on how each of the various parties to the process can help ensure a mutually-beneficial outcome.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;border-color: -moz-use-text-color -moz-use-text-color windowtext; border-style: none none double; border-width: medium medium 2.25pt; padding: 0cm 0cm 1pt;&quot;&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: medium none; padding: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: medium none; padding: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;One of the difficulties with recruiting technical professionals is that you will sometimes find yourself in the position of assessing people that have skills you don’t yet have. For intermediaries like recruitment consultancies, HR departments, and for non-technical hiring managers, you can substitute the &lt;i&gt;“sometimes”&lt;/i&gt; in that last sentence for &lt;i&gt;‘always’&lt;/i&gt;, and&lt;i&gt; &lt;/i&gt;the &lt;i&gt;“do not yet have” &lt;/i&gt;for &lt;i&gt;‘will never be interested in personally acquiring’&lt;/i&gt;. That’s merely a fact of the different types of value those parties add to the process; similarly, you can be sure that most prospective technical hires will never be overly interested in finer details of employment legislation, employer branding, marketing, or abstract management theory. How, then, if you’re not a technical professional yourself, do you go about determining whether the person in front of you has what it is that you’re looking for? Before answering that question, here are some likely approaches that might seem reasonable at the time, but which, depending on how they’re carried out, may not provide the outcome you intended:&lt;br /&gt;
&lt;br /&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 18pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;1)&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;Sending an intermediary to do your first interview for you&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQDZjSCrdtxe74wmmaybvycfC2Qv4aVWEV1KKhxFeaM7Lv96V6m_umn8QWwS5V7l2ih5vVLWC68lPD8mwkaZ-BfkXu90RXUbVB5vw48pXFIYT5J2JPBGFzQjTQF0gKdHDB5383mw1dZh4P/s1600/MeetThemYourself.gif&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; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQDZjSCrdtxe74wmmaybvycfC2Qv4aVWEV1KKhxFeaM7Lv96V6m_umn8QWwS5V7l2ih5vVLWC68lPD8mwkaZ-BfkXu90RXUbVB5vw48pXFIYT5J2JPBGFzQjTQF0gKdHDB5383mw1dZh4P/s1600/MeetThemYourself.gif&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;Whatever else you do, as a hiring manager my advice is not to make the mistake of letting someone else represent your company or department to prospective new employees. Your HR department and any external recruitment consultancies you may engage can certainly take the marketing burden out of sourcing suitable candidate CVs for you, and they can also provide a screening service to ensure that you don’t need to deal with the initial sift of wholly-unsuitable applicants yourself, but they’re not there to conduct any actual interviews or assessments on your behalf. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;Typically, what an agency will do when they receive a brief from a hiring manager is they’ll advertise for suitable candidates using the job spec you provide on several of the industry-specific online recruitment websites such as JobServe, etc. The agency will remove your company’s name and identifying details from their listing, so that any less-reputable candidates and competitor agencies wont attempt to contact you directly. The recruitment consultant will sift the CVs they receive in response to their advert, will discount any outright unsuitable applicants (e.g., you’re looking for a Java guru, and it turns out the candidate has made coffee once), and they will conduct a brief telephone screen with each short-listed candidate to make sure that their stated skills, salary aspirations (or daily rate, for a Contractor) match with what you’re looking for. A good HR professional or external recruiter will also be able to give you as hiring manager advice on the state of the skills market, average salaries that other organisations are paying for roles similar to the one you’re recruiting for, and will be skilled at extending and negotiating a mutually-beneficial package when it comes time to do that. Make no mistake about it, though: for all the value they can add, your recruitment consultant or HR professional isn’t in a position to conduct an in-depth technical interview or make a recruitment decision for you, and they’re not there to represent what you have to offer to the candidate – that’s your job. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;Interviews are a two-way street, and if you make the mistake of letting your department be represented at a first interview by someone that doesn’t even work &lt;i&gt;in&lt;/i&gt; your department, don’t be surprised if the most marketable candidates fail to be impressed by having to run a gauntlet of your intermediaries before even getting to meet an actual decision maker, and opt out of your process before you get a chance to assess them. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 18pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;2)&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;Getting the candidate to write some code using a pen and paper. &lt;br /&gt;
&lt;br /&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsjFAQYGAqC6JFCEJ8thGO5sBi2sl6gHEA4IBYzWISzsJnUuHD4qMTOm3oN5hdmmJbftYxJqLGhjbwGvzsyW6SyfDLfaXkdpC6MGqDVBzK6tjcAR8SoPpaTBfta4GFdXdN-4eZJmd1KHUB/s1600/WrongToolForTheJob_Small.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsjFAQYGAqC6JFCEJ8thGO5sBi2sl6gHEA4IBYzWISzsJnUuHD4qMTOm3oN5hdmmJbftYxJqLGhjbwGvzsyW6SyfDLfaXkdpC6MGqDVBzK6tjcAR8SoPpaTBfta4GFdXdN-4eZJmd1KHUB/s1600/WrongToolForTheJob_Small.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;It’s certainly useful to get a candidate to write code at some stage in the interview process (and this is in fact something that many good developers look for in the recruitment processes they’re subjected to – an employer that tests their ability to write code not only gives them a chance to prove themselves, but also gives them some confidence that their colleagues-to-be will be as skilled as they are, having come through a similar process themselves: more on this later). In my experience, though, it’s never a good idea to ask a developer of any level of experience to write code using a pen and paper. Doing so is akin to asking a skilled chef to cook you a meal.......with their feet. Which is to say, it’s simply the wrong tool for the job, and not in any way indicative of the relevant skills you should be looking for. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;An analogy I use when highlighting why pen and paper is the wrong medium for assessing an ability to write useful code is the telephone. Up until the mid-nineties, most people were able to remember lots and lots of their friends’ telephone numbers off by heart. It wasn’t an uncommon nor an especially useful skill, it was just a somewhat abstract and unusual ability that everyone had spontaneously acquired because of the limitations of the way the telephone medium worked back then. These days, in the age of near-ubiquitous use of mobile phones, less and less people choose to remember such meaningless lists of numbers off by heart. Instead, everyone tends to use the standard address book function on their mobile phone to attach meaningful text labels to the people with whom they wish to communicate, and look up those labels whenever they need to make a call. You often find people looking up numbers on their mobiles these days, even when they’re using a desktop phone, because it’s become the modern paradigm of how to efficiently access that category of information. The essential skills of how to use a telephone and how to have a meaningful conversation with another person that you can only hear but not see are still the same today as they were in years gone past; it’s merely the tertiary skills surrounding the medium that have evolved. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;With reference to the above sociological changes that have come about as a result of advances in telephony technology, asking a developer to write code with a pen and paper is a bit like attempting to assess a person’s ability to use a telephone by asking them to write down all of the telephone numbers they know off of the top of their heads. In much the same way as telephone handsets have evolved, development environments have changed a lot in the past 15 years too. Round about that same time in the mid-nineties that everyone in society possessed ubiquitous Rainman-esqe abilities to recall lists of essentially meaningless numbers in order to be able to communicate using the telephone, developers once had to remember most of the syntax of the languages they worked with in their heads. These days, in the age of smart Integrated Development Environments (IDEs), that’s not the case any more. With the advent of Intellisense, Code Snippets, Templates, and Keyboard Shortcuts, there are many more efficient ways of coding today than there were even five years ago, and new tools are becoming available all the time. These days, if developers want to insert a Constructor into a class they’re designing in C#, they don’t need to recall the exact format of such a code fragment from memory, they can just type &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;ctor&lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;, hit tab, and all of the syntax for a parameterless Constructor that is meaningful within the context of the class they are creating is inserted for them. The real skill isn’t in remembering the syntax, it’s in knowing what a Constructor is, when to use one, and in understanding why a parameterless one can be overtly implemented in a class but not in a struct. When you can’t quite remember which namespace one of the 3,500-odd pre-defined .Net Framework classes resides within, the latest development environments will help you by suggesting ‘Imports / using’ directives that you may have missed. When you create a custom class in a project, provided you’ve been smart enough to structure your project logically using folders, the &lt;i&gt;Visual Studio&lt;/i&gt; development environment will create meaningful namespaces for you. These cues, and many others, allow developers to concentrate on the important part of their job – creating innovative, robust and reliable solutions to well-defined problems – and relegates the non-cognitive and repetitive parts of the process to the place where they belong: the subconscious. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;Asking a developer to undertake a pen-and-paper coding exercise never reveals any of that relevant knowledge, insight or craft. Instead, it obstructs many good developers from demonstrating the meaningful work they can do inside a real development environment that takes care of the repetitive, irrelevant and non-creative parts of the process, and lets them focus on the meaningful work they’re actually good at: producing useful, stable, innovative solutions. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 18pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;3)&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;Trivial Pursuit&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWXxJFmndZxUeFxIDEg8kdw3tAMXOtHvyZENkddSjluWeNVNTye5s5btAlkd1hWfTVCkfas7-VVb3cGjLJFPSRCu-6sRBtd6UVroCmCDe4ErPazejdXqnQ8YGdaaldKSP8asf41wiHYQ9q/s1600/TrivialPursuit.jpg&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;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWXxJFmndZxUeFxIDEg8kdw3tAMXOtHvyZENkddSjluWeNVNTye5s5btAlkd1hWfTVCkfas7-VVb3cGjLJFPSRCu-6sRBtd6UVroCmCDe4ErPazejdXqnQ8YGdaaldKSP8asf41wiHYQ9q/s200/TrivialPursuit.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;Nearly as bad as using pen-and-paper coding, is having a list of trivia questions associated with the skill of interest, and asking the prospective developer a pre-set list of abstract multiple-choice questions. Generally speaking, interviewers do this when they don’t have an in-depth knowledge of the topic themselves, because it provides an easy way for them to understand whether the answers they receive are ‘right’ or ‘wrong’, without the interviewer having to understand &lt;i&gt;why&lt;/i&gt; they may be right or wrong themselves.&amp;nbsp; It’s not advisable to go down this route, for two reasons. Firstly, to be blunt, it’s pretty disrespectful to the interviewee; if you don’t understand the answers to the questions you’re asking yourself, how can you be certain that the questions and the way you’re framing them makes any sense to someone that is actually knowledgeable on the subject? Go down this route, and it’ll quickly become clear to an experienced candidate that you don’t know what you’re talking about, and are merely repeating what’s written on a piece of paper in front of you parrot-fashion. That in turn will ruin their confidence in your ability to assess them meaningfully, and even if they do ‘pass’ your test, you may very well find the best candidates will opt out of your process as a result. Secondly, even if the developer isn’t put off by being quizzed by someone that clearly doesn’t understand the subject themselves, a process based on the ability to recall abstract facts fails to address the fundamental difference between knowledge and intelligence. I’ll take an intelligent developer that has yet to acquire knowledge in a given area over one that has learned to recite stock answers to set questions but has not one iota of ingenuity and creativity about them any day of the week, and twice on Sunday. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;In short, if you use set lists of coding trivia that you don’t really understand the answers to yourself in a misguided attempt to assess your candidates, whilst you may end up with someone that would do very well on a VB Pub Quiz Team, you’re just as likely to end up with an individual that couldn’t implement an &lt;/span&gt;&lt;span style=&quot;color: #2b91af; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;IPissup&lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt; interface within a &lt;/span&gt;&lt;span style=&quot;color: #2b91af; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;Brewery&lt;/span&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt; class if their lives depended on it. You may find to your horror, after they come on board, that they are not after all the learned experts you supposed, but had merely read the same three articles on Wikipedia as you used when compiling your list of questions.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;Finally, I would strongly advise against using ‘online tests’ to assess candidates. Such ‘tests’ tend to have all of the abstractness, lack of context, and general irrelevance of the in-person version of the Meaningless Trivia Test, but are even less personal than the in-person variety. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;4)&amp;nbsp; Getting the candidate to do some real work &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5a_Iz8ZjPf-jLC29-MV11IxaJhSfWWyHMsP7IFP2OeECp3tXtAV7gc9GdpIHdI91dNQTWj1bfqw_HpdtHvd_ckvQUuXn0nG99gVdUIq1h51_hY87TLpilF886CuKlZWUidZktRA12jFMI/s1600/WorkInProgress.gif&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5a_Iz8ZjPf-jLC29-MV11IxaJhSfWWyHMsP7IFP2OeECp3tXtAV7gc9GdpIHdI91dNQTWj1bfqw_HpdtHvd_ckvQUuXn0nG99gVdUIq1h51_hY87TLpilF886CuKlZWUidZktRA12jFMI/s1600/WorkInProgress.gif&quot; /&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 13pt;&quot;&gt;Getting close to the way I recommend doing things now, but with caveats. The best developers, like any skilled professional, are happy to demonstrate that they can do the work you’re asking them to do. They welcome employers (or customers, in the case of contractors) exercising meaningful due diligence that allows them to demonstrate they’re the right person for the job. As I mentioned earlier, this is something that many of the best people actively look for in a recruitment process, because as well as giving them an opportunity to prove themselves, it also gives them confidence that their colleagues will be every bit as on their game as they are. Good people want to work with other good people, from whom they can learn and share knowledge, and alongside whom they can grow and develop as ever-more experienced professionals. The fly in the ointment is that there are a small number of less-reputable organisations out there, also advertising jobs, that are only too happy to ask for samples and free work, without ever intending to recruit. For such organisations, unfortunately, it’s a ‘creative’ way of saving on their training budget by getting an external professional to give some free demos under the auspices of an interview, or of getting small projects done for free. For this reason, you need to be careful; you don’t want to chase good people away by coming across as a freeloader.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;One good way of avoiding your organisation’s honourable intentions being misconstrued, is to not make providing a sample of the candidate&#39;s work the very first stage in the process. Interview the person first, and invest some of your time to show them a little of what you have to offer them as an employer, before asking them to invest their time in providing free work for you. That approach immediately makes you stand out as an organisation that’s serious about recruiting. Organisations that are instead only looking for freebies, generally make it obvious by asking prospective candidates to invest their time in providing a demo solution after only a short telephone screen, and well before the organisation has demonstrated that it has anything of substance to offer the right candidate. Less reputable organisations will also have the cheek to ask for second and third samples of work, and changes to work submitted, never attempting to explain why earlier demos didn’t satisfy their ostensible purpose of demonstrating the candidate’s technical ability. I advise those on the hiring side of the recruitment table never to behave this way; not only will it be entirely obvious to people with marketable skills that you’re merely freeloading, but the best people can and will inform their equally-skilled professional colleagues about their experience with your process, and it’s very likely that you’ll be left with only sub-standard applicants should you become serious about recruiting at any point in the future. Reputations are hard to win, and easy to lose; for candidates, for employment brands and for internal and external recruiters of all flavours alike.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;border-color: -moz-use-text-color -moz-use-text-color windowtext; border-style: none none solid; border-width: medium medium 1pt; padding: 0cm 0cm 1pt;&quot;&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: medium none; padding: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: medium none; padding: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;So much for the ‘wrong’ ways to go about finding the right people to join your fold. Now, the right way. As touched upon above, the best people will welcome you engaging in due diligence. There’s no better way to do this than by getting your existing technical staff to speak with the prospective new member of the team. Ideally, on your side of the interview table, as a minimum, you’ll have your lead developer or development manager (whatever nomenclature you use within your particular organisation, they should be the person your most senior management are most likely to go to when they want an opinion on how anything technical should be tackled within your organisation). &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;Invite your prospective new employee in to speak with you and your lead tech informally for a first interview (or a telephone screen, if distance is an issue), and don’t beat them up during that initial interview. The first interview should be to establish just two things: one, whether the person in front of you is manifestly unqualified for the work concerned, and two, to give them a taste of what you have to offer and to let them know what you expect in return. That’s it for the first meeting; those are the only goals. The aim isn’t to establish whether they’re exactly right for your organisation just yet, and it’s not to make any hasty decisions based on limited information. During your conversation, ask them to tell you about something particularly innovative that they’ve worked on recently, or better still their pet project; every developer has at least one on the go, and, whilst they’ll mostly be commercially irrelevant to your business, they’ll tell you a lot about how well your prospective new colleague is able to communicate the concepts they understand to others. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;As mentioned earlier, I strongly advise against asking coding trivia questions from a set list, but it’s perfectly acceptable to have your internal technical expert ask the candidate to explain more about the nuts and bolts of the candidate’s pet project or most recent work. This is why you have your best existing internal technical resource on your side of the interview table; they should be able to probe and question during a discussion of the design, without coming across as needing to be the smartest person in the room. Your technical expert should avoid the temptation to ask the candidate any ‘trick questions’, that rely on obscure technical knowledge that they’ve only just encountered themselves, but it’s OK to probe a little to see how deep the candidate’s knowledge of underlying concepts is. It’s also OK to ask about newer technologies that the candidate may or may not have encountered; if they’ve not, you’re looking for them to tell you so rather than for them to waffle or bluff their way through – knowing what they don’t know is a good trait in a developer. Your internal technical expert may not know everything that the candidate does about the subject at hand, especially if the candidate is intended to add a skill to your team that it hasn’t yet mastered, but there should be enough common ground for your tech lead to determine whether the candidate outright doesn’t know their subject area. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;After that first interview, ask suitable candidates to participate in a coding task. You can choose to allow your candidate to do this at home, or within your premises; it shouldn’t matter which to you, although bear in mind that some developers wont have access to all of the tools at home that they’re used to having in their workplace. The developer should have access to every resource they’ll have available on the actual job, including the internet, any reference books they want, MSDN, etc. They should also have a reasonably-powerful development machine, similar to the one they’d be using if they were to be recruited. Make sure that the problem you ask them to solve is realistic, and can be developed by someone with reasonable skill in the area you’re recruiting for within 3-4 hours max. Ideally, get one of your existing developers that wasn’t involved in designing the exercise to try out the problem first, to be sure it’s of a reasonable level of difficulty. Make it obvious to your candidate that you’re not asking them to do unpaid commercial work, by presenting them with an abstract problem that is clearly unrelated to your business (e.g., perhaps ask them design a Windows Service that writes an entry to the event log every time the sum of the minutes in the current time is a prime number, or something similar). It’s not usually possible to present candidates with a real commercial problem, because even if it’s something your team has actually tackled within a set time frame, chances are you brought existing knowledge to your understanding of the problem that brand new candidates wont be able to draw upon.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;After your candidate has completed their solution, get them to talk through their design with you, and review it with them in the same open and non-critical way that you’d conduct internal code reviews on real, commercial pieces of work. Doing this will not only tell you a lot about how the candidate approaches technical tasks, it will additionally give you an insight into how well they work with others as part of a mutually respectful and co-operative team. If done properly, it’ll also give the candidate a good insight into your culture, and help you both to decide whether or not you’re a good fit for one another. What you should be looking for in an ideal candidate isn’t just a window onto their existing knowledge, but their ability to apply what they know to new problems, whether they have the honesty and self-awareness to recognise what they don’t yet know, and, of key importance, whether they have the initiative to find things out as and when the need arises. Those are all key traits that a set list of coding trivia questions or a faceless online test would never tell you.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;After your ‘technical review’ with the candidate, discuss your findings internally amongst the recruitment team. Subsequently, if you decide to proceed, have one, final interview with the candidate, to review all that you’ve learned about one another in a post-mortem type setting. Ask them about their experience of your process, discuss any issues that you’d like to clarify with them, and be prepared to take any questions they’ll have of you. This meeting is about rounding out what you know about one another, and finalising any missing details.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;Once you’ve completed the above process, your internal ‘recruitment team’ (consisting of the hiring manager, your internal technical expert, and any advisers from HR that you’ve consulted) should be in an excellent position to decide whether the person in front of you is a right fit for your needs or not. Don’t be tempted to conclude that just because you’ve come all the way through the process, you need to extend an offer; psychologists call that phenomenon ‘justification of effort’. Remember that your process is designed to give you the information you need to make an informed decision, and to give a favourable impression of your organisation to everyone that has taken the time to apply. It’s not merely about picking the last person standing. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;Put any candidates that have made it to the end of your process into three categories: first choice, any second choices, and any unselected candidates. Contact unselected candidates right away, to thank them for their time, and to tell them they haven’t been selected. Keep any second choices in reserve whilst your external recruiter extends and negotiates a mutually-agreeable offer with your preferred candidate (hiring managers should &lt;i&gt;never&lt;/i&gt; do this part themselves – negotiation is skill that most hiring managers don’t have, and, even when they do, this process is still at its most effective when conducted via an intermediary). If an offer can’t be agreed with the preferred candidate, approach any second preferences and try to come to an agreement with them. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-size: 13pt;&quot;&gt;At the end of the process, let every candidate that hasn’t been selected know the outcome, and, if they’d like to know, the reasons for your decision. The classiest way of doing this is for the hiring manager to call each individual personally, to thank them for their time, and to express regret that they weren’t the right person on this occasion, followed up by a letter to confirm the news. Many hiring managers shy away from doing this, perhaps through fear that the candidate will react badly. In my experience, though, most if not all professional candidates really appreciate it when the organisations in which they’ve invested their time and effort take the time to conclude the process properly. In years of informing people in person when they’ve not got a job, I’ve never once had the experience of a candidate reacting with anything other than courtesy and appreciation that I had enough respect to let them know the outcome myself, when I called to let them know the decision. If you’re unfortunate enough to experience a candidate being aggressive, or treating the call like a debate rather than a simple communication of your decision, feel free to end the call quickly – you’re not there to be their career counsellor, and you’re not there to justify yourself beyond respectfully communicating your decision, and your reasons for making that decision if the candidate is interested in hearing them. Conclude matters this way, and you’ll always have a steady stream of candidates for jobs that you may advertise in the future; word gets around about which organisations treat candidates well and which don’t, and it’s amazing how often that candidate that wasn’t quite right for you yesterday, has exactly the right skills for the position that comes up tomorrow, or knows someone that does. End things well, and you’ll always have the ability to open dialogue again if it becomes relevant to do so.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/6965541042108662361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/6965541042108662361'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/2010/08/how-to-recruit-and-vet-technical.html' title='How to Recruit and Vet Technical Professionals'/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQDZjSCrdtxe74wmmaybvycfC2Qv4aVWEV1KKhxFeaM7Lv96V6m_umn8QWwS5V7l2ih5vVLWC68lPD8mwkaZ-BfkXu90RXUbVB5vw48pXFIYT5J2JPBGFzQjTQF0gKdHDB5383mw1dZh4P/s72-c/MeetThemYourself.gif" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7818882524515880477.post-1725859395310037699</id><published>2010-08-12T12:54:00.017+01:00</published><updated>2012-07-16T23:02:27.805+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="VB"/><title type='text'>Structs and Classes</title><content type='html'>&lt;style&gt;
&lt;!--
 /* Font Definitions */
 @font-face
 {font-family:Wingdings;
 panose-1:5 0 0 0 0 0 0 0 0 0;
 mso-font-charset:2;
 mso-generic-font-family:auto;
 mso-font-pitch:variable;
 mso-font-signature:0 268435456 0 0 -2147483648 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
 {mso-style-parent:&quot;&quot;;
 margin:0cm;
 margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:12.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-fareast-font-family:&quot;Times New Roman&quot;;}
h1
 {mso-style-next:Normal;
 margin-top:12.0pt;
 margin-right:0cm;
 margin-bottom:3.0pt;
 margin-left:0cm;
 mso-pagination:widow-orphan;
 page-break-after:avoid;
 mso-outline-level:1;
 font-size:13.0pt;
 mso-bidi-font-size:16.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-bidi-font-family:Arial;
 mso-font-kerning:16.0pt;
 font-weight:normal;
 mso-bidi-font-weight:bold;
 text-decoration:underline;
 text-underline:single;}
h2
 {mso-style-next:Normal;
 margin-top:12.0pt;
 margin-right:0cm;
 margin-bottom:3.0pt;
 margin-left:0cm;
 mso-pagination:widow-orphan;
 page-break-after:avoid;
 mso-outline-level:2;
 font-size:13.0pt;
 mso-bidi-font-size:14.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-bidi-font-family:Arial;
 font-weight:normal;
 mso-bidi-font-weight:bold;
 font-style:italic;
 text-decoration:underline;
 text-underline:single;}
@page Section1
 {size:595.3pt 841.9pt;
 margin:72.0pt 90.0pt 72.0pt 90.0pt;
 mso-header-margin:35.4pt;
 mso-footer-margin:35.4pt;
 mso-paper-source:0;}
div.Section1
 {page:Section1;}
 /* List Definitions */
 @list l0
 {mso-list-id:454252584;
 mso-list-type:hybrid;
 mso-list-template-ids:-1998011904 134807553 134807555 134807557 134807553 134807555 134807557 134807553 134807555 134807557;}
@list l0:level1
 {mso-level-number-format:bullet;
 mso-level-text:;
 mso-level-tab-stop:36.0pt;
 mso-level-number-position:left;
 text-indent:-18.0pt;
 font-family:Symbol;}
ol
 {margin-bottom:0cm;}
ul
 {margin-bottom:0cm;}
--&gt;
&lt;/style&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;  &lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;.Net provides two basic object types that can be used to construct more complex objects: &lt;i&gt;Structs&lt;/i&gt; and &lt;i&gt;Classes&lt;/i&gt;. These object types are made up of similar features, and can be used to fulfil many of the same tasks as one another. There are, however, some important distinctions between what you can do with Structs and with Classes, and between how similar features are implemented differently by each object type. This article describes those similarities and differences, and provides some suggestions for when and how to use each type.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;border-color: -moz-use-text-color -moz-use-text-color windowtext; border-style: none none double; border-width: medium medium 2.25pt; padding: 0cm 0cm 1pt;&quot;&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: medium none; padding: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: medium none; padding: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h1&gt;
&lt;span style=&quot;color: black;&quot;&gt;The &lt;/span&gt;Similarities&lt;span style=&quot;color: black;&quot;&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Structs and Classes are both capable of utilising Fields, Properties, Constants, Methods, Events, Handlers and certain types of Constructor. They are both capable of being instantiated, and they are each able to have variables declared as being of the type they define. Both can model data objects, using much the same syntax in each case, and indeed you can often convert a Struct to a Class and back simply by changing the word&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;in its definition to &lt;/span&gt;&lt;span style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;, or vice-versa. Both types of entity may also implement Interfaces. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h1&gt;
&lt;span style=&quot;color: black;&quot;&gt;The Differences&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;The most fundamental distinction between Structs and Classes is rooted in a .Net concept known as the &lt;i&gt;Common Type System&lt;/i&gt;. When you compile a program written in any of the languages that target the .Net Framework, the first step that happens is that the code gets converted by the specific compiler for the high-level language (e.g., C#, VB, C++, or whatever) into something called &lt;i&gt;Microsoft Intermediate Language&lt;/i&gt; (also known as the &lt;i&gt;Common Intermediate Language&lt;/i&gt;, often abbreviated to &lt;i&gt;‘IL’&lt;/i&gt; for short). The IL representation of a .Net program is then converted into a set of platform-specific machine code instructions by the .Net runtime execution environment, known as the &lt;i&gt;Common Language Runtime (CLR)&lt;/i&gt;.&amp;nbsp; [ NB: For Java developers, the concept of .Net’s &lt;i&gt;IL&lt;/i&gt; is analogous to the way that Java compilers convert raw Java code into &lt;i&gt;Bytecode&lt;/i&gt;, to be run within a Java Virtual Machine.]&amp;nbsp; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Part of what makes the process of converting any of the languages that target the .Net Framework into IL possible, is the fact that each of those different languages uses the &lt;i&gt;Common Type System&lt;/i&gt; &lt;i&gt;(CTS)&lt;/i&gt; mentioned above. The CTS defines the basic set of types (boolean, integer, etc) that IL understands and knows how to work with. [Actually, the set of types that IL understands is far larger than any of the languages that presently target the .Net Framework is capable of modelling, and not all of the languages that target the .Net Framework implement exactly the same subset of those IL types, leading to the potential for subtle language interoperability issues, but that’s a discussion for another day.] &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;The key point of relevance to the subject under discussion is, there are two core types defined within the CTS, which are known as &lt;i&gt;Value Type&lt;/i&gt; and &lt;i&gt;Reference Type&lt;/i&gt; respectively. Every type in any .Net program derives from one or other of these two possible base types, and which one they derive from dictates how they will be stored in memory, how the object may be inherited, and how objects that are of those types will behave. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Getting back to Structs and Classes, it’s the case that every Struct defined in a C# or VB program is considered to be a Value Type by the CTS, and every Class is considered to be a Reference Type at the very root of its inheritance chain. This difference in base type inheritance is what accounts for many of the differences between Structs and Classes, which are listed below:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
Differences in Implementation Inheritance&lt;/h2&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;As noted above, both Structs and Classes may implement Interfaces. However, only Classes may overtly use Implementation Inheritance to inherit from another object. Classes, unlike Structs, may also be inherited &lt;i&gt;by&lt;/i&gt; another object. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;At their root, Structs derive from a CTS type called &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;System.&lt;span style=&quot;color: #2b91af;&quot;&gt;ValueType&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;, which in turn inherits from &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;System.&lt;span style=&quot;color: #2b91af;&quot;&gt;Object&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;. Classes with no overtly-defined base inherit directly from &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;System.&lt;span style=&quot;color: #2b91af;&quot;&gt;Object&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; (and, for Classes that don&#39;t inherit directly from &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;System.&lt;span style=&quot;color: #2b91af;&quot;&gt;Object&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;, there may be any amount of Classes in between &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;System.&lt;span style=&quot;color: #2b91af;&quot;&gt;Object&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; and themselves). &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Concentrating on Structs, you may find it surprising to know that most of the defined system types in C# and VB (e.g., integer, double, decimal, etc), also derive from &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;System.&lt;span style=&quot;color: #2b91af;&quot;&gt;ValueType&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;, and are in fact implemented as Structs. If you mouse over the keyword of any data type implemented in this way within C# or VB, this fact becomes readily apparent:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;&lt;insert 5=&quot;&quot; graphic=&quot;&quot; here=&quot;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/insert&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinD4rlE1I9iVvVOxb7Re95yv_kdyLKC8cYZ1xlq_PnvSUzXa_Mh9R8dC_WqeaBEKD2bZWuBio15bdqp_lOkpYVpTDZDy8jdh-B6QG09fvb_4CJABjOX5OGL2xxRonYd7WeANTsECG0uSuI/s1600/005_SandC_MostTypesAreStructs.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinD4rlE1I9iVvVOxb7Re95yv_kdyLKC8cYZ1xlq_PnvSUzXa_Mh9R8dC_WqeaBEKD2bZWuBio15bdqp_lOkpYVpTDZDy8jdh-B6QG09fvb_4CJABjOX5OGL2xxRonYd7WeANTsECG0uSuI/s1600/005_SandC_MostTypesAreStructs.gif&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;System.&lt;span style=&quot;color: #2b91af;&quot;&gt;ValueType&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; doesn’t add any functionality to Structs that is not also available to Classes through their common inheritance from &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;System.&lt;span style=&quot;color: #2b91af;&quot;&gt;Object&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;, but it does replace some of the functionality present in &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;System.&lt;span style=&quot;color: #2b91af;&quot;&gt;Object&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; as virtual methods with implementations that are more appropriate for Structs. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Structs, in short, are intended to be used for tasks that require allocating small, fixed-size chunks of data, that need to be able to be accessed and changed rapidly, without incurring an undue performance hit in managing the memory resources that are allocated to them. That’s why they’re used to implement the basic data types such as integer, etc. : when a developer defines an integer variable, they expect to be able to begin using that variable to store numbers within the permitted range for that type immediately, without needing to mess around with allocating space in memory by using a &lt;/span&gt;&lt;span style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; operator as a separate activity each and every time, and without checking whether any modifications their application makes to the value stored in the variable has had any implications for the amount of memory required. They want to be able to access any values placed in their variable readily, without having to rely on the underlying implementation to use pointers to look up an address in memory, then decide what has been stored there, as a two-stage process. Structs enable developers to achieve this rapidity of declaration and access to memory chunks of a fixed size, but the trade-off is that they can’t be used to achieve true Implementation Inheritance, which would require management of an area of memory of a variable size. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;So, whilst Structs are easy to consume and fast to access, if you need to use Implementation Inheritance, that’s a clear sign you need to use a Class instead.&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
Structs can be consumed without explicit instantiation, Classes cannot&lt;/h2&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;When you create a variable of a type defined by a Class, you need to use the &lt;/span&gt;&lt;span style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; operator to instantiate that object before you can access the properties of the object &amp;nbsp;the variable represents. With Structs, this is not the case. Take the following simple example, using a &lt;/span&gt;&lt;span style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class StructsAndClassesDemo 
{
    static void Main()
    {
        MyStruct myVariable;
        myVariable.SomeInteger = 1;
        Console.WriteLine(myVariable.SomeInteger);
    }
}

public class MyClass 
{
    public int SomeInteger;
}

public struct MyStruct 
{
    public int SomeInteger;
}&lt;/pre&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;This will compile and run correctly, outputting “&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Courier New&amp;quot;; font-size: 13pt;&quot;&gt;1&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;” in the Console window. If, on the other hand, we change the &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;Main() &lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Method to: &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;&lt;insert 001=&quot;&quot; graphic=&quot;&quot; here=&quot;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/insert&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiX2wEKzS8BlQXyL9KtnmedajSg4djEjgXxk3vP5PZ0uEQ86pp8BCtyScCRKKpRIuDXfJ1v80AC1dNUv_6cBI_thi1kAqSDtOfq6wOjCDKrf6cG6pgmxnVHHVuv-cgj4n046TRmP4ZsMfDa/s1600/001_SandC.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiX2wEKzS8BlQXyL9KtnmedajSg4djEjgXxk3vP5PZ0uEQ86pp8BCtyScCRKKpRIuDXfJ1v80AC1dNUv_6cBI_thi1kAqSDtOfq6wOjCDKrf6cG6pgmxnVHHVuv-cgj4n046TRmP4ZsMfDa/s1600/001_SandC.gif&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;a compilation error will occur, since we have tried to use an uninstantiated variable of a Reference Type. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;NB: You still need to instantiate an object of type &lt;/span&gt;&lt;span style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; before you may access &lt;i&gt;Properties&lt;/i&gt; (as distinct from &lt;i&gt;Fields&lt;/i&gt;) of that object.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
Variable Assignment works differently for Classes than for Structs &lt;/h2&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Because Structs are Value Type objects, variables of types defined by Structs behave somewhat differently than variables of types defined by Classes. Consider the following simple program:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class StructsAndClassesDemo 
{
    static void Main()
    {
        MyClass myVariable1 = new MyClass();
        MyClass myVariable2;

        myVariable1.SomeInteger = 1;
        myVariable2 = myVariable1;
        myVariable1.SomeInteger = 2;

        Console.WriteLine(myVariable2.SomeInteger);
        Console.ReadLine();
    }
}&lt;/pre&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;The above example would output “&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Courier New&amp;quot;; font-size: 13pt;&quot;&gt;2&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;” in the console window.&amp;nbsp; If we instead exchange the usage of a Class type object for a Struct, and keep the variable assignment logic exactly the same:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class StructsAndClassesDemo 
{
    static void Main()
    {
        MyStruct myVariable1;
        MyStruct myVariable2;

        myVariable1.SomeInteger = 1;
        myVariable2 = myVariable1;
        myVariable1.SomeInteger = 2;

        Console.WriteLine(myVariable2.SomeInteger);
        Console.ReadLine();
    }
}&lt;/pre&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;The revised program will output a “&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Courier New&amp;quot;; font-size: 13pt;&quot;&gt;1&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;” in the console window instead. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;This highlights a key difference in the way that Value Type and Reference Type objects are treated in memory. Reference Type objects (in this case, Classes) actually represent a pointer to an address in a part of the computer’s memory known as the &lt;i&gt;Heap&lt;/i&gt;. When assigning one variable to be equivalent to another variable, as happens in the line&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;myVariable2 = myVariable1&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;, what happens in the case of the variables concerned being of a Reference Type is that it is the pointer to the relevant address on the Heap that gets copied to the variable being assigned to, not the actual data that is contained at the address itself. An upshot of this is that when the variable that has been assigned from, in this case &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;myVariable1&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;,&amp;nbsp; subsequently gets updated so that its &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;SomeInteger&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; field takes on the value “&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Courier New&amp;quot;; font-size: 13pt;&quot;&gt;2&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;”, &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;myVariable2 &lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;in effect gets its value updated as well, since it is the object that resides at the location in memory that is being pointed at by both &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;myVariable1 &lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;and &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;myVariable2&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; that has been modified. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Values associated with variables of Value Types such as Structs, are stored in a different place in memory, known as the &lt;i&gt;Stack&lt;/i&gt;. In the case of Value Types, assigning one variable to be equivalent to another &lt;i&gt;does&lt;/i&gt; copy the actual data from the object being assigned from to the object being assigned to. Because of this, when the object that has been assigned from is subsequently updated, the effect of this change is not felt by any variable that had previously been assigned to by that variable. This is why the value “&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: black; font-family: &amp;quot;Courier New&amp;quot;; font-size: 13pt;&quot;&gt;1&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;” is returned in Console window in the second example above, in contrast to what happens when the types being considered are Reference Type variables based on custom Classes.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
Classes can have overt Parameterless Constructors, but Structs cannot&lt;/h2&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;As was mentioned earlier, you can use a Struct without explicitly instantiating it using the &lt;/span&gt;&lt;span style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; operator. It’s also the case that you may use the &lt;/span&gt;&lt;span style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; operator if you wish (which has the effect of instantiating the whole object for use, including any Fields the Struct may contain, by calling an instrinsic parameterless Constructor for the Struct). However, when you’re designing a Struct, it is erroneous to overtly define a parameterless Constructor for the Struct, since one is declared behind the scenes by the C# or VB compiler for you. You may still create additional Constructors that do take parameters. So, whilst the Constructor:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class MyClass 
{
    public MyClass()
    {
        SomeInteger = 99;
    }

    public int SomeInteger;
}&lt;/pre&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;is fine in a &lt;/span&gt;&lt;span style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;, a similar Constructor for a &lt;/span&gt;&lt;span style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; would result in a compilation error. You may only provide a parametered Constructor for a Struct, like so:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public struct MyStruct 
{
    public MyStruct(int intialIntegerValue)
    {
        SomeInteger = intialIntegerValue;
    }

    public int SomeInteger;
}&lt;/pre&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;The reason for disallowing overtly-defined parameterless Constructors in the case of Structs is that the CLR, as part of that trade off of rapidity of access for completeness of memory management mentioned earlier, does not guarantee to call such Constructors for Value Types, and so any code you place in such a parameterless Constructor would not be guaranteed to run once the program was fully compiled. This is down to the same phenomenon that makes it possible for the Fields of Structs to be accessed and set without initialisation; if the compiler spots an optimisation for your code such that you are only accessing the Fields of a variable that is of a type defined in a Struct, it will not bother generating the IL to call the Constructor for that Struct, and will instead make assumptions that the Fields you are accessing will contain meaningful values. Curiously, if creating the IL directly yourself, it would be perfectly possible to create a parameterless Constructor, and have it run every time, regardless of any apparent optimisation that may be possible, but then if you had a task that required a Constructor to run every time, that’d be a pretty clear sign that what you really needed to use was a Class. For now, in the trade off of best speed for true object orientation in the case of Structs, the designers of the VB and C# languages have decided to take the simplest route, and have prevented parameterless Constructors from being defined for Structs altogether. &lt;br /&gt;
&lt;br /&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h2&gt;
You cannot initialise a field within the definition of a Struct &lt;/h2&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Both Structs and Classes can have Fields. In the case of Classes, it is possible to give a Field an initial value within the definition of the Class itself, like so:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class MyClass 
{
    public int SomeInteger = 99;
}&lt;/pre&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Trying to do the same within the definition of a Struct, however, will produce a compilation error:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAI67zeT6qcArrPerzZjluKkQHmm85l8g6CG0rYwC0e2ms2dB4509FUttQHCiJqH0bWVnM1ihhv2alt2wV7FIFblwbeVhOO93dFpENVjhUe9LzGvMMCIbGndI1JfpBNF3tttM8IQ44csJG/s1600/002_SandC_SettingFields.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAI67zeT6qcArrPerzZjluKkQHmm85l8g6CG0rYwC0e2ms2dB4509FUttQHCiJqH0bWVnM1ihhv2alt2wV7FIFblwbeVhOO93dFpENVjhUe9LzGvMMCIbGndI1JfpBNF3tttM8IQ44csJG/s1600/002_SandC_SettingFields.gif&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;&lt;insert 2=&quot;&quot; graphic=&quot;&quot; here=&quot;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/insert&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;The reasons behind this difference in the way that Structs and Classes are permitted to operate cuts right to the heart of the different ways these distinct types of object are treated in memory. For Classes, because their values are physically stored on the hardware’s Managed Heap, and because .Net’s Garbage Collection mechanism deals with managing resources on the Heap, the CLR can guarantee to have cleared the area in which objects defined by Classes will be stored before placing any new object in that area. Because of the Garbage Collection process, the CLR can be sure that the Properties and Fields of any objects defined as Classes will either be null, or that any values they do hold will have been deliberately assigned to them. CLR is therefore happy to have Class –type objects that have a mixture of assigned and as-yet-unassigned Fields and Properties. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;The Stack, on the other hand, where Structs are stored, is much less well managed (and, as a trade-off, it is generally much quicker to access and modify resources placed there). However, because there is no Garbage Collection process going on in the background to manage that area of memory, Structs will generally be assigned to a random area of the Stack, big enough to contain the Struct, but where the CLR cannot guarantee that any values placed in that area of the Stack have been deliberately assigned to the Struct that now resides there, or whether the area in memory that happens to currently be assigned to a given Field or Property of a Struct was actually a piece of data from another unmanaged object that was left behind when that object was cleared from the Stack at some prior point. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;In an effort to mitigate the uncertainty about the whether parts of a Struct have been deliberately set or are merely a throwback from prior use of the same location of the Stack by some other unrelated object, Structs are restricted to having their fields initialised in a certain controlled way, that can be efficiently checked by the compiler. If you use the implicitly-defined Constructor, &lt;/span&gt;&lt;span style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;MyStruct&lt;/span&gt;()&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;, to create a new instance of a Struct, this has the effect of setting all of the Struct’s Fields and Properties to their default values (so, 0 for &lt;/span&gt;&lt;span style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; -type Fields, etc). If you define your own parametered Constructor for a Struct, the compiler will warn you if you fail to initialise any of the Struct’s Fields within that custom Constructor:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;&lt;insert 2=&quot;&quot; graphic=&quot;&quot; here=&quot;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/insert&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgShnEj84zbzmK5jVjJykojYK7xrFXuN1xRvds_ih-NLfK8CEEOcfizaOz1YOHxtorwI6DBnDcnruXs9792cX8UaRFImBFpcoKWcHzQzQwft7vJHn2PKd42teLfWnDrdx6Y6MOtXycrmC_p/s1600/002_SandC_MustInitialiseAllFields.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgShnEj84zbzmK5jVjJykojYK7xrFXuN1xRvds_ih-NLfK8CEEOcfizaOz1YOHxtorwI6DBnDcnruXs9792cX8UaRFImBFpcoKWcHzQzQwft7vJHn2PKd42teLfWnDrdx6Y6MOtXycrmC_p/s1600/002_SandC_MustInitialiseAllFields.gif&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;As mentioned earlier, you don’t need to initialise a Struct at all before you begin to assign values to it. If you do use a Struct –type object in this way, and you fail to assign a value to one of the Fields of that Struct variable before assigning the value of that variable to another variable of the same type, you will also get a compilation error:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;&lt;insert 3=&quot;&quot; graphic=&quot;&quot; here=&quot;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/insert&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik2QCwxTMqoh2moFZ9bLOLk1YiGVlLbDcgtc8J0JXPs15VnDAYbKKYkPlHuNIy5OSffli2qsrAaD-xX4E9L43ln209vZbhW6-_xG7VrmIlH97HyDGDUzcoJ7JC5cTMUKRu1vcdJVkXetnh/s1600/003_SandC_SettingFields002.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik2QCwxTMqoh2moFZ9bLOLk1YiGVlLbDcgtc8J0JXPs15VnDAYbKKYkPlHuNIy5OSffli2qsrAaD-xX4E9L43ln209vZbhW6-_xG7VrmIlH97HyDGDUzcoJ7JC5cTMUKRu1vcdJVkXetnh/s1600/003_SandC_SettingFields002.gif&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;By removing the possibility that Fields may be set within the definition of the Struct itself, it allows the compiler to efficiently focus on other more straightforward possible places (i.e., within a Constructor, if one is used, or within the scope of a variable defined to be of the type the Struct declares, if no Constructor is used), to determine whether all of the Fields of a Struct-type object have been fully initialised before those Fields can be accessed by or assigned to any other object. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
Structs may not have a Destructor&lt;/h2&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Because instances of Structs exist on the Stack and not on the managed Heap, the concept of Destructors (i.e., an overt override of the Garbage Collection mechanism to allow the developer to specify how to dispose of temporary resources) clearly does not apply to them:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;&lt;insert 4=&quot;&quot; graphic=&quot;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/insert&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;border-color: -moz-use-text-color -moz-use-text-color windowtext; border-style: none none double; border-width: medium medium 2.25pt; padding: 0cm 0cm 1pt;&quot;&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: medium none; padding: 0cm;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh73qgTbcJTlD7gioEy5JHFVX675Ih9AOTT3MbC8HwyC8hiabyIJeqd8DhhxFRbnvkJC1iT9rv6uTVyf5QiZKMQUBoTrPm5-83RWkmNL45_Luw40yPU9FjWk3OLwUuVbwhnEaTcc0j5rMX-/s1600/004_SandC_Destructors.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh73qgTbcJTlD7gioEy5JHFVX675Ih9AOTT3MbC8HwyC8hiabyIJeqd8DhhxFRbnvkJC1iT9rv6uTVyf5QiZKMQUBoTrPm5-83RWkmNL45_Luw40yPU9FjWk3OLwUuVbwhnEaTcc0j5rMX-/s1600/004_SandC_Destructors.gif&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;border: medium none; padding: 0cm;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;So, in summary, the differences between Classes and Structs are:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 36pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;color: black; font-family: Symbol; font-size: 13pt;&quot;&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Classes are &lt;i&gt;Reference types&lt;/i&gt;, whilst Structs are &lt;i&gt;Value Types&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 36pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;color: black; font-family: Symbol; font-size: 13pt;&quot;&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Classes are physically stored on the &lt;i&gt;Managed Help&lt;/i&gt;, whilst Structs are stored on the &lt;i&gt;Stack&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 36pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;color: black; font-family: Symbol; font-size: 13pt;&quot;&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;The effect of variable assignment works differently for Classes and Structs.&lt;br /&gt;
&lt;br /&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 36pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;color: black; font-family: Symbol; font-size: 13pt;&quot;&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Both types of object can implement Interfaces, but only Classes may overtly employ Implementation Inheritance.&lt;br /&gt;
&lt;br /&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 36pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;color: black; font-family: Symbol; font-size: 13pt;&quot;&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Structs cannot have overt parameterless Constructors, Classes can.&lt;br /&gt;
&lt;br /&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 36pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;color: black; font-family: Symbol; font-size: 13pt;&quot;&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;When you define your own parametered Constructor for a Struct, the compiler enforces that you must explicitly set the value of any Fields within that Constructor to avoid said Fields containing spurious values. For Classes, the compiler entrusts the Garbage Collection process with this task. &lt;br /&gt;
&lt;br /&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 36pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;color: black; font-family: Symbol; font-size: 13pt;&quot;&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;You &lt;i&gt;must&lt;/i&gt; instantiate a variable based on a Class, whilst you &lt;i&gt;may&lt;/i&gt; instantiate an object based on a Struct (though you don’t have to).&lt;br /&gt;
&lt;br /&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 36pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;color: black; font-family: Symbol; font-size: 13pt;&quot;&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Structs may not have default values for Fields, Classes may.&lt;br /&gt;
&lt;br /&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 36pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;color: black; font-family: Symbol; font-size: 13pt;&quot;&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Where you choose not to instantiate a Struct –type variable, the compiler will enforce that you must set each Field of that instance of the Struct before you can use the variable for assignment.&lt;br /&gt;
&lt;br /&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 36pt; text-indent: -18pt;&quot;&gt;
&lt;span style=&quot;color: black; font-family: Symbol; font-size: 13pt;&quot;&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Structs may not utilise Destructors.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Because of these different characteristics, Structs should be used most often for small structures, where the values contained therein will not be frequently re-assigned between variables, thereby creating a lot of duplicate data in memory, and where there is no need to use Implementation Inheritance. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Classes should be used where a more complex object that will be frequently passed around between parts of the program needs to be modelled, and in instances where it doesn’t matter that assignment between variables copies a reference to the object being assigned from, rather than the underlying data of the object itself being assigned.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/1725859395310037699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/1725859395310037699'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/2010/08/structs-and-classes.html' title='Structs and Classes'/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinD4rlE1I9iVvVOxb7Re95yv_kdyLKC8cYZ1xlq_PnvSUzXa_Mh9R8dC_WqeaBEKD2bZWuBio15bdqp_lOkpYVpTDZDy8jdh-B6QG09fvb_4CJABjOX5OGL2xxRonYd7WeANTsECG0uSuI/s72-c/005_SandC_MostTypesAreStructs.gif" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7818882524515880477.post-5467435184219817408</id><published>2010-07-21T20:13:00.030+01:00</published><updated>2013-07-24T22:13:06.285+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="VB"/><title type='text'>Extension Methods</title><content type='html'>&lt;style&gt;
&lt;!--
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
 {mso-style-parent:&quot;&quot;;
 margin:0cm;
 margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:13.0pt;
 mso-bidi-font-size:13.0pt;
 font-family:&quot;Times New Roman&quot;;
 mso-fareast-font-family:&quot;Times New Roman&quot;;}
@page Section1
 {size:612.0pt 792.0pt;
 margin:72.0pt 90.0pt 72.0pt 90.0pt;
 mso-header-margin:36.0pt;
 mso-footer-margin:36.0pt;
 mso-paper-source:0;}
div.Section1
 {page:Section1;}
--&gt;
&lt;/style&gt;  &lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Extension Methods were introduced in the revisions to the C# and VB .Net languages that accompanied the release of Framework version 3.5 in November 2007 (that is, C# 3.0 and VB 9.0 respectively). They allow developers to augment – to extend – existing classes and interfaces by facilitating the creation of new Methods, without breaking the encapsulation of the original type/interface being extended. This can be achieved without the developer having to create a whole new type that derives from the type they wish to extend, and without their needing to have access to or know about the internal implementation of the type/interface they are extending. Used sparingly and intelligently, Extension Methods can be an extremely powerful and useful technique in a developer’s repertoire. This article contains a brief background on the advent of Extension Methods, a discussion of the syntax for implementing them, and some suggestions as to where and when best to use them.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;  &lt;/span&gt;&lt;br /&gt;
&lt;hr align=&quot;center&quot; size=&quot;2&quot; width=&quot;100%&quot; /&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;&lt;i&gt;A little background...&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;It’s no accident that Extension Methods were first included in the same version of the .Net Framework that also introduced LINQ. A full discussion of LINQ and the capabilities that it appends to the .Net language is a separate topic for another time. In summary, though, and of relevance to the present topic, LINQ (&lt;i&gt;Language Integrated Query&lt;/i&gt;) is a syntax extension of the .Net languages that allows types that implement certain existing Interfaces to be directly queried in a native language syntax that reads very much like the SQL statements that had hitherto traditionally only been used within DBMS such as SQL Server. Using LINQ, developers could for the first time query, sort, and otherwise work with types representing data collections in-memory. The following simple program demonstrates LINQ at work on a collection of type &lt;/span&gt;&lt;span style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;[]&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; :&lt;/span&gt;&lt;/div&gt;&lt;span 10pt=&quot;&quot; courier=&quot;&quot; font-size:=&quot;&quot; new=&quot;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;using System;
using System.Linq;

namespace Demo
{
    static class Program
    {
        static void Main()
        {
            string[] _CapitalCities = new string[5] { &quot;Edinburgh&quot;, &quot;London&quot;, &quot;Paris&quot;, &quot;Rome&quot;, &quot;Stockholm&quot; };

            foreach (string city in _CapitalCities.OrderByDescending(city =&amp;gt; city))
            {
                Console.WriteLine(city);
            }

            Console.ReadLine();
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;The above program produces a Console window, listing the five cities stored in the variable &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;_CapitalCities&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; in reverse alphanumeric order. It does this by accessing a new method for type &lt;/span&gt;&lt;span style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;[]&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; called &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;OrderByDescending&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;. If you remove the &lt;/span&gt;&lt;span style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;using&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt; System.Linq&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; directive from the above program, you will find that the compiler no longer recognises a Method called &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;OrderByDescending&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; for objects of type &lt;/span&gt;&lt;span style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;[]&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;. So what’s going on?&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;Because the type &lt;/span&gt;&lt;span style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;[] &lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;implements an existing generic interface called &lt;i&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/i&gt; that was defined in previous versions of the .Net Framework, and because a new class called &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;System.Linq.&lt;span style=&quot;color: #2b91af;&quot;&gt;Enumerable&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; that was appended to Framework 3.5 by the designers of LINQ defines an Extension Method for &lt;i&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/i&gt;called &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;OrderByDescending&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;, variables of the type &lt;/span&gt;&lt;span style=&quot;color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;[]&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; acquire the new Method observed, which is only accessible within the context of any object that references the &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;System.Linq &lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;namespace. &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;LINQ uses Extension Methods in this way to facilitate adding new functionality to existing Framework definitions such as &lt;i&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/i&gt;, for the purpose of enabling objects that utilise those definitions to be instantly usable in conjunction with the new LINQ syntax. Extension Methods allowed them to do this without causing breaking changes to designs that preceded LINQ, and which consumed the original, un-extended versions of those existing Framework objects. Alternative approaches by the designers of LINQ might have included updating all of the Interfaces that they wanted to add new functionality to (which would have been great for LINQ, but would have broken any existing designs that had used previous versions of the updated Interfaces as soon as those designs were upgraded to the new version of the Framework, thereby upsetting a lot of developers and system owners). Or, they could have created an entirely new set of Interfaces, based on the originals, but with the extra LINQ goodness included (would have needlessly added to the complexity of the .Net Framework, which already contained quite enough redundant but kept-for-reasons-of-backward-compatibility features and near-identical object definitions from earlier upgrades and improvements, and would furthermore have needlessly rendered LINQ unusable by existing objects that had implemented older versions of the superseded Interfaces). By using Extension Methods, the LINQ developers were able to add functionality to existing objects, in a way that would only be apparent within designs that utilised their new language feature, and that avoided producing unnecessary breaking changes for developers that were merely upgrading their designs to the latest version of the Framework, but who had no interest in utilising LINQ within their legacy designs. In the process of their work, the LINQ developers gave us a useful additional tool to make much the same subtle enhancements to our own established designs as they had to the preceding version of the Framework.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;&lt;i&gt;Implementing Extension Methods within your own designs...&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;The syntax of implementing Extension Methods for a given class is demonstrated below. Suppose you have an existing class defined in the following way:&lt;/span&gt;&lt;/div&gt;&lt;span 10pt=&quot;&quot; courier=&quot;&quot; font-size:=&quot;&quot; new=&quot;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;namespace RPPClassLibrary
{
    public class Person 
    {
        public Person()
        {
        }

        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
}
&lt;/pre&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;If you wanted to extend the class &lt;/span&gt;&lt;span style=&quot;color: #2b91af; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;Person&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; to include a new Method called &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;FullName&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; using Extension Methods, the syntax for doing so would be as follows:&lt;/span&gt;&lt;/div&gt;&lt;span 10pt=&quot;&quot; courier=&quot;&quot; font-size:=&quot;&quot; new=&quot;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;using System;
using RPPClassLibrary;

namespace RPPConsumingAssembly
{
    static class Program
    {
        static void Main()
        {
            Person aRachel = new Person() { FirstName = &quot;Rachel&quot;, LastName = &quot;Pierson&quot; };
            Console.WriteLine(aRachel.FullName());
            Console.ReadLine();
        }

    }

    public static class MyExtensions
    {
        public static string FullName(this Person pExistingObject)
        {
            return pExistingObject.FirstName + &quot; &quot; + pExistingObject.LastName;
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;The above scenario, where the developer has free access to the class they are extending, isn’t a particularly good example of when Extension Methods should be used, but it is nonetheless a simple enough scenario to demonstrate what the syntax for creating such a Method should look like. The above code snippet takes an existing class, &lt;/span&gt;&lt;span style=&quot;color: #2b91af; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;Person&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;, which resides within the namespace &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;RPPClassLibrary&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;, and extends it to include the newly-required Method &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;FullName&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;, only for objects of type &lt;/span&gt;&lt;span style=&quot;color: #2b91af; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;Person&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; that are defined within the scope of the separate namespace &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;RPPConsumingAssembly&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;. This is achieved by adding a new static class within &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;RPPConsumingAssembly&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; called &lt;/span&gt;&lt;span style=&quot;color: #2b91af; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;MyExtensions&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;. The &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;Main&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; Method of the class &lt;/span&gt;&lt;span style=&quot;color: #2b91af; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;Program&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; within &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;RPPConsumingAssembly&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; demonstrates using the new &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;FullName&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; Extension Method with an object of the freshly-extended &lt;/span&gt;&lt;span style=&quot;color: #2b91af; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;Person&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; type. The output of the program above is as follows:&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_YpJT_RuM_08/TEdDzLiVtpI/AAAAAAAAAB4/vpkfOeA5FKE/s1600/RPP+Extension+Methods+003.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;253&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1EKsT5B35uhSywX24W8pZ3lbZiOK8ZenXEVhxpkbQyP_Ax_fBs66t5zvUrv4Pi5FtM7_HwaRNJcicyJkOOZXOwP7q8hq1WcKvMQBk4G6e9zKjXbWeUr6NSRkh7dnJn8tML4XfI4mWFf5q/s800/RPP%2520Extension%2520Methods%2520003.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;To create an Extension Method for any existing class or interface, as the code snippet above demonstrates you need to create a static class at the top level of the namespace in which you want to consume the Extension Method, then create as many public static Methods within that static class as you wish to create Extension Methods for. It doesn’t matter what you call the static class that you use to contain the Extension Methods you define, it matters only that the parameter list for any Extension Methods you define within your top-level static class take the exact format shown above – i.e. &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;(&lt;span style=&quot;color: blue;&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;Person&lt;/span&gt; pExistingObject)&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; – changing the type &lt;/span&gt;&lt;span style=&quot;color: #2b91af; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;Person&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; for whichever class/interface it is that you are extending. You can include Extension Methods for entirely different existing types within the same top-level static class, provided your definition of each individual Extension Method makes it clear which type your new Method applies to.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;&lt;i&gt;When to use Extension Methods...&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;There is a school of thought that says: “Never!”. The reason for this viewpoint is that extending classes willy-nilly certainly could lead to confusion at a later date, if the class that is extended by Extension Methods subsequently gets directly updated at some point to contain some additional intrinsic Methods with the same signatures as the Extension Methods that have been defined in the interim by external consuming classes. There would be nothing in the compiler that would alert the original author of the class being reviewed to the fact that some consumer of their object had previously extended it in what would in some respects be a potentially conflicting change. What would happen in actuality if the developer of a since-extended class happened to add a new Method to their class that had exactly the same signature as an Extension Method that had been created by a consumer, is that the new internal Method would take precedence, and the Extension Method would be superseded and effectively ignored by the compiler. For example, imagine if the original class in the simple example presented earlier were to be revised at some point so that it looked like this:&lt;/span&gt;&lt;/div&gt;&lt;span 10pt=&quot;&quot; courier=&quot;&quot; font-size:=&quot;&quot; new=&quot;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class Person 
{
    public Person()
    {
    }

    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string MiddleName { get; set; }

    public string FullName()
    { 
        StringBuilder _FullName = new StringBuilder();

        _FullName.AppendFormat(&quot;{0} {1} {2}&quot;, 
            FirstName ?? &quot;(No First Name)&quot;,
            MiddleName ?? &quot;(No Middle Name)&quot;,
            LastName ?? &quot;(No Last Name)&quot;);

        return _FullName.ToString();
    }
}
&lt;/pre&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;In this scenario, the assembly that consumes the &lt;/span&gt;&lt;span style=&quot;color: #2b91af; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;Person&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; class (which would still contain a now-obsolete Extension Method with the same name as the new internal Method &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;FullName&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; that has been added to the original &lt;/span&gt;&lt;span style=&quot;color: #2b91af; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;Person&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; class) would still compile, and the program would run without errors, but the output would now reflect the internal, subtly-different, definition of the &lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;&quot;&gt;FullName&lt;/span&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt; Method:&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrGdrmu2rDAErmlTg3lww-scd4REN-VOI4EXjj9NAH4wUS2FtrMpv-2imr2UoXiu3bz8zxEE8vgvD8OIc3yiFgQZiH9NowH4V435ME8viSMGn3XExe9eVCrv5iq-4lheLaI6lErN5u6oWC/s800/RPP%2520Extension%2520Methods%2520004.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;235&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrGdrmu2rDAErmlTg3lww-scd4REN-VOI4EXjj9NAH4wUS2FtrMpv-2imr2UoXiu3bz8zxEE8vgvD8OIc3yiFgQZiH9NowH4V435ME8viSMGn3XExe9eVCrv5iq-4lheLaI6lErN5u6oWC/s800/RPP%2520Extension%2520Methods%2520004.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;The basic issue that some developers have with Extension Methods is that, by some definitions, they break the key object-oriented design principle of &lt;i&gt;encapsulation&lt;/i&gt;. That is, they begin to impact upon the ability of objects to contain and control their own definitions, and act as black boxes to consumers. This isn’t an entirely fair criticism since, as the above example demonstrates, the original object remains quite untouched by any external consumers implementing their own Extension Methods for their own internal consumption; there’s nothing about such Extension Methods that prevent the developer of the original object from continuing to be in full control of their object’s design (though there is certainly an impetus on the developer of any Extension Methods to consider the possibility of unexpected behaviour should any object they have extended subsequently have its design changed). &lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;color: black; font-size: 13pt;&quot;&gt;The encapsulation issue aside, as the historical example of the introduction of LINQ demonstrates, there are certain discrete circumstances when it can be very useful to be able to extend the existing definition of an established object, in a way that avoids creating breaking changes for existing consumers of the original object, but that still provides new functionality for new consumers of same. Where Extension Methods are most useful, therefore, is when you are reasonably sure that the object you’re extending wont be subject to further internal change, and the functionality you are adding is specifically useful within the context in which you are adding it.&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/5467435184219817408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818882524515880477/posts/default/5467435184219817408'/><link rel='alternate' type='text/html' href='http://rachelpierson.blogspot.com/2010/07/extension-methods_21.html' title='Extension Methods'/><author><name>Rachel Pierson</name><uri>http://www.blogger.com/profile/04465488103258388739</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3iF4sRuRlungerp7LwTu33I_jX2-sKLGbArJQMTkpbQJA5qEqqOOuHZgskHY0sXJVEd6bjYXRjcJgBqyI86BXmDyIDhgFBHnNtvzl00YqjUdF6mFXLNyIiDrde9DcNA/s220/RP7.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1EKsT5B35uhSywX24W8pZ3lbZiOK8ZenXEVhxpkbQyP_Ax_fBs66t5zvUrv4Pi5FtM7_HwaRNJcicyJkOOZXOwP7q8hq1WcKvMQBk4G6e9zKjXbWeUr6NSRkh7dnJn8tML4XfI4mWFf5q/s72-c/RPP%2520Extension%2520Methods%2520003.gif" height="72" width="72"/></entry></feed>