<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:thr='http://purl.org/syndication/thread/1.0' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-10158221</atom:id><lastBuildDate>Wed, 24 Mar 2010 09:48:44 +0000</lastBuildDate><title>Kris Krause .NET Meister</title><description>Developing software in Northern New Jersey.  And keeping it simple.</description><link>http://www.kriskrause.com/</link><managingEditor>noreply@blogger.com (Kristofer Krause)</managingEditor><generator>Blogger</generator><openSearch:totalResults>29</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-10158221.post-9200030713710995681</guid><pubDate>Fri, 07 Aug 2009 01:40:00 +0000</pubDate><atom:updated>2009-11-21T19:45:39.422-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>mysql</category><category domain='http://www.blogger.com/atom/ns#'>.net</category><title>.NET mySql PerformanceMonitor Class</title><description>The 6.x mySql Connector for .NET comes with two performance counters that seem to be working rather well.  If I call the same stored procedure 1,000 times... the metadata is only retrieved from the server the first time.  All subsequent calls utilize the client-side cache.  You can see this using the Performance Monitor graph in Control Panel -&gt; Administrative Tools -&gt; Performance.&lt;br /&gt;&lt;br /&gt;Also, you have set the following parameter in your connection string:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql;"&gt;Use Performance Monitor=true;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;HardProcedureQueries - The number of times a procedures metadata had to be queried from the server.&lt;br /&gt;&lt;br /&gt;SoftProcedureQueries - The number of times a procedures metadata was retrieved from the client-side cache.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10158221-9200030713710995681?l=www.kriskrause.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.kriskrause.com/2009/08/net-mysql-performancemonitor-class.html</link><author>noreply@blogger.com (Kristofer Krause)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-10158221.post-657318445424991098</guid><pubDate>Mon, 29 Jun 2009 18:54:00 +0000</pubDate><atom:updated>2009-07-09T14:19:00.777-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>.net</category><category domain='http://www.blogger.com/atom/ns#'>testing</category><title>Concrete Example - Mocking .NET Objects w/NUnit</title><description>&lt;a href="http://www.zorched.net/2007/03/10/mocking-net-objects-with-nunit/" target="_blank"&gt;Geoff Lane&lt;/a&gt; does a very good job of explaining .NET Mock objects.&lt;br /&gt;&lt;br /&gt;People were requesting a "concrete" example so I implemented an example C# console application (although this can easily be made into an ASP.NET web application).&lt;br /&gt;&lt;br /&gt;Geoff hints to using Spring .NET to wire things up, but that might be too confusing for some people.  And maybe a little over board for a simple example (&lt;a href="http://www.lostechies.com/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/OpenClosedPrinciple2_5F00_2C596E17.jpg"&gt;open closed principle&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;So instead I created a PersonServiceManager that creates a "concrete" PersonService via IPersonRepository injection.  The GUI communicates to the PersonServiceManager through an IPersonService interface.&lt;br /&gt;&lt;br /&gt;Instead of "mocking" an IPersonRepository, we are actually implementing it then injecting it into PersonService (just like our NUnit test).  The PersonServiceManager handles passing the appropriate database connection string down to the data layer.  In my example, the data layer object PersonDb (which implements IPersonRepository and used for injection) utilizes the DbProviderFactory.&lt;br /&gt;&lt;br /&gt;Here is the &lt;a href="http://www.kriskrause.com/downloads/NUnitMockConsole.zip" target="_blank"&gt;sample source&lt;/a&gt; (C# Console App).&lt;br /&gt;&lt;br /&gt;Also remember that the sample source could be broken down into separate assemblies in a real world project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10158221-657318445424991098?l=www.kriskrause.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.kriskrause.com/2009/06/concrete-example-mocking-net-objects.html</link><author>noreply@blogger.com (Kristofer Krause)</author><thr:total>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-10158221.post-4425408580416812922</guid><pubDate>Wed, 24 Jun 2009 14:16:00 +0000</pubDate><atom:updated>2009-06-24T10:25:21.404-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>ie</category><category domain='http://www.blogger.com/atom/ns#'>jquery</category><category domain='http://www.blogger.com/atom/ns#'>testing</category><category domain='http://www.blogger.com/atom/ns#'>css</category><title>Side by Side - IE8, IE6, IE5.5, IE5, IE4.01, &amp; IE3</title><description>Running IE8 on your computer?  The included developer tools are great.  Need to switch to IE7 mode?  No problem using IE8.&lt;br /&gt;&lt;br /&gt;But what about IE6, IE5.5, IE5, IE4.01, and IE3?  Here is a free multiple installer you can use.  And it works!  And I performed a virus scan (before and after the install)... no problems detected.&lt;br /&gt;&lt;br /&gt;Unfortunately, a couple of my JQuery sites look weird with IE6.  I know I know, its not JQuery... rather its the IE6 CSS quirks (among other things... standards compliance... cough... cough...).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://tredosoft.com/Multiple_IE" target="_blank"&gt;http://tredosoft.com/Multiple_IE&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10158221-4425408580416812922?l=www.kriskrause.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.kriskrause.com/2009/06/running-ie8-on-your-computer-included.html</link><author>noreply@blogger.com (Kristofer Krause)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-10158221.post-2400262696243249570</guid><pubDate>Mon, 22 Jun 2009 20:15:00 +0000</pubDate><atom:updated>2009-11-21T19:47:10.749-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>mysql</category><title>Example mySql IsDate Function</title><description>Here is an example mySql IsDate function using a regular expression:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql;"&gt;CREATE DEFINER=`root`@`localhost` FUNCTION `IsDate`(var varchar(25)) RETURNS tinyint(4)&lt;br /&gt;DETERMINISTIC&lt;br /&gt;BEGIN&lt;br /&gt;/* 05/17/2009, 5/01/2009, 5/1/2009 */&lt;br /&gt;&lt;br /&gt;declare result tinyint;&lt;br /&gt;&lt;br /&gt;select  trim(var)&lt;br /&gt;&lt;br /&gt;REGEXP '^([1-9]|0[1-9]|1[012])/([1-9]|0[1-9]|[12][0-9]|3[01])/(19|20)[0-9][0-9]'&lt;br /&gt;&lt;br /&gt;into @result;&lt;br /&gt;&lt;br /&gt;return @result;&lt;br /&gt;END&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10158221-2400262696243249570?l=www.kriskrause.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.kriskrause.com/2009/06/example-mysql-isdate-function.html</link><author>noreply@blogger.com (Kristofer Krause)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-10158221.post-864208760818166213</guid><pubDate>Wed, 08 Apr 2009 15:22:00 +0000</pubDate><atom:updated>2009-04-08T12:02:39.003-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>mysql</category><category domain='http://www.blogger.com/atom/ns#'>.net</category><title>MySql Connector .NET MySqlBulkLoader Example</title><description>Here is a MySqlBulkLoader example I quickly wrote to import 65,000 records into a mySql 5.1 database using the mySql Connector 5.2.5.  And yes, its fast as snot (the lead programmer at my first programming job out of college invented the term).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.red-gate.com/products/reflector/" target="_new"&gt;.NET Reflector&lt;/a&gt; helped me figure out the follow details:&lt;br /&gt;&lt;br /&gt;- the default FieldTerminator is "\t"&lt;br /&gt;- the default LineTerminator is "\n"&lt;br /&gt;- the default FieldQuotationCharacter is '\0'&lt;br /&gt;- the .Load() method both opens and closes the connection&lt;br /&gt;&lt;br /&gt;Also, the &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/load-data.html" target="_new"&gt;mySql documentation&lt;/a&gt; obviously helped to explain a lot including the "\r\n" Win32 line terminator in my example (I used Excel to export the CSV).  The database user in this example needs "insert" permission.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.kriskrause.com/downloads/mySqlBulkLoader-example.zip" target="_new"&gt;Download the VB.NET, Sql, and CSV files here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10158221-864208760818166213?l=www.kriskrause.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.kriskrause.com/2009/04/mysql-connector-net-mysqlbulkloader.html</link><author>noreply@blogger.com (Kristofer Krause)</author><thr:total>6</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-10158221.post-5218776887387139036</guid><pubDate>Wed, 25 Feb 2009 17:03:00 +0000</pubDate><atom:updated>2009-02-25T12:10:16.482-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>visual studio</category><category domain='http://www.blogger.com/atom/ns#'>.net</category><title>Unit Testing ASP.NET App_Code</title><description>I learn something new every day.  Today, its the ability to &lt;a href="http://blogs.msdn.com/ejarvi/archive/2005/08/23/455215.aspx"&gt;Unit Test code in the App_Code folder&lt;/a&gt; using Visual Studio 2008 Professional.&lt;br /&gt;&lt;br /&gt;Most of the ASP.NET projects that I work on have their business logic contained in a separate assembly.  However, a recent smaller project has some business classes residing in the App_Code directory.&lt;br /&gt;&lt;br /&gt;Tip:  Just make sure you watch your dynamic port assignments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10158221-5218776887387139036?l=www.kriskrause.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.kriskrause.com/2009/02/unit-testing-aspnet-appcode.html</link><author>noreply@blogger.com (Kristofer Krause)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-10158221.post-1739912621019528200</guid><pubDate>Tue, 17 Feb 2009 14:32:00 +0000</pubDate><atom:updated>2009-02-17T09:42:20.761-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>windows server</category><title>Disable the Shutdown Event Manager in Windows Server</title><description>Want to get rid of this screen (Shutdown Event Manager) in Windows Server 2003 and Windows Server 2008?&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.kriskrause.com/images/shutdown-server.jpg" alt="Shutdown Event Manager" &gt;&lt;br /&gt;&lt;br /&gt;Do this:  &lt;br /&gt;&lt;br /&gt;Start -&gt; Run -&gt; gpedit.msc&lt;br /&gt;&lt;br /&gt;Computer Configuration -&gt; Administrative Templates -&gt; System&lt;br /&gt;&lt;br /&gt;Disable "Display Shutdown Event Tracker"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10158221-1739912621019528200?l=www.kriskrause.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.kriskrause.com/2009/02/disable-shutdown-event-manager-in.html</link><author>noreply@blogger.com (Kristofer Krause)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-10158221.post-2880593434365300463</guid><pubDate>Wed, 10 Dec 2008 17:31:00 +0000</pubDate><atom:updated>2008-12-10T13:05:37.610-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>vista</category><title>Sound Blaster Live! SB0200 with Vista</title><description>I was able to successfully have my Sound Blaster Live! SB0200 card recognized by Vista Home Premium SP2.  I read through this post &lt;a href="http://en.community.dell.com/forums/t/2938925.aspx"&gt;http://en.community.dell.com/forums/t/2938925.aspx&lt;/a&gt; and then I installed this driver from Dell &lt;a href="http://support.dell.com/support/downloads/download.aspx?c=us&amp;l=en&amp;s=gen&amp;releaseid=R69382&amp;fileid=90207"&gt;http://support.dell.com/support/downloads/download.aspx?c=us&amp;l=en&amp;s=gen&amp;releaseid=R69382&amp;fileid=90207&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Leading up to the solution was painful.  And unfortunately not for your average user.  Personally, I enjoy Vista.  I installed a legal copy of Vista Home Premium on an older Dell.  Hardware compatibility was the main issue.  My sound card and wireless USB (needed to purchase a PCI card) were the most painful and time consuming.  &lt;br /&gt;&lt;br /&gt;Vista is great (even better when you purchase it pre-installed).  Yeah I know... stating a favorable opinion of Vista is not mainstream or cool.  However, it gets the job done... and sometimes even better than my MacBook.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10158221-2880593434365300463?l=www.kriskrause.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.kriskrause.com/2008/12/sound-blaster-live-sb0200.html</link><author>noreply@blogger.com (Kristofer Krause)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-10158221.post-4835712997690944178</guid><pubDate>Mon, 10 Nov 2008 18:42:00 +0000</pubDate><atom:updated>2009-02-17T09:42:58.316-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>visual studio</category><title>Accessibility Consulting Project</title><description>Although the static (Flash, Html, and Javascript) project ran using Apache and Linux I still was able to utilize Visual Studio 2008 for accessibility guidance.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10158221-4835712997690944178?l=www.kriskrause.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.kriskrause.com/2008/11/accessibility-consulting-project.html</link><author>noreply@blogger.com (Kristofer Krause)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-10158221.post-7889941628379586950</guid><pubDate>Thu, 02 Oct 2008 18:05:00 +0000</pubDate><atom:updated>2008-12-10T13:05:37.620-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>mysql</category><category domain='http://www.blogger.com/atom/ns#'>.net</category><title>Using Microsoft ADO.NET Entity Framework with MySQL</title><description>Unfortunately, this week's Using Microsoft ADO.NET Entity Framework with MySQL Webinar is being postponed to Tuesday November 4, 2008. Myself and many others are looking forward to some (if not all) entity framework support.  It seems that I check the mySQL dev forum daily for updates.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.crlab.com/products/mysqlnet/"&gt;myDirect.NET&lt;/a&gt; product offers support for the ADO.NET Entity Framework with a commercial license fee.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10158221-7889941628379586950?l=www.kriskrause.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.kriskrause.com/2008/10/using-microsoft-adonet-entity-framework.html</link><author>noreply@blogger.com (Kristofer Krause)</author><thr:total>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-10158221.post-7356690074814037630</guid><pubDate>Thu, 07 Aug 2008 14:36:00 +0000</pubDate><atom:updated>2008-12-10T13:05:37.626-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>.net</category><category domain='http://www.blogger.com/atom/ns#'>testing</category><title>Visual Studio 2008 Justification</title><description>There are two primary justifications for my company's latest purchase of Visual Studio 2008 Professional -&lt;br /&gt;&lt;br /&gt;1.  The ability to "target" previous .NET versions.&lt;br /&gt;2.  The integrated unit testing.&lt;br /&gt;&lt;br /&gt;While we still have not setup the automatic builds (command line)... and we still utilize NAnt... the integrated unit testing feature of Visual Studio 2008 rocks.  Sure there are alternatives (we still have some projects with NUnit testing)... and various mocking frameworks, however the ability to "right click" create unit test/private accessor is very productive for us.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10158221-7356690074814037630?l=www.kriskrause.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.kriskrause.com/2008/08/visual-studio-2008-justification.html</link><author>noreply@blogger.com (Kristofer Krause)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-10158221.post-5345192766609348226</guid><pubDate>Wed, 23 Jul 2008 19:51:00 +0000</pubDate><atom:updated>2009-11-21T19:51:06.331-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>.net</category><category domain='http://www.blogger.com/atom/ns#'>testing</category><title>VB.NET InternalsVisibleTo</title><description>Unfortunately, the InternalsVisibleTo attribute does not work with the .NET 2.0 Framework for VB.NET. However, I just installed Visual Web Developer 2008 Express SP1 Beta and it works! Thanks Microsoft for making my NUnit testing a little easier (and cleaner).&lt;br /&gt;&lt;br /&gt;To reproduce:&lt;br /&gt;&lt;br /&gt;Create a VB.NET class library named ClassLibrary1. Add a single class with only a friend constructor. Add the following attribute to AssemblyInfo.vb:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: vbnet;"&gt;Assembly: System.Runtime.CompilerServices.InternalsVisibleTo("ClassLibrary2")&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Add another VB.NET class library named ClassLibrary2. Add a project reference to ClassLibrary1. Verify that you are able to construct an instance of the above class.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10158221-5345192766609348226?l=www.kriskrause.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.kriskrause.com/2008/07/vbnet-internalsvisibleto.html</link><author>noreply@blogger.com (Kristofer Krause)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-10158221.post-8755235729657100894</guid><pubDate>Tue, 03 Jun 2008 17:36:00 +0000</pubDate><atom:updated>2008-12-10T13:05:37.646-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>mysql</category><category domain='http://www.blogger.com/atom/ns#'>.net</category><title>mySql ASP.NET Membership and Role Provider</title><description>The mySql.Web.dll is a great addition to the mySql Connector for .NET.  In order to utilize one must create (and use) a mySql user (localhost) with select, insert, update, delete, create, drop, and alter privileges.&lt;br /&gt;&lt;br /&gt;Quickly running ASP.NET Configuration Web Site Administration Tool helps to set up and initialize all of the tables.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10158221-8755235729657100894?l=www.kriskrause.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.kriskrause.com/2008/06/mysql-aspnet-membership-and-role.html</link><author>noreply@blogger.com (Kristofer Krause)</author><thr:total>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-10158221.post-3187769843813048185</guid><pubDate>Tue, 18 Mar 2008 16:33:00 +0000</pubDate><atom:updated>2008-12-10T13:05:37.647-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>sql server</category><title>Finding Primary Key Violations</title><description>Recently I've been processing lots of legacy DBase files into Sql Server 2005 via SqlBulkCopy.&lt;br /&gt;&lt;br /&gt;However, before I import the records (tens of thousands) there is a need to find, then handle the legacy DBase records that will cause a Sql Server primary key violation (if any).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.gaydaware.com"&gt;Karen Gayda's&lt;/a&gt; solution works like a charm:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sqlteam.com/article/anticipating-primary-key-violations"&gt;http://www.sqlteam.com/article/anticipating-primary-key-violations&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;IMPORTANT: SqlBulkCopy has a column mapper feature.  However, only key columns should be included in select parameter - @vcSelectStatement. If source table columns are named differently than in the target then they must be aliased with the same name as the target. These restrictions were necessary to make the procedure generic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10158221-3187769843813048185?l=www.kriskrause.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.kriskrause.com/2008/03/finding-primary-key-violations.html</link><author>noreply@blogger.com (Kristofer Krause)</author><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-10158221.post-3722514677929701302</guid><pubDate>Tue, 08 Jan 2008 20:08:00 +0000</pubDate><atom:updated>2008-12-10T13:05:37.647-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>.net</category><title>Efficient Role-Based Authorization in ASP.NET</title><description>Efficient Role-Based Authorization in ASP.NET by Fritz Onion and Craig Andera is a good article.  I know its a bit "old", but its still relevant and worth the read for any serious ASP.NET developer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10158221-3722514677929701302?l=www.kriskrause.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.kriskrause.com/2008/01/efficient-role-based-authorization-in.html</link><author>noreply@blogger.com (Kristofer Krause)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-10158221.post-6574041740559974577</guid><pubDate>Thu, 06 Sep 2007 13:41:00 +0000</pubDate><atom:updated>2009-11-21T19:52:44.493-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>google</category><title>Google Reader Search Capability</title><description>I logged into my Google Reader account and noticed the new search feature!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10158221-6574041740559974577?l=www.kriskrause.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.kriskrause.com/2007/09/google-reader-search-capability.html</link><author>noreply@blogger.com (Kristofer Krause)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-10158221.post-4359616587980633651</guid><pubDate>Tue, 24 Jul 2007 18:11:00 +0000</pubDate><atom:updated>2009-11-21T19:54:02.075-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>.net</category><category domain='http://www.blogger.com/atom/ns#'>mac</category><title>Visual Studio 2005 on Mac OS X</title><description>Utilizing Parallels 3.0 &lt;a href="http://www.parallels.com/en/products/desktop/"&gt;http://www.parallels.com/en/products/desktop/&lt;/a&gt; I am able to run Visual Studio 2005 on my Macbook (Mac OS X). Parallels Coherence makes it seem that I am running Visual Studio right inside my Mac desktop window instead of a separate virtualized window.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Here are some larger screenshots:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.kriskrause.com/images/mac-vs-net-2005.jpg"&gt;http://www.kriskrause.com/images/mac-vs-net-2005.jpg&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.kriskrause.com/images/mac-vs-net-2005-widgets.jpg"&gt;http://www.kriskrause.com/images/mac-vs-net-2005-widgets.jpg&lt;/a&gt; (Widgets Overlay)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10158221-4359616587980633651?l=www.kriskrause.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.kriskrause.com/2007/07/visual-studio-2005-on-mac-os-x.html</link><author>noreply@blogger.com (Kristofer Krause)</author><thr:total>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-10158221.post-5254154150064533734</guid><pubDate>Tue, 24 Jul 2007 17:36:00 +0000</pubDate><atom:updated>2008-12-10T13:05:37.650-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>mono</category><category domain='http://www.blogger.com/atom/ns#'>mac</category><title>Uninstall Mono on Mac OS X</title><description>&lt;p&gt;To uninstall Mono on OS X utilize the uninstallMono.sh script.  Where is it?  How do you get it?&lt;/p&gt;&lt;p&gt;Utilize Finder to browse to /Library/Receipts.  View the package contents of Contents/Resources/MonoFramework.pkg.&lt;/p&gt;&lt;p&gt;Drag a copy of uninstallMono.sh to the desktop. Open a Terminal window.  Then cd desktop and run: sudo ./uninstallMono.sh and enter your password. &lt;/p&gt;Mono on Mac OS X is then uninstalled (bin, Frameworks, etc.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10158221-5254154150064533734?l=www.kriskrause.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.kriskrause.com/2007/07/uninstall-mono-on-mac-os-x.html</link><author>noreply@blogger.com (Kristofer Krause)</author><thr:total>8</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-10158221.post-111330946537244773</guid><pubDate>Tue, 12 Apr 2005 12:29:00 +0000</pubDate><atom:updated>2008-12-10T13:05:37.650-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>.net</category><title>Default ASP.NET Submit Button</title><description>Here are two ways to solve the problem of having multiple textboxes and multiple buttons on a form.  Each button corresponds to a textbox.  When the user enters something in the textbox and presses the enter key... we want the appropriate button to fire.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.metabuilders.com/Tools/DefaultButtons.aspx"&gt;http://www.metabuilders.com/Tools/DefaultButtons.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/rajbk/archive/2003/12/11/43023.aspx"&gt;http://weblogs.asp.net/rajbk/archive/2003/12/11/43023.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10158221-111330946537244773?l=www.kriskrause.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.kriskrause.com/2005/04/default-aspnet-submit-button.html</link><author>noreply@blogger.com (Kristofer Krause)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-10158221.post-111093248508007523</guid><pubDate>Wed, 16 Mar 2005 00:19:00 +0000</pubDate><atom:updated>2008-12-10T13:05:37.651-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>google</category><title>EPIC 2014</title><description>In the year 2014, The New York Times has gone offline.&lt;br /&gt;&lt;br /&gt;The Fourth Estate's fortunes have waned.&lt;br /&gt;&lt;br /&gt;What happened to the news?&lt;br /&gt;&lt;br /&gt;And what is EPIC?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10158221-111093248508007523?l=www.kriskrause.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.kriskrause.com/2005/03/epic-2014.html</link><author>noreply@blogger.com (Kristofer Krause)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-10158221.post-110787762847421640</guid><pubDate>Tue, 08 Feb 2005 15:36:00 +0000</pubDate><atom:updated>2009-11-21T19:55:35.687-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>.net</category><title>Printing a Remote Document or Url Using C#</title><description>The following code enables a local machine to print a remote document or Url.  One example would be a desktop application that needs to print a remote PDF or a Html producing web page.&lt;br /&gt;&lt;br /&gt;The simple example downloads the file locally in order to print using the default printer.  Sure there might be a better way to do this... and the code needs to be modified to handle "file not found", "url not found", and "unable to connect" exceptions in case a cable is loose.  Cable?  Who uses cable?  It's all wireless nowadays!&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp;"&gt;using System;&lt;br /&gt;using System.Diagnostics;&lt;br /&gt;using System.Net;&lt;br /&gt;&lt;br /&gt;namespace ShellPrint&lt;br /&gt;{&lt;br /&gt;class CMain&lt;br /&gt;{&lt;br /&gt;[STAThread]&lt;br /&gt;static void Main(string[] args)&lt;br /&gt;{&lt;br /&gt;string lfile, file, ext;&lt;br /&gt;Process proc = null;&lt;br /&gt;WebClient client = null;&lt;br /&gt;&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;if (args.Length &lt; 2) throw new ArgumentException("Invalid arguments passed.");&lt;br /&gt;&lt;br /&gt;file = args[1].Trim();&lt;br /&gt;ext = args[0].Trim();&lt;br /&gt;&lt;br /&gt;client = new WebClient();&lt;br /&gt;&lt;br /&gt;lfile = @"c:\" + DateTime.Now.Ticks + "." + ext;&lt;br /&gt;&lt;br /&gt;Console.WriteLine("Downloading: {0}", file);&lt;br /&gt;&lt;br /&gt;client.DownloadFile(file, lfile);&lt;br /&gt;&lt;br /&gt;Console.WriteLine("Saving: {0}", file);&lt;br /&gt;&lt;br /&gt;proc = new Process();&lt;br /&gt;&lt;br /&gt;proc.StartInfo.FileName = lfile; &lt;br /&gt;proc.StartInfo.Verb = "Print";&lt;br /&gt;proc.StartInfo.CreateNoWindow = true;&lt;br /&gt;&lt;br /&gt;Console.WriteLine("Printing: {0}", lfile);&lt;br /&gt;&lt;br /&gt;proc.Start();&lt;br /&gt;}&lt;br /&gt;catch (Exception e)&lt;br /&gt;{&lt;br /&gt;Console.WriteLine(e);&lt;br /&gt;}&lt;br /&gt;finally&lt;br /&gt;{&lt;br /&gt;Console.WriteLine("Done and done.");&lt;br /&gt;Console.ReadLine();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10158221-110787762847421640?l=www.kriskrause.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.kriskrause.com/2005/02/printing-remote-document-or-url-using.html</link><author>noreply@blogger.com (Kristofer Krause)</author><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-10158221.post-110738302178468200</guid><pubDate>Wed, 02 Feb 2005 22:17:00 +0000</pubDate><atom:updated>2009-11-21T19:56:15.714-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>.net</category><category domain='http://www.blogger.com/atom/ns#'>mac</category><title>Accessing iTunes With C#</title><description>The following example dumps your entire &lt;a href="http://www.apple.com/itunes/"&gt;iTunes&lt;/a&gt; library to the console.  You need to reference the COM iTunes 1.2 Type library.  Currently I am running iTunes version 4.7.1.30.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp;"&gt;using System;&lt;br /&gt;&lt;br /&gt;namespace PlayListExample&lt;br /&gt;{&lt;br /&gt;class CMain&lt;br /&gt;{&lt;br /&gt;[STAThread]&lt;br /&gt;static void Main(string[] args)&lt;br /&gt;{&lt;br /&gt;iTunesLib.IiTunes app = null;&lt;br /&gt;&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;app = new iTunesLib.iTunesAppClass();&lt;br /&gt;&lt;br /&gt;foreach (iTunesLib.IITTrack track in app.LibraryPlaylist.Tracks)&lt;br /&gt;{&lt;br /&gt;Console.WriteLine("Artist: {0}\nSong: {1}\nGenre: {2}\n", track.Artist, track.Name, track.Genre);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;catch (Exception e)&lt;br /&gt;{&lt;br /&gt;Console.WriteLine(e);&lt;br /&gt;}&lt;br /&gt;finally&lt;br /&gt;{&lt;br /&gt;app.Quit();&lt;br /&gt;&lt;br /&gt;app = null;&lt;br /&gt;&lt;br /&gt;Console.ReadLine();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10158221-110738302178468200?l=www.kriskrause.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.kriskrause.com/2005/02/accessing-itunes-with-c.html</link><author>noreply@blogger.com (Kristofer Krause)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-10158221.post-110737457038009161</guid><pubDate>Wed, 02 Feb 2005 20:00:00 +0000</pubDate><atom:updated>2008-12-10T13:05:37.654-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>.net</category><title>Parsing dBase .DBF to .CSV Using C# and VB.NET</title><description>Per a &lt;a href="http://www.njmsdev.org/"&gt;New Jersey Microsoft Developer's Group&lt;/a&gt; message board request I created a sample console application that parses a .DBF file and creates an Excel usable .CSV file.  Zero magic if you take advantage of the System.Data.Odbc namespace.&lt;br /&gt;&lt;br /&gt;The command line syntax is:&lt;br /&gt;&lt;br /&gt;FPParse.exe [table name] [output dir]&lt;br /&gt;FPParse.exe canada c:&lt;br /&gt;&lt;br /&gt;The generated .CSV file is just as good as an .XLS file.  For fancy .XLS features and formatting I suggest modifying my code to utilize Excel COM Interop.&lt;br /&gt;&lt;br /&gt;The C# source code is found &lt;a href="http://www.geocities.com/chipwaiter"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The VB.NET source code is found &lt;a href="http://www.geocities.com/chipwaiter"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10158221-110737457038009161?l=www.kriskrause.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.kriskrause.com/2005/02/parsing-dbase-dbf-to-csv-using-c-and.html</link><author>noreply@blogger.com (Kristofer Krause)</author><thr:total>4</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-10158221.post-110718316719888330</guid><pubDate>Mon, 31 Jan 2005 14:52:00 +0000</pubDate><atom:updated>2008-12-10T13:05:37.655-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>.net</category><title>DataView vs. DataTable</title><description>Yes, I still pull my hair out over DataView versus DataTable every once in a while.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections;&lt;br /&gt;using System.Data;&lt;br /&gt;&lt;br /&gt;public class MyTestClass&lt;br /&gt;{&lt;br /&gt; public static void Main()&lt;br /&gt; {&lt;br /&gt;  DataTable dt = new DataTable();&lt;br /&gt;  &lt;br /&gt;  try&lt;br /&gt;  {&lt;br /&gt;   DataColumn col1 = new DataColumn();&lt;br /&gt;   col1.DataType = System.Type.GetType("System.Int32");&lt;br /&gt;   col1.ColumnName = "EmployeeID";&lt;br /&gt;   &lt;br /&gt;   dt.Columns.Add(col1);&lt;br /&gt;   &lt;br /&gt;   DataColumn col2 = new DataColumn();&lt;br /&gt;   col2.DataType = System.Type.GetType("System.String");&lt;br /&gt;   col2.ColumnName = "LastName";&lt;br /&gt;   &lt;br /&gt;   dt.Columns.Add(col2);&lt;br /&gt;   &lt;br /&gt;   dt.Rows.Add(new Object[] {1, "Covell"});&lt;br /&gt;   dt.Rows.Add(new Object[] {2, "Schaefer"});&lt;br /&gt;   dt.Rows.Add(new Object[] {3, "Krause"});&lt;br /&gt;   dt.Rows.Add(new Object[] {4, "Meloskie"});&lt;br /&gt;   dt.Rows.Add(new Object[] {5, "Vader"});&lt;br /&gt;   &lt;br /&gt;   MyDataView myView = new MyDataView(dt, "EmployeeID &lt; 3");&lt;br /&gt;  &lt;br /&gt;   Console.WriteLine("Filter row count: {0}", myView.CurrentFilterCount);&lt;br /&gt;   Console.WriteLine("Row count: {0}", myView.CurrentCount);&lt;br /&gt;  }&lt;br /&gt;  catch (Exception e)&lt;br /&gt;  {&lt;br /&gt;   Console.WriteLine(e);&lt;br /&gt;  }&lt;br /&gt;  finally&lt;br /&gt;  {&lt;br /&gt;   Console.WriteLine("Done and done.");&lt;br /&gt;   Console.ReadLine();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class MyDataView : DataView&lt;br /&gt;{&lt;br /&gt; public MyDataView(DataTable dt, string filter) : base(dt)&lt;br /&gt; {&lt;br /&gt;  this.RowFilter = filter;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public int CurrentFilterCount&lt;br /&gt; {&lt;br /&gt;  get { return this.Count; }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public int CurrentCount&lt;br /&gt; {&lt;br /&gt;  get { return this.Table.Rows.Count; }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10158221-110718316719888330?l=www.kriskrause.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.kriskrause.com/2005/01/dataview-vs-datatable.html</link><author>noreply@blogger.com (Kristofer Krause)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-10158221.post-110631499128760695</guid><pubDate>Fri, 21 Jan 2005 13:33:00 +0000</pubDate><atom:updated>2008-12-10T13:05:37.655-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>comcast</category><title>Comcast and Optimum Online Intentional Outage Victim</title><description>It appears that I am once again an "intentional" outage victim.  My &lt;a href="http://www.optonline.net/"&gt;Optimum Online&lt;/a&gt; broadband went out last night around 7 PM.  I double checked the cable modem's Coax and Cat5 inputs... there was no apparent problem.  I even inspected the outside box.  Finally, I called Cablevision's customer support.  The technician told me to unscrew the Coax cable connection... then screw it back in behind the cable modem.  As I was doing this ridiculous solution, I could hear the customer support person performing "something" on the other end of the phone.  Bingo.  It worked.&lt;br /&gt;&lt;br /&gt;I had a similar experience about a year ago with &lt;a href="http://www.comcast.net"&gt;Comcast&lt;/a&gt;.  Comcast intentionally went into the basement of my apartment building and disconnected my broadband.  After a day without broadband (remember I work from home... so I had to painfully use dialup) a Comcast "worker bee" was dispatched to my apartment.  It only took him three seconds to reconnect me.  My interrogation (which consisted of offering a glass of water, iced tea, juice, or beer) resulted in his confession that Comcast intentionally disconnects peoples broadband so that they can track the entire support process (phone call, phone support, "worker bee dispatched", problem resolution, annoying follow up phone call, optional survey).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10158221-110631499128760695?l=www.kriskrause.com' alt='' /&gt;&lt;/div&gt;</description><link>http://www.kriskrause.com/2005/01/comcast-and-optimum-online-intentional.html</link><author>noreply@blogger.com (Kristofer Krause)</author><thr:total>0</thr:total></item></channel></rss>