<feed xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-PL">
    <title>Adventures in coding</title>
    <link rel="self" type="application/atom+xml" href="http://dkowalski.com/blog/Atom.aspx" />
    <subtitle type="html">random thoughts about being a developer</subtitle>
    <id>http://dkowalski.com/blog/Default.aspx</id>
    <author>
        <name>Dawid Kowalski</name>
        <uri>http://dkowalski.com/blog/Default.aspx</uri>
    </author>
    <generator uri="http://subtextproject.com" version="Subtext Version 2.1.2.2">Subtext</generator>
    <updated>2011-08-09T10:06:09Z</updated>
    <entry>
        <title>C# Web Scanner</title>
        <link rel="alternate" type="text/html" href="http://dkowalski.com/blog/archive/2011/06/12/c-web-scanner.aspx" />
        <id>http://dkowalski.com/blog/archive/2011/06/12/c-web-scanner.aspx</id>
        <published>2011-06-12T20:46:02Z</published>
        <updated>2011-08-09T10:06:09Z</updated>
        <content type="html">&lt;a href="http://dkowalski.com/images/dkowalski_com/blog/Windows-Live-Writer/a5b26c3f108a_13094/DSCN0728.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 16px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="DSCN0728" border="0" alt="DSCN0728" align="right" src="http://dkowalski.com/images/dkowalski_com/blog/Windows-Live-Writer/a5b26c3f108a_13094/DSCN0728_thumb.jpg" width="240" height="244" /&gt;&lt;/a&gt;   &lt;h5 align="justify"&gt;Sometimes you might have a need to get some specific information from tag soup of Internet. You have two options here – either to use some &lt;a href="http://stackoverflow.com/questions/1039775/anybody-knows-a-good-extendable-open-source-web-crawler"&gt;existing solution&lt;/a&gt; or simply write your own. Generally first option seems more reasonable (why to invent another wheel), but your requirements might be very specific or … it seems like a lot of fun! Since I’ve chosen this second path I’m going to share some of my insights useful particularly for .NET developers.&lt;/h5&gt;  &lt;p&gt;Important: if you need scalable, large, google like spider then you should really consider looking at &lt;a href="http://stackoverflow.com/questions/1039775/anybody-knows-a-good-extendable-open-source-web-crawler"&gt;existing solutions&lt;/a&gt;. My thoughts are relevant for scanner able to process few hundreds pages per minute on a single machine, while provided a list of root nodes to scan.&lt;/p&gt;  &lt;p&gt;When I mentioned at &lt;a href="http://www.meetup.com/london-software-craftsmanship/"&gt;Software Craftsman meeting&lt;/a&gt; that now I’m writing software scanner guy sitting next to me looked at me with disbelief and said “Dude, 1995 is over”. There is always a question on whether to create something from scratch to perfectly suit your needs in opposite to using ready made solution. There is gold sentence that every consultant is overusing and it is "that depends”. In past I was a part of a team who in two years successfully crafted and implemented ERP solution. Previous implementation of ready made software failed miserably. Ok, enough of philosophy, let’s get down to business.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Getting a web page.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Is easy like this:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:4e542029-83f4-471b-a2c0-accd193dade5" class="wlWriterEditableSmartContent"&gt;&lt;pre style="background-color:#FFFFFF;overflow: auto;"&gt;&lt;span style="color: #000000;"&gt;    var webRequest &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (HttpWebRequest)WebRequest.Create(url);
    webRequest.Method &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;GET&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;            
    webRequest.UserAgent &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Mozilla/5.0 (compatible; mycrawler/1.0)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;
    response &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; webRequest.GetResponse();&lt;/span&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;

&lt;p&gt;Then you just need to GetResponseStream on your response object, handle all exceptions, check content type (we prefer something that contains text/html) and we can parse our text. But…&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Regular Expressions are not best solution.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s usually first thought you get when approaching this problem. Looking for &lt;strong&gt;href &lt;/strong&gt;seems like piece of cake. But it’s not – I’m not going to dig into this topic – I think &lt;a href="http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags"&gt;best answer on StackOverflow&lt;/a&gt; is going to convince you, if not check Jeff Atwood &lt;a href="http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html"&gt;post&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;So what is our quick and lazy alternative ? Mine was &lt;a href="http://htmlagilitypack.codeplex.com/"&gt;HtmlAgilityPack&lt;/a&gt;. What is it?&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p align="justify"&gt;&lt;font style="background-color: #ffffff"&gt;&lt;em&gt;This is an agile HTML parser that builds a read/write DOM and supports plain XPATH or XSLT (you actually don't HAVE to understand XPATH nor XSLT to use it, don't worry...). It is a .NET code library that allows you to parse "out of the web" HTML files. The parser is very tolerant with "real world" malformed HTML. The object model is very similar to what proposes System.Xml, but for HTML documents (or streams).&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;Getting all anchor tags from a webpage is as easy as:&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:cb1ab711-104c-465a-8d40-29ffc34d91c2" class="wlWriterEditableSmartContent"&gt;&lt;pre style="background-color:White;overflow: hidden;"&gt;&lt;span style="color: #000000;"&gt;    document.DocumentNode.SelectNodes(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;//a&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;

&lt;p&gt;&lt;strong&gt;Looking for links.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not only &amp;lt;A /&amp;gt; tags are links. &amp;lt;AREA /&amp;gt; as well (inside &amp;lt;MAP /&amp;gt;). You will have to follow frames and pages with instant redirection through META refresh tag. In all these cases HtmlAgilityPack is very helpful:&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:a2f1d0ae-6317-42b3-8098-b47c8c476209" class="wlWriterEditableSmartContent"&gt;&lt;pre style="background-color:#FFFFFF;overflow: auto;"&gt;&lt;span style="color: #000000;"&gt;    document.DocumentNode
            .SelectNodes(&lt;/span&gt;&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;//a|//area&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)
            .Select(x &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; x.Attributes[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;href&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);
    
    document.DocumentNode
            .SelectNodes(&lt;/span&gt;&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;//frame|//iframe&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)
            .Select(x &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; x.Attributes[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;src&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;]);&lt;/span&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;

&lt;p&gt;*code above is missing null checks etc.&lt;/p&gt;

&lt;p&gt;Pages contain both absolute and relative URLs, we really don’t want to analyze strings to deal with that kind of stuff. &lt;a href="http://msdn.microsoft.com/en-us/library/system.uri.aspx"&gt;System.Uri&lt;/a&gt; comes to the rescue. Some useful code snippets utilizing this class:&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:5b361b8b-a3cc-4173-b2f9-c3e1b0365e9d" class="wlWriterEditableSmartContent"&gt;&lt;pre style="background-color:#FFFFFF;overflow: auto;"&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Is our text an absolute url ?&lt;/span&gt;&lt;span style="color: #008000;"&gt;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;    Uri url;
    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (Uri.TryCreate(urlCandidate, UriKind.Absolute, &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;out&lt;/span&gt;&lt;span style="color: #000000;"&gt; url)) &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; url;
    
    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; If not - is it a relative url ? 
    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Try to crate url on a base of url from this page &lt;/span&gt;&lt;span style="color: #008000;"&gt;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (Uri.TryCreate(baseUrl, urlCandidate, &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;out&lt;/span&gt;&lt;span style="color: #000000;"&gt; url)) &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; url;&lt;/span&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Breadth first crawling ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For simple scanner your might prefer &lt;a href="http://en.wikipedia.org/wiki/Breadth-first_search"&gt;breadth first&lt;/a&gt; crawling. Probably you will need two lists – one list containing pages to visit, and other list containing already visited pages (we don’t want to get into loop). Even for simple solutions though we need some degree of parallelism – downloading page by page can be very slow task.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to stop ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It depends on your needs – but if you haven’t decided to create a "better google” than probably for example you want to scan one specific domain. Here again class Uri and especially Uri.IsBaseOf() method is very useful, we can check every link before adding it to “to visit” list. But we should definitely create some other stop criteria – like visit counter of specific URLs (calendar controls are sometimes a trap for crawler), time spent inside specific domain etc. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Getting information out of HTML soup.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Usually you are building your scanner to get something specific, looking for specific phrase, for specific link, element, to download images etc. And again HtmlAgilityPack is a bless here (seriously, why would you do this with Regular Expressions?). For example:&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:27f66712-c0b4-4beb-8ce0-f1170accff02" class="wlWriterEditableSmartContent"&gt;&lt;pre style="background-color:#FFFFFF;overflow: auto;"&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; getting all alt nodes of images&lt;/span&gt;&lt;span style="color: #008000;"&gt;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;    document.DocumentNode.SelectNodes(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;//img[@alt]&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Should I do it ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Well again, it depends (I’m a good material for consultant :-). If you want to crawl and parse tens of thousands of pages in a minute, then probably not. Parallel computing is note an easy piece of cake, and it was well thought and developed by many very smart people – and you can get results of their work as an open source (not in C# though). But if you want to scan reasonable amount of pages, you want to get specific information and robots.txt on your site of destination is not denying it, then go ahead. And good luck.&lt;/p&gt;&lt;img src="http://dkowalski.com/blog/aggbug/41.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>Oslo is full of developers</title>
        <link rel="alternate" type="text/html" href="http://dkowalski.com/blog/archive/2011/02/19/oslo-is-full-of-developers.aspx" />
        <id>http://dkowalski.com/blog/archive/2011/02/19/oslo-is-full-of-developers.aspx</id>
        <published>2011-02-19T20:08:12Z</published>
        <updated>2011-06-09T11:59:30Z</updated>
        <content type="html">&lt;a href="http://dkowalski.com/images/dkowalski_com/blog/Windows-Live-Writer/6556ea8cd60a_10487/programming_2.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 2px 0px 13px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="programming" border="0" alt="programming" align="right" src="http://dkowalski.com/images/dkowalski_com/blog/Windows-Live-Writer/6556ea8cd60a_10487/programming_thumb.jpg" width="244" height="229" /&gt;&lt;/a&gt;   &lt;p&gt;And I mean full, I don’t have any hard data to support my statement but my one month experience here and comparison with my home city (Poznan) that is same size as Oslo. And even if % of people who are typing lines of code here is not really higher at least they are way more active and passionate of what they do.&lt;/p&gt;  &lt;p&gt;.NET Users, Windows Phone Developer Community, The Oslo Lean Meetup, Extreme Programming Group, Java Developers, heck! - there is even a Delphi users group. No to mention that local software houses, consulting firms, etc. are really interested in growth of their employees and they actively invite speakers outside of Norway. &lt;/p&gt;  &lt;p&gt;I have visited &lt;a title="http://open.bekk.no/2011/01/18/test-driven-development-with-javascript-and-node-js-bekk/" href="http://open.bekk.no/2011/01/18/test-driven-development-with-javascript-and-node-js-bekk/"&gt;Test-Driven Development with JavaScript and node.js&lt;/a&gt; organized in an office of one of Norway’s software houses (60 people attended, and right after there was an XP meeting with more then 100 registered – quite impressive). First speaker was Norwegian, but fortunately after a short survey whether there are or not non Norwegian people at the public they decided to have this talk in English (it turned out that only for me – thank you :-)!). BTW Norway is truly amazing country where everyone, and I mean everyone can speak English (yes, even 80 years old people and drug addicts). I met some really nice people there, very passionate about what they do. &lt;/p&gt;  &lt;p align="justify"&gt;This week however I experienced something completely new. I attended a meeting that was a form of &lt;a href="http://codingdojo.org/"&gt;Coding Dojo&lt;/a&gt;. According to Coding Dojo website it is:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;&lt;em&gt;.. a meeting where a bunch of coders get together to work on a programming challenge. They are there have fun and to engage in DeliberatePractice in order to improve their skills.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;Host of this meeting was &lt;a href="http://www.jaggersoft.com"&gt;Jon Jagger&lt;/a&gt;, a truly passionate guy who created &lt;a title="http://www.cyber-dojo.com/" href="http://www.cyber-dojo.com/"&gt;http://www.cyber-dojo.com/&lt;/a&gt;. As he states on this webiste:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;I built CyberDojo so you can practice and learn about:&lt;/em&gt;&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;&lt;em&gt;coding and test driven development&lt;/em&gt; &lt;/li&gt;      &lt;li&gt;&lt;em&gt;team dynamics and collaboration&lt;/em&gt; &lt;/li&gt;   &lt;/ul&gt; &lt;/blockquote&gt;  &lt;p&gt;Now please try to imagine, around 8 notebooks, pair programming, 5 minutes of time between group change, C#, C, Java, Python, Ruby and one Roman Numbers problem :-) It might seem like a chaos at the beginning, and yes, it was hard to get to the working solution, but for me lesson of importance of red, green development, leaving your code in a state that work can be continued right after you left, getting closer to the solution in a small steps was really valuable.&lt;/p&gt;  &lt;p&gt;If you can ever have chance to experience such a thing, I do strongly encourage you to do this, you are going to learn a lot about your team working skills.&lt;/p&gt;&lt;img src="http://dkowalski.com/blog/aggbug/40.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>Occam&amp;rsquo;s Razor &amp;amp; computer programming</title>
        <link rel="alternate" type="text/html" href="http://dkowalski.com/blog/archive/2011/02/03/occamrsquos-razor-amp-computer-programming.aspx" />
        <id>http://dkowalski.com/blog/archive/2011/02/03/occamrsquos-razor-amp-computer-programming.aspx</id>
        <published>2011-02-03T14:36:10Z</published>
        <updated>2011-06-09T11:59:34Z</updated>
        <content type="html">&lt;p&gt;&lt;a href="http://dkowalski.com/images/dkowalski_com/blog/Windows-Live-Writer/Occams-razor_B225/razor_2.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 11px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="razor" border="0" alt="razor" align="right" src="http://dkowalski.com/images/dkowalski_com/blog/Windows-Live-Writer/Occams-razor_B225/razor_thumb.jpg" width="265" height="163" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;While thinking about &lt;a href="http://dkowalski.com/blog/archive/2010/10/30/the-toyota-way-vs-computer-programming-round-1.aspx"&gt;Toyota Way&lt;/a&gt; it is hard not realize that many of principles that driven this company success are not really something new. They were “alive” for many centuries - since mankind ever tried to conduct any bigger project. One of them is &lt;strong&gt;simplicity – &lt;/strong&gt;in Toyota there is no place for bureaucratic, overblown mindset. &lt;/p&gt;  &lt;p&gt;Recently I stumbled upon &lt;a href="http://en.wikipedia.org/wiki/Occam's_razor"&gt;&lt;strong&gt;Occam’s Razor law&lt;/strong&gt;&lt;/a&gt;, also known as Latin expression &lt;em&gt;Lex parsimoniae. &lt;/em&gt;It is one of those rules of thumbs that driven many outstanding minds of few last centuries (including Albert Einstein, Leonhard Euler, Isaac Newton).&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;The Principle of Plurality&lt;/strong&gt; - Plurality should not be posited without necessity       &lt;br /&gt;&lt;strong&gt;The Principle of Parsimony&lt;/strong&gt; - It is pointless to do with more what is done with less&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="center"&gt;Although they seem obvious, &lt;strong&gt;The Principle of Parsimony&lt;/strong&gt; is something that can be really taken into hearts of many software developers. Creating overblown solutions just to shoot “the fly” is a common problem – and if you have a problem first step is to admit it ;-) &lt;a title="CodeComplete graphics" href="http://www.cc2e.com/"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 16px 16px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="overblown" border="0" alt="overblown" align="left" src="http://dkowalski.com/images/dkowalski_com/blog/Windows-Live-Writer/Occams-razor_B225/overblown_3.png" width="428" height="140" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;First sin is to create architecture way to complex for current project. Do we really need DDD in simple web app ? Maybe &lt;strong&gt;Unit Of Work&lt;/strong&gt; pattern with conjunction of &lt;strong&gt;Linq To Sql &lt;/strong&gt;is enough ?&lt;/p&gt;  &lt;p align="center"&gt;Another problem is adding features that seem “necessary”, but in the end our client is never going to use them because from his perspective they are useless. This subject is mostly covered with Agile movement, but still it is a quite common behavior among software developers. &lt;/p&gt;  &lt;p align="center"&gt;I truly believe that this law is really accurate in almost every aspect of developer’s life – e.g. documentation should be concise, and should cover generalities without getting lost in details. &lt;/p&gt;&lt;img src="http://dkowalski.com/blog/aggbug/39.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>The Toyota Way vs Computer Programming, part 2</title>
        <link rel="alternate" type="text/html" href="http://dkowalski.com/blog/archive/2010/11/15/toyota-way-adaptation-to-software-development-part-2.aspx" />
        <id>http://dkowalski.com/blog/archive/2010/11/15/toyota-way-adaptation-to-software-development-part-2.aspx</id>
        <published>2010-11-15T23:13:53Z</published>
        <updated>2011-06-09T11:59:39Z</updated>
        <content type="html">&lt;p&gt;&lt;a href="http://dkowalski.com/images/dkowalski_com/blog/WindowsLiveWriter/c2d6d41219c8_82C/stop.png"&gt;&lt;img style="border-right-width: 0px; margin: 5px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="stop" border="0" alt="stop" align="right" src="http://dkowalski.com/images/dkowalski_com/blog/WindowsLiveWriter/c2d6d41219c8_82C/stop_thumb.png" width="190" height="240" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;There are times we do know that we should stop - we are in a middle of creative process, things are going great, suddenly something nasty is showing it’s face – but we do not stop to perform a plastic surgery, we merely cover it with makeup and we do go on chased by deadlines, “I will do it later” or “That’s not such a big deal” thoughts. I’m not talking about bugs here, we have to fix them in order for code to work – I think about ugly pieces of code, badly structured, copy – paste solutions etc. We all have been there right ? How many times we actually did went back to fix those problems ? How many of those stabbed us in a back just at worst time possible ?&lt;/p&gt;  &lt;p&gt;While reading “The Toyota Way” I was fascinated by one principle and how much does it relates to software development profession – “&lt;strong&gt;Build a culture of stopping to fix problems, to get quality right the first time&lt;/strong&gt;”. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“&lt;strong&gt;Quality takes precedence (Jidoka). Any employee in the Toyota Production System has the authority to stop the process to signal a quality issue&lt;/strong&gt;.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;That’s right, one person can stop whole production line at a first sight of a problem. This is one of the milestones of Toyota success and at the first moment it might seem ridiculous. So what happens next ? Problem is solved as quickly as possible by using all strengths of production group. &lt;/p&gt;  &lt;p&gt;In our software development world stopping our coding process and gathering all team members seems so easy and cheap – yet we do still have this “I will do it later” mind set. But it’s time to face the truth - this actually doesn’t work, we are never going to get back to this wrong piece of code unless it’s going to hurt us badly. So maybe we should stop cheating ourselves and instead adopt some good principles from others ? &lt;/p&gt;&lt;img src="http://dkowalski.com/blog/aggbug/38.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>The Toyota Way vs Computer Programming, round 1</title>
        <link rel="alternate" type="text/html" href="http://dkowalski.com/blog/archive/2010/10/30/the-toyota-way-vs-computer-programming-round-1.aspx" />
        <id>http://dkowalski.com/blog/archive/2010/10/30/the-toyota-way-vs-computer-programming-round-1.aspx</id>
        <published>2010-10-30T00:32:55Z</published>
        <updated>2011-06-09T11:59:43Z</updated>
        <content type="html">&lt;p&gt;&lt;a href="http://dkowalski.com/images/dkowalski_com/blog/WindowsLiveWriter/TheToyotaWayVSComputerProgramminground1_828/blog_post_head_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 15px; display: inline; border-top: 0px; border-right: 0px" title="blog_post_head" border="0" alt="blog_post_head" align="right" src="http://dkowalski.com/images/dkowalski_com/blog/WindowsLiveWriter/TheToyotaWayVSComputerProgramminground1_828/blog_post_head_thumb.jpg" width="202" height="240" /&gt;&lt;/a&gt;One of the side effects of aging and getting wiser (except of getting fatter and grumpier)  is gaining ability of discovering parallels and deeper meanings. Notion of giving and receiving, how every single small thing done by someone shows how he/she does everything else or even how starting your day in bad mood affects our whole day. But I’m not here to write about some funky New Age stuff, the thing I wanted to share today is my discovery of great knowledge that was coined before first line of code was written (although I’m not actually sure whether it wasn’t &lt;a href="http://en.wikipedia.org/wiki/Punched_card"&gt;punched&lt;/a&gt; around that time). &lt;/p&gt;  &lt;p&gt;We software developers have tendency to put our failures on shoulders of “not enough  time” / “undecided customers” / “bad specs” / “someone before me made a mess here”, but as a core of this problems we do point our fingers at bridges! Yes we do, we are bravely stating that those things whose main purpose is making our daily commute to other side of a river easier, were actually build for plenty of centuries already, whole generations of architects were thinking about every single detail of those constructions, and most importantly it was written and coined how to build them. And we poor software developers are coding for a few decades at most, it is still wild wild west, nothing is straight or settled and we basically have to walk with our eyes blindfolded to finish our jobs. &lt;/p&gt;  &lt;p&gt;But maybe, just maybe, there is knowledge who applies to software creation process pretty well, maybe there are already core values that we can use, maybe there is a parallel world of programming ? Well while reading &lt;a href="http://www.thetoyotaway.org/"&gt;“The Toyota Way” by Jeffrey K. Liker&lt;/a&gt; I had exactly those thoughts. I was fascinated by similarities between our profession and the way Toyota organized their company to become world no. 1 car manufacturer. At first I was skeptical – how on earth ideas how to create a repeatable product can apply to something that was closer to prototyping one single vehicle. After immersing myself into this subject I found out they actually can – and they were partially for example in Agile Movement. &lt;/p&gt;  &lt;p&gt;I hope you liked this teaser post, more in next part of this small series…&lt;/p&gt;&lt;img src="http://dkowalski.com/blog/aggbug/37.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>Autonomous positioning system in a confined space based on MPEG-7 descriptors and physical markers (ARTags)</title>
        <link rel="alternate" type="text/html" href="http://dkowalski.com/blog/archive/2010/06/01/autonomous-positioning-system-in-a-confined-space-based-on-mpeg-7.aspx" />
        <id>http://dkowalski.com/blog/archive/2010/06/01/autonomous-positioning-system-in-a-confined-space-based-on-mpeg-7.aspx</id>
        <published>2010-09-01T00:54:55Z</published>
        <updated>2011-06-09T11:59:46Z</updated>
        <content type="html">&lt;p&gt;I was inspired (by really really great person) to contribute my master thesis to global www heap. If it may actually help even one person then it is more then worth it. My work was finished two years ago, send to a drawer, but maybe someone can use this in process of creating something valuable? I do regret only one thing, it was written in Polish, so it might be an obstacle, but I’m willing to answer any question if someone gets really interested. &lt;/p&gt;  &lt;p&gt;Main idea of my master thesis was to answer a question how to help vision impaired people in environments that haven’t been thought about them in a first place. Since I was always more practically, then theoretically, oriented I decided to create an actual software prototype that can be run in embedded devices (my platform of choice was signal processor Blackfin from Analog Devices). System consisted of camera to gather live data, signal processor to process it and software to decided weather something important for blind person is in front of him. Warnings or information could be send to this person in form of voice commands. &lt;/p&gt;  &lt;p&gt;I decided to check two tracks – first one was using designed for &lt;a href="http://en.wikipedia.org/wiki/Augmented_reality"&gt;Augmented Reality&lt;/a&gt; tags – called &lt;a title="http://www.artag.net/" href="http://www.artag.net/"&gt;ARTags&lt;/a&gt; (if you haven’t seen what Augmented Reality is – I do truly encourage you to see some demos on &lt;a href="http://www.youtube.com/results?search_query=augmented+reality&amp;amp;aq=f"&gt;youtube&lt;/a&gt; – possibilities of this idea are just mind bubbling). Main goal was to put ARTags on some important obstacles (like doors, near stairs etc), and make my software recognize them in real time. As signal processors are designed in terms of power efficiency my software was using library specifically written for small devices (like PDAs, smartphones etc). It is called &lt;a href="http://www.icg.tu-graz.ac.at/Members/daniel/Publications/ARToolKitPlus"&gt;ARToolkitPlus&lt;/a&gt;, and I have ported it for Analog Devices environment needs. Source codes on request. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://dkowalski.com/images/dkowalski_com/blog/WindowsLiveWriter/Autonomouspositioningsysteminaconfinedsp_142E2/artags_blindpeople_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 5px; display: inline; border-top: 0px; border-right: 0px" title="artags_blindpeople" border="0" alt="artags_blindpeople" src="http://dkowalski.com/images/dkowalski_com/blog/WindowsLiveWriter/Autonomouspositioningsysteminaconfinedsp_142E2/artags_blindpeople_thumb.png" width="634" height="225" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;My second idea wasn’t really explored before (or at least Google said so). I was thinking how do describe an image in a way that we can actually tell that in front of us is some specific shape or obstacle. My weapon of choice were &lt;a href="http://en.wikipedia.org/wiki/Visual_descriptors"&gt;Visual Descriptors&lt;/a&gt; from &lt;a href="http://en.wikipedia.org/wiki/MPEG-7"&gt;MPEG-7&lt;/a&gt; standard. I checked two - Color Layout and Edge Histogram. As first was really very tightly tied to specific location (different buildings – different colors), and prone to poor light conditions, the latter gave surprisingly quite good results. Edge Histogram can extract edge distribution in an image, it means it can actually describe shapes of some specific locations. Stairs happened to be very good subject, as their recognition level was very high. As a matter of fact they are a big threat for vision impaired people and I think universal warning system could find a real life usage. How it worked ? Well at first I made pictures of different stairs locations and “described” them using Visual Descriptors. By that we gained a set of attributes with whom we can compare live pictures gathered by camera working as a blind man eyes. Every image captured by signal processors is described using this same descriptors and then compared with database of previously tagged shapes. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://dkowalski.com/images/dkowalski_com/blog/WindowsLiveWriter/Autonomouspositioningsysteminaconfinedsp_142E2/2_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="2" border="0" alt="2" src="http://dkowalski.com/images/dkowalski_com/blog/WindowsLiveWriter/Autonomouspositioningsysteminaconfinedsp_142E2/2_thumb.jpg" width="644" height="267" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;As I mentioned at the beginning of this article I would be very happy if this information can be useful to somebody, instead of laying and catching dust on my hard drive. Maybe you should share your work with world as well, who know what combined knowledge of us all can create ?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dkowalski.com/files/master_thesis_presentation_Dawid_Kowalski.pdf"&gt;Presentation about my master thesis&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dkowalski.com/files/Dawid_Kowalski_master_thesis_artags_MPEG7_descriptors.pdf"&gt;My master thesis&lt;/a&gt;&lt;/p&gt;&lt;img src="http://dkowalski.com/blog/aggbug/36.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>C2C Conference</title>
        <link rel="alternate" type="text/html" href="http://dkowalski.com/blog/archive/2010/03/16/c2c-conference.aspx" />
        <id>http://dkowalski.com/blog/archive/2010/03/16/c2c-conference.aspx</id>
        <published>2010-03-16T18:51:15Z</published>
        <updated>2011-06-09T11:59:50Z</updated>
        <content type="html">&lt;p&gt;This years &lt;a href="http://www.c2c.org.pl/en/default.aspx"&gt;Communities 2 Communities&lt;/a&gt; conference is going to be held 17th of April 2010 at Warsaw. At a glance this is a Microsoft community conference, focused on Microsoft products. It’s divided into 3 paths, .NET, SQL Server and IT professionals. I’m really looking forward to see Hadi Hariri speech “Deep Dive into ASP.NET MVC” as I’m really into this subject recently. Of course there are a lot of others great speakers but for details please visit conference site. &lt;/p&gt;  &lt;p&gt;This year I was involved in it’s organization, so I think I should strongly encourage you to visit it :-)&lt;/p&gt;&lt;img src="http://dkowalski.com/blog/aggbug/35.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>ReadOnly WPF containers</title>
        <link rel="alternate" type="text/html" href="http://dkowalski.com/blog/archive/2010/02/04/readonly-wpf-containers.aspx" />
        <id>http://dkowalski.com/blog/archive/2010/02/04/readonly-wpf-containers.aspx</id>
        <published>2010-02-04T18:20:35Z</published>
        <updated>2011-06-09T11:59:54Z</updated>
        <content type="html">&lt;p&gt;One thing has been really annoying me for a long time – when I was setting IsEnabled property on some WPF container to false all its contained controls automatically became disabled as well. Ok, that really wasn’t a source of my annoyance – it was rather expected. Really frustrating thing is that you are unable to scroll a DataGrid, to copy and paste a text from TextBox etc. One can say – but there is a ReadOnly property – and he’s going to be right, but unfortunately it’s available on only few of these controls. TextBox for instance has an IsReadOnly property and DataGrid control that I’m currently using has a ReadOnly property. &lt;/p&gt;  &lt;p&gt;After a while of googling and finding nothing I decided to do it my way. At first I thought that it will be a great idea to have an attached property on one of container controls. That control could recursively look through all its children’s and decide whether it should be set to ReadOnly or Enabled. Few whiles later I had my code ready but something wasn’t right. When I was trying to iterate through my controls collection it turned out that my container is empty ? But it wasn’t. Ok, in fact it was at that moment, apparently the visual/logical tree is empty until the Window undergoes layout at least once. Now that was a pity. I had an option to do it by utilizing OnContentRendered(EventArgs e) event method but it would rather make my code ugly, dependent and evil.&lt;/p&gt;  &lt;p&gt;Finally I decided do create some extension methods and set this property from code-behind. It’s still something that I’m not proud of, but well, it works. If someone has a better idea please don’t hesitate to write a comment or contact me.&lt;/p&gt;  &lt;p&gt;Some code:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:dc6371b7-9ea8-468b-96b5-a5d3ab1d3a44" class="wlWriterEditableSmartContent"&gt;&lt;pre style="background-color:#FFFFFF;overflow: auto;"&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; ControlsExtensions
{
    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; IsReadOnly(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt; GroupBox gb, &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; isReadOnly)
    {
        RecurseTree(gb, isReadOnly);
    }

    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; more extension methods for other containers...&lt;/span&gt;&lt;span style="color: #008000;"&gt;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;
    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; RecurseTree(FrameworkElement control, 
                                    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; isReadOnly)
    {
        &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt; (var c &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; LogicalTreeHelper.GetChildren(control))
        {                
            var frameworkElement &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; c &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;as&lt;/span&gt;&lt;span style="color: #000000;"&gt; FrameworkElement;
            &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (frameworkElement &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;continue&lt;/span&gt;&lt;span style="color: #000000;"&gt;;

            var tb &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; c &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;as&lt;/span&gt;&lt;span style="color: #000000;"&gt; TextBox;
            &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (tb &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)
            {
                tb.IsReadOnly &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; isReadOnly;
                &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;continue&lt;/span&gt;&lt;span style="color: #000000;"&gt;;
            }

            var dg &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; c &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;as&lt;/span&gt;&lt;span style="color: #000000;"&gt; SomeDataGrid;
            &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (dg &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)
            {
                dg.ReadOnly &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; isReadOnly;
                &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;continue&lt;/span&gt;&lt;span style="color: #000000;"&gt;;
            }

            &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (c &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;is&lt;/span&gt;&lt;span style="color: #000000;"&gt; GroupBox &lt;/span&gt;&lt;span style="color: #000000;"&gt;||&lt;/span&gt;&lt;span style="color: #000000;"&gt; c &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;is&lt;/span&gt;&lt;span style="color: #000000;"&gt; DockPanel &lt;/span&gt;&lt;span style="color: #000000;"&gt;||&lt;/span&gt;&lt;span style="color: #000000;"&gt; c &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;is&lt;/span&gt;&lt;span style="color: #000000;"&gt; Grid 
                &lt;/span&gt;&lt;span style="color: #000000;"&gt;||&lt;/span&gt;&lt;span style="color: #000000;"&gt; c &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;is&lt;/span&gt;&lt;span style="color: #000000;"&gt; StackPanel &lt;/span&gt;&lt;span style="color: #000000;"&gt;||&lt;/span&gt;&lt;span style="color: #000000;"&gt; c &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;is&lt;/span&gt;&lt;span style="color: #000000;"&gt; TabControl)
            {
                RecurseTree(frameworkElement, isReadOnly);
            }
            &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;
            {
                frameworkElement.IsEnabled &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;isReadOnly;
            }
        }
    }
}&lt;/span&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;

&lt;p&gt;You might notice that I don’t repeat recursion for not container types – that is intentional in terms of my project, and it saves a few processor cycles.&lt;/p&gt;

&lt;p&gt;I do think that somewhere out there is a more elegant solution, if you know one please let me know.&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a4ca5ed4-5bf2-410b-b757-fff6b4251d95" class="wlWriterEditableSmartContent"&gt;Technorati Tagi: &lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt;&lt;/div&gt;&lt;img src="http://dkowalski.com/blog/aggbug/34.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>25th PG.NET meeting</title>
        <link rel="alternate" type="text/html" href="http://dkowalski.com/blog/archive/2010/01/31/pg.net-25-meeting.aspx" />
        <id>http://dkowalski.com/blog/archive/2010/01/31/pg.net-25-meeting.aspx</id>
        <published>2010-01-31T18:11:37Z</published>
        <updated>2011-06-09T11:59:58Z</updated>
        <content type="html">&lt;p&gt;On 25th PG.NET meeting I’ve had presentation concerning &lt;a href="http://wiki.sharparchitecture.net/"&gt;S#arp Architecture&lt;/a&gt;. I do really like &lt;a href="http://presentationzen.blogs.com/presentationzen/2005/10/apple_special_e.html"&gt;Steve Jobs style of presentation&lt;/a&gt;. I mean, I’m far from his abilities but I just believe in two things – 1. tell a story 2. don’t put to much information on a single slide. Unfortunately there is a downside of that kind of presentation - there is really nothing to show on internet unless you are going to record it live.&lt;/p&gt;  &lt;p&gt;So &lt;a href="http://www.dkowalski.com/Files/sharpPresentationAng.pdf"&gt;here it is&lt;/a&gt;, almost no text (except the who-can-help.me slide – It was intentionally crowded to rise a question – are there too many third party frameworks and where is it going?). Oh and I’ve changed S#arp Architecture logo color (as a matter of fact I’ve inverted colors) to better match my background color :-) &lt;/p&gt;  &lt;p&gt;Notes to remember:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;while presenting your code live everything can happen, maybe it is better to record it first ? On the other hand doing real live coding is cool :-)&lt;/li&gt;    &lt;li&gt;don’t forget what your next thing to show is while you are doing live code demonstration (again – recording first ?)&lt;/li&gt;    &lt;li&gt;make more questions to audience, involve them (it works great to set their focus)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;So far that’s all, I do really like being a speaker and I’m thinking already about next presentation.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:8901796b-7c75-4a54-967b-c9fa921e11ab" class="wlWriterEditableSmartContent"&gt;Technorati Tagi: &lt;a href="http://technorati.com/tags/S%23arp+Architecture" rel="tag"&gt;S#arp Architecture&lt;/a&gt;,&lt;a href="http://technorati.com/tags/speaking" rel="tag"&gt;speaking&lt;/a&gt;&lt;/div&gt;&lt;img src="http://dkowalski.com/blog/aggbug/33.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>How to create a successful product</title>
        <link rel="alternate" type="text/html" href="http://dkowalski.com/blog/archive/2010/01/06/how-to-create-a-successful-product.aspx" />
        <id>http://dkowalski.com/blog/archive/2010/01/06/how-to-create-a-successful-product.aspx</id>
        <published>2010-01-06T23:21:55Z</published>
        <updated>2011-06-09T12:00:02Z</updated>
        <content type="html">&lt;p&gt;Well it turns out that’s not so hard, Leon Bambrick @ &lt;a href="http://www.secretgeek.net"&gt;secretgeek.net&lt;/a&gt; came out with a great idea! Just check it out, it’s worth it - &lt;a href="http://www.secretgeek.net/cco.asp"&gt;The Ultimate Agent of WERF Destruction&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;It took me a while to recover after that shocking idea :-) (back to normal = to get up from the floor)&lt;/p&gt;&lt;img src="http://dkowalski.com/blog/aggbug/32.aspx" width="1" height="1" /&gt;</content>
    </entry>
</feed>
