<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;A0EHSHw9fyp7ImA9WhRQEUg.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763</id><updated>2011-12-06T11:20:39.267+03:00</updated><category term="WSE" /><category term="LINQ" /><category term=".Net 3.5" /><category term="WMI" /><category term="WCF" /><category term="Active Directory" /><category term="DSL" /><category term=".Net Encoding" /><category term=".Net" /><category term="Patterns" /><category term="Fluent Interfaces" /><category term="Unit Tests" /><category term="unity" /><title>Mik's Tech Spec</title><subtitle type="html">Fried thoughts with a little of pepper</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://mik-kardash.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>33</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/MiksTechSpec" /><feedburner:info uri="mikstechspec" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DEMARnYyfSp7ImA9WhdREk0.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763.post-4106235973992052897</id><published>2011-08-01T16:47:00.000+03:00</published><updated>2011-08-01T16:47:27.895+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-01T16:47:27.895+03:00</app:edited><title>Click OK?</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-QkEFiigvgjQ/TjauN6sq7cI/AAAAAAAAAcE/grYR6Lfs1VE/s1600/clickok.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="224" src="http://1.bp.blogspot.com/-QkEFiigvgjQ/TjauN6sq7cI/AAAAAAAAAcE/grYR6Lfs1VE/s400/clickok.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5893592225015490763-4106235973992052897?l=mik-kardash.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/j9rFSQGTIN0KGzQ1dzX2bmkhy9Y/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/j9rFSQGTIN0KGzQ1dzX2bmkhy9Y/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/j9rFSQGTIN0KGzQ1dzX2bmkhy9Y/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/j9rFSQGTIN0KGzQ1dzX2bmkhy9Y/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MiksTechSpec/~4/8adAhVbaydY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/4106235973992052897/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5893592225015490763&amp;postID=4106235973992052897" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/4106235973992052897?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/4106235973992052897?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MiksTechSpec/~3/8adAhVbaydY/click-ok.html" title="Click OK?" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-QkEFiigvgjQ/TjauN6sq7cI/AAAAAAAAAcE/grYR6Lfs1VE/s72-c/clickok.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://mik-kardash.blogspot.com/2011/08/click-ok.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUANR3g9fyp7ImA9WhdSGUs.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763.post-2367338895464730143</id><published>2011-07-29T22:29:00.001+03:00</published><updated>2011-07-29T22:29:56.667+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-29T22:29:56.667+03:00</app:edited><title>The Only Fix I Would Like on the Programmers Keyboard</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-VdirP-2ULjc/TjMKAaxnCyI/AAAAAAAAAcA/CJG2slhCOs8/s1600/keyboard_fix-1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="215" src="http://1.bp.blogspot.com/-VdirP-2ULjc/TjMKAaxnCyI/AAAAAAAAAcA/CJG2slhCOs8/s400/keyboard_fix-1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5893592225015490763-2367338895464730143?l=mik-kardash.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ztuxFC8bisTk-FqlUZB3rKtuWzU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ztuxFC8bisTk-FqlUZB3rKtuWzU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ztuxFC8bisTk-FqlUZB3rKtuWzU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ztuxFC8bisTk-FqlUZB3rKtuWzU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MiksTechSpec/~4/l8irI8KkSO8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/2367338895464730143/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5893592225015490763&amp;postID=2367338895464730143" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/2367338895464730143?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/2367338895464730143?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MiksTechSpec/~3/l8irI8KkSO8/only-fix-i-would-like-on-programmers.html" title="The Only Fix I Would Like on the Programmers Keyboard" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-VdirP-2ULjc/TjMKAaxnCyI/AAAAAAAAAcA/CJG2slhCOs8/s72-c/keyboard_fix-1.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://mik-kardash.blogspot.com/2011/07/only-fix-i-would-like-on-programmers.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08FQn88fip7ImA9WhdSGUs.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763.post-1312027147472499589</id><published>2011-07-29T21:56:00.001+03:00</published><updated>2011-07-29T21:56:53.176+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-29T21:56:53.176+03:00</app:edited><title>Quiz: How to align "=" symbols?</title><content type="html">This is kind of a question that was sitting in my head for a while. Suppose you have this:&lt;br /&gt;
&lt;br /&gt;
I  too good.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;int i = 29;
var myString = "somestring";
object context = new Context();
&lt;/pre&gt;&lt;br /&gt;
I would really like to see something like this:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;... = 29;
... = "somestring";
... = new Context();
&lt;/pre&gt;&lt;br /&gt;
Of course, you can use some&amp;nbsp;&lt;a href="http://mik-kardash.blogspot.com/2011/03/vs2010-trick-alignment-of-symbol.html"&gt;boring&amp;nbsp;tool&lt;/a&gt; for this. But we have a winner, and it is so great so I decided to share it with you, my dear reader.&lt;br /&gt;
&lt;br /&gt;
The following example describes completely winner's approach:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;int _iiiiiiiii = 29;
var _myStrngSt = "somestring";
object context = new Context();
&lt;/pre&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_dcdi--LdAeQ/Sa1sWd8j4pI/AAAAAAAAEBg/BGX_vc32JHc/s400/wtf.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="371" src="http://4.bp.blogspot.com/_dcdi--LdAeQ/Sa1sWd8j4pI/AAAAAAAAEBg/BGX_vc32JHc/s400/wtf.jpg" width="300" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5893592225015490763-1312027147472499589?l=mik-kardash.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4HznLfaMpOQ0it-JmohanB6nUZE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4HznLfaMpOQ0it-JmohanB6nUZE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4HznLfaMpOQ0it-JmohanB6nUZE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4HznLfaMpOQ0it-JmohanB6nUZE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MiksTechSpec/~4/CqN19iBIWMg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/1312027147472499589/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5893592225015490763&amp;postID=1312027147472499589" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/1312027147472499589?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/1312027147472499589?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MiksTechSpec/~3/CqN19iBIWMg/quiz-how-to-align-symbols.html" title="Quiz: How to align &quot;=&quot; symbols?" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_dcdi--LdAeQ/Sa1sWd8j4pI/AAAAAAAAEBg/BGX_vc32JHc/s72-c/wtf.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://mik-kardash.blogspot.com/2011/07/quiz-how-to-align-symbols.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EDQXw8eCp7ImA9WhdSF0o.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763.post-5274750806951413888</id><published>2011-07-27T17:07:00.000+03:00</published><updated>2011-07-27T17:07:50.270+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-27T17:07:50.270+03:00</app:edited><title>Skype - You know you are wrong!</title><content type="html">Today it gave me this error: "Can't open Skype. You are already signed in on this computer. Please sign out and try again.".&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-SAvya3DcmZI/TjAbQSNby3I/AAAAAAAAAbw/aOGCzZot0qA/s1600/skype_is_wrong.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="326" src="http://3.bp.blogspot.com/-SAvya3DcmZI/TjAbQSNby3I/AAAAAAAAAbw/aOGCzZot0qA/s400/skype_is_wrong.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
It knows it is wrong. I know it is wrong. How did that appear in this mature product?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5893592225015490763-5274750806951413888?l=mik-kardash.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/D2oFOh3RETB7cp9_0N0nCe9uozk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/D2oFOh3RETB7cp9_0N0nCe9uozk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/D2oFOh3RETB7cp9_0N0nCe9uozk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/D2oFOh3RETB7cp9_0N0nCe9uozk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MiksTechSpec/~4/Uw6DHD4rlMU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/5274750806951413888/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5893592225015490763&amp;postID=5274750806951413888" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/5274750806951413888?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/5274750806951413888?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MiksTechSpec/~3/Uw6DHD4rlMU/skype-you-know-you-are-wrong.html" title="Skype - You know you are wrong!" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-SAvya3DcmZI/TjAbQSNby3I/AAAAAAAAAbw/aOGCzZot0qA/s72-c/skype_is_wrong.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://mik-kardash.blogspot.com/2011/07/skype-you-know-you-are-wrong.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUECR3wyeyp7ImA9WhdSEE0.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763.post-2696796963097793175</id><published>2011-07-18T19:42:00.001+03:00</published><updated>2011-07-18T19:47:46.293+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-18T19:47:46.293+03:00</app:edited><title>RegExr: A Tool That Saved My Day</title><content type="html">I am am obviously not a pro in regular expressions. However, I would like to write bug-free (to some extent) regular expressions fast. &lt;br /&gt;
&lt;br /&gt;
I found this tool: http://gskinner.com/RegExr/&lt;br /&gt;
&lt;br /&gt;
It has two advantages for me:&lt;br /&gt;
1. No need to install&lt;br /&gt;
2. Shows whether regular expression works immediately&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-bu9ppsPnGdw/TiRiDl0jE_I/AAAAAAAAAbo/YJ480sgf8lc/s1600/regexr.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="436" src="http://4.bp.blogspot.com/-bu9ppsPnGdw/TiRiDl0jE_I/AAAAAAAAAbo/YJ480sgf8lc/s640/regexr.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
PS: I am not familiar with any other similar tools but I like this one for sure :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5893592225015490763-2696796963097793175?l=mik-kardash.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FtjhK2LgNAru2v7n0RPyEMSpzuQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FtjhK2LgNAru2v7n0RPyEMSpzuQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FtjhK2LgNAru2v7n0RPyEMSpzuQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FtjhK2LgNAru2v7n0RPyEMSpzuQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MiksTechSpec/~4/VP45CINLwAE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/2696796963097793175/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5893592225015490763&amp;postID=2696796963097793175" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/2696796963097793175?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/2696796963097793175?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MiksTechSpec/~3/VP45CINLwAE/regexr-tool-that-saved-my-day.html" title="RegExr: A Tool That Saved My Day" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-bu9ppsPnGdw/TiRiDl0jE_I/AAAAAAAAAbo/YJ480sgf8lc/s72-c/regexr.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://mik-kardash.blogspot.com/2011/07/regexr-tool-that-saved-my-day.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cFQHwyfSp7ImA9WhZSEEs.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763.post-2474553344737967778</id><published>2011-03-25T16:55:00.001+02:00</published><updated>2011-03-25T16:56:51.295+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-25T16:56:51.295+02:00</app:edited><title>VS2010 Trick: Alignment of "=" symbol</title><content type="html">If you need to align variables and equality symbols as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;var1     = 1;
varvar2  = 2;
varvarr2 = 3;
&lt;/pre&gt;&lt;br /&gt;
Just install VS2010 &lt;a href="http://visualstudiogallery.msdn.microsoft.com/d0d33361-18e2-46c0-8ff2-4adea1e34fef/"&gt;Power Tools&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Here is a short cut to use: CTRL + ]&lt;br /&gt;
&lt;br /&gt;
Have a good day!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5893592225015490763-2474553344737967778?l=mik-kardash.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ln8FRSKdZ8yfBXT2S4Ah73pr8bA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ln8FRSKdZ8yfBXT2S4Ah73pr8bA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ln8FRSKdZ8yfBXT2S4Ah73pr8bA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ln8FRSKdZ8yfBXT2S4Ah73pr8bA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MiksTechSpec/~4/aukYk7-b9Yc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/2474553344737967778/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5893592225015490763&amp;postID=2474553344737967778" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/2474553344737967778?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/2474553344737967778?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MiksTechSpec/~3/aukYk7-b9Yc/vs2010-trick-alignment-of-symbol.html" title="VS2010 Trick: Alignment of &quot;=&quot; symbol" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://mik-kardash.blogspot.com/2011/03/vs2010-trick-alignment-of-symbol.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcNQn86cSp7ImA9Wx9SGEo.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763.post-3330420384287637904</id><published>2010-12-09T06:48:00.000+02:00</published><updated>2010-12-09T06:48:13.119+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-09T06:48:13.119+02:00</app:edited><title>UI Spy Replacement: UI Verify</title><content type="html">Here it is:&amp;nbsp;&lt;a href="http://uiautomationverify.codeplex.com/"&gt;http://uiautomationverify.codeplex.com/&lt;/a&gt;&lt;br /&gt;
So far, I like it very much!&lt;br /&gt;
&lt;br /&gt;
Take care!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5893592225015490763-3330420384287637904?l=mik-kardash.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/16IT1pauLxltudhAWvBhzwKJg9k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/16IT1pauLxltudhAWvBhzwKJg9k/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/16IT1pauLxltudhAWvBhzwKJg9k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/16IT1pauLxltudhAWvBhzwKJg9k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MiksTechSpec/~4/e_-hX8HVVls" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/3330420384287637904/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5893592225015490763&amp;postID=3330420384287637904" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/3330420384287637904?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/3330420384287637904?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MiksTechSpec/~3/e_-hX8HVVls/ui-spy-replacement-ui-verify.html" title="UI Spy Replacement: UI Verify" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://mik-kardash.blogspot.com/2010/12/ui-spy-replacement-ui-verify.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMBSHg_eip7ImA9Wx9SGEs.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763.post-2942985415957162333</id><published>2010-12-09T06:20:00.000+02:00</published><updated>2010-12-09T06:20:59.642+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-09T06:20:59.642+02:00</app:edited><title>WPF: In the search of automation Id for Popup</title><content type="html">In case you are doing WPF development, and for some reason you are using Popup control (primitive), and it has no AutomationId (no matter what!!!) here is a cure:&lt;br /&gt;
&amp;nbsp;-&amp;nbsp;&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/d4ba12c8-7a87-478e-b064-5620f929a0cf/"&gt;How to set AutomationID and Name for Popup&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Happy coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5893592225015490763-2942985415957162333?l=mik-kardash.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BcOSGxpSZjhig6plY0aUKZ6pAQ0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BcOSGxpSZjhig6plY0aUKZ6pAQ0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BcOSGxpSZjhig6plY0aUKZ6pAQ0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BcOSGxpSZjhig6plY0aUKZ6pAQ0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MiksTechSpec/~4/hf8EK-OUoz0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/2942985415957162333/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5893592225015490763&amp;postID=2942985415957162333" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/2942985415957162333?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/2942985415957162333?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MiksTechSpec/~3/hf8EK-OUoz0/wpf-in-search-of-automation-id-for.html" title="WPF: In the search of automation Id for Popup" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://mik-kardash.blogspot.com/2010/12/wpf-in-search-of-automation-id-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0AGSXw6fSp7ImA9Wx9SFUU.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763.post-5997706708631360095</id><published>2010-12-05T23:46:00.002+02:00</published><updated>2010-12-05T23:48:48.215+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-05T23:48:48.215+02:00</app:edited><title>10 Pancakes #3</title><content type="html">Enjoy good links:&lt;br /&gt;
&lt;div&gt;&lt;div&gt;&amp;nbsp;- Best &lt;a href="http://stackoverflow.com/questions/184618/what-is-the-best-comment-in-source-code-you-have-ever-encountered"&gt;code comments&lt;/a&gt; on StackOverflow&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;- &lt;a href="http://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined"&gt;Programmers jargon&lt;/a&gt; (good guidelines) on StackOverflow&lt;/div&gt;&lt;div&gt;&amp;nbsp;- Ultimate dev &lt;a href="http://devcheatsheet.com/"&gt;cheet sheet collection&lt;/a&gt;&amp;nbsp;and &lt;a href="http://john-sheehan.com/blog/net-cheat-sheets/"&gt;more&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;- Book: Software for your head (free &lt;a href="http://www.liveingreatness.com/files/Software-For-Your-Head-book-v1.0.pdf"&gt;PDF&lt;/a&gt;)&lt;/div&gt;&lt;div&gt;&amp;nbsp;- &lt;a href="http://norvig.com/21-days.html"&gt;Teach yourself programming&lt;/a&gt; in ten years&lt;/div&gt;&lt;div&gt;&amp;nbsp;- Go distributed .net with &lt;a href="http://research.microsoft.com/en-us/projects/DryadLINQ/"&gt;Dryad&lt;span id="goog_2009777804"&gt;&lt;/span&gt;&lt;span id="goog_2009777805"&gt;&lt;/span&gt;LINQ&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;- &lt;a href="http://msdn.com/vstudio/async"&gt;Visual Studio CTP&lt;/a&gt; with async pattern (C#5?)&lt;/div&gt;&lt;div&gt;&amp;nbsp;- &lt;a href="http://ayende.com/Blog/archive/2010/08/01/package-management-for-.net-nu.aspx"&gt;Package management&lt;/a&gt; for .net&lt;/div&gt;&lt;div&gt;&amp;nbsp;- &lt;a href="http://go.microsoft.com/fwlink/?LinkId=201727"&gt;Rx Guidelines&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;- &lt;a href="http://skillsmatter.com/"&gt;Skills Matter&lt;/a&gt; - Yes, they are!&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Thanks!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5893592225015490763-5997706708631360095?l=mik-kardash.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8NW5fxTA3zfBDJvXCPza-OY2NWk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8NW5fxTA3zfBDJvXCPza-OY2NWk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8NW5fxTA3zfBDJvXCPza-OY2NWk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8NW5fxTA3zfBDJvXCPza-OY2NWk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MiksTechSpec/~4/rgFY8BrKiSw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/5997706708631360095/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5893592225015490763&amp;postID=5997706708631360095" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/5997706708631360095?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/5997706708631360095?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MiksTechSpec/~3/rgFY8BrKiSw/10-pancakes-3.html" title="10 Pancakes #3" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://mik-kardash.blogspot.com/2010/12/10-pancakes-3.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkINR30zfCp7ImA9Wx9SEEg.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763.post-8272718591782249169</id><published>2010-11-29T21:22:00.002+02:00</published><updated>2010-11-29T21:23:16.384+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-29T21:23:16.384+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="unity" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><title>Unity Interception (AOP)</title><content type="html">Recently, I have been working on adding Unity Interception and found out that it is extremely poorly documented. Here is the list of links one may find useful:&lt;br /&gt;
&amp;nbsp;-&amp;nbsp;&lt;a href="http://visualizationtools.net/default/the-bare-bones-of-unity-interceptions/"&gt;The bare bones of Unity interceptions&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;-&amp;nbsp;&lt;a href="http://codebetter.com/blogs/david.hayden/archive/2009/01/18/unity-interception-and-custom-icallhandler-order-property-and-firing-of-handlers.aspx"&gt;Order Property and Firing of Handlers&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;-&amp;nbsp;&lt;a href="http://ljusberg.se/blogs/smorakning/archive/2009/10/06/unity-interception-performance.aspx"&gt;Unity interception performance&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;-&amp;nbsp;&lt;a href="http://shecht.wordpress.com/2009/12/12/inotifypropertychanged-with-unity-interception-aop/"&gt;INotifyPropertyChanged With Unity Interception AOP&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;-&amp;nbsp;&lt;a href="http://www.aspiringcraftsman.com/2009/03/implementing-inotifyproperychanged-with/"&gt;Implementing INotifyProperyChanged with Unity Interception&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Also, there are always opened questions here:&amp;nbsp;&lt;a href="http://stackoverflow.com/questions/tagged/unity-interception"&gt;unity-interception&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5893592225015490763-8272718591782249169?l=mik-kardash.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/NU2ae1xdaoMw00HJbzcoycLij7Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NU2ae1xdaoMw00HJbzcoycLij7Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/NU2ae1xdaoMw00HJbzcoycLij7Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NU2ae1xdaoMw00HJbzcoycLij7Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MiksTechSpec/~4/AAGhVhfqx1k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/8272718591782249169/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5893592225015490763&amp;postID=8272718591782249169" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/8272718591782249169?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/8272718591782249169?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MiksTechSpec/~3/AAGhVhfqx1k/unity-interception-aop.html" title="Unity Interception (AOP)" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://mik-kardash.blogspot.com/2010/11/unity-interception-aop.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4EQXo9fCp7ImA9Wx5XFE4.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763.post-6844532634173667283</id><published>2010-09-14T05:21:00.000+03:00</published><updated>2010-09-14T05:21:40.464+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-14T05:21:40.464+03:00</app:edited><title>10 Pancakes #2</title><content type="html">This is yet another links list, enjoy.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;- WPF &lt;a href="http://blogs.msdn.com/b/expression/archive/2009/03/23/an-introduction-to-behaviors-triggers-and-actions.aspx"&gt;Triggers, Actions, Behaviors&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;- &lt;a href="http://www.snopes.com/business/consumer/firedrill.asp"&gt;Firedrill&lt;/a&gt; best practices for money saving&lt;br /&gt;
&amp;nbsp;- Patterns for Parallel Programming for .NET 4.0 &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=86b3d32b-ad26-4bb8-a3ae-c1637026c3ee&amp;amp;displaylang=en"&gt;book / guidelines&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;- &lt;a href="http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx"&gt;Code Contracts&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;- &lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Rx Extensions&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;- &lt;a href="http://msdn.microsoft.com/devlabs/ff628422"&gt;Rx for Javascript&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;- Free agile &lt;a href="http://adsdevshop.com/agile/agile-training/"&gt;trainings&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;- In fact, I see none people who do "agile" and familiar with agile &lt;a href="http://www.agilemanifesto.org/"&gt;principles &lt;/a&gt;and &lt;a href="http://www.agilemanifesto.org/principles.html"&gt;manifesto &lt;/a&gt;at the same time. I wonder why...&lt;br /&gt;
&amp;nbsp;- And dynamic languages are driving me crazy these days, I should learn a couple:&lt;br /&gt;
&amp;nbsp;&amp;nbsp; * &lt;a href="http://blog.wekeroad.com/2010/08/09/csharps-new-clothes"&gt;http://blog.wekeroad.com/2010/08/09/csharps-new-clothes&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; * &lt;a href="http://blog.wekeroad.com/2007/08/29/the-c-makeover"&gt;http://blog.wekeroad.com/2007/08/29/the-c-makeover&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5893592225015490763-6844532634173667283?l=mik-kardash.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6liXr8-qAmXzmpg74wlIgdwTIiQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6liXr8-qAmXzmpg74wlIgdwTIiQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6liXr8-qAmXzmpg74wlIgdwTIiQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6liXr8-qAmXzmpg74wlIgdwTIiQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MiksTechSpec/~4/dI8QGrXJSbI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/6844532634173667283/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5893592225015490763&amp;postID=6844532634173667283" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/6844532634173667283?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/6844532634173667283?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MiksTechSpec/~3/dI8QGrXJSbI/10-pancakes-2.html" title="10 Pancakes #2" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://mik-kardash.blogspot.com/2010/09/10-pancakes-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MGRnsycCp7ImA9Wx9UE00.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763.post-5910240238378600518</id><published>2010-08-25T20:45:00.003+03:00</published><updated>2011-02-10T04:37:07.598+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-10T04:37:07.598+02:00</app:edited><title>Why I love RhinoMocks?</title><content type="html">Well, to begin with I really do :)&lt;br /&gt;
&lt;br /&gt;
Anyway, currently I am involved in several projects&amp;nbsp;simultaneously. And it turned out that each project has it's own 3-rd party libraries and tools. Well, one has RhinoMocks and the other has Moq.&amp;nbsp;I do not mind learning new things so I thought why not to try Moq.&lt;br /&gt;
&lt;br /&gt;
Everything went well (without documentation reading) until I decided to create a mock of the сlass with "virtual" method. The test was simply to check whether the method gets called. I wrote the test and it failed. Well, I added good code - failed again. Went through the debug - failed anyway :) What could go wrong?&lt;br /&gt;
&lt;br /&gt;
Here is my class I had to mock:&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;    public class MyViewModel : ViewModelBase    
    {
        public MyViewModel(IEventAggregator events)
        {
            this.eventAggregator = events;
            this.SubscribeToEvents();
        }

        // ... Lot's of other code.

        public virtual void VerifyCurrentView()
        {
            // Smart things here
        }
    }
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
The class subscribes to certain events from event aggregator and tries to call&amp;nbsp;VerifyCurrentView method after events are handled.&lt;br /&gt;
&lt;br /&gt;
So, how would you check whether the&amp;nbsp;VerifyCurrentView method&amp;nbsp;code actually gets called?&lt;br /&gt;
Never mind, here is how I thought I could do this:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="font-size: small;"&gt;var vm = new Mock&amp;lt; MyViewModel &amp;gt;(events);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Guess what? The constructor never gets called in this case :( I spent an hour trying to figure this out - no luck.&lt;br /&gt;
&lt;br /&gt;
Consequently, the following test (mock) does not work:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;[Test]
    public void My_test_Moq_version()
    {
        var events = new EventAggregator();
        var vm = new Mock&lt; MyViewModel &gt;(events);


        vm.Setup(m =&gt; m.VerifyCurrentView());


        // Act
        events.GetEvent&lt; AlertHistoryLoadedEvent &gt;()
            .Publish(new HistoryTypeInfo[0]);


        vm.VerifyAll();
    }
&lt;/pre&gt;&lt;br /&gt;
And I had no idea why it was happening and neither a desire to know "the truth". I spent another 5 minutes to write the same with RhinoMocks:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;[Test]
        public void My_test()
        {
            var events = new EventAggregator();
            var vm = MockRepository.GenerateMock&lt;myviewmodel&gt;(events);


            // Act
            events.GetEvent&lt;alerthistoryloadedevent&gt;()
                  .Publish(new HistoryTypeInfo[0]);


            vm.AssertWasCalled(c =&gt; c.VerifyCurrentView());
        }
&lt;/pre&gt;&lt;br /&gt;
And it works! Just like that.&lt;br /&gt;
RhinoMocks just rocks!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5893592225015490763-5910240238378600518?l=mik-kardash.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CWCymWmWoh78qGvr0DSMOa9iOWw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CWCymWmWoh78qGvr0DSMOa9iOWw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CWCymWmWoh78qGvr0DSMOa9iOWw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CWCymWmWoh78qGvr0DSMOa9iOWw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MiksTechSpec/~4/IhY-1LTscAA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/5910240238378600518/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5893592225015490763&amp;postID=5910240238378600518" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/5910240238378600518?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/5910240238378600518?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MiksTechSpec/~3/IhY-1LTscAA/why-i-love-rhinomocks.html" title="Why I love RhinoMocks?" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://mik-kardash.blogspot.com/2010/08/why-i-love-rhinomocks.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08MSHc9eSp7ImA9Wx5RF0k.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763.post-4537053832989888055</id><published>2010-08-25T18:24:00.000+03:00</published><updated>2010-08-25T18:24:49.961+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-25T18:24:49.961+03:00</app:edited><title>10 Pancakes #1</title><content type="html">It has been a while since my last post. I think I will be posing more in the future, we will see :)&lt;br /&gt;
&lt;br /&gt;
Anyway, today I would like to start a new ideas that I tried to put off too long time for now. You see,&amp;nbsp;I find too much of interesting stuff every day and I cannot simply throw it to everybody via IM and e-mails.&lt;br /&gt;
&lt;br /&gt;
Starting this week I will be posting links I went through and think would be&amp;nbsp;beneficial&amp;nbsp;to my friends, colleagues and other good people.&lt;br /&gt;
&lt;br /&gt;
So, here is the first 10 links:&lt;br /&gt;
&amp;nbsp;- Scrum check-list 2010 &lt;a href="http://www.infoq.com/minibooks/scrum-checklists"&gt;free e-book&lt;/a&gt;:&lt;br /&gt;
&amp;nbsp;- New Uncle Bob Martin blog - &lt;a href="http://thecleancoder.blogspot.com/"&gt;the clean coder&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;- Scott Hanselman over &lt;a href="http://www.hanselman.com/blog/OredevKeynoteInformationOverloadAndManagingTheFlowEffectivenessAndEfficiency.aspx"&gt;Effectiveness and Efficiency&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;- SICP &lt;a href="http://mitpress.mit.edu/sicp/full-text/book/book.html"&gt;Book&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;- Pro HTML5 book excerpt - &lt;a href="http://www.infoq.com/resource/articles/pro-html5-programming/en/resources/prohtml5excerpt.pdf"&gt;Chapter 6&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;- New Embedded DB for .Net - &lt;a href="http://effiproz.com/"&gt;EffiProz&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;- &lt;a href="http://www.codeplex.com/ManagedEsent"&gt;Managed Esent DB for .Net&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;- &lt;a href="http://www.ravendb.net/"&gt;RavenDb&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;- The&amp;nbsp;&lt;a href="http://blogs.msdn.com/b/laurionb"&gt;blog &lt;/a&gt;of Managed Esent author&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5893592225015490763-4537053832989888055?l=mik-kardash.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/76KPfisZ4CPvzL8IeHLN_TncFXI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/76KPfisZ4CPvzL8IeHLN_TncFXI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/76KPfisZ4CPvzL8IeHLN_TncFXI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/76KPfisZ4CPvzL8IeHLN_TncFXI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MiksTechSpec/~4/U1CC_-VGwFI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/4537053832989888055/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5893592225015490763&amp;postID=4537053832989888055" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/4537053832989888055?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/4537053832989888055?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MiksTechSpec/~3/U1CC_-VGwFI/10-pancakes-1.html" title="10 Pancakes #1" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://mik-kardash.blogspot.com/2010/08/10-pancakes-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIMSH4yfip7ImA9WxFQFEQ.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763.post-2221868775495631152</id><published>2010-05-10T15:13:00.000+03:00</published><updated>2010-05-10T15:13:09.096+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-10T15:13:09.096+03:00</app:edited><title>What's wrong with this screen?</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_ELIpSMvz05A/S-f4MszsSLI/AAAAAAAAAQI/KwQdcDP1oVw/s1600/directx.bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_ELIpSMvz05A/S-f4MszsSLI/AAAAAAAAAQI/KwQdcDP1oVw/s320/directx.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5893592225015490763-2221868775495631152?l=mik-kardash.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VZSCDyxzC9zom38NDxiMZjfr5RE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VZSCDyxzC9zom38NDxiMZjfr5RE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VZSCDyxzC9zom38NDxiMZjfr5RE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VZSCDyxzC9zom38NDxiMZjfr5RE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MiksTechSpec/~4/cxaEdbKN6iQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/2221868775495631152/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5893592225015490763&amp;postID=2221868775495631152" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/2221868775495631152?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/2221868775495631152?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MiksTechSpec/~3/cxaEdbKN6iQ/whats-wrong-with-this-screen.html" title="What's wrong with this screen?" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_ELIpSMvz05A/S-f4MszsSLI/AAAAAAAAAQI/KwQdcDP1oVw/s72-c/directx.bmp" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://mik-kardash.blogspot.com/2010/05/whats-wrong-with-this-screen.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8CQno_fyp7ImA9WxFQEkw.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763.post-7052984994801134847</id><published>2010-05-07T09:47:00.000+03:00</published><updated>2010-05-07T09:47:43.447+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-07T09:47:43.447+03:00</app:edited><title>Power Tools for Visual Studio 2010</title><content type="html">Microsoft has gathered all power tools together on one site. Great!&lt;br /&gt;
So, whenever you need one of those go there to get it:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;http://msdn.microsoft.com/en-us/vstudio/bb980963.aspx&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
Have fun with it!&lt;br /&gt;
&lt;br /&gt;
PS: Until Rob Conery will create a better &lt;a href="http://blog.wekeroad.com/2010/05/04/do-androids-dream-of-vim"&gt;&lt;b&gt;tool just for you&lt;/b&gt;&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5893592225015490763-7052984994801134847?l=mik-kardash.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/AP47ULJgEEmnRsxHW1-LEVKA2uc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AP47ULJgEEmnRsxHW1-LEVKA2uc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/AP47ULJgEEmnRsxHW1-LEVKA2uc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AP47ULJgEEmnRsxHW1-LEVKA2uc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MiksTechSpec/~4/fmU_GnVkQNc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/7052984994801134847/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5893592225015490763&amp;postID=7052984994801134847" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/7052984994801134847?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/7052984994801134847?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MiksTechSpec/~3/fmU_GnVkQNc/power-tools-for-visual-studio-2010.html" title="Power Tools for Visual Studio 2010" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://mik-kardash.blogspot.com/2010/05/power-tools-for-visual-studio-2010.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MGSXo9cCp7ImA9WxFRE0U.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763.post-8172702441146348791</id><published>2010-04-27T20:30:00.001+03:00</published><updated>2010-04-27T20:30:28.468+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-27T20:30:28.468+03:00</app:edited><title>VSTS 2010: CodeContracts Issue</title><content type="html">If you are unable to create any projects in Visual Studio 2010 after installing the "latest" CodeContracts build then the following link might help you to solve it pretty fast:&lt;br /&gt;
&amp;nbsp;- &lt;a href="http://social.msdn.microsoft.com/Forums/en/codecontracts/thread/5cb13a3e-811c-45f9-b7a8-09c39979acd6"&gt;http://social.msdn.microsoft.com/Forums/en/codecontracts/thread/5cb13a3e-811c-45f9-b7a8-09c39979acd6&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5893592225015490763-8172702441146348791?l=mik-kardash.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/d8RJNqQ1-augKUbzgrkZr0XN23o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/d8RJNqQ1-augKUbzgrkZr0XN23o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/d8RJNqQ1-augKUbzgrkZr0XN23o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/d8RJNqQ1-augKUbzgrkZr0XN23o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MiksTechSpec/~4/w4oeahYC5yI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/8172702441146348791/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5893592225015490763&amp;postID=8172702441146348791" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/8172702441146348791?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/8172702441146348791?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MiksTechSpec/~3/w4oeahYC5yI/vsts-2010-codecontracts-issue.html" title="VSTS 2010: CodeContracts Issue" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://mik-kardash.blogspot.com/2010/04/vsts-2010-codecontracts-issue.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUECSHwyfSp7ImA9WxBUF04.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763.post-578507451149420121</id><published>2010-03-04T22:14:00.000+02:00</published><updated>2010-03-04T22:14:29.295+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-04T22:14:29.295+02:00</app:edited><title>Job Invitation Dear</title><content type="html">Hey! What you feel being invited to work for someone in the following way?&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;"We have a high growth of demand for &lt;technology&gt; development. A lot of projects are using this technology now. Much more are coming. You have a chance to join the newly formed expertise excellence department that will incorporate the technology experience in it. If you are keen of this technology it is the high time to jump in and take part in tremendous growth of expertise"&lt;/technology&gt;&lt;/blockquote&gt;&lt;br /&gt;
Do you feel excited? &lt;br /&gt;
Do you feel challenged?&lt;br /&gt;
Do you see opportunities? &lt;br /&gt;
Me? No, I do not! Do you know why?&lt;br /&gt;
&lt;br /&gt;
Well, the famous &lt;a href="http://www.joelonsoftware.com/AboutMe.html"&gt;Joel Spolsky&lt;/a&gt; said about it a lot already. You see, there should be something in the job post. There should be something in the employer, you know? I do not mean that everyone should strive for uniqueness, but trust me - if your company is able to interest someone to work for them only by using the job invitation then they probably can hire anyone to work with you.&lt;br /&gt;
&lt;br /&gt;
Remember the quote in the beginning? How about this one?&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;"We have a high growth of demand for &lt;technology&gt; development &lt;b&gt;[in the universe]&lt;/b&gt;. A lot of projects are using this technology now &lt;b&gt;[in the universe]&lt;/b&gt;. Much more are coming &lt;b&gt;[guess where to? to the universe]&lt;/b&gt;. You have a chance to join the newly formed expertise excellence department &lt;b&gt;[in the universe]&lt;/b&gt; that will incorporate the technology experience in it. If you are keen of this technology it is the high time to jump in and take part in tremendous growth of expertise &lt;b&gt;[in the universe]&lt;/b&gt;"&lt;/technology&gt;&lt;/blockquote&gt;&lt;br /&gt;
Does it sound somehow differently? You see, nothing has changed since I added the company name (the universe). The context did not change. The meaning left the same. There should be a difference. It just should be. If it does not, you lose. Because this is just the name, the name of your company is the only thing that makes your company different. This is it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5893592225015490763-578507451149420121?l=mik-kardash.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/I2Oeio6hMs722qhlVtMPN6u3egA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/I2Oeio6hMs722qhlVtMPN6u3egA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/I2Oeio6hMs722qhlVtMPN6u3egA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/I2Oeio6hMs722qhlVtMPN6u3egA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MiksTechSpec/~4/IyisjuW55FQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/578507451149420121/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5893592225015490763&amp;postID=578507451149420121" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/578507451149420121?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/578507451149420121?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MiksTechSpec/~3/IyisjuW55FQ/job-invitation-dear.html" title="Job Invitation Dear" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://mik-kardash.blogspot.com/2010/03/job-invitation-dear.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcDRXo7fCp7ImA9WxBVGUk.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763.post-5857577993818000912</id><published>2010-01-24T18:03:00.007+02:00</published><updated>2010-02-23T20:01:14.404+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-23T20:01:14.404+02:00</app:edited><title>User Interface Design and Architecture</title><content type="html">&lt;div&gt;Not so long ago I started to deep into UI design and architecture, the process, tools, best practices and so on. The reason was simple, as soon as I started figuring out how to do great software I quickly found that the software should do the "right thing". And by doing the "right thing" it should show this thing, make it available for the end user, make him or her understand how it works without reading the specs or how-to material, do the thing, explain all steps, errors, warnings, show the result and finally the software should have a super cool and flashy look.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Well, as I started to look into details of what I was thinking about the more and more materials I started to find. Here, on this page I will try to gather the materials I, for some reason, found useful. And I do this for a very simple reason, not to find it again, because... you know, sometimes it is extremely hard to find good stuff even with Google.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;b&gt;Videos&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://37signals.com/svn/posts/1952-i-gave-a-talk-on-ui-fundamentals-for-programmers"&gt;UI Fundamentals for Programmers by Ryan Singer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ux.artu.tv/?p=121"&gt;UI Design for Developers by Total Training (Expression Blend btw)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;b&gt;Books&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/0321525655/103-6148611-3957463?ie=UTF8&amp;amp;tag=garrreynoldsc-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=0321525655"&gt;Presentation Zen&lt;/a&gt; and the book's web site (&lt;a href="http://www.presentationzen.com/"&gt;www.presentationzen.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;"The Inmates Are Running the Asylum" by Alice Cooper&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;b&gt;Articles&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Colors (&lt;a href="http://www.smashingmagazine.com/2010/01/28/color-theory-for-designers-part-1-the-meaning-of-color/"&gt;Part 1&lt;/a&gt;, &lt;a href="http://www.smashingmagazine.com/2010/02/02/color-theory-for-designers-part-2-understanding-concepts-and-terminology/"&gt;Part 2&lt;/a&gt;, Part 3)&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;b&gt;Tools&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Extremely useful tools will be referenced here.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;And of course, I am very thankful for your feedback and help! Thank you very much!&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;&lt;b&gt;Update&lt;/b&gt;: 04/10 - Added "color" articles' links&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5893592225015490763-5857577993818000912?l=mik-kardash.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/nSE3w-3Dc0d--stpVxs2FG-WW28/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nSE3w-3Dc0d--stpVxs2FG-WW28/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/nSE3w-3Dc0d--stpVxs2FG-WW28/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nSE3w-3Dc0d--stpVxs2FG-WW28/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MiksTechSpec/~4/6nC3y1aYueQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/5857577993818000912/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5893592225015490763&amp;postID=5857577993818000912" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/5857577993818000912?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/5857577993818000912?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MiksTechSpec/~3/6nC3y1aYueQ/user-interface-design-and-architecture.html" title="User Interface Design and Architecture" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://mik-kardash.blogspot.com/2010/01/user-interface-design-and-architecture.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UASXo_cCp7ImA9WxNTF0Q.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763.post-5746031777001925068</id><published>2009-08-20T22:20:00.002+03:00</published><updated>2009-08-20T23:14:08.448+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-20T23:14:08.448+03:00</app:edited><title>Test more, document less</title><content type="html">Today, one guy from my test team said that the documentation is not very important for him. The thing is that used to write very extensive documentation. Lot's of details were covered. A lot of knowledge were put into one document - one for each requirement.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Unfortunately, as people start working, the different aspects of a requirement will likely to change - the user interface, the data bounds, important functionality gets added, redundant things gets removed or redone. Anyways, something changes. All these changes are being tracked by people during the work process, on the communication level - as it is the most efficient way to share things. But the documentation remains intact, and the problem is - it gets old, retired, and then I simply delete it or reqrite anew one.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, the process of getting a very good document is pretty complicated, and boring.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On the other hand, the documentation is an important artifact on the project. As it has information right about the thing it describes. So it helps people work - they know how to do their job from the documenation.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I may be reaching out from the point I started. They guy said he does not need the documents any more. What's changed?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The thing is that we introduced a scrum-like two-week iterations some time ago. But there was a problem. As soon as we released a build, let's say three days before the release - we had plenty of problems right away. As a result, a number of iterations were blown up, the date were shifted to the future, customers put on hold, etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Therefore, we dicided to perform a two-phase testing. The first phase, it when the feature gets implemented - the build is being moved to the development (!) server where tester can look at it, study it, suggest (!) improvements or report bugs. The second one, when the build if ninaly gets released with all features planned for the iteration. This time we do integration testing (?) and verify that everything is performing correctly.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The outcome is amazing:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt; testers study functionality by using it, not making guesses from documentation&lt;/li&gt;&lt;li&gt; we reduce risks failing the deadlines by performing additional verification&lt;/li&gt;&lt;li&gt; we reduce risks of deployment failures, as we do it more often&lt;/li&gt;&lt;li&gt; testing takes the same time as it would take it we did regular "develop, then verify" process&lt;/li&gt;&lt;li&gt; now we can think how we can make our documentation more efficient, so it would not go on retirement&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5893592225015490763-5746031777001925068?l=mik-kardash.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QS1TkKjVg7plKvelxMmODNPBbAQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QS1TkKjVg7plKvelxMmODNPBbAQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QS1TkKjVg7plKvelxMmODNPBbAQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QS1TkKjVg7plKvelxMmODNPBbAQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MiksTechSpec/~4/SHhodOFkWT8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/5746031777001925068/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5893592225015490763&amp;postID=5746031777001925068" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/5746031777001925068?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/5746031777001925068?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MiksTechSpec/~3/SHhodOFkWT8/test-more-document-less.html" title="Test more, document less" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://mik-kardash.blogspot.com/2009/08/test-more-document-less.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4DQng7eCp7ImA9WxNTF0w.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763.post-9120345892746884839</id><published>2009-08-19T23:09:00.002+03:00</published><updated>2009-08-19T23:32:53.600+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-19T23:32:53.600+03:00</app:edited><title>Open Source and Commercial Software</title><content type="html">Many people would like to use open source frameworks and tools, however, for a certain reason they choose something they can call commercial software and pay money the same quality product.&lt;br /&gt;&lt;br /&gt;One of the "benefits" of commercial products sounds similar to the following:&lt;div&gt;&lt;blockquote&gt;commercial product has support so I know whom to contact when I will be trouble (be sure you will %99), while open source has no support&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;OK, while this may be true think of the followin please: do you compare equal products. I can think of both products as equal when I have commercial product on one side and open source product with active development on the other. Assuming open source is in active development I can conclude it has the very support we did not saw earlier, hasn't it?&lt;br /&gt;&lt;br /&gt;The other argument, again:&lt;br /&gt;&lt;blockquote&gt;commercial product has support that can promise me a deadline...&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Yeah, guys, do you really think that something is different with planning in open source software? I guess not. The planning is done as we usually do for our projects. Same ideas applies to the mighty commercial software we tend to buy instead of using the one that is useful and at no cost.&lt;br /&gt;&lt;br /&gt;Anyway, it is your choice. Just &lt;span style="font-weight:bold;"&gt;think of it&lt;/span&gt;, please.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5893592225015490763-9120345892746884839?l=mik-kardash.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vSn3etugBVY0I21S1P2zCgwa5MQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vSn3etugBVY0I21S1P2zCgwa5MQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vSn3etugBVY0I21S1P2zCgwa5MQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vSn3etugBVY0I21S1P2zCgwa5MQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MiksTechSpec/~4/spUfjuUEjPY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/9120345892746884839/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5893592225015490763&amp;postID=9120345892746884839" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/9120345892746884839?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/9120345892746884839?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MiksTechSpec/~3/spUfjuUEjPY/open-source-and-commercial-software.html" title="Open Source and Commercial Software" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://mik-kardash.blogspot.com/2009/08/open-source-and-commercial-software.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUUERXs-eCp7ImA9WxRaEk0.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763.post-8952396059769433382</id><published>2008-11-13T10:53:00.002+02:00</published><updated>2008-12-14T00:26:44.550+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-14T00:26:44.550+02:00</app:edited><title>Double Dispatch Principle or the "Shit Hits the Fun"</title><content type="html">&lt;span xmlns="xmlns"&gt;   &lt;p&gt;The other day I was thinking about &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc546578.aspx" target="_blank"&gt;Double Dispatch Principle&lt;/a&gt; and it's benefits and came up with the following code sample:&lt;/p&gt;    &lt;pre class="c#" name="code"&gt;public class Air&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class Fun&lt;br /&gt;{&lt;br /&gt;   public void Run(Air air)&lt;br /&gt;   { }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class Sheet : Air&lt;br /&gt;{&lt;br /&gt;   public void Hit(Fun theFun)&lt;br /&gt;   {&lt;br /&gt;       theFun.Run(this);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class Program&lt;br /&gt;{&lt;br /&gt;   public void Process()&lt;br /&gt;   {&lt;br /&gt;       var theFun = new Fun();&lt;br /&gt;       new Sheet().Hit(theFun);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5893592225015490763-8952396059769433382?l=mik-kardash.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zvD9Qw6L0c33zVRisYug_6r-JGU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zvD9Qw6L0c33zVRisYug_6r-JGU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zvD9Qw6L0c33zVRisYug_6r-JGU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zvD9Qw6L0c33zVRisYug_6r-JGU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MiksTechSpec/~4/J6gpQOcsCyk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/8952396059769433382/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5893592225015490763&amp;postID=8952396059769433382" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/8952396059769433382?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/8952396059769433382?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MiksTechSpec/~3/J6gpQOcsCyk/double-dispatch-principle-or-hits-fun.html" title="Double Dispatch Principle or the &amp;quot;Shit Hits the Fun&amp;quot;" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://mik-kardash.blogspot.com/2008/11/double-dispatch-principle-or-hits-fun.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QMRn85eSp7ImA9WxRXEE8.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763.post-3828868994139086609</id><published>2008-10-15T00:56:00.001+03:00</published><updated>2008-10-15T00:56:27.121+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-15T00:56:27.121+03:00</app:edited><title>Tricky Path.Combine Thing</title><content type="html">&lt;p&gt;About 10 minutes I needed to understand the problem. Luckily I had tests. It appears, that &lt;strong&gt;Path.Combine&lt;/strong&gt; works funny. Here are a comple of examples:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;If you do Path.Combine(&amp;quot;../Tests/&amp;quot;, &amp;quot;/123.xml&amp;quot;) the result will be &amp;quot;/123.xml&amp;quot;&lt;/li&gt;    &lt;li&gt;If you do Path.Combine(&amp;quot;../Tests/&amp;quot;, &amp;quot;123.xml&amp;quot;) the result will be &amp;quot;../Tests/123.xml&amp;quot;&lt;/li&gt;    &lt;li&gt;Finally, if you do Path.Combine(&amp;quot;../Tests&amp;quot;, &amp;quot;123.xml&amp;quot;) the result will be &amp;quot;../Tests\123.xml&amp;quot;&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Oh, frankly speaking, I would really like to have Path.Combine(&amp;quot;../Tests/&amp;quot;, &amp;quot;/123.xml&amp;quot;)&amp;#160; give me &amp;quot;../Tests/123.xml&amp;quot; or, at least, &amp;quot;../Tests//123.xml&amp;quot; and even &amp;quot;../Tests\123.xml&amp;quot; would be fine.&lt;/p&gt;  &lt;p&gt;For now, I have to remember funny point #1 and will try to do #2 and #3 all along.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5893592225015490763-3828868994139086609?l=mik-kardash.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/97mJ6mZkuM4uoML7TSWqe7mDHxk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/97mJ6mZkuM4uoML7TSWqe7mDHxk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/97mJ6mZkuM4uoML7TSWqe7mDHxk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/97mJ6mZkuM4uoML7TSWqe7mDHxk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MiksTechSpec/~4/EI22ip81Afs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/3828868994139086609/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5893592225015490763&amp;postID=3828868994139086609" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/3828868994139086609?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/3828868994139086609?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MiksTechSpec/~3/EI22ip81Afs/tricky-pathcombine-thing.html" title="Tricky Path.Combine Thing" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://mik-kardash.blogspot.com/2008/10/tricky-pathcombine-thing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08FQnoycSp7ImA9WxRQFE8.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763.post-7450801582908688301</id><published>2008-10-08T02:22:00.001+03:00</published><updated>2008-10-08T02:23:33.499+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-08T02:23:33.499+03:00</app:edited><title>XML in .Net: Frequently Asked Questions</title><content type="html">&lt;p&gt;XML Team started to blog about most difficult things in System.XML. The list of posts below:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://blogs.msdn.com/xmlteam/archive/2008/09/10/frequently-asked-questions-on-xml-in-net-part-1.aspx" target="_blank"&gt;Exceptions About Invalid Literals in XML - FAQ on XML in .Net - Part 1&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/xmlteam/archive/2008/09/10/frequently-asked-questions-on-xml-in-net-part-2.aspx" target="_blank"&gt;Working with XML Fragments - FAQ on XML in .Net - Part 2&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Hope this helps!&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:26cca81c-06d0-4fa8-8ca4-212fcf015750" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/XML" rel="tag"&gt;XML&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5893592225015490763-7450801582908688301?l=mik-kardash.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9t-IQt0DIe9rJwoIPWE1mbsK6E0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9t-IQt0DIe9rJwoIPWE1mbsK6E0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9t-IQt0DIe9rJwoIPWE1mbsK6E0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9t-IQt0DIe9rJwoIPWE1mbsK6E0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MiksTechSpec/~4/abNoFgBj8v8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/7450801582908688301/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5893592225015490763&amp;postID=7450801582908688301" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/7450801582908688301?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/7450801582908688301?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MiksTechSpec/~3/abNoFgBj8v8/xml-in-net-frequently-asked-questions.html" title="XML in .Net: Frequently Asked Questions" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://mik-kardash.blogspot.com/2008/10/xml-in-net-frequently-asked-questions.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cNRH07fCp7ImA9WxRQFE8.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763.post-533077602794323552</id><published>2008-10-08T02:01:00.002+03:00</published><updated>2008-10-08T02:11:35.304+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-08T02:11:35.304+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Unit Tests" /><title>Test Requirements First</title><content type="html">&lt;p&gt;Today I found a post about &lt;a href="http://blogs.msdn.com/bclteam/archive/2008/10/06/the-compare-contract-kim-hamilton.aspx" target="_blank"&gt;The Compare Contract&lt;/a&gt; by BCL Team. In brief, one of the customers complained about the breaking changes made in SP1 compared to RTM version. Actually, the ComparedTo method of the StringWrapper class was changed which affected sorting behavior.&lt;/p&gt;  &lt;p&gt;It appeared that ComparedTo method was implemented incorrectly. Therefore, it was decided to change it. MSDN describes &lt;a href="http://msdn.microsoft.com/en-us/library/43hc6wht.aspx" target="_blank"&gt;several requirements&lt;/a&gt; that must be met by a particular implementation of IComparable&amp;lt;T&amp;gt; interface.&lt;/p&gt;  &lt;p&gt;I see this as a big bonus for any developer implementing &lt;a href="http://msdn.microsoft.com/en-us/library/4d7sx9hd.aspx" target="_blank"&gt;IComparable&amp;lt;T&amp;gt;&lt;/a&gt; interface. Even before starting to implement the method you can write very strict Unit Tests that will help you to implement a method that will satisfy common requirements for any sorting algorithm.&lt;/p&gt;  &lt;p&gt;As you see, you can end up with 5 unit test. If you will use MbUnit, for example, you can employ &lt;a href="http://haacked.com/archive/2004/10/20/row_based_testing.aspx" target="_blank"&gt;Row Tests&lt;/a&gt; to specify more precise requirements for your interface implementation very easy.&lt;/p&gt;  &lt;p&gt;For example I ended up with 15 tests. It took me about 15 minutes. Here they are:&lt;/p&gt;  &lt;div&gt;   &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; CompareToContract.UnitTests&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; MbUnit.Framework;&lt;br /&gt;&lt;br /&gt;    [TestFixture]&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; StringWrapperTests&lt;br /&gt;    {&lt;br /&gt;        [RowTest]&lt;br /&gt;        [Row(&lt;span style="color: #006080"&gt;&amp;quot;&amp;quot;&lt;/span&gt;)]&lt;br /&gt;        [Row(&lt;span style="color: #006080"&gt;&amp;quot;value&amp;quot;&lt;/span&gt;)]&lt;br /&gt;        [Row(&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; CompareTo_SameValue_ShouldReturnZero(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            StringWrapper wrapper = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StringWrapper() { Value = &lt;span style="color: #0000ff"&gt;value&lt;/span&gt; };&lt;br /&gt;            Assert.AreEqual(wrapper.CompareTo(wrapper), 0, &lt;span style="color: #006080"&gt;&amp;quot;A.CompareTo(A) should return 0.&amp;quot;&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [RowTest]&lt;br /&gt;        [Row(&lt;span style="color: #006080"&gt;&amp;quot;&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;&amp;quot;&lt;/span&gt;)]&lt;br /&gt;        [Row(&lt;span style="color: #006080"&gt;&amp;quot;value&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;value&amp;quot;&lt;/span&gt;)]&lt;br /&gt;        [Row(&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; CompareTo_AnotherEqualValue_ShouldReturnZero(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; value1, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; value2)&lt;br /&gt;        {&lt;br /&gt;            StringWrapper a = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StringWrapper() { Value = value1 };&lt;br /&gt;            StringWrapper b = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StringWrapper() { Value = value2 };&lt;br /&gt;&lt;br /&gt;            Assert.AreEqual(a.CompareTo(b), 0, &lt;span style="color: #006080"&gt;&amp;quot;A'value'.ComparedTo(b'value') should return 0.&amp;quot;&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [RowTest]&lt;br /&gt;        [Row(&lt;span style="color: #006080"&gt;&amp;quot;&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;&amp;quot;&lt;/span&gt;)]&lt;br /&gt;        [Row(&lt;span style="color: #006080"&gt;&amp;quot;value&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;value&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;value&amp;quot;&lt;/span&gt;)]&lt;br /&gt;        [Row(&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; CompareTo_AandBandCequal_ShouldReturnZero(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; value1, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; value2, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; value3)&lt;br /&gt;        {&lt;br /&gt;            StringWrapper a = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StringWrapper() { Value = value1 };&lt;br /&gt;            StringWrapper b = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StringWrapper() { Value = value2 };&lt;br /&gt;            StringWrapper c = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StringWrapper() { Value = value3 };&lt;br /&gt;&lt;br /&gt;            Assert.AreEqual(a.CompareTo(b), 0, &lt;span style="color: #006080"&gt;&amp;quot;A'value'.ComparedTo(B'value') should return 0.&amp;quot;&lt;/span&gt;);&lt;br /&gt;            Assert.AreEqual(b.CompareTo(c), 0, &lt;span style="color: #006080"&gt;&amp;quot;B'value'.ComparedTo(C'value') should return 0.&amp;quot;&lt;/span&gt;);&lt;br /&gt;            Assert.AreEqual(a.CompareTo(c), 0, &lt;span style="color: #006080"&gt;&amp;quot;A'value'.ComparedTo(C'value') should return 0.&amp;quot;&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [RowTest]&lt;br /&gt;        [Row(&lt;span style="color: #006080"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;2&amp;quot;&lt;/span&gt;)]&lt;br /&gt;        [Row(&lt;span style="color: #006080"&gt;&amp;quot;value1&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;value2&amp;quot;&lt;/span&gt;)]&lt;br /&gt;        [Row(&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; CompareTo_IfAComparedToBReturnValueThenBComparedToA_ShouldReturnSameValueButDifferentInSign(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; value1, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; value2)&lt;br /&gt;        {&lt;br /&gt;            StringWrapper a = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StringWrapper() { Value = value1 };&lt;br /&gt;            StringWrapper b = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StringWrapper() { Value = value2 };&lt;br /&gt;&lt;br /&gt;            Assert.AreEqual(a.CompareTo(b), -1 * b.CompareTo(a), &lt;span style="color: #006080"&gt;&amp;quot;a.ComparedTo(b) should equal to -1 * b.ComparedTo(a).&amp;quot;&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [RowTest]&lt;br /&gt;        [Row(&lt;span style="color: #006080"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;2&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;3&amp;quot;&lt;/span&gt;)]&lt;br /&gt;        [Row(&lt;span style="color: #006080"&gt;&amp;quot;value3&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;value2&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;value1&amp;quot;&lt;/span&gt;)]&lt;br /&gt;        [Row(&lt;span style="color: #006080"&gt;&amp;quot;value1&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;value2&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;value3&amp;quot;&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; CompareTo_IfAComparedToBReturnsValueWithTheSameSignAsBComparedToCThenACompareToC_ShouldReturnValueWithTheSameSign(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; value1, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; value2, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; value3)&lt;br /&gt;        {&lt;br /&gt;            StringWrapper a = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StringWrapper() { Value = value1 };&lt;br /&gt;            StringWrapper b = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StringWrapper() { Value = value2 };&lt;br /&gt;            StringWrapper c = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StringWrapper() { Value = value3 };&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; abResult = a.CompareTo(b);&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; bcResult = b.CompareTo(c);&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; acResult = a.CompareTo(c);&lt;br /&gt;&lt;br /&gt;            Assert.IsTrue(Math.Sign(abResult) == Math.Sign(bcResult), &lt;span style="color: #006080"&gt;&amp;quot;A.ComparedTo(B) should have the same sign as B.ComparedTo(C).&amp;quot;&lt;/span&gt;);&lt;br /&gt;            Assert.IsTrue(Math.Sign(abResult) == Math.Sign(acResult), &lt;span style="color: #006080"&gt;&amp;quot;A.ComparedTo(C) should have the same sign as A.ComparedTo(B).&amp;quot;&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The old implementation of CompareTo completed with &lt;font color="#008000"&gt;10 succeeded&lt;/font&gt; and &lt;font color="#ff0000"&gt;5 failed&lt;/font&gt; tests. While implementation provided by BCL Team completed with all &lt;font color="#008000"&gt;15 succeeded&lt;/font&gt;. This way I can trust this implementation of CompareTo method.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Test your requirements before you right the code. This will minimize your time and efforts to understand (remember all the time) requirements of implementation and will help you to write the code you need, not the code you can write.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Hope this helps!&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:6b359e99-03a0-41d7-8a14-93571f5c33ce" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Unit%20Tests" rel="tag"&gt;Unit Tests&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MbUnit" rel="tag"&gt;MbUnit&lt;/a&gt;,&lt;a href="http://technorati.com/tags/BCL" rel="tag"&gt;BCL&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5893592225015490763-533077602794323552?l=mik-kardash.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/e6XbORAcYySxFnU7Zdyv0iu6teo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/e6XbORAcYySxFnU7Zdyv0iu6teo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/e6XbORAcYySxFnU7Zdyv0iu6teo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/e6XbORAcYySxFnU7Zdyv0iu6teo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MiksTechSpec/~4/nzzHTcMRZ68" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/533077602794323552/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5893592225015490763&amp;postID=533077602794323552" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/533077602794323552?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/533077602794323552?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MiksTechSpec/~3/nzzHTcMRZ68/test-requirements-first.html" title="Test Requirements First" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://mik-kardash.blogspot.com/2008/10/test-requirements-first.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUHQHg6fSp7ImA9WxdaF0o.&quot;"><id>tag:blogger.com,1999:blog-5893592225015490763.post-5527705203933147987</id><published>2008-08-26T20:02:00.004+03:00</published><updated>2008-08-26T21:10:31.615+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-26T21:10:31.615+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WSE" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><category scheme="http://www.blogger.com/atom/ns#" term="WCF" /><title>WCF+WSE Using Anonymous Certificate Security</title><content type="html">&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Preface.&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;I am not an expert in neither &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;WCF&lt;/span&gt; nor &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;WSE&lt;/span&gt;, however, recently I have been busy implementing &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;WCF&lt;/span&gt; service that could be consumed by &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;WSE&lt;/span&gt; client. And the requirement for this was to use &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_4"&gt;Anonymous&lt;/span&gt; For Certificate &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_5"&gt;Security&lt;/span&gt; protection of messages.&lt;br /&gt;As always I started from Google... However, after spending about 4 to 6 hour I get nothing except examples that was not working.&lt;/p&gt;&lt;p&gt;Therefore, here, I decided to &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_6"&gt;describe&lt;/span&gt; the implementation of, both, service and client.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Anonymous for Certificate Security In a Nutshell.&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;Basically, to protect your messages with certificates you need to do a number of things:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;first of all, you need to have certificate (*.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;cer&lt;/span&gt; file) and private key for it (*.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;pfx&lt;/span&gt; file)&lt;/li&gt;&lt;li&gt;second, you need to install certificate (*.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;cer&lt;/span&gt; file) on a client computer - which will be used to connect to your &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;WCF&lt;/span&gt; service into &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;LocalMachine&lt;/span&gt; certificate store&lt;/li&gt;&lt;li&gt;then, you need to install both certificate (*.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;cer&lt;/span&gt; file) and private key (*.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;pfx&lt;/span&gt;) file on a server where &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;WCF&lt;/span&gt; service will be installed into the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;LocalMachine&lt;/span&gt; certificate store&lt;/li&gt;&lt;li&gt;lastly, on a server where &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;WCF&lt;/span&gt; service will be installed you need to grant an identity, under which &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;WCF&lt;/span&gt; will be running, permissions to access your certificates' private key&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The way Anonymous for Certificate Security mechanisms work is very simple - the same way as Encryption Algorithms with Open Key works. The certificate (*.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;cer&lt;/span&gt; file) will be used by client as public key to sign and encode his requests to the service and decode response from the service. The service, in it's turn, will be using private key (*.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;pfx&lt;/span&gt; file) to encode / decode messages.&lt;/p&gt;&lt;p&gt;In this way, it will be impossible to give client a fake service, because only service has private key. However, anything can be a client of a service as soon as it encodes and decodes messages using public key (*.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;cer&lt;/span&gt; file).&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;WCF&lt;/span&gt; Service Implementation.&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;In order to connect &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;WSE&lt;/span&gt; and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;WCF&lt;/span&gt; could understand each other they need to talk the same security protocol. Therefore, I set message security version of service binding to "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;WSSecurity&lt;/span&gt;11&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;WSTrustFebruary&lt;/span&gt;2005&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;WSSecureConversationFebruary&lt;/span&gt;2005&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;WSSecurityPolicy&lt;/span&gt;11&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;BasicSecurityProfile&lt;/span&gt;10".&lt;/p&gt;&lt;p&gt;Also, made service and client both you &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;MTOM&lt;/span&gt; messaging. Message version should be set to "Soap11&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;WSAddressingAugust&lt;/span&gt;2004" by the reason explained earlier.&lt;/p&gt;&lt;p&gt;Next things you need to do is to configure your service behaviour, of course. This is very simple to do as well. You need to add &lt;servicecredentials&gt;tag to your &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_31"&gt;behavior&lt;/span&gt; configuration. Then, add &lt;clientcertificate&gt;element inside it and &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_32"&gt;insert&lt;/span&gt; into &lt;clientcertificate&gt;element empty &lt;authentication&gt;tag. After that, add &lt;servicecertificate&gt;element inside &lt;servicecredentials&gt;element and configure it to use your certificate.&lt;/p&gt;&lt;p&gt;After this is done, you need to configure your service interface to use message contract and create request and response messages for every method on your service interface. Then implement your service. If something was not configured properly your service will not run.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;WSE&lt;/span&gt; Client Implementation.&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;First of all, you need to create a proxy for you &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;WCF&lt;/span&gt; service. This is very simple to accomplish using &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;wseWsdl&lt;/span&gt;3.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;exe&lt;/span&gt; utility that will be installed along with &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_37"&gt;WSE&lt;/span&gt;3.0 installation package.&lt;/p&gt;&lt;p&gt;After you did that, you need to create a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_38"&gt;WSE&lt;/span&gt; policy to access &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_39"&gt;WCF&lt;/span&gt; service. You can do in configuration file or in code. It does not matter. What you need to do is to configure &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_40"&gt;AnonymousForSecurity&lt;/span&gt; assertion and configure your proxy to use certificate you installed as credentials to access &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_41"&gt;WCF&lt;/span&gt; service.&lt;/p&gt;&lt;p&gt;Do not forget to configure &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_42"&gt;WSE&lt;/span&gt; to use &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_43"&gt;MTOM&lt;/span&gt; messaging as well.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Links&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;There are lots of resources on the web that can give you some food for thought when dealing with peculiarities of this &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_44"&gt;integration&lt;/span&gt; including Microsoft Forums and personal blogs. However, I would recommend to check &lt;a href="http://www.codeplex.com/WCFSecurity"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_45"&gt;WCF&lt;/span&gt; Security &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_46"&gt;Guidance&lt;/span&gt;&lt;/a&gt; on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_47"&gt;CodePlex&lt;/span&gt;. This is the place where you will find a lot of information about &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_48"&gt;WCF&lt;/span&gt; security and How-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_49"&gt;Tos&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;Hope this helps!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5893592225015490763-5527705203933147987?l=mik-kardash.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fna0r_f6uBzmsc7ZfwRKNuYsIxI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fna0r_f6uBzmsc7ZfwRKNuYsIxI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fna0r_f6uBzmsc7ZfwRKNuYsIxI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fna0r_f6uBzmsc7ZfwRKNuYsIxI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MiksTechSpec/~4/DlRnw_G_oqk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://mik-kardash.blogspot.com/feeds/5527705203933147987/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5893592225015490763&amp;postID=5527705203933147987" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/5527705203933147987?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5893592225015490763/posts/default/5527705203933147987?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MiksTechSpec/~3/DlRnw_G_oqk/wcfwse-using-anonymous-certificate.html" title="WCF+WSE Using Anonymous Certificate Security" /><author><name>Mik Kardash</name><uri>http://www.blogger.com/profile/11492621770465256783</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://mik-kardash.blogspot.com/2008/08/wcfwse-using-anonymous-certificate.html</feedburner:origLink></entry></feed>

