<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Dataplex Technology Solutions Blog</title>
	
	<link>http://dataplex.org/blog</link>
	<description>Web Development, Network Administration, Informaton Security</description>
	<pubDate>Sun, 04 Jan 2009 20:43:17 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/DataplexBlog" type="application/rss+xml" /><item>
		<title>Ottimo ristorante a College Station (Excellent Restaurant in College Station)</title>
		<link>http://feeds.feedburner.com/~r/DataplexBlog/~3/502782698/</link>
		<comments>http://dataplex.org/blog/2009/01/ottimo-ristorante-a-college-station-excellent-restaurant-in-college-station/#comments</comments>
		<pubDate>Sun, 04 Jan 2009 20:43:17 +0000</pubDate>
		<dc:creator>dpx</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<category><![CDATA[bryan]]></category>

		<category><![CDATA[college station]]></category>

		<category><![CDATA[college station restaurant]]></category>

		<category><![CDATA[italian food]]></category>

		<category><![CDATA[texas]]></category>

		<guid isPermaLink="false">http://dataplex.org/blog/?p=94</guid>
		<description><![CDATA[Saturday night my mom came up and watched our 15 month old while the wife and I went out on a date. She is now 23 weeks pregnant and so of course she gets to choose the dining arrangements! She was ruling out almost everything except authenticate Italian food, but she didn&#8217;t want to go [...]]]></description>
			<content:encoded><![CDATA[<p>Saturday night my mom came up and watched our 15 month old while the wife and I went out on a date. She is now 23 weeks pregnant and so of course she gets to choose the dining arrangements! She was ruling out almost everything except authenticate Italian food, but she didn&#8217;t want to go to a chain restaurant such as Johnny Carino&#8217;s or Olive Garden.</p>
<p>Then she remembered this little place by the College Station Medical Center she had seen while going to her doctors. The restaurant is <a title="Visit their excellent website" href="http://www.luigispatioristorante.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.luigispatioristorante.com');" target="_blank">Luigi&#8217;s Patio Ristorante</a>, and it is located in a little shopping center at the intersection of highway 6 north and Rock Prairie road. They have directions <a title="How to get to Luigi's" href="http://www.luigispatioristorante.com/Directions.aspx" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.luigispatioristorante.com');" target="_blank">on their website here</a>. I had never seen it before and I&#8217;m always willing to try out new restaurants and food, so we headed that way.</p>
<p>The outside of Luigi&#8217;s is nothing special&#8230; it&#8217;s <a title="Read about Luigi's design concept " href="http://www.luigispatioristorante.com/Concepts.aspx" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.luigispatioristorante.com');" target="_blank">true beauty is inside</a>. They have done an exquisite job of decorating the interior so that you forget you are in College Station, TX. When you walk in you are instantly transported to a patio in Italy! We noticed a <a title="Luigi's has excellent entertainment" href="http://www.luigispatioristorante.com/Entertainment.aspx" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.luigispatioristorante.com');" target="_blank">little band stage</a> when we arrived at 6:00 PM, but they did not play until 9:00. I was kind of bummed because I really enjoy live jazz music.</p>
<p>We started the meal off with an order of calamari that was absolutely fabulous. Sometimes calamari can be over cooked which makes it too hard, or the batter used is too thick. However, <em><strong>the calamari was perfectly cooked and breaded and the marinara sauce and tartar sauce that came with it was fresh and delicious</strong></em>. We usually stick with one appetizer, but we decided to order some soup. We figured if the calamari was that good the soup had to be good too.<span id="more-94"></span></p>
<p>We decided to split a bowl of the minestrone and it came out pretty quickly.<em><strong> Hands down </strong><strong>it is the best minestrone I&#8217;ve ever had in my life</strong></em>. It was chocked full of vegetables and just the right amount of pepper and seasoning. Whoever prepared the soup knew exactly what they were doing in making perfect soup! Typically this is where the meal comes in, but again because the soup was so good we decided to go for the other soup on the menu - a tomato basil.</p>
<p>This is but one of the parts of the story where the plot crescendos for Luigi&#8217;s hospitality. My wife doesn&#8217;t really like tomato basil but she was really craving a cream based tomato soup. Unfortunately, the waiter informed us, the tomato soup of the night was not cream based. He saw the disappointment on my wife&#8217;s face and whisked away to the kitchen. <em><strong>Within 10 minutes the chef had prepared - from scratch - a cream based tomato basil soup just for her!</strong></em> I&#8217;m lactose intolerant so I typically try and stay away from heavy cream. But this soup was, again, perfect! I would go there again just to have a taste of that soup and I would bring my lactaid! I cannot describe in words the wonderfulness of the soup they make, but suffice to say you will have to go there to experience it for yourself.</p>
<p>Did I mention the bread? My wife and I love bread with our meal so we requested some with our soups. The waiter brought what I think was some type of sour dough or ciabatta bread with extra virgin olive oil on it. It was still warm and we are pretty sure they prepare it fresh each time they bring it out. We asked for more after the first plate was gone and the second batch came out just a little different. It gave the bread a personality you usually only find in homemade bread.</p>
<p>After a bit of good conversation the main course arrived. My wife had chicken fettuccini alfredo that was delicious and I had penne con funghi porcini which was again delicious. The servings were huge and neither of us finished our main course. I would have taken it home but we were headed to a movie and I didn&#8217;t want it to spoil in the car. I miss my bowl of pasta :(. Based on these two meals I would guess you can&#8217;t find anything bad on <a title="Read Luigi's Menu" href="http://www.luigispatioristorante.com/files/luigis-dinner-menu.pdf" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.luigispatioristorante.com');" target="_blank">the menu</a> (PDF).</p>
<p>Finally, we arrived at dessert. We usually don&#8217;t order dessert but the waiter did a fantastic job of describing their special dessert of the evening. I cannot recall the name of the dessert, but it was two slices of multi-layered walnut vanilla and chocolate ice cream, and pistachio gelato with an orange grenadine soaked slice of sweet cake between the ice cream and the gelato. The whole thing was garnished with fresh blueberries and blueberry syrup. Even though I&#8217;m lactose intolerant I made an exception because of the wonderful flavor.</p>
<p>After dinner, we went and saw Marley and Me, which was wonderful. I&#8217;ll save that for another post because I cried like a baby at the end of it (as all the reviews said I would). The interesting part here is that I left my credit card at the restaurant! I must have been talking about the great experience and left it in the ticket book. They are open until midnight on Saturday so we drove back to pick up my card.</p>
<p>Again, walking into the restaurant is an experience in and of itself. We talked to the manager (I&#8217;m guessing) and he went to get our card. The great thing about this is that he actually asked for ID before handing the card over. I respect that he had the foresight to question me before handing over the key to my castle so to speak.</p>
<p>He also informed us that <a title="Luigi's has excellent entertainment" href="http://www.luigispatioristorante.com/Entertainment.aspx" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.luigispatioristorante.com');" target="_blank">the band was about to start playing</a> so we decided to sit down and listen. The manager then started playing saxophone in the band! The jazz music was great and I wish we could have stayed and listened longer. We were both getting tired (as all parents of small children do around 10 PM) so we had to leave. Just as we were getting ready to leave, the owner (again a guess - he was an older man with a lot of soul, and he is featured on their website) started playing a clarinet solo. Again, fascinating music that just added even more to the atmosphere!</p>
<p>All in all, we are very very glad we went to Luigi&#8217;s and have decided to make it a regular in our date nights. We ended up getting out right around $60 (including tip) for a very nice dinner date. I would not take our child there because it might disturb the atmosphere. But I&#8217;m sure when she gets older we will include her in the great experience!</p>
]]></content:encoded>
			<wfw:commentRss>http://dataplex.org/blog/2009/01/ottimo-ristorante-a-college-station-excellent-restaurant-in-college-station/feed/</wfw:commentRss>
		<feedburner:origLink>http://dataplex.org/blog/2009/01/ottimo-ristorante-a-college-station-excellent-restaurant-in-college-station/</feedburner:origLink></item>
		<item>
		<title>Fixing NAnt 0.86 Beta 1 for .NET 3.5 Continuous Integration</title>
		<link>http://feeds.feedburner.com/~r/DataplexBlog/~3/502740482/</link>
		<comments>http://dataplex.org/blog/2009/01/fixing-nant-086-beta-1-for-net-35-continuous-integration/#comments</comments>
		<pubDate>Sun, 04 Jan 2009 19:32:55 +0000</pubDate>
		<dc:creator>dpx</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[build server]]></category>

		<category><![CDATA[cruise control]]></category>

		<category><![CDATA[NAnt]]></category>

		<category><![CDATA[nant registry hack]]></category>

		<category><![CDATA[visual studio]]></category>

		<category><![CDATA[windows sdk]]></category>

		<guid isPermaLink="false">http://dataplex.org/blog/?p=92</guid>
		<description><![CDATA[I recently had a little problem with my build scripts on my CI server. Since I have Visual Studio 2008 installed on my development machine, NAnt finds the Windows SDK v6.0A installed (flack from the VS2k8 install) and runs along happily building .NET 3.5 libraries (where I use WCF for SOA layers). However, when I [...]]]></description>
			<content:encoded><![CDATA[<p>I recently had a little problem with my build scripts on my CI server. Since I have Visual Studio 2008 installed on my development machine, NAnt finds the Windows SDK v6.0A installed (flack from the VS2k8 install) and runs along happily building .NET 3.5 libraries (where I use WCF for SOA layers). However, when I recently created a new build server without installing Visual Studio, I kept getting these errors about the sdkInstallRoot not being found for net-3.5. I went ahead and downloaded and installed the latest Windows SDK for Vista (v6.1), but it had no effect on the build scripts.<span id="more-92"></span></p>
<p>I started digging into the blogosphere and found <a title="Nant Setup for Visual Studio 2008 and .net 3.5" href="http://www.timbarcz.com/blog/CategoryView,category,Nant.aspx" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.timbarcz.com');" target="_blank">an article by Tim Barcz</a> describing how to fix NAnt for .NET 3.5. This lead me to doing a little poking around in the NAnt.exe.config file, and I found the following registry key search:</p>
<blockquote><p>&lt;readregistry<br />
property=&#8221;sdkInstallRoot&#8221;<br />
key=&#8221;SOFTWARE\Microsoft\Microsoft SDKs\Windows\v6.0A\WinSDKNetFxTools\InstallationFolder&#8221;<br />
hive=&#8221;LocalMachine&#8221;<br />
failonerror=&#8221;false&#8221; /&gt;</p></blockquote>
<p>The funny thing about that registry key is that it exists when you install Visual Studio, but not when you install the latest SDK. I did not want to alter the config file because on developer machines in a large team, you&#8217;re more likely to see Visual Studio installed than not. The above registry key is found then, and everything works. But for a build server where the basics are installed (CruiseControl.NET, Subversion, and the Windows SDK v6.1), this doesn&#8217;twork out so well.</p>
<p>What I ended up doing was creating a registry key on the build server that mimiced the above key, but actually pointed to the 6.1 SDK. Once NAnt can find the installed SDK path, it actually links to the proper libraries (usually found in C:\Windows\Micrsoft.NET\Framework\v3.5 and v3.0 respectively). This keeps the NAnt config file the same, thus sparing developers from having to modify their registry, and fixes the build server so it can compile against .NET 3.0 and 3.5 libraries.</p>
]]></content:encoded>
			<wfw:commentRss>http://dataplex.org/blog/2009/01/fixing-nant-086-beta-1-for-net-35-continuous-integration/feed/</wfw:commentRss>
		<feedburner:origLink>http://dataplex.org/blog/2009/01/fixing-nant-086-beta-1-for-net-35-continuous-integration/</feedburner:origLink></item>
		<item>
		<title>Automating Code Review Tools - FxCop - Part III</title>
		<link>http://feeds.feedburner.com/~r/DataplexBlog/~3/500502623/</link>
		<comments>http://dataplex.org/blog/2009/01/automating-code-review-tools-fxcop-part-iii/#comments</comments>
		<pubDate>Thu, 01 Jan 2009 22:39:39 +0000</pubDate>
		<dc:creator>dpx</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[automation]]></category>

		<category><![CDATA[code reviews]]></category>

		<category><![CDATA[Continuous Integration]]></category>

		<category><![CDATA[FxCop]]></category>

		<category><![CDATA[NAnt]]></category>

		<category><![CDATA[nant contrib]]></category>

		<guid isPermaLink="false">http://dataplex.org/blog/?p=90</guid>
		<description><![CDATA[The third post in this series on Automating Code Review tools will cover FxCop. FxCop is a coding standard and introspective analysis tool that looks at code using a ruleset and analyzes things such as code design (&#8221;should this method be static, internal, etc&#8221;) and performance (&#8221;change this method to static because it never uses [...]]]></description>
			<content:encoded><![CDATA[<p>The third post in this series on Automating Code Review tools will cover <a title="Learn about FxCop from Microsoft" href="http://msdn.microsoft.com/en-us/library/bb429476(vs.80).aspx" onclick="javascript:pageTracker._trackPageview('/outbound/article/msdn.microsoft.com');" target="_blank">FxCop</a>. FxCop is a coding standard and introspective analysis tool that looks at code using a ruleset and analyzes things such as code design (&#8221;should this method be static, internal, etc&#8221;) and performance (&#8221;change this method to static because it never uses the &#8216;this&#8217; member&#8221;).</p>
<p>I have added FxCop to the automation on several projects I run and found out the hard way just what Microsoft thinks of my code. Actually, there were not a lot of code errors that were show stoppers. Most of the errors came from the Microsoft.Design and Microsoft.Performance rule sets of FxCop. I also had a strong naming error on all my libraries, which I fixed with some quick public/private keypair generation tools (more on this later).</p>
<p>So today&#8217;s post is about automating FxCop and fixing some of the likely rule violations you are going to see in your output. You can also follow the FxCop Blog at http://blogs.msdn.com/fxcop/.</p>
<p><span id="more-90"></span><strong>FxCop Setup and NAntContrib</strong></p>
<p>The first thing to do is <a title="Download FxCop from code.msdn.microsoft.com" href="http://code.msdn.microsoft.com/Release/ProjectReleases.aspx?ProjectName=codeanalysis&amp;ReleaseId=553" onclick="javascript:pageTracker._trackPageview('/outbound/article/code.msdn.microsoft.com');" target="_blank">download and install FxCop</a>. FxCop is only available as an executable so you have to install it first and then copy the files it puts in the installation path you specify to your project&#8217;s tools directory. This process is pretty straight forward and there are no other dependencies you have to resolve to get FxCop working from your project repository without having it installed on the development computer you are working on.</p>
<p>The second thing to do (if you haven&#8217;t already) is <a title="Visit NAntContrib Homepage" href="http://nantcontrib.sourceforge.net/" onclick="javascript:pageTracker._trackPageview('/outbound/article/nantcontrib.sourceforge.net');" target="_blank">download and install NAntContrib</a>. NAntContrib contains a lot of useful tasks that NAnt does not, including the fxcop task. In my project&#8217;s repository I have FxCop in ${root.dir}\tools\FxCop and NAntContrib in ${root.dir}\tools\NAntContrib.</p>
<p><strong>NAnt Build File Setup</strong></p>
<p>First you have to make the NAntContrib tasks available to your build files. I use properties to specify paths in my projects so I can reuse them in submodules of my project. For this example, we will assume you have set these up, along with the properties set below. The following should be put at the top of your build right under the project element:</p>
<blockquote><p>&lt;property name=&#8221;root.dir&#8221; value=&#8221;.&#8221; /&gt;<br />
&lt;property name=&#8221;build.dir&#8221; value=&#8221;${root.dir}\build&#8221; /&gt;<br />
&lt;property name=&#8221;tools.dir&#8221; value=&#8221;${root.dir}\tools&#8221; /&gt;<br />
&lt;property name=&#8221;tools.nantcontrib.dir&#8221; value=&#8221;${tools.dir}\NAntContrib&#8221; /&gt;<br />
&lt;property name=&#8221;tools.fxcop.dir&#8221; value=&#8221;${tools.dir}\fxcop&#8221; /&gt;</p>
<p>&lt;!&#8211; Load the NAntContrib Tasks &#8211;&gt;<br />
&lt;loadtasks assembly=&#8221;${tools.nantcontrib.dir}\NAnt.Contrib.Tasks.dll&#8221; /&gt;</p></blockquote>
<p><strong>The Build Target</strong></p>
<p>The next thing to do is define a build target that will compile your code. Before I added FxCop, here is what my build target looked like:</p>
<blockquote><p>&lt;target name=&#8221;build&#8221; depends=&#8221;clean,init&#8221; description=&#8221;Compiles the code into a DLL&#8221;&gt;<br />
&lt;property name=&#8221;compile.dir&#8221; value=&#8221;${project::get-name()}.Source&#8221; /&gt;<br />
&lt;csc target=&#8221;library&#8221; output=&#8221;${build.dir}/${compile.dir}.dll&#8221; debug=&#8221;${debug.compile}&#8221;&gt;<br />
&lt;sources&gt;<br />
&lt;include name=&#8221;${compile.dir}/**/*.cs&#8221; /&gt;<br />
&lt;/sources&gt;<br />
&lt;references&gt;<br />
&lt;!&#8211; Put necessary references here &#8211;&gt;<br />
&lt;/references&gt;<br />
&lt;/csc&gt;<br />
&lt;/target&gt;</p></blockquote>
<p><strong>Setting Up the Environment for FxCop<br />
</strong></p>
<p>Since we have loaded NAntContrib, the <a title="Read NantContrib documentation on FxCop task" href="http://nantcontrib.sourceforge.net/release/0.85/help/tasks/fxcop.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/nantcontrib.sourceforge.net');" target="_blank">fxcop task</a> is available to us, but we first have to do some setup. The fxcop task assumes that  the FxCop executable (FxCopCmd.exe) is available from somewhere in your PATH environment variable. Since we removed it from Program Files, this is no longer true and we need to add the path to the FxCop directory to our PATH environment variable. We don&#8217;t want this to be permanent however since we don&#8217;t really want to mess with the environment any more than is necessary for our build to run. The following code should be placed under the properties and loadtask stuff we put in our build file earlier:</p>
<p>&lt;!&#8211; FxCop PATH Resolution &#8211;&gt;<br />
&lt;if test=&#8221;${not property::exists(&#8217;setFxCopPath&#8217;)}&#8221;&gt;<br />
&lt;<a title="NAnt setenv documentation" href="http://nant.sourceforge.net/release/0.85/help/tasks/setenv.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/nant.sourceforge.net');" target="_blank">setenv</a> name=&#8221;PATH&#8221; value=&#8221;${<a title="environment get variable documentation" href="http://nant.sourceforge.net/release/0.85/help/functions/environment.get-variable.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/nant.sourceforge.net');" target="_blank">environment::get-variable</a>(&#8217;PATH&#8217;)};${tools.fxcop.dir}&#8221; /&gt;<br />
&lt;property name=&#8221;setFxCopPath&#8221; value=&#8221;true&#8221; /&gt;<br />
&lt;/if&gt;</p>
<p>You don&#8217;t actually need the if statement when using only one build file. I put this in a global properties file that is loaded in each build file. However, I do not want the PATH variable to be inundated with the fxcop directory so I test to see if I&#8217;ve already loaded it or not.</p>
<p><strong>Adding FxCop to Your Build File</strong></p>
<p>The next stop of course is to actually run FxCop on your assemblies and see what happens. So, without further ado, here is the target:</p>
<blockquote><p>&lt;target name=&#8221;fxcop&#8221; depends=&#8221;build&#8221; description=&#8221;Runs the FxCop tool over the set of libraries&#8221;&gt;<br />
&lt;<a title="fxcop task documentation" href="http://nantcontrib.sourceforge.net/release/0.85/help/tasks/fxcop.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/nantcontrib.sourceforge.net');" target="_blank">fxcop</a>&gt;<br />
&lt;targets&gt;<br />
&lt;include name=&#8221;${build.dir}\*.dll&#8221; /&gt;<br />
&lt;/targets&gt;<br />
&lt;arg value=&#8221;/out:${reports.dir}\fxcop.xml&#8221; /&gt; &lt;!&#8211; Change the directory where the output is saved  &#8211;&gt;<br />
&lt;arg value=&#8221;/directory:${lib.entlib.dir}&#8221; /&gt; &lt;!&#8211; Look in the entlib directory for supporting libraries used in the project &#8211;&gt;<br />
&lt;!&#8211; &lt;arg value=&#8221;/rid:-Microsoft.Design#CA2210&#8243; /&gt;  - Example of ignoring a specific rule - Ignore the Strong Naming Rule &#8211;&gt;<br />
&lt;arg value=&#8221;/fo&#8221; /&gt; &lt;!&#8211; Force output even if there are no violatons &#8211;&gt;<br />
&lt;/fxcop&gt;<br />
&lt;/target&gt;</p></blockquote>
<p>This target is running FxCop on the specified libaries in the build directory. It saves the output file to a specific location (which our CI server can save as an artifact). It also looks in a directory where other used libaries are located (in the case that they aren&#8217;t all in your build directory). Finally, I added a flag to force output even when there are no violations (/fo). This ensures a report artifact is generated without using a bunch of if statements in my CI&#8217;s NAnt file.</p>
<p>Another nice thing about FxCop that does not occur with CAT.NET is that it will fail the build automatically when it finds violations. When violations are found the return code from the command line utility is greater than 0 and NAnt will automatically fail the build unless you specify failonerror=&#8221;false&#8221;. Therefore, you don&#8217;t need a lot of extra build file code to check for errors with this utility.</p>
<p><strong>Common Errors - Assembly Not Strongly Named<br />
</strong></p>
<p>The first error I ran into was the strong naming error (rule Microsoft.Design#CA2210). Basically, Microsoft likes all of their assemblies to be <a title="Learn about strong naming in .NET" href="http://www.codeguru.com/columns/experts/article.php/c4643" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.codeguru.com');" target="_blank">strongly named</a> (cryptographically signed with a private key). To get around this, we need to sign our assemblies. Finding information on how to do this can be a little tricky, but the jist of it is:</p>
<ol>
<li>Open a Visual Studio 2005/2008 Command Prompt from the Start Menu (Start-&gt;Programs-&gt;Microsoft Visual Studio 2008-&gt;Visual Studio Tools-&gt;Visual Studio Command Prompt)</li>
<li>Change to your project directory (cd C:\Dev\Project1)</li>
<li>Run the command to generate a keyfile (sn.exe -k Project1.snk)
<ol>
<li>You can also seperate the public/private key in the case where your private key is only available to a small group of people and others use the public key by running: sn -p Project1.snk PublicProject1.snk</li>
</ol>
</li>
<li>Define a property in your project specifying the path to the keyfile (&lt;property name=&#8221;assembly.keyfile&#8221; value=&#8221;${root.dir}\Project1.snk&#8221; /&gt;)</li>
<li>On your csc tasks add the following attribute: keyfile=&#8221;${assembly.keyfile}&#8221;</li>
</ol>
<p>That&#8217;s it. Your assemblies will now be strongly named, and the violation will go away in FxCop. Obviously you may want to take this a step further and delay sign them and keep your private key available only in a secured location where deployment occurs.</p>
<p><strong>Common Errors - Assembly Information Missing</strong></p>
<p>The next error also deals with assembly attributes. When you define a new project in Visual Studio, it automatically adds an AssemblyInfo.cs file which contains things like the assembly title, description, copyright, keyfile, and more. there are a whole list of Assembly&lt;Something&gt;Attribute decorators you can use in your assembly. I have created a target that is called in all my compile targets right before I run csc that generates an AssemblyInfo.cs file for each project. The nice thing is that this lends itself to automating your versioning (another article) if you so choose. The target and an example of how I use it is below:</p>
<blockquote><p>&lt;target name=&#8221;GenerateAssemblyFile&#8221; description=&#8221;Generates an AssemblyInfo.cs File for inclusion in the compile methods&#8221;&gt;<br />
&lt;<a title="Read NAnt asminfo task documentation" href="http://nant.sourceforge.net/release/0.85/help/tasks/asminfo.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/nant.sourceforge.net');" target="_blank">asminfo</a> output=&#8221;${compile.dir}\AssemblyInfo.cs&#8221; language=&#8221;CSharp&#8221;&gt;<br />
&lt;imports&gt;<br />
&lt;import namespace=&#8221;System&#8221; /&gt;<br />
&lt;import namespace=&#8221;System.Reflection&#8221; /&gt;<br />
&lt;import namespace=&#8221;System.EnterpriseServices&#8221; /&gt;<br />
&lt;import namespace=&#8221;System.Runtime.InteropServices&#8221; /&gt;<br />
&lt;/imports&gt;<br />
&lt;attributes&gt;<br />
&lt;attribute type=&#8221;ComVisibleAttribute&#8221; value=&#8221;false&#8221; /&gt;<br />
&lt;attribute type=&#8221;CLSCompliantAttribute&#8221; value=&#8221;true&#8221; /&gt;<br />
&lt;attribute type=&#8221;AssemblyVersionAttribute&#8221; value=&#8221;${assembly.version}&#8221; /&gt;<br />
&lt;attribute type=&#8221;AssemblyTitleAttribute&#8221; value=&#8221;${assembly.title}&#8221; /&gt;<br />
&lt;attribute type=&#8221;AssemblyDescriptionAttribute&#8221; value=&#8221;${assembly.description}&#8221; /&gt;<br />
&lt;attribute type=&#8221;AssemblyCopyrightAttribute&#8221; value=&#8221;${assembly.copyright}&#8221; /&gt;<br />
&lt;attribute type=&#8221;ApplicationNameAttribute&#8221; value=&#8221;${assembly.name}&#8221; /&gt;<br />
&lt;/attributes&gt;<br />
&lt;references&gt;<br />
&lt;include name=&#8221;System.EnterpriseServices.dll&#8221; /&gt;<br />
&lt;/references&gt;<br />
&lt;/asminfo&gt;<br />
&lt;/target&gt;</p></blockquote>
<p>And the compile target that calls it:</p>
<blockquote><p>&lt;target name=&#8221;compile.models&#8221; depends=&#8221;init&#8221;&gt;<br />
&lt;property name=&#8221;compile.dir&#8221; value=&#8221;${project::get-name()}.Models&#8221; /&gt;<br />
&lt;property name=&#8221;assembly.title&#8221; value=&#8221;Models Library&#8221; /&gt;<br />
&lt;property name=&#8221;assembly.description&#8221; value=&#8221;Models Library for the MVC framework&#8221; /&gt;<br />
&lt;property name=&#8221;assembly.name&#8221; value=&#8221;${project::get-name()}.Models&#8221; /&gt;<br />
&lt;call target=&#8221;GenerateAssemblyFile&#8221; /&gt;</p>
<p>&lt;csc target=&#8221;library&#8221; output=&#8221;${build.dir}/${compile.dir}.dll&#8221; debug=&#8221;${debug.compile}&#8221; keyfile=&#8221;${assembly.keyfile}&#8221;&gt;<br />
&lt;sources&gt;<br />
&lt;include name=&#8221;${compile.dir}/**/*.cs&#8221; /&gt;<br />
&lt;/sources&gt;<br />
&lt;references&gt;<br />
&lt;include name=&#8221;${build.base.dir}/.Services.Proxy.dll&#8221; /&gt;<br />
&lt;/references&gt;<br />
&lt;/csc&gt;<br />
&lt;/target&gt;</p></blockquote>
<p>The target creates a bunch of properties to use in the GenerateAssemblyInfo target and then calls the genertion target. ${assembly.version} can be predefined, or you can use the NAntContrib &#8216;version&#8217; task to automate the version number information.</p>
<p><strong>Conclusion</strong></p>
<p>FxCop is a great tool to help your team stick to recognized framework coding standards that include design time, performance, and security issues. It still does not replace a human code review and it should only be used to augment your code review processes.</p>
]]></content:encoded>
			<wfw:commentRss>http://dataplex.org/blog/2009/01/automating-code-review-tools-fxcop-part-iii/feed/</wfw:commentRss>
		<feedburner:origLink>http://dataplex.org/blog/2009/01/automating-code-review-tools-fxcop-part-iii/</feedburner:origLink></item>
		<item>
		<title>Update to CAT.NET NAnt Target</title>
		<link>http://feeds.feedburner.com/~r/DataplexBlog/~3/500287880/</link>
		<comments>http://dataplex.org/blog/2009/01/update-to-catnet-nant-target/#comments</comments>
		<pubDate>Thu, 01 Jan 2009 16:29:09 +0000</pubDate>
		<dc:creator>dpx</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[automation]]></category>

		<category><![CDATA[CAT.NET]]></category>

		<category><![CDATA[code analysis]]></category>

		<category><![CDATA[NAnt]]></category>

		<guid isPermaLink="false">http://dataplex.org/blog/?p=85</guid>
		<description><![CDATA[Yesterday I posted about automating CAT.NET. Today while adding it to another build file, I ran across a great error! The tool did not detect any vulnerabilities in my code and therefore the XPath used in the xmlpeek task failed! This caused the build to fail with a false positive. I&#8217;ve updated my target to [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday I posted about automating CAT.NET. Today while adding it to another build file, I ran across a great error! The tool did not detect any vulnerabilities in my code and therefore the XPath used in the xmlpeek task failed! This caused the build to fail with a false positive. I&#8217;ve updated my target to include the failonerror=&#8221;false&#8221; for the xmlpeek task and an if statement around the fail task that checks for the hasError property first. If it doesn&#8217;t exist the xmlpeek task did not find anything to put in the property and we do not need to fail the build.<span id="more-85"></span></p>
<p>Here is the new task:</p>
<blockquote><p>&lt;target name=&#8221;catnet&#8221; description=&#8221;Runs the CAT.NET static code analysis tool on a set of libraries&#8221;&gt;<br />
&lt;exec program=&#8221;${root.dir}\Microsoft\CAT.NET\CatNetCmd.exe&#8221; workingdir=&#8221;.&#8221; output=&#8221;catnetout.log&#8221;&gt;<br />
&lt;arg value=&#8221;/file:${build.dir}\${project::get-name()}.Models.dll&#8221; /&gt;<br />
&lt;arg value=&#8221;/file:${build.dir}\${project::get-name()}.Views.dll&#8221; /&gt;<br />
&lt;arg value=&#8221;/file:${build.dir}/${project::get-name()}.Presenters.dll&#8221; /&gt;<br />
&lt;arg value=&#8221;/file:${build.dir}/${project::get-name()}.Web.dll&#8221; /&gt;<br />
&lt;arg value=&#8221;/report:${reports.dir}\CatNetReport.xml&#8221; /&gt;<br />
&lt;arg value=&#8221;/reportxsloutput:${reports.dir}\CatNetReport.html&#8221; /&gt;<br />
&lt;/exec&gt;</p>
<p>&lt;!&#8211; Check for errors since the command doesn&#8217;t throw error codes &#8211;&gt;<br />
&lt;loadfile file=&#8221;catnetout.log&#8221; property=&#8221;catnetout&#8221; /&gt;<br />
&lt;fail if=&#8221;${string::contains(catnetout, &#8216;ERROR&#8217;)}&#8221; message=&#8221;There was an error running CAT.NET Static Analysis&#8221; /&gt;<br />
&lt;!&#8211; Clean up if we didn&#8217;t error out &#8211;&gt;<br />
&lt;delete file=&#8221;catnetout.log&#8221; /&gt;</p>
<p>&lt;xmlpeek file=&#8221;${reports.dir}\CatNetReport.xml&#8221;<br />
property=&#8221;hasErrors&#8221;<br />
xpath=&#8221;//Rule[TotalResults&gt;0]/Results/Result/ProblemDescription&#8221; failonerror=&#8221;false&#8221; /&gt;<br />
&lt;if test=&#8221;${property::exists(&#8217;hasErrors&#8217;)}&#8221;&gt;<br />
&lt;fail if=&#8221;${string::get-length(hasErrors) &amp;gt; 0}&#8221; message=&#8221;CAT.NET found at least one problem: ${hasErrors}&#8221; /&gt;<br />
&lt;/if&gt;<br />
&lt;/target&gt;</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://dataplex.org/blog/2009/01/update-to-catnet-nant-target/feed/</wfw:commentRss>
		<feedburner:origLink>http://dataplex.org/blog/2009/01/update-to-catnet-nant-target/</feedburner:origLink></item>
		<item>
		<title>Automating Code Review Tools - CAT.NET - Part II</title>
		<link>http://feeds.feedburner.com/~r/DataplexBlog/~3/499811425/</link>
		<comments>http://dataplex.org/blog/2008/12/automating-code-review-tools-catnet-part-ii/#comments</comments>
		<pubDate>Wed, 31 Dec 2008 23:32:33 +0000</pubDate>
		<dc:creator>dpx</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[Information Security]]></category>

		<category><![CDATA[.NET security]]></category>

		<category><![CDATA[automation]]></category>

		<category><![CDATA[CAT.NET]]></category>

		<category><![CDATA[cisg]]></category>

		<category><![CDATA[code review]]></category>

		<category><![CDATA[Continuous Integration]]></category>

		<category><![CDATA[Microsoft]]></category>

		<category><![CDATA[NAnt]]></category>

		<category><![CDATA[static code analysis]]></category>

		<guid isPermaLink="false">http://dataplex.org/blog/?p=80</guid>
		<description><![CDATA[The other day in Part I of this series I said I was going to write up some more articles about automating code review tools in your build process. Today I spent some time looking over CAT.NET and figuring out how it fits into my build process. CAT.NET is a static code analysis tools that [...]]]></description>
			<content:encoded><![CDATA[<p>The other day in <a title="Read Part I first" href="http://dataplex.org/blog/2008/12/automating-code-review-tools-part-i/"  target="_blank">Part I of this series</a> I said I was going to write up some more articles about automating code review tools in your build process. Today I spent some time looking over <a title="The CTP Release of CAT.NET and the Anti-XSS Tool" href="http://blogs.msdn.com/cisg/archive/2008/12/15/anti-xss-3-0-beta-and-cat-net-community-technology-preview-now-live.aspx" onclick="javascript:pageTracker._trackPageview('/outbound/article/blogs.msdn.com');" target="_blank">CAT.NET</a> and figuring out how it fits into my build process. <a title="Part II of a Series on CAT.NET at the CISG Blog" href="http://blogs.msdn.com/cisg/archive/2008/12/22/security-code-review-using-cat-net-part-2.aspx" onclick="javascript:pageTracker._trackPageview('/outbound/article/blogs.msdn.com');" target="_blank">CAT.NET is a static code analysis</a> tools that analyzes data flow through a .NET library or executable and tries to identify common security problems such as cross site scripting (XSS) and SQL Injection (SQLi) vulnerabilities. My process is not perfect but it does the job well enough. <strong><em>Remember, you should always augment automated tools with a human review to catch things automation cannot.<span id="more-80"></span></em></strong></p>
<p><strong>CAT.NET Installation</strong></p>
<p>The first thing to do is <a title="Downlaod 32-bit CAT.NET installer" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=0178e2ef-9da8-445e-9348-c93f24cc9f9d&amp;displaylang=en" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.microsoft.com');" target="_blank">download the CAT.NET MSI installer</a>. Then either unpack it or do what I did and install it, copy the files from C:\Program Files\Microsoft\CAT.NET to your project directory, and uninstall. I  like to keep all tools contained within the svn repositories for a project so they can be utilized on any development computer without having to set it up first.</p>
<p>One funny thing with CAT.NET (<a title="CISG Blog" href="http://blogs.msdn.com/cisg/default.aspx" onclick="javascript:pageTracker._trackPageview('/outbound/article/blogs.msdn.com');" target="_blank">CISG</a> take note) is that it has to live in a specific path within the project repository. When it was put in {root.dir}\tools\CAT.NET it failed to find the config files, default rules files, etc. It was looking for them at Microsoft\CAT.NET so I broke with my standards (laziness really) and moved it to {root.dir}\Microsoft\CAT.NET. The tool is much happier there and still available in the build file.</p>
<p><strong>Basics of The Project</strong></p>
<p>The demo project is a website that takes in a cat&#8217;s name, tail length, and color and then repeats them back to the page (&#8221;You have entered: &lt;name&gt;, &lt;tail length&gt;, &lt;color&gt;&#8221;). When the user fills in the textboxes and clicks submit, the page creates a CatContext object, fills it with the values taken from the page, and passes it to a CatEngine object. The CatEngine.GetMyCat() method returns the values and they are put in ASP Labels on the page - lblName.Text = cEngine.GetMyCat().Name, etc etc. The CatEngine and CatContext classes are defined in the ClassLibrary1 project (original eh?) and the website code (Default.aspx) is in the WebApplication1 project.</p>
<p>The important thing to note with this project is that the CatEngine does not do any cleaning or validation on the input or output. This is a clear cut example of a Cross Site Scripting vulnerability (and possibly a SQLi vulnerability if the input were eventually put in a database). Both of these situations are caught with CAT.NET, so it is a good tool to have in your build process.</p>
<p><strong>Project Repository Layout</strong></p>
<p>The following is the layout of the project repository (in the root.dir):</p>
<ul>
<li>ClassLibrary1\
<ul>
<li>bin\</li>
<li>CatContext.cs - A value object for holding information about a cat (name, tail length, and color)</li>
<li>CatEngine.cs - The &#8220;business object&#8221; that takes in a CatContext object and has a method - CatContext GetMyCat() that returns the object</li>
<li>ClassLibrary1.csproj</li>
</ul>
</li>
<li>Microsoft\CAT.NET\
<ul>
<li>Config\</li>
<li>Rules\</li>
<li>CatNetCmd.exe</li>
<li>Other CAT.NET files (from the download) *</li>
</ul>
</li>
<li>tools\
<ul>
<li>nant\
<ul>
<li>nant.exe</li>
<li>Other nant files</li>
</ul>
</li>
</ul>
</li>
<li>WebApplication1\
<ul>
<li>Default.aspx - The page with the XSS vulnerability in it</li>
<li>Default.aspx.cs - The code behind for the page</li>
<li>web.config</li>
<li>WebApplication1.csproj</li>
</ul>
</li>
<li>build.bat - Easy way to run nant - (Tools\nant\NAnt.exe -buildfile:default.build %* -nologo)</li>
<li>default.build - The build file for the solution</li>
<li>Solution1.sln</li>
</ul>
<p><strong>The Build File</strong></p>
<p>The build file is a typical <a title="NAnt homepage" href="http://nant.sourceforge.net/" onclick="javascript:pageTracker._trackPageview('/outbound/article/nant.sourceforge.net');" target="_blank">NAnt</a> build file with the following properties and targets</p>
<ul>
<li>Properties
<ul>
<li>build.dir - Directory to put the output from the csc task (C# Source Compiler)</li>
<li>dist.dir - Directory to put all file that are necessary for a deployment of the application to a webserver (also where the local IIS is configured to look when manually testing the site)</li>
<li>artifacts.dir - Directory to hold reports generated from NUnit, CAT.NET, FxCop, and other tools that generate XML and HTML reports</li>
</ul>
</li>
<li>Targets
<ul>
<li>init - Creates the build.dir and dist.dir</li>
<li>clean - Deletes build.dir, dist.dir, and artifacts.dir for a clean environment</li>
<li>compile.catengine - Compiles the ClassLibrary1 project into ${build.dir}\ClassLibrary1.dll</li>
<li>compile.web - Compiles the website code behind files into ${build.dir}\WebApplication1.dll
<ul>
<li>This target depends on compile.catengine</li>
</ul>
</li>
<li>build - Runs all the necessary targets to build the libraries and put them in the build directory
<ul>
<li>Depends on clean, init, compile.catengine, compile.web (in that order)</li>
</ul>
</li>
<li>dist - Depends on &#8216;build&#8217; and copies the libraries and the website pages (Default.aspx) to the ${dist.dir} for deployment
<ul>
<li>Depends on &#8216;catnet&#8217;</li>
</ul>
</li>
<li>catnet - Runs the CAT.NET code analysis tool on the libraries and checks for errors. If any are found the build if failed and the distribution package never completes.</li>
</ul>
</li>
</ul>
<p><strong>The &#8216;catnet&#8217; Target</strong></p>
<p>This is the bread and butter of the CAT.NET automation. You can get a sense of the command line options we use by running CatNetCmd.exe /?. Here is the code:</p>
<blockquote><p>&lt;target name=&#8221;catnet&#8221; description=&#8221;Runs the CAT.NET static code analysis tool on a set of libraries&#8221;&gt;<br />
&lt;exec program=&#8221;Microsoft\CAT.NET\CatNetCmd.exe&#8221; workingdir=&#8221;.&#8221; output=&#8221;catnetout.log&#8221;&gt;<br />
&lt;arg value=&#8221;/file:${build.dir}\ClassLibrary1.dll&#8221; /&gt;<br />
&lt;arg value=&#8221;/file:${build.dir}\WebApplication1.dll&#8221; /&gt;<br />
&lt;arg value=&#8221;/report:${artifacts.dir}\CatNetReport.xml&#8221; /&gt;<br />
&lt;arg value=&#8221;/reportxsloutput:${artifacts.dir}\CatNetReport.html&#8221; /&gt;<br />
&lt;/exec&gt;</p>
<p>&lt;!&#8211; Check for errors since the command doesn&#8217;t throw error codes &#8211;&gt;<br />
&lt;loadfile file=&#8221;catnetout.log&#8221; property=&#8221;catnetout&#8221; /&gt;<br />
&lt;fail if=&#8221;${string::contains(catnetout, &#8216;ERROR&#8217;)}&#8221; message=&#8221;There was an error running CAT.NET Static Analysis&#8221; /&gt;<br />
&lt;!&#8211; Clean up if we didn&#8217;t error out &#8211;&gt;<br />
&lt;delete file=&#8221;catnetout.log&#8221; /&gt;</p>
<p>&lt;xmlpeek file=&#8221;${artifacts.dir}\CatNetReport.xml&#8221;<br />
property=&#8221;hasErrors&#8221;<br />
xpath=&#8221;//Rule[TotalResults&gt;0]/Results/Result/ProblemDescription&#8221; /&gt;</p>
<p>&lt;fail if=&#8221;${string::get-length(hasErrors) &amp;gt; 0}&#8221; message=&#8221;CAT.NET found at least one problem: ${hasErrors}&#8221; /&gt;<br />
&lt;/target&gt;</p></blockquote>
<p>This target runs the CAT.NET tool over the libraries produced from the &#8216;build&#8217; target. It uses the default rule set and outputs the reports to ${artifacts.dir}\CatNetReport.xml and CatNetReport.html. Because the CAT.NET command line tool does not return an error code (CISG again), the build file sends the output to catnet.log file, read it in, and check for the word &#8216;ERROR&#8217;. If that is found, the build is failed because something went wrong with the command itself.</p>
<p>If the command completes successfully it cleans up the standard output file (delete catnet.log) and then performs an <em>XMLPeek</em> on the CatNetReport.xml file. The xmlpeek xpath looks for a &lt;TotalResults&gt;#&lt;/TotalResults&gt; where # is greater than zero. Unfortunately the xmlpeek command only pulls the first record it comes across that matches the xpath, but that is enough to know that the build needs to be failed. If even one error is reported from this utility, the build should stop anyway and a manual check of the report shoud be performed. The CI process should include some way of notifying developers of errors like this but for this is an example those targets were not included.</p>
<p><strong>Analyzing the Output<br />
</strong></p>
<p>When the build is run (&#8217;build dist&#8217;), the output of the catnet target looks like the following:</p>
<blockquote><p>catnet:</p>
<p>[exec] Application Assurance<br />
[exec] Static Analysis Tool<br />
[exec] 1.0.3272.32340<br />
[exec]<br />
[exec] 12/31/2008 4:13:38 PM:Info : Starting analysis [2 modules]<br />
[exec] 12/31/2008 4:13:38 PM:Info : Analyzing module ClassLibrary1&#8230;<br />
[exec] 12/31/2008 4:13:38 PM:Info : Analyzing module WebApplication1&#8230;<br />
[exec] 12/31/2008 4:13:39 PM:Info : 2 Cross-Site Scripting issues found.<br />
[exec] 12/31/2008 4:13:39 PM:Info : Analysis completed.<br />
[delete] Deleting file C:\Dev\CatNetExample\catnetout.log.<br />
[xmlpeek] Peeking at &#8216;C:\Dev\CatNetExample\reports\CatNetReport.xml&#8217; with XPath expression &#8216;//Rule[TotalResults&gt;0]/Results/Result/ProblemDescription&#8217;.<br />
[xmlpeek] Found &#8216;2&#8242; nodes with the XPath expression &#8216;//Rule[TotalResults&gt;0]/Results/Result/ProblemDescription&#8217;.</p>
<p>BUILD FAILED</p>
<p>C:\Dev\CatNetExample\default.build(70,4):<br />
CAT.NET found at least one problem: A cross-site scripting vulnerability was found through  a user controlled variable that enters the application at  Default.aspx.cs:27 through the variable stack0 which  eventually leads to a cross-site scripting issue at  Default.aspx.cs:29.</p>
<p>Total time: 3.1 seconds.</p></blockquote>
<p>The tool finds an XSS defect and fails the build. There are a few more errors found, but it stops on the first occurance of an error. CAT.NET can be customized to find all kinds of coding problems and it is recommended to customize the configuration for your specific needs. Once it is configured don&#8217;t forget to include it in the build process!</p>
<p><strong>Conclusion</strong></p>
<p>CAT.NET is a great tool and it should only get better over time. I sleep better at night knowing that I am catching common security errors, my junior developers (if I had any) learn from their mistakes using automation, and I can cut down the time I spend doing manual code reviews. The next article will look at the use of FxCop to help your project adhere to coding standards. I use the default Microsoft standard set because I&#8217;m insane, but you can also customize this tool to your liking.</p>
]]></content:encoded>
			<wfw:commentRss>http://dataplex.org/blog/2008/12/automating-code-review-tools-catnet-part-ii/feed/</wfw:commentRss>
		<feedburner:origLink>http://dataplex.org/blog/2008/12/automating-code-review-tools-catnet-part-ii/</feedburner:origLink></item>
		<item>
		<title>First Post from iPhone</title>
		<link>http://feeds.feedburner.com/~r/DataplexBlog/~3/499135688/</link>
		<comments>http://dataplex.org/blog/2008/12/first-post-from-iphone/#comments</comments>
		<pubDate>Wed, 31 Dec 2008 03:38:55 +0000</pubDate>
		<dc:creator>dpx</dc:creator>
		
		<category><![CDATA[iPhone]]></category>

		<category><![CDATA[mobile blogging]]></category>

		<guid isPermaLink="false">http://dataplex.org/blog/2008/12/first-post-from-iphone/</guid>
		<description><![CDATA[I just downloaded the wordpress app for the iPhone from the apple store and i&#8217;m really pleased with it. The word complete feature could use some help but that could also just be my fat fingers. Now I have something productive to do on road and plane trips, and those incredibly long waits at the [...]]]></description>
			<content:encoded><![CDATA[<p>I just downloaded the wordpress app for the iPhone from the apple store and i&#8217;m really pleased with it. The word complete feature could use some help but that could also just be my fat fingers. Now I have something productive to do on road and plane trips, and those incredibly long waits at the doctors office.</p>
<p>Sadly I&#8217;m going to count this as my blog quotient for the day! Check back tomorrow for more exciting tech writing!</p>
]]></content:encoded>
			<wfw:commentRss>http://dataplex.org/blog/2008/12/first-post-from-iphone/feed/</wfw:commentRss>
		<feedburner:origLink>http://dataplex.org/blog/2008/12/first-post-from-iphone/</feedburner:origLink></item>
		<item>
		<title>Automating Code Review Tools - Part I</title>
		<link>http://feeds.feedburner.com/~r/DataplexBlog/~3/498694733/</link>
		<comments>http://dataplex.org/blog/2008/12/automating-code-review-tools-part-i/#comments</comments>
		<pubDate>Tue, 30 Dec 2008 15:51:42 +0000</pubDate>
		<dc:creator>dpx</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[Information Security]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[automation]]></category>

		<category><![CDATA[build process]]></category>

		<category><![CDATA[CAT.NET]]></category>

		<category><![CDATA[code review]]></category>

		<category><![CDATA[FxCop]]></category>

		<category><![CDATA[NAnt]]></category>

		<guid isPermaLink="false">http://dataplex.org/blog/?p=77</guid>
		<description><![CDATA[The Connected Information Security Group blog at Microsoft recently published a couple of articles (part 1, part 2) about a tool recently released called CAT.NET. This is a static code analysis tool which reads a compiled programs code and looks for security problems such as null pointers, null references, and other problems specific to interpreted [...]]]></description>
			<content:encoded><![CDATA[<p>The <a title="CISG Blog" href="http://blogs.msdn.com/cisg/" onclick="javascript:pageTracker._trackPageview('/outbound/article/blogs.msdn.com');" target="_blank">Connected Information Security Group</a> blog at Microsoft recently published a couple of articles (<a title="Code Review Using CAT.NET Part 1" href="http://blogs.msdn.com/cisg/archive/2008/12/22/security-code-review-using-cat-net-part-1.aspx" onclick="javascript:pageTracker._trackPageview('/outbound/article/blogs.msdn.com');" target="_blank">part 1</a>, <a title="Code Review Using CAT.NET Part 2" href="http://blogs.msdn.com/cisg/archive/2008/12/22/security-code-review-using-cat-net-part-2.aspx" onclick="javascript:pageTracker._trackPageview('/outbound/article/blogs.msdn.com');" target="_blank">part 2</a>) about a tool recently released called <a title="Download 32-bit CAT.NET" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=0178e2ef-9da8-445e-9348-c93f24cc9f9d&amp;displaylang=en" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.microsoft.com');" target="_blank">CAT.NET</a>. This is a static code analysis tool which reads a compiled programs code and looks for security problems such as null pointers, null references, and other problems specific to interpreted languages.</p>
<p>I&#8217;ve started to put this tool, as well as FxCop, into my build process. The biggest headache in the CAT.NET automation process is defining the sources and sinks necessary for the tool to be effective. Some of this can be autogenerated using XML comments in the code, and as I explore this more I&#8217;ll give some details here.</p>
<p>Over the next week I&#8217;m going to be publishing a series of articles detailing how to automate these tools to make your code more secure and best practices compliant. It will also help reduce your manual code review process (you do have a code review process in place, don&#8217;t you?) because these tools are designed to catch the most common errors that take up a lot of time during a human review.</p>
]]></content:encoded>
			<wfw:commentRss>http://dataplex.org/blog/2008/12/automating-code-review-tools-part-i/feed/</wfw:commentRss>
		<feedburner:origLink>http://dataplex.org/blog/2008/12/automating-code-review-tools-part-i/</feedburner:origLink></item>
		<item>
		<title>I Bought An iPhone and I Like It</title>
		<link>http://feeds.feedburner.com/~r/DataplexBlog/~3/498071881/</link>
		<comments>http://dataplex.org/blog/2008/12/i-bought-an-iphone-and-i-like-it/#comments</comments>
		<pubDate>Mon, 29 Dec 2008 21:34:10 +0000</pubDate>
		<dc:creator>dpx</dc:creator>
		
		<category><![CDATA[iPhone]]></category>

		<category><![CDATA[at&t]]></category>

		<category><![CDATA[iphone apps]]></category>

		<category><![CDATA[itunes]]></category>

		<category><![CDATA[mobile applications]]></category>

		<guid isPermaLink="false">http://dataplex.org/blog/?p=71</guid>
		<description><![CDATA[You read correctly - and noticed the play on the Katy Perry song - that I went out yesterday and bought an iPhone. I didn&#8217;t mean to&#8230; My wife was complaining that she couldn&#8217;t hear on her GoPhone so we checked and her contract was eligible for the &#8220;phone upgrade&#8221;. It&#8217;s really just a way [...]]]></description>
			<content:encoded><![CDATA[<p>You read correctly - and noticed the play on the Katy Perry song - that I went out yesterday and bought an iPhone. I didn&#8217;t mean to&#8230; My wife was complaining that she couldn&#8217;t hear on her GoPhone so we checked and her contract was eligible for the &#8220;phone upgrade&#8221;. It&#8217;s really just a way to keep that 2 year contract thing going for the phone company. Either way we ended up with a $200 phone for free as part of the contract.</p>
<p>I started looking at the phones (at Wal-mart no less) and saw that they had the iPhone. From my earlier post you probably saw that I was happy with the phone before, but I didn&#8217;t like the missing API and the lack of applications. Well, with that solved, it was time to take another look.</p>
<p>My line was eligible for an upgrade as well and I took the opportunity to give the old Samsung the heave ho and purchased an 8 GB iPhone. I&#8217;ve already activated it, updated it, synced my contacts, email, and calendar with it, and installed an SSH client and a VPN client. In under an hour! I&#8217;m much happier now and I think in time I&#8217;ll be pulling down the API docs and having a look at those as well.</p>
<p>The truth though is that I really wanted a Google Android based phone. They are supposed to be coming into the line up in 2009 sometime, but I wasn&#8217;t willing to wait that long for a better alternative to the Blackjack II.</p>
]]></content:encoded>
			<wfw:commentRss>http://dataplex.org/blog/2008/12/i-bought-an-iphone-and-i-like-it/feed/</wfw:commentRss>
		<feedburner:origLink>http://dataplex.org/blog/2008/12/i-bought-an-iphone-and-i-like-it/</feedburner:origLink></item>
		<item>
		<title>Rednecks</title>
		<link>http://feeds.feedburner.com/~r/DataplexBlog/~3/497524859/</link>
		<comments>http://dataplex.org/blog/2008/12/rednecks/#comments</comments>
		<pubDate>Mon, 29 Dec 2008 06:08:47 +0000</pubDate>
		<dc:creator>dpx</dc:creator>
		
		<category><![CDATA[Miscellaneous]]></category>

		<category><![CDATA[country living]]></category>

		<category><![CDATA[littering]]></category>

		<category><![CDATA[rednecks]]></category>

		<guid isPermaLink="false">http://dataplex.org/blog/?p=73</guid>
		<description><![CDATA[I was just out walking the dog and some redneck in a jacked up truck pulled onto our road. We&#8217;re the first house on the road so I&#8217;m close to the highway. He got out, jumped in the back, and started flinging beer bottles into our yard. Since I was wearing a black leather jacket [...]]]></description>
			<content:encoded><![CDATA[<p>I was just out walking the dog and some redneck in a jacked up truck pulled onto our road. We&#8217;re the first house on the road so I&#8217;m close to the highway. He got out, jumped in the back, and started flinging beer bottles into our yard. Since I was wearing a black leather jacket and black wind pants, he probably didn&#8217;t see me there until I started yelling at him. He had a flashlight and started looking around and when he saw me he jumped back in his truck and peeled out down the highway. What a shmuck. This is why I really am considering some kind of shotgun or baseball bat. Since he was not technically on our property I couldn&#8217;t shoot him, but I damn sure would make him crap his pants.</p>
]]></content:encoded>
			<wfw:commentRss>http://dataplex.org/blog/2008/12/rednecks/feed/</wfw:commentRss>
		<feedburner:origLink>http://dataplex.org/blog/2008/12/rednecks/</feedburner:origLink></item>
		<item>
		<title>Finding Applications for Blackjack II</title>
		<link>http://feeds.feedburner.com/~r/DataplexBlog/~3/497062542/</link>
		<comments>http://dataplex.org/blog/2008/12/finding-applications-for-blackjack-ii/#comments</comments>
		<pubDate>Sun, 28 Dec 2008 15:44:34 +0000</pubDate>
		<dc:creator>dpx</dc:creator>
		
		<category><![CDATA[Hardware]]></category>

		<category><![CDATA[Miscellaneous]]></category>

		<category><![CDATA[Windows Mobile]]></category>

		<category><![CDATA[blackjack II]]></category>

		<category><![CDATA[blackjack 2]]></category>

		<category><![CDATA[mobile software]]></category>

		<category><![CDATA[mobile ssh]]></category>

		<category><![CDATA[mobile vpn]]></category>

		<category><![CDATA[ssh]]></category>

		<category><![CDATA[windows mobile]]></category>

		<guid isPermaLink="false">http://dataplex.org/blog/?p=68</guid>
		<description><![CDATA[iPhone Purchase
I feel so ripped off! When they first released the iPhone I purchased one at the AT&#38;T store. The price was steep, the phone was cool, and the fact that I had to sign up for more than a basic data plan was less than appealing. I ended up taking my iPhone back on [...]]]></description>
			<content:encoded><![CDATA[<p><strong>iPhone Purchase</strong></p>
<p>I feel so ripped off! When they first released the<a title="Apple's iPhone website" href="http://www.apple.com/iphone/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.apple.com');" target="_blank"> iPhone</a> I purchased one at the AT&amp;T store. The price was steep, the phone was cool, and the fact that I had to sign up for more than a basic data plan was less than appealing. I ended up taking my iPhone back on principle - they did not have an open API to develop applications on it.</p>
<p>To have the hands down best phone on the market and restrict improvements from the world at large was something I wasn&#8217;t ready to stomach. That is the same mentality that has stopped me from buying anything from Apple for years and years. Sure, it is possible to  <a title="reasons to jailbreak your iPhone" href="http://sleepers.net/2008/09/06/why-jailbreak-iphone/" onclick="javascript:pageTracker._trackPageview('/outbound/article/sleepers.net');" target="_blank">jailbreak the iPhone</a> and void the support contract and risk not getting updates, or worse turning the phone into a brick. But did I really want to do that when the innovators of the industry should know better?</p>
<p><strong>Worst Exchange Ever</strong></p>
<p>I returned my iPhone and bought a <a title="Blackjack II product information site" href="http://www.samsungmobileusa.com/blackjackii/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.samsungmobileusa.com');" target="_blank">Blackjack II</a> instead. I am still required to have the data plan, but I downgraded it right after the purchase. The OS is Windows Mobile 6 (meaning the development API is well documented) and I could install my own apps on it. I&#8217;m not very happy with the interface or some of the features, but all in all it isn&#8217;t a bad phone. Still, I see my friend with their iPhones and all the functionality I want, plus a rich API and a single repository for purchasing applications, and I wonder why I made the wrong choice.</p>
<p><strong>The Applications Nightmare</strong></p>
<p>Then the nightmare began. I started looking for VPN, SSH, and remote desktop applications for my Blackjack II. I haven&#8217;t found squat! What&#8217;s worse, every time I search for applications I end up at this <a title="Microsoft's windows mobile home" href="http://www.microsoft.com/windowsmobile/en-us/default.mspx" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.microsoft.com');" target="_blank">horrible Microsoft site</a> that reminds me of a forgotten orphan child. They have an application download section - that requires registration forfull access - with about 4 applications.</p>
<p><strong>Wish List</strong></p>
<p>All I really need is a VPN client that supports common VPN configurations and an SSH client. I remote manage some important servers for my job, and if I&#8217;m away from my desk I will have no way with this expensive &#8220;smart phone&#8221; to access these resources. I will continue my search and maybe if I get enough requests I&#8217;ll go ahead and code my own. If you think this is a good idea, let me know and I&#8217;ll start asking for feature requests and other developers.</p>
]]></content:encoded>
			<wfw:commentRss>http://dataplex.org/blog/2008/12/finding-applications-for-blackjack-ii/feed/</wfw:commentRss>
		<feedburner:origLink>http://dataplex.org/blog/2008/12/finding-applications-for-blackjack-ii/</feedburner:origLink></item>
	</channel>
</rss>
