<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6425530</id><updated>2012-01-11T16:15:29.200+01:00</updated><category term='improve'/><category term='juval löwy'/><category term='spotify'/><category term='code review code'/><category term='quote'/><category term='insourcing'/><category term='x86'/><category term='puzzle'/><category term='Alt.Net Oresund'/><category term='open source'/><category term='ORA-06553'/><category term='MSTest'/><category term='SOA'/><category term='outsourcing'/><category term='string'/><category term='c#'/><category term='politik'/><category term='color identifiers'/><category term='atdd'/><category term='feedback'/><category term='pirate metrics'/><category term='agile'/><category term='sprog'/><category term='xUnit.Net'/><category term='technical dept'/><category term='software craftsmanship'/><category term='debat'/><category term='deadlines'/><category term='kanban'/><category term='tdd'/><category term='.net'/><category term='code'/><category term='hg'/><category term='bdd'/><category term='review'/><category term='recruitment'/><category term='dansk'/><category term='coders at work'/><category term='x64'/><category term='talent'/><category term='resharper'/><category term='declarative'/><category term='linux'/><category term='NUnit'/><category term='lean'/><category term='linq'/><category term='fired'/><category term='Google Reader'/><category term='renaissance developer'/><category term='group by'/><category term='øredev'/><category term='programming'/><category term='IEnumerable'/><category term='sqlite'/><category term='pl/sql'/><category term='imperative'/><category term='PLS-38'/><category term='extension method'/><category term='ORA-00907'/><category term='immutability'/><category term='fowler'/><category term='book'/><category term='agile skåne'/><category term='oracle'/><category term='JAOO'/><category term='Sharp Tests Ex'/><category term='1337'/><category term='BankInvest'/><category term='WCF'/><category term='food for thougth'/><category term='google code'/><category term='MbUnit'/><category term='code quality'/><category term='project euler'/><category term='log4net'/><category term='unit testing'/><category term='design'/><category term='Conway&apos;s Game of Life'/><category term='readability'/><category term='R#'/><category term='ubuntu'/><category term='code retreat'/><category term='mercurial'/><category term='nhibernate'/><category term='management'/><category term='changeability'/><title type='text'>Martin R-L's Programming Oriented Aspects</title><subtitle type='html'>Random thoughts about every aspect of software development.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>35</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6425530.post-3889394537137896301</id><published>2011-08-22T16:37:00.005+02:00</published><updated>2011-08-24T08:31:01.389+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='color identifiers'/><category scheme='http://www.blogger.com/atom/ns#' term='R#'/><category scheme='http://www.blogger.com/atom/ns#' term='resharper'/><title type='text'>Goodbye _, Hello R# Color Identifiers</title><content type='html'>I've been prefixing my C# class members with _ (underscore) since the first version of C#. I really do like to be able to distinguish between instance and function scope. &lt;br /&gt;&lt;br /&gt;I've also obeyed the larger part of the classic &lt;a href="http://www.idesign.net/idesign/download/IDesign%20CSharp%20Coding%20Standard.zip"&gt;IDesign Coding Standard&lt;/a&gt; for who knows how long.&lt;br /&gt;&lt;br /&gt;Therein, rule #67 states: "Do not use the this reference unless invoking another constructor from within a constructor." Usually, you'll use the same name for your fields and constructor arguments, why a this reference is needed if the fields aren't prefixed.&lt;br /&gt;&lt;br /&gt;While re-reading the great book &lt;a href="http://books.google.com/books/about/Clean_code.html?id=dwSfGQAACAAJ"&gt;Clean Code authored by Uncle Bob&lt;/a&gt; today, I came across the following statement on page 24: "You […] don't need to prefix member variables […] anymore. […] you should be using an editing environment that highlights or colorizes members to make them distinct.".&lt;br /&gt;&lt;br /&gt;The argument appealed to me, but how should I follow that advise? As a C# programmer, you're more or less forced to use Visual Studio. I knew, despite using ReSharper (R#) since its first version, that I've never come across field/member highlightning in the Fonts and Colors section.&lt;br /&gt;&lt;br /&gt;After some googling, I finally found what I was looking for in R#; you need to &lt;a href="http://www.jetbrains.com/resharper/features/coding_assistance.html"&gt;enable Color Identifiers&lt;/a&gt;. Once I'd done that, the "ReSharper Field Identifier" (and more) show up among the display items in the aforementioned Fonts and Colors section.&lt;br /&gt;&lt;br /&gt;Goodbye _, hello color identifiers!&lt;br /&gt;&lt;br /&gt;Now I need to write a refactoring regex that refactors old, prefixed code…&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;UPDATE 2011-08-24: I've now refactored two C# solutions where I got rid of the prefixes by using VS' find and replace with regex and capture groups like so:&lt;br /&gt;find what: private {.*} _{.*}&lt;br /&gt;replace with: private \1 \2&lt;br /&gt;and similar expressions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-3889394537137896301?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/3889394537137896301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2011/08/goodbye-hello-r-color-identifiers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/3889394537137896301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/3889394537137896301'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2011/08/goodbye-hello-r-color-identifiers.html' title='Goodbye _, Hello R# Color Identifiers'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-1817694881664893065</id><published>2011-07-29T15:07:00.001+02:00</published><updated>2011-07-29T15:13:04.096+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google code'/><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><category scheme='http://www.blogger.com/atom/ns#' term='puzzle'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='code review code'/><category scheme='http://www.blogger.com/atom/ns#' term='hg'/><category scheme='http://www.blogger.com/atom/ns#' term='spotify'/><title type='text'>Code Review Wanted: Spotify Tech Puzzles in C#</title><content type='html'>I've recently enjoyed myself during my vacation by solving the Spotify tech puzzles found here: https://www.spotify.com/se/jobs/tech/&lt;br /&gt;&lt;br /&gt;I violated the terms stating that the puzzles should be solved in C, C++, Python or Java by solving them in C#. I was hoping I could get a code review nevertheless. Unfortunately, that won't happen. Conversation between me and the Spotify Judge e-mail bot below (me in Swedish):&lt;br /&gt;&lt;br /&gt;&lt;hr/&gt;to puzzle@spotify.com&lt;br /&gt;subject Pussellösningar&lt;br /&gt;&lt;br /&gt;Hej!&lt;br /&gt;&lt;br /&gt;Jag heter Martin och har under semestern roat mig med att försöka lösa era pussel då det intresserar mig oändligt mycket mer än morgontidningens sudoko och korsord.&lt;br /&gt;&lt;br /&gt;Källkoden finner ni här: http://code.google.com/p/spotify-tech-puzzles-csharp/source/checkout&lt;br /&gt;&lt;br /&gt;Hoppas det är okej med ett Hg repository istället för bifogad kod. Om icke; hojta så bifogar jag filerna i ett mejl.&lt;br /&gt;&lt;br /&gt;Till avdelningen regelbrott vill jag vidare tillägga att jag skrivit pussellösningarna i C# 4, men hoppas att ni kan ha överseende med det. &lt;br /&gt;&lt;br /&gt;Även om Spotify minst sagt är ett drömföretag för en musik- *och* kodälskare som jag, bor jag med familj i Malmö och har ett mycket bra jobb i Köpenhamn. Det är kodgranskningen jag skulle sätta mycket stort värde på och hoppas att det är ömsesidigt.&lt;br /&gt;&lt;br /&gt;Ha en toppendag!&lt;br /&gt;/Martin&lt;br /&gt;&lt;br /&gt;-- &lt;br /&gt;spotify: martinrl&lt;br /&gt;&lt;br /&gt;&lt;hr/&gt;from Spotify Judge puzzle@spotify.com&lt;br /&gt;subject Error processing submission&lt;br /&gt;&lt;br /&gt;Hello Martin Rosén-Lidholm,&lt;br /&gt;&lt;br /&gt;This is an automatic message regarding your submission to the&lt;br /&gt;judge system. Sadly we were unable to process your submission&lt;br /&gt;to our system. The exact error was:&lt;br /&gt;&lt;br /&gt;Submission Error: 'Invalid problem name'&lt;br /&gt;&lt;br /&gt;Please note that we currently accept submissions in Java 1.6, C,&lt;br /&gt;C++ and Python 2.6. The submissions must be attached to the email&lt;br /&gt;and use the well-known file endings for these languages.&lt;br /&gt;&lt;br /&gt;The problem name must be in the subject of the e-mail. We&lt;br /&gt;currently accept submissions on the following problems:&lt;br /&gt;&lt;br /&gt;bestbefore: Best Before&lt;br /&gt;bilateral: Bilateral Projects&lt;br /&gt;different: A Different Problem&lt;br /&gt;lottery: Ticket Lottery&lt;br /&gt;zipfsong: Zipf's Songs&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Use the first name as the subject of your submission.&lt;br /&gt;&lt;br /&gt;Yours truly,&lt;br /&gt;Spotify&lt;br /&gt;&lt;br /&gt;&lt;hr/&gt;Ok, maybe changing the subject will pass the bot's filter?&lt;br /&gt;&lt;br /&gt;&lt;hr/&gt;to puzzle@spotify.com&lt;br /&gt;subject bestbefore&lt;br /&gt;&lt;br /&gt;Hej!&lt;br /&gt;&lt;br /&gt;Nytt försök!&lt;br /&gt;&lt;br /&gt;Hälsar&lt;br /&gt;/Martin&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------- Forwarded message ----------&lt;br /&gt;[old e-mail]&lt;br /&gt;&lt;br /&gt;&lt;hr/&gt;from Spotify Judge puzzle@spotify.com&lt;br /&gt;subject Error processing submission&lt;br /&gt;&lt;br /&gt;Hello Martin Rosén-Lidholm,&lt;br /&gt;&lt;br /&gt;This is an automatic message regarding your submission to the&lt;br /&gt;judge system. Sadly we were unable to process your submission&lt;br /&gt;to our system. The exact error was:&lt;br /&gt;&lt;br /&gt;Submission Error: 'Unable to figure out submission language. Non-standard filename extension?'&lt;br /&gt;&lt;br /&gt;[quoted text]&lt;br /&gt;&lt;br /&gt;&lt;hr/&gt;The reason I tried to solve these problems, instead of continuing with the &lt;a href="http://projecteuler.net/"&gt;Project Euler&lt;/a&gt; problems was that I would like to get a code review from someone competent in order to learn and improve myself as a developer.&lt;br /&gt;&lt;br /&gt;I invest 1+ hour each day of my own time in order to keep up and be a better developer, but I haven't really been a &lt;a href="http://books.google.com/books?id=5wBQEp6ruIAC&amp;lpg=PP1&amp;dq=pragmatic%20programmer&amp;hl=sv&amp;pg=PA14#v=onepage&amp;q=new%20language&amp;f=false"&gt;"learn at least new one language every year"&lt;/a&gt; guy to be honest (and to be even more honest, I think I've forgotten most of my Ruby and F# which were the last two). Maybe I should learn Python and submit a solution? Hmmm...&lt;br /&gt;&lt;br /&gt;I still want a code review on the C# solution anyhow, so I'd highly appreciate any feedback on that one. The Hg repo can be found here: http://code.google.com/p/spotify-tech-puzzles-csharp/source/checkout&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-1817694881664893065?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/1817694881664893065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2011/07/code-review-wanted-spotify-tech-puzzles.html#comment-form' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/1817694881664893065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/1817694881664893065'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2011/07/code-review-wanted-spotify-tech-puzzles.html' title='Code Review Wanted: Spotify Tech Puzzles in C#'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-368259366401910971</id><published>2011-06-28T22:57:00.002+02:00</published><updated>2011-06-28T22:59:22.698+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recruitment'/><category scheme='http://www.blogger.com/atom/ns#' term='1337'/><category scheme='http://www.blogger.com/atom/ns#' term='talent'/><title type='text'>My Take on Recruitment in Three Tweets</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="#" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="74" width="400" src="http://1.bp.blogspot.com/-tgiAYoMxFLA/Tgo_impmwwI/AAAAAAAABMQ/688c2Vojy9k/s400/frans.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://blogs.hbr.org/schrage/2011/06/why-zuckerberg-is-almost-right.html" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="73" width="400" src="http://3.bp.blogspot.com/-Nsx8GB57OYE/Tgo_i8czBHI/AAAAAAAABMY/769sS1CILNg/s400/harvard.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://blogs.hbr.org/taylor/2011/06/great_people_are_overrated.html" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="59" width="400" src="http://3.bp.blogspot.com/-H6fiVGIA_a8/Tgo_izQ7MuI/AAAAAAAABMg/uqXITQJn-D4/s400/me.PNG" /&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/6425530-368259366401910971?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/368259366401910971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2011/06/my-take-on-recruitment-in-three-tweets.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/368259366401910971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/368259366401910971'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2011/06/my-take-on-recruitment-in-three-tweets.html' title='My Take on Recruitment in Three Tweets'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-tgiAYoMxFLA/Tgo_impmwwI/AAAAAAAABMQ/688c2Vojy9k/s72-c/frans.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-462168768093844201</id><published>2011-05-02T23:35:00.004+02:00</published><updated>2011-05-03T21:05:15.814+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='google code'/><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='linq'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>Project Euler: 1 Down. 335 To Go!</title><content type='html'>I signed up at &lt;a href="http://projecteuler.net/"&gt;Project Euler&lt;/a&gt; today in order to give myself some brain teasers.&lt;br /&gt;&lt;br /&gt;I set up a &lt;a href="http://code.google.com/p/project-euler-csharp/source/browse/"&gt;Mercurial account at Google Code&lt;/a&gt;, and solved the first, very basic, problem tonight.&lt;br /&gt;&lt;br /&gt;It was good fun, and now that I have the Visual Studio solution set up, I hope to solve more of these in my spare time.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cc0000;"&gt;Spoiler alert!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The C# implementation can be found here: http://code.google.com/p/project-euler-csharp/source/browse/ProjectEuler/Problem001_Find_the_sum_of_all_the_multiples_of_3_or_5_below_1000.cs&lt;br /&gt;&lt;br /&gt;And the tests can be found here: http://code.google.com/p/project-euler-csharp/source/browse/ProjectEulerTests/Problem001_Find_the_sum_of_all_the_multiples_of_3_or_5_below_1000_Tests.cs&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-462168768093844201?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/462168768093844201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2011/05/project-euler-1-down-335-to-go.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/462168768093844201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/462168768093844201'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2011/05/project-euler-1-down-335-to-go.html' title='Project Euler: 1 Down. 335 To Go!'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-609071036710230925</id><published>2011-03-16T22:20:00.003+01:00</published><updated>2011-03-19T18:49:21.486+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='politik'/><category scheme='http://www.blogger.com/atom/ns#' term='debat'/><category scheme='http://www.blogger.com/atom/ns#' term='dansk'/><category scheme='http://www.blogger.com/atom/ns#' term='sprog'/><title type='text'>Er tidens digitale teknologier en af årsagene til den øgede fascisme?</title><content type='html'>Baggrunden til denne min første danske blogpost, er at jeg studerer dansk hos Bente Hahne ved Sprogcentrum. Hver gang vi mødes får jeg lektier, og herunder en skriveopgave. Denne gang er min opgave at skrive om &lt;a href="http://www.e-pages.dk/politiken/5023/33"&gt;Kresten Schultz-Jørgensen's debatartikel i Politiken som fik rubrikken "Den sproglige fascisme breder sig" i Politiken 19. februar 2011&lt;/a&gt;. Da "tidens digitale teknologier" spiller en stor rolle i denne, synes jeg at det giver god mening at benytte lige den slags til at lave denne lektie. &lt;br /&gt;&lt;br /&gt;Kresten ser med rædsel at det sproglige niveau er på nedtur bland de studerende ved CBS og andre universiteter, hvor han underviser og har været censor de seneste ti år. Dette på trods af at han mener at de samtidig er mere flittige og fokuserede end tidligere generationer.&lt;br /&gt;&lt;br /&gt;Personligt mangler jeg selvfølgelig Kresten's empiriske grundlag, men jeg har samme erfaringer (dog hovedsagelig i en svensk kontekst). Disse kommer fra at lytte til P3, unge i fjernsynet og i byen, snakke med min elleve år yngre søster og hendes venner, etcetera.&lt;br /&gt;&lt;br /&gt;Lige præcis som Kresten, frygter jeg at denne nedtur leder til flere fordomme og at der bliver flere synes, og færre af logisk underbyggede argumenter. "Færre ord, mindre råderum, flere fordomme. Dét er, som bekendt, fascisme." Det er med andre ord en utrolig alvorlig sag, som samfundet må bekæmpe! Hvis man er i tvivl om sprogets indflydelse på tanken, kan man bare læse &lt;a href="http://www.modkraft.dk/sektion/kontradoxa/article/det-tredje-riges-sprog"&gt;Morten Things anmeldelse af Victor Klemperers Det Tredje Riges sprog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Kresten anerkender dannelsekrisen i familien og skolen, men ønsker derefter at udpege "tidens digitale teknologier" som en stor grund til den gældende nedtur mht. sprogbrug og logisk argumentation. Af alle ydelser man kan tilgå i mobilnettet/på internettet, fokuserer Kresten kun på SMS, Facebook og Twitter. Disse er jo alle lige designede for hurtige, korte beskeder. Facebook er jo desuden et stort socialt netværk hvor idéen er at man skal hygge sig, dele  feriefotos, musikvideoer, og tilsvarende. Dette er selvfølgelig ikke arenaen for dyb, sokratisk argumentation eller diskussion! Kresten, hvad mener du &lt;b&gt;egentlig&lt;/b&gt;? (Man kan jo for søren også finde &lt;a href="http://www.facebook.com/sprogpolitiet"&gt;Sprogpolitiet på Facebook&lt;/a&gt;!)&lt;br /&gt;&lt;br /&gt;Hvad med blogrevolutionen hvor jeg selv læser mange blogs med meget god logisk opbygning og argumentation (især tekniske, men også &lt;a href="http://johannorberg.net/"&gt;politiske&lt;/a&gt;)? ... og hvad med alle &lt;a href="http://atheism.stackexchange.com/"&gt;fora på nettet&lt;/a&gt; hvor du ikke kommer ret langt ved kun at synes ting uden argumenter? Jeg mener at den digitale revolution vi er midt i, giver os mange flere muligheder for god, klassisk debat og udveksling af ideer, end nogensinde før. Lige denne post er jo et eksempel på det.&lt;br /&gt;&lt;br /&gt;I stedet for at gå i denne faldgrube, synes jeg at Kresten skal adlyde &lt;a href="http://politiken.dk/debat/ECE1205012/ja-vi-skal-stramme-op-paa-sproget/"&gt;opfordringen fra Lars Friis Farsøe&lt;/a&gt;, en af Krestens tidligere studenter, når han siger at Kresten burde "vende blikket indad" og fokusere på sin egen rolle i egenskab af, blandt andet, lektor på et universitet med den slags store problemer.&lt;br /&gt;&lt;br /&gt;Jeg vil slutte med at citere &lt;a href="http://videnskab.dk/blog/det-er-digitaliseringens-skyld-forenklinger-overdrivelser-og-syndebukke"&gt;Tanja Juul Christiansen&lt;/a&gt; som både blogger med klogskab og undrer sig over hvem der egentlig har aben: "At skyde skylden på digitale teknologier som sådan er en uholdbar generalisering, der fordrejer sagen, og forringer debatten om, hvordan vi kan gøre noget ved problemet."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-609071036710230925?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/609071036710230925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2011/03/er-tidens-digitale-teknologier-en-af.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/609071036710230925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/609071036710230925'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2011/03/er-tidens-digitale-teknologier-en-af.html' title='Er tidens digitale teknologier en af årsagene til den øgede fascisme?'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-7735415143369976922</id><published>2011-01-28T18:54:00.000+01:00</published><updated>2011-01-28T18:54:10.086+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IEnumerable'/><category scheme='http://www.blogger.com/atom/ns#' term='immutability'/><category scheme='http://www.blogger.com/atom/ns#' term='linq'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='NUnit'/><category scheme='http://www.blogger.com/atom/ns#' term='Conway&apos;s Game of Life'/><title type='text'>Conway's Game of Life Code Kata #2</title><content type='html'>&lt;div&gt;After &lt;a href="http://www.agileskane.se/wiki/Code_Retreat"&gt;yesterday's code retreat&lt;/a&gt;, I've refined, refactored, and added some IEnumerable plumbing to &lt;a href="http://martinsaspects.blogspot.com/2011/01/conways-game-of-life-code-kata.html"&gt;the solution I implemented in preparation for the retreat&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It would be a really fun exercise to visualize the generations with WPF, Silverlight or something else. I'd also like to finish the attempts made at the retreat to implement this solution with JavaScript. As one of my pairing partners pointed out, visualization could be done by manipulating the DOM of an ordinary web page.&lt;br /&gt;&lt;/div&gt;&lt;pre class="brush: c#"&gt;using System;&lt;br /&gt;using System.Collections;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using NUnit.Framework;&lt;br /&gt;using SharpTestsEx;&lt;br /&gt;&lt;br /&gt;namespace ConwaysGameOfLifeKatas.Generations.UnitTests {&lt;br /&gt;    [Description("en.wikipedia.org/wiki/Conway's_Game_of_Life")]&lt;br /&gt;    public class GenerationsUnitTests {&lt;br /&gt;        [Test]&lt;br /&gt;        public void new_generation_should_kill_alive_cell_with_fewer_than_two_live_neighbours() {&lt;br /&gt;            var generations = new Generations(new Cell(1, 1), new Cell(0, 1));&lt;br /&gt;&lt;br /&gt;            generations.First().Contains(new Cell(1, 1)).Should().Be.False();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [Test]&lt;br /&gt;        public void new_generation_should_keep_alive_cell_with_two_live_neighbours_alive() {&lt;br /&gt;            var generations = new Generations(new Cell(1, 1), new Cell(0, 1), new Cell(2, 1));&lt;br /&gt;&lt;br /&gt;            generations.First().Contains(new Cell(1, 1)).Should().Be.True();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [Test]&lt;br /&gt;        public void new_generation_should_keep_alive_cell_with_three_alive_neighbours_alive() {&lt;br /&gt;            var generations = new Generations(new Cell(1, 1), new Cell(0, 1), new Cell(2, 1), new Cell(0, 0));&lt;br /&gt;&lt;br /&gt;            generations.First().Contains(new Cell(1, 1)).Should().Be.True();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [Test]&lt;br /&gt;        public void new_generation_should_kill_alive_cell_with_more_than_three_alive_neighbours() {&lt;br /&gt;            var generations = new Generations(new Cell(0, 0), new Cell(1, 0), new Cell(2, 0),&lt;br /&gt;                                              new Cell(0, 1), new Cell(1, 1));&lt;br /&gt;&lt;br /&gt;            generations.First().Contains(new Cell(1, 1)).Should().Be.False();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [Test]&lt;br /&gt;        public void new_generation_should_revive_dead_cell_with_three_alive_neighbours() {&lt;br /&gt;            var generation = new Generations(new Cell(0, 0), new Cell(1, 0), new Cell(2, 0));&lt;br /&gt;&lt;br /&gt;            generation.First().Contains(new Cell(1, 1)).Should().Be.True();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [TestCase(0,0,0,false)]&lt;br /&gt;        [TestCase(1,0,0,true)]&lt;br /&gt;        [TestCase(2,0,0,false)]&lt;br /&gt;        [TestCase(0,1,0,false)]&lt;br /&gt;        [TestCase(1,1,0,true)]&lt;br /&gt;        [TestCase(2,1,0,false)]&lt;br /&gt;        [TestCase(0,2,0,false)]&lt;br /&gt;        [TestCase(1,2,0,true)]&lt;br /&gt;        [TestCase(2,2,0,false)]&lt;br /&gt;        [TestCase(0,0,1,false)]&lt;br /&gt;        [TestCase(1,0,1,false)]&lt;br /&gt;        [TestCase(2,0,1,false)]&lt;br /&gt;        [TestCase(0,1,1,true)]&lt;br /&gt;        [TestCase(1,1,1,true)]&lt;br /&gt;        [TestCase(2,1,1,true)]&lt;br /&gt;        [TestCase(0,2,1,false)]&lt;br /&gt;        [TestCase(1,2,1,false)]&lt;br /&gt;        [TestCase(2,2,1,false)]&lt;br /&gt;        public void blinker_oscillator_should_oscillate_according_to_wikipedia(int x, int y, int generationIndex, bool isAlive) {&lt;br /&gt;            var generations = new Generations(new Cell(0, 1), new Cell(1, 1), new Cell(2, 1));&lt;br /&gt;&lt;br /&gt;            generations[generationIndex].Contains(new Cell(x, y)).Should().Be.EqualTo(isAlive);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public class Generations : IEnumerable&amp;lt;Generation&amp;gt; {&lt;br /&gt;        private readonly Generation _seedGeneration;&lt;br /&gt;&lt;br /&gt;        public Generations(params Cell[] seed) {&lt;br /&gt;            _seedGeneration= new Generation(seed);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public IEnumerator&amp;lt;Generation&amp;gt; GetEnumerator() {&lt;br /&gt;            return new GenerationEnumerator(_seedGeneration);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public Generation this[int index] { &lt;br /&gt;            get {&lt;br /&gt;                return this.ElementAt(index);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        IEnumerator IEnumerable.GetEnumerator() {&lt;br /&gt;            return GetEnumerator();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public class GenerationEnumerator : IEnumerator&amp;lt;Generation&amp;gt; {&lt;br /&gt;            public GenerationEnumerator(Generation generation) {&lt;br /&gt;                Current = generation;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            public void Dispose() {}&lt;br /&gt;&lt;br /&gt;            public bool MoveNext() {&lt;br /&gt;                Current = Current.Tick();&lt;br /&gt;&lt;br /&gt;                return true;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            public void Reset() {}&lt;br /&gt;&lt;br /&gt;            public Generation Current { get; private set; }&lt;br /&gt;&lt;br /&gt;            object IEnumerator.Current {&lt;br /&gt;                get { return Current; }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public class Generation {&lt;br /&gt;        private readonly ISet&amp;lt;Cell&amp;gt; _aliveCells;&lt;br /&gt;&lt;br /&gt;        public Generation(params Cell[] aliveCellsSeed) {&lt;br /&gt;            _aliveCells = new HashSet&amp;lt;Cell&amp;gt;(aliveCellsSeed);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private IEnumerable&amp;lt;Cell&amp;gt; KeepAlives {&lt;br /&gt;            get {&lt;br /&gt;                return _aliveCells&lt;br /&gt;                    .Where(c =&amp;gt; GetNumberOfAliveNeighboursOf(c) == 2&lt;br /&gt;                                || GetNumberOfAliveNeighboursOf(c) == 3);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private IEnumerable&amp;lt;Cell&amp;gt; Revives {&lt;br /&gt;            get {&lt;br /&gt;                return _aliveCells&lt;br /&gt;                    .SelectMany(GetDeadNeighboursOf)&lt;br /&gt;                    .Where(c =&amp;gt; GetNumberOfAliveNeighboursOf(c) == 3);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public Generation Tick() {&lt;br /&gt;            return new Generation(KeepAlives.Union(Revives).ToArray());&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private IEnumerable&amp;lt;Cell&amp;gt; GetDeadNeighboursOf(Cell cell) {&lt;br /&gt;            return GetNeighboursOf(cell).Where(c =&amp;gt; !Contains(c));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private static IEnumerable&amp;lt;Cell&amp;gt; GetNeighboursOf(Cell cell) {&lt;br /&gt;            return Enumerable.Range(-1, 3)&lt;br /&gt;                .SelectMany(x =&amp;gt; Enumerable.Range(-1, 3)&lt;br /&gt;                                     .Select(y =&amp;gt; new Cell(cell.X + x, cell.Y + y)))&lt;br /&gt;                .Except(cell);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private int GetNumberOfAliveNeighboursOf(Cell cell) {&lt;br /&gt;            return GetNeighboursOf(cell).Count(Contains);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public bool Contains(Cell cell) {&lt;br /&gt;            return _aliveCells.Contains(cell);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public struct Cell : IEquatable&amp;lt;Cell&amp;gt; {&lt;br /&gt;        private readonly int _x;&lt;br /&gt;        private readonly int _y;&lt;br /&gt;&lt;br /&gt;        public Cell(int x, int y) {&lt;br /&gt;            _x = x;&lt;br /&gt;            _y = y;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public int Y {&lt;br /&gt;            get { return _y; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public int X {&lt;br /&gt;            get { return _x; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public bool Equals(Cell other) {&lt;br /&gt;            return other._x == _x &amp;&amp; other._y == _y;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override bool Equals(object obj) {&lt;br /&gt;            if (ReferenceEquals(null, obj)) return false;&lt;br /&gt;            if (obj.GetType() != typeof (Cell)) return false;&lt;br /&gt;            return Equals((Cell) obj);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override int GetHashCode() {&lt;br /&gt;            unchecked {&lt;br /&gt;                return (_x*397) ^ _y;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static class Extensions {&lt;br /&gt;        public static IEnumerable&amp;lt;T&amp;gt; Except&amp;lt;T&amp;gt;(this IEnumerable&amp;lt;T&amp;gt; @this, T element) {&lt;br /&gt;            return @this.Except(new[] {element});&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-7735415143369976922?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/7735415143369976922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2011/01/conways-game-of-life-code-kata-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/7735415143369976922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/7735415143369976922'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2011/01/conways-game-of-life-code-kata-2.html' title='Conway&apos;s Game of Life Code Kata #2'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-6605611143102828455</id><published>2011-01-27T11:34:00.000+01:00</published><updated>2011-01-27T11:34:55.790+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code retreat'/><category scheme='http://www.blogger.com/atom/ns#' term='immutability'/><category scheme='http://www.blogger.com/atom/ns#' term='linq'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='Conway&apos;s Game of Life'/><title type='text'>Conway's Game of Life Code Kata</title><content type='html'>&lt;div&gt;In preparation for my first &lt;a href="http://www.agileskane.se/wiki/Code_Retreat"&gt;code retreat&lt;/a&gt; later today, we were asked to study the problem at hand - Conway's Game of Life. Wikipedia has an &lt;a href="http://en.wikipedia.org/wiki/Conway's_game_of_life"&gt;excellent article&lt;/a&gt; describing the rules.&lt;br /&gt;&lt;br /&gt;At my first attempt; I focused on the cell and tried to use a state machine. It didn't take too long before it felt cumbersome, so I stopped (although the state machine tests passed ;-)).&lt;br /&gt;&lt;br /&gt;Then I tried to mimic "the real world" (oh, what a fallacy...) again, but this time I implemented a Grid&amp;lt;Coordinate&amp;gt; with an internal List&amp;lt;List&amp;lt;Coordinate&amp;gt;&amp;gt;. This was also a mistake... Imagine keeping a reference for all empty cells as well as making the grid infinite.&lt;br /&gt;&lt;br /&gt;Third time's the charm, right? Why not just let a logical Grid instance keep a set of live cells? And why not remove all state changes, hence making both the Coordinate and the Grid types  immutable? That way the Grid is asked to create a new immutable Grid for each generation.&lt;br /&gt;&lt;br /&gt;By using these ideas, I quickly arrived at the solution below which I really like. It'll be very interesting to see what other solutions we'll come up with at the retreat.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush: c#"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using NUnit.Framework;&lt;br /&gt;using SharpTestsEx;&lt;br /&gt;&lt;br /&gt;namespace ConwaysGameOfLifeKatas.GridAsListOfAliveCells.UnitTests&lt;br /&gt;{&lt;br /&gt;    public class GridAsListOfAliveCellsTests {&lt;br /&gt;        [Test]&lt;br /&gt;        public void new_generation_should_kill_alive_cell_with_fewer_than_two_live_neighbours() {&lt;br /&gt;            var grid = new Grid(new Coordinate(1, 1), new Coordinate(0, 1));&lt;br /&gt;&lt;br /&gt;            grid = grid.CreateNextGeneration();&lt;br /&gt;&lt;br /&gt;            grid.IsAlive(new Coordinate(1, 1)).Should().Be.False();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [Test]&lt;br /&gt;        public void new_generation_should_keep_alive_cell_with_two_live_neighbours_alive() {&lt;br /&gt;            var grid = new Grid(new Coordinate(1, 1), new Coordinate(0, 1), new Coordinate(2, 1));&lt;br /&gt;&lt;br /&gt;            grid = grid.CreateNextGeneration();&lt;br /&gt;&lt;br /&gt;            grid.IsAlive(new Coordinate(1, 1)).Should().Be.True();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [Test]&lt;br /&gt;        public void new_generation_should_keep_alive_cell_with_three_alive_neighbours_alive() {&lt;br /&gt;            var grid = new Grid(new Coordinate(1, 1), new Coordinate(0, 1), new Coordinate(2, 1), new Coordinate(0, 0));&lt;br /&gt;&lt;br /&gt;            grid = grid.CreateNextGeneration();&lt;br /&gt;&lt;br /&gt;            grid.IsAlive(new Coordinate(1, 1)).Should().Be.True();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [Test]&lt;br /&gt;        public void new_generation_should_kill_alive_cell_with_more_than_three_alive_neighbours() {&lt;br /&gt;            var grid = new Grid(new Coordinate(0, 0), new Coordinate(1, 0), new Coordinate(2, 0), &lt;br /&gt;                new Coordinate(0, 1), new Coordinate(1, 1));&lt;br /&gt;&lt;br /&gt;            grid = grid.CreateNextGeneration();&lt;br /&gt;&lt;br /&gt;            grid.IsAlive(new Coordinate(1, 1)).Should().Be.False();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [Test]&lt;br /&gt;        public void new_generation_should_revive_dead_cell_with_three_alive_neighbours() {&lt;br /&gt;            var grid = new Grid(new Coordinate(0, 0), new Coordinate(1, 0), new Coordinate(2, 0));&lt;br /&gt;&lt;br /&gt;            grid = grid.CreateNextGeneration();&lt;br /&gt;&lt;br /&gt;            grid.IsAlive(new Coordinate(1, 1)).Should().Be.True();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [Test]&lt;br /&gt;        public void blinker_oscillator_should_oscillate_according_to_wikipedia() {&lt;br /&gt;            var grid = new Grid(new Coordinate(0, 1), new Coordinate(1, 1), new Coordinate(2, 1));&lt;br /&gt;&lt;br /&gt;            grid = grid.CreateNextGeneration();&lt;br /&gt;&lt;br /&gt;            grid.IsAlive(new Coordinate(0, 0)).Should().Be.False();&lt;br /&gt;            grid.IsAlive(new Coordinate(1, 0)).Should().Be.True();&lt;br /&gt;            grid.IsAlive(new Coordinate(2, 0)).Should().Be.False();&lt;br /&gt;            grid.IsAlive(new Coordinate(0, 1)).Should().Be.False();&lt;br /&gt;            grid.IsAlive(new Coordinate(1, 1)).Should().Be.True();&lt;br /&gt;            grid.IsAlive(new Coordinate(2, 1)).Should().Be.False();&lt;br /&gt;            grid.IsAlive(new Coordinate(0, 2)).Should().Be.False();&lt;br /&gt;            grid.IsAlive(new Coordinate(1, 2)).Should().Be.True();&lt;br /&gt;            grid.IsAlive(new Coordinate(2, 2)).Should().Be.False();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public class Grid {&lt;br /&gt;        private readonly ISet&amp;lt;Coordinate&amp;gt; _aliveCoordinates;&lt;br /&gt;&lt;br /&gt;        public Grid(params Coordinate[] aliveCoordinatesSeed) {&lt;br /&gt;            _aliveCoordinates = new HashSet&amp;lt;Coordinate&amp;gt;(aliveCoordinatesSeed);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public Grid CreateNextGeneration() {&lt;br /&gt;            var keepAliveCoordinates = _aliveCoordinates&lt;br /&gt;                .Where(c =&amp;gt; GetNumberOfAliveNeighboursOf(c) == 2 || GetNumberOfAliveNeighboursOf(c) == 3);&lt;br /&gt;&lt;br /&gt;            var reviveCoordinates = _aliveCoordinates&lt;br /&gt;                .SelectMany(GetDeadNeighboursOf)&lt;br /&gt;                .Where(c =&amp;gt; GetNumberOfAliveNeighboursOf(c) == 3);&lt;br /&gt;&lt;br /&gt;            return new Grid(keepAliveCoordinates.Union(reviveCoordinates).ToArray());&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private IEnumerable&amp;lt;Coordinate&amp;gt; GetDeadNeighboursOf(Coordinate coordinate) {&lt;br /&gt;            return GetNeighboursOf(coordinate).Where(c =&amp;gt; !IsAlive(c)); &lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private static IEnumerable&amp;lt;Coordinate&amp;gt; GetNeighboursOf(Coordinate coordinate) {&lt;br /&gt;            return Enumerable.Range(-1, 3).SelectMany(&lt;br /&gt;                    x =&amp;gt; Enumerable.Range(-1, 3).Select(y =&amp;gt; new Coordinate(coordinate.X + x, coordinate.Y + y)))&lt;br /&gt;                    .Except(new []{coordinate});&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private int GetNumberOfAliveNeighboursOf(Coordinate coordinate) {&lt;br /&gt;            return GetNeighboursOf(coordinate).Count(IsAlive); &lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public bool IsAlive(Coordinate coordinate) {&lt;br /&gt;            return _aliveCoordinates.Contains(coordinate);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public struct Coordinate : IEquatable&amp;lt;Coordinate&amp;gt; {&lt;br /&gt;        private readonly int _x;&lt;br /&gt;        private readonly int _y;&lt;br /&gt;&lt;br /&gt;        public Coordinate(int x, int y) {&lt;br /&gt;            _x = x;&lt;br /&gt;            _y = y;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public int Y { get { return _y; } }&lt;br /&gt;&lt;br /&gt;        public int X { get { return _x; } }&lt;br /&gt;&lt;br /&gt;        public bool Equals(Coordinate other) {&lt;br /&gt;            return other._x == _x &amp;&amp; other._y == _y;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override bool Equals(object obj) {&lt;br /&gt;            if (ReferenceEquals(null, obj)) return false;&lt;br /&gt;            if (obj.GetType() != typeof (Coordinate)) return false;&lt;br /&gt;            return Equals((Coordinate) obj);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override int GetHashCode() {&lt;br /&gt;            unchecked {&lt;br /&gt;                return (_x*397) ^ _y;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-6605611143102828455?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/6605611143102828455/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2011/01/conways-game-of-life-code-kata.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/6605611143102828455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/6605611143102828455'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2011/01/conways-game-of-life-code-kata.html' title='Conway&apos;s Game of Life Code Kata'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-1154306781143600630</id><published>2010-12-11T14:58:00.000+01:00</published><updated>2010-12-11T14:58:55.422+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='insourcing'/><category scheme='http://www.blogger.com/atom/ns#' term='outsourcing'/><title type='text'>Insourcing and responding to change</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Just found a Danish job ad with an interesting, as well as promising, wording:&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;"&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Udviklingen er for nylig blevet insourcet igen efter nogle års outsourcing&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;[...]&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Formålet med insourcingen af udviklingen er at &lt;span class="Apple-style-span" style="background-color: #f1c232;"&gt;sikre hurtigst mulig reaktion&lt;/span&gt; i forhold til både vores danske kædekunder og vores internationale ekspansion."&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;The ad can be viewed here:&amp;nbsp;&lt;a href="http://goo.gl/vFHpm"&gt;http://goo.gl/vFHpm&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-1154306781143600630?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/1154306781143600630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2010/12/insourcing-and-responding-to-change.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/1154306781143600630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/1154306781143600630'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2010/12/insourcing-and-responding-to-change.html' title='Insourcing and responding to change'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-170180855952860131</id><published>2010-11-24T20:46:00.001+01:00</published><updated>2010-11-24T20:52:00.521+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='feedback'/><category scheme='http://www.blogger.com/atom/ns#' term='improve'/><title type='text'>The only people who like to hear that their code is bad, is people who's trying to get better</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;"If you price yourself high, you're gonna get better clients. The same is true for information in a supply and demand situation when you're trying to help someone that doesn't wanna be helped is no good.&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;- I can show you how to be better.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;- I don't want to be better. I want to keep sucking.&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;Let them keep sucking! The only people who like to hear that their code is bad, is people who's trying to get better. Those are the only people you wan't to associate with in the first place anyway.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;[...] If you don't set yourself apart, you're going to work on mediocre projects. That'll screw you over. It kinda makes you stupid."&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;- &lt;a href="http://feedproxy.google.com/~r/ThisDevelopersLife/~3/0surVz5qNpI/1197337846"&gt;Giles Bowkett in this.life() 1.0.4: Being Mean&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="325" width="325"&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="movie" value="http://player.wizzard.tv/player/o/i/x/129062765797/config/k-27721e9f4e6ff19c/uuid/null/episode/k-cab9e8261c2ee84f"/&gt;&lt;embed src="http://player.wizzard.tv/player/o/i/x/129062765797/config/k-27721e9f4e6ff19c/uuid/null/episode/k-cab9e8261c2ee84f" name="movie" menu="false" type="application/x-shockwave-flash" AllowScriptAccess="always" AllowFullScreen="true" width="325" height="325"/&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-170180855952860131?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/170180855952860131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2010/11/only-people-who-like-to-hear-that-their.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/170180855952860131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/170180855952860131'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2010/11/only-people-who-like-to-hear-that-their.html' title='The only people who like to hear that their code is bad, is people who&apos;s trying to get better'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-4186131615128566594</id><published>2010-05-04T23:19:00.001+02:00</published><updated>2010-05-04T23:20:34.897+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='coders at work'/><category scheme='http://www.blogger.com/atom/ns#' term='software craftsmanship'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Coders at Work Speaking Words of Wisdom</title><content type='html'>I've finished reading &lt;a href="http://www.codersatwork.com/"&gt;Coders at Work&lt;/a&gt; where Peter Seibel interviews "15 of the all-time greats of programming and computer science" about the craft of programming and related topics.&lt;br /&gt;&lt;br /&gt;It's a very interesting book, which I wholeheartedly recommend to anyone who cares about their profession as a software developer.&lt;br /&gt;&lt;br /&gt;Below some words of wisdom from three of the interviewees:&lt;br /&gt;&lt;br /&gt;Thompson: "My definition of fragile code is, suppose you want to add a feature &amp;mdash; good code, there's one place where you add that feature and it fits; fragile code, you've got to touch ten places."&lt;br /&gt;&lt;br /&gt;Siebel: "[&amp;hellip;] people [&amp;hellip;] work long hours because we have this idea that we've got to get this product out the door and the way to do it is for everyone to work 80, 100 hours a week."&lt;br /&gt;&lt;br /&gt;Thompson: "That generates burnout. [&amp;hellip;] external deadlines &amp;mdash; generate stress."&lt;br /&gt;&lt;br /&gt;Siebel: "[&amp;hellip;] in terms of getting things done in the short term, does it work?"&lt;br /&gt;&lt;br /&gt;Thompson: "Usually you're in a position where such a thing is continual."&lt;br /&gt;&lt;br /&gt;Siebel: "Can you estimate how long it's going to take to write a given piece of code?"&lt;br /&gt;&lt;br /&gt;Thompson: "[&amp;hellip;] if you're doing it for production then usually there are other people involved and coordination &amp;mdash; I can't estimate that."&lt;br /&gt;&amp;ndash; &lt;a href="http://books.google.com/books?id=nneBa6-mWfgC&amp;printsec=frontcover&amp;dq=Coders+at+Work&amp;ei=YILgS7-EAYa-ywTr7O2gDA&amp;cd=1#v=onepage&amp;q=fragile&amp;f=false"&gt;Ken Thompson, p. 467, 478 &amp; 479&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;"[&amp;hellip;] a design review double checks that the parts that he [the programmer] thought he had right he did have right and potentially give him some insight on the parts that he didn't. [&amp;hellip;] such an obvious good use of the senior talent doing the review."&lt;br /&gt;&amp;ndash; &lt;a href="http://books.google.com/books?id=nneBa6-mWfgC&amp;printsec=frontcover&amp;dq=Coders+at+Work&amp;ei=YILgS7-EAYa-ywTr7O2gDA&amp;cd=1#v=snippet&amp;q=senior%20talent&amp;f=false"&gt;Bernie Cosell, p. 539&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;"[&amp;hellip;] software required so much attention to detail. It filled that much of my brain to the exclusion of other stuff."&lt;br /&gt;&lt;br /&gt;"I think it is always going to be true that a person who manages programmers should not expect it to be predictable."&lt;br /&gt;&amp;ndash; &lt;a href="http://books.google.com/books?id=nneBa6-mWfgC&amp;printsec=frontcover&amp;dq=Coders+at+Work&amp;ei=YILgS7-EAYa-ywTr7O2gDA&amp;cd=1#v=snippet&amp;q=attention%20to%20detail&amp;f=false"&gt;Donald Knuth, p. 572&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-4186131615128566594?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/4186131615128566594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2010/05/coders-at-work-speaking-words-of-wisdom.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/4186131615128566594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/4186131615128566594'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2010/05/coders-at-work-speaking-words-of-wisdom.html' title='Coders at Work Speaking Words of Wisdom'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-2324018217942003269</id><published>2010-03-25T22:10:00.010+01:00</published><updated>2010-03-26T11:38:22.084+01:00</updated><title type='text'>Merge (fka Upsert) Extension Method for IDictionary</title><content type='html'>&lt;pre class="brush: c#"&gt;[TestFixture]&lt;br /&gt;public class IDictionaryExtensionsTests&lt;br /&gt;{&lt;br /&gt;    [Test]&lt;br /&gt;    public void ShouldAddIfKeyDoesNotExists()&lt;br /&gt;    {&lt;br /&gt;        var dictionary = new Dictionary&amp;lt;string, int&amp;gt; { { "nøgle", 100 }, { "key", 200 } };&lt;br /&gt;&lt;br /&gt;        dictionary.Merge("nyckel", 300).Count.Should().Be.EqualTo(3);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [Test]&lt;br /&gt;    public void ShouldUpdateIfKeyExists()&lt;br /&gt;    {&lt;br /&gt;        var dictionary = new Dictionary&amp;lt;string, int&amp;gt; { { "nøgle", 100 }, { "key", 200 } };&lt;br /&gt;&lt;br /&gt;        dictionary.Merge("nøgle", 400).Count.Should().Be.EqualTo(2);&lt;br /&gt;        dictionary["nøgle"].Should().Be.EqualTo(400);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Adds the key/value pair if the key doesn't exist, or updates the key with&lt;br /&gt;/// the supplied value if the key exists.&lt;br /&gt;/// &amp;lt;remarks&amp;gt;&lt;br /&gt;/// The name "Merge" is taken from SQL:2003 (f.k.a. "Upsert")&lt;br /&gt;/// &amp;lt;see cref="en.wikipedia.org/wiki/Merge_(SQL)"/&amp;gt;&lt;br /&gt;/// &amp;lt;/remarks&amp;gt;&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;public static class IDictionaryExtensions&lt;br /&gt;{&lt;br /&gt;    public static IDictionary&amp;lt;TKey, TValue&amp;gt; Merge&amp;lt;TKey, TValue&amp;gt;(this IDictionary&amp;lt;TKey, TValue&amp;gt; thiz, TKey key, TValue value)&lt;br /&gt;    {&lt;br /&gt;        if (thiz.ContainsKey(key))&lt;br /&gt;        {&lt;br /&gt;            thiz.Remove(key);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        thiz.Add(key, value);&lt;br /&gt;&lt;br /&gt;        return thiz;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-2324018217942003269?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/2324018217942003269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2010/03/merge-fka-upsert-extension-method-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/2324018217942003269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/2324018217942003269'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2010/03/merge-fka-upsert-extension-method-for.html' title='Merge (fka Upsert) Extension Method for IDictionary&lt;TKey, TValue&gt;'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-5309449644803740193</id><published>2010-02-12T19:31:00.000+01:00</published><updated>2010-02-12T19:31:54.319+01:00</updated><title type='text'>YAK - Yet Another Keyboard Navigator for Chrome</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;I wanted to learn some basic jQuery, and I wanted a simple ergonomic keyboard navigator for Chrome: meet YAK!&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;I implemented it as a user/Greasemonkey script, which will pass as an extension in Chrome.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;YAK web site:&amp;nbsp;&lt;/span&gt;&lt;a href="http://yak.nfshost.com/"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;http://yak.nfshost.com/&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;YAK @ userscripts.org:&amp;nbsp;&lt;/span&gt;&lt;a href="http://userscripts.org/scripts/show/68609"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;http://userscripts.org/scripts/show/68609&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&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/6425530-5309449644803740193?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/5309449644803740193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2010/02/yak-yet-another-keyboard-navigator-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/5309449644803740193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/5309449644803740193'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2010/02/yak-yet-another-keyboard-navigator-for.html' title='YAK - Yet Another Keyboard Navigator for Chrome'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-3472755832750117982</id><published>2010-02-10T15:08:00.002+01:00</published><updated>2010-02-10T15:13:22.054+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='readability'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>Poor Man's Custom Types with C# Using Aliases</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;For the sake of simplicity, I never implement custom types just for the sake of readability. I.e., I don't encapsulate int, string, decimal, and so on. This is because I find the cost being too high when writing, maintaining, and (OR) mapping all these types.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;What I've just started doing in order to&amp;nbsp;achieve&amp;nbsp;the same level of readability, is using aliases like so:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;using Birthday = DateTime;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;using PersonId = Int32;&lt;/span&gt;&lt;br /&gt;before the class declaration, but after the namespace declaration (so that one doesn't have to fully qualify the type names).&lt;br /&gt;&lt;br /&gt;For complex generic types, the readability increases even more IMHO:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;using StrangeDictionary =  IDictionary&amp;lt;int, KeyValuePair&amp;lt;string, decimal&amp;gt;&amp;gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;/Martin&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-3472755832750117982?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/3472755832750117982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2010/02/poor-mans-custom-types-with-c-using.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/3472755832750117982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/3472755832750117982'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2010/02/poor-mans-custom-types-with-c-using.html' title='Poor Man&apos;s Custom Types with C# Using Aliases'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-2590080480302870457</id><published>2009-12-01T09:45:00.002+01:00</published><updated>2009-12-01T09:46:45.123+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ORA-06553'/><category scheme='http://www.blogger.com/atom/ns#' term='pl/sql'/><category scheme='http://www.blogger.com/atom/ns#' term='PLS-38'/><category scheme='http://www.blogger.com/atom/ns#' term='ORA-00907'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Oracle Horror Morning</title><content type='html'>&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;First, I need to say that the database I've primarily used for the last decade is MS SQL Server.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;I needed to write a simple function like so:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;is_holiday(in_code in varchar2, in_year in integer, in_month in integer, in_day in integer)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;that returns a boolean.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;First, I wrote a few tests like these:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;select is_holiday('xyz', 2006, 8, 1) from dual; &amp;nbsp; -- false&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;select is_holiday('xyz', 2009, 11, 1) from dual; &amp;nbsp;-- true&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When I ran the tests after implementing the function I got the following messages:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;pre style="font-family: Courier, monospace; white-space: pre;"&gt;SQL Error: ORA-06552: PL/SQL: Statement ignored&lt;br /&gt;ORA-06553: PLS-382: expression is of wrong type&lt;/pre&gt;&lt;pre style="font-family: Courier, monospace; white-space: pre;"&gt;&lt;/pre&gt;&lt;pre style="white-space: pre;"&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;I later learned that this is because booleans aren't allowed inside SQL like that. A sort of misguiding and not very helpful error message IMHO.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre;"&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre;"&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;On my quest of finding a solution, I also tried named params like so:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre;"&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;select is_holiday(in_sm_center_code =&amp;gt; 'xyz', in_year =&amp;gt; 2006, in_month =&amp;gt; 8, in_day =&amp;gt; 1) from dual;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre;"&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre;"&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;That gave me the horror:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre;"&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; white-space: normal;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Courier, monospace; white-space: normal;"&gt;ORA-00907: missing right parenthesis&lt;/pre&gt;&lt;pre style="font-family: Courier, monospace; white-space: normal;"&gt;&lt;/pre&gt;&lt;pre style="white-space: normal;"&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;What?!?&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;Once again, PL/SQL programs differ from the SQL statements like that, where the params can't be named, but must be in positional form.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;Why not simply state that in the error&amp;nbsp;dialog&amp;nbsp;box?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;Thanks to this blog:&amp;nbsp;&lt;a href="http://oraclequirks.blogspot.com/"&gt;&lt;span style="color: black;"&gt;oraclequirks.blogspot.com&lt;/span&gt;&lt;/a&gt;, I got my head around these issues and solved the task at hand.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-2590080480302870457?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/2590080480302870457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2009/12/oracle-horror-morning.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/2590080480302870457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/2590080480302870457'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2009/12/oracle-horror-morning.html' title='Oracle Horror Morning'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-838354888520933046</id><published>2009-11-24T08:37:00.000+01:00</published><updated>2009-11-24T08:37:05.321+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atdd'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='bdd'/><title type='text'>More on TDD and BDD, but this time I link to interesting resources from ThoughtWorks</title><content type='html'>&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;Here are two interesting slide shows from ThoughtWorks that closely relates to what &lt;a href="http://martinsaspects.blogspot.com/search/label/bdd"&gt;I wrote regarding executable acceptance tests (stories)&lt;/a&gt; some time ago:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;a href="http://xpday3.xpday.org/slides/ATDD.ppt"&gt;Acceptance Test Driven Development (ATDD)&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;a href="http://dynamicorange.com/uploads/slides/xpday/ATvUT(XPDay3).ppt"&gt;Acceptance Testing vs. Unit Testing: A Developer’s Perspective&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;I think these two resources make a good theoretical starting point for the "Why ATDD?" question.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;Don't just look at the slides as slide shows, since there's a lot of great stuff in the comments.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-838354888520933046?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/838354888520933046/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2009/11/more-on-tdd-and-bdd-but-this-time-i.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/838354888520933046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/838354888520933046'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2009/11/more-on-tdd-and-bdd-but-this-time-i.html' title='More on TDD and BDD, but this time I link to interesting resources from ThoughtWorks'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-5825864159587828516</id><published>2009-11-21T17:48:00.001+01:00</published><updated>2009-11-21T17:50:00.513+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Ubuntu Karmic Koala - I Like!</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_MNEvbrTT5dI/SwgZ_Q-bBSI/AAAAAAAAAec/smyFk5XLtes/s1600/ubuntu_karmic.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_MNEvbrTT5dI/SwgZ_Q-bBSI/AAAAAAAAAec/smyFk5XLtes/s640/ubuntu_karmic.png" /&gt;&lt;/a&gt;&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/6425530-5825864159587828516?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/5825864159587828516/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2009/11/ubuntu-karmic-koala-i-like.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/5825864159587828516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/5825864159587828516'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2009/11/ubuntu-karmic-koala-i-like.html' title='Ubuntu Karmic Koala - I Like!'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_MNEvbrTT5dI/SwgZ_Q-bBSI/AAAAAAAAAec/smyFk5XLtes/s72-c/ubuntu_karmic.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-5213168525603502863</id><published>2009-11-02T21:22:00.003+01:00</published><updated>2010-02-11T08:43:00.429+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='øredev'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='juval löwy'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>“Programming as you know it just died”</title><content type='html'>The above was stated by Juval Löwy during today’s workshop at øredev entitled “Service-Orientation, WCF, and You”.&lt;br /&gt;&lt;br /&gt;Just like every .Net class conceptually is a COM-object, Juval argued that with the challenges we as biz app architects/developers face today, every (.Net) class should be a (WCF) service.&lt;br /&gt;The main reason is that basically all complex plumbing such as security, concurrency, logging, fault tolerance, and so forth is given to you for free.&lt;br /&gt;The learning curve is however mammoth, and is best compared with going from procedural to object-oriented programming. &lt;br /&gt;&lt;br /&gt;When interpreting all the signs from MS, Intel, and others, Juval means that it is clear that service-orientation is the next paradigm shift that will replace .Net.&lt;br /&gt;The analogy is ATL, which made it it easy to follow the good practice of making your C++ class a COM one. Then .Net came along were this wasn’t framework-based. Now we have WCF making it possible to make every .Net class a service by utilizing a framework.&lt;br /&gt;The financial figures also indicates this being the main focus of MS. Juval claims that the cost of WCF is some 150% of what went into the CLR.&lt;br /&gt;&lt;br /&gt;All in all, this was an extremely mind-exercising day that left me with the feeling of seeing the world of programming with a new pair of eyes from now on.&lt;br /&gt;I guess I’ll have to read Juval’s WCF book when the 3rd edition is out… ;-)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;UPDATE Feb 11 2010:&lt;br /&gt;1. There's a recent &lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=520"&gt;DotNetRocks show with Juval&lt;/a&gt;, where he explains all of this.&lt;br /&gt;&lt;br /&gt;2. There's now a &lt;a href="http://oreilly.com/catalog/9780596805494"&gt;"rough cut" edition of the book&lt;/a&gt; available.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-5213168525603502863?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/5213168525603502863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2009/11/programming-as-you-know-it-just-died.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/5213168525603502863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/5213168525603502863'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2009/11/programming-as-you-know-it-just-died.html' title='“Programming as you know it just died”'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-4120473356777135825</id><published>2009-10-21T12:22:00.001+02:00</published><updated>2009-10-21T12:24:30.870+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fowler'/><category scheme='http://www.blogger.com/atom/ns#' term='quote'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>"I often find that a nice design can come from just being really anal about getting rid of duplicated code"</title><content type='html'>- Martin Fowler&lt;br /&gt;&lt;br /&gt;Hear, hear!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-4120473356777135825?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/4120473356777135825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2009/10/i-often-find-that-nice-design-can-come.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/4120473356777135825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/4120473356777135825'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2009/10/i-often-find-that-nice-design-can-come.html' title='&quot;I often find that a nice design can come from just being really anal about getting rid of duplicated code&quot;'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-1319688376530702801</id><published>2009-10-15T22:21:00.001+02:00</published><updated>2009-10-15T22:21:54.018+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technical dept'/><category scheme='http://www.blogger.com/atom/ns#' term='code quality'/><category scheme='http://www.blogger.com/atom/ns#' term='agile skåne'/><title type='text'>Same old tale (about code quality and technical dept)</title><content type='html'>&lt;p&gt;Yesterday, we had yet another great Agile Skåne meeting at Green Lion Inn in Malmö.&lt;/p&gt;  &lt;p&gt;One of the members is right now experiencing how much bad code can hurt you. &lt;/p&gt;  &lt;p&gt;His new employer went to the lowest bidder without any quality control for many years, and have ended up with a total mess, prohibiting them to add features their competitors offer, and hence can’t improve their market share.&lt;/p&gt;  &lt;p&gt;How come this serious mistake is made over and over again? After all it’s common knowledge that quality makes you fast and able to respond to change in the long run. (I know, we’re irrational human beings…)&lt;/p&gt;  &lt;p&gt;I don’t know if it’s true, but I want it to be:&lt;/p&gt;  &lt;p&gt;“Quality is the best business plan.” – Pixar’s John Lasseter&lt;/p&gt;  &lt;p&gt;At least, you can’t blame Pixar for not being successful…&lt;/p&gt;  &lt;p&gt;More on the subject:&lt;/p&gt;  &lt;p&gt;Fowler recently wrote an interesting piece on technical dept: &lt;a href="http://martinfowler.com/bliki/TechnicalDebtQuadrant.html"&gt;http://martinfowler.com/bliki/TechnicalDebtQuadrant.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;There’s a book on the subject of not acting according to what’s known to work:   &lt;br /&gt;”The Knowing-Doing Gap” (ISBN 578511240), which I haven’t read.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-1319688376530702801?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/1319688376530702801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2009/10/same-old-tale-about-code-quality-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/1319688376530702801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/1319688376530702801'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2009/10/same-old-tale-about-code-quality-and.html' title='Same old tale (about code quality and technical dept)'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-2723678666281663736</id><published>2009-10-07T21:28:00.001+02:00</published><updated>2009-10-07T21:28:53.157+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='changeability'/><category scheme='http://www.blogger.com/atom/ns#' term='unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Alt.Net Oresund'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='bdd'/><title type='text'>Decreased changeability when TDD:ing, and a possible solution</title><content type='html'>&lt;p&gt;Yesterday, we had a great &lt;a href="http://oresund.altdotnet.org/Blog/Meeting-in-Copenhagen-on-Oct-1st" target="_blank"&gt;alt.net øresund meeting at BestBrains in København&lt;/a&gt;. Sune held a great presentation about TDD, its pros, and cons. Actually, despite being a TDD fan and user, Sune is very insightful and realizes that TDD isn’t a silver bullet. It could actually decrease your changeability if done wrong for example.&lt;/p&gt;  &lt;p&gt;I’ve personally experienced some of the pains Sune described and that we discussed during the open space session that followed. Actually, previously the very same day &lt;a href="http://groups.google.com/groups/profile?hl=en&amp;amp;enc_user=uYNa_iAAAAAVTPJPG5pa_j8gqgbvHcTtGdt7NIPHa_j7CyrS7PSMHg" target="_blank"&gt;Martin N Jensen&lt;/a&gt; and I tried to start attacking some of them by complementing our TDD efforts with a BDD way of defining higher level requirements in the form of stories and scenarios.&lt;/p&gt;  &lt;p&gt;During the bicycle/train ride home, i thought some more about these issues. Only two days before I had to fix a lot of tests that utilized mocking/stubbing when an API changed that didn’t affect the system behavior in any way. That got me thinking – what the frak am I doing?!? No business value in that activity…&lt;/p&gt;  &lt;p&gt;My not-IRL-tested idea goes something like this: &lt;/p&gt;  &lt;p&gt;You have two sets of unit tests.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Stable BDD tests that drives the SUT (System Under Test) by only looking at the highest level of state (i.e. the database), performs an action, and then verifies the resulting state/output on the highest possible level. These tests corresponds one-to-one with the requirements if using stories as requirements&lt;/li&gt;    &lt;li&gt;Instable “classic” TDD tests that drives the design of the inner workings (classes and their interactions, individual methods, etc.) of the SUT&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;My idea definitely requires UFD (UpFront Design) more according to the lean way of developing software as opposed to some agile start-immediately approaches.&lt;/p&gt;  &lt;p&gt;If you start with a set of fairly stable stories, and implement them as BDD tests in one way or another (we’re using &lt;a href="http://www.codeplex.com/storyq" target="_blank"&gt;StoryQ&lt;/a&gt; at the moment), you consider these tests as stable meaning it should require some thinking before changing them.&lt;/p&gt;  &lt;p&gt;The much more fragile TDD tests are considered something that could be thrown away (likely in parallel with writing new ones), or rewritten if still needed, when the inner workings are refactored (e.g. when replacing Castle Active Record with &lt;a href="http://code.google.com/p/frogdotnet/" target="_blank"&gt;Frog.Net&lt;/a&gt; Sune, or in my case when removing specialized repositories in favor of one generic the other day).&lt;/p&gt;  &lt;p&gt;I feel that if I have my stories implemented as executable acceptance tests, then I would really get&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;true confidence when undertaking big refactorings&lt;/li&gt;    &lt;li&gt;tests that could actually be read and understood by peers, and possibly some other stakeholders&lt;/li&gt;    &lt;li&gt;regression test suite that verifies the SUT’s behavior, i.e. that the stakeholders get what’s agreed upon&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;As a potential benefit I also get extremely readable status reports of every story on e.g. the build server every time an ok commit is made. This is a huge benefit IMHO since it allows you to remove the possible need for a complex task tracking system but still gives your PM (and all others) complete real-time status, allowing you to work with a whiteboard and post-its as a kanban board.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-2723678666281663736?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/2723678666281663736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2009/10/decreased-changeability-when-tdding-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/2723678666281663736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/2723678666281663736'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2009/10/decreased-changeability-when-tdding-and.html' title='Decreased changeability when TDD:ing, and a possible solution'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-433938421213938069</id><published>2009-10-02T15:12:00.008+02:00</published><updated>2010-03-25T21:53:08.274+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='log4net'/><title type='text'>Programmatically configure Log4net with two rolling file appenders</title><content type='html'>&lt;pre class="brush: c#"&gt;public static class LogBootstrapper&lt;br /&gt;{&lt;br /&gt;    public static void Bootstrap()&lt;br /&gt;    {&lt;br /&gt;        RootLogger.AddAppender(CreateRollingFileAppender(Level.All));&lt;br /&gt;        RootLogger.AddAppender(CreateRollingFileAppender(Level.Info));&lt;br /&gt;        RootLogger.Repository.Configured = true;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static Logger RootLogger&lt;br /&gt;    {&lt;br /&gt;        get { return ((Hierarchy)LogManager.GetRepository()).Root; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static RollingFileAppender CreateRollingFileAppender(Level level)&lt;br /&gt;    {&lt;br /&gt;        var usingFileName = string.Format("logs\\MyProject_{0}-{1}-{2}_{3}.log",&lt;br /&gt;        DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, level.Name);&lt;br /&gt;        var layout = new PatternLayout("[%level] %message%newline");&lt;br /&gt;        var rollingFileAppender = new RollingFileAppender&lt;br /&gt;        {&lt;br /&gt;            Layout = layout,&lt;br /&gt;            AppendToFile = true,&lt;br /&gt;            RollingStyle = RollingFileAppender.RollingMode.Date,&lt;br /&gt;            File = usingFileName,&lt;br /&gt;            ImmediateFlush = true,&lt;br /&gt;            Threshold = level&lt;br /&gt;        };&lt;br /&gt;        rollingFileAppender.ActivateOptions();&lt;br /&gt;&lt;br /&gt;        return rollingFileAppender;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-family: trebuchet ms;"&gt;Beats XML config IMHO.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-433938421213938069?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/433938421213938069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2009/10/programmatically-configure-log4net-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/433938421213938069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/433938421213938069'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2009/10/programmatically-configure-log4net-with.html' title='Programmatically configure Log4net with two rolling file appenders'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-4193309171337938817</id><published>2009-10-01T20:39:00.000+02:00</published><updated>2009-10-01T20:42:12.388+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='review'/><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>Pragmatic Thinking and Learning: Refactor Your Wetware</title><content type='html'>&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;I just finished reading &lt;a href="http://www.pragprog.com/titles/ahptl/pragmatic-thinking-and-learning"&gt;Pragmatic Thinking and Learning: Refactor Your Wetware by Andy Hunt&lt;/a&gt;.&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;In short: read it ;-)&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/6425530-4193309171337938817?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/4193309171337938817/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2009/10/pragmatic-thinking-and-learning.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/4193309171337938817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/4193309171337938817'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2009/10/pragmatic-thinking-and-learning.html' title='Pragmatic Thinking and Learning: Refactor Your Wetware'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-7413537432108924565</id><published>2009-09-24T15:24:00.002+02:00</published><updated>2009-09-24T15:26:31.568+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kanban'/><category scheme='http://www.blogger.com/atom/ns#' term='lean'/><category scheme='http://www.blogger.com/atom/ns#' term='pirate metrics'/><title type='text'>Great Lean/Kanban Post</title><content type='html'>&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;... with a big extra plus for letting me know about "Pirate Metrics" for the first time:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://raibledesigns.com/rd/entry/lean_teams_doing_more_with"&gt;&lt;span style="font-family:trebuchet ms;"&gt;http://raibledesigns.com/rd/entry/lean_teams_doing_more_with&lt;/span&gt;&lt;/a&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/6425530-7413537432108924565?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/7413537432108924565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2009/09/great-leankanban-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/7413537432108924565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/7413537432108924565'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2009/09/great-leankanban-post.html' title='Great Lean/Kanban Post'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-7188407581003837345</id><published>2009-09-24T12:39:00.006+02:00</published><updated>2009-09-24T12:44:24.149+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sharp Tests Ex'/><category scheme='http://www.blogger.com/atom/ns#' term='unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='NUnit'/><title type='text'>Trying out Sharp Tests Ex with NUnit 2.5</title><content type='html'>&lt;div style="background: rgb(44, 44, 44) none repeat scroll 0% 0%; font-family: Consolas; font-size: 10pt; color: rgb(220, 220, 204); -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"&gt;&lt;p style="margin: 0px;"&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/*before*/&lt;/span&gt;  &lt;span style="color: rgb(228, 192, 82);"&gt;Assert&lt;/span&gt;.&lt;span style="color: rgb(223, 223, 191);"&gt;That&lt;/span&gt;(&lt;span style="color: rgb(223, 223, 191);"&gt;logHandlersCount&lt;/span&gt;, &lt;span style="color: rgb(228, 192, 82);"&gt;Is&lt;/span&gt;.&lt;span style="color: rgb(223, 223, 191);"&gt;EqualTo&lt;/span&gt;(&lt;span style="color: rgb(138, 204, 207);"&gt;1&lt;/span&gt;));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/*after*/&lt;/span&gt;   &lt;span style="color: rgb(223, 223, 191);"&gt;logHandlersCount&lt;/span&gt;.&lt;span style="color: rgb(223, 223, 191);"&gt;Should&lt;/span&gt;().&lt;span style="color: rgb(223, 223, 191);"&gt;Be&lt;/span&gt;.&lt;span style="color: rgb(223, 223, 191);"&gt;EqualTo&lt;/span&gt;(&lt;span style="color: rgb(138, 204, 207);"&gt;1&lt;/span&gt;);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt; &lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:100%;"  &gt;Even better readability :-)&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:100%;"  &gt;More on Sharp Tests Ex here: &lt;a href="http://sharptestex.codeplex.com/Wiki/View.aspx?title=SyntaxMainPage"&gt;http://sharptestex.codeplex.com/Wiki/View.aspx?title=SyntaxMainPage&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-7188407581003837345?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://sharptestex.codeplex.com/Wiki/View.aspx?title=SyntaxMainPage' title='Trying out Sharp Tests Ex with NUnit 2.5'/><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/7188407581003837345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2009/09/trying-out-sharp-tests-ex-with-nunit-25.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/7188407581003837345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/7188407581003837345'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2009/09/trying-out-sharp-tests-ex-with-nunit-25.html' title='Trying out Sharp Tests Ex with NUnit 2.5'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-2271898353891901907</id><published>2009-09-23T22:05:00.003+02:00</published><updated>2009-09-23T22:13:14.605+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='management'/><category scheme='http://www.blogger.com/atom/ns#' term='deadlines'/><category scheme='http://www.blogger.com/atom/ns#' term='food for thougth'/><title type='text'>It's tough to make predictions, especially about the future</title><content type='html'>&lt;span style="font-family: trebuchet ms;"&gt;- Yogi Berra, Philosopher&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-2271898353891901907?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/2271898353891901907/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2009/09/its-tough-to-make-predictions.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/2271898353891901907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/2271898353891901907'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2009/09/its-tough-to-make-predictions.html' title='It&apos;s tough to make predictions, especially about the future'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-1052368789204478824</id><published>2009-09-18T13:56:00.004+02:00</published><updated>2009-09-18T14:05:17.460+02:00</updated><title type='text'>A NUnit Custom Constraint together with a String Extension Method</title><content type='html'>&lt;div   style="background: rgb(44, 44, 44) none repeat scroll 0% 0%; color: rgb(220, 220, 204); -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;font-family:Consolas;font-size:10pt;"&gt;&lt;p  style="margin: 0px; font-family: courier new;font-family:courier new;"&gt;[&lt;span style="color: rgb(228, 192, 82);"&gt;Test&lt;/span&gt;]&lt;/p&gt;&lt;p  style="margin: 0px; font-family: courier new;font-family:courier new;"&gt;&lt;span style="color: rgb(255, 164, 119);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(255, 164, 119);"&gt;void&lt;/span&gt; &lt;span style="color: rgb(223, 223, 191);"&gt;WhenMyStringPropertyIsEmptyThenMyEntityMustBeInvalid&lt;/span&gt;()&lt;/p&gt;&lt;p  style="margin: 0px; font-family: courier new;font-family:courier new;"&gt;{&lt;/p&gt;&lt;p face="courier new" style="margin: 0px; font-family: courier new;"&gt;       &lt;span style="color: rgb(255, 164, 119);"&gt;var&lt;/span&gt; &lt;span style="color: rgb(223, 223, 191);"&gt;myEntity&lt;/span&gt; = &lt;span style="color: rgb(255, 164, 119);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(223, 223, 191);"&gt;Entity&lt;/span&gt; { &lt;span style="color: rgb(223, 223, 191);"&gt;MyStringProperty&lt;/span&gt; = &lt;span style="color: rgb(255, 164, 119);"&gt;string&lt;/span&gt;.&lt;span style="color: rgb(223, 223, 191);"&gt;Empty&lt;/span&gt; };&lt;/p&gt;&lt;p face="courier new" style="margin: 0px; font-family: courier new;"&gt; &lt;/p&gt;&lt;p style="margin: 0px; font-family: courier new;"&gt;      &lt;span style="color: rgb(228, 192, 82);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px; font-family: courier new;"&gt;&lt;span style="color: rgb(228, 192, 82);"&gt;    Assert&lt;/span&gt;.&lt;span style="color: rgb(223, 223, 191);"&gt;That&lt;/span&gt;(&lt;span style="color: rgb(223, 223, 191);"&gt;myEntity&lt;/span&gt;, &lt;span style="color: rgb(200, 145, 145);"&gt;"MyStringProperty"&lt;/span&gt;.&lt;span style="color: rgb(223, 223, 191);"&gt;IsIncludedInBrokenRules&lt;/span&gt;());&lt;/p&gt;&lt;p style="margin: 0px; font-family: courier new;"&gt;}&lt;/p&gt;&lt;p  style="margin: 0px;font-family:trebuchet ms;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;IsIncludedInBrokenRules() is an extension method that returns an instance of a class that inherits Constraint.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-1052368789204478824?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/1052368789204478824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2009/09/nunit-custom-constraint-together-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/1052368789204478824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/1052368789204478824'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2009/09/nunit-custom-constraint-together-with.html' title='A NUnit Custom Constraint together with a String Extension Method'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-4186313389592675289</id><published>2009-09-08T21:51:00.003+02:00</published><updated>2009-09-09T12:20:19.176+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='x64'/><category scheme='http://www.blogger.com/atom/ns#' term='unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='x86'/><category scheme='http://www.blogger.com/atom/ns#' term='sqlite'/><category scheme='http://www.blogger.com/atom/ns#' term='nhibernate'/><title type='text'>SQLite - works on my machine ;-)</title><content type='html'>&lt;span style="font-family:trebuchet ms;"&gt;I have this new and shiny HP Z600 (x64) at work.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Recently I started using SQLite in-memory for unit testing NHibernate persistence logic.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;When committing, my dear colleague with an older x86 machine got problems...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;I reproduced the problem on my machine by setting the build target to x86 in VS08.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Just change to the 32-bit version of SQLite did the trick.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-4186313389592675289?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/4186313389592675289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2009/09/sqlite-works-on-my-machine.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/4186313389592675289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/4186313389592675289'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2009/09/sqlite-works-on-my-machine.html' title='SQLite - works on my machine ;-)'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-6784881069084485906</id><published>2009-09-02T10:28:00.005+02:00</published><updated>2009-09-02T10:52:59.953+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='group by'/><category scheme='http://www.blogger.com/atom/ns#' term='declarative'/><category scheme='http://www.blogger.com/atom/ns#' term='linq'/><category scheme='http://www.blogger.com/atom/ns#' term='imperative'/><title type='text'>Linq Group By</title><content type='html'>&lt;div style="font-family: Consolas; font-size: 10pt; color: #dcdccc; background: #2c2c2c;"&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; [&lt;span style="color: #e4c052;"&gt;Test&lt;/span&gt;]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: #ffa477;"&gt;public&lt;/span&gt; &lt;span style="color: #ffa477;"&gt;void&lt;/span&gt; &lt;span style="color: #dfdfbf;"&gt;CanAggregateIdAndValue&lt;/span&gt;()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: #ffa477;"&gt;var&lt;/span&gt; &lt;span style="color: #dfdfbf;"&gt;idValuePairs&lt;/span&gt; = &lt;span style="color: #ffa477;"&gt;new&lt;/span&gt; &lt;span style="color: #e4c052;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;IdValuePair&lt;/span&gt;&amp;gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: #ffa477;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IdValuePair&lt;/span&gt;(&lt;span style="color: #8acccf;"&gt;1&lt;/span&gt;, &lt;span style="color: #8acccf;"&gt;1&lt;/span&gt;),&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: #ffa477;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IdValuePair&lt;/span&gt;(&lt;span style="color: #8acccf;"&gt;1&lt;/span&gt;, &lt;span style="color: #8acccf;"&gt;2&lt;/span&gt;),&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: #ffa477;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IdValuePair&lt;/span&gt;(&lt;span style="color: #8acccf;"&gt;1&lt;/span&gt;, &lt;span style="color: #8acccf;"&gt;3&lt;/span&gt;),&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: #ffa477;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IdValuePair&lt;/span&gt;(&lt;span style="color: #8acccf;"&gt;2&lt;/span&gt;, &lt;span style="color: #8acccf;"&gt;1&lt;/span&gt;),&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: #ffa477;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IdValuePair&lt;/span&gt;(&lt;span style="color: #8acccf;"&gt;2&lt;/span&gt;, &lt;span style="color: #8acccf;"&gt;2&lt;/span&gt;),&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: #ffa477;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IdValuePair&lt;/span&gt;(&lt;span style="color: #8acccf;"&gt;3&lt;/span&gt;, &lt;span style="color: #8acccf;"&gt;1&lt;/span&gt;),&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: #ffa477;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IdValuePair&lt;/span&gt;(&lt;span style="color: #8acccf;"&gt;4&lt;/span&gt;, &lt;span style="color: #8acccf;"&gt;1&lt;/span&gt;),&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: #ffa477;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IdValuePair&lt;/span&gt;(&lt;span style="color: #8acccf;"&gt;4&lt;/span&gt;, &lt;span style="color: #8acccf;"&gt;2&lt;/span&gt;)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; };&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: #ffa477;"&gt;var&lt;/span&gt; &lt;span style="color: #dfdfbf;"&gt;expectedAggregatedIdValuePairs&lt;/span&gt; = &lt;span style="color: #ffa477;"&gt;new&lt;/span&gt; &lt;span style="color: #e4c052;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;IdValuePair&lt;/span&gt;&amp;gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: #ffa477;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IdValuePair&lt;/span&gt;(&lt;span style="color: #8acccf;"&gt;1&lt;/span&gt;, &lt;span style="color: #8acccf;"&gt;6&lt;/span&gt;),&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: #ffa477;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IdValuePair&lt;/span&gt;(&lt;span style="color: #8acccf;"&gt;2&lt;/span&gt;, &lt;span style="color: #8acccf;"&gt;3&lt;/span&gt;),&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: #ffa477;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IdValuePair&lt;/span&gt;(&lt;span style="color: #8acccf;"&gt;3&lt;/span&gt;, &lt;span style="color: #8acccf;"&gt;1&lt;/span&gt;),&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: #ffa477;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IdValuePair&lt;/span&gt;(&lt;span style="color: #8acccf;"&gt;4&lt;/span&gt;, &lt;span style="color: #8acccf;"&gt;3&lt;/span&gt;)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; };&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: #ffa477;"&gt;var&lt;/span&gt; &lt;span style="color: #dfdfbf;"&gt;aggregatedIdValuePairs&lt;/span&gt; = &lt;span style="color: #dfdfbf;"&gt;Aggregate&lt;/span&gt;(&lt;span style="color: #dfdfbf;"&gt;idValuePairs&lt;/span&gt;);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: #e4c052;"&gt;Assert&lt;/span&gt;.&lt;span style="color: #dfdfbf;"&gt;IsTrue&lt;/span&gt;(&lt;span style="color: #dfdfbf;"&gt;expectedAggregatedIdValuePairs&lt;/span&gt;.&lt;span style="color: #dfdfbf;"&gt;SequenceEqual&lt;/span&gt;(&lt;span style="color: #dfdfbf;"&gt;aggregatedIdValuePairs&lt;/span&gt;));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: #ffa477;"&gt;private&lt;/span&gt; &lt;span style="color: #ffa477;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;IdValuePair&lt;/span&gt;&amp;gt; &lt;span style="color: #dfdfbf;"&gt;Aggregate&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;IdValuePair&lt;/span&gt;&amp;gt; &lt;span style="color: #dfdfbf;"&gt;idValuePairs&lt;/span&gt;)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: #7f9f7f;"&gt;// imperative OO&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: #7f9f7f;"&gt;/*var map = new Dictionary&amp;lt;int, int&amp;gt;();&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #7f9f7f;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; foreach (var idValuePair in idValuePairs)&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #7f9f7f;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #7f9f7f;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (map.Keys.Contains(idValuePair.Key))&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #7f9f7f;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #7f9f7f;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; map[idValuePair.Key] += idValuePair.Value;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #7f9f7f;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #7f9f7f;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #7f9f7f;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #7f9f7f;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; map[idValuePair.Key] = idValuePair.Value;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #7f9f7f;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #7f9f7f;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #7f9f7f;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; foreach (var aggregatedIdValuePair in map)&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #7f9f7f;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #7f9f7f;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; yield return aggregatedIdValuePair;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #7f9f7f;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; }*/&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: #7f9f7f;"&gt;// declarative linq&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color: #ffa477;"&gt;return&lt;/span&gt; (&lt;span style="color: #ffa477;"&gt;from&lt;/span&gt; &lt;span style="color: #dfdfbf;"&gt;ivp&lt;/span&gt; &lt;span style="color: #ffa477;"&gt;in&lt;/span&gt; &lt;span style="color: #dfdfbf;"&gt;idValuePairs&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #ffa477;"&gt;group&lt;/span&gt; &lt;span style="color: #dfdfbf;"&gt;ivp&lt;/span&gt; &lt;span style="color: #ffa477;"&gt;by&lt;/span&gt; &lt;span style="color: #dfdfbf;"&gt;ivp&lt;/span&gt;.&lt;span style="color: #dfdfbf;"&gt;Key&lt;/span&gt; &lt;span style="color: #ffa477;"&gt;into&lt;/span&gt; &lt;span style="color: #dfdfbf;"&gt;aggregateGroup&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #ffa477;"&gt;select&lt;/span&gt; &lt;span style="color: #ffa477;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IdValuePair&lt;/span&gt;(&lt;span style="color: #dfdfbf;"&gt;aggregateGroup&lt;/span&gt;.&lt;span style="color: #dfdfbf;"&gt;Key&lt;/span&gt;, &lt;span style="color: #dfdfbf;"&gt;aggregateGroup&lt;/span&gt;.&lt;span style="color: #dfdfbf;"&gt;Sum&lt;/span&gt;(&lt;span style="color: #dfdfbf;"&gt;x&lt;/span&gt; =&amp;gt; &lt;span style="color: #dfdfbf;"&gt;x&lt;/span&gt;.&lt;span style="color: #dfdfbf;"&gt;Value&lt;/span&gt;)));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-6784881069084485906?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/6784881069084485906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2009/09/linq-group-by.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/6784881069084485906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/6784881069084485906'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2009/09/linq-group-by.html' title='Linq Group By'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-3531810288345862815</id><published>2009-08-20T12:23:00.001+02:00</published><updated>2009-08-20T12:24:31.714+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google Reader'/><title type='text'>Send to [blog] from GReader - had to try this</title><content type='html'>&lt;a href="http://feedproxy.google.com/%7Er/blogspot/dtKx/%7E3/bbKxbmm1Pqs/flurry-of-features-for-feed-readers.html"&gt;A flurry of features for feed readers&lt;/a&gt;: "&lt;p&gt;Since our last &lt;a href="http://googlereader.blogspot.com/2009/07/following-liking-and-people-searching.html"&gt;big launch&lt;/a&gt;, we've been thinking about ways to help our users better share, discover, and consume content in Reader. Today, I'm happy to announce several new features that we hope will further improve the way you use Reader.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Send to...&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt="Send to menu" src="http://2.bp.blogspot.com/_QriD2y6VZ-Y/SoNMxnP6BHI/AAAAAAAAFJ8/7frn14aFZck/s400/send-to.png" style="float: right; padding-left: 5px;" height="94" width="220" /&gt;We've made it easier to share posts you like to Blogger, Twitter, Facebook, and more, with our new 'Send to' feature. (Incidentally, Blogger is celebrating its &lt;a href="http://buzz.blogger.com/2009/06/blogger-is-turning-10.html"&gt;tenth birthday&lt;/a&gt; this month, and we're hoping our friends there will like this little birthday present.)&lt;br /&gt;&lt;br /&gt;Just head over to the &lt;a href="http://www.google.com/reader/settings?display=item-links"&gt;settings page&lt;/a&gt;, and enable the services you want to use. If your favorite service isn't listed (and you're feeling extra geeky), you can create your own 'Send to' link with a URL template.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_QriD2y6VZ-Y/SoNMcIwFR4I/AAAAAAAAFJ0/9zbc7IZJbhE/s1600-h/settings.png"&gt;&lt;img alt="Send to tab on the settings page" src="http://3.bp.blogspot.com/_QriD2y6VZ-Y/SoNMcIwFR4I/AAAAAAAAFJ0/9zbc7IZJbhE/s400/settings.png" border="0" height="198" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;To share an item on one of your sites, simply click the 'Send to' button and choose your service. If you're into keyboard shortcuts, 'shift-t' will do the same.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Feeds from people you follow&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;When we added following, we tried to make it easier to find and follow people who share similar interests. Now we've gone even further, and made it possible for you to subscribe directly to the blogs, photos, or Twitter updates that anyone you're following has included on their Google profile.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;br /&gt;&lt;img alt="Feeds from Mihai" src="http://4.bp.blogspot.com/_QriD2y6VZ-Y/SoNNJ2i3ifI/AAAAAAAAFKE/NuWsjrNq0Rg/s1600/feeds.png" height="288" width="430" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;To quickly subscribe to these sites, click the '&lt;a href="http://www.google.com/reader/view/#directory-page/3"&gt;From people you follow&lt;/a&gt;' tab on the 'Browse for stuff' page.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;More control for mark all as read&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt="Mark all as read menu" src="http://1.bp.blogspot.com/_QriD2y6VZ-Y/SoNOrDxzQ5I/AAAAAAAAFKM/6aYLQKIRfO0/s400/markallasread.png" style="float: right; padding-left: 5px;" height="119" width="200" /&gt;We know people can be overwhelmed by too many unread items, and sometimes only want to see recent posts. The 'Mark all as read' button now has a menu that lets you choose to only mark items as read if they're older than your specified time frame. A tip of the hat to &lt;a href="http://nick.typepad.com/"&gt;Nick Bradbury&lt;/a&gt; who pioneered this '&lt;a href="http://nick.typepad.com/blog/2007/11/feed-overload-h.html"&gt;panic button&lt;/a&gt;' feature.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Finally, a few small tweaks in this release:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;When you expand an item in &lt;a href="http://www.google.com/reader/view/#stream/user%2F-%2Fstate%2Fcom.google%2Fbroadcast-friends-comments"&gt;comment view&lt;/a&gt;, you now get the full set of actions, enabling you to share, like, and star items without leaving comment view.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;We added a 'Feeds' start-page &lt;a href="http://www.google.com/reader/isettings"&gt;option&lt;/a&gt; for the iPhone/Android/Pre mobile interface, so you can see a list of your subscriptions when you sign in.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;There is now an option to show notes when &lt;a href="http://www.google.com/reader/clip-creator/user/-/state/com.google/broadcast"&gt;embedding&lt;/a&gt; your shared items on other pages as clips.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;As always, if you have feedback, please head over to &lt;a href="http://groups.google.com/group/google-reader-help"&gt;our help group&lt;/a&gt;, &lt;a href="http://twitter.com/googlereader"&gt;Twitter&lt;/a&gt;, or &lt;a href="http://getsatisfaction.com/google/products/google_google_reader"&gt;Get Satisfaction&lt;/a&gt;.&lt;/p&gt;&lt;div&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/17412960-7489479312959422092?l=googlereader.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://feeds.feedburner.com/%7Eff/blogspot/dtKx?a=bbKxbmm1Pqs:-BlObWm_lS8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/%7Eff/blogspot/dtKx?i=bbKxbmm1Pqs:-BlObWm_lS8:V_sGLiPBpWU" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/%7Er/blogspot/dtKx/%7E4/bbKxbmm1Pqs" height="1" width="1" /&gt;"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-3531810288345862815?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://feedproxy.google.com/~r/blogspot/dtKx/~3/bbKxbmm1Pqs/flurry-of-features-for-feed-readers.html' title='Send to [blog] from GReader - had to try this'/><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/3531810288345862815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2009/08/send-to-blog-from-greader-had-to-try.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/3531810288345862815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/3531810288345862815'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2009/08/send-to-blog-from-greader-had-to-try.html' title='Send to [blog] from GReader - had to try this'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_QriD2y6VZ-Y/SoNMxnP6BHI/AAAAAAAAFJ8/7frn14aFZck/s72-c/send-to.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-2367340154587857070</id><published>2009-07-29T21:02:00.001+02:00</published><updated>2009-07-29T21:02:20.878+02:00</updated><title type='text'>string.RemoveRegex(pattern)</title><content type='html'>&lt;p&gt;&lt;/p&gt;  &lt;div style="font-family: consolas; background: black; color: white; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;[&lt;span style="color: #2b91af"&gt;Test&lt;/span&gt;]&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #3e60fd"&gt;public&lt;/span&gt; &lt;span style="color: #3e60fd"&gt;void&lt;/span&gt; &lt;span style="color: #a7c1ed"&gt;ShouldRemoveRegex&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160; &lt;span style="color: #3e60fd"&gt;const&lt;/span&gt; &lt;span style="color: #3e60fd"&gt;string&lt;/span&gt; &lt;span style="color: #a7c1ed"&gt;stringWithListNumbers&lt;/span&gt; &lt;span style="color: aqua"&gt;=&lt;/span&gt; &lt;span style="color: #d200d2"&gt;&amp;quot;This is a #9: string with #10: list numbers.&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;&lt;span style="color: aqua"&gt;.&lt;/span&gt;&lt;span style="color: #a7c1ed"&gt;AreEqual&lt;/span&gt;(&lt;span style="color: #d200d2"&gt;&amp;quot;This is a&amp;#160; string with&amp;#160; list numbers.&amp;quot;&lt;/span&gt;, &lt;span style="color: #a7c1ed"&gt;stringWithListNumbers&lt;/span&gt;&lt;span style="color: aqua"&gt;.&lt;/span&gt;&lt;span style="color: #a7c1ed"&gt;RemoveRegex&lt;/span&gt;(&lt;span style="color: #d200d2"&gt;&amp;quot;#[0-9]*:&amp;quot;&lt;/span&gt;));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;div style="font-family: consolas; background: black; color: white; font-size: 10pt"&gt;     &lt;p style="margin: 0px"&gt;&lt;span style="color: #3e60fd"&gt;public&lt;/span&gt; &lt;span style="color: #3e60fd"&gt;static&lt;/span&gt; &lt;span style="color: #3e60fd"&gt;string&lt;/span&gt; &lt;span style="color: #a7c1ed"&gt;RemoveRegex&lt;/span&gt;(&lt;span style="color: #3e60fd"&gt;this&lt;/span&gt; &lt;span style="color: #3e60fd"&gt;string&lt;/span&gt; &lt;span style="color: #a7c1ed"&gt;arg&lt;/span&gt;, &lt;span style="color: #3e60fd"&gt;string&lt;/span&gt; &lt;span style="color: #a7c1ed"&gt;pattern&lt;/span&gt;)&lt;/p&gt;      &lt;p style="margin: 0px"&gt;{&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #3e60fd"&gt;var&lt;/span&gt; &lt;span style="color: #a7c1ed"&gt;tagRegex&lt;/span&gt; &lt;span style="color: aqua"&gt;=&lt;/span&gt; &lt;span style="color: #3e60fd"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Regex&lt;/span&gt;(&lt;span style="color: #a7c1ed"&gt;pattern&lt;/span&gt;);&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #3e60fd"&gt;return&lt;/span&gt; &lt;span style="color: #a7c1ed"&gt;tagRegex&lt;/span&gt;&lt;span style="color: aqua"&gt;.&lt;/span&gt;&lt;span style="color: #a7c1ed"&gt;Replace&lt;/span&gt;(&lt;span style="color: #a7c1ed"&gt;arg&lt;/span&gt;, &lt;span style="color: #3e60fd"&gt;string&lt;/span&gt;&lt;span style="color: aqua"&gt;.&lt;/span&gt;&lt;span style="color: #a7c1ed"&gt;Empty&lt;/span&gt;);&lt;/p&gt;      &lt;p style="margin: 0px"&gt;}&lt;/p&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-2367340154587857070?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/2367340154587857070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2009/07/stringremoveregexpattern.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/2367340154587857070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/2367340154587857070'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2009/07/stringremoveregexpattern.html' title='string.RemoveRegex(pattern)'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-5540607419725498680</id><published>2009-07-29T20:33:00.001+02:00</published><updated>2009-07-29T20:33:54.104+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='extension method'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='string'/><title type='text'>string.Remove(string toReplace)</title><content type='html'>&lt;div style="font-family: consolas; background: black; color: white; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Alias for 'ReplaceWithEmpty'&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #3e60fd"&gt;public&lt;/span&gt; &lt;span style="color: #3e60fd"&gt;static&lt;/span&gt; &lt;span style="color: #3e60fd"&gt;string&lt;/span&gt; &lt;span style="color: #a7c1ed"&gt;Remove&lt;/span&gt;(&lt;span style="color: #3e60fd"&gt;this&lt;/span&gt; &lt;span style="color: #3e60fd"&gt;string&lt;/span&gt; &lt;span style="color: #a7c1ed"&gt;arg&lt;/span&gt;, &lt;span style="color: #3e60fd"&gt;string&lt;/span&gt; &lt;span style="color: #a7c1ed"&gt;toReplace&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #3e60fd"&gt;return&lt;/span&gt; &lt;span style="color: #a7c1ed"&gt;arg&lt;/span&gt;&lt;span style="color: aqua"&gt;.&lt;/span&gt;&lt;span style="color: #a7c1ed"&gt;ReplaceWithEmpty&lt;/span&gt;(&lt;span style="color: #a7c1ed"&gt;toReplace&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-5540607419725498680?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/5540607419725498680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2009/07/stringremovestring-toreplace.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/5540607419725498680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/5540607419725498680'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2009/07/stringremovestring-toreplace.html' title='string.Remove(string toReplace)'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-7264164970758068064</id><published>2009-07-21T15:27:00.003+02:00</published><updated>2009-07-21T15:39:50.230+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='extension method'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='string'/><title type='text'>string.ReplaceWithEmpty(string toReplace)</title><content type='html'>&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:courier new;"&gt;[Test]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;public void ShouldReplaceWithEmpty()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;  const string arg = "This is a string";&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  Assert.AreEqual("This is a", arg.ReplaceWithEmpty(" string"));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;public static string ReplaceWithEmpty(this string arg, string toReplace)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  return arg.Replace(toReplace, string.Empty);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-7264164970758068064?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/7264164970758068064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2009/07/stringreplacewithemptystring-toreplace.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/7264164970758068064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/7264164970758068064'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2009/07/stringreplacewithemptystring-toreplace.html' title='string.ReplaceWithEmpty(string toReplace)'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-8925948137872143616</id><published>2009-06-30T10:56:00.004+02:00</published><updated>2009-06-30T11:37:10.885+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='BankInvest'/><category scheme='http://www.blogger.com/atom/ns#' term='Alt.Net Oresund'/><category scheme='http://www.blogger.com/atom/ns#' term='xUnit.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='MSTest'/><category scheme='http://www.blogger.com/atom/ns#' term='NUnit'/><category scheme='http://www.blogger.com/atom/ns#' term='MbUnit'/><title type='text'>Alt.Net Oresund Meeting at ITU 25th of June</title><content type='html'>&lt;span style="font-family:trebuchet ms;"&gt;We weren't that many people, but in return Martin N Jensen held a great presentation showing the new features of NUnit and how they compare to MbUnit and xUnit.Net.&lt;br /&gt;&lt;br /&gt;I definitely learned a few new tricks that I'm eager to put to practice.&lt;br /&gt;&lt;br /&gt;These include&lt;br /&gt;&lt;/span&gt;&lt;ul style="font-family: trebuchet ms;"&gt;&lt;li&gt;BDD style constraints (improved readability)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Theories (specifications that run several combinations of input)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Generic test fixtures (run the same test for chosen implementations of an interface)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:trebuchet ms;"&gt;I've worked with MbUnit for about a year now, and before that MSTest for several years. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;From 2001 to sometime 2005, I however used NUnit, and with the new additions and a new employer, maybe we'll see each other again soon.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;I haven't fully grasped the theory concept, but will look into it. This seems like a good place to start: &lt;/span&gt;&lt;a style="font-family: trebuchet ms;" href="http://www.google.se/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=5&amp;amp;url=http%3A%2F%2Fnitsan.org%2F%257Emaratb%2Fpubs%2Ftheory_case_studies.pdf&amp;amp;ei=w9lJSvG8AZqwsgaPvrC8BQ&amp;amp;usg=AFQjCNEnvUsZhcznxgi9PmIFoMghp-k6mg&amp;amp;sig2=AIkYCd4WMir3PJ9rCzKO_Q"&gt;Theories in Practice: Easy-to-Write Specifications that Catch Bugs&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;A new employer? After having three really good offers to consider, I finally made up my mind this weekend. I will start working with the very same Martin N Jensen, and the other guys at BankInvest this autumn. I'm very excited, and eager to produce great financial software with great people.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-8925948137872143616?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/8925948137872143616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2009/06/altnet-oresund-meeting-at-itu-25th-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/8925948137872143616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/8925948137872143616'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2009/06/altnet-oresund-meeting-at-itu-25th-of.html' title='Alt.Net Oresund Meeting at ITU 25th of June'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-6271500318576054177</id><published>2009-06-16T16:30:00.003+02:00</published><updated>2009-06-16T16:46:09.988+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fired'/><title type='text'>Fired</title><content type='html'>"&lt;span style="font-weight: bold;"&gt;Getting Fired Can Be A Positive Career Move&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;[...] It means that the job isn't right for you.&lt;br /&gt;&lt;br /&gt;I have been fired five times, and each time my career took a step forward. [...]"&lt;br /&gt;&lt;br /&gt;- Paul Arden in It's Not How Good You Are, It's How Good You Want To Be&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;"&lt;span style="font-weight: bold;"&gt;Fired? It's the Best Thing That Can Happen To You.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;[...] You hated your situation anyway.&lt;br /&gt;&lt;br /&gt;You must begin again.&lt;br /&gt;&lt;br /&gt;It's a wonderful opportunity for you.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;Literally, they let you go.&lt;/span&gt;"&lt;br /&gt;- Paul Arden in Whatever You Think, Think the Opposite.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;More about these books from a far more famous programmer than me can be read here: &lt;a href="http://www.codinghorror.com/blog/archives/001177.html"&gt;http://www.codinghorror.com/blog/archives/001177.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-6271500318576054177?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/6271500318576054177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2009/06/fired.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/6271500318576054177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/6271500318576054177'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2009/06/fired.html' title='Fired'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6425530.post-6095804939842670984</id><published>2009-06-11T23:15:00.001+02:00</published><updated>2009-06-11T23:34:17.423+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='renaissance developer'/><category scheme='http://www.blogger.com/atom/ns#' term='JAOO'/><title type='text'>What's a "renaissance developer"?</title><content type='html'>Since I claim to be a "renaissance developer", I think a link to what that means to me is suitable: &lt;a href="http://www.coderenaissance.com/2008/11/renaissance-developer.html"&gt;The Renaissance Developer&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;At the JAOO conference 2006, the same thing was called "helstøbt udvikler".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6425530-6095804939842670984?l=martinsaspects.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://martinsaspects.blogspot.com/feeds/6095804939842670984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://martinsaspects.blogspot.com/2009/06/since-i-claim-to-be-renaissance.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/6095804939842670984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6425530/posts/default/6095804939842670984'/><link rel='alternate' type='text/html' href='http://martinsaspects.blogspot.com/2009/06/since-i-claim-to-be-renaissance.html' title='What&apos;s a &quot;renaissance developer&quot;?'/><author><name>MartinRL</name><uri>http://www.blogger.com/profile/17794301976274938698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_MNEvbrTT5dI/SrqEZ2Q4lPI/AAAAAAAAAbw/KxYkx2HEeBA/S220/mrl.jpg'/></author><thr:total>0</thr:total></entry></feed>
