<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>lex parsimoniae &#187; Software Reviews</title>
	<atom:link href="http://blog.componentoriented.com/category/software-reviews/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.componentoriented.com</link>
	<description>The pursuit of the simplest software possible</description>
	<lastBuildDate>Thu, 24 Nov 2011 01:55:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Reason #358 why I hate Flash</title>
		<link>http://blog.componentoriented.com/2011/11/reason-358-why-i-hate-flash/</link>
		<comments>http://blog.componentoriented.com/2011/11/reason-358-why-i-hate-flash/#comments</comments>
		<pubDate>Thu, 24 Nov 2011 01:52:29 +0000</pubDate>
		<dc:creator>dlambert</dc:creator>
				<category><![CDATA[Disconnected rants]]></category>
		<category><![CDATA[Software Reviews]]></category>
		<category><![CDATA[Adobe Flash]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://blog.componentoriented.com/?p=1346</guid>
		<description><![CDATA[I use four PCs on a regular basis (two work PCs, plus a laptop and desktop at home), and all three run Windows &#8212; one Windows Server 2003, one Server 2008, and two Windows 7.  All of these boxes are either on 24&#215;7 or hibernated between uses, so the only time I reboot them is [...]]]></description>
			<content:encoded><![CDATA[<p>I use four PCs on a regular basis (two work PCs, plus a laptop and desktop at home), and all three run Windows &#8212; one Windows Server 2003, one Server 2008, and two Windows 7.  All of these boxes are either on 24&#215;7 or hibernated between uses, so the only time I reboot them is to install Windows updates.</p>
<p>And every&#8230; single&#8230;. time&#8230; I reboot any of these machines, I see one of these:</p>
<div style="clear: both;"><a href="http://blog.componentoriented.com/wp-content/uploads/2011/11/FlashUpdate.jpg"><img class="aligncenter size-medium wp-image-1347" title="FlashUpdate" src="http://blog.componentoriented.com/wp-content/uploads/2011/11/FlashUpdate-400x241.jpg" alt="" width="400" height="241" /></a></div>
<p>I typically go ahead and let Flash do what it wants to do, and yet it keeps coming back, over and over and over again.  Based on this, I&#8217;m forced to conclude that either (1) Flash isn&#8217;t really updating correctly, or (2) it really does have a new update to install every single time I reboot.</p>
<p>Neither of these is acceptable.  Adobe, you&#8217;re not building an OS here.  Get it right and get out of my way.  If there&#8217;s  a *real* new version or a *real* security disaster, then let me know about it, but I just refuse to believe that there are really that many emergencies that you need to install something every single time I reboot.</p>
<p>If you&#8217;re wondering why folks like <a href="http://blog.componentoriented.com/tag/apple/">Apple</a> have made such a big stink about getting Flash off their systems, this is exactly the sort of issue they had in mind.</p>
<p><map name='google_ad_map_1346_8cfd796512ec059a'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/1346?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_1346_8cfd796512ec059a' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=1346&amp;url= http%3A%2F%2Fblog.componentoriented.com%2F2011%2F11%2Freason-358-why-i-hate-flash%2F' /></p><div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/home/?status=Reason+%23358+why+I+hate+Flash+http%3A%2F%2Fblog.componentoriented.com%2F%3Fp%3D1346" title="Post to Twitter"><img class="nothumb" src="http://blog.componentoriented.com/wp-content/plugins/tweet-this/icons/de/twitter/de/tt-twitter-micro4.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Reason+%23358+why+I+hate+Flash+http%3A%2F%2Fblog.componentoriented.com%2F%3Fp%3D1346" title="Post to Twitter">Tweet This Post</a></p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.componentoriented.com/2011/11/reason-358-why-i-hate-flash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>1&amp;1 &#8211; Unlimited bandwidth hosting</title>
		<link>http://blog.componentoriented.com/2009/09/1and1-unlimited-bandwidth-hosting/</link>
		<comments>http://blog.componentoriented.com/2009/09/1and1-unlimited-bandwidth-hosting/#comments</comments>
		<pubDate>Thu, 03 Sep 2009 13:32:05 +0000</pubDate>
		<dc:creator>dlambert</dc:creator>
				<category><![CDATA[Software Reviews]]></category>
		<category><![CDATA[1&1]]></category>
		<category><![CDATA[1and1]]></category>
		<category><![CDATA[Bandwidth]]></category>
		<category><![CDATA[unlimited bandwidth]]></category>
		<category><![CDATA[web hosting]]></category>
		<category><![CDATA[web hosting service]]></category>

		<guid isPermaLink="false">http://blog.componentoriented.com/?p=642</guid>
		<description><![CDATA[Web host 1&#38;1 just announced that they&#8217;re lifting the bandwidth caps on all their hosting plans.  The previous caps were high enough that they rarely affected most customers, but anyone who was ever &#8220;slash-dotted&#8221; will appreciate this move. Image via CrunchBase As you may have noticed, I use 1&#38;1 to host this site, and I [...]]]></description>
			<content:encoded><![CDATA[<p>Web host 1&amp;1 just announced that they&#8217;re lifting the bandwidth caps on all their hosting plans.  The previous caps were high enough that they rarely affected most customers, but anyone who was ever &#8220;slash-dotted&#8221; will appreciate this move.</p>
<div class="zemanta-img" style="margin: 1em; display: block;">
<div>
<dl class="wp-caption alignright" style="width: 101px;">
<dt class="wp-caption-dt"><a href="http://www.crunchbase.com/service-provider/1-1"><img title="Image representing 1&amp;1 as depicted in CrunchBase" src="http://www.crunchbase.com/assets/images/resized/0001/9088/19088v1-max-450x450.png" alt="Image representing 1&amp;1 as depicted in CrunchBase" width="91" height="72" /></a></dt>
<dd class="wp-caption-dd zemanta-img-attribution" style="font-size: 0.8em;">Image via <a href="http://www.crunchbase.com">CrunchBase</a></dd>
</dl>
</div>
</div>
<p>As you may have noticed, <a href="http://www.1and1.com/?k_id=6576420">I use 1&amp;1</a> to host this site, and I also run a couple of club sites on them.  Although I saw some reliability problems with 1&amp;1 <a href="http://blog.componentoriented.com/2007/07/web_outage_on_appdev/">a couple years ago</a>, I have to say they&#8217;ve been pretty good since then.  I use <a href="http://mon.itor.us/">mon.itor.us</a> to watch uptime on all these sites, and I haven&#8217;t seen any major issues in a long time.</p>
<p>If you need a host, include these guys in your eval list.</p>
<h6 class="zemanta-related-title" style="font-size: 1em;">Related articles by Zemanta</h6>
<ul class="zemanta-article-ul">
<li class="zemanta-article-ul-li"><a href="http://www.techradar.com/news/internet/web-hosting-company-1-1-drops-traffic-caps-631318">Web hosting company 1&amp;1 drops traffic caps</a> (techradar.com)</li>
<li class="zemanta-article-ul-li"><a href="http://www.prweb.com/releases/2009/08/prweb2775494.htm">Web Hosting Firm Just Host hits 100,000 New Hosting Customers This Year!</a> (prweb.com)</li>
<li class="zemanta-article-ul-li"><a href="http://consumerist.com/5266247/web-host-doesnt-let-you-know-about-bandwidth-overages-for-a-week-wants-5700">Web Host Doesn&#8217;t Let You Know About Bandwidth Overages For A Week, Wants $5,700 [Servers]</a> (consumerist.com)</li>
</ul>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><a class="zemanta-pixie-a" title="Reblog this post [with Zemanta]" href="http://reblog.zemanta.com/zemified/01b6bdea-7d4f-4d63-b86c-c1196942c633/"><img class="zemanta-pixie-img" style="border: medium none; float: right;" src="http://img.zemanta.com/reblog_e.png?x-id=01b6bdea-7d4f-4d63-b86c-c1196942c633" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related more-info pretty-attribution paragraph-reblog"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
<p><map name='google_ad_map_642_8cfd796512ec059a'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/642?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_642_8cfd796512ec059a' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=642&amp;url= http%3A%2F%2Fblog.componentoriented.com%2F2009%2F09%2F1and1-unlimited-bandwidth-hosting%2F' /></p><div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/home/?status=1%261+%E2%80%93+Unlimited+bandwidth+hosting+http%3A%2F%2Fblog.componentoriented.com%2F%3Fp%3D642" title="Post to Twitter"><img class="nothumb" src="http://blog.componentoriented.com/wp-content/plugins/tweet-this/icons/de/twitter/de/tt-twitter-micro4.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=1%261+%E2%80%93+Unlimited+bandwidth+hosting+http%3A%2F%2Fblog.componentoriented.com%2F%3Fp%3D642" title="Post to Twitter">Tweet This Post</a></p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.componentoriented.com/2009/09/1and1-unlimited-bandwidth-hosting/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Best.  Logger.  Ever.</title>
		<link>http://blog.componentoriented.com/2009/06/best-logger-ever/</link>
		<comments>http://blog.componentoriented.com/2009/06/best-logger-ever/#comments</comments>
		<pubDate>Wed, 24 Jun 2009 15:22:03 +0000</pubDate>
		<dc:creator>dlambert</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Software Reviews]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[logger]]></category>
		<category><![CDATA[logging framework]]></category>

		<guid isPermaLink="false">http://blog.componentoriented.com/?p=548</guid>
		<description><![CDATA[Logging is one of those &#8220;system&#8221; components that always seems to either be left out or way over-engineered (glares at Microsoft&#8216;s Enterprise Application Blocks). Today, I&#8217;d like to introduce you to a logging framework that&#8217;s everything it needs to be and nothing it doesn&#8217;t. The .Net Logging Framework from The Object Guy is powerful enough [...]]]></description>
			<content:encoded><![CDATA[<p>Logging is one of those &#8220;system&#8221; components that always seems to either be left out or way over-engineered (glares at <a href="http://blog.componentoriented.com/tag/microsoft/">Microsoft</a>&#8216;s Enterprise Application Blocks).  Today, I&#8217;d like to introduce you to a logging framework that&#8217;s everything it needs to be and nothing it doesn&#8217;t.</p>
<p>The <a href="http://www.theobjectguy.com/DotNetLog/">.Net Logging Framework</a> from The Object Guy is powerful enough to handle any of your logging needs, but simple and painless to use.  Here&#8217;s a relatively complicated example &#8212; we&#8217;re going to log to three logging sources to demonstrate how easy it is to set up.  In most cases, of course, you&#8217;ll log to only one or two sources:</p>
<pre class="brush: csharp">
/* first instantiate some basic loggers */
Logger consoleLogger = TextWriterLogger.NewConsoleLogger();
Logger fileLogger = new FileLogger(&quot;unit_test_results.log&quot;);
Logger socketLogger = new SerialSocketLogger(&quot;localhost&quot;, 12345);

/* now instantiate a CompositeLogger */
logger = new CompositeLogger();

/* add the basic loggers to the CompositeLogger */
logger.AddLogger(&quot;console&quot;, consoleLogger);
logger.AddLogger(&quot;file&quot;, fileLogger);
logger.AddLogger(&quot;socket&quot;, socketLogger);

/* now all logs to logger will automatically be sent
to the contained loggers as well */

/* logging is a one-liner */
logger.LogDebug(&quot;Logging initialized.&quot;);
</pre>
<p>When you download this logger, you&#8217;ll get all the source code, including a socket reader to catch the logs thrown by the socketLogger in the example above.  Extending the logger is a piece of cake, too, so you could build yourself a WCF Logger, for instance, in no time flat.</p>
<p>You&#8217;ll note the lack of config file-driven settings in the example above &#8212; this is purely intentional.  You can decide if you want to make any of these settings configurable, and do so in the format you&#8217;re comfortable with, so you don&#8217;t need to try to get your config files to conform to whatever format your logger insists on using.  This small simplification can be a big time-saver for simple apps, debugging / test harness apps, and so on.</p>
<p><map name='google_ad_map_548_8cfd796512ec059a'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/548?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_548_8cfd796512ec059a' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=548&amp;url= http%3A%2F%2Fblog.componentoriented.com%2F2009%2F06%2Fbest-logger-ever%2F' /></p><div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/home/?status=Best.+Logger.+Ever.+http%3A%2F%2Fblog.componentoriented.com%2F%3Fp%3D548" title="Post to Twitter"><img class="nothumb" src="http://blog.componentoriented.com/wp-content/plugins/tweet-this/icons/de/twitter/de/tt-twitter-micro4.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Best.+Logger.+Ever.+http%3A%2F%2Fblog.componentoriented.com%2F%3Fp%3D548" title="Post to Twitter">Tweet This Post</a></p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.componentoriented.com/2009/06/best-logger-ever/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>NDepend review</title>
		<link>http://blog.componentoriented.com/2009/06/ndepend-review/</link>
		<comments>http://blog.componentoriented.com/2009/06/ndepend-review/#comments</comments>
		<pubDate>Mon, 01 Jun 2009 14:16:34 +0000</pubDate>
		<dc:creator>dlambert</dc:creator>
				<category><![CDATA[.Net Development]]></category>
		<category><![CDATA[Software Reviews]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[NDepend]]></category>

		<guid isPermaLink="false">http://blog.componentoriented.com/?p=493</guid>
		<description><![CDATA[Introduction There&#8217;s no question that Visual Studio is a class-leading tool for building large applications.  The IDE is incredibly helpful to coders, and the .Net framework lends itself to managing dependencies among components and classes in large applications.  In addition, Visual Studio is designed to be extended by third-party tools that can make it even [...]]]></description>
			<content:encoded><![CDATA[<h3>Introduction</h3>
<p>There&#8217;s no question that Visual Studio is a class-leading tool for building large applications.  The IDE is incredibly helpful to coders, and the <a href="http://blog.componentoriented.com/tag/.net/">.Net</a> framework lends itself to managing dependencies among components and classes in large applications.  In addition, Visual Studio is designed to be extended by third-party tools that can make it even better.  NDepend is one of these tools; its purpose is to analyze large applications and expose information that&#8217;s typically hidden deep inside your code.</p>
<h3>Installation and getting started</h3>
<p>The <a href="http://www.ndepend.com/">NDepend web site</a> shows some great screen shots with all manner of graphs and charts and reports, so naturally, you want to see that stuff for your code, too, right?  Good news: installation is a piece of cake.  Just unzip into a directory, add the license file, and you&#8217;re ready to start your first analysis.</p>
<p>When you start the NDepend Startup shows a screen reminiscent of Visual Studio (start screen).  Create a new project, point it at a Visual Studio solution file, and let NDepend do its thing.  Zero to more graphs than you can shake a stick at in about four minutes:</p>
<p><img class="alignnone size-full wp-image-561" title="ndepend1" src="http://blog.componentoriented.com/wp-content/uploads/2009/05/ndepend1.png" alt="ndepend1" width="486" height="355" /><br />
<span id="more-493"></span><br />
<h3>NDepend Reports</h3>
<p>For my first test, I loaded up <a href="http://blog.componentoriented.com/tag/csla/">CSLA</a> and ran NDepend&#8217;s analysis.  When you run NDepend&#8217;s analysis in the VisualNDepend GUI tool, it writes a report in HTML with all the graphs you see in the screenshot above and more.  In addition, the report will show you some metrics, dependencies, and warnings.</p>
<p>This is where the analysis starts to get interesting.  There&#8217;s a section in the report called &#8220;CQL Queries and Constraints&#8221;, where NDepend lists violations of constraints it&#8217;s found during the analysis.  &#8220;CQL&#8221; stands for Code Query Language, and this is one of the real hidden gems of NDepend.  It turns out that NDepend isn&#8217;t just boiling your code down into data so it can draw graphs &#8212; it also lets you query that data with a SQL-like language.</p>
<p>If you&#8217;ve ever used FxCop, you&#8217;ll be familiar with the idea behind CQL constraints.  Like FxCop warnings, the idea here is to flag code that probably needs some help.  Unlike FxCop, though, the constraints you see popping out in the report are constructed like SQL queries.  Here&#8217;s one of the simpler examples:</p>
<p><span style="color: #008000;">// &lt;Name&gt;<strong>Methods too big (NbLinesOfCode)</strong>&lt;/Name&gt; </span></p>
<p><span style="color: #008000;"> </span></p>
<p><span style="color: #000080;">WARN IF</span> Count &gt; <strong>0</strong> <span style="color: #000080;">IN SELECT TOP</span> <strong>10</strong> <span style="color: #000080;">METHODS WHERE</span> NbLinesOfCode &gt; <strong>30</strong> <span style="color: #000080;">ORDER BY</span> NbLinesOfCode <span style="color: #000080;">DESC</span></p>
<p><span style="color: #008000;">// METHODS WHERE NbLinesOfCode &gt; 30 are extremely complex and<br />
// should be split in smaller methods</span><br />
<span style="color: #008000;">// (except if they are automatically generated by a tool).</span></p>
<p>// See the definition of the NbLinesOfCode metric here <a href="http://www.ndepend.com/Metrics.aspx#NbLinesOfCode"><span style="color: #000080;">http://www.ndepend.com/Metrics.aspx#NbLinesOfCode</span></a></p>
<p>A few points of note here:</p>
<ul>
<li>NDepend comes with over 100 of these queries, including 20 samples showing how to construct custom queries.</li>
<li>Yes, you can write your own queries!</li>
<li>Note the URL in the comments above &#8212; there are quite a few new terms you&#8217;ll find yourself wading through as you dive into NDepend, so take advantage of the excellent online explainations.  For example, the page above is part of <a href="http://www.ndepend.com/Metrics.aspx">a whole page that explains the code metrics</a> that NDepend tracks.  Be sure to check out the Metrics cheat sheet, too.</li>
<li>The results of these constraints don&#8217;t indicate specific problems &#8212; they indicate conditions that <em>could</em> be problems.  It&#8217;s still up to you to check out the specifics.</li>
</ul>
<h3>CQL Queries</h3>
<p>Needless to say, I had to try out the CQL queries.  The thought of creating my own CQL queries sounded pretty cool &#8212; even though I wasn&#8217;t exactly sure what I wanted to look for!  The View menu has an option to &#8220;Reset Views to work with the CQL language&#8221; which switches the IDE around and presents a treeview with queries in it.</p>
<p>This handling of views is somewhat different from the way we&#8217;re used to working with windows in Visual Studio &#8212; whereas Visual Studio lets you open, close, dock and pin tool windows one at a time, NDepend re-arranges the whole collection of windows at once to suit each type of activity you might want to undertake.  If the NDepend GUI were integrated into Visual Studio, this would probably be quite awkward, but in the standalone NDepend GUI, it&#8217;s pretty easy to get used to.</p>
<p>I decided to create a query showing namespaces with very little code in them.  Probably not the most useful method, but I figured it might be interesting to see some little-used namespaces.  Creating the query is easy &#8211; you end up with a pretty basic edit window:</p>
<p><img class="alignnone size-full wp-image-562" title="ndepend2" src="http://blog.componentoriented.com/wp-content/uploads/2009/05/ndepend2.png" alt="ndepend2" width="600" height="300" /></p>
<p>I noticed a few quirks while working in this window:</p>
<ul>
<li>There is autocomplete in the query editor window, but it&#8217;s not as slick as the autocomplete you&#8217;re used to in Visual Studio.  It&#8217;s pretty easy to screw a query up enough, for example, that the code parser just gives up.  You should get used to this pretty soon, though &#8211; it didn&#8217;t take me too long.</li>
<li>Browsing from query to query could be a little easier if there was a preview pane of some sort.  While stumbling through my first query, I wanted to browse a bunch of queries to see examples.  I found I had to &#8220;edit&#8221; each query, then &#8220;cancel&#8221; to go back to the treeview to find the next one.  It would be nice if I could click each query and see the edit view for that query in a preview window.</li>
<li>The biggest feature I wished for, though, was a fast, easy way to run my query and see the results without running the whole analysis and report again.  It turns out that there&#8217;s a window that was hiding in a tabset behind the class browser, and this window actually shows results in real-time as you make changes to the query.  Way cool, but it took me a bit to realize it was there.</li>
</ul>
<p>In any event, within a few minutes, I&#8217;d created a constraint, and it was yielding results:</p>
<p><span style="color: #008000;">// &lt;Name&gt;<strong>A sample constraint</strong>&lt;/Name&gt;</span></p>
<p><span style="color: #000080;">WARN IF <span style="color: #404040;">Count &gt;</span> <strong><span style="color: #404040;">0</span></strong> IN </span></p>
<p><span style="color: #000080;"> </span></p>
<p><span style="color: #000080;">SELECT NAMESPACES WHERE <span style="color: #404040;">NbILInstructions &lt; <strong>500</strong></span> ORDER BY <span style="color: #404040;">NbLinesOfCode</span> ASC</span></p>
<p>In case you&#8217;re wondering, I would probably use either <span style="color: #404040;">NbILInstructions</span> or <span style="color: #404040;">NbLinesOfCode</span> in both the WHERE and the ORDER BY clauses for a &#8220;real&#8221; query, but I wanted to play around with both of these as long as I was experimenting.</p>
<h3>NDepend integrated into your process</h3>
<p>The interactive UI is where you&#8217;ll spend your time while you&#8217;re learning NDepend, but this tool is designed to integrate into your build process, too.  Once you&#8217;ve got CQL constraints set up the way you want, you want to keep an eye on your project to make sure it stays healthy over time.  NDepend can integrate into your MSBuild, NAnt, or CruiseControl.Net build process so you&#8217;ve got up-to-date information all the time.</p>
<p>Another obvious use of NDepend is to support refactoring.  While the CQL constraints show you places where you probably should consider refactoring, the dependency matrices and graphs help you understand the relationships that exist in your code so that you can refactor effectively.  Given that NDepend has access to your .Net code only, dependency analysis won&#8217;t help track dependencies into other systems, stored procedures, and so on.</p>
<h3>Is NDepend right for you?</h3>
<p>NDepend can do some things that no other product can touch.  These capabilities are seriously amazing, and are a testament not only to this tool, but also to the extensibility of the .Net framework.</p>
<p>But how is it going to make you a better developer?</p>
<p>If your organization values code quality, you&#8217;re hopefully already familiar with the principles behind the default CQL constraints.  Most of these measurements are understood by most developers in an abstract way, but it&#8217;s usually really difficult to make these judgements objectively.  Not anymore.  Now you can use NDepend to help keep your code architecturally clean.</p>
<p>There are a few places where NDepend makes a lot of sense:</p>
<ul>
<li>Big code bases.  These systems can be very complex and brittle, so improvements in stability help a lot.  It&#8217;s also nice to have some extra tool support when working with big code bases.</li>
<li>Commercial code or public APIs.  If you sell your software, your code needs to be top-notch, and NDepend can help with that.</li>
<li>As a code review or teaching tool.  Like code reviews, NDepend can help teach new developers how to build more reliable, more maintainable systems.</li>
</ul>
<p>If you need every advantage to keep your code base healthy, you should check out this tool.  If you&#8217;re good, this tool will make you better.</p>
<p><map name='google_ad_map_493_8cfd796512ec059a'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/493?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_493_8cfd796512ec059a' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=493&amp;url= http%3A%2F%2Fblog.componentoriented.com%2F2009%2F06%2Fndepend-review%2F' /></p><div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/home/?status=NDepend+review+http%3A%2F%2Fblog.componentoriented.com%2F%3Fp%3D493" title="Post to Twitter"><img class="nothumb" src="http://blog.componentoriented.com/wp-content/plugins/tweet-this/icons/de/twitter/de/tt-twitter-micro4.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=NDepend+review+http%3A%2F%2Fblog.componentoriented.com%2F%3Fp%3D493" title="Post to Twitter">Tweet This Post</a></p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.componentoriented.com/2009/06/ndepend-review/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Zemanta is a blogger&#8217;s best friend</title>
		<link>http://blog.componentoriented.com/2008/10/zemanta-is-a-bloggers-best-friend/</link>
		<comments>http://blog.componentoriented.com/2008/10/zemanta-is-a-bloggers-best-friend/#comments</comments>
		<pubDate>Thu, 23 Oct 2008 03:32:08 +0000</pubDate>
		<dc:creator>dlambert</dc:creator>
				<category><![CDATA[Blogging Platforms]]></category>
		<category><![CDATA[Software Reviews]]></category>
		<category><![CDATA[blogging]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[Zemanta]]></category>

		<guid isPermaLink="false">http://blog.componentoriented.com/?p=323</guid>
		<description><![CDATA[Shortly before I switched this blog to WordPress, I learned about a new tool called Zemanta.  It was supposed to provide context-sensitive links and images, chosen dynamically to be relevant to the work in progress.  It sounded pretty cool, and I tried to set it up under Drupal, but couldn&#8217;t quite get it done.  After [...]]]></description>
			<content:encoded><![CDATA[<div class="zemanta-img zemanta-action-click">
<div class="wp-caption alignright" style="width: 216px"><a href="http://www.crunchbase.com/company/zemanta"><img title="Image representing Zemanta as depicted in Crun..." src="http://www.crunchbase.com/assets/images/resized/0001/6433/16433v1-max-250x250.png" alt="Image representing Zemanta as depicted in Crun..." width="206" height="73" /></a><p class="wp-caption-text">Image by Zemanta via CrunchBase</p></div>
</div>
<p>Shortly before I <a href="http://blog.componentoriented.com/?p=191">switched this blog to WordPress</a>, I learned about a new tool called <a href="http://www.zemanta.com/">Zemanta</a>.  It was supposed to provide context-sensitive links and images, chosen dynamically to be relevant to the work in progress.  It sounded pretty cool, and I tried to set it up under Drupal, but couldn&#8217;t quite get it done.  After switching to <a class="zem_slink" title="WordPress" rel="homepage" href="http://wordpress.org/">WordPress</a>, I was happy to see that Zemanta setup was a breeze.</p>
<p>I&#8217;ve been using Zemanta for a few weeks now, and I&#8217;m really, really happy with it.  My initial impressions were a bit iffy &#8211; images were inserted in a way that made it difficult to move the image without leaving the citation caption behind, for instance.  Zemanta keeps improving the plugin and the service, though, and my early problems have lessened considerably.</p>
<p><span id="more-323"></span>
<div class="zemanta-img zemanta-action-dragged">
<div class="wp-caption alignleft" style="width: 170px"><a href="http://www.flickr.com/photos/16887514@N00/2964709595/" class="broken_link"><img title="Orton for Joe" src="http://farm4.static.flickr.com/3028/2964709595_797d286fb9_m.jpg" alt="Orton for Joe" width="160" height="240" /></a><p class="wp-caption-text">Image by Kyle Kesselring via Flickr</p></div>
</div>
<p>Zemanta gives you a little sidebar as you&#8217;re editing your blog entry &#8211; there&#8217;s a plugin that works right in WordPress&#8217; editor, and you can also install it as an add-on for <a class="zem_slink broken_link" title="Windows Live Writer" rel="homepage" href="http://windowslivewriter.spaces.live.com/">Windows Live Writer</a>.  The two main areas you&#8217;ll see in the sidebar are a set of images and a set of related links.  When you want to use one of the images or links, you click on it, and it drops into your post &#8211; it&#8217;s just that easy.</p>
<p>There&#8217;s nothing that Zemanta does that you couldn&#8217;t do yourself, but what I&#8217;ve found is that Zemanta makes the process of creating a nice-looking post so much easier, that I&#8217;m more likely to sit down and pop out a quick post now, because I can click in an image or two and some related links, and I&#8217;ve got a post that doesn&#8217;t look like I mailed it in from my smartphone.</p>
<p>This post, for instance, took about fifteen minutes end-to-end &#8211; considerably less than I&#8217;d have spent if I&#8217;d had to go find images, resize them, upload them and insert them, and then go find links to add as well.  More likely, I probably would have skipped the &#8220;related links&#8221; altogether.  Zemanta makes my blog better, and easier too.</p>
<h6 class="zemanta-related-title" style="font-size: 1em;">Related articles by Zemanta</h6>
<ul class="zemanta-article-ul">
<li class="zemanta-article-ul-li"><a href="http://on10.net/blogs/sarahintampa/Zemanta-Plugin-for-Windows-Live-Writer/">Zemanta Plugin for Windows Live Writer</a></li>
<li class="zemanta-article-ul-li"><a href="http://www.sohosolowestcork.com/2008/08/zemanta-semantic-image-suggestion-for-your-blog/">Zemanta &#8211; semantic image suggestion for your blog</a></li>
<li class="zemanta-article-ul-li"><a href="http://mo.notono.us/2008/10/zemanta-more-trouble-than-its-worth.html">Zemanta &#8211; more trouble than it&#8217;s worth.</a></li>
<li class="zemanta-article-ul-li"><a href="http://www.bloggingministry.com/2008/10/21/need-pics-and-links-theres-always-zemanta/">Need Pics and Links? &#8211; There&#8217;s Always Zemanta!</a></li>
</ul>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><a class="zemanta-pixie-a" title="Zemified by Zemanta" href="http://reblog.zemanta.com/zemified/e3d06f13-9d24-4f32-915f-c0896ab13fa7/"><img class="zemanta-pixie-img" style="border: medium none ; float: right;" src="http://img.zemanta.com/reblog_e.png?x-id=e3d06f13-9d24-4f32-915f-c0896ab13fa7" alt="Reblog this post [with Zemanta]" /></a></div>
<p><map name='google_ad_map_323_8cfd796512ec059a'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/323?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_323_8cfd796512ec059a' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=323&amp;url= http%3A%2F%2Fblog.componentoriented.com%2F2008%2F10%2Fzemanta-is-a-bloggers-best-friend%2F' /></p><div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/home/?status=Zemanta+is+a+blogger%E2%80%99s+best+friend+http%3A%2F%2Fblog.componentoriented.com%2F%3Fp%3D323" title="Post to Twitter"><img class="nothumb" src="http://blog.componentoriented.com/wp-content/plugins/tweet-this/icons/de/twitter/de/tt-twitter-micro4.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Zemanta+is+a+blogger%E2%80%99s+best+friend+http%3A%2F%2Fblog.componentoriented.com%2F%3Fp%3D323" title="Post to Twitter">Tweet This Post</a></p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.componentoriented.com/2008/10/zemanta-is-a-bloggers-best-friend/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Drive Backup 9.0 Express &#8211; a really bad start</title>
		<link>http://blog.componentoriented.com/2008/09/drive-backup-90-express-a-really-bad-start/</link>
		<comments>http://blog.componentoriented.com/2008/09/drive-backup-90-express-a-really-bad-start/#comments</comments>
		<pubDate>Fri, 05 Sep 2008 03:50:54 +0000</pubDate>
		<dc:creator>dlambert</dc:creator>
				<category><![CDATA[Software Reviews]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[Paragon Software Group]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Vista]]></category>

		<guid isPermaLink="false">http://blog.componentoriented.com/?p=249</guid>
		<description><![CDATA[I&#8217;m slowly weaning myself off Vista on my home PC and onto Ubuntu, because Vista just continues to disappoint me day after day.  I&#8217;ve pared my Vista install down to just the basics now, and I&#8217;m setting it up to dual-boot to either Vista or Ubuntu. Before I go messing with boot sectors, though, I [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m slowly weaning myself off <a class="zem_slink" title="Windows Vista" rel="homepage" href="http://www.microsoft.com/vista">Vista</a> on my home PC and onto <a class="zem_slink" title="Ubuntu" rel="homepage" href="http://www.ubuntu.com/">Ubuntu</a>, because Vista just continues to disappoint me day after day.  I&#8217;ve pared my Vista install down to just the basics now, and I&#8217;m setting it up to dual-boot to either Vista or Ubuntu.</p>
<div class="zemanta-img" style="margin: 1em; float: right; display: block;"><a href="http://en.wikipedia.org/wiki/Image:Paragon_Logo.png"><img style="border: medium none; display: block;" src="http://upload.wikimedia.org/wikipedia/en/thumb/a/ac/Paragon_Logo.png/202px-Paragon_Logo.png" alt="Paragon Software Group" /></a></div>
<p>Before I go messing with boot sectors, though, I plan to take a backup of my system.  The last experience I had with Windows Backup wasn&#8217;t stellar, and as luck would have it, I just read a blog post announcing a free personal backup program from <a class="zem_slink" title="Paragon Software Group" rel="homepage" href="http://www.paragon-software.com/">Paragon Software Group</a> called <a href="http://www.paragon-software.com/home/db-express/index.html">Drive Backup Express</a>.  It&#8217;s supposed to be really simple, and really foolproof.  Perfect, I thought &#8211; I&#8217;m in!</p>
<p><span id="more-249"></span>So I went to download this dandy little app last night, and wouldn&#8217;t you know, it was downloading really slowly.  No big deal &#8211; I let the download run and went to bed.  I sat down tonight to install, and the install started giving me &#8220;can&#8217;t read archive&#8221; errors.  Oh, oh.  Not the sort of message you want to see from your backup program.</p>
<p>I figured I&#8217;d better download again, so I kicked off a fresh download, and the darned thing said it was going to take something like 2 hours to download 70-some Meg.  I haven&#8217;t seen speeds like that since dial-up.  So once again, I left for a while, came back, and the download said it completed, but it only showed a file size of 23 Meg.  Sure enough, when I went to run it, I had the same corrupt archive problems again.</p>
<p>A few years ago, I remember jumping on fresh downloads of development tools, browsers, Linux distros, and so on, and fighting for a day or two at a time to get downloads to complete.  I hadn&#8217;t realized how far we&#8217;d come since then until just now.</p>
<p>If you offer a product or service, no matter how good the end result, please remember that you never get a second chance to make a first impression.  I&#8217;m not sure I&#8217;ll ever find out whether Drive Backup Express is worth the time of day, because I still haven&#8217;t managed to get the damned thing to download.</p>
<p>We&#8217;re past download capacity being an acceptable reason for a lousy experience, and I&#8217;m done waiting.  I&#8217;m going to go start my backup with Windows Backup now.</p>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><a class="zemanta-pixie-a" title="Zemified by Zemanta" href="http://reblog.zemanta.com/zemified/b118a989-514e-4f88-9d3a-176fe1684dc9/"><img class="zemanta-pixie-img" style="border: medium none; float: right;" src="http://img.zemanta.com/reblog_e.png?x-id=b118a989-514e-4f88-9d3a-176fe1684dc9" alt="Reblog this post [with Zemanta]" /></a></div>
<p><map name='google_ad_map_249_8cfd796512ec059a'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/249?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_249_8cfd796512ec059a' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=249&amp;url= http%3A%2F%2Fblog.componentoriented.com%2F2008%2F09%2Fdrive-backup-90-express-a-really-bad-start%2F' /></p><div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/home/?status=Drive+Backup+9.0+Express+%E2%80%93+a+really+bad+start+http%3A%2F%2Fblog.componentoriented.com%2F%3Fp%3D249" title="Post to Twitter"><img class="nothumb" src="http://blog.componentoriented.com/wp-content/plugins/tweet-this/icons/de/twitter/de/tt-twitter-micro4.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Drive+Backup+9.0+Express+%E2%80%93+a+really+bad+start+http%3A%2F%2Fblog.componentoriented.com%2F%3Fp%3D249" title="Post to Twitter">Tweet This Post</a></p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.componentoriented.com/2008/09/drive-backup-90-express-a-really-bad-start/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>I&#8217;m a happy LogMeIn user</title>
		<link>http://blog.componentoriented.com/2008/07/im_a_happy_logmein_user/</link>
		<comments>http://blog.componentoriented.com/2008/07/im_a_happy_logmein_user/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 04:46:08 +0000</pubDate>
		<dc:creator>dlambert</dc:creator>
				<category><![CDATA[Software Reviews]]></category>
		<category><![CDATA[LogMeIn]]></category>
		<category><![CDATA[Remote Access]]></category>
		<category><![CDATA[VPN]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[<p><a href="http://www.appdev.info/files/logmein_2.jpg"><img style="border-right: 0px; border-top: 0px; margin: 0px 5px 0px 0px; border-left: 0px; border-bottom: 0px" height="82" alt="logmein" src="http://www.appdev.info/files/logmein_thumb.jpg" width="130" align="left" border="0" /></a> Like many people, I know I am quick to slam products when they don't work well, but fail to give kudos when they do work well.&#160; Today, I'm going to throw a tally on the good side of that scorecard for <a href="http://www.logmein.com">LogMeIn</a>.  I've used LogMeIn for around a year, now, and I've yet to have it let me down.&#160; Not too bad, considering where some other software vendors set the bar.</p> ]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.appdev.info/files/logmein_2.jpg"><img style="border-right: 0px; border-top: 0px; margin: 0px 5px 0px 0px; border-left: 0px; border-bottom: 0px" src="http://www.appdev.info/files/logmein_thumb.jpg" border="0" alt="logmein" width="130" height="82" align="left" /></a> Like many people, I know I am quick to slam products when they don&#8217;t work well, but fail to give kudos when they do work well.  Today, I&#8217;m going to throw a tally on the good side of that scorecard for <a href="http://www.logmein.com">LogMeIn</a>.  I&#8217;ve used LogMeIn for around a year, now, and I&#8217;ve yet to have it let me down.  Not too bad, considering where some other software vendors set the bar.</p>
<p><!--break--></p>
<p>If you haven&#8217;t heard of it, LogMeIn is a remote access / remote control product &#8211; in fact, a suite of products, really.  When I initially set up my account, there were basically just &#8220;Free&#8221; and &#8220;Premium&#8221; options, but they&#8217;ve added new products at a dizzying pace.  They&#8217;re up to something like ten products now, including one I didn&#8217;t even know about until I looked today.  Most of these products seem to be specialized derivatives of their core technology, which is a really nice approach to see &#8211; sort of the opposite of the &#8220;throw everything in one basket&#8221; approach that many products take.  Despite the breadth of products, all of my experience has been with the basic free product.</p>
<p>First, the bad news.  You have to run an installer on each PC you wish to control, and you need to install an ActiveX control in the browser of any PC you wish to use as a &#8220;viewer&#8221;.  I&#8217;d love to see the viewer work without an install (some administrators won&#8217;t permit this, of course), but this notwithstanding, I&#8217;ve never had the need to install these pieces hinder me.</p>
<p>There&#8217;s a lot more good news than bad news, though.  Here are just a few of the things I&#8217;ve noticed (and liked) so far:</p>
<ul>
<li>The &#8220;host&#8221; component prompts you when there&#8217;s an update available, but it doesn&#8217;t stop running until you upgrade.  This can really save you when you&#8217;re logging in to a &#8220;headless&#8221; PC remotely, so the first chance you have to see that the host wants to run an update is when you&#8217;ve remoted into the host.  It would be a real drag to discover that a whole bunch of PC&#8217;s just became unreachable because they were waiting to be upgraded.</li>
<li>I&#8217;ve never had any problems traversing firewalls, proxies, etc.  File this under &#8220;it just works&#8221;, and I&#8217;m grateful for it.</li>
<li>It works on my Windows Mobile phone!  I&#8217;m using Win Mobile 6 on a T-Mobile Wing, and it works like a charm.  I certainly wouldn&#8217;t want to work for any extended time this way, but it&#8217;s really, really great to be able to get to the one stupid little button on your desktop that I desperately need to press when I&#8217;m sitting in a coffee shop on the other side of town.</li>
<li>Screen scaling.  This is one of those little usability features that escapes attention at first glance.  Many remote control apps will let you view the host&#8217;s screen at exactly the resolution of the host, meaning that if you&#8217;re looking at a screen larger than your client&#8217;s window, you&#8217;re doing a lot of scrolling to see the whole screen.  LogMeIn, though, scales your host&#8217;s screen to fit in your client&#8217;s window &#8211; no matter how large the window is.  That means that if you&#8217;re watching a remote PC to see if a job&#8217;s done, or something like that, you can do so in a small window.  The resolution suffers a little, of course, when you scrunch the screen down, but it&#8217;s really pretty remarkable how readable the screen stays as you resize it.  This is a really nice touch.</li>
<li>Did I mention that it <em>just works</em>?</li>
</ul>
<p>I&#8217;ve tried quite a number of other remote-access products over the years, including VNC and Windows Remote Desktop (running over various tunnels and VPNs), and LogMeIn beats them all when it comes to reliability, and when it comes right down to it, that&#8217;s the #1 feature for remote access, isn&#8217;t it?  If you haven&#8217;t tried LogMeIn yet, go give them a shot.  You won&#8217;t be disappointed.</p>
<p><map name='google_ad_map_158_8cfd796512ec059a'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/158?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_158_8cfd796512ec059a' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=158&amp;url= http%3A%2F%2Fblog.componentoriented.com%2F2008%2F07%2Fim_a_happy_logmein_user%2F' /></p><div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/home/?status=I%E2%80%99m+a+happy+LogMeIn+user+http%3A%2F%2Fblog.componentoriented.com%2F%3Fp%3D158" title="Post to Twitter"><img class="nothumb" src="http://blog.componentoriented.com/wp-content/plugins/tweet-this/icons/de/twitter/de/tt-twitter-micro4.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=I%E2%80%99m+a+happy+LogMeIn+user+http%3A%2F%2Fblog.componentoriented.com%2F%3Fp%3D158" title="Post to Twitter">Tweet This Post</a></p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.componentoriented.com/2008/07/im_a_happy_logmein_user/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Working with Rocky Lhotka&#8217;s CSLA Framework</title>
		<link>http://blog.componentoriented.com/2008/07/working_with_rocky_lhotkas_csla_framework/</link>
		<comments>http://blog.componentoriented.com/2008/07/working_with_rocky_lhotkas_csla_framework/#comments</comments>
		<pubDate>Wed, 02 Jul 2008 20:23:00 +0000</pubDate>
		<dc:creator>dlambert</dc:creator>
				<category><![CDATA[.Net Development]]></category>
		<category><![CDATA[CSLA]]></category>
		<category><![CDATA[Software Reviews]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[Rockford Lhotka]]></category>
		<category><![CDATA[Rocky Lhotka]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[<p><a href="http://www.appdev.info/files/csla_logo1_42_2.png"><img style="border-right: 0px; border-top: 0px; margin: 0px 10px 5px 0px; border-left: 0px; border-bottom: 0px" height="46" alt="csla_logo1_42" src="http://www.appdev.info/files/csla_logo1_42_thumb.png" width="149" align="left" border="0" /></a> I recently wrapped up development of a new application using <a href="http://www.lhotka.net/Default.aspx">Rocky Lhotka's</a> <a href="http://www.lhotka.net/cslanet/Default.aspx">CSLA Framework</a>, and I really liked it a lot.&#160; I think there's a fair bit of mis-information and confusion circulating about this software, so while it's all fresh in my memory, I threw together some notes on the things that worked well, and the ones that didn't work so well, too.</p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.appdev.info/files/csla_logo1_42_2.png"><img style="border-right: 0px; border-top: 0px; margin: 0px 10px 5px 0px; border-left: 0px; border-bottom: 0px" src="http://www.appdev.info/files/csla_logo1_42_thumb.png" border="0" alt="csla_logo1_42" width="149" height="46" align="left" /></a> I recently wrapped up development of a new application using <a href="http://www.lhotka.net/Default.aspx">Rocky Lhotka&#8217;s</a> <a href="http://www.lhotka.net/cslanet/Default.aspx">CSLA Framework</a>, and I really liked it a lot.  I think there&#8217;s a fair bit of mis-information and confusion circulating about this software, so while it&#8217;s all fresh in my memory, I threw together some notes on the things that worked well, and the ones that didn&#8217;t work so well, too.</p>
<p><!--break--></p>
<p>Bear in mind that this material is offered at a high level &#8211; if you&#8217;re interested in really learning the framework, I&#8217;d encourage you to <a href="http://store.lhotka.net/">buy the book</a>, <a href="http://www.lhotka.net/cslanet/download.aspx">download the framework</a>, and dive in &#8211; the water&#8217;s fine.</p>
<h3>Benefits</h3>
<p>One of the obvious benefits of this framework is that Rocky&#8217;s written a book to document the framework (multiple, if you count C# and VB variants, plus updates for new releases).  The book does a pretty good job of walking you through the construction of the framework, explaining &#8220;why&#8221; as well as &#8220;how&#8221;.  You can certainly learn the framework without reading the book, but if you like to do your tech learning out of a book, this one is a great read.</p>
<p>The <a href="http://blog.componentoriented.com/tag/csla/">CSLA</a> framework takes a very OO approach to design.  Where a lot of code-gen or &#8220;factory&#8221; approaches lay the entire model open and trust developers to do the right thing, CSLA enables and, in fact, encourages defensive programming with respect to the object model.  You get to actually start using scoping modifiers to protect the inner workings of your classes, which is really nice.  In my opinion, this encourages a much more robust object model because you can lock down ctors and setters where it makes sense.</p>
<p>This is feasible because you&#8217;re using the same objects everywhere you need them, regardless of physical tier, and this is actually one of the places where peoples&#8217; eyes start to glaze over.  Rocky actually does a great job of explaining this in his book, but a lot of people see examples with code from multiple logical layers in the same class file, and conclude that CSLA precludes the use of multiple physical tiers.</p>
<p>In fact, the framework actually makes n-tier development much easier and more flexible becuase it abstracts the protocol across layers.  I can take the same code, in fact, and configure it to run all on one server (without incurring network traffic across tiers), or as a BL and DL connected via HTTP WS, WCF, or remoting.  It really is just a config change to switch among these modes, which is pretty nice.</p>
<p>Some of this flexibility comes from the use of reflection in some spots, and that can put people off, but IMO, the benefits far outweigh the costs unless you&#8217;re trying to trade stocks or land the space shuttle.  Comparing two applications developed for the same client and deployed into the same environment, the second app (using CSLA) is noticeable snappier, mainly because we&#8217;ve got fewer layers of junk to sift everything through, and because we&#8217;ve got a lot more control over how we optimize data access.</p>
<p>Data Binding is usually listed as one of the benefits of CSLA, but I&#8217;d broaden this to include support for all the MS interfaces that you&#8217;d want to support if you were starting from scratch.  It does authentication and authorization, for instance, using the same MS interfaces you&#8217;d expect to find in use elsewhere.  It does validation using the standard interface, and so on.  The effect of all this is that stuff just *works*, instead of being a constant struggle to go build something whenever you want to interface with something new.</p>
<p>The CSLA objects have excellent support for &#8220;state&#8221;, including IsDirty-type infrastructure so the objects know when they need to be saved and what sort of CRUD operation that might be.  They&#8217;re also capable of supporting n-level undo, though I haven&#8217;t needed that.</p>
<p>Finally, the object have good support for validation, including the ability to declaratively write business rules that drive &#8220;IsValid&#8221; and the ability to save your object.  These rules can be reasonably sophisticated, since you&#8217;re writing them in code.</p>
<h3>Drawbacks</h3>
<p>I&#8217;ve seen a few.  First, it seems like I was constantly fighting FUD from people who didn&#8217;t know anything about the framework.  As I mentioned earlier, there are a lot of misconceptions about this framework &#8211; maybe because of its &#8220;legacy&#8221; roots.  I saw very little real merit in these arguments, however &#8211; they just don&#8217;t hold water when measured against facts.</p>
<p>Second, I saw a couple of places where I got caught building an object based on one base class, and it turned out later that I probably should have been using a different base.  At that point, you don&#8217;t get any additional help with refactoring that doesn&#8217;t already come in the box.  There are modeling or code-generation tools that can spew out CLSA code, and my experience here might have been different had I been using one of these.  In any event, I was still way ahead using the framework.</p>
<p>Finally, I saw some places where validation didn&#8217;t cascade very elegantly down to complex children of parent objects.  This isn&#8217;t the end of the world, since you can override anything by hand, but it would have been nice to get just a little more help from the framework on this one.  At moments like these, it&#8217;s hard to resist the urge to just grab the CSLA source code and <em>fix it</em>.  That&#8217;s an absolute last resort, of course, since it would make upgrades much more difficult.</p>
<p>In case you&#8217;re looking for more info on CSLA, I&#8217;ve pasted a few representative &#8220;community&#8221; opinions below &#8211; feel free to take a look at any or all of them.  FWIW, Rocky tends to do a great job of explaining himself in forum posts, but I&#8217;ve yet to see him put together an effective &#8220;elevator speech&#8221; for CSLA, which is unfortunate.</p>
<p>CSLA Framework benefits:<br />
<a href="http://www.primos.com.au/primos/Portals/0/Tech%20articles/CSLA%20WIIFM/What%20could%20CSLA%20do%20for%20me.html">http://www.primos.com.au/primos/Portals/0/Tech%20articles/CSLA%20WIIFM/What%20could%20CSLA%20do%20for%20me.html</a><br />
Blog comments:<br />
<a href="http://www.primos.com.au/primos/Portals/0/Tech%20articles/CSLA%20WIIFM/What%20could%20CSLA%20do%20for%20me.html">http://www.primos.com.au/primos/Portals/0/Tech%20articles/CSLA%20WIIFM/What%20could%20CSLA%20do%20for%20me.html</a><br />
Blogger&#8217;s pros and cons:<br />
<a href="http://claytonj.wordpress.com/2006/10/17/using-csla-as-an-application-framework/">http://claytonj.wordpress.com/2006/10/17/using-csla-as-an-application-framework/</a><br />
InformIt article:<br />
<a href="http://www.informit.com/articles/article.aspx?p=770361">http://www.informit.com/articles/article.aspx?p=770361</a></p>
<p><map name='google_ad_map_157_8cfd796512ec059a'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/157?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_157_8cfd796512ec059a' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=157&amp;url= http%3A%2F%2Fblog.componentoriented.com%2F2008%2F07%2Fworking_with_rocky_lhotkas_csla_framework%2F' /></p><div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/home/?status=Working+with+Rocky+Lhotka%E2%80%99s+CSLA+Framework+http%3A%2F%2Fblog.componentoriented.com%2F%3Fp%3D157" title="Post to Twitter"><img class="nothumb" src="http://blog.componentoriented.com/wp-content/plugins/tweet-this/icons/de/twitter/de/tt-twitter-micro4.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Working+with+Rocky+Lhotka%E2%80%99s+CSLA+Framework+http%3A%2F%2Fblog.componentoriented.com%2F%3Fp%3D157" title="Post to Twitter">Tweet This Post</a></p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.componentoriented.com/2008/07/working_with_rocky_lhotkas_csla_framework/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Twitter: Snatching Defeat from the jaws of Victory</title>
		<link>http://blog.componentoriented.com/2008/05/twitter_snatching_defeat_from_the_jaws_of_victory/</link>
		<comments>http://blog.componentoriented.com/2008/05/twitter_snatching_defeat_from_the_jaws_of_victory/#comments</comments>
		<pubDate>Fri, 23 May 2008 17:27:11 +0000</pubDate>
		<dc:creator>dlambert</dc:creator>
				<category><![CDATA[Software Reviews]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[<p><img align="right" src="http://www.appdev.info/files/twittersink_sm.jpg" alt="" />It's rare these days that a Web 2.0 <span suggestions="start up,start-up,start,stirrup,statue" class="misspell" id="ifcg0">startup</span> lands a round of financing, and the funding is completely overshadowed with bad news.&#160; Twitter isn't just shooting itself in the foot - it's mowing itself down with a chain gun.</p>
<p>Problem #1 is uptime, or lack thereof.&#160; Anyone who's been on Twitter over the last month or so has experienced a *severe* up-again, down-again roller coaster ride at Twitter.&#160; Every day, it seems like there's an outage, and some of them have lasted for hours.&#160;]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.appdev.info/files/twittersink_sm.jpg" alt="" align="right" />It&#8217;s rare these days that a <a class="zem_slink" title="Web 2.0" rel="wikipedia" href="http://en.wikipedia.org/wiki/Web_2.0">Web 2.0</a> <span id="ifcg0" class="misspell">startup</span> lands a round of financing, and the funding is completely overshadowed with bad news.  <a class="zem_slink" title="Twitter" rel="homepage" href="http://www.twitter.com/">Twitter</a> isn&#8217;t just shooting itself in the foot &#8211; it&#8217;s mowing itself down with a chain gun.</p>
<p>Problem #1 is uptime, or lack thereof.  Anyone who&#8217;s been on Twitter over the last month or so has experienced a *severe* up-again, down-again roller coaster ride at Twitter.  Every day, it seems like there&#8217;s an outage, and some of them have lasted for hours. <!--break--> I&#8217;ve seen by far more blog traffic about &#8220;<span id="ifcg1" class="misspell">Twitter&#8217;s</span> down again&#8221; than I&#8217;ve seen talking up the service itself, and that&#8217;s not good.  Let&#8217;s not forget that Twitter is still solidly in &#8220;early adopter&#8221; territory, and they&#8217;re not going to attract too many mainstream users if the site&#8217;s down.</p>
<p>Twitter has taken some heat for lack of transparency during this episode, and even that has been entertaining.  They&#8217;re blogging about what&#8217;s going on (to some degree), but as a commenter pointed out, they&#8217;re <em id="zuto0">Twitter </em>for Pete&#8217;s sake &#8212; <strong id="gn2v0"><em id="gn2v1">Twitter about it!!</em></strong> It&#8217;s slightly disturbing that this didn&#8217;t come as second nature to these guys, since this is what they do.  I&#8217;ve also noticed that the manner in which they &#8220;splat&#8221; is singularly ungraceful.  When Twitter crashes, I see (on my mobile browser) the <a class="zem_slink" title="PHP" rel="homepage" href="http://php.net/">PHP</a> equivalent to a blue-screen, not a buttoned-down page explaining that there&#8217;s a problem and someone&#8217;s working on it.  <a id="c1xw" title="Here's another take on their error reporting." href="http://www.codinghorror.com/blog/archives/001120.html">Here&#8217;s another take on their error reporting.</a></p>
<p>Now, I understand that one of the purposes of this round of funding they just landed is to shore up their infrastructure and get some of this stuff ironed out, but I wonder if it&#8217;ll happen in time.  Fixes for problems like these, in my experience, are a long time in coming, and an infusion of cash today is still months away from paying dividends once you use the money to hire help, buy servers, configure the servers, install the servers, fix the software, test the software &#8212; you get the picture.</p>
<p>But as bad as this all sounds, uptime may not be Twitter&#8217;s biggest problem.</p>
<p><a id="f_qc" title="Read this." href="http://arielwaldman.com/2008/05/22/twitter-refuses-to-uphold-terms-of-service/">Read this.</a></p>
<p>From everything I&#8217;ve seen so far, Ariel&#8217;s account of events is undisputed and accurate.  Twitter&#8217;s response is pathetic.  After sandbagging for months, they&#8217;re now hiding behind the &#8220;we&#8217;re an infrastructure company, not a content regulator&#8221; argument.  Totally lame, and totally inadequate.</p>
<p>I&#8217;m not aware of anyone who&#8217;s learned about this and hasn&#8217;t been outraged, and I&#8217;m not aware of anyone who&#8217;s defending <span id="ifcg5" class="misspell">Twitter&#8217;s</span> response to-date.  Sometimes, stories like this have a grey area where you could argue either side of the story, but that&#8217;s not true in this case.  Twitter is simply alienating users as fast as this news travels, and it&#8217;s traveling fast.</p>
<p>The only good part about this story (for Twitter) is that it&#8217;s taking attention away from their downtime.  As far as silver linings go, that&#8217;s pretty lousy.</p>
<p>Aside from just condemning Twitter, though, why would we, as software professionals, care about Twitter&#8217;s agony?  That&#8217;s easy &#8211; we want to learn from their mistakes.</p>
<p>The Ariel Waldman mistake is big and obvious, and the lesson is pretty simple, too: Don&#8217;t be a jackass.  If there&#8217;s a problem, acknowledge the problem and meet it head-on.  Don&#8217;t lube up and try to slither past the problem, because it&#8217;s going to keep haunting you until you kill it dead.  The stall tactics, the wordsmithing, the &#8220;we&#8217;re just a humble little infrastructure company&#8221; line are all just ways to bide time in the hopes that the story will just go away on its own.  How&#8217;s that working out, Twitter?</p>
<p>The second lesson seems just as simple, but I don&#8217;t believe it really is.  &#8220;Don&#8217;t build a crummy infrastructure,&#8221; you say.  Sure, but how?  The data model Twitter provides isn&#8217;t as easy to model as you might initially believe.  <a id="lk2p" title="Here's an excellent discussion" href="http://www.readwriteweb.com/archives/making_twitter_scale.php">Here&#8217;s an excellent discussion</a> of what their architecture <em id="iv-o0">might </em>look like.  So it&#8217;s very possible that they&#8217;re facing some architectural challenges far beyond those most of us see in our careers.</p>
<p>Add to that the startup culture of &#8220;features first, then users, then scaling and monitization,&#8221; and you can end up with a code base that works really well at low volumes, but just breaks apart when you start putting a real load on it.  A friend of mine used to tell me all the time that &#8220;the thing that makes you successful today will kill you tomorrow.&#8221;  In this case, that means that our architectures have to be able to absorb change on a wholesale scale.</p>
<p>I really hope Twitter figures this out and pulls through.  They&#8217;ve got a lot going for them, and they&#8217;re close to making the leap to the next level, but they need to get with the program in a big way, like *right now* if they&#8217;re going to pull out of this nosedive.</p>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><a class="zemanta-pixie-a" title="Zemified by Zemanta" href="http://reblog.zemanta.com/zemified/f6066b19-dfe0-4dfa-b5f1-7e785fc89e13/"><img class="zemanta-pixie-img" style="border: medium none; float: right;" src="http://img.zemanta.com/reblog_e.png?x-id=f6066b19-dfe0-4dfa-b5f1-7e785fc89e13" alt="Reblog this post [with Zemanta]" /></a></div>
<p><map name='google_ad_map_153_8cfd796512ec059a'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/153?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_153_8cfd796512ec059a' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=153&amp;url= http%3A%2F%2Fblog.componentoriented.com%2F2008%2F05%2Ftwitter_snatching_defeat_from_the_jaws_of_victory%2F' /></p><div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/home/?status=Twitter%3A+Snatching+Defeat+from+the+jaws+of+Victory+http%3A%2F%2Fblog.componentoriented.com%2F%3Fp%3D153" title="Post to Twitter"><img class="nothumb" src="http://blog.componentoriented.com/wp-content/plugins/tweet-this/icons/de/twitter/de/tt-twitter-micro4.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Twitter%3A+Snatching+Defeat+from+the+jaws+of+Victory+http%3A%2F%2Fblog.componentoriented.com%2F%3Fp%3D153" title="Post to Twitter">Tweet This Post</a></p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.componentoriented.com/2008/05/twitter_snatching_defeat_from_the_jaws_of_victory/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Appdev.info Mobile</title>
		<link>http://blog.componentoriented.com/2008/04/appdev_info_mobile/</link>
		<comments>http://blog.componentoriented.com/2008/04/appdev_info_mobile/#comments</comments>
		<pubDate>Wed, 23 Apr 2008 04:44:48 +0000</pubDate>
		<dc:creator>dlambert</dc:creator>
				<category><![CDATA[Software Reviews]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[RSS]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[<p>Here's a quick way to add a mobile interface for your web site: <a href="http://www.wirenode.com">Wirenode.com </a>lets you feed in your site's RSS feed or edit pages by hand to create a mobile-friendly site in just a minute or two.<a href="http://appdev.wirenode.mobi">&#160; Of course, I made one, too</a>.&#160; Give it a try!</p>]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a quick way to add a mobile interface for your web site: <a href="http://www.wirenode.com">Wirenode.com </a>lets you feed in your site&#8217;s RSS feed or edit pages by hand to create a mobile-friendly site in just a minute or two.<a href="http://appdev.wirenode.mobi"> Of course, I made one, too</a>.  Give it a try!</p>
<p><map name='google_ad_map_151_8cfd796512ec059a'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/151?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_151_8cfd796512ec059a' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=151&amp;url= http%3A%2F%2Fblog.componentoriented.com%2F2008%2F04%2Fappdev_info_mobile%2F' /></p><div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/home/?status=Appdev.info+Mobile+http%3A%2F%2Fblog.componentoriented.com%2F%3Fp%3D151" title="Post to Twitter"><img class="nothumb" src="http://blog.componentoriented.com/wp-content/plugins/tweet-this/icons/de/twitter/de/tt-twitter-micro4.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Appdev.info+Mobile+http%3A%2F%2Fblog.componentoriented.com%2F%3Fp%3D151" title="Post to Twitter">Tweet This Post</a></p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.componentoriented.com/2008/04/appdev_info_mobile/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

